From a6b5aa8a6accd5fafbfa98e2638d1ba37bf3ac35 Mon Sep 17 00:00:00 2001 From: liuchang Date: Fri, 30 Jun 2023 08:01:00 +0000 Subject: [PATCH] add source code of encapsulated sts --- .gitlab-ci.yml | 246 +++ CMakeLists.txt | 97 ++ README.md | 92 +- autorelease.sh | 32 + autorevision.sh | 1268 ++++++++++++++ ci/get-nprocessors.sh | 48 + ci/perpare_pulp3_netrc.sh | 3 + ci/travis.sh | 81 + cmake/Package.cmake | 50 + cmake/Version.cmake | 54 + inc/mesa_sts.h | 28 + src/approximateEntropy.c | 72 + src/binaryDerivate.c | 30 + src/blockFrequency.c | 36 + src/bytesToBitSequence.c | 31 + src/cephes.c | 348 ++++ src/cusum.c | 95 ++ src/dfft.c | 1462 +++++++++++++++++ src/discreteFourierTransform.c | 60 + src/frequency.c | 38 + src/genutils.c | 667 ++++++++ src/include/cephes.h | 13 + src/include/config.h | 52 + src/include/decls.h | 24 + src/include/defs.h | 73 + src/include/externs.h | 21 + src/include/generators.h | 78 + src/include/genutils.h | 47 + src/include/matrix.h | 18 + src/include/stat_fncs.h | 166 ++ src/include/utilities.h | 4 + src/linearComplexity.c | 135 ++ src/longestRunOfOnes.c | 125 ++ src/matrix.c | 170 ++ src/mesa_sts.c | 52 + src/nonOverlappingTemplateMatchings.c | 131 ++ src/overlappingTemplateMatchings.c | 97 ++ src/pokerDetect.c | 79 + src/randomExcursions.c | 116 ++ src/randomExcursionsVariant.c | 61 + src/rank.c | 76 + src/runs.c | 46 + src/runsDistribution.c | 82 + src/selfCorrelation.c | 25 + src/serial.c | 65 + src/universal.c | 88 + src/utilities.c | 45 + src/version.map | 6 + test/CMakeLists.txt | 15 + test/gtest_mesa_sts.cpp | 257 +++ ...at3.5.0.46_voice-call_120s_2_multinat.pcap | Bin 0 -> 4634693 bytes test/pcap/telegram_mtproto_ipv4_key_1.pcap | Bin 0 -> 20193 bytes test/pcap/telegram_mtproto_ipv4_key_2_dd.pcap | Bin 0 -> 22352 bytes test/pcap/telegram_mtproto_ipv4_key_3_ee.pcap | Bin 0 -> 109341 bytes test/pcap/telegram_mtproto_ipv6_key_1.pcap | Bin 0 -> 109689 bytes test/pcap/telegram_mtproto_ipv6_key_2_dd.pcap | Bin 0 -> 104057 bytes test/pcap/telegram_mtproto_ipv6_key_3_ee.pcap | Bin 0 -> 170134 bytes test/pcap/xingongsuo_kouling_http_C2S.pcap | Bin 0 -> 4254494 bytes vendor/CMakeLists.txt | 36 + vendor/googletest-release-1.10.0.tar.gz | Bin 0 -> 904349 bytes 60 files changed, 6962 insertions(+), 79 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100644 CMakeLists.txt create mode 100644 autorelease.sh create mode 100644 autorevision.sh create mode 100644 ci/get-nprocessors.sh create mode 100644 ci/perpare_pulp3_netrc.sh create mode 100644 ci/travis.sh create mode 100644 cmake/Package.cmake create mode 100644 cmake/Version.cmake create mode 100644 inc/mesa_sts.h create mode 100644 src/approximateEntropy.c create mode 100644 src/binaryDerivate.c create mode 100644 src/blockFrequency.c create mode 100644 src/bytesToBitSequence.c create mode 100644 src/cephes.c create mode 100644 src/cusum.c create mode 100644 src/dfft.c create mode 100644 src/discreteFourierTransform.c create mode 100644 src/frequency.c create mode 100644 src/genutils.c create mode 100644 src/include/cephes.h create mode 100644 src/include/config.h create mode 100644 src/include/decls.h create mode 100644 src/include/defs.h create mode 100644 src/include/externs.h create mode 100644 src/include/generators.h create mode 100644 src/include/genutils.h create mode 100644 src/include/matrix.h create mode 100644 src/include/stat_fncs.h create mode 100644 src/include/utilities.h create mode 100644 src/linearComplexity.c create mode 100644 src/longestRunOfOnes.c create mode 100644 src/matrix.c create mode 100644 src/mesa_sts.c create mode 100644 src/nonOverlappingTemplateMatchings.c create mode 100644 src/overlappingTemplateMatchings.c create mode 100644 src/pokerDetect.c create mode 100644 src/randomExcursions.c create mode 100644 src/randomExcursionsVariant.c create mode 100644 src/rank.c create mode 100644 src/runs.c create mode 100644 src/runsDistribution.c create mode 100644 src/selfCorrelation.c create mode 100644 src/serial.c create mode 100644 src/universal.c create mode 100644 src/utilities.c create mode 100644 src/version.map create mode 100644 test/CMakeLists.txt create mode 100644 test/gtest_mesa_sts.cpp create mode 100644 test/pcap/202202161604_win_wifi_30M_pure_wechat_wechat3.5.0.46_voice-call_120s_2_multinat.pcap create mode 100644 test/pcap/telegram_mtproto_ipv4_key_1.pcap create mode 100644 test/pcap/telegram_mtproto_ipv4_key_2_dd.pcap create mode 100644 test/pcap/telegram_mtproto_ipv4_key_3_ee.pcap create mode 100644 test/pcap/telegram_mtproto_ipv6_key_1.pcap create mode 100644 test/pcap/telegram_mtproto_ipv6_key_2_dd.pcap create mode 100644 test/pcap/telegram_mtproto_ipv6_key_3_ee.pcap create mode 100644 test/pcap/xingongsuo_kouling_http_C2S.pcap create mode 100644 vendor/CMakeLists.txt create mode 100644 vendor/googletest-release-1.10.0.tar.gz diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..1511c7c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,246 @@ +variables: + GIT_STRATEGY: "clone" + BUILD_IMAGE_CENTOS7: "git.mesalab.cn:7443/mesa_platform/build-env:master" + BUILD_IMAGE_CENTOS8: "git.mesalab.cn:7443/mesa_platform/build-env:rockylinux" + BUILD_PADDING_PREFIX: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX/ + INSTALL_DEPENDENCY_LIBRARY: libasan sudo + INSTALL_DEPENDENCY_FRAMEWORK: sapp-devel libMESA_handle_logger-devel libcjson-devel libMESA_field_stat2-devel framework_env libMESA_prof_load-devel libbreakpad_mini-devel libMESA_htable-devel libMESA_jump_layer libMESA_htable libnsl + INSTALL_PREFIX: "/opt/MESA/" + +stages: +- build +- test +- package + +run_test_for_centos7: + stage: test + extends: .build_by_travis_for_centos7 + script: + - yum makecache + - ./ci/travis.sh + - cd build + - ctest --verbose + +run_test_for_centos8: + stage: test + extends: .build_by_travis_for_centos8 + script: + - yum makecache + - ./ci/travis.sh + - cd build + - ctest3 --verbose + +.build_before_script: + before_script: + - mkdir -p $BUILD_PADDING_PREFIX/$CI_PROJECT_NAMESPACE/ + - ln -s $CI_PROJECT_DIR $BUILD_PADDING_PREFIX/$CI_PROJECT_PATH + - cd $BUILD_PADDING_PREFIX/$CI_PROJECT_PATH + - chmod +x ./ci/travis.sh + - yum makecache + - yum install -y elfutils-libelf-devel + + +.build_by_travis_for_centos7: + stage: build + image: $BUILD_IMAGE_CENTOS7 + extends: .build_before_script + script: + - yum install -y libmnl-devel + - yum install -y libnfnetlink-devel + - ./ci/travis.sh + - cd build + tags: + - share + +.build_by_travis_for_centos8: + stage: build + image: $BUILD_IMAGE_CENTOS8 + extends: .build_before_script + script: + - dnf --enablerepo=powertools install -y libmnl-devel + - dnf --enablerepo=powertools install -y libnfnetlink-devel + - ./ci/travis.sh + tags: + - share + +branch_build_debug_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: Debug + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +branch_build_release_for_centos7: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + extends: .build_by_travis_for_centos7 + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +develop_build_debug_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD_RPM: 1 + ASAN_OPTION: ADDRESS + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el7 + PULP3_DIST_NAME: framework-testing-x86_64.el7 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +develop_build_release_for_centos7: + stage: build + extends: .build_by_travis_for_centos7 + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD_RPM: 1 + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el7 + PULP3_DIST_NAME: framework-testing-x86_64.el7 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +release_build_debug_for_centos7: + stage: package + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD_RPM: 1 + PULP3_REPO_NAME: framework-stable-x86_64.el7 + PULP3_DIST_NAME: framework-stable-x86_64.el7 + extends: .build_by_travis_for_centos7 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - tags + +release_build_release_for_centos7: + stage: package + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD_RPM: 1 + UPLOAD_SYMBOL_FILES: 1 + SYMBOL_TARGET: libmesa_rsts + PULP3_REPO_NAME: framework-stable-x86_64.el7 + PULP3_DIST_NAME: framework-stable-x86_64.el7 + extends: .build_by_travis_for_centos7 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - tags + +branch_build_debug_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: Debug + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +branch_build_release_for_centos8: + stage: build + variables: + BUILD_TYPE: RelWithDebInfo + extends: .build_by_travis_for_centos8 + except: + - /^develop.*$/i + - /^master.*$/i + - tags + +develop_build_debug_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD_RPM: 1 + ASAN_OPTION: ADDRESS + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el8 + PULP3_DIST_NAME: framework-testing-x86_64.el8 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +develop_build_release_for_centos8: + stage: build + extends: .build_by_travis_for_centos8 + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD_RPM: 1 + TESTING_VERSION_BUILD: 1 + PULP3_REPO_NAME: framework-testing-x86_64.el8 + PULP3_DIST_NAME: framework-testing-x86_64.el8 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - /^develop.*$/i + - /^master.*$/i + +release_build_debug_for_centos8: + stage: package + variables: + BUILD_TYPE: Debug + PACKAGE: 1 + UPLOAD_RPM: 1 + PULP3_REPO_NAME: framework-stable-x86_64.el8 + PULP3_DIST_NAME: framework-stable-x86_64.el8 + extends: .build_by_travis_for_centos8 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-debug" + paths: + - build/*.rpm + only: + - tags + +release_build_release_for_centos8: + stage: package + variables: + BUILD_TYPE: RelWithDebInfo + PACKAGE: 1 + UPLOAD_RPM: 1 + UPLOAD_SYMBOL_FILES: 1 + SYMBOL_TARGET: libmesa_rsts + PULP3_REPO_NAME: framework-stable-x86_64.el8 + PULP3_DIST_NAME: framework-stable-x86_64.el8 + extends: .build_by_travis_for_centos8 + artifacts: + name: "mesa_sts-$CI_COMMIT_REF_NAME-release" + paths: + - build/*.rpm + only: + - tags diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4b357ab --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,97 @@ +cmake_minimum_required (VERSION 2.8) + +set(lib_name mesa_sts) + +project (${lib_name}) + +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +include(Version) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_MACOSX_RPATH 0) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wall) + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "/opt/MESA" CACHE PATH "default install path" FORCE) +endif() + +find_program(CMAKE_CXX_CPPCHECK NAMES cppcheck) +if (CMAKE_CXX_CPPCHECK) + list( + APPEND CMAKE_CXX_CPPCHECK + "--enable=all" + "--error-exitcode=1" + "--suppress=unreachableCode" + "--suppress=unusedFunction" + "--suppress=missingInclude" + "--suppress=uselessAssignmentPtrArg" + "--suppress=unmatchedSuppression" + "--suppress=internalAstError" + "--suppress=unmatchedSuppression" + "--suppress=unreadVariable" + "--suppress=memleakOnRealloc" + "--suppress=redundantAssignment" + "--suppress=constParameter" + "--suppress=unsignedLessThanZero" + "--suppress=variableScope" + "--suppress=cstyleCast" + "--suppress=objectIndex" + "--suppress=shadowVariable" + "--suppress=nullPointerRedundantCheck" + "--suppress=ctunullpointer" + "--suppress=shadowFunction" + "--suppress=unusedStructMember" + ) + set(CMAKE_C_CPPCHECK ${CMAKE_CXX_CPPCHECK}) +else() + message(FATAL_ERROR "Could not find the program cppcheck.") +endif() + +#for ASAN +set(ASAN_OPTION "OFF" CACHE STRING " set asan type chosen by the user, using OFF as default") +set_property(CACHE ASAN_OPTION PROPERTY STRINGS OFF ADDRESS THREAD) +message(STATUS "ASAN_OPTION='${ASAN_OPTION}'") + +if(ASAN_OPTION MATCHES "ADDRESS") + set(CMAKE_C_FLAGS "${CMAKADDRESS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") +elseif(ASAN_OPTION MATCHES "THREAD") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=thread -fno-omit-frame-pointer") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DCMAKE_BUILD_TYPE=Debug -fsanitize=thread -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") +endif() +# end of for ASAN + +include_directories(${PROJECT_SOURCE_DIR}/inc/) +include_directories(${PROJECT_SOURCE_DIR}/src/) + +file(GLOB SRC + "src/*.c" + "src/*.cpp" +) + +add_subdirectory(vendor) +add_subdirectory(test) +enable_testing() + +# Shared Library Output +add_library(${lib_name}_shared SHARED ${SRC}) +set_target_properties(${lib_name}_shared PROPERTIES LINK_FLAGS + "-Wl,--version-script=${PROJECT_SOURCE_DIR}/src/version.map") +if(DEFINED MESA_SHARED_INSTALL_DIR) + set_target_properties(${lib_name}_shared PROPERTIES OUTPUT_NAME ${lib_name} LIBRARY_OUTPUT_DIRECTORY ${MESA_SHARED_INSTALL_DIR}) +else() + set_target_properties(${lib_name}_shared PROPERTIES OUTPUT_NAME ${lib_name}) +endif() + +# static Library Output +add_library(${lib_name}_static STATIC ${SRC}) +set_target_properties(${lib_name}_static PROPERTIES OUTPUT_NAME ${lib_name}) + +install(TARGETS ${lib_name}_shared LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib COMPONENT LIBRARIES) +install(TARGETS ${lib_name}_static LIBRARY ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib COMPONENT LIBRARIES) +install(FILES inc/mesa_sts.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MESA COMPONENT HEADER) + +include(Package) \ No newline at end of file diff --git a/README.md b/README.md index 410aaa6..548483f 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,26 @@ -# MESA_sts +# mesa_sts简介 +mesa_sts是一个统计检验(随机性检测)套件(Statistical Test Suite),包括NIST-STS、国密的共计19种检验算法。 +# nist-sts -## Getting started +This is a slightly updated version of [NIST Statistical Test Suite (STS)](http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html) tool for randomness testing. Main reason for this fork is that the original source code provided by NIST doesn't compile cleanly on Windows using MSVC. Main reason is that MSVC doesn't provide erf() and erfc() functions in standard math library. I've added implementation of these functions and created a project file. You should be now able to compile STS using standard Microsoft Visual C/C++ suite. -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +##Building +This version should compile cleanly under MSVC 2008. I haven't tested it under other versions and MSVC Express, but it's ANSI C so it should work. -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +The solution is configured to compile using extended instruction set (SSE2) and optimize for speed. -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://git.mesalab.cn/liuchang/mesa_sts.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://git.mesalab.cn/liuchang/mesa_sts/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. +After build is completed you will get a single _assess.exe_ binary which is the test suite. ## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. +You probably still want to [download](http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html) the original NIST ZIP distribution and use their test files. Reason why I'm not including them here is that the archive is over 40 MB big and most of that is the test data. -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. +After unpacking the ZIP place _assess.exe_ in the top directory. The program expects to have the subdirectories _experiments, templates_ etc in the same directory. -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. +STS has somewhat old school terminal interface. Simple tutorial can be found in section 5-1 of [NIST SP800-22](http://csrc.nist.gov/groups/ST/toolkit/rng/documents/SP800-22rev1a.pdf). -## Contributing -State if you are open to contributions and what your requirements are for accepting them. +Remember that testing results are written to _experiments\AlgorithmTesting\finalAnalysisReport.txt_ if you load tested data from a file. STS has a number of built-in generators, in which case the report will be written to a corresponding subdirectory of _experiments_. -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. +PS:the directories:data/experiments/templates are from https://download.csdn.net/download/yuanhunhai/8985409 -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/autorelease.sh b/autorelease.sh new file mode 100644 index 0000000..95945e2 --- /dev/null +++ b/autorelease.sh @@ -0,0 +1,32 @@ +#!/bin/sh +if [ $# -lt 7 ] ; then + echo "USAGE: ./autorelease.sh [API_V4_URL] [PROJECT_URL] + [PROJECT_ID] [TOKEN] + [COMMIT_TAG] [JOB] [PROJECT_NAME]" +exit 1; +fi + +CI_API_V4_URL=$1 +CI_PROJECT_URL=$2 +CI_PROJECT_ID=$3 +CI_TOKEN=$4 +CI_COMMIT_TAG=$5 +ARTIFACTS_JOB=$6 +CI_PROJECT_NAME=$7 + +res=`echo -e "curl --header \"PRIVATE-TOKEN: $CI_TOKEN\" $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/$CI_COMMIT_TAG -o /dev/null -s -w %{http_code}"| /bin/bash` + +if [[ $res == "200" ]]; then + eval $(echo -e "curl --request POST --header \"PRIVATE-TOKEN: $CI_TOKEN\" \ + --data name=\"$CI_PROJECT_NAME-$CI_COMMIT_TAG-artifacts.zip\" \ + --data url=\"$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=$ARTIFACTS_JOB\"\ + $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/$CI_COMMIT_TAG/assets/links") +else + eval $(echo -e "curl --header 'Content-Type: application/json' --header \ + \"PRIVATE-TOKEN: $CI_TOKEN\" --data '{ \"name\": \"$CI_COMMIT_TAG\", \ + \"tag_name\": \"$CI_COMMIT_TAG\", \"description\": \"auto_release\",\ + \"assets\": { \"links\": [{ \"name\": \ + \"$CI_PROJECT_NAME-$CI_COMMIT_TAG-artifacts.zip\", \"url\": \ + \"$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=$ARTIFACTS_JOB\"\ + }] } }' --request POST $CI_API_V4_URL/projects/$CI_PROJECT_ID/releases/") +fi diff --git a/autorevision.sh b/autorevision.sh new file mode 100644 index 0000000..3baa179 --- /dev/null +++ b/autorevision.sh @@ -0,0 +1,1268 @@ +#!/bin/sh + +# Copyright (c) 2012 - 2016 dak180 and contributors. See +# https://opensource.org/licenses/mit-license.php or the included +# COPYING.md for licence terms. +# +# autorevision - extracts metadata about the head version from your +# repository. + +# Usage message. +arUsage() { + cat > "/dev/stderr" << EOF +usage: autorevision {-t output-type | -s symbol} [-o cache-file [-f] ] [-V] + Options include: + -t output-type = specify output type + -s symbol = specify symbol output + -o cache-file = specify cache file location + -f = force the use of cache data + -U = check for untracked files in svn + -V = emit version and exit + -? = help message + +The following are valid output types: + clojure = clojure file + c = C/C++ file + h = Header for use with c/c++ + hpp = Alternate C++ header strings with namespace + ini = INI file + java = Java file + javaprop = Java properties file + js = javascript file + json = JSON file + lua = Lua file + m4 = m4 file + matlab = matlab file + octave = octave file + php = PHP file + pl = Perl file + py = Python file + rpm = rpm file + scheme = scheme file + sh = Bash sytax + swift = Swift file + tex = (La)TeX file + xcode = Header useful for populating info.plist files + cmake = CMake file + + +The following are valid symbols: + VCS_TYPE + VCS_BASENAME + VCS_UUID + VCS_NUM + VCS_DATE + VCS_BRANCH + VCS_TAG + VCS_TICK + VCS_EXTRA + VCS_FULL_HASH + VCS_SHORT_HASH + VCS_WC_MODIFIED + VCS_ACTION_STAMP +EOF + exit 1 +} + +# Config +ARVERSION="&&ARVERSION&&" +TARGETFILE="/dev/stdout" +while getopts ":t:o:s:VfU" OPTION; do + case "${OPTION}" in + t) + AFILETYPE="${OPTARG}" + ;; + o) + CACHEFILE="${OPTARG}" + ;; + f) + CACHEFORCE="1" + ;; + s) + VAROUT="${OPTARG}" + ;; + U) + UNTRACKEDFILES="1" + ;; + V) + echo "autorevision ${ARVERSION}" + exit 0 + ;; + ?) + # If an unknown flag is used (or -?): + arUsage + ;; + esac +done + +if [ ! -z "${VAROUT}" ] && [ ! -z "${AFILETYPE}" ]; then + # If both -s and -t are specified: + echo "error: Improper argument combination." 1>&2 + exit 1 +elif [ -z "${VAROUT}" ] && [ -z "${AFILETYPE}" ]; then + # If neither -s or -t are specified: + arUsage +elif [ -z "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # If -f is specified without -o: + arUsage +elif [ ! -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # If we are forced to use the cache but it does not exist. + echo "error: Cache forced but no cache found." 1>&2 + exit 1 +fi + +# Make sure that the path we are given is one we can source +# (dash, we are looking at you). +if [ ! -z "${CACHEFILE}" ] && ! echo "${CACHEFILE}" | grep -q '^\.*/'; then + CACHEFILE="./${CACHEFILE}" +fi + +GENERATED_HEADER="Generated by autorevision - do not hand-hack!" + +# Functions to extract data from different repo types. +# For git repos +# shellcheck disable=SC2039,SC2164,SC2155 +gitRepo() { + local oldPath="${PWD}" + + cd "$(git rev-parse --show-toplevel)" + + VCS_TYPE="git" + + VCS_BASENAME="$(basename "${PWD}")" + + VCS_UUID="$(git rev-list --max-parents=0 --date-order --reverse HEAD 2>/dev/null | sed -n 1p)" + if [ -z "${VCS_UUID}" ]; then + VCS_UUID="$(git rev-list --topo-order HEAD | tail -n 1)" + fi + + # Is the working copy clean? + test -z "$(git status --untracked-files=normal --porcelain)" + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(git rev-list --count HEAD 2>/dev/null)" + if [ -z "${VCS_NUM}" ]; then + echo "warning: Counting the number of revisions may be slower due to an outdated git version less than 1.7.2.3. If something breaks, please update it." 1>&2 + VCS_NUM="$(git rev-list HEAD | wc -l)" + fi + + # This may be a git-svn remote. If so, report the Subversion revision. + if [ -z "$(git config svn-remote.svn.url 2>/dev/null)" ]; then + # The full revision hash + VCS_FULL_HASH="$(git rev-parse HEAD)" + + # The short hash + VCS_SHORT_HASH="$(echo "${VCS_FULL_HASH}" | cut -b 1-7)" + else + # The git-svn revision number + VCS_FULL_HASH="$(git svn find-rev HEAD)" + VCS_SHORT_HASH="${VCS_FULL_HASH}" + fi + + # Current branch + VCS_BRANCH="$(git rev-parse --symbolic-full-name --verify "$(git name-rev --name-only --no-undefined HEAD 2>/dev/null)" 2>/dev/null | sed -e 's:refs/heads/::' | sed -e 's:refs/::')" + + # Cache the description + local DESCRIPTION="$(git describe --long --tags 2>/dev/null)" + + # Current or last tag ancestor (empty if no tags) + VCS_TAG="$(echo "${DESCRIPTION}" | sed -e "s:-g${VCS_SHORT_HASH}\$::" -e 's:-[0-9]*$::')" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${DESCRIPTION}" ]; then + VCS_TICK="$(echo "${DESCRIPTION}" | sed -e "s:${VCS_TAG}-::" -e "s:-g${VCS_SHORT_HASH}::")" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(TZ=UTC git show -s --date=iso-strict-local --pretty=format:%ad | sed -e 's|+00:00|Z|')" + if [ -z "${VCS_DATE}" ]; then + echo "warning: Action stamps require git version 2.7+." 1>&2 + VCS_DATE="$(git log -1 --pretty=format:%ci | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')" + local ASdis="1" + fi + + # Action Stamp + if [ -z "${ASdis}" ]; then + VCS_ACTION_STAMP="${VCS_DATE}!$(git show -s --pretty=format:%cE)" + else + VCS_ACTION_STAMP="" + fi + + cd "${oldPath}" +} + +# For hg repos +# shellcheck disable=SC2039,SC2164 +hgRepo() { + local oldPath="${PWD}" + + cd "$(hg root)" + + VCS_TYPE="hg" + + VCS_BASENAME="$(basename "${PWD}")" + + VCS_UUID="$(hg log -r "0" -l 1 --template '{node}\n')" + + # Is the working copy clean? + test -z "$(hg status -duram)" + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(hg id -n | tr -d '+')" + + # The full revision hash + VCS_FULL_HASH="$(hg log -r "${VCS_NUM}" -l 1 --template '{node}\n')" + + # The short hash + VCS_SHORT_HASH="$(hg id -i | tr -d '+')" + + # Current bookmark (bookmarks are roughly equivalent to git's branches) + # or branch if no bookmark + VCS_BRANCH="$(hg id -B | cut -d ' ' -f 1)" + # Fall back to the branch if there are no bookmarks + if [ -z "${VCS_BRANCH}" ]; then + VCS_BRANCH="$(hg id -b)" + fi + + # Current or last tag ancestor (excluding auto tags, empty if no tags) + VCS_TAG="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttag}\n' 2>/dev/null | sed -e 's:qtip::' -e 's:tip::' -e 's:qbase::' -e 's:qparent::' -e "s:$(hg --config 'extensions.color=' --config 'extensions.mq=' --color never qtop 2>/dev/null)::" | cut -d ' ' -f 1)" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${VCS_TAG}" ]; then + VCS_TICK="$(hg log -r "${VCS_NUM}" -l 1 --template '{latesttagdistance}\n' 2>/dev/null)" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(hg log -r "${VCS_NUM}" -l 1 --template '{date|isodatesec}\n' 2>/dev/null | sed -e 's: :T:' -e 's: ::' -e 's|+00:00|Z|')" + + # Action Stamp + VCS_ACTION_STAMP="$(TZ=UTC hg log -r "${VCS_NUM}" -l 1 --template '{date|localdate|rfc3339date}\n' 2>/dev/null | sed -e 's|+00:00|Z|')!$(hg log -r "${VCS_NUM}" -l 1 --template '{author|email}\n' 2>/dev/null)" + + cd "${oldPath}" +} + +# For bzr repos +# shellcheck disable=SC2039,SC2164 +bzrRepo() { + local oldPath="${PWD}" + + cd "$(bzr root)" + + VCS_TYPE="bzr" + + VCS_BASENAME="$(basename "${PWD}")" + + # Currently unimplemented because more investigation is needed. + VCS_UUID="" + + # Is the working copy clean? + bzr version-info --custom --template='{clean}\n' | grep -q '1' + VCS_WC_MODIFIED="${?}" + + # Enumeration of changesets + VCS_NUM="$(bzr revno)" + + # The full revision hash + VCS_FULL_HASH="$(bzr version-info --custom --template='{revision_id}\n')" + + # The short hash + VCS_SHORT_HASH="${VCS_NUM}" + + # Nick of the current branch + VCS_BRANCH="$(bzr nick)" + + # Current or last tag ancestor (excluding auto tags, empty if no tags) + VCS_TAG="$(bzr tags --sort=time | sed '/?$/d' | tail -n1 | cut -d ' ' -f1)" + + # Distance to last tag or an alias of VCS_NUM if there is no tag + if [ ! -z "${VCS_TAG}" ]; then + VCS_TICK="$(bzr log --line -r "tag:${VCS_TAG}.." | tail -n +2 | wc -l | sed -e 's:^ *::')" + else + VCS_TICK="${VCS_NUM}" + fi + + # Date of the current commit + VCS_DATE="$(bzr version-info --custom --template='{date}\n' | sed -e 's: :T:' -e 's: ::')" + + # Action Stamp + # Currently unimplemented because more investigation is needed. + VCS_ACTION_STAMP="" + + cd "${oldPath}" +} + +# For svn repos +# shellcheck disable=SC2039,SC2164,SC2155 +svnRepo() { + local oldPath="${PWD}" + + VCS_TYPE="svn" + + case "${PWD}" in + /*trunk*|/*branches*|/*tags*) + local fn="${PWD}" + while [ "$(basename "${fn}")" != 'trunk' ] && [ "$(basename "${fn}")" != 'branches' ] && [ "$(basename "${fn}")" != 'tags' ] && [ "$(basename "${fn}")" != '/' ]; do + local fn="$(dirname "${fn}")" + done + local fn="$(dirname "${fn}")" + if [ "${fn}" = '/' ]; then + VCS_BASENAME="$(basename "${PWD}")" + else + VCS_BASENAME="$(basename "${fn}")" + fi + ;; + *) VCS_BASENAME="$(basename "${PWD}")" ;; + esac + + VCS_UUID="$(svn info --xml | sed -n -e 's:::' -e 's:::p')" + + # Cache svnversion output + local SVNVERSION="$(svnversion)" + + # Is the working copy clean? + echo "${SVNVERSION}" | grep -q "M" + case "${?}" in + 0) + VCS_WC_MODIFIED="1" + ;; + 1) + if [ ! -z "${UNTRACKEDFILES}" ]; then + # `svnversion` does not detect untracked files and `svn status` is really slow, so only run it if we really have to. + if [ -z "$(svn status)" ]; then + VCS_WC_MODIFIED="0" + else + VCS_WC_MODIFIED="1" + fi + else + VCS_WC_MODIFIED="0" + fi + ;; + esac + + # Enumeration of changesets + VCS_NUM="$(echo "${SVNVERSION}" | cut -d : -f 1 | sed -e 's:M::' -e 's:S::' -e 's:P::')" + + # The full revision hash + VCS_FULL_HASH="${SVNVERSION}" + + # The short hash + VCS_SHORT_HASH="${VCS_NUM}" + + # Current branch + case "${PWD}" in + /*trunk*|/*branches*|/*tags*) + local lastbase="" + local fn="${PWD}" + while : + do + base="$(basename "${fn}")" + if [ "${base}" = 'trunk' ]; then + VCS_BRANCH='trunk' + break + elif [ "${base}" = 'branches' ] || [ "${base}" = 'tags' ]; then + VCS_BRANCH="${lastbase}" + break + elif [ "${base}" = '/' ]; then + VCS_BRANCH="" + break + fi + local lastbase="${base}" + local fn="$(dirname "${fn}")" + done + ;; + *) VCS_BRANCH="" ;; + esac + + # Current or last tag ancestor (empty if no tags). But "current + # tag" can't be extracted reliably because Subversion doesn't + # have tags the way other VCSes do. + VCS_TAG="" + VCS_TICK="" + + # Date of the current commit + VCS_DATE="$(svn info --xml | sed -n -e 's:::' -e 's:::p')" + + # Action Stamp + VCS_ACTION_STAMP="${VCS_DATE}!$(svn log --xml -l 1 -r "${VCS_SHORT_HASH}" | sed -n -e 's:::' -e 's:::p')" + + cd "${oldPath}" +} + + +# Functions to output data in different formats. +# For bash output +shOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE="${VCS_TYPE}" +VCS_BASENAME="${VCS_BASENAME}" +VCS_UUID="${VCS_UUID}" +VCS_NUM="${VCS_NUM}" +VCS_DATE="${VCS_DATE}" +VCS_BRANCH="${VCS_BRANCH}" +VCS_TAG="${VCS_TAG}" +VCS_TICK="${VCS_TICK}" +VCS_EXTRA="${VCS_EXTRA}" + +VCS_ACTION_STAMP="${VCS_ACTION_STAMP}" +VCS_FULL_HASH="${VCS_FULL_HASH}" +VCS_SHORT_HASH="${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED="${VCS_WC_MODIFIED}" + +# end +EOF +} + +# For source C output +cOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +const char *VCS_TYPE = "${VCS_TYPE}"; +const char *VCS_BASENAME = "${VCS_BASENAME}"; +const char *VCS_UUID = "${VCS_UUID}"; +const int VCS_NUM = ${VCS_NUM}; +const char *VCS_DATE = "${VCS_DATE}"; +const char *VCS_BRANCH = "${VCS_BRANCH}"; +const char *VCS_TAG = "${VCS_TAG}"; +const int VCS_TICK = ${VCS_TICK}; +const char *VCS_EXTRA = "${VCS_EXTRA}"; + +const char *VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; +const char *VCS_FULL_HASH = "${VCS_FULL_HASH}"; +const char *VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + +const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +/* end */ +EOF +} + +# For header output +hOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ +#ifndef AUTOREVISION_H +#define AUTOREVISION_H + +#define VCS_TYPE "${VCS_TYPE}" +#define VCS_BASENAME "${VCS_BASENAME}" +#define VCS_UUID "${VCS_UUID}" +#define VCS_NUM ${VCS_NUM} +#define VCS_DATE "${VCS_DATE}" +#define VCS_BRANCH "${VCS_BRANCH}" +#define VCS_TAG "${VCS_TAG}" +#define VCS_TICK ${VCS_TICK} +#define VCS_EXTRA "${VCS_EXTRA}" + +#define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}" +#define VCS_FULL_HASH "${VCS_FULL_HASH}" +#define VCS_SHORT_HASH "${VCS_SHORT_HASH}" + +#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED} + +#endif + +/* end */ +EOF +} + +# A header output for use with xcode to populate info.plist strings +xcodeOutput() { + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ +#ifndef AUTOREVISION_H +#define AUTOREVISION_H + +#define VCS_TYPE ${VCS_TYPE} +#define VCS_BASENAME ${VCS_BASENAME} +#define VCS_UUID ${VCS_UUID} +#define VCS_NUM ${VCS_NUM} +#define VCS_DATE ${VCS_DATE} +#define VCS_BRANCH ${VCS_BRANCH} +#define VCS_TAG ${VCS_TAG} +#define VCS_TICK ${VCS_TICK} +#define VCS_EXTRA ${VCS_EXTRA} + +#define VCS_ACTION_STAMP ${VCS_ACTION_STAMP} +#define VCS_FULL_HASH ${VCS_FULL_HASH} +#define VCS_SHORT_HASH ${VCS_SHORT_HASH} + +#define VCS_WC_MODIFIED ${VCS_WC_MODIFIED} + +#endif + +/* end */ +EOF +} + +# For Swift output +swiftOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + # For values that may not exist depending on the type of repo we + # have read from, set them to `nil` when they are empty. + if [ -z "${VCS_UUID}" ]; then + VCS_UUID="nil" + else + VCS_UUID="\"${VCS_UUID}\"" + fi + if [ -z "${VCS_TAG}" ]; then + VCS_TAG="nil" + else + VCS_TAG="\"${VCS_TAG}\"" + fi + : "${VCS_TICK:="nil"}" + if [ -z "${VCS_EXTRA}" ]; then + VCS_EXTRA="nil" + else + VCS_EXTRA="\"${VCS_EXTRA}\"" + fi + if [ -z "${VCS_ACTION_STAMP}" ]; then + VCS_ACTION_STAMP="nil" + else + VCS_ACTION_STAMP="\"${VCS_ACTION_STAMP}\"" + fi + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +let VCS_TYPE = "${VCS_TYPE}" +let VCS_BASENAME = "${VCS_BASENAME}" +let VCS_UUID: String? = ${VCS_UUID} +let VCS_NUM: Int = ${VCS_NUM} +let VCS_DATE = "${VCS_DATE}" +let VCS_BRANCH: String = "${VCS_BRANCH}" +let VCS_TAG: String? = ${VCS_TAG} +let VCS_TICK: Int? = ${VCS_TICK} +let VCS_EXTRA: String? = ${VCS_EXTRA} + +let VCS_ACTION_STAMP: String? = ${VCS_ACTION_STAMP} +let VCS_FULL_HASH: String = "${VCS_FULL_HASH}" +let VCS_SHORT_HASH: String = "${VCS_SHORT_HASH}" + +let VCS_WC_MODIFIED: Bool = ${VCS_WC_MODIFIED} + +/* end */ +EOF +} + +# For Python output +pyOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="False" ;; + 1) VCS_WC_MODIFIED="True" ;; + esac + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" + +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} + +# end +EOF +} + +# For Perl output +plOutput() { + cat << EOF +# ${GENERATED_HEADER} + +\$VCS_TYPE = '${VCS_TYPE}'; +\$VCS_BASENAME = '${VCS_BASENAME}'; +\$VCS_UUID = '${VCS_UUID}'; +\$VCS_NUM = ${VCS_NUM}; +\$VCS_DATE = '${VCS_DATE}'; +\$VCS_BRANCH = '${VCS_BRANCH}'; +\$VCS_TAG = '${VCS_TAG}'; +\$VCS_TICK = ${VCS_TICK}; +\$VCS_EXTRA = '${VCS_EXTRA}'; + +\$VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +\$VCS_FULL_HASH = '${VCS_FULL_HASH}'; +\$VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +\$VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +# end +1; +EOF +} + +# For lua output +luaOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +-- ${GENERATED_HEADER} + +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" + +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} + +-- end +EOF +} + +# For php output +phpOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF + "${VCS_TYPE}", + "VCS_BASENAME" => "${VCS_BASENAME}", + "VCS_UUID" => "${VCS_UUID}", + "VCS_NUM" => ${VCS_NUM}, + "VCS_DATE" => "${VCS_DATE}", + "VCS_BRANCH" => "${VCS_BRANCH}", + "VCS_TAG" => "${VCS_TAG}", + "VCS_TICK" => ${VCS_TICK}, + "VCS_EXTRA" => "${VCS_EXTRA}", + "VCS_ACTION_STAMP" => "${VCS_ACTION_STAMP}", + "VCS_FULL_HASH" => "${VCS_FULL_HASH}", + "VCS_SHORT_HASH" => "${VCS_SHORT_HASH}", + "VCS_WC_MODIFIED" => ${VCS_WC_MODIFIED} +); + +# end +?> +EOF +} + +# For ini output +iniOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +; ${GENERATED_HEADER} +[VCS] +VCS_TYPE = "${VCS_TYPE}" +VCS_BASENAME = "${VCS_BASENAME}" +VCS_UUID = "${VCS_UUID}" +VCS_NUM = ${VCS_NUM} +VCS_DATE = "${VCS_DATE}" +VCS_BRANCH = "${VCS_BRANCH}" +VCS_TAG = "${VCS_TAG}" +VCS_TICK = ${VCS_TICK} +VCS_EXTRA = "${VCS_EXTRA}" +VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}" +VCS_FULL_HASH = "${VCS_FULL_HASH}" +VCS_SHORT_HASH = "${VCS_SHORT_HASH}" +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED} +; end +EOF +} + +# For javascript output +jsOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +/** ${GENERATED_HEADER} */ + +var autorevision = { + VCS_TYPE: "${VCS_TYPE}", + VCS_BASENAME: "${VCS_BASENAME}", + VCS_UUID: "${VCS_UUID}", + VCS_NUM: ${VCS_NUM}, + VCS_DATE: "${VCS_DATE}", + VCS_BRANCH: "${VCS_BRANCH}", + VCS_TAG: "${VCS_TAG}", + VCS_TICK: ${VCS_TICK}, + VCS_EXTRA: "${VCS_EXTRA}", + + VCS_ACTION_STAMP: "${VCS_ACTION_STAMP}", + VCS_FULL_HASH: "${VCS_FULL_HASH}", + VCS_SHORT_HASH: "${VCS_SHORT_HASH}", + + VCS_WC_MODIFIED: ${VCS_WC_MODIFIED} +}; + +/** Node.js compatibility */ +if (typeof module !== 'undefined') { + module.exports = autorevision; +} + +/** end */ +EOF +} + +# For JSON output +jsonOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +{ + "_comment": "${GENERATED_HEADER}", + "VCS_TYPE": "${VCS_TYPE}", + "VCS_BASENAME": "${VCS_BASENAME}", + "VCS_UUID": "${VCS_UUID}", + "VCS_NUM": ${VCS_NUM}, + "VCS_DATE": "${VCS_DATE}", + "VCS_BRANCH":"${VCS_BRANCH}", + "VCS_TAG": "${VCS_TAG}", + "VCS_TICK": ${VCS_TICK}, + "VCS_EXTRA": "${VCS_EXTRA}", + + "VCS_ACTION_STAMP": "${VCS_ACTION_STAMP}", + "VCS_FULL_HASH": "${VCS_FULL_HASH}", + "VCS_SHORT_HASH": "${VCS_SHORT_HASH}", + + "VCS_WC_MODIFIED": ${VCS_WC_MODIFIED} +} +EOF +} + +# For Java output +javaOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +public class autorevision { + public static final String VCS_TYPE = "${VCS_TYPE}"; + public static final String VCS_BASENAME = "${VCS_BASENAME}"; + public static final String VCS_UUID = "${VCS_UUID}"; + public static final long VCS_NUM = ${VCS_NUM}; + public static final String VCS_DATE = "${VCS_DATE}"; + public static final String VCS_BRANCH = "${VCS_BRANCH}"; + public static final String VCS_TAG = "${VCS_TAG}"; + public static final long VCS_TICK = ${VCS_TICK}; + public static final String VCS_EXTRA = "${VCS_EXTRA}"; + + public static final String VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; + public static final String VCS_FULL_HASH = "${VCS_FULL_HASH}"; + public static final String VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + + public static final boolean VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; +} +EOF +} + +# For Java properties output +javapropOutput() { + case "${VCS_WC_MODIFIED}" in + 1) VCS_WC_MODIFIED="true" ;; + 0) VCS_WC_MODIFIED="false" ;; + esac + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +VCS_TYPE=${VCS_TYPE} +VCS_BASENAME=${VCS_BASENAME} +VCS_UUID=${VCS_UUID} +VCS_NUM=${VCS_NUM} +VCS_DATE=${VCS_DATE} +VCS_BRANCH=${VCS_BRANCH} +VCS_TAG=${VCS_TAG} +VCS_TICK=${VCS_TICK} +VCS_EXTRA=${VCS_EXTRA} + +VCS_ACTION_STAMP=${VCS_ACTION_STAMP} +VCS_FULL_HASH=${VCS_FULL_HASH} +VCS_SHORT_HASH=${VCS_SHORT_HASH} + +VCS_WC_MODIFIED=${VCS_WC_MODIFIED} +EOF +} + +# For m4 output +m4Output() { + cat > "${TARGETFILE}" << EOF +dnl ${GENERATED_HEADER} +define(\`VCS_TYPE', \`${VCS_TYPE}')dnl +define(\`VCS_BASENAME', \`${VCS_BASENAME}')dnl +define(\`VCS_UUID', \`${VCS_UUID}')dnl +define(\`VCS_NUM', \`${VCS_NUM}')dnl +define(\`VCS_DATE', \`${VCS_DATE}')dnl +define(\`VCS_BRANCH', \`${VCS_BRANCH}')dnl +define(\`VCS_TAG', \`${VCS_TAG}')dnl +define(\`VCS_TICK', \`${VCS_TICK}')dnl +define(\`VCS_EXTRA', \`${VCS_EXTRA}')dnl +define(\`VCS_ACTIONSTAMP', \`${VCS_ACTION_STAMP}')dnl +define(\`VCS_FULLHASH', \`${VCS_FULL_HASH}')dnl +define(\`VCS_SHORTHASH', \`${VCS_SHORT_HASH}')dnl +define(\`VCS_WC_MODIFIED', \`${VCS_WC_MODIFIED}')dnl +EOF +} + +# For (La)TeX output +texOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} +\def \vcsType {${VCS_TYPE}} +\def \vcsBasename {${VCS_BASENAME}} +\def \vcsUUID {${VCS_UUID}} +\def \vcsNum {${VCS_NUM}} +\def \vcsDate {${VCS_DATE}} +\def \vcsBranch {${VCS_BRANCH}} +\def \vcsTag {${VCS_TAG}} +\def \vcsTick {${VCS_TICK}} +\def \vcsExtra {${VCS_EXTRA}} +\def \vcsACTIONSTAMP {${VCS_ACTION_STAMP}} +\def \vcsFullHash {${VCS_FULL_HASH}} +\def \vcsShortHash {${VCS_SHORT_HASH}} +\def \vcsWCModified {${VCS_WC_MODIFIED}} +\endinput +EOF +} + +# For scheme output +schemeOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="#f" ;; + 1) VCS_WC_MODIFIED="#t" ;; + esac + cat > "${TARGETFILE}" << EOF +;; ${GENERATED_HEADER} +(define VCS_TYPE "${VCS_TYPE}") +(define VCS_BASENAME "${VCS_BASENAME}") +(define VCS_UUID "${VCS_UUID}") +(define VCS_NUM ${VCS_NUM}) +(define VCS_DATE "${VCS_DATE}") +(define VCS_BRANCH "${VCS_BRANCH}") +(define VCS_TAG "${VCS_TAG}") +(define VCS_TICK ${VCS_TICK}) +(define VCS_EXTRA "${VCS_EXTRA}") + +(define VCS_ACTION_STAMP "${VCS_ACTION_STAMP}") +(define VCS_FULL_HASH "${VCS_FULL_HASH}") +(define VCS_SHORT_HASH "${VCS_SHORT_HASH}") + +(define VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) +;; end +EOF +} + +# For clojure output +clojureOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="false" ;; + 1) VCS_WC_MODIFIED="true" ;; + esac + cat > "${TARGETFILE}" << EOF +;; ${GENERATED_HEADER} +(def VCS_TYPE "${VCS_TYPE}") +(def VCS_BASENAME "${VCS_BASENAME}") +(def VCS_UUID "${VCS_UUID}") +(def VCS_NUM ${VCS_NUM}) +(def VCS_DATE "${VCS_DATE}") +(def VCS_BRANCH "${VCS_BRANCH}") +(def VCS_TAG "${VCS_TAG}") +(def VCS_TICK ${VCS_TICK}) +(def VCS_EXTRA "${VCS_EXTRA}") + +(def VCS_ACTION_STAMP "${VCS_ACTION_STAMP}") +(def VCS_FULL_HASH "${VCS_FULL_HASH}") +(def VCS_SHORT_HASH "${VCS_SHORT_HASH}") + +(def VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) +;; end +EOF +} + +# For rpm spec file output +rpmOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} +$([ "${VCS_TYPE}" ] && echo "%define vcs_type ${VCS_TYPE}") +$([ "${VCS_BASENAME}" ] && echo "%define vcs_basename ${VCS_BASENAME}") +$([ "${VCS_UUID}" ] && echo "%define vcs_uuid ${VCS_UUID}") +$([ "${VCS_NUM}" ] && echo "%define vcs_num ${VCS_NUM}") +$([ "${VCS_DATE}" ] && echo "%define vcs_date ${VCS_DATE}") +$([ "${VCS_BRANCH}" ] && echo "%define vcs_branch ${VCS_BRANCH}") +$([ "${VCS_TAG}" ] && echo "%define vcs_tag ${VCS_TAG}") +$([ "${VCS_TICK}" ] && echo "%define vcs_tick ${VCS_TICK}") +$([ "${VCS_EXTRA}" ] && echo "%define vcs_extra ${VCS_EXTRA}") + +$([ "${VCS_ACTION_STAMP}" ] && echo "%define vcs_action_stamp ${VCS_ACTION_STAMP}") +$([ "${VCS_FULL_HASH}" ] && echo "%define vcs_full_hash ${VCS_FULL_HASH}") +$([ "${VCS_SHORT_HASH}" ] && echo "%define vcs_short_hash ${VCS_SHORT_HASH}") + +$([ "${VCS_WC_MODIFIED}" ] && echo "%define vcs_wc_modified ${VCS_WC_MODIFIED}") +# end +EOF +} + +# shellcheck disable=SC2155,SC2039 +hppOutput() { + local NAMESPACE="$(echo "${VCS_BASENAME}" | sed -e 's:_::g' | tr '[:lower:]' '[:upper:]')" + cat > "${TARGETFILE}" << EOF +/* ${GENERATED_HEADER} */ + +#ifndef ${NAMESPACE}_AUTOREVISION_H +#define ${NAMESPACE}_AUTOREVISION_H + +#include + +namespace $(echo "${NAMESPACE}" | tr '[:upper:]' '[:lower:]') +{ + const std::string VCS_TYPE = "${VCS_TYPE}"; + const std::string VCS_BASENAME = "${VCS_BASENAME}"; + const std::string VCS_UUID = "${VCS_UUID}"; + const int VCS_NUM = ${VCS_NUM}; + const std::string VCS_DATE = "${VCS_DATE}"; + const std::string VCS_BRANCH = "${VCS_BRANCH}"; + const std::string VCS_TAG = "${VCS_TAG}"; + const int VCS_TICK = ${VCS_TICK}; + const std::string VCS_EXTRA = "${VCS_EXTRA}"; + + const std::string VCS_ACTION_STAMP = "${VCS_ACTION_STAMP}"; + const std::string VCS_FULL_HASH = "${VCS_FULL_HASH}"; + const std::string VCS_SHORT_HASH = "${VCS_SHORT_HASH}"; + + const int VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; +} + +#endif + +/* end */ +EOF +} + +matlabOutput() { + case "${VCS_WC_MODIFIED}" in + 0) VCS_WC_MODIFIED="FALSE" ;; + 1) VCS_WC_MODIFIED="TRUE" ;; + esac + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} + +VCS_TYPE = '${VCS_TYPE}'; +VCS_BASENAME = '${VCS_BASENAME}'; +VCS_UUID = '${VCS_UUID}'; +VCS_NUM = ${VCS_NUM}; +VCS_DATE = '${VCS_DATE}'; +VCS_BRANCH = '${VCS_BRANCH}'; +VCS_TAG = '${VCS_TAG}'; +VCS_TICK = ${VCS_TICK}; +VCS_EXTRA = '${VCS_EXTRA}'; + +VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +VCS_FULL_HASH = '${VCS_FULL_HASH}'; +VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +% end +EOF +} + +octaveOutput() { + cat > "${TARGETFILE}" << EOF +% ${GENERATED_HEADER} + +VCS_TYPE = '${VCS_TYPE}'; +VCS_BASENAME = '${VCS_BASENAME}'; +VCS_UUID = '${VCS_UUID}'; +VCS_NUM = ${VCS_NUM}; +VCS_DATE = '${VCS_DATE}'; +VCS_BRANCH = '${VCS_BRANCH}'; +VCS_TAG = '${VCS_TAG}'; +VCS_TICK = ${VCS_TICK}; +VCS_EXTRA = '${VCS_EXTRA}'; + +VCS_ACTION_STAMP = '${VCS_ACTION_STAMP}'; +VCS_FULL_HASH = '${VCS_FULL_HASH}'; +VCS_SHORT_HASH = '${VCS_SHORT_HASH}'; + +VCS_WC_MODIFIED = ${VCS_WC_MODIFIED}; + +% end +EOF +} + +cmakeOutput() { + cat > "${TARGETFILE}" << EOF +# ${GENERATED_HEADER} + +set(VCS_TYPE ${VCS_TYPE}) +set(VCS_BASENAME ${VCS_BASENAME}) +set(VCS_UUID ${VCS_UUID}) +set(VCS_NUM ${VCS_NUM}) +set(VCS_DATE ${VCS_DATE}) +set(VCS_BRANCH ${VCS_BRANCH}) +set(VCS_TAG ${VCS_TAG}) +set(VCS_TICK ${VCS_TICK}) +set(VCS_EXTRA ${VCS_EXTRA}) + +set(VCS_ACTION_STAMP ${VCS_ACTION_STAMP}) +set(VCS_FULL_HASH ${VCS_FULL_HASH}) +set(VCS_SHORT_HASH ${VCS_SHORT_HASH}) + +set(VCS_WC_MODIFIED ${VCS_WC_MODIFIED}) + +# end +EOF +} + + +# Helper functions +# Count path segments +# shellcheck disable=SC2039 +pathSegment() { + local pathz="${1}" + local depth="0" + + if [ ! -z "${pathz}" ]; then + # Continue until we are at / or there are no path separators left. + while [ ! "${pathz}" = "/" ] && [ ! "${pathz}" = "$(echo "${pathz}" | sed -e 's:/::')" ]; do + pathz="$(dirname "${pathz}")" + depth="$((depth+1))" + done + fi + echo "${depth}" +} + +# Largest of four numbers +# shellcheck disable=SC2039 +multiCompare() { + local larger="${1}" + local numA="${2}" + local numB="${3}" + local numC="${4}" + + [ "${numA}" -gt "${larger}" ] && larger="${numA}" + [ "${numB}" -gt "${larger}" ] && larger="${numB}" + [ "${numC}" -gt "${larger}" ] && larger="${numC}" + echo "${larger}" +} + +# Test for repositories +# shellcheck disable=SC2155,SC2039 +repoTest() { + REPONUM="0" + if [ ! -z "$(git rev-parse HEAD 2>/dev/null)" ]; then + local gitPath="$(git rev-parse --show-toplevel)" + local gitDepth="$(pathSegment "${gitPath}")" + REPONUM="$((REPONUM+1))" + else + local gitDepth="0" + fi + if [ ! -z "$(hg root 2>/dev/null)" ]; then + local hgPath="$(hg root 2>/dev/null)" + local hgDepth="$(pathSegment "${hgPath}")" + REPONUM="$((REPONUM+1))" + else + local hgDepth="0" + fi + if [ ! -z "$(bzr root 2>/dev/null)" ]; then + local bzrPath="$(bzr root 2>/dev/null)" + local bzrDepth="$(pathSegment "${bzrPath}")" + REPONUM="$((REPONUM+1))" + else + local bzrDepth="0" + fi + if [ ! -z "$(svn info 2>/dev/null)" ]; then + local stringz="" + local stringx="" + local svnPath="$(svn info --xml | sed -n -e "s:${stringz}::" -e "s:${stringx}::p")" + # An old enough svn will not be able give us a path; default + # to 1 for that case. + if [ -z "${svnPath}" ]; then + local svnDepth="1" + else + local svnDepth="$(pathSegment "${svnPath}")" + fi + REPONUM="$((REPONUM+1))" + else + local svnDepth="0" + fi + + # Do not do more work then we have to. + if [ "${REPONUM}" = "0" ]; then + return + fi + + # Figure out which repo is the deepest and use it. + local wonRepo="$(multiCompare "${gitDepth}" "${hgDepth}" "${bzrDepth}" "${svnDepth}")" + if [ "${wonRepo}" = "${gitDepth}" ]; then + gitRepo + elif [ "${wonRepo}" = "${hgDepth}" ]; then + hgRepo + elif [ "${wonRepo}" = "${bzrDepth}" ]; then + bzrRepo + elif [ "${wonRepo}" = "${svnDepth}" ]; then + svnRepo + fi +} + + + +# Detect which repos we are in and gather data. +# shellcheck source=/dev/null +if [ -f "${CACHEFILE}" ] && [ "${CACHEFORCE}" = "1" ]; then + # When requested only read from the cache to populate our symbols. + . "${CACHEFILE}" +else + # If a value is not set through the environment set VCS_EXTRA to nothing. + : "${VCS_EXTRA:=""}" + repoTest + + if [ -f "${CACHEFILE}" ] && [ "${REPONUM}" = "0" ]; then + # We are not in a repo; try to use a previously generated cache to populate our symbols. + . "${CACHEFILE}" + # Do not overwrite the cache if we know we are not going to write anything new. + CACHEFORCE="1" + elif [ "${REPONUM}" = "0" ]; then + echo "error: No repo or cache detected." 1>&2 + exit 1 + fi +fi + + +# -s output is handled here. +if [ ! -z "${VAROUT}" ]; then + if [ "${VAROUT}" = "VCS_TYPE" ]; then + echo "${VCS_TYPE}" + elif [ "${VAROUT}" = "VCS_BASENAME" ]; then + echo "${VCS_BASENAME}" + elif [ "${VAROUT}" = "VCS_NUM" ]; then + echo "${VCS_NUM}" + elif [ "${VAROUT}" = "VCS_DATE" ]; then + echo "${VCS_DATE}" + elif [ "${VAROUT}" = "VCS_BRANCH" ]; then + echo "${VCS_BRANCH}" + elif [ "${VAROUT}" = "VCS_TAG" ]; then + echo "${VCS_TAG}" + elif [ "${VAROUT}" = "VCS_TICK" ]; then + echo "${VCS_TICK}" + elif [ "${VAROUT}" = "VCS_FULL_HASH" ]; then + echo "${VCS_FULL_HASH}" + elif [ "${VAROUT}" = "VCS_SHORT_HASH" ]; then + echo "${VCS_SHORT_HASH}" + elif [ "${VAROUT}" = "VCS_WC_MODIFIED" ]; then + echo "${VCS_WC_MODIFIED}" + elif [ "${VAROUT}" = "VCS_ACTION_STAMP" ]; then + echo "${VCS_ACTION_STAMP}" + else + echo "error: Not a valid output symbol." 1>&2 + exit 1 + fi +fi + + +# Detect requested output type and use it. +if [ ! -z "${AFILETYPE}" ]; then + if [ "${AFILETYPE}" = "c" ]; then + cOutput + elif [ "${AFILETYPE}" = "h" ]; then + hOutput + elif [ "${AFILETYPE}" = "xcode" ]; then + xcodeOutput + elif [ "${AFILETYPE}" = "swift" ]; then + swiftOutput + elif [ "${AFILETYPE}" = "sh" ]; then + shOutput + elif [ "${AFILETYPE}" = "py" ] || [ "${AFILETYPE}" = "python" ]; then + pyOutput + elif [ "${AFILETYPE}" = "pl" ] || [ "${AFILETYPE}" = "perl" ]; then + plOutput + elif [ "${AFILETYPE}" = "lua" ]; then + luaOutput + elif [ "${AFILETYPE}" = "php" ]; then + phpOutput + elif [ "${AFILETYPE}" = "ini" ]; then + iniOutput + elif [ "${AFILETYPE}" = "js" ]; then + jsOutput + elif [ "${AFILETYPE}" = "json" ]; then + jsonOutput + elif [ "${AFILETYPE}" = "java" ]; then + javaOutput + elif [ "${AFILETYPE}" = "javaprop" ]; then + javapropOutput + elif [ "${AFILETYPE}" = "tex" ]; then + texOutput + elif [ "${AFILETYPE}" = "m4" ]; then + m4Output + elif [ "${AFILETYPE}" = "scheme" ]; then + schemeOutput + elif [ "${AFILETYPE}" = "clojure" ]; then + clojureOutput + elif [ "${AFILETYPE}" = "rpm" ]; then + rpmOutput + elif [ "${AFILETYPE}" = "hpp" ]; then + hppOutput + elif [ "${AFILETYPE}" = "matlab" ]; then + matlabOutput + elif [ "${AFILETYPE}" = "octave" ]; then + octaveOutput + elif [ "${AFILETYPE}" = "cmake" ]; then + cmakeOutput + else + echo "error: Not a valid output type." 1>&2 + exit 1 + fi +fi + + +# If requested, make a cache file. +if [ ! -z "${CACHEFILE}" ] && [ ! "${CACHEFORCE}" = "1" ]; then + TARGETFILE="${CACHEFILE}.tmp" + shOutput + + # Check to see if there have been any actual changes. + if [ ! -f "${CACHEFILE}" ]; then + mv -f "${CACHEFILE}.tmp" "${CACHEFILE}" + elif cmp -s "${CACHEFILE}.tmp" "${CACHEFILE}"; then + rm -f "${CACHEFILE}.tmp" + else + mv -f "${CACHEFILE}.tmp" "${CACHEFILE}" + fi +fi diff --git a/ci/get-nprocessors.sh b/ci/get-nprocessors.sh new file mode 100644 index 0000000..43635e7 --- /dev/null +++ b/ci/get-nprocessors.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Copyright 2017 Google Inc. +# All Rights Reserved. +# +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "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 COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This file is typically sourced by another script. +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi + +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi diff --git a/ci/perpare_pulp3_netrc.sh b/ci/perpare_pulp3_netrc.sh new file mode 100644 index 0000000..8414bbb --- /dev/null +++ b/ci/perpare_pulp3_netrc.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env sh +set -evx +echo "machine ${PULP3_SERVER_URL}\nlogin ${PULP3_SERVER_LOGIN}\npassword ${PULP3_SERVER_PASSWORD}\n" > ~/.netrc diff --git a/ci/travis.sh b/ci/travis.sh new file mode 100644 index 0000000..3640f4b --- /dev/null +++ b/ci/travis.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env sh +set -evx + +chmod +x ci/get-nprocessors.sh +. ci/get-nprocessors.sh + +# if possible, ask for the precise number of processors, +# otherwise take 2 processors as reasonable default; see +# https://docs.travis-ci.com/user/speeding-up-the-build/#Makefile-optimization +if [ -x /usr/bin/getconf ]; then + NPROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN) +else + NPROCESSORS=2 +fi + +# as of 2017-09-04 Travis CI reports 32 processors, but GCC build +# crashes if parallelized too much (maybe memory consumption problem), +# so limit to 4 processors for the time being. +if [ $NPROCESSORS -gt 4 ] ; then + echo "$0:Note: Limiting processors to use by make from $NPROCESSORS to 4." + NPROCESSORS=4 +fi + +# Tell make to use the processors. No preceding '-' required. +MAKEFLAGS="j${NPROCESSORS}" +export MAKEFLAGS + +env | sort + +# Set default values to OFF for these variables if not specified. +: "${NO_EXCEPTION:=OFF}" +: "${NO_RTTI:=OFF}" +: "${COMPILER_IS_GNUCXX:=OFF}" + +# Install dependency from YUM +if [ -n "${INSTALL_DEPENDENCY_LIBRARY}" ]; then + yum install -y $INSTALL_DEPENDENCY_LIBRARY +fi + +if [ -n "${INSTALL_DEPENDENCY_FRAMEWORK}" ]; then + yum install -y $INSTALL_DEPENDENCY_FRAMEWORK + source /etc/profile.d/framework.sh +fi + + + +if [ $ASAN_OPTION ] && [ -f "/opt/rh/devtoolset-7/enable" ] ;then + source /opt/rh/devtoolset-7/enable +fi + + + +mkdir build || true +cd build + +cmake3 -DCMAKE_CXX_FLAGS=$CXX_FLAGS \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ + -DENABLE_DEVEL=$ENABLE_DEVEL_SWITCH \ + -DASAN_OPTION=$ASAN_OPTION \ + -DVERSION_DAILY_BUILD=$TESTING_VERSION_BUILD \ + .. + +make + + +if [ -n "${PACKAGE}" ]; then + make package +fi + +if [ -n "${UPLOAD_RPM}" ]; then + cp ~/rpm_upload_tools.py ./ + python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm +fi + +if [ -n "${UPLOAD_SYMBOL_FILES}" ]; then + rpm -i $SYMBOL_TARGET*debuginfo*.rpm + _symbol_file=`find /usr/lib/debug/ -name "$SYMBOL_TARGET*.so*.debug"` + cp $_symbol_file ${_symbol_file}info.${CI_COMMIT_SHORT_SHA} + sentry-cli upload-dif -t elf ${_symbol_file}info.${CI_COMMIT_SHORT_SHA} +fi diff --git a/cmake/Package.cmake b/cmake/Package.cmake new file mode 100644 index 0000000..6187cb8 --- /dev/null +++ b/cmake/Package.cmake @@ -0,0 +1,50 @@ +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(MY_RPM_NAME_PREFIX "lib${lib_name}-debug") +else() + set(MY_RPM_NAME_PREFIX "lib${lib_name}") +endif() + +message(STATUS "Package: ${MY_RPM_NAME_PREFIX}") + +set(CPACK_PACKAGE_VECDOR "MESA") +set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") +set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}.${VERSION_BUILD}") +set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) +set(CPACK_PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}") +execute_process(COMMAND bash -c "echo -ne \"`uname -r | awk -F'.' '{print $5\".\"$6\".\"$7}'`\"" OUTPUT_VARIABLE SYSTEM_VERSION) + +# RPM Build +set(CPACK_GENERATOR "RPM") +set(CPACK_RPM_AUTO_GENERATED_FILE_NAME ON) +set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") +set(CPACK_RPM_PACKAGE_VENDOR "MESA") +set(CPACK_RPM_PACKAGE_AUTOREQPROV "yes") +set(CPACK_RPM_PACKAGE_RELEASE_DIST "on") +set(CPACK_RPM_DEBUGINFO_PACKAGE "on") + +set(CPACK_RPM_COMPONENT_INSTALL ON) +set(CPACK_COMPONENTS_IGNORE_GROUPS 1) +set(CPACK_COMPONENTS_GROUPING ONE_PER_GROUP) +set(CPACK_COMPONENT_HEADER_DISPLAY_NAME "develop") + +set(CPACK_COMPONENT_LIBRARIES_REQUIRED TRUE) +set(CPACK_RPM_LIBRARIES_PACKAGE_NAME ${MY_RPM_NAME_PREFIX}) +set(CPACK_COMPONENT_LIBRARIES_GROUP "LIBRARIES") + +set(CPACK_COMPONENT_HEADER_REQUIRED TRUE) +set(CPACK_RPM_HEADER_PACKAGE_NAME "${MY_RPM_NAME_PREFIX}-devel") +set(CPACK_COMPONENT_HEADER_GROUP "header") + +set(CPACK_RPM_HEADER_PACKAGE_REQUIRES_PRE ${CPACK_RPM_LIBRARIES_PACKAGE_NAME}) +set(CPACK_RPM_HEADER_PACKAGE_CONFLICTS ${CPACK_RPM_HEADER_PACKAGE_NAME}) + +set(CPACK_COMPONENTS_ALL LIBRARIES HEADER) + +set(CPACK_BUILD_SOURCE_DIRS "${CMAKE_SOURCE_DIR}") + +# Must uninstall the debug package before install release package +set(CPACK_RPM_PACKAGE_CONFLICTS ${MY_RPM_NAME_PREFIX}) + +# set(CPACK_STRIP_FILES TRUE) +include(CPack) diff --git a/cmake/Version.cmake b/cmake/Version.cmake new file mode 100644 index 0000000..a47944c --- /dev/null +++ b/cmake/Version.cmake @@ -0,0 +1,54 @@ + +# Using autorevision.sh to generate version information + +set(__SOURCE_AUTORESIVISION ${CMAKE_SOURCE_DIR}/autorevision.sh) +set(__AUTORESIVISION ${CMAKE_BINARY_DIR}/autorevision.sh) +set(__VERSION_CACHE ${CMAKE_BINARY_DIR}/version.txt) +set(__VERSION_CONFIG ${CMAKE_BINARY_DIR}/version.cmake) + +file(COPY ${__SOURCE_AUTORESIVISION} DESTINATION ${CMAKE_BINARY_DIR} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + +# execute autorevision.sh to generate version information +execute_process(COMMAND ${__AUTORESIVISION} -t cmake -o ${__VERSION_CACHE} + OUTPUT_FILE ${__VERSION_CONFIG} ERROR_QUIET) +include(${__VERSION_CONFIG}) + +# extract major, minor, patch version from git tag +string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VCS_TAG}") +string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VCS_TAG}") +string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VCS_TAG}") +string(REGEX REPLACE "[T\\:\\+\\-]" "" VERSION_DATE "${VCS_DATE}") + +if(VERSION_DAILY_BUILD) + set(VERSION_PATCH ${VERSION_PATCH}.${VERSION_DATE}) +endif() + +if(NOT VERSION_MAJOR) + set(VERSION_MAJOR 1) +endif() + +if(NOT VERSION_MINOR) + set(VERSION_MINOR 0) +endif() + +if(NOT VERSION_PATCH) + set(VERSION_PATCH 0) +endif() + +set(VERSION "${VERSION_MAJOR}_${VERSION_MINOR}_${VERSION_PATCH}") +set(VERSION_BUILD "${VCS_SHORT_HASH}") + +# print information +message(STATUS "Version: ${VERSION}-${VERSION_BUILD}") + +option(DEFINE_GIT_VERSION "Set DEFINE_GIT_VERSION to TRUE or FALSE" TRUE) + +if(DEFINE_GIT_VERSION) + set(GIT_VERSION + "${VERSION}-${CMAKE_BUILD_TYPE}-${VERSION_BUILD}-${VCS_BRANCH}-${VCS_TAG}-${VCS_DATE}") + string(REGEX REPLACE "[-:+/\\.]" "_" GIT_VERSION ${GIT_VERSION}) + + add_definitions(-DGIT_VERSION=${GIT_VERSION}) +endif() diff --git a/inc/mesa_sts.h b/inc/mesa_sts.h new file mode 100644 index 0000000..5a2f5f1 --- /dev/null +++ b/inc/mesa_sts.h @@ -0,0 +1,28 @@ +#ifndef _MESA_STS_H_ +#define _MESA_STS_H_ + +struct sts_result { + unsigned char frequency; + unsigned char block_frequency; + unsigned char cumulative_sums; + unsigned char runs; + unsigned char longest_run; + unsigned char rank; + unsigned char discrete_fourier_transform; + unsigned char non_overlapping_template_matching; + unsigned char overlapping_template_matching; + unsigned char universal; + unsigned char approximate_entropy; + unsigned char random_excursions; + unsigned char random_excursions_variant; + unsigned char serial; + unsigned char linear_complexity; + unsigned char poker_detect; + unsigned char runs_distribution; + unsigned char self_correlation; + unsigned char binary_derivative; +}; + +int mesa_statistical_test_suite(void* data,unsigned int datalen, struct sts_result* result); + +#endif /* _MESA_STS_H_ */ \ No newline at end of file diff --git a/src/approximateEntropy.c b/src/approximateEntropy.c new file mode 100644 index 0000000..b386056 --- /dev/null +++ b/src/approximateEntropy.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + A P P R O X I M A T E E N T R O P Y T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +ApproximateEntropy(int m, int n, BitSequence *epsilon) +{ + int i, j, k, r, blockSize, seqLength, powLen, index; + double sum, numOfBlocks, ApEn[2], apen, chi_squared, p_value; + unsigned int *P; + + seqLength = n; + r = 0; + + for ( blockSize=m; blockSize<=m+1; blockSize++ ) { + if ( blockSize == 0 ) { + ApEn[0] = 0.00; + r++; + } + else { + numOfBlocks = (double)seqLength; + powLen = (int)pow(2, blockSize+1)-1; + if ( (P = (unsigned int*)calloc(powLen,sizeof(unsigned int)))== NULL ) { + return 0; + } + for ( i=1; i 0 ) + sum += P[index]*log(P[index]/numOfBlocks); + index++; + } + sum /= numOfBlocks; + ApEn[r] = sum; + r++; + free(P); + } + } + apen = ApEn[0] - ApEn[1]; + + chi_squared = 2.0*seqLength*(log(2) - apen); + p_value = cephes_igamc(pow(2, m-1), chi_squared/2.0); + + if ( m > (int)(log(seqLength)/log(2)-5) ) { + return 0; + } + + if (p_value < ALPHA) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/src/binaryDerivate.c b/src/binaryDerivate.c new file mode 100644 index 0000000..6d2dc4a --- /dev/null +++ b/src/binaryDerivate.c @@ -0,0 +1,30 @@ +#include +#include "include/stat_fncs.h" + +int BinaryDerivate(int k, int n, BitSequence *epsilon, int epsilon_l) +{ + int i = 0, j = 0; + int Sn_k = 0; + int n_k = n - k; + double V = 0.0, p_value = 0.0, sqrt2 = 1.41421356237309504880; + + for (i = 0; i < k; ++i) { + for (j = 0; j < epsilon_l - 1; ++j) { + epsilon[j] = epsilon[j] ^ epsilon[j + 1]; + } + } + + for (i = 0; i < n_k; ++i) { + Sn_k += (2 * (int)epsilon[i]) - 1; + } + + V = fabs(Sn_k) / sqrt(n_k); + + p_value = erfc(fabs(V) / sqrt2); + + if (p_value < ALPHA) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/src/blockFrequency.c b/src/blockFrequency.c new file mode 100644 index 0000000..ba4ad34 --- /dev/null +++ b/src/blockFrequency.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + B L O C K F R E Q U E N C Y T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +BlockFrequency(int M, int n, BitSequence *epsilon) +{ + int i, j, N, blockSum; + double p_value, sum, pi, v, chi_squared; + + N = n/M; /* # OF SUBSTRING BLOCKS */ + sum = 0.0; + + for ( i=0; i +#include +#include "include/cephes.h" + +static const double rel_error = 1E-12; + +double MACHEP = 1.11022302462515654042E-16; // 2**-53 +double MAXLOG = 7.09782712893383996732224E2; // log(MAXNUM) +double MAXNUM = 1.7976931348623158E308; // 2**1024*(1-MACHEP) +double PI = 3.14159265358979323846; // pi, duh! + +static double big = 4.503599627370496e15; +static double biginv = 2.22044604925031308085e-16; + +int sgngam = 0; + +double +cephes_igamc(double a, double x) +{ + double ans, ax, c, yc, r, t, y, z; + double pk, pkm1, pkm2, qk, qkm1, qkm2; + + if ( (x <= 0) || ( a <= 0) ) + return( 1.0 ); + + if ( (x < 1.0) || (x < a) ) + return( 1.e0 - cephes_igam(a,x) ); + + ax = a * log(x) - x - cephes_lgam(a); + + if ( ax < -MAXLOG ) { + printf("igamc: UNDERFLOW\n"); + return 0.0; + } + ax = exp(ax); + + /* continued fraction */ + y = 1.0 - a; + z = x + y + 1.0; + c = 0.0; + pkm2 = 1.0; + qkm2 = x; + pkm1 = x + 1.0; + qkm1 = z * x; + ans = pkm1/qkm1; + + do { + c += 1.0; + y += 1.0; + z += 2.0; + yc = y * c; + pk = pkm1 * z - pkm2 * yc; + qk = qkm1 * z - qkm2 * yc; + if ( qk != 0 ) { + r = pk/qk; + t = fabs( (ans - r)/r ); + ans = r; + } + else + t = 1.0; + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + if ( fabs(pk) > big ) { + pkm2 *= biginv; + pkm1 *= biginv; + qkm2 *= biginv; + qkm1 *= biginv; + } + } while ( t > MACHEP ); + + return ans*ax; +} + +double +cephes_igam(double a, double x) +{ + double ans, ax, c, r; + + if ( (x <= 0) || ( a <= 0) ) + return 0.0; + + if ( (x > 1.0) && (x > a ) ) + return 1.e0 - cephes_igamc(a,x); + + /* Compute x**a * exp(-x) / gamma(a) */ + ax = a * log(x) - x - cephes_lgam(a); + if ( ax < -MAXLOG ) { + printf("igam: UNDERFLOW\n"); + return 0.0; + } + ax = exp(ax); + + /* power series */ + r = a; + c = 1.0; + ans = 1.0; + + do { + r += 1.0; + c *= x/r; + ans += c; + } while ( c/ans > MACHEP ); + + return ans * ax/a; +} + +union A_Array { + double d[5]; + unsigned short us[20]; +}; + + +union BC_Array { + double d[6]; + unsigned short us[24]; +}; + +/* A[]: Stirling's formula expansion of log gamma + * B[], C[]: log gamma function between 2 and 3 + */ + +/**/ +static union A_Array A = { + .us = { + 0x6661,0x2733,0x9850,0x3f4a, + 0xe943,0xb580,0x7fbd,0xbf43, + 0x5ebb,0x20dc,0x019f,0x3f4a, + 0xa5a1,0x16b0,0xc16c,0xbf66, + 0x554b,0x5555,0x5555,0x3fb5 + } +}; +static union BC_Array B = { + .us = { + 0x6761,0x8ff3,0x8901,0xc095, + 0xb93e,0x355b,0xf234,0xc0e2, + 0x89e5,0xf890,0x3d73,0xc114, + 0xdb51,0xf994,0xbc82,0xc131, + 0xf20b,0x0219,0x4589,0xc13a, + 0x055e,0x5418,0x0c67,0xc12a + } +}; +static union BC_Array C = { + /*0x0000,0x0000,0x0000,0x3ff0,*/ + .us = { + 0x12b2,0x1cf3,0xfd0d,0xc075, + 0xd757,0x7b89,0xaa0d,0xc0d0, + 0x4c9b,0xb974,0xeb84,0xc10a, + 0x0043,0x7195,0x6286,0xc131, + 0xf34c,0x892f,0x5255,0xc143, + 0xe14a,0x6a11,0xce4b,0xc13e + } +}; + +#define MAXLGM 2.556348e305 + + +/* Logarithm of gamma function */ +double +cephes_lgam(double x) +{ + double p, q, u, w, z; + int i; + + sgngam = 1; + + if ( x < -34.0 ) { + q = -x; + w = cephes_lgam(q); /* note this modifies sgngam! */ + p = floor(q); + if ( p == q ) { +lgsing: + goto loverf; + } + i = (int)p; + if ( (i & 1) == 0 ) + sgngam = -1; + else + sgngam = 1; + z = q - p; + if ( z > 0.5 ) { + p += 1.0; + z = p - q; + } + z = q * sin( PI * z ); + if ( z == 0.0 ) + goto lgsing; + /* z = log(PI) - log( z ) - w;*/ + z = log(PI) - log( z ) - w; + return z; + } + + if ( x < 13.0 ) { + z = 1.0; + p = 0.0; + u = x; + while ( u >= 3.0 ) { + p -= 1.0; + u = x + p; + z *= u; + } + while ( u < 2.0 ) { + if ( u == 0.0 ) + goto lgsing; + z /= u; + p += 1.0; + u = x + p; + } + if ( z < 0.0 ) { + sgngam = -1; + z = -z; + } + else + sgngam = 1; + if ( u == 2.0 ) + return( log(z) ); + p -= 2.0; + x = x + p; + p = x * cephes_polevl( x, (double *)B.d, 5 ) / cephes_p1evl( x, (double *)C.d, 6); + + return log(z) + p; + } + + if ( x > MAXLGM ) { +loverf: + printf("lgam: OVERFLOW\n"); + + return sgngam * MAXNUM; + } + + q = ( x - 0.5 ) * log(x) - x + log( sqrt( 2*PI ) ); + if ( x > 1.0e8 ) + return q; + + p = 1.0/(x*x); + if ( x >= 1000.0 ) + q += (( 7.9365079365079365079365e-4 * p + - 2.7777777777777777777778e-3) *p + + 0.0833333333333333333333) / x; + else + q += cephes_polevl( p, (double *)A.d, 4 ) / x; + + return q; +} + +double +cephes_polevl(double x, double *coef, int N) +{ + double ans; + int i; + double *p; + + p = coef; + ans = *p++; + i = N; + + do + ans = ans * x + *p++; + while ( --i ); + + return ans; +} + +double +cephes_p1evl(double x, double *coef, int N) +{ + double ans; + double *p; + int i; + + p = coef; + ans = x + *p++; + i = N-1; + + do + ans = ans * x + *p++; + while ( --i ); + + return ans; +} + +double +cephes_erf(double x) +{ + static const double two_sqrtpi = 1.128379167095512574; + double sum = x, term = x, xsqr = x * x; + int j = 1; + + if ( fabs(x) > 2.2 ) + return 1.0 - cephes_erfc(x); + + do { + term *= xsqr/j; + sum -= term/(2*j+1); + j++; + term *= xsqr/j; + sum += term/(2*j+1); + j++; + } while ( fabs(term)/sum > rel_error ); + + return two_sqrtpi*sum; +} + +double +cephes_erfc(double x) +{ + static const double one_sqrtpi = 0.564189583547756287; + double a = 1, b = x, c = x, d = x*x + 0.5; + double q1, q2 = b/d, n = 1.0, t; + + if ( fabs(x) < 2.2 ) + return 1.0 - cephes_erf(x); + if ( x < 0 ) + return 2.0 - cephes_erfc(-x); + + do { + t = a*n + b*x; + a = b; + b = t; + t = c*n + d*x; + c = d; + d = t; + n += 0.5; + q1 = q2; + q2 = b/d; + } while ( fabs(q1-q2)/q2 > rel_error ); + + return one_sqrtpi*exp(-x*x)*q2; +} + + +double +cephes_normal(double x) +{ + double arg, result, sqrt2=1.414213562373095048801688724209698078569672; + + if (x > 0) { + arg = x/sqrt2; + result = 0.5 * ( 1 + erf(arg) ); + } + else { + arg = -x/sqrt2; + result = 0.5 * (erfc(arg) ); + } + + return( result); +} diff --git a/src/cusum.c b/src/cusum.c new file mode 100644 index 0000000..d9be4e1 --- /dev/null +++ b/src/cusum.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + C U M U L A T I V E S U M S T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +CumulativeSums(int n, BitSequence *epsilon) +{ + int S, sup, inf, z=1, zrev, k; + double sum1, sum2, p_value; + + S = 0; + sup = 0; + inf = 0; + for ( k=0; k sup ) + sup++; + if ( S < inf ) + inf--; + z = (sup > -inf) ? sup : -inf; + zrev = (sup-S > S-inf) ? sup-S : S-inf; + } + + // forward + sum1 = 0.0; + for ( k=(-n/z+1)/4; k<=(n/z-1)/4; k++ ) { + sum1 += cephes_normal(((4*k+1)*z)/sqrt(n)); + sum1 -= cephes_normal(((4*k-1)*z)/sqrt(n)); + } + sum2 = 0.0; + for ( k=(-n/z-3)/4; k<=(n/z-1)/4; k++ ) { + sum2 += cephes_normal(((4*k+3)*z)/sqrt(n)); + sum2 -= cephes_normal(((4*k+1)*z)/sqrt(n)); + } + + p_value = 1.0 - sum1 + sum2; + +// fprintf(stats[TEST_CUSUM], "\t\t CUMULATIVE SUMS (FORWARD) TEST\n"); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); +// fprintf(stats[TEST_CUSUM], "\t\tCOMPUTATIONAL INFORMATION:\n"); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); +// fprintf(stats[TEST_CUSUM], "\t\t(a) The maximum partial sum = %d\n", z); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); + + if ( isNegative(p_value) || isGreaterThanOne(p_value) ) { +// fprintf(stats[TEST_CUSUM], "\t\tWARNING: P_VALUE IS OUT OF RANGE\n"); + return 0; + } + +// fprintf(stats[TEST_CUSUM], "%s\t\tp_value = %f\n\n", p_value < ALPHA ? "FAILURE" : "SUCCESS", p_value); +// fprintf(results[TEST_CUSUM], "%f\n", p_value); + if (p_value < ALPHA) { + return 0; + } + + // backwards + sum1 = 0.0; + for ( k=(-n/zrev+1)/4; k<=(n/zrev-1)/4; k++ ) { + sum1 += cephes_normal(((4*k+1)*zrev)/sqrt(n)); + sum1 -= cephes_normal(((4*k-1)*zrev)/sqrt(n)); + } + sum2 = 0.0; + for ( k=(-n/zrev-3)/4; k<=(n/zrev-1)/4; k++ ) { + sum2 += cephes_normal(((4*k+3)*zrev)/sqrt(n)); + sum2 -= cephes_normal(((4*k+1)*zrev)/sqrt(n)); + } + p_value = 1.0 - sum1 + sum2; + +// fprintf(stats[TEST_CUSUM], "\t\t CUMULATIVE SUMS (REVERSE) TEST\n"); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); +// fprintf(stats[TEST_CUSUM], "\t\tCOMPUTATIONAL INFORMATION:\n"); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); +// fprintf(stats[TEST_CUSUM], "\t\t(a) The maximum partial sum = %d\n", zrev); +// fprintf(stats[TEST_CUSUM], "\t\t-------------------------------------------\n"); + + if ( isNegative(p_value) || isGreaterThanOne(p_value) ) { +// fprintf(stats[TEST_CUSUM], "\t\tWARNING: P_VALUE IS OUT OF RANGE\n"); + return 0; + } + +// fprintf(stats[TEST_CUSUM], "%s\t\tp_value = %f\n\n", p_value < ALPHA ? "FAILURE" : "SUCCESS", p_value); fflush(stats[TEST_CUSUM]); +// fprintf(results[TEST_CUSUM], "%f\n", p_value); fflush(results[TEST_CUSUM]); + if (p_value < ALPHA) { + return 0; + } else { + return 1; + } +} \ No newline at end of file diff --git a/src/dfft.c b/src/dfft.c new file mode 100644 index 0000000..71c0efd --- /dev/null +++ b/src/dfft.c @@ -0,0 +1,1462 @@ +/* Notes from RFB: + +Looks like the user-level routines are: + +Real FFT + +void __ogg_fdrffti(int n, double *wsave, int *ifac) +void __ogg_fdrfftf(int n, double *r, double *wsave, int *ifac) +void __ogg_fdrfftb(int n, double *r, double *wsave, int *ifac) + +__ogg_fdrffti == initialization +__ogg_fdrfftf == forward transform +__ogg_fdrfftb == backward transform + +Parameters are +n == length of sequence +r == sequence to be transformed (input) +== transformed sequence (output) +wsave == work array of length 2n (allocated by caller) +ifac == work array of length 15 (allocated by caller) + +Cosine quarter-wave FFT + +void __ogg_fdcosqi(int n, double *wsave, int *ifac) +void __ogg_fdcosqf(int n, double *x, double *wsave, int *ifac) +void __ogg_fdcosqb(int n, double *x, double *wsave, int *ifac) +*/ + +/******************************************************************** +* * +* THIS FILE IS PART OF THE OggSQUISH SOFTWARE CODEC SOURCE CODE. * +* * +******************************************************************** + +file: fft.c +function: Fast discrete Fourier and cosine transforms and inverses +author: Monty +modifications by: Monty +last modification date: Jul 1 1996 + +********************************************************************/ + +/* These Fourier routines were originally based on the Fourier +routines of the same names from the NETLIB bihar and fftpack +fortran libraries developed by Paul N. Swarztrauber at the National +Center for Atmospheric Research in Boulder, CO USA. They have been +reimplemented in C and optimized in a few ways for OggSquish. */ + +/* As the original fortran libraries are public domain, the C Fourier +routines in this file are hereby released to the public domain as +well. The C routines here produce output exactly equivalent to the +original fortran routines. Of particular interest are the facts +that (like the original fortran), these routines can work on +arbitrary length vectors that need not be powers of two in +length. */ + +#include +#define STIN static + +static void drfti1(int n, double *wa, int *ifac) +{ + static const int ntryh[4] = { 4,2,3,5 }; + static double tpi = 6.28318530717958647692528676655900577; + double arg, argh, argld, fi; + int ntry=0,i,j=-1; + int k1, l1, l2, ib; + int ld, ii, ip, is, nq, nr; + int ido, ipm, nfm1; + int nl=n; + int nf=0; + +L101: + j++; + if ( j < 4 ) + ntry = ntryh[j]; + else + ntry += 2; + +L104: + nq = nl/ntry; + nr = nl-ntry*nq; + if ( nr != 0 ) + goto L101; + + nf++; + ifac[nf+1] = ntry; + nl = nq; + if ( ntry != 2 ) + goto L107; + if ( nf == 1 ) + goto L107; + + for ( i=1; i>1; + ipp2 = ip; + idp2 = ido; + nbd = (ido-1)>>1; + t0 = l1*ido; + t10 = ip*ido; + + if ( ido == 1 ) + goto L119; + for ( ik=0; ik l1 ) { + for ( j=1; j>1; + np2 = n; + + kc = np2; + for ( k=1; k>1; + ipp2 = ip; + ipph = (ip+1)>>1; + if ( ido < l1 ) + goto L103; + + t1 = 0; + t2 = 0; + for ( k=0; k l1 ) + goto L139; + + is = -ido-1; + t1 =0; + for ( j=1; j>1; + np2 = n; + + for ( i=2; i +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + D I S C R E T E F O U R I E R T R A N S F O R M T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +void __ogg_fdrffti(int n, double *wsave, int *ifac); +void __ogg_fdrfftf(int n, double *X, double *wsave, int *ifac); + +int +DiscreteFourierTransform(int n, BitSequence *epsilon) +{ + double p_value, upperBound, percentile, N_l, N_o, d, *m, *X, *wsave; + int i, count, ifac[15]; + + if ( ((X = (double*) calloc(n,sizeof(double))) == NULL) || + ((wsave = (double *)calloc(2*n,sizeof(double))) == NULL) || + ((m = (double*)calloc(n/2+1, sizeof(double))) == NULL) ) { + if( X != NULL ) + free(X); + if( wsave != NULL ) + free(wsave); + if( m != NULL ) + free(m); + return 0; + } + for ( i=0; i +#include +#include +#include "include/externs.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + F R E Q U E N C Y T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +Frequency(int n, BitSequence *epsilon) +{ + int i; + double f, s_obs, p_value, sum, sqrt2 = 1.41421356237309504880; + + sum = 0.0; + for ( i=0; i y * +** * +** Returns TRUE (1) if x greater than y, * +** otherwise FALSE (0). * +** * +** Parameters: * +** * +** x Address of array x * +** y Address of array y * +** l Length both x and y in bytes * +** * +******************************************/ +int greater(BYTE *x, BYTE *y, int l) +{ + int i; + + for ( i=0; i y[i] ) + return 1; + + return 0; +} + + +/***************************************** +** less - Test if x < y * +** * +** Returns TRUE (1) if x less than y, * +** otherwise FALSE (0). * +** * +** Parameters: * +** * +** x Address of array x * +** y Address of array y * +** l Length both x and y in bytes * +** * +******************************************/ +int less(BYTE *x, BYTE *y, int l) +{ + int i; + + for ( i=0; i>= 1; /* shift the word right once (ms bit = 0) */ + if ( c1 ) + *p |= 0x80; + c1 = c2; + c2 = 0; + p++; + } + + *p >>= 1; /* shift the word right once (ms bit = 0) */ + if ( c1 ) + *p |= 0x80; +} + + +/***************************************** +** Mult - Multiply two integers * +** * +** A = B * C * +** * +** Parameters: * +** * +** A Address of the result * +** B Address of the multiplier * +** C Address of the multiplicand * +** LB Length of B in bytes * +** LC Length of C in bytes * +** * +** NOTE: A MUST be LB+LC in length * +** * +******************************************/ +int Mult(BYTE *A, BYTE *B, int LB, BYTE *C, int LC) +{ + int i, j, k, LA; + DIGIT result; + + LA = LB + LC; + + for ( i=LB-1; i>=0; i-- ) { + result = 0; + for ( j=LC-1; j>=0; j-- ) { + k = i+j+1; + result = (DIGIT)A[k] + ((DIGIT)(B[i] * C[j])) + (result >> 8); + A[k] = (BYTE)result; + } + A[--k] = (BYTE)(result >> 8); + } + + return 0; +} + + +void ModSqr(BYTE *A, BYTE *B, int LB, BYTE *M, int LM) +{ + + Square(A, B, LB); + Mod(A, 2*LB, M, LM); +} + +void ModMult(BYTE *A, BYTE *B, int LB, BYTE *C, int LC, BYTE *M, int LM) +{ + Mult(A, B, LB, C, LC); + Mod(A, (LB+LC), M, LM); +} + + +/***************************************** +** smult - Multiply array by a scalar. * +** * +** A = b * C * +** * +** Parameters: * +** * +** A Address of the result * +** b Scalar (1 BYTE) * +** C Address of the multiplicand * +** L Length of C in bytes * +** * +** NOTE: A MUST be L+1 in length * +** * +******************************************/ +void smult(BYTE *A, BYTE b, BYTE *C, int L) +{ + int i; + DIGIT result; + + result = 0; + for ( i=L-1; i>0; i-- ) { + result = A[i] + ((DIGIT)b * C[i]) + (result >> 8); + A[i] = (BYTE)(result & 0xff); + A[i-1] = (BYTE)(result >> 8); + } +} + +/***************************************** +** Square() - Square an integer * +** * +** A = B^2 * +** * +** Parameters: * +** * +** A Address of the result * +** B Address of the operand * +** L Length of B in bytes * +** * +** NOTE: A MUST be 2*L in length * +** * +******************************************/ +void Square(BYTE *A, BYTE *B, int L) +{ + Mult(A, B, L, B, L); +} + +/***************************************** +** ModExp - Modular Exponentiation * +** * +** A = B ** C (MOD M) * +** * +** Parameters: * +** * +** A Address of result * +** B Address of mantissa * +** C Address of exponent * +** M Address of modulus * +** LB Length of B in bytes * +** LC Length of C in bytes * +** LM Length of M in bytes * +** * +** NOTE: The integer B must be less * +** than the modulus M. * +** NOTE: A must be at least 3*LM * +** bytes long. However, the * +** result stored in A will be * +** only LM bytes long. * +******************************************/ +void ModExp(BYTE *A, BYTE *B, int LB, BYTE *C, int LC, BYTE *M, int LM) +{ + BYTE wmask; + int bits; + + bits = LC*8; + wmask = 0x80; + + A[LM-1] = 1; + + while ( !sniff_bit(C,wmask) ) { + wmask >>= 1; + bits--; + if ( !wmask ) { + wmask = 0x80; + C++; + } + } + + while ( bits-- ) { + memset(A+LM, 0x00, LM*2); + + /* temp = A*A (MOD M) */ + ModSqr(A+LM, A,LM, M,LM); + + /* A = lower L bytes of temp */ + memcpy(A, A+LM*2, LM); + memset(A+LM, 0x00, 2*LM); + + if ( sniff_bit(C,wmask) ) { + memset(A+LM, 0x00, (LM+LB)); + ModMult(A+LM, B,LB, A,LM, M,LM); /* temp = B * A (MOD M) */ + memcpy(A, A+LM+(LM+LB)-LM, LM); /* A = lower LM bytes of temp */ + memset(A+LM, 0x00, 2*LM); + } + + wmask >>= 1; + if ( !wmask ) { + wmask = 0x80; + C++; + } + } +} + + +/* DivMod: + * + * computes: + * quot = x / n + * rem = x % n + * returns: + * length of "quot" + * + * len of rem is lenx+1 + */ +int DivMod(BYTE *x, int lenx, BYTE *n, int lenn, BYTE *quot, BYTE *rem) +{ + BYTE *tx, *tn, *ttx, *ts, bmult[1]; + int i, shift, lgth_x, lgth_n, t_len, lenq; + DIGIT tMSn, mult; + unsigned long tMSx; + int underflow; + + tx = x; + tn = n; + + /* point to the MSD of n */ + for ( i=0, lgth_n=lenn; i n, WATCH OUT if lgth_x == lgth_n */ + while ( (lgth_x > lgth_n) || ((lgth_x == lgth_n) && !less(tx, tn, lgth_n)) ) { + shift = 1; + if ( lgth_n == 1 ) { + if ( *tx < *tn ) { + tMSx = (DIGIT) (((*tx) << 8) | *(tx+1)); + tMSn = *tn; + shift = 0; + } + else { + tMSx = *tx; + tMSn = *tn; + } + } + else if ( lgth_n > 1 ) { + tMSx = (DIGIT) (((*tx) << 8) | *(tx+1)); + tMSn = (DIGIT) (((*tn) << 8) | *(tn+1)); + if ( (tMSx < tMSn) || ((tMSx == tMSn) && less(tx, tn, lgth_n)) ) { + tMSx = (tMSx << 8) | *(tx+2); + shift = 0; + } + } + else { + tMSx = (DIGIT) (((*tx) << 8) | *(tx+1)); + tMSn = *tn; + shift = 0; + } + + mult = (DIGIT) (tMSx / tMSn); + if ( mult > 0xff ) + mult = 0xff; + bmult[0] = mult & 0xff; + + ts = rem; + do { + memset(ts, 0x00, lgth_x+1); + Mult(ts, tn, lgth_n, bmult, 1); + + underflow = 0; + if ( shift ) { + if ( ts[0] != 0 ) + underflow = 1; + else { + for ( i=0; i= 0) ) { + accum += A[tL]; + A[tL--] = (BYTE)(accum & 0xff); + accum = accum >> 8; + } + + return accum; +} + + +/* + * add() + * + * A = A + B + * + * LB must be <= LA + * + */ +BYTE add(BYTE *A, int LA, BYTE *B, int LB) +{ + int i, indexA, indexB; + DIGIT accum; + + indexA = LA - 1; /* LSD of result */ + indexB = LB - 1; /* LSD of B */ + + accum = 0; + for ( i = 0; i < LB; i++ ) { + accum += A[indexA]; + accum += B[indexB--]; + A[indexA--] = (BYTE)(accum & 0xff); + accum = accum >> 8; + } + + if ( LA > LB ) + while ( accum && (indexA >= 0) ) { + accum += A[indexA]; + A[indexA--] = (BYTE)(accum & 0xff); + accum = accum >> 8; + } + + return (BYTE)accum; +} + + +void prettyprintBstr(char *S, BYTE *A, int L) +{ + int i, extra, ctrb, ctrl; + + if ( L == 0 ) + printf("%s ", S); + else + printf("%s\n\t", S); + extra = L % 24; + if ( extra ) { + ctrb = 0; + for ( i=0; i<24-extra; i++ ) { + printf(" "); + if ( ++ctrb == 4) { + printf(" "); + ctrb = 0; + } + } + + for ( i=0; i> 16 ); + buffer[ count ] = ( ( value & 0xFF00FF00L ) >> 8 ) | ( ( value & 0x00FF00FFL ) << 8 ); + } +} + +void +ahtopb (char *ascii_hex, BYTE *p_binary, int bin_len) +{ + BYTE nibble; + int i; + + for ( i=0; i 'F' ) + nibble -= 0x20; + if ( nibble > '9' ) + nibble -= 7; + nibble -= '0'; + p_binary[i] = nibble << 4; + + nibble = ascii_hex[i * 2 + 1]; + if ( nibble > 'F' ) + nibble -= 0x20; + if ( nibble > '9' ) + nibble -= 7; + nibble -= '0'; + p_binary[i] += nibble; + } +} \ No newline at end of file diff --git a/src/include/cephes.h b/src/include/cephes.h new file mode 100644 index 0000000..64c2b1f --- /dev/null +++ b/src/include/cephes.h @@ -0,0 +1,13 @@ +#ifndef _NIST_CEPHES_H_ +#define _NIST_CEPHES_H_ + +double cephes_igamc(double a, double x); +double cephes_igam(double a, double x); +double cephes_lgam(double x); +double cephes_p1evl(double x, double *coef, int N); +double cephes_polevl(double x, double *coef, int N); +double cephes_erf(double x); +double cephes_erfc(double x); +double cephes_normal(double x); + +#endif /* _CEPHES_H_ */ diff --git a/src/include/config.h b/src/include/config.h new file mode 100644 index 0000000..f31f50f --- /dev/null +++ b/src/include/config.h @@ -0,0 +1,52 @@ + +#if defined(__cplusplus) +extern "C" { +#endif + +#ifndef _NIST_CONFIG_H_ +#define _NIST_CONFIG_H_ + +#define WINDOWS32 +//#define PROTOTYPES +//#define LITTLE_ENDIAN +//#define LOWHI + +/* + * AUTO DEFINES (DON'T TOUCH!) + */ + +#ifndef CSTRTD +typedef char *CSTRTD; +#endif +#ifndef BSTRTD +typedef unsigned char *BSTRTD; +#endif + +#ifndef BYTE +typedef unsigned char BYTE; +#endif +#ifndef UINT +typedef unsigned int UINT; +#endif +#ifndef USHORT +typedef unsigned short USHORT; +#endif +//#ifndef ULONG +//typedef unsigned long ULONG; +//#endif +#ifndef DIGIT +typedef USHORT DIGIT; /* 16-bit word */ +#endif +#ifndef DBLWORD +typedef unsigned long DBLWORD; /* 32-bit word */ +#endif + +#ifndef WORD64 +typedef unsigned long WORD64[2]; /* 64-bit word */ +#endif + +#endif /* _CONFIG_H_ */ + +#if defined(__cplusplus) +} +#endif \ No newline at end of file diff --git a/src/include/decls.h b/src/include/decls.h new file mode 100644 index 0000000..510ae47 --- /dev/null +++ b/src/include/decls.h @@ -0,0 +1,24 @@ +#ifndef _NIST_DECLS_H_ +#define _NIST_DECLS_H_ + +#include +#include "defs.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + G L O B A L D A T A S T R U C T U R E S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +BitSequence *epsilon; // BIT STREAM +TP tp; // TEST PARAMETER STRUCTURE +FILE *stats[NUMOFTESTS+1]; // FILE OUTPUT STREAM +FILE *results[NUMOFTESTS+1]; // FILE OUTPUT STREAM +FILE *freqfp; // FILE OUTPUT STREAM +FILE *summary; // FILE OUTPUT STREAM +int testVector[NUMOFTESTS+1]; + +char generatorDir[NUMOFGENERATORS][20] = { "AlgorithmTesting", "LCG", "QCG1", "QCG2","CCG", "XOR", + "MODEXP", "BBS", "MS", "G-SHA1" }; + + + +#endif \ No newline at end of file diff --git a/src/include/defs.h b/src/include/defs.h new file mode 100644 index 0000000..e0e93f7 --- /dev/null +++ b/src/include/defs.h @@ -0,0 +1,73 @@ +#ifndef _NIST_DEFS_H_ +#define _NIST_DEFS_H_ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + D E B U G G I N G A I D E S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "config.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + M A C R O S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define MAX(x,y) ((x) < (y) ? (y) : (x)) +#define MIN(x,y) ((x) > (y) ? (y) : (x)) +#define isNonPositive(x) ((x) <= 0.e0 ? 1 : 0) +#define isPositive(x) ((x) > 0.e0 ? 1 : 0) +#define isNegative(x) ((x) < 0.e0 ? 1 : 0) +#define isGreaterThanOne(x) ((x) > 1.e0 ? 1 : 0) +#define isZero(x) ((x) == 0.e0 ? 1 : 0) +#define isOne(x) ((x) == 1.e0 ? 1 : 0) + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + G L O B A L C O N S T A N T S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define ALPHA 0.01 /* SIGNIFICANCE LEVEL */ +#define MAXNUMOFTEMPLATES 148 /* APERIODIC TEMPLATES: 148=>temp_length=9 */ + +#define NUMOFGENERATORS 10 /* MAX PRNGs */ +#define MAXFILESPERMITTEDFORPARTITION 148 + +#define TEST_FREQUENCY 1 +#define TEST_BLOCK_FREQUENCY 2 +#define TEST_CUSUM 3 +#define TEST_RUNS 4 +#define TEST_LONGEST_RUN 5 +#define TEST_RANK 6 +#define TEST_FFT 7 +#define TEST_NONPERIODIC 8 +#define TEST_OVERLAPPING 9 +#define TEST_UNIVERSAL 10 +#define TEST_APEN 11 +#define TEST_RND_EXCURSION 12 +#define TEST_RND_EXCURSION_VAR 13 +#define TEST_SERIAL 14 +#define TEST_LINEARCOMPLEXITY 15 +#define TEST_POKER_DETECT 16 +#define TEST_RUNS_DISTRIBUTION 17 +#define TEST_BIN_DERIVATE 18 +#define TEST_SELF_CORR 19 + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + G L O B A L D A T A S T R U C T U R E S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +typedef unsigned char BitSequence; + +typedef struct _testParameters { + int n; + int blockFrequencyBlockLength; + int nonOverlappingTemplateBlockLength; + int overlappingTemplateBlockLength; + int serialBlockLength; + int linearComplexitySequenceLength; + int approximateEntropyBlockLength; + int PokerDetectMLength; + int BinaryDerivateKLength; + int SelfCorrelationDLength; + int numOfBitStreams; +} TP; + +#endif \ No newline at end of file diff --git a/src/include/externs.h b/src/include/externs.h new file mode 100644 index 0000000..9f6ea9b --- /dev/null +++ b/src/include/externs.h @@ -0,0 +1,21 @@ +#ifndef _NIST_EXTERNS_H_ +#define _NIST_EXTERNS_H_ + +#include "defs.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + G L O B A L D A T A S T R U C T U R E S + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +//extern BitSequence *epsilon; // BIT STREAM +//extern TP tp; // TEST PARAMETER STRUCTURE +//extern FILE *stats[NUMOFTESTS+1]; // FILE OUTPUT STREAM +//extern FILE *results[NUMOFTESTS+1]; // FILE OUTPUT STREAM +//extern FILE *freqfp; // FILE OUTPUT STREAM +//extern FILE *summary; // FILE OUTPUT STREAM +//extern int testVector[NUMOFTESTS+1]; +// +//extern char generatorDir[NUMOFGENERATORS][20]; +//extern char testNames[NUMOFTESTS+1][32]; + +#endif \ No newline at end of file diff --git a/src/include/generators.h b/src/include/generators.h new file mode 100644 index 0000000..183d05e --- /dev/null +++ b/src/include/generators.h @@ -0,0 +1,78 @@ +#ifndef _NIST_GENERATORS_H_ +#define _NIST_GENERATORS_H_ + + +/* The circular shifts. */ +#define CS1(x) ((((ULONG)x)<<1)|(((ULONG)x)>>31)) +#define CS5(x) ((((ULONG)x)<<5)|(((ULONG)x)>>27)) +#define CS30(x) ((((ULONG)x)<<30)|(((ULONG)x)>>2)) + +/* K constants */ + +#define K0 0x5a827999L +#define K1 0x6ed9eba1L +#define K2 0x8f1bbcdcL +#define K3 0xca62c1d6L + +#define f1(x,y,z) ( (x & (y ^ z)) ^ z ) + +#define f3(x,y,z) ( (x & ( y ^ z )) ^ (z & y) ) + +#define f2(x,y,z) ( x ^ y ^ z ) /* Rounds 20-39 */ + +#define expand(x) Wbuff[x%16] = CS1(Wbuff[(x - 3)%16 ] ^ Wbuff[(x - 8)%16 ] ^ Wbuff[(x - 14)%16] ^ Wbuff[x%16]) + +#define sub1Round1(count) { \ + temp = CS5(A) + f1(B, C, D) + E + Wbuff[count] + K0; \ + E = D; \ + D = C; \ + C = CS30( B ); \ + B = A; \ + A = temp; \ + } \ + +#define sub2Round1(count) \ + { \ + expand(count); \ + temp = CS5(A) + f1(B, C, D) + E + Wbuff[count%16] + K0; \ + E = D; \ + D = C; \ + C = CS30( B ); \ + B = A; \ + A = temp; \ + } \ + +#define Round2(count) \ + { \ + expand(count); \ + temp = CS5( A ) + f2( B, C, D ) + E + Wbuff[count%16] + K1; \ + E = D; \ + D = C; \ + C = CS30( B ); \ + B = A; \ + A = temp; \ + } \ + +#define Round3(count) \ + { \ + expand(count); \ + temp = CS5( A ) + f3( B, C, D ) + E + Wbuff[count%16] + K2; \ + E = D; \ + D = C; \ + C = CS30( B ); \ + B = A; \ + A = temp; \ + } + +#define Round4(count) \ + { \ + expand(count); \ + temp = CS5( A ) + f2( B, C, D ) + E + Wbuff[count%16] + K3; \ + E = D; \ + D = C; \ + C = CS30( B ); \ + B = A; \ + A = temp; \ + } + +#endif \ No newline at end of file diff --git a/src/include/genutils.h b/src/include/genutils.h new file mode 100644 index 0000000..3d61ed4 --- /dev/null +++ b/src/include/genutils.h @@ -0,0 +1,47 @@ +#ifndef _NIST_GENUTILS_H_ +#define _NIST_GENUTILS_H_ + +#include +#include +#include +#include "config.h" + +typedef struct _MP_struct { + int size; /* in bytes */ + int bitlen; /* in bits, duh */ + BYTE *val; + } MP; + +#define FREE(A) if ( (A) ) { free((A)); (A) = NULL; } +#define ASCII2BIN(ch) ( (((ch) >= '0') && ((ch) <= '9')) ? ((ch) - '0') : (((ch) >= 'A') && ((ch) <= 'F')) ? ((ch) - 'A' + 10) : ((ch) - 'a' + 10) ) + +#ifndef EXPWD +#define EXPWD ((DBLWORD)1< +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +int +LinearComplexity(int M, int n, BitSequence *epsilon) +{ + int i, ii, j, d, N, L, m, N_, parity, sign, K = 6; + double p_value, T_, mean, nu[7], chi2; + const double pi[7] = { 0.01047, 0.03125, 0.12500, 0.50000, 0.25000, 0.06250, 0.020833 }; + BitSequence *T, *P, *B_, *C; + + N = (int)floor(n/M); + if ( ((B_ = (BitSequence *) calloc(M, sizeof(BitSequence))) == NULL) || + ((C = (BitSequence *) calloc(M, sizeof(BitSequence))) == NULL) || + ((P = (BitSequence *) calloc(M, sizeof(BitSequence))) == NULL) || + ((T = (BitSequence *) calloc(M, sizeof(BitSequence))) == NULL) ) { + printf("Insufficient Memory for Work Space:: Linear Complexity Test\n"); + if ( B_!= NULL ) + free(B_); + if ( C != NULL ) + free(C); + if ( P != NULL ) + free(P); + if ( T != NULL ) + free(T); + return 0; + } + + +// fprintf(stats[TEST_LINEARCOMPLEXITY], "-----------------------------------------------------\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "\tL I N E A R C O M P L E X I T Y\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "-----------------------------------------------------\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "\tM (substring length) = %d\n", M); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "\tN (number of substrings) = %d\n", N); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "-----------------------------------------------------\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], " F R E Q U E N C Y \n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "-----------------------------------------------------\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], " C0 C1 C2 C3 C4 C5 C6 CHI2 P-value\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "-----------------------------------------------------\n"); +// fprintf(stats[TEST_LINEARCOMPLEXITY], "\tNote: %d bits were discarded!\n", n%M); + + for ( i=0; i +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + L O N G E S T R U N S T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +LongestRunOfOnes(int n, BitSequence *epsilon) +{ + double pval, chi2, pi[7]; + int run, v_n_obs, N, i, j, K, M, V[7]; + unsigned int nu[7] = { 0, 0, 0, 0, 0, 0, 0 }; + + if ( n < 128 ) { +// fprintf(stats[TEST_LONGEST_RUN], "\t\t\t LONGEST RUNS OF ONES TEST\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t---------------------------------------------\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t n=%d is too short\n", n); + return 0; + } + if ( n < 6272 ) { + K = 3; + M = 8; + V[0] = 1; V[1] = 2; V[2] = 3; V[3] = 4; + pi[0] = 0.21484375; + pi[1] = 0.3671875; + pi[2] = 0.23046875; + pi[3] = 0.1875; + } + else if ( n < 750000 ) { + K = 5; + M = 128; + V[0] = 4; V[1] = 5; V[2] = 6; V[3] = 7; V[4] = 8; V[5] = 9; + pi[0] = 0.1174035788; + pi[1] = 0.242955959; + pi[2] = 0.249363483; + pi[3] = 0.17517706; + pi[4] = 0.102701071; + pi[5] = 0.112398847; + } + else { + K = 6; + M = 10000; + V[0] = 10; V[1] = 11; V[2] = 12; V[3] = 13; V[4] = 14; V[5] = 15; V[6] = 16; + pi[0] = 0.0882; + pi[1] = 0.2092; + pi[2] = 0.2483; + pi[3] = 0.1933; + pi[4] = 0.1208; + pi[5] = 0.0675; + pi[6] = 0.0727; + } + + N = n/M; + for ( i=0; i v_n_obs ) + v_n_obs = run; + } + else + run = 0; + } + if ( v_n_obs < V[0] ) + nu[0]++; + for ( j=0; j<=K; j++ ) { + if ( v_n_obs == V[j] ) + nu[j]++; + } + if ( v_n_obs > V[K] ) + nu[K]++; + } + + chi2 = 0.0; + for ( i=0; i<=K; i++ ) + chi2 += ((nu[i] - N * pi[i]) * (nu[i] - N * pi[i])) / (N * pi[i]); + + pval = cephes_igamc((double)(K/2.0), chi2 / 2.0); + +// fprintf(stats[TEST_LONGEST_RUN], "\t\t\t LONGEST RUNS OF ONES TEST\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t---------------------------------------------\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\tCOMPUTATIONAL INFORMATION:\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t---------------------------------------------\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t(a) N (# of substrings) = %d\n", N); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t(b) M (Substring Length) = %d\n", M); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t(c) Chi^2 = %f\n", chi2); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t---------------------------------------------\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t F R E Q U E N C Y\n"); +// fprintf(stats[TEST_LONGEST_RUN], "\t\t---------------------------------------------\n"); + +// if ( K == 3 ) { +// fprintf(stats[TEST_LONGEST_RUN], "\t\t <=1 2 3 >=4 P-value Assignment"); +// fprintf(stats[TEST_LONGEST_RUN], "\n\t\t %3d %3d %3d %3d ", nu[0], nu[1], nu[2], nu[3]); +// } +// else if ( K == 5 ) { +// fprintf(stats[TEST_LONGEST_RUN], "\t\t<=4 5 6 7 8 >=9 P-value Assignment"); +// fprintf(stats[TEST_LONGEST_RUN], "\n\t\t %3d %3d %3d %3d %3d %3d ", nu[0], nu[1], nu[2], +// nu[3], nu[4], nu[5]); +// } +// else { +// fprintf(stats[TEST_LONGEST_RUN],"\t\t<=10 11 12 13 14 15 >=16 P-value Assignment"); +// fprintf(stats[TEST_LONGEST_RUN],"\n\t\t %3d %3d %3d %3d %3d %3d %3d ", nu[0], nu[1], nu[2], +// nu[3], nu[4], nu[5], nu[6]); +// } + if ( isNegative(pval) || isGreaterThanOne(pval) ) { +// fprintf(stats[TEST_LONGEST_RUN], "WARNING: P_VALUE IS OUT OF RANGE.\n"); + return 0; + } + +// fprintf(stats[TEST_LONGEST_RUN], "%s\t\tp_value = %f\n\n", pval < ALPHA ? "FAILURE" : "SUCCESS", pval); fflush(stats[TEST_LONGEST_RUN]); +// fprintf(results[TEST_LONGEST_RUN], "%f\n", pval); fflush(results[TEST_LONGEST_RUN]); + if (pval < ALPHA) { + return 0; + } else { + return 1; + } +} diff --git a/src/matrix.c b/src/matrix.c new file mode 100644 index 0000000..c456187 --- /dev/null +++ b/src/matrix.c @@ -0,0 +1,170 @@ +#include +#include +#include "include/externs.h" +#include "include/matrix.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +R A N K A L G O R I T H M R O U T I N E S +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define MATRIX_FORWARD_ELIMINATION 0 +#define MATRIX_BACKWARD_ELIMINATION 1 + +int +computeRank(int M, int Q, BitSequence **matrix) +{ + int i, rank, m=MIN(M,Q); + + /* FORWARD APPLICATION OF ELEMENTARY ROW OPERATIONS */ + for ( i=0; i0; i-- ) { + if ( matrix[i][i] == 1 ) + perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix); + else { /* matrix[i][i] = 0 */ + if ( find_unit_element_and_swap(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix) == 1 ) + perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix); + } + } + + rank = determine_rank(m, M, Q, matrix); + + return rank; +} + +void +perform_elementary_row_operations(int flag, int i, int M, int Q, BitSequence **A) +{ + int j, k; + + if ( flag == MATRIX_FORWARD_ELIMINATION ) { + for ( j=i+1; j=0; j-- ) + if ( A[j][i] == 1 ) + for ( k=0; k= 0) && (A[index][i] == 0) ) + index--; + if ( index >= 0 ) + row_op = swap_rows(i, index, Q, A); + } + + return row_op; +} + +int +swap_rows(int i, int index, int Q, BitSequence **A) +{ + int p; + BitSequence temp; + + for ( p=0; p +#include "include/utilities.h" +#include "include/stat_fncs.h" +#include "mesa_sts.h" + +int mesa_statistical_test_suite(void* data,unsigned int datalen, struct sts_result* result) +{ + TP tp; + tp.n = datalen; + tp.blockFrequencyBlockLength = 128; + tp.nonOverlappingTemplateBlockLength = 9; + tp.overlappingTemplateBlockLength = 9; + tp.approximateEntropyBlockLength = 10; + tp.serialBlockLength = 16; + tp.linearComplexitySequenceLength = 500; + tp.numOfBitStreams = 1; + tp.PokerDetectMLength = 8; + tp.BinaryDerivateKLength = 3; + tp.SelfCorrelationDLength = 8; + + BitSequence* epsilon = (BitSequence *)calloc(tp.n,sizeof(BitSequence)); + int done, num_0s, num_1s, bitsRead; + num_0s = 0; + num_1s = 0; + bitsRead = 0; + done = 0; + done = convertToBits((BYTE*)data,datalen,tp.n,&num_0s,&num_1s,&bitsRead,epsilon); + result->frequency = Frequency(tp.n,epsilon); + result->block_frequency = BlockFrequency(tp.blockFrequencyBlockLength, tp.n,epsilon); + result->cumulative_sums = CumulativeSums(tp.n,epsilon); + result->runs = Runs(tp.n,epsilon); + result->longest_run = LongestRunOfOnes(tp.n,epsilon); + result->rank = Rank(tp.n,epsilon); + //result->discrete_fourier_transform = DiscreteFourierTransform(tp.n,epsilon);//cost too much time + result->non_overlapping_template_matching = NonOverlappingTemplateMatchings(tp.nonOverlappingTemplateBlockLength, tp.n,epsilon); + result->overlapping_template_matching = OverlappingTemplateMatchings(tp.overlappingTemplateBlockLength, tp.n,epsilon); + result->universal = Universal(tp.n,epsilon); + //result->approximate_entropy = ApproximateEntropy(tp.approximateEntropyBlockLength, tp.n,epsilon);//cost too much time + result->random_excursions = RandomExcursions(tp.n,epsilon); + result->random_excursions_variant = RandomExcursionsVariant(tp.n,epsilon); + //result->serial = Serial(tp.serialBlockLength,tp.n,epsilon);//cost too much time + //sresult->linear_complexity = LinearComplexity(tp.linearComplexitySequenceLength, tp.n,epsilon);//cost too much time + result->poker_detect = PokerDetect(tp.PokerDetectMLength,tp.n,epsilon); + result->runs_distribution = RunsDistribution(tp.n,epsilon); + result->self_correlation = SelfCorrelation(tp.SelfCorrelationDLength,tp.n,epsilon); + result->binary_derivative = BinaryDerivate(tp.BinaryDerivateKLength,tp.n,epsilon,tp.n);//this function will change the value of epsilon, must be the last one + + free(epsilon); + epsilon = NULL; + + return 0; +} \ No newline at end of file diff --git a/src/nonOverlappingTemplateMatchings.c b/src/nonOverlappingTemplateMatchings.c new file mode 100644 index 0000000..7f5d24b --- /dev/null +++ b/src/nonOverlappingTemplateMatchings.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + N O N O V E R L A P P I N G T E M P L A T E T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +NonOverlappingTemplateMatchings(int m, int n, BitSequence *epsilon) +{ + int ret = 0; + int numOfTemplates[100] = {0, 0, 2, 4, 6, 12, 20, 40, 74, 148, 284, 568, 1116, + 2232, 4424, 8848, 17622, 35244, 70340, 140680, 281076, 562152}; + /*---------------------------------------------------------------------------- + NOTE: Should additional templates lengths beyond 21 be desired, they must + first be constructed, saved into files and then the corresponding + number of nonperiodic templates for that file be stored in the m-th + position in the numOfTemplates variable. + ----------------------------------------------------------------------------*/ + unsigned int bit, W_obs, nu[6], *Wj = NULL; + FILE *fp = NULL; + double sum, chi2, p_value, lambda, pi[6], varWj; + int i, j, jj, k, match, SKIP, M, N, K = 5; + char directory[100]; + BitSequence *sequence = NULL; + + N = 8; + M = n/N; + + if ( (Wj = (unsigned int*)calloc(N, sizeof(unsigned int))) == NULL ) { + return 0; + } + lambda = (M-m+1)/pow(2, m); + varWj = M*(1.0/pow(2.0, m) - (2.0*m-1.0)/pow(2.0, 2.0*m)); + sprintf(directory, "templates/template%d", m); + + if ( ((isNegative(lambda)) || (isZero(lambda))) || + ((fp = fopen(directory, "r")) == NULL) || + ((sequence = (BitSequence *) calloc(m, sizeof(BitSequence))) == NULL) ) { + goto end; + } + else { + if ( numOfTemplates[m] < MAXNUMOFTEMPLATES ) + SKIP = 1; + else + SKIP = (int)(numOfTemplates[m]/MAXNUMOFTEMPLATES); + numOfTemplates[m] = (int)numOfTemplates[m]/SKIP; + + sum = 0.0; + for ( i=0; i<2; i++ ) { /* Compute Probabilities */ + pi[i] = exp(-lambda+i*log(lambda)-cephes_lgam(i+1)); + sum += pi[i]; + } + pi[0] = sum; + for ( i=2; i<=K; i++ ) { /* Compute Probabilities */ + pi[i-1] = exp(-lambda+i*log(lambda)-cephes_lgam(i+1)); + sum += pi[i-1]; + } + pi[K] = 1 - sum; + + for( jj=0; jj 1 ) + fseek(fp, (long)(SKIP-1)*2*m, SEEK_CUR); +// fprintf(results[TEST_NONPERIODIC], "%f\n", p_value); fflush(results[TEST_NONPERIODIC]); + if (p_value < ALPHA) { + goto end; + } + } + } + + ret = 1; +// fprintf(stats[TEST_NONPERIODIC], "\n"); fflush(stats[TEST_NONPERIODIC]); + + end: + if (Wj != NULL) { + free(Wj); + } + if (fp != NULL) { + fclose(fp); + } + if (sequence != NULL) { + free(sequence); + } + return ret; +} diff --git a/src/overlappingTemplateMatchings.c b/src/overlappingTemplateMatchings.c new file mode 100644 index 0000000..70eabdf --- /dev/null +++ b/src/overlappingTemplateMatchings.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + O V E R L A P P I N G T E M P L A T E T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +double Pr(int u, double eta); + +int +OverlappingTemplateMatchings(int m, int n, BitSequence *epsilon) +{ + int ret = 0; + int i, k, match; + double W_obs, eta, sum, chi2, p_value, lambda; + int M, N, j, K = 5; + unsigned int nu[6] = { 0, 0, 0, 0, 0, 0 }; + double pi[6] = { 0.143783, 0.139430, 0.137319, 0.124314, 0.106209, 0.348945 }; + BitSequence *sequence; + + M = 1032; + N = n/M; + + if ( (sequence = (BitSequence *) calloc(m, sizeof(BitSequence))) == NULL ) { + return 0; + } + else { + for (i = 0; i < m; i++) + sequence[i] = 1; + } + + lambda = (double)(M-m+1)/pow(2,m); + eta = lambda/2.0; + sum = 0.0; + for ( i=0; i +#include +#include "include/stat_fncs.h" +#include "include/cephes.h" + +typedef struct _PokerNi { + unsigned int flag; + unsigned int count; +} PokerNi; + +unsigned char toByte(BitSequence *subEpsilon, int M) +{ + int i = 0; + unsigned char result = 0; + for (i = 0; i < M; ++i) { + result |= (subEpsilon[i] << (M - i - 1)); + } + return result; +} + +int findIndex(PokerNi *tab, int tabSize, unsigned int flag) +{ + int i = 0; + for (i = 0; i < tabSize; ++i) { + if (tab[i].flag == flag) { + return i; + } + } + return -1; +} + +int PokerDetect(int M, int n, BitSequence *epsilon) +{ + int ret = 0; + int i = 0, j = 0, N = n / M, index = 0, c = 0; + int maxElements = (int) pow(2, M); + double p_value = 0.0, sum_ni = 0.0, mp = 0.0, V = 0.0; + unsigned int flag = 0; + PokerNi *tab = NULL; + + if (M > 8) { + return 0; + } + + tab = (PokerNi *)calloc(maxElements, sizeof(PokerNi)); + if (NULL == tab) { + return 0; + } + for (i = 0; i < maxElements; ++i) { + tab[i].flag = (unsigned int) i; + tab[i].count = 0; + } + + for (i = 0, j = 0; j < N; ++j, i += M) { + flag = toByte(epsilon + i, M); + index = findIndex(tab, maxElements, flag); + if (-1 == index) { + goto end; + } + tab[index].count += 1; + } + + for (i = 0; i < maxElements; ++i) { + sum_ni += pow(tab[i].count, 2); + } + mp = (double)maxElements / N; + V = mp * sum_ni - N; + + p_value = cephes_igamc((double)(maxElements - 1) / 2, V / 2); + if (p_value < ALPHA) { + goto end; + } + + ret = 1; + + end: + free(tab); + return ret; +} \ No newline at end of file diff --git a/src/randomExcursions.c b/src/randomExcursions.c new file mode 100644 index 0000000..135396d --- /dev/null +++ b/src/randomExcursions.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + R A N D O M E X C U R S I O N S T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +RandomExcursions(int n, BitSequence *epsilon) +{ + int ret = 0; + int b, i, j, k, J, x; + int cycleStart, cycleStop, *cycle = NULL, *S_k = NULL; + const int stateX[8] = { -4, -3, -2, -1, 1, 2, 3, 4 }; + int counter[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + double p_value, sum, constraint, nu[6][8]; + double pi[5][6] = { {0.0000000000, 0.00000000000, 0.00000000000, 0.00000000000, 0.00000000000, 0.0000000000}, + {0.5000000000, 0.25000000000, 0.12500000000, 0.06250000000, 0.03125000000, 0.0312500000}, + {0.7500000000, 0.06250000000, 0.04687500000, 0.03515625000, 0.02636718750, 0.0791015625}, + {0.8333333333, 0.02777777778, 0.02314814815, 0.01929012346, 0.01607510288, 0.0803755143}, + {0.8750000000, 0.01562500000, 0.01367187500, 0.01196289063, 0.01046752930, 0.0732727051} }; + + if ( ((S_k = (int *)calloc(n, sizeof(int))) == NULL) || + ((cycle = (int *)calloc(MAX(1000, n/100), sizeof(int))) == NULL) ) { + printf("Random Excursions Test: Insufficent Work Space Allocated.\n"); + if ( S_k != NULL ) + free(S_k); + if ( cycle != NULL ) + free(cycle); + return 0; + } + + J = 0; /* DETERMINE CYCLES */ + S_k[0] = 2*(int)epsilon[0] - 1; + for( i=1; i MAX(1000, n/100) ) { + printf("ERROR IN FUNCTION randomExcursions: EXCEEDING THE MAX NUMBER OF CYCLES EXPECTED\n."); + goto end; + } + cycle[J] = i; + } + } + if ( S_k[n-1] != 0 ) + J++; + cycle[J] = n; + + constraint = MAX(0.005*pow(n, 0.5), 500); + if (J < constraint) { + ret = 1; //TODO + goto end; + } + else { + cycleStart = 0; + cycleStop = cycle[1]; + for ( k=0; k<6; k++ ) + for ( i=0; i<8; i++ ) + nu[k][i] = 0.; + for ( j=1; j<=J; j++ ) { /* FOR EACH CYCLE */ + for ( i=0; i<8; i++ ) + counter[i] = 0; + for ( i=cycleStart; i= 1 && S_k[i] <= 4) || (S_k[i] >= -4 && S_k[i] <= -1) ) { + if ( S_k[i] < 0 ) + b = 4; + else + b = 3; + counter[S_k[i]+b]++; + } + } + cycleStart = cycle[j]+1; + if ( j < J ) + cycleStop = cycle[j+1]; + + for ( i=0; i<8; i++ ) { + if ( (counter[i] >= 0) && (counter[i] <= 4) ) + nu[counter[i]][i]++; + else if ( counter[i] >= 5 ) + nu[5][i]++; + } + } + + for ( i=0; i<8; i++ ) { + x = stateX[i]; + sum = 0.; + for ( k=0; k<6; k++ ) + sum += pow(nu[k][i] - J*pi[(int)fabs(x)][k], 2) / (J*pi[(int)fabs(x)][k]); + p_value = cephes_igamc(2.5, sum/2.0); + + if ( isNegative(p_value) || isGreaterThanOne(p_value) ) { +// fprintf(stats[TEST_RND_EXCURSION], "WARNING: P_VALUE IS OUT OF RANGE.\n"); + goto end; + } + +// fprintf(stats[TEST_RND_EXCURSION], "%s\t\tx = %2d chi^2 = %9.6f p_value = %f\n", +// p_value < ALPHA ? "FAILURE" : "SUCCESS", x, sum, p_value); +// fprintf(results[TEST_RND_EXCURSION], "%f\n", p_value); fflush(results[TEST_RND_EXCURSION]); + if (p_value < ALPHA) { + goto end; + } + } + } +// fprintf(stats[TEST_RND_EXCURSION], "\n"); fflush(stats[TEST_RND_EXCURSION]); + ret = 1; + + end: + free(S_k); + free(cycle); + return ret; +} diff --git a/src/randomExcursionsVariant.c b/src/randomExcursionsVariant.c new file mode 100644 index 0000000..447ddf6 --- /dev/null +++ b/src/randomExcursionsVariant.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + R A N D O M E X C U R S I O N S V A R I A N T T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +RandomExcursionsVariant(int n, BitSequence *epsilon) +{ + int ret = 0; + int i, p, J, x, constraint, count, *S_k = NULL; + const int stateX[18] = { -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + double p_value; + + if ( (S_k = (int *)calloc(n, sizeof(int))) == NULL ) { + return 0; + } + J = 0; + S_k[0] = 2*(int)epsilon[0] - 1; + for ( i=1; i +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" +#include "include/matrix.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + R A N K T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +Rank(int n, BitSequence *epsilon) +{ + int ret = 0; + int N, i, k, r; + double p_value, product, chi_squared, arg1, p_32, p_31, p_30, R, F_32, F_31, F_30; + BitSequence **matrix = create_matrix(32, 32); + + N = n/(32*32); + if ( isZero(N) ) { + p_value = 0.00; + } + else { + r = 32; /* COMPUTE PROBABILITIES */ + product = 1; + for ( i=0; i<=r-1; i++ ) + product *= ((1.e0-pow(2, i-32))*(1.e0-pow(2, i-32)))/(1.e0-pow(2, i-r)); + p_32 = pow(2, r*(32+32-r)-32*32) * product; + + r = 31; + product = 1; + for ( i=0; i<=r-1; i++ ) + product *= ((1.e0-pow(2, i-32))*(1.e0-pow(2, i-32)))/(1.e0-pow(2, i-r)); + p_31 = pow(2, r*(32+32-r)-32*32) * product; + + p_30 = 1 - (p_32+p_31); + + F_32 = 0; + F_31 = 0; + for ( k=0; k +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + R U N S T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +Runs(int n, BitSequence *epsilon) +{ + int S, k; + double pi, V, erfc_arg, p_value; + + S = 0; + for ( k=0; k (2.0 / sqrt(n)) ) { + p_value = 0.0; + } + else { + + V = 1; + for ( k=1; k +#include +#include "include/stat_fncs.h" +#include "include/cephes.h" + +int RunsDistribution(int n, BitSequence *epsilon) +{ + int ret = 0; + int i = 0, j = 0, k = 0; + unsigned char runFlag = 0x00; + double p_value = 0.0, sum_bi = 0.0, sum_gi = 0.0, V = 0.0; + double *bi = NULL, *gi = NULL, *e = NULL; + double bit = 0.0, git = 0.0, et = 0.0; + + bi = (double *)calloc(n, sizeof(double)); + if (NULL == bi) { + goto end; + } + gi = (double *)calloc(n, sizeof(double)); + if (NULL == gi) { + goto end; + } + e = (double *)calloc(n, sizeof(double)); + if (NULL == e) { + goto end; + } + + for (i = 1; i <= n; ++i) { + e[i - 1] = (double)(n - i + 3) / pow(2, i + 2); + if (e[i - 1] >= 5) { + k = i; + } + } + + runFlag = epsilon[0]; + j = 1; + for (i = 1; i < n; ++i) { + if (epsilon[i] != runFlag) { + if (runFlag == 0x00) { + gi[j - 1] += 1; + } else if (runFlag == 0x01) { + bi[j - 1] += 1; + } + runFlag = epsilon[i]; + j = 1; + } else { + ++j; + } + } + + for (i = 0; i < k; ++i) { + bit = bi[i]; + et = e[i]; + sum_bi += pow(bit - et, 2) / et; + } + for (i = 0; i < k; ++i) { + git = gi[i]; + et = e[i]; + sum_gi += pow(git - et, 2) / et; + } + V = sum_bi + sum_gi; + + p_value = cephes_igamc(k - 1, V / 2); + if (p_value < ALPHA) { + goto end; + } + + ret = 1; + + end: + if (NULL != bi) { + free(bi); + } + if (NULL != gi) { + free(gi); + } + if (NULL != e) { + free(e); + } + return ret; +} + diff --git a/src/selfCorrelation.c b/src/selfCorrelation.c new file mode 100644 index 0000000..d47a67b --- /dev/null +++ b/src/selfCorrelation.c @@ -0,0 +1,25 @@ +#include +#include "include/stat_fncs.h" + +int SelfCorrelation(int d, int n, BitSequence *epsilon) +{ + int i = 0; + int n_d = n - d; + int Ad = 0; + double V = 0.0, p_value = 0.0, sqrt2 = 1.41421356237309504880; + + for (i = 0; i < n_d - 1; ++i) { + Ad += (epsilon[i] ^ epsilon[i + d]); + } + + V = 2 * ((double)Ad - ((double)n_d / 2)) / sqrt(n_d); + + p_value = erfc(fabs(V) / sqrt2); + + if (p_value < ALPHA) { + return 0; + } else { + return 1; + } +} + diff --git a/src/serial.c b/src/serial.c new file mode 100644 index 0000000..3d37272 --- /dev/null +++ b/src/serial.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +double psi2(int m, int n, BitSequence *epsilon); + +int +Serial(int m, int n, BitSequence *epsilon) +{ + double p_value1, p_value2, psim0, psim1, psim2, del1, del2; + + psim0 = psi2(m, n, epsilon); + psim1 = psi2(m - 1, n, epsilon); + psim2 = psi2(m - 2, n, epsilon); + del1 = psim0 - psim1; + del2 = psim0 - 2.0*psim1 + psim2; + p_value1 = cephes_igamc(pow(2, m-1)/2, del1/2.0); + p_value2 = cephes_igamc(pow(2, m-2)/2, del2/2.0); + + if (p_value1 < ALPHA || p_value2 < ALPHA) { + return 0; + } else { + return 1; + } +} + +double +psi2(int m, int n, BitSequence *epsilon) +{ + int i, j, k, powLen; + double sum, numOfBlocks; + unsigned int *P; + + if ( (m == 0) || (m == -1) ) + return 0.0; + numOfBlocks = n; + powLen = (int)pow(2, m+1)-1; + if ( (P = (unsigned int*)calloc(powLen,sizeof(unsigned int)))== NULL ) { +// fprintf(stats[TEST_SERIAL], "Serial Test: Insufficient memory available.\n"); +// fflush(stats[TEST_SERIAL]); + return 0.0; + } + for ( i=1; i +#include +#include +#include +#include "include/externs.h" +#include "include/cephes.h" + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + U N I V E R S A L T E S T + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +int +Universal(int n, BitSequence *epsilon) +{ + int ret = 0; + int i, j, p, L, Q, K; + double arg, sqrt2, sigma, phi, sum, p_value, c; + long *T, decRep; + const double expected_value[17] = { 0, 0, 0, 0, 0, 0, 5.2177052, 6.1962507, 7.1836656, + 8.1764248, 9.1723243, 10.170032, 11.168765, + 12.168070, 13.167693, 14.167488, 15.167379 }; + const double variance[17] = { 0, 0, 0, 0, 0, 0, 2.954, 3.125, 3.238, 3.311, 3.356, 3.384, + 3.401, 3.410, 3.416, 3.419, 3.421 }; + + /* * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * THE FOLLOWING REDEFINES L, SHOULD THE CONDITION: n >= 1010*2^L*L * + * NOT BE MET, FOR THE BLOCK LENGTH L. * + * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + L = 5; + if ( n >= 387840 ) L = 6; + if ( n >= 904960 ) L = 7; + if ( n >= 2068480 ) L = 8; + if ( n >= 4654080 ) L = 9; + if ( n >= 10342400 ) L = 10; + if ( n >= 22753280 ) L = 11; + if ( n >= 49643520 ) L = 12; + if ( n >= 107560960 ) L = 13; + if ( n >= 231669760 ) L = 14; + if ( n >= 496435200 ) L = 15; + if ( n >= 1059061760 ) L = 16; + + Q = 10*(int)pow(2, L); + K = (int) (floor(n/L) - (double)Q); /* BLOCKS TO TEST */ + + p = (int)pow(2, L); + if ( (L < 6) || (L > 16) || ((double)Q < 10*pow(2, L)) || + ((T = (long *)calloc(p, sizeof(long))) == NULL) ) { + return 0; + } + + /* COMPUTE THE EXPECTED: Formula 16, in Marsaglia's Paper */ + c = 0.7 - 0.8/(double)L + (4 + 32/(double)L)*pow(K, -3/(double)L)/15; + sigma = c * sqrt(variance[L]/(double)K); + sqrt2 = sqrt(2); + sum = 0.0; + for ( i=0; i +#include +#include +#include +#include "include/utilities.h" + +int +convertToBits(BYTE *x, int xBitLength, int bitsNeeded, int *num_0s, int *num_1s, int *bitsRead, BitSequence* epsilon) +{ + int i, j, count, bit; + BYTE mask; + int zeros, ones; + + count = 0; + zeros = ones = 0; + for ( i=0; i<(xBitLength+7)/8; i++ ) { + mask = 0x80; + for ( j=0; j<8; j++ ) { + if ( *(x+i) & mask ) { + bit = 1; + (*num_1s)++; + ones++; + } + else { + bit = 0; + (*num_0s)++; + zeros++; + } + mask >>= 1; + epsilon[*bitsRead] = bit; + (*bitsRead)++; + if ( *bitsRead == bitsNeeded ) + return 1; + if ( ++count == xBitLength ) + return 0; + } + } + + return 0; +} + diff --git a/src/version.map b/src/version.map new file mode 100644 index 0000000..d4433ce --- /dev/null +++ b/src/version.map @@ -0,0 +1,6 @@ +{ + global: + mesa_statistical_test_suite; + GIT_VERSION*; + local: *; +}; \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..7a89809 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required (VERSION 2.8) + +include_directories(${CMAKE_SOURCE_DIR}/inc) +include_directories(/opt/MESA/include/MESA/) +include_directories(/opt/MESA/include) +include_directories(/usr/include/) +include_directories(${PROJECT_SOURCE_DIR}/src/) + +link_directories(/opt/MESA/lib) +link_directories("${CMAKE_BINARY_DIR}") + +add_executable(gtest_mesa gtest_mesa_sts.cpp) +target_link_libraries(gtest_mesa gtest gtest_main pcap pthread mesa_sts) + +file(COPY pcap DESTINATION ./) \ No newline at end of file diff --git a/test/gtest_mesa_sts.cpp b/test/gtest_mesa_sts.cpp new file mode 100644 index 0000000..d16b8d1 --- /dev/null +++ b/test/gtest_mesa_sts.cpp @@ -0,0 +1,257 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +extern "C" { +#include "mesa_sts.h" +} + +#define MAX_PKT_CNT 1 + +static int read_pcap_and_judge_randomness(const char* pcap_file, struct sts_result* result) +{ + pcap_t *handle; + struct pcap_pkthdr *header; // pcap报文头部结构 + const u_char *packet; // 报文数据指针 + char errbuf[PCAP_ERRBUF_SIZE]; + char content[2048] = {0}; + int content_len = 0; + int payload_len; + char *payload; + int pkt_cnt = 0; + + handle = pcap_open_offline(pcap_file, errbuf); + while (pcap_next_ex(handle, &header, &packet) > 0) { + unsigned short eth_type = ntohs(*(unsigned short *)(packet + 12)); + if (eth_type == ETH_P_IP) { + int l4_proto = *(unsigned char *)(packet + sizeof(struct ethhdr) + 9); + if (l4_proto == IPPROTO_TCP) { + payload_len = header->caplen - sizeof(struct ethhdr) - sizeof(struct iphdr) - sizeof(struct tcphdr); + payload = (char *)packet + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr); + } else if (l4_proto == IPPROTO_UDP) { + payload_len = header->caplen - sizeof(struct ethhdr) - sizeof(struct iphdr) - sizeof(struct udphdr); + payload = (char *)packet + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr); + } else { + continue; + } + + } else if (eth_type == ETH_P_IPV6) { + int l4_proto = *(unsigned char *)(packet + sizeof(struct ethhdr) + 6); + if (l4_proto == IPPROTO_TCP) { + payload_len = header->caplen - sizeof(struct ethhdr) - sizeof(struct ip6_hdr) - sizeof(struct tcphdr); + payload = (char *)packet + sizeof(struct ethhdr) + sizeof(struct ip6_hdr) + sizeof(struct tcphdr); + } else if (l4_proto == IPPROTO_UDP) { + payload_len = header->caplen - sizeof(struct ethhdr) - sizeof(struct ip6_hdr) - sizeof(struct udphdr); + payload = (char *)packet + sizeof(struct ethhdr) + sizeof(struct ip6_hdr) + sizeof(struct udphdr); + } else { + continue; + } + } + + if (payload_len < 100) { + continue; + } + + memcpy(content + content_len, payload, payload_len); + content_len += payload_len; + pkt_cnt++; + if (pkt_cnt == MAX_PKT_CNT) { + break; + } + } + + mesa_statistical_test_suite(content, content_len, result); + + pcap_close(handle); + + return 0; +} + +TEST(random_looking, telegram_mtproto_ipv4_key1) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv4_key_1.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 1); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 1); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(random_looking, telegram_mtproto_ipv4_key2) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv4_key_2_dd.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 1); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 1); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(random_looking, telegram_mtproto_ipv4_key3) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv4_key_3_ee.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 0); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 0); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 0); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(random_looking, telegram_mtproto_ipv6_key1) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv6_key_1.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 1); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 1); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(random_looking, telegram_mtproto_ipv6_key2) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv6_key_2_dd.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 1); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 1); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(random_looking, telegram_mtproto_ipv6_key3) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/telegram_mtproto_ipv6_key_3_ee.pcap", &result); + + EXPECT_EQ(result.frequency, 1); + EXPECT_EQ(result.block_frequency, 0); + EXPECT_EQ(result.cumulative_sums, 1); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 1); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 0); + EXPECT_EQ(result.runs_distribution, 1); + EXPECT_EQ(result.self_correlation, 1); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(non_random_looking, wechat_voice_call) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/202202161604_win_wifi_30M_pure_wechat_wechat3.5.0.46_voice-call_120s_2_multinat.pcap", &result); + + EXPECT_EQ(result.frequency, 0); + EXPECT_EQ(result.block_frequency, 1); + EXPECT_EQ(result.cumulative_sums, 0); + EXPECT_EQ(result.runs, 0); + EXPECT_EQ(result.longest_run, 0); + EXPECT_EQ(result.rank, 0); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 1); + EXPECT_EQ(result.runs_distribution, 0); + EXPECT_EQ(result.self_correlation, 0); + EXPECT_EQ(result.binary_derivative, 1); +} + +TEST(non_random_looking, http) +{ + struct sts_result result; + read_pcap_and_judge_randomness("pcap/xingongsuo_kouling_http_C2S.pcap", &result); + + EXPECT_EQ(result.frequency, 0); + EXPECT_EQ(result.block_frequency, 0); + EXPECT_EQ(result.cumulative_sums, 0); + EXPECT_EQ(result.runs, 1); + EXPECT_EQ(result.longest_run, 0); + EXPECT_EQ(result.rank, 1); + EXPECT_EQ(result.non_overlapping_template_matching, 0); + EXPECT_EQ(result.overlapping_template_matching, 1); + EXPECT_EQ(result.universal, 0); + EXPECT_EQ(result.random_excursions, 1); + EXPECT_EQ(result.random_excursions_variant, 1); + EXPECT_EQ(result.poker_detect, 0); + EXPECT_EQ(result.runs_distribution, 0); + EXPECT_EQ(result.self_correlation, 0); + EXPECT_EQ(result.binary_derivative, 1); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + //testing::GTEST_FLAG(filter) = "random_looking.telegram_mtproto_ipv6_key1"; + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/test/pcap/202202161604_win_wifi_30M_pure_wechat_wechat3.5.0.46_voice-call_120s_2_multinat.pcap b/test/pcap/202202161604_win_wifi_30M_pure_wechat_wechat3.5.0.46_voice-call_120s_2_multinat.pcap new file mode 100644 index 0000000000000000000000000000000000000000..63787b7f6197f787491abdf27180785d5d8cce79 GIT binary patch literal 4634693 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ʒs}5q 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%0D4*e^6jI+Q{zLYtOa||?kAe117wy!ei%nwRr>Pl+ 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
KWAK^j4EsRZQyWc4WrZKJ_lEzR8oo{p6P!; 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�I8!fCFj@a40c;&B)vxS0O_h$7GcC;LF~qBT^~qZTbXD z@>~}Jd4~8V)qFYOWY-%`_IbPb=T&^AUk(~)by-sd>s-Q4?@~#BbAK+Nyo@s?n=Jbk zhQj=OWu%lr)F@)4+(h8AgaVNgH!QbQ=pt?f>MU7 zJ}^lsn^&vd_guq=mS08GIx!n+es?osE8vNDOVNcMOR%e-d=+jrdFA$U+TD5Ko8bx642w`EZi7krGr= zBj?@m)b5+Y%Z0XLEy0iI+8!NS2T3v@bA0Am+t$Ux<**$2m}& zjz;f;i__zP#tZn%FM!Wq8aoymP=nZk*U27$Lf*k?GR8Z8@e-N@sEn*kki=+D-@3;p zlcBhJo$B*5B{6NsDc32%wj65draT%B`V5-87X2YpyDHU}t`=KkpTF3e=m#2Gg7ZbE zfCaYeBIsWhC<`rUxr5NrG)B{fLJHw5Z^mo%@F=@}Tyy`Tm>|qH)%olpYUCin<50*e zHhxM+CEE5{=q{S|TU-4JFZqJEr_I(fJY5sx^!^?}`gCk{iAA}VWIOjyc~64CzV8k9 zD@k-9i4~EQ3cSTdaHLGZRBGDj9P70`zI?eS(*9aEh!|Z>lBgj~uBS`+a%0qp};*0vx`=h5Orvs!JCl$e5i#q%X1SJf~<`jIv z%s6aY8R8C3?_6i22AMPm#ZJ_YeGQSSd2{L@;CU6Jt4RzX32`iK{G}QSDTX7x9TK5> zdYyLOypHkdT2mS28*ew6j8EskzPVyA)>x>fL7%SWWX{=sJM|m>L`!^qbQ#ZqO!U&+ zExPQWtgw~5^QA$=8L7N>U4k|ELmhB6i4i0rj-8Ds7om_6I8yfA>UKHk?-om>kIe+- z3@7@}%8Fdl3~yP{B|;rlWM^waUa&UeO7=NRx`cn(79@>EYgm~;3CStyXkP8%21OoT8C9!!PO)tkc7Bd*jO123MqvnWB zSJe!#@Q^HlKW_tk{_3yl*jj=u$0S0_A~Wd0o9ix7|_nt+7@_S~nyGp+yiTy5KD|9Gxcix^xc zW#GBeYu*mLQk#2uI;aZ)5jJA6wpRaWDCGiyrJ%>azyH(uk|9;Vr0tI>P>ZZUZfgCg!ektaEl<1mYD<0E zdr4OFSdHAPIqGPfeP4ZH1gVK4Mzt(B?$5IWfIk!buV=g3T7%E7K?t?Uy&Aam#z2uD z2^g$gAI$5NiFTFWC*i0Qc2=P3nd)oCMKV;oro=1Qq*W7=fst>(c~9cL>w04R4};@p zYL|9)8co^A-E^23eDO8K4JJ`&OK4J+e@rk>_`gigZEZkPIfBW89az>;1OEM=cz`LF z@swYDWP^yU757he@ZxBuzUOec3oX-XKT<9ZuC-aHB^9`@T8v7P^t9*e-EB*h9)ZwH zM&l^!TpruUbsc=`>@BjtOLiXKdU%!rF7Oxvug4WGThLX8=yC#%dZ@#>xl2WfkJ z%`@;l8jliM-ix;%Nwc?q8|erJ2}XaOQ6@*uj>mUW8!=7rA&`&LVtH|LkcwM6ntjRZ zu*6V*s@1KvmL!O}pQe8s@*iCGpsNJY)i?~7?-Fn+s4+`B4pk9NNh&9;rXG4GBX2Nz ziQawiamPLukDzC61C1jriQ~axR<~^f8V+;YhkZU)w%3Ms*K53pYxP&?QLFA$jzt<)+qQbfE40=IXOqK`>hEaRN$!Lh;jc*I-DC4rf674e6kh_}=5nNu zgSh||ykc48YL^q}DnfM40>8xCaPJqGYm?YVOW2}UaRPa541Y047@N;L>V|zNpY+J$ zyh@y9#gS&K)9-qPAB)osQ}`ZP3--Oy^>%>|Cc5u@I`%72CT0Azv=%tZ(zRjLNdc=z z;Wv0-M-28m@mFWeiG}$e?WjRk4-``N#|8A6bIozE;z=T>d)_@V@0&Qc+6>#kfA_@q z>lU%bi^h*Hi_mlnqM^$Vu%tPX>k3cnPr_r;hZ6 z~@`lfkwDx3+(9#IVmoZT``C1tK*J$|UYk7A({k~3@HeqS<15G4hST!91lt0U>e^t{n78a0#csy7AoD&MEgrgMH zHga=}Y{&fCRw8ejCvz{^K#_faIQ*?dpD@}j9vV~NAso+~``|Huz;G_7oFd!g!_4JN zG{`Q`+qb$eSQlXoh9bQGU6%hB!GCKFlO@wdoFMLYyl$IlBdgRKuAH@%_o~xs20u(lVWH&eauaw0@``B2wAq zPkbqnVxsp@M>Xr_2H(J$VCC7x8}7&-41uQgPILl&f)b1#364#Ka|^7S-CeEabnnnJr4@0fio3N7mj>Hk9YBgqZJV#vN>w8DIoo1MDx z#w6qDp)T8H=suO%_wxD?BOB<;w{lo#O&anQl9cYip`sPfwQ9C&ud-cXrmU+??4Sv8 z7TDxdDil%+XL{dh!G65VK-lh+X*K%%tovJ^7PjAQP4v0KdLw9@Ck?+b zuT}4gB_IDA<@s_C)HecVT@|KzjCGEem&ars(yUc{J_#_>$E!^opb2rx*96NK3aNuL z6@Qy`;(`u;`qj!SDbri|P^hVwyOQWc|Lye`ME4EK`(3^sN#NQWv#(2Zqg(763M`nR z)(Y)Ui0&#YZSdJKaznmdbl)7+p)fJ7`OFm?wwM2P>iA_thK=Wjn`-ic-LsI5fDy}Mx67ksX zhD8seCl`+19F3tQ)cUU(z-1c~I(#I3;O`p)pTE9$$}C)gWo&6WPmHWLh)3`7Dw21b`YJr92P!t>E(iLu3dA}EY^bVAatfY^9ZLZcSiKfW^fB$-YC~M z{NFvWHyS2N2BHpIv;8Z0VYZR~2%ekzeYl*%fJl|q>#Kc=0K;3MPB}_^XW{SR?8bMo zitt~0opYBfZV%pRzs+SNQvQ}M%eS}TIsPeo!L_o%MulP?U-37A&M#M}nC|vh;pY5) z^x5auinBR+%A&Mvap;F3iOXSD&X)5V;Qqi5SJ!eB2t~XU*@G20fDL;M|8&G3i_Hgx z;*D~3IWV=i8@+aQXVF!Xa$)(fbgmYC!ofu>o8Fp>XUYLFjp*grkLgRAyyG=mReug*?C(;O-SXQ{q^G9^WY#k3Wm!d7o# z%VvMYG{!a>q`D&1vUj;BT!uy?xV{MjD%bc=M`IeT{U5ht1rX4H&jOS=4^_Q6o1bzYgKhzFu z*FplYf=rY~mq?={9A}woCKn0+12+cbLJ_%iz#&XSxX7yQ#d}lJeOZ^XRmeI3w_BMz<=efJQ!DuWLr&^@j zN!pm6!@kZO%5BzA#h90>9eb-l+we|!(n9$llOFWdo15U|VB6KvjRmR;q4#mUd}q3!W0&>4 zU@skM`<_Z+PQtfPQnn*Jm0vGBzvW%ZJXZB>{+@R!fO{nTts!@q-*)`MRFGllQdVsG zF?fm1|G|9?a-9*mMZm>7u%FI9@2v)Mtn5IyfnpiIYQAr=Wb**;I|Kdls14J=5nMEP zZN+v=ldfV}r_{q>`Avfz45HEC4s*k`Su5+Ni&pB0P2I7=c4+-Z^Y2hf`K)q`@PZai z52pS(DIbc84*%-6mO~$+em>Pxp@F>&?N>)P4&*u^a)p6yxF&F1&D)>7&7zH3+{=`S zR!Y&(@jQDsCmPjn)BGCuo-M(Zk33_RZ-|!jEON*jn_w2{{cM&m>yk=z z-~nUrp#CS3?$B>2gy&UkA6`a};7#VVzY6H>vr9R%O6K)!yhSiO`X9LQAlDI*TgC>L zbP@QfY02%;@DEt$ybPC8D=C?}7!Q;VdE9%lSjp<}{wO-9Vc;f8(+@!Wu~bYZw3eWl*+F1G$K!J)tsSTc+9nqWk~0i-rH+cF}d7Hbqjs%rUUQ zyh&w0yb<;=8Q{EvH}D_*fX`ozussVm*a#zbeswvnLm`cS9tI4RN(bz(pRFl)yuY*j zSy$8H{aLsKWtm1Je#agiooSLm$$iCKC!@^Z4n36@lC@PH_~Fx3ErDk%<-V>pdUeFe zhuWPe*`_dzD6nq{HZFlpUjK!0WZ?lZh`l*|`Fbd%2@X?6$|$pM-Rd!DDUTk1z7f-L z6YH+KHxY3$&le7~1Ps*^BxH{E410T&SdYwwrC^mkGJ`qx2gZVT@Z+LptIUsZ`j)~? zFYm%Q{s6}V_|vfX{Kc_m;RQML2ptqnrfDdo8IDs9RazQstK)7R&!Du5F?3kn2{_N} z?;27U=VN=>8~1)3DH_9N?74J5?c*=HH8C1LRO`Y8iI#hw;CvpQLd#B?fI%MSTnXU= zA&C2MGH|9#!?ox14d6fzhQ0CL630zU{LLx_m+W8hHC2RKM2Lyk5d z51uxOn8y68jLBjr4|pD?KZ|h_5_y!V^Qpt&PR#UFPi=E_xurd+ zjl1!pwwlETjI@3==`Kh@Jl|p*Nd|?q!I7%N0*V|R*k5;xM&;z$xDT|Eib5(dgqoPQ zDYoi=8pvgTb9Tns*;J=!szSz@Y5kIF$QBrXFYv^wU^=^ydqUi^*tJrmQ=2oAT?IzE zk$Yvu34$cVLo3D~fWzhOaHJYMhRylg8y zFO~hudp@iXk>+&gRQS#%>vYasU^eOIm57>Qq~(7<3BI->ZA9Qzp$j7^Tur(Mk`Pa# z7`Fpo_6|5w?Yfb$a&6NO_rucWgPnmAYbhUX7ed#y4Lk@Zv+U?wN`DiBS9>o@Q>z(# z(%^?upWNeU}jB5$jZgRc!nmjO1}O={`t8JYHg~lnsS+!jbBH z{kGrtHd&)lFVmbtwG5_f9TGcyZ}LnNv)!85zg^G}KO&MG8d{^yQqX^Q8ReRs6~m!7 zk4DP32jiv03H4Y!Vv%{j#qlb-2*qKfvIodlb-l~M#y}UL?Q*-F4wt+ZXuGuUDC9x& z+ugUs1k=$5(X}iJ#ohI$KVI+i=(w>@`ZC|2HTEr=mA$q@z!xepqX8NP=LetPS2mjZ z^2i(GY8AHgatuD7CHnq`msoU4LzDegx{9e#FMXJW4m0)Sh#vP7Dj2jJfWqd_V6!5B zwOVg&D?ljX9bl1T@8B}k0#Ka*l}5)|3+(a@^3hdn%pun}^{3K0J&rj)%G|!=UH7N8 ztO`7ha9=Du(WPmG*qs>NE9>>}44El!nw{O*t-L-e^!>S<5bd)=PuZM@diO~_?lT%! zx6{|#e6#%O`whn#y@%+0w1Xzp?3DH_b-mqb<`rfh7P*=U%rEs28N9RuHe2zRKgYHb z^ot?{Iy#&lE?X_&*QE)_EUUFT+vzan5Eqq6y6aX{@%-sjF6t_#A!B)1yC-n_A=_cp z!?=$MMz`&>xApj}cyn*1mM_*2@#yrh^0i=pPGsrR82M2rcM?|7buz@;XIWySU4D?? zTEK)i>cFP4XS(Wo;Yi_47S3lf^ubfA<*AI+!;dfbU?q?SN&s6gE&W#s(rv525=bMI zAjC@+E@v%J0=+Q)k_Yv#%1+-e*4X?IV0m^%AE3jJ#ygeE6COzTov==G6{9<{Chgw5 zp7Y&@Ldj|abKmA`Y z-ELA(bM%hyQp~R(O*Uv;*BfX8v!^)sNxA$OvJ(VQmgmAISmr)WZ5qr}PX1Oct&}udWxy4Qux(v`N&zO`9rKhE zGcn_>#Bmxc8Oz$aWEt)s*U0`z6qZ0zecJZn)ciP?&4Z+OgfDr7xMYERojkearb8RY zY50SD1-2(0c(HfHFN&2a&I<-#P;ys$1&@iFMQKs?AC!K$9$;xE7bruU@A<+waBJG- zX2emgWEswRn2K+AqO<*fC`Bz;3dF0o;xvIZbTSA^Jc~ zsq%XH;)&lkjj8OF`DL{Hu4Pf&#sdObRBCOvCd#aq=eDoU(uO+U^Ny1(MCZTodb(?= zDdJgPBY)$&>D}Rk{zZROsu1RAtiWql{ufl=i=E4k%y2o|JoNT$o(6n+hE4QlBnrcn zVDb&Yy{B^jp%issDG=}GiaXqgOQi^W8H{QUZ`-N1eyTf!Fi#B89x}Kz8}#o>1W}n; zHdbA$VaWM3qmVVNa+U-!EY**QY}40F9o`0#H`C*iOU9>&g-6bBim8!JG`(5NF3CJo z^ZF>ZEU)cHYASL%?Xl({{w!?!=hVny;Wbh^U3seoWAZy~EG(__0f{XR4HIGJ|DhE1 zU?~I;zS41@qT$jk0;Mn(EcV*ZIFRnUDJ5f79^@Z}!${P&PK=eWJ%x{+q)4#J;Z7)* z9alO+l7O})9VI1~`(^pFd9=czbVSOz6m8!?Sft?Bx;ry0*ay|4zt%F!mAE&*iG0q9 zxo0pVyLA!uP9WI}xzM3c?&VW`j~i{sVUDqRj?Wisw7(@pdsvz(xRXZZ__I;oU#%`)R%SvK(YnV_*rew6 z%T~*@um1YNa2j362d~CO&yqDiyiSQWsppxg#jQ%dC;MAAlDhBTFY_jqQd??};pZx$ znY1F?t_RGN(rp-{s#l_vw;&^Xb#LIwrxU_TF*}TW)xwDo*g2p;=xA!si9#V=e@X$2 zlE?lIu9Wm(+**?Ckuod*{df?QjHV}Q77OFDjS3Fv_X|17q=v|zz&LaZS5}rd$iYSA zJP?LL2H-fYoU=$7qAlfBT7lnbLKL6qwG7OvQW{Z<{wi`L+&k2-(l5GZB|3kI{2|8H z=mrtSbe6J;M-(1rLPv--%lUnU^4^!Xbq=aw9NDWm5+DZ$kwZQSg$%-R+L~Rz=p?U* zW>fhyogHaEjOBe##J)qy)_!)g)e2{~fCNQ%W~-~wKTI`MgKeOJX7gBt)J1I+Z)+^kPuiP5 zmFu13t=3eJi;hsb;$=-C3c(Y?57#P!fZH$%z4s+%@Q}nx6@OE?_sas`^#RN!&$i{%|KmaL`Dg-3T&(Cem&}Rqym#-ki+A#x{Ham(-(sg}lJ3 zHJS2()~7KJwdd|wy&Ag^xAGr(oT1?=YBl+PrN zi141P3m9@&9ugivF)Q*z%S7oHmF~Pj!Q;CV=0$<~S?_dnCVYNCO(5h3>9h`?`iiwW zuvhoqarufn)m?Fni_3>v9+P*f{6~MYP{ay$j$E(Hc<;{Dq<6~Bqz5^RKF%8rQu`y0 z0krY|62G*a2E`8%#P$ck&JQQx-~Z{nTKw1&HZ&g6d1x-_5&MP9wS@bu`2wxhjqASZ zAV;mfAx{3~ki_%tLpBRh+m|zi1#Zj%FPLBYIH%n~^%fMb52O{ha2faJ#)-#`@}eu& zdz&=ng^u!=x6Jhq@QPvbClE-D0E~=8rDGe5v z?QfTudEoHXsWSDuqx8~K%>9lV6fRvQkzdV`bXpA2o-I8I^A_`)Im)L#5W{-awo{W^ zx`ob3B}%P|Cg?u8qg)NOmW^TO-C<0j+@tpRKsm3>Y9}wfP0eB(^Nwfq^MCMv2K`is z{yr19oNn%|+?%HO zWUo{wHGGHfwJc_|>3#p0i=YCw?MJ(}NJw0HX>CMz$!V_}XKNg-c3D0o3gLd+p#7Zn zp>MWYyd-+Y&{Fw-@XvyN#Ov82m4NvmSGf1bDznpqN#W#Py`_7AeY%mlh0k09iw?AZ zwa-dO>BXDX+B?7RSlmVbjP#D)o6*JR1LUl0?LqRjZKhU@{;KOufHO)lYw39dDxKA`RI7sCN=ePcPh-r5^^_FJ1j^&5xekk9~ZSCUZus2)7vR}5DMNurELoE>^<+Nk_ z?LVG-bo+bI2Ba^~QOexts!E(wpGY21TLw-RDSXXb=0xl`|qV^ zpYD-DfAl}K{zgIHyR<=0|GuneA<(5{dR8(#E~M2XWr7Z-DHBg%KF8Y9mtxrf4 zsklVDcOdg4K_W9#=;%OoxBTGaA86d3`4t`$1qO2IqQq%cQG+F3;RNrWcr0zf zA~^&|u2@}>{)a@f1lW=?0w?LLFfPOm#=UPvb)3i;aJby~)MWSAxk55@QLJ+X-2i3o z5!b}($Ml#RMoXV)YbG1F^zdJ=SVdWvb!^&4*qE?hz#!VhkgG;AGXH>RoE1VLqi~Qe z9`;wRA>Jk!jYo;~ol`EaqaAS->s;XY{Ay;=;; zgB}A4AK)+g|4ZS(A`2?e5xRbQIFeAvIGmybE{&_%!FYOZRe@*vD#PwZ!$ zn_8AZbvcsMg#yYK%~y}kLK$1Ubj8bS`fDqANQ|;z8l9^(@}TA#qNc(L3Ymn{e6;Wy z9#B6TNS4MsGyM3mr6?G=@w+#U$oSmNh^1&PMV}hlyfT^c#NM_VDGA&58$vE!oxhHe z$R6(PtQ(W-U2`+{X21t)D)?%R0;oYn)OhGaAyaUgK8IBu=2g}X#w4-_wOBk~k=1gS z!Zo$E?)g&@WNLK}>GtK1hyP6SdALsTl!MTTlU>=mBu?owgFsC!1}+}K`tnN6JRUtP zHpN$K6hRFHQ4<4fVVH)~^jkLkvc7S{U9lnJ?(Pv~;YuS;Q)5$^WG|UyIEf~Ii|?oY z-hszzac$^z7Nl>>*t#|ZzhaS^3lD@*-VVeM)(x2)A*X)`)68A1Q35q6h?*r}$L%LL z%|K_NuMy3{ENA{?ADZ4q4nxemxZvFr@$G^LmHCtrE+w8XuJH^%K5w0Ue9uLXr9bbI zlv`z9q>@(5LW_kj(ViuJ=2$`v)AYQDT#>xO_6%$^NDw+5&SlzgS!01thwVt6sY1^P z!7n+Lu}0ndjV|2l_rI&V^wPD~ZrCJl_$@`WQ|9V*a}MH|#}BDMsU397jK#m^eQFJUm6Ov#Q&C$9d2WL-t;cJO`18w?R3N_QEBJ z1(0?DQzB3GKV=&W4$9oldm@)IPD=VCE%PIOd3LzlV8l9a40GQk~E&6fW0K9<_p z6F0u7x>VVaeh#2-?=O9?No|ofMOKLDv#d-oeNjHe+0Ln2L9`)iT-D43a4bS}(R#-@3%SV5OHQ5dc zX8d%4U<}j*woAcwM*Qj3fJtkMHy?ig&2t`5-F6TmqHN!*5ywn3->?z$yT*W@>?gV8 z4RM!q3)Qc*sW>8&Kc%X~D~>PqL;Z+X(KIfra)8HZsUQM`Yh>g3GK2gci(N%lih!%L!ZC zf}!bMe}boP@hgiq$PLsTOIsDXkcnb9hESYD%#2j6=n)QYqr#!ZANPZCQTKQ0BTL3c zryuOnK!|vCY%rwo#}$&}UT`j~K6v%6_gB!d;}Q#Q?!w)QpqzN!{Njqi8s^wH{~_8a zARF-ptw0V`xO95}+c{gM?IW%Iwqr8AYvW>W)gx3}*K1~S2bR^DS~G3K?-sgrxE6)!@BbT<+rB_#qPA*ghBNOy`NAso6zxF$;;Y4F)+Kf`;R zGxX2*_kwqf^SS0+YwtDZT5Hd#idvKFqPZ|YC?7qiyy`1x%?`QWRLBllVR*nGe>7Oj z=Gn0Tja2+~bZK;>w#fP!47>B{Ndf_}5o>Y1Vgz*DG1z&Mho%`-AN)o3M?AdZYSClGmTi-Hku-t+RsUjz!@)wuJqI8JY4u1KM9N z9z}hk+(wE_DVF1Iw+ddkCtgH7kKWxI8vUEeq4SI17Us=e#V&s1ZKb~9YJvN$noo_; z7H>b}o*8qq$_!)Wt6Ju`K~m6{-ckbQr#+7#R|V6`;KGX-K57mE)dt4?U<3I@54HGx zt(*CLvZZ97YHCq2Mm~k6y1iS?sX5oFm9}HF+ls8SwkSuhi}Y+A$uszs*4z9d%}QDG zh`wBO@5aM3P1vaW%R#`;6Jf_Be+AQ~tSTS};&!uANe&cc9FF6A`7K$ssas}b*@;eS z4x^UKtm7C)$MTVulO;)F&Y_12qLdYUAc5TXI%as*RO^+V-VDe8JiB1B$$rnXxfb(m@$mMbz@S@GEV?uvIaeBU z>LZ^nNz_xifetX=#E^$vl}@O`NC+zC<^ZZ^8%>_(Hn%oAJ1g zlll1NgDvBkThr?1(WIim>AJ>LsAJtI=pkj-oo@(azR+Yqg3VE-t7#sCG-rr36u@52 z3>?kC-k_RxV|X3%N!sq`H3Ac2&9qXK$71RaxAnvf&T6H5v^s8#T!9<0k%)-$OriG(S5}Z>tvMykp z##PcKooHDlGC{|PtSpZrYl=_KK8p>@5ad3dk0N$(eAV}LYbDzGQLx`7Yf4`3AauXk z9f!s#^A(Kd&DAtoAk7IPO#mYlWe$#JNQ8o7u4~;C4`=OWcFJ%35I>%Mrnj3i&Uej` zgQ7&Z2jm)slhRqbp}WUPJppEcY#~Faa)Kc?RVXpU`O;e%bEMCqzTnebb2W`NNOO!x zqYHdjFb_vFe4bAC#LKC}RgO6#@X^Rw^{4N2ZM#bcjL(99wx;(P1<}30td8(DcMBNG zIorav-&1y%;1BnuCX17qmZIcT7WUNc#3Ohlw4t8{Gwc_-CP(ydY=W z5^3yR{pSYNRz)bKrbFp6Yh%cF=G%Sb@iqHXxH+0Np&wJ;0WMWo33y3$&>49|?a$M?!g#d+_Z9)Hux;YMg5h*qN|1L3!M&l} zz?JA%!2kbQdEFYsgE;x;okc4_VChcK2DO9?wDV)abm)kQMGFA>K%UQWJcabvJY@hAmI~*W*d*f;*~`v zOj4T)e~n=W?22NQB%YeQV`sD2IzSg%MX3$;e4JU%D&kDIXuMy?{;Km@cFYBg-{ES0 zW|03og5x9e)!;hV0sLUwR;D+)XbZjlhV-+Skk{`gnsrO==H26WFJzy>8hLTSaQU&A zS5egAlk$?`63E za^vv>`PbcNCqds`_kQqtWRmUf(a)Pub^ko5jI}Q`*qRKaC`7$JGxU<8`uzM}&&Y`7 z`ZWeGJ?!!LHN3~9m=vcmK}Yw@vE5@W<4eDXuj}Fsu~^Y~d`xAp4cW;)ljDqnZO>(+?AO z{!QF~>;?&(*kV&nLaXmtE{+hrB(dRu&hbs%aMj!sS;n7<(gCZy#R@mMOp$B(Hn>l3 zjo+;#P(@kpQV`l2ux)3gbX#CDKgbV1&rCF1xN+{YqKo)_7{BAy z{$~UEzajFA12v4p;Qa67_loZjW$=E)TkFMrHxBF!K4O;_LvM?0L&GDTw0=EmtN*m} z4bRLLN28H8I=Gro%E5?)*y~}x##i=NKgFxw3}b8)DUO7`=8Gy=JGzs)gywn!OOh+Y zvmB-Uk;miP{?~j7b7IdV)s3=cs~tClSX@yRGD4KFa|smKl@O!N&NuL_J^h;Lks8_|vx?ps1h@h=+`w@z=2&X-IXI^GVh_lYCmosxJWj61DvSfM4GG zmnUXf^+1|e2sGW+r%;ro|D$=0gyAB{h^|R9mA&@5l&6@gc(cCT;mwl`z3>Bv+uwv& z4oteSYz`BH^VOE1XZaTNHaMlI+nPz*%U^Ca={5_jnzYt?f0alGBu8tN+fA{eKKjnX zggP|Sjp}f(OJX-XU(CGZrYCQ1K`k<5_Bg8ChV!P8dafH!k^qB%MbYFK@!eIQ-zL0N z_L$hMO9Zw!=oo2%g}CXede+aar5(l+=Z~JK8ITtj)3BpIykFC>5_>JfP^12?Y0jP_Cper2?Y;3N; z>5j+WS{>?*TijT!u(C?>eONY#r&SU|>&53E?a-?c(@;H~h{64c&{Mhcu%(T{-4#sG z&Ocmfu;D+1r3{^*D64S76TytPvL4WBWfaC?Tu;cKKGJ<;xkOon?c$$Q@fe!sOBHXQ zk&&HYI{$`(8l@W39%gW4BkENNx)C_dej^yHWCwAfG0>!nFech<-f>=r@( zM99)!dNZ=f__?fG(!1PiKj&+A@jUk_!hR>@5%sVWj{O#*dU9TO9j3o>wZ1W^e~GA{ zehx)hgVUc%R;}ers(b#qYWRmrQ;c}V#(nt+Vf8=U?Gf*Ef`Bh5NhN5i3>CfuO?sl-DMZcrq)^I7<#|#KudwakCNz-mG zvs%Fh-Tb-9%lr1Vh3G7JlSA!liR;#cJejVqzhlDmS(~r)zd5LnnC>dAcR^8LuSPJ+ z2VVGds3p||jTP=Z*VZ66zx%%pdd@5LU^`LkHpGW3)t~lSxBfR?8d8GuFQsv-I#QN- zRB{UScpHWXFnystRHR(srwV|-zp{)3TQP9KY(`ixU)q<#wOR!hOut(`uWQ<tB$JD@8O-&GjVP@>ido94t87@9IHe^D|v@5-f}~ermawtZMe!_-{9$qhq%4RYr_%a1vY0g zHPk#DzfQsl4-I_XP*HU~v4b5xSvRxgkHfmfWD+@Mk}Y=_|G@vh&yH**{^4=IFlo33 zs{s7VLS>nl%-d=#M#XgN>zW@K9=i%ObCf+3W(`AgNmj#jZ`z>WdHS23=qS&v`UB~D zQ~WJalNV&Nc9FDV3GRk>8FwwqDe2tWEJuWVcOIDhej9yn{BwmsU##N_TIh^*gA2=K z?FU+GQE@?A7;*+J+W$3t`)iWK*{XoZl?eU@>Vv>_RRxd(_%38g`o?T6mK$z-xH2J|7(V1+p2=Z z*$Bi@F|2T%Q~_eJ5A0C32-$6GBdOX>EiBBY51~*22AX2S2F8Uu`TL&zbTN^2QDG;W zw7I6jQ3Z#2rO_SDb^gaZ88XehW=la{>`%q&{PAi8Nu{5P-+r~DDYWzOvo+t0{_wZd z!cgMc?nl5G&1&_K#+Z6S&*Oe-rTLY_HPX=k!2mVTfVYSSpab6k#sUWa$^OAsut%s9 zFFhTt_5y=j3TF;?tsAxRy}ZuFBc;0>Yiif;YH^zPeYZAe*dj-lc|CW^QFdk?moghv zQ%07ZVKkp#!>bdO`9fgxUUacxbtkgn_pb@A+)Z5Aqt}II#ADE&FsF_xidlc)_tkU# z?EY?#gak(|?L!sJfJ|V{TrmRbpaEHk22^UnwcG;vjr9h=)WlDzLvJF%Pi-Dw6qVpfegX1khi>RkUcktwPjwX3=a zEg=*6hJ%xjbfmRh=F|VhAd41*Y?h#`QHu(b%)q9yg37(6=TKO5PPlEQ6A6_r^_J5A zV1Nc_KqjIA_`z_U_W%QevtEkxe%iR9reNj69X_Yr!-s4g9!gM18>5EN7o@=aRaZ=t zeQa8DWmteLryKhg)A)13)b9F(-$7lBe)`P5A|q-j)QTGHLQdWq#f^Gg?0F|9R7*S6 ztRHVrIGuH5v$^8@eicFf^jY@ibx)pmdbhV))sju^{n!2n10I70WFQ*Ap$pfG4=^C) z?jZSuQL*}k!$t@rp>;x~a?D{cRS#|?ZavwfH^ z$trp&%cUM^zV)GE6L&46~!B{T7Zi?VsIzx1Z30Oe;#6Bai3SQxJ1WXM-ikmcPN^iwERb0C8rSv zMcILqUXUM%;C(Ti&a-RWFn_~tD*xqk6V@l7_z^-t zt@s4+IV{io6HqN>A8el2Y&Be}n%3H?9oX*KSlG0Mh<_0wW&7orGFo$^h?PV)?c_gVYgv^PX^>+(y)u7f5}_00=X4%(6omjuWIocin0$Uzq~{I-iBw> zZ7Ik5*8GQJ?581E8stK6@fnr^&Dl`C@I`ex)r$STc=JRmLeVEh*J<_1)Ls+|rFw}N zSRJA1YJ{gC!Y(30A+TB>z#*(CTF0@-SdobRN*-f(M!PGu!QDNnMZ?q~c7xkp|ASZ0 zfSq5GRKQasV+#YF1qtuh$*E}Cue8FDvgcr4n7JC^8Hlihh_D3IS^fowuzL6LG}Y=_ zAI+0k45@j~THCOff{x{1q%axTC0!Oq8bo^}W{t8b$%RB~HnPu!6M{Zr2RS{{Tyec9 zh9RJQymBCbX9F0BZA650psw;E9Kz2UGq;3kUv@vr^v^XDgCVtyv&mk=wA6Zh0j%*x zIsxdv7A%Mp<4wk_%8f+Yc_Zbz&>z}Q+4eFSqQVduu0{ZIYye>k5uyGS6y*pGVJ%pO zQ|vxcpwCC3rpJ5U+gbO~rhoYLD(GYvALa!%$6B*|J&9K%_}unxuKX}$;9U0!i9l>h z#X75AEet{SY6ReD7(m!WM95Eoq8!5^tP|Bj6jJ14`cN?vjI)Hs*gf%oW{6YuRvGbI z=WQlx3zbL|GkZ@baL1A0L1;+uH`ZPRs(mtT(G>v?^a!ZX!HQj3z)$`aJVx0*{l{C} z<26uWD&Y?T@D>l_BB>p?bSILC7)pZN5;Gq%Ro^HeFleFvSb-V7`Vec4ktC1%PO}G| zEi#d57B`xIevU=(8%30wz!r7js=demS%Q%H{L4>3H|=Xok1q z7O#vMim~bU$~LE1V<vtVMR^?D>A8 zI2X(!ZH$iWJVJXbtJ{HaPHE2i&q6dhO#~bp#*;r#u~%sg?Gw3lf@44d~BJ7 z9tmB}ddS^OJXJo4f_K50P2h)bieBhQSI~NZwBd-f=Lc|2NCDc&%eBiqv}CSq!oa6V z@&radUbU%hs_PaetM`A|%vjD&8A8bh>SdU3l>l1Ul&JidZ?kMY zL0WeN+K8$JxTd23E!Z-3Ywl;?2-EY0E<@=Afjf^ew(Z3hnW*I1PmN+;w4{&ak3)c3 zz#j_Zl8y}=E1nQ}$NaF3DCX$cYDZ0vOudEO|NSD8UKZ1v2715#7+dE=--#>ugp)3| z+M4j%y)>d%(OPwLX`IUQ!$n26pvE!uY3%oEr;t^bJ3mQS zjgf@~;&iAc#@J7=Dt|TQP9F~~)l%+InwgKdu&WuTOrQ7v1k!-f`jZRAG`Z#5?~xsCJP;UoEUldpE5nSZUQvFU z82@z~5{2F&_GIO3%W*Db}U5^3PG4JS!vE9G1U+SulA_5m^|Z1SjHjqd~E zyCCAnIKcIN1H2zQv%-HA=BQEc-&Y>^BOzk)&d8v?MrMdS>BM(~bV;4%qGoh|eZF0dFl9H3k*;xJc z%_$|xWTvDX4XYOab2Ulc$eA?q@H954_cw5d?mzH-L43ptfe}xDG$I4e`>%8Bn$py! zIZKJq`BZ#eO=XW~;vNyREJDLZeJ4>%0wID8RP9(FHAs0RzmwW>=Z?(<$i9jC{BvHe z*DU=>=OtVIr>=sF*co&z+(KOoYn^DT3J7M1$hE22CPwTWvdM?KpL)BPGwuilXrwt1 ztI+>)N)>TSxdHRO+ST6o1Mv|n21XE4!ZnWrydOuB72cSIyUMg+U0hPJP1!cx@~ug9 zDAa#nD0Z3aWaSrz_hFFz;>&Qtxmk%FI_>u zDunD=e9|>5 zU?uqd-GjS2#ukl{iR+aG7KQqAY~U7z!an*{TjM}x@mKhwr2GVmatbHC=`E3AbUTk} zyr*<_W^B7qKi~bUs8YN8Li{u(M}!x~(${^DXNF<8-bofVI2cXIR?%kCf48gvEz z{z@b)S%Dk_uzm$$;MIJSpePq`@;i%|YniGIeb2j9dd6E5^2=v>7Eo=5>QgDk+2T(g zO7FFN{jD!2oyNneXD@Q2TYnbP_CA$fvFEdGJ{^n!<={#N01seTMr0TPu5nz#G3;_0 zpH#AS4>^)6w`J5_w8<{-y5H}ckXp9BE+Zf(9&>_CFE6XXT3041_^ua+ApC%#gn$LT z$3MrK8!TtQb~OVOWLQFEUVx&90T9vcHEbmIp8{Q0ypoJ7T+G6oL%LaKOc1b7E9={cfj6eo3|m;k%T;y^zxi z+^^?MaZme{9VR>`*aDkAU`j9a9t5AH7%B0*5|hH>H>W|L1P_Z6uVw(ID!?$0$nenu z3b_Wy@aq-RtzzxKkDjJ=*5i;fl4Uc=pR6IT7kJ-=vf2_on9vLMm{@!@R%e&R@;HmY zd9p#ciCQN~q{tgjn*-*DnI{-mT`fug-{%$xt7(uL7F?H2;C=oknf-n7FFZA&=M!_G zf`>7uMzr(=!^ms`&yBjOyv{QV5+2+Nz0BppRDNFl(A;9#t1@;sKrgJeK&El(z zB!O*Tu}pC>S^Ut`jSCz#3!vy(9pR( zsH1-QO7)Tj=i<}DjjXdji1C10^1l#+ZIk}7)H?|p!u8w)e48*Rz`{$aw7GWQb9o=y zomTL8s@!@0GT)Wpu>D>+zR6%cG4F-vZwCD9=*-tJ!U@Ks<4rGvKK$0qWzZk1VrhRi z`qX&)K`-=jCPh&BBw3_NRPdf$XJxA{1LKO%m~7vIl(q;nz_HU8uH_~` znHc&jm$tZHdh4uRO#-7Ly;%t5aan2{YN^dPic%5!qh>6x2D67go6KA+sZddkyccz3 zFHRS0o0qn3LAf5uxtQKL!=fWO4X`ikJGbEu&O3blzERtHOrFyEaXt^YvTt`A08xniR}S zkpj5HNh)U-TV z-a6)!C;U|#EH92N90u|lx^Iq>sjz)`T(Um|^YDMb=Ya4Ui15OgaLwKT4};x8k%Qz- z*{i5))ZYEp>q6GkY5N$!G#mZwrNgpfGq82< zr3j1qFyL)|s*Y>55}fCzAE(M9?tLbyKIN3@OKQj19M-banGl~S#<;XfoA+UIt)+x| z=QyPg3(OY&13njoS4V_*!-eY)2f(M?8A`hdkHYOOp<_X^Emm}wtTeU7Ju>4FGN{x) zOm=mRcZ_pPBJM<45nHlJ;IrhplV_e~dHdByC-;>1bdEv4_> zXdvtNO>NKuu2)D3)FU$xpR+xxWZj56aG<9ork1z3{iK=L=YQ~g9tf|72#;C?*G&$9 zPwlOBA>wn~Ynf<&9LoS4{bZf+*LOU=&)z3brnLQij*Nf6)&AIC-A$)f!Meq;C#K{8 zr*b$P*DI=Tf;$}bw&-xYWzhDIsY(z0TBXR%*;k3n1Dcvem@M=?-}qJ@8qTBWUyLy$ z4eRG)_I{y2C1X%xb^woM|HJe7AiOFfylN&~^Em)M&ADi=E}zc7fxn))k4;(J(&G^} znJ>d?Ol$Lw@8Y-ziAxPO^7B}28ad@RxAe|x?n5|tzndmsPgvV>RV|w!-y*rAQu$j~ zMnQq)ahU<1_sH_A>jO?A9AiXp?LvJvom(wFZwOrmqYDKeIyo^?KAH(Aqq6!RJpT@a zS3!h7=!ff82f(KfjQigcHw};=SW5j^T`p5=J^Q7wF?By|=y~WZlJ^hS2CqA11Xxfm zmU#8{P!4NEP**Bdc-rdkW*!q(8dk_QKd4hbbCE!qdna-4hf1s2>353J{w5UJDNQ5# z%oA!i#kKR3oX{6bi`P~&1$MAfZoWHvfewS`Wx>2EOK<}h<~4+cS++A43PJhvwgIw) zL+gCSin9_jv>%6f)~J*lJ?pg6l~iKcQ2ZU@UJm||=6&&x1H*<9HBYnhy&6`$}b1Ze^E2qAa~KHK1s}AsNE*b z=n*Y>h>E6vH;9Oc{d_urCuULNO~FdU!ze`u67Ybo1yF_^Z@{ADzm!c`J^m39DTSjz zA*gUhA0L(+2DdF`d?6Mk`)MxRJk(VzNV&Q+vlt|J(uc-Sc0NH^d^aS5wX-vNbolsI zmfR2%(N1ulIn3!@oS6UDjQ1~nb5>7Ke-^>%DkFVR2pXLJiB>`PCzi931l1g_2Ycay zyyYrkd>Sbu*rwN-agy&^;}mYgxGh26K6;LdBxOdXZz)= zXGi5Ut0D5uC!v#L7UI_kav6>6ShwH7{J?cJg*Qksj!5w+916jJqd2oEJm9XOr$2o3 zz7UURN~M$kYb35$off&?E93;H>$n?PJ+?{(?o#P0rG%&}{e*^hx7iF02B$X~%qvR4 ziZEJNQ}}=sV~7;m`%nlb9L0H=TNg`(4b);J^AWb)FJHA=2V+wAc5haS<+36XtS7O( zVX*PH`Qj(4wLs{?zhL>hcDMk?~+^L`tEI5jbx>N4m zGP@B{VNd2D@f)QHvrP;`+VW;e9B8&T^yFqf$GcGZa@i`x$(%Ya+bYpD9JcwfqF$>lp*3oS0r; zRta5aZVJVd5a`E=M@_DH9ZBdF%*G3)`Wl&(?Uxr`bXMxU;G?r4?=~hAKJ~?k#zb+h z&oy(xGU#o*i1?oJ*z-*dT0)J0#3k#+=2Uf3u3(%h(>G#rFZsUW1LcR-MUO*_tlGj%?YAfO zOMYjhzU(TsmErnzLs}vA4Tm0&#Y}%bZMj)*QQ6M=A1YW1mGUpD5Zf;xl`H}kR6!H2 z6DZ)ax8HBs8GGNH!f|D^7aQfJ5#keKXAQ+}kz6x2)84Z^Wumg|NIR5 z=?%@mOvyTXe$n0)Y*w_pyxre9Ww3l+8mq-GlIBn+e1Fs!J@R`xFh2o3#EdTMF$_}_ zn07Ek*e>W_(=Nic9mJGCz;tU&h3gIqV1f-x9nP9Pkvby?#&}+e@jMjJs@-_rf~Bh* zr@m~vPV$N&@xfjP>J0}fgSVmf-#)$_ZmHS4MN{dKC%b1F^Ub0DUFK8vm2?%9Uc)sD zqDdi{FoL3}_R#vtcFBtk;uBo(u=YPtzk;ZUC9~b!fSsl?z_dT(3^p?LGGYmKN*ZQI$7pc_l~#g{ zS#QQeFZNL3G*bLd4!7$B;+3=pL*3}gyxn@K3Xw4~=0^X6S35vdF+{HxDZzEH1H77R zLFyK(6ge_jAj4s-&tcECG?U6bQM1i8+lfqw#qq|qU{1{6*1Ky?zh*JX=&hutn4p?V z9_O=pUq*ey9~9rchnE7I8$W+CGH>6-R%!WeO!n#+!)n@)BRo0sNK7^E4df$Jbc7dpfHOJlDfw&!Z8un)bPU3(iK`@BsFU!3NgNo7}2YDo#2|}0bYGq`&NuKay#aN zQ%Qxar_56uNzLah&*&)`x)+bx=vL{fmn+-Y5Z+Yxv!`z|MJbNNYx@OK|x^ z49=94h@lYNKVC(0h9DixoA*DWHw(Lwhs8luK6&`iHJ)`}Sd*IfQ3AcHB=lwP_un)Q zOkD2t4-)x#JTTn%v$uQ~Xu%S5SwUD=ZJ!7HLtk;^BNT!Mr;lv@VKTSwwy;Y^onp8I zRn?01u~R5XSNtAHq2k?d(|VE74sI^-zla9=8Qs*cSzAw%p(Sgs62i=1ip9F>0@5o` zehOjrmut_0Lh#|_uQ6lb-Fc|s%xSx?=q5(01Y%L2kzY}yBb!UG7xYNstw z2qBy>q?_c9F_SUpOQ);YdK@wR zN6OyngyF{Aa1bH{KVh`Jnjsiu=tpGWq=iC=;22P$3mFHl$0~QUOh!rYp!MmQ@=q%Rlc*vs6_gs6xrfAr#(J~f4lQ~e z_lRm8gnzo)igP7uiozyA_0>`2il{j9twT1~U9W zWFTCGLP+5lFxYdS9he8Y%kmHO8jE;YMpIs+_b+_VV42!!OYnN;8o_#{?8`Y%(R#EN zL9X%Ab(a>)wKvq7a(75O!8v()HA6Va@EwtXy%!20gJZzFZjdNFK4C6iaaoMhnNeP2 zT&DMk7-epUtmWZ1HY2s5qE1z<2O8Z4`bk_OEZZFEy?xGZ3{OQ?JIcXg{-je_SM7$b zgRgB|gx7W$HSm=|^&bY{wOwHA+4Sg+o>rcSg0F@N^3t6;qiN9q^BCEBG37vSB;U%c z2pYnNg-nNc5?p<&zDYE=IdA|O15H$266QpzmNvOfO&*Rmhim7F+rGW8z4M6 z0=%ySa1dAn2VaPvV*ZGFfL_d)X+so3So+q~g^eQY{=Oq}ol|_>&1AvErQXrbj)>k2 zQ_Q%$A4Nen<|XO^Ly$gQJn5n#tWwc%q%bdmUFc?~G{}AT`>hJ$WoMgKR5)&d2zY+x^_gXmO_al|r-|gNwk-yA~-BpwB zWyti8nfb((_cq?1n0c>Sy(FGXZ-OMbE7Jq$-Ew~x=dn|pMDXI%bWK?wake_2mv>*? z+Gc&gsjEZ$rn)f_8j2?!vg0D-K_@QdXNr>h2CI^AyKW{ir!bTb+4UZ@9fnN~I64(T z$ov;}r0o`nO@)B%?gV@bRR@P%)aGOOJDh>ApgGgsB*chrRQ&0eGkqJEX-C(@p()+0 zdn?HvJ=J3N9O_&5WS*K-^yOT)pynK3s}RatmGe?7rM#2Zu-I|mjd)hEvJ`b)hQN+Z z--z~>ig&7y!E-I?wz=_p;Ke!^YdN3`o1uSAifr3$kQEhyHL98mu9GP+qrvW~4nIcI zKJhq7zsb%TJC-~28uf~z>iB|O;9K&Np?2G+%240j<8`-Z#byB24Jt8;XXOh)uI0?_Z2<6av`kPR6CUNOe&&YM#(Zxj# zhCLK>^+q4^7b0g`th!^4%4e0R!ii#i#;B%}q0UqpAN z&;S&~5eNcmm4ARUptRfB`m9#LZHj#{aqsA3=z1$Y)w2AjooU{gs`X$K-D{S^4=$;o zdKB1t+e8#*%$%ZWWVdiV^fD6o3p!kMJF`^lp}6-cZ^mgOnGV*Tuq!dzjR;eim@b#R zzTc-W`}M+J(T&>Ow&3$`)2d3U(f8iQytcS%d4Ayj;eQyg2O4k<(ST84ufGw_fHKmD z_x5=|xqV=fmk`z`xTRY$EB=O9<@3UeZ;8ex`8--}Qf%UWY36>>uR7Ag4zC%Q<4NR2 z>$qhagiqp{p5t-W~_lI__HabdA<0r`!vM z-EUpYi^q9oZu=}hP^}i<*?~lSSVq;IJFIKOZNHYfvvN$web+kR!Q{xHQK}KSl4lV| z&5%STS!mrl+$9*spU3rmODV?8VvoruSk>YD<%BVY5}GWaBNr z{+}1l6%X+NXaEwT0l`Ob4efx3xZ*=XBgMNqU4J4S!fkKat_{JDx@ml+%i@6qoLc#U z*WUyawolKEQ^-JPllPvvYFibFbJ-AWE5CcGqVqB%tV(G}?DQ35NB^eh3ith$9u?|m zwI^~CZT-$k_Gbpm$G$GjXKtO0HK47g0dzG~ke*!Kcr z9KvbShvG9)R-gL)4Y>^ymIkxvpp@AQ57>7D!BVRB<` zq5s%@E1P*!iXlYaxnB(?&5?+GReBTokMK%~aR>^bfRo1l{(_YHLO{V&=jiRlgdTo- z%*Iy?)aBk8%otW#uHflJdA^SgXIAG;*J&ez@()zWBYyauOqGI}paP(O#qFS|f9NYJ zE$EA79A6K{e`2r6m6jDy zi<>zKasyVmi#Y0^>=GL`9c{RgkbZxQ>wj{}@XQb<9193vkz&Mv!kq}hY9jGa2o;<# zp5EgXFXUpb9rNJ_g^c42o3T8T-?UTM%5i`BT;ADwp@CCGl=nXFh^@ymrfp^e

gwss9y`Vb~E0 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�QRfe8sMr8ACC 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

4Mo+DII;^10m+Rw`>l?w36R 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