From 6eacd6d2904e401f66f2876eb463cef76c833290 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期一, 22 四月 2019 15:58:16 +0800
Subject: [PATCH] 删除一些不必要的文件

---
 /dev/null                                      |   12 ----
 QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt |   16 ++--
 QiaoJiaSystem/StructureApp/CMakeLists.txt      |   16 ++--
 QiaoJiaSystem/YoloServer/CMakeLists.txt        |   84 ++++++++++++++--------------
 QiaoJiaSystem/StructureApp/SaveVideoRpc.h      |    2 
 QiaoJiaSystem/CMakeLists.txt                   |    2 
 QiaoJiaSystem/VideoAnalysFromHC/main.cpp       |    2 
 QiaoJiaSystem/StructureApp/AppPipeController.h |    5 +
 8 files changed, 64 insertions(+), 75 deletions(-)

diff --git a/QiaoJiaSystem/CMakeLists.txt b/QiaoJiaSystem/CMakeLists.txt
index d9aa5d9..cb7ddf5 100644
--- a/QiaoJiaSystem/CMakeLists.txt
+++ b/QiaoJiaSystem/CMakeLists.txt
@@ -32,7 +32,7 @@
 add_subdirectory(DataManagerServer)
 #add_subdirectory(EncodeServer)
 #add_subdirectory(VideoToImage)
-add_subdirectory(UnitTest)
+#add_subdirectory(UnitTest)
 add_subdirectory(VideoToImageMulth)
 #add_subdirectory(GB28181DecoderModel)
 #add_subdirectory(FaceSearchDbWithImg)
diff --git a/QiaoJiaSystem/EncodeServer/CMakeLists.txt b/QiaoJiaSystem/EncodeServer/CMakeLists.txt
deleted file mode 100644
index 660085b..0000000
--- a/QiaoJiaSystem/EncodeServer/CMakeLists.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-#cmake_minimum_required(VERSION 2.8)
-
-#project(VideoAnalysFromHC)
-#add_executable(${PROJECT_NAME} "main.cpp")
-cmake_minimum_required(VERSION 3.5)
-project(EncodeServer)
-set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE debug)
-add_compile_options(-fPIC)
-add_definitions(-DGLOG)
-add_definitions(-DDEBUG_ERR -DDEBUG_INFO -fpermissive)
-
-SET(LIBS
-    glog
-    #Ice
-
-    crypto
-
-
-    #ffmpeg
-    avformat
-    avcodec
-    swresample
-    swscale
-    avutil
-    bz2 dl z
-
-    #QT5
-    Qt5Core
-    Qt5Sql
-    Qt5Gui
-
-
-    cuda jsoncpp
-    #    cudart
-    #    cublas
-    opencv_world
-    jsoncpp
-    pthread
-    hiredis
-    )
-include_directories(
-
-    #glog
-    ../../../BasicPlatForm/libs/glog/include
-    ./
-    ../VideoServer
-
-    ../VideoServer/QiaoJia/DB
-    ../VideoServer/QiaoJia/dispatchTool
-    ../StructureApp/
-
-    ../../../BasicPlatForm/
-
-    ../../../BasicPlatForm/basic/pipe/
-
-
-    ../../../BasicPlatForm/libs/opencv/include
-
-    ../../../BasicPlatForm/libs/ffmpeg/include
-    ../../../BasicPlatForm/libs/jsoncpp/include
-
-
-    /usr/include/x86_64-linux-gnu/qt5
-    /usr/include/x86_64-linux-gnu/qt5/QtCore/
-    /usr/include/x86_64-linux-gnu/qt5/QtSql/
-
-    ../../BasicPlatForm/libs/hiredis-master/include
-)
-
-link_directories(
-    #glog
-    ../../../BasicPlatForm/libs/glog/lib
-    ../../../BasicPlatForm/libs/openssl/lib
-    ../../../BasicPlatForm/libs/opencv/lib
-    ../../../BasicPlatForm/libs/ffmpeg/lib
-    ../../../BasicPlatForm/libs/jsoncpp/lib
-
-    #    ../../../BasicPlatForm/libs/libuuid/lib
-
-
-    ../../../BasicPlatForm/libs/hiredis-master/lib
-)
-
-add_executable(${PROJECT_NAME}
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
-    ../StructureApp/NewRecordVideoElement.cpp
-    ../../../BasicPlatForm/basic/timer_counter/TimerRecorder.cpp
-    ../../../BasicPlatForm/basic/util/BASE64/Base64.cpp
-
-    EncodeVideoManager.cpp
-    EncodeVideo.cpp
-    ../StructureApp/HiredisTool.cpp
-    main.cpp
-    )
-target_link_libraries(${PROJECT_NAME}
-    ${LIBS}
-    )
diff --git a/QiaoJiaSystem/EncodeServer/EncodeVideo.cpp b/QiaoJiaSystem/EncodeServer/EncodeVideo.cpp
deleted file mode 100644
index 9341a44..0000000
--- a/QiaoJiaSystem/EncodeServer/EncodeVideo.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "EncodeVideo.h"
-
-EncodeVideo::EncodeVideo():
-videoEncoderElement(cv::Size(1920, 1080), 8, 0)
-{
-
-}
-EncodeVideo::~EncodeVideo()
-{
-
-}
-
-void EncodeVideo::threadFunc()
-{
-//    std::string tmp="threadFunc";
-//    ClockTimer cl(tmp);
-
-    std::string src_path=getProperty("src_path");
-    if(src_path.empty())
-    {
-        DBG("src_path.empty()");
-        return ;
-    }
-    int size=m_hiredisTool.getSize(src_path);
-
-    bool fileCreate = false;
-    for(int i=0;i<size;++i)
-    {
-
-        cv::Mat img;
-        m_hiredisTool.getImage(src_path,img);
-        if(img.empty()){
-            DBG("img.empty()");
-            continue;
-        }
-
-        if(!fileCreate)
-        {
-            fileCreate = true;
-            DBG("fileCreate buf_size="<<size<<"  file_name="<<src_path);
-             videoEncoderElement.threadInitial(getProperty("src_path"),img);
-
-        }
-        else
-        {
-
-            videoEncoderElement.doFunc(img);
-        }
-       //  usleep(1000);
-    }
-
-    videoEncoderElement.threadClosing();
-    m_hiredisTool.delKey(src_path);
-    m_hiredisTool.hashDel(file_list,src_path);
-}
diff --git a/QiaoJiaSystem/EncodeServer/EncodeVideo.h b/QiaoJiaSystem/EncodeServer/EncodeVideo.h
deleted file mode 100644
index 164e55c..0000000
--- a/QiaoJiaSystem/EncodeServer/EncodeVideo.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef ENCODEVIDEO_H
-#define ENCODEVIDEO_H
-#include "../StructureApp/HiredisTool.h"
-#include <basic/pipe/PipeElement.h>
-#include <basic/pipe_element/ffmpeg/FfmpegElement.h>
-class EncodeVideo: public basic::PipeElement
-{
-public:
-    EncodeVideo();
-    ~EncodeVideo();
-
-   void setImageQue(std::queue<cv::Mat>& imgQue);
-
-private:
-    virtual void threadFunc()override;
-private:
-
-    std::queue<cv::Mat> m_imgQue;
-     HiredisTool m_hiredisTool;
-    ffmpeg::VideoEncodeElement videoEncoderElement;
-};
-
-#endif // NEWENCODEVIDEO_H
diff --git a/QiaoJiaSystem/EncodeServer/EncodeVideoManager.cpp b/QiaoJiaSystem/EncodeServer/EncodeVideoManager.cpp
deleted file mode 100644
index 77f36a0..0000000
--- a/QiaoJiaSystem/EncodeServer/EncodeVideoManager.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#include "EncodeVideoManager.h"
-#include "NewRecordVideoElement.h"
-#include <basic/util/app/AppConfig.h>
-#include <qdatetime.h>
-
-EncodeVideoManager::EncodeVideoManager():
-TimerElement(10*1000)
-{
-   // m_hiredisTool.delKey("")
-    int thread_num=appConfig.getIntProperty("encode_thread_num");
-
-    for(int i=0;i<thread_num;++i)
-    {
-         EncodeVideo* newEncodeViedo=new EncodeVideo();
-         if(newEncodeViedo)
-         {
-
-               m_newEncodeVideoVec.push_back(newEncodeViedo);
-               newEncodeViedo->start();
-         }
-
-    }
-
-}
-EncodeVideoManager::~EncodeVideoManager()
-{
-    for(int i=0;i<m_newEncodeVideoVec.size();++i)
-    {
-        if(m_newEncodeVideoVec[i])
-        {
-            m_newEncodeVideoVec[i]->stop();
-            delete m_newEncodeVideoVec[i];
-            m_newEncodeVideoVec[i]=nullptr;
-        }
-    }
-    m_newEncodeVideoVec.clear();
-
-}
-void EncodeVideoManager::timerFunc()
-{
-        //    std::string tmp="camId="+m_camId+"videoCaptureElement";
-            //ClockTimer cl("timerFunc");
-   std::map<std::string,int> fileMap=m_hiredisTool.findAllFileStatus();
-//   auto it=fileMap.begin();
-   for(auto it=fileMap.begin();it!=fileMap.end();it++)
-   {
-       if(it->second == RECORD_ENDING)
-       {
-
-           for(int i=0;i<m_newEncodeVideoVec.size();++i)
-           {
-               if(m_newEncodeVideoVec[i] && !m_newEncodeVideoVec[i]->isBusy())
-               {
-                  m_hiredisTool.hashSet(file_list,it->first,RECORD_STOP);
-                  m_newEncodeVideoVec[i]->setProperty("src_path",it->first);
-                  m_newEncodeVideoVec[i]->submit();
-                  break;
-               }
-           }
-
-
-       }
-       else
-       {
-           //----/home/basic/work/qiaojia/cut/DS-2CD2T46WDA2-I20180622AACHC30488278/201901/22/2019012210/2019-01-22 10:32:38:171.mp4
-
-           std::string file_name=it->first;
-           int begin=file_name.find_last_of("/")+1;
-           int end= file_name.find(".mp4");
-           std::string file_time=file_name.substr(begin,end-begin);
-           QDateTime dt = QDateTime::fromString(QString::fromStdString(file_time), "yyyy-MM-dd hh:mm:ss:zzz");
-           if( (AppUtil::getCurrentUs()-dt.toMSecsSinceEpoch())>5*60*1000*1000)
-           {
-               DBG(file_name<<">5*60*1000*1000");
-               m_hiredisTool.hashSet(file_list,file_name,RECORD_ENDING);
-           }
-
-       }
-   }
-}
diff --git a/QiaoJiaSystem/EncodeServer/EncodeVideoManager.h b/QiaoJiaSystem/EncodeServer/EncodeVideoManager.h
deleted file mode 100644
index 5b0c5a3..0000000
--- a/QiaoJiaSystem/EncodeServer/EncodeVideoManager.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef ENCODEVIDEOMANAGER_H
-#define ENCODEVIDEOMANAGER_H
-#include <basic/pipe/TimerElement.h>
-#include "EncodeVideo.h"
-
-class EncodeVideoManager: public TimerElement
-{
-public:
-    EncodeVideoManager();
-   ~EncodeVideoManager();
-private:
-    virtual void timerFunc();
-
-private:
-   HiredisTool m_hiredisTool;
-   std::vector<EncodeVideo*> m_newEncodeVideoVec;
-
-};
-
-#endif // NEWENCODEVIDEOMANAGER_H
diff --git a/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.cpp b/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.cpp
deleted file mode 100644
index a2c04ca..0000000
--- a/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "NewEncodeVideoManager.h"
-#include "NewRecordVideoElement.h"
-#include <basic/util/app/AppConfig.h>
-NewEncodeVideoManager::NewEncodeVideoManager():
-TimerElement(1000)
-{
-   // m_hiredisTool.delKey("")
-    int thread_num=appConfig.getIntProperty("encode_thread_num");
-    for(int i=0;i<thread_num;++i)
-    {
-         NewEncodeVideo* newEncodeViedo=new NewEncodeVideo;
-         if(newEncodeViedo)
-         {
-               m_newEncodeVideoVec.push_back(newEncodeViedo);
-               newEncodeViedo->start();
-         }
-
-    }
-
-}
-NewEncodeVideoManager::~NewEncodeVideoManager()
-{
-    for(int i=0;i<m_newEncodeVideoVec.size();++i)
-    {
-        if(m_newEncodeVideoVec[i])
-        {
-            m_newEncodeVideoVec[i]->stop();
-            delete m_newEncodeVideoVec[i];
-        }
-    }
-
-}
-void NewEncodeVideoManager::timerFunc()
-{
-   std::map<std::string,int> fileMap=m_hiredisTool.findAllFileStatus();
-//   auto it=fileMap.begin();
-   for(auto it=fileMap.begin();it!=fileMap.end();it++)
-   {
-       if(it->second == RECORD_ENDING)
-       {
-
-
-
-
-           for(int i=0;i<m_newEncodeVideoVec.size();++i)
-           {
-               if(m_newEncodeVideoVec[i] && !m_newEncodeVideoVec[i]->isBusy())
-               {
-                  m_hiredisTool.hashSet(file_list,it->first,RECORD_STOP);
-                  m_newEncodeVideoVec[i]->setProperty("src_path",it->first);
-                  m_newEncodeVideoVec[i]->submit();
-                  break;
-               }
-           }
-
-
-       }
-   }
-}
diff --git a/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.h b/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.h
deleted file mode 100644
index 3d6ac72..0000000
--- a/QiaoJiaSystem/EncodeServer/NewEncodeVideoManager.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef NEWENCODEVIDEOMANAGER_H
-#define NEWENCODEVIDEOMANAGER_H
-#include <basic/pipe/TimerElement.h>
-#include "NewEncodeVideo.h"
-
-class NewEncodeVideoManager: public TimerElement
-{
-public:
-    NewEncodeVideoManager();
-   ~NewEncodeVideoManager();
-private:
-    virtual void timerFunc();
-
-private:
-   HiredisTool m_hiredisTool;
-   std::vector<NewEncodeVideo*> m_newEncodeVideoVec;
-
-};
-
-#endif // NEWENCODEVIDEOMANAGER_H
diff --git a/QiaoJiaSystem/EncodeServer/main.cpp b/QiaoJiaSystem/EncodeServer/main.cpp
deleted file mode 100644
index fe839d4..0000000
--- a/QiaoJiaSystem/EncodeServer/main.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <stdio.h>
-#include <iostream>
-#include <unistd.h>
-#include <cstring>
-#include <basic/debug/Debug.h>
-#include "EncodeVideoManager.h"
-#include <thread>
-
-using namespace std;
-
-#include <basic/util/file/FileUtil.h>
-#include <basic/util/app/AppPreference.hpp>
-#include <basic/util/app/AppConfig.h>
-
-
-
-
-//static void startEncodeVideoManager(int i)
-//{
-//    EncodeVideoManager  encodeVideoManager;
-//    encodeVideoManager.start();
-//    while (1) {
-//        sleep(1 * 60 * 60 * 12);
-//    }
-//}
-
-
-int main(int argc, char **argv) {
-    SAVE_APP_ARGS
-    ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
-    EncodeVideoManager  encodeVideoManager;
-    encodeVideoManager.start();
-
-    while (1) {
-        sleep(1000000);
-    }
-    return 0;
-
-}
diff --git a/QiaoJiaSystem/PerimeterAlarm/AppPaController.cpp b/QiaoJiaSystem/PerimeterAlarm/AppPaController.cpp
deleted file mode 100644
index a9d330d..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/AppPaController.cpp
+++ /dev/null
@@ -1,363 +0,0 @@
-#include "AppPaController.h"
-#include <basic/util/app/AppPreference.hpp>
-#include <basic/util/app/AppUtil.h>
-#include <algorithm>
-#include <basic/util/app/AppConfig.h>
-#include <QtCore/QDateTime>
-#include <QtCore/QtGlobal>
-#include <net_config.h>
-
-
-AppPaController:: AppPaController(int index, const ControllerConfig& cfg ):
- videoCaptureElement(cfg.camInfo.strRtsp, 25, 3000, appPref.getIntData("gpu.index"), true),
- m_index(index),
- fdfsClient(nullptr),
- yoloRpcElement(to_string(index) + "yoloRpc"),
- triggerElement(cfg.paAlarmInfo.nTriggerDelay, cfg.paAlarmInfo.nAlarmDelay),
- recordVideoElement(index, cfg.camInfo.strRtsp),
- m_cfg(cfg)
- {
-
-      init();
- }
-
-AppPaController::~AppPaController() {
-
-}
-
-
-
-bool AppPaController::getRunning() {
-    return videoCaptureElement.isRunning();
-}
-
-
-
-void AppPaController::init() {
-
-    unsigned char ip_old[15] = {0};
-    std::string net_ifname = appConfig.getStringProperty("netIfName");
-//    if (!(GetIpAddress(net_ifname.c_str(), ip_old))) {
-//        ERR("couldn't get ip");
-//    }
-
-    bUp = false;
-
-    yoloRpcElement.setProperty("str_addr", m_cfg.camInfo.strAdrr);
-    yoloRpcElement.setProperty("local_ip", std::string((char *) ip_old));
-   // yoloRpcElement.setMask(QString::fromStdString(m_cfg.paAlarmInfo.strMaskPath));
-    yoloRpcElement.SetRuleCfg(&m_cfg);
-    yoloRpcElement.setProperty("dev_id", m_cfg.camInfo.strCamId);
-    m_json_Record["rtsp"] = m_cfg.camInfo.strRtsp;
-
-
-
-    videoCaptureElement.registerConnector([&] {
-
-            auto i_t = videoCaptureElement.getChangeLevel();
-            if (i_t > 80)
-            {
-//                cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << i_t << endl;
-                triggerElement.setState(true);
-            }
-            else if (i_t < 50)
-            {
-//                cout << __FUNCTION__ << " -> " << __LINE__ << " -> " << i_t << endl;
-                triggerElement.setState(false);
-            }
-
-            triggerElement.triggerOnce();
-
-            int test_sub = triggerElement.getState() ? 1 : 5;//
-
-            videoCaptureElement.setOutPutInterval(test_sub);
-
-            if (triggerElement.getTriggerState()) {
-                if (!bUp) {
-
-                    string t_FilePath = "";
-                    m_json_Record["path"] = t_FilePath;
-                    std::string t_recJsonStr = m_fastWriter.write(m_json_Record);
-                    t_FilePath = recordVideoElement.startRecord(t_recJsonStr);
-                    INFO(m_cfg.camInfo.strCamId << "file keey is ::" << t_FilePath);
-                    yoloRpcElement.setProperty("path", t_FilePath);
-                    bUp = true;
-
-                    std::thread timerFunc([&] {
-                        //褰曞埗鏃堕棿瓒呰繃鐢ㄦ埛璁惧畾鐨勬椂闂村悗鎴柇锛岄噸鏂板綍鍒�
-                        long startTime = AppUtil::getCurrentMs();
-                        int cut_max_duration = appPref.getIntData("n_cut_max_duration");
-                        long triggerTime = cut_max_duration == -1 ? 2 * 60 * 1000 : cut_max_duration * 1000;
-                        while (bUp) {
-                            if (AppUtil::getCurrentMs() - startTime > triggerTime) {
-//                                if (bUp) {
-                                bUp = false;
-//                                }
-                                break;
-                            } else {
-                                usleep(5000);
-                            }
-                        }
-                    });
-                    timerFunc.detach();
-                } else {
-                    recordVideoElement.feedDog();
-                }
-            } else {
-                if (bUp) {
-                    bUp = false;
-                    //DBG(m_camId << "endRecord");
-                    recordVideoElement.endRecord();
-                }
-//                return;
-            }
-
-
-
-        std::string strNewTime;
-        if (m_cfg.camInfo.strCamId.size() > 0) {
-            strNewTime = AppUtil::getTimeSecString();
-        } else {
-            //#todo 璁$畻褰撳墠鏂囦欢鏃堕棿
-            //#TODO 杈撳嚭闂撮殧鐢ㄤ簬璁$畻鏃堕棿
-            // 鐜颁负姣忎笁甯ц绠椾竴娆★紝瀵艰嚧璁$畻鐨勬椂闂撮暱浜庢枃浠剁殑瀹為檯鏃堕棿
-            auto opit = 25;// videoCaptureElement.getOutPutInterval();
-            auto opidx = videoCaptureElement.getoutPutIndex();
-            int second = opidx / opit;
-            qint64 newTime = m_dt.toMSecsSinceEpoch() + second * 1000;
-            QDateTime newDt = QDateTime::fromMSecsSinceEpoch(newTime);
-            strNewTime = newDt.toString("yyyy-MM-dd hh:mm:ss").toStdString();
-
-        }
-//        DBG(strNewTime);
-
-
-
-        if (!yoloRpcElement.isBusy()) {
-//            yoloRpcElement.setProperty("uuid", uuid);
-            //#todo
-            yoloRpcElement.setProperty("time", strNewTime);
-            yoloRpcElement.setImage(videoCaptureElement.getImage());
-            yoloRpcElement.submit();
-        }
-
-        if (!imageDrawElement.isBusy()) {
-            imageDrawElement.setImage(videoCaptureElement.getImage());
-            imageDrawElement.submit();
-        }
-
-
-    });
-
-
-    triggerElement.registerConnector([&] {
-
-//        std::string strImgPath,strVideoPath,strCurTime;
-//        makePath(strImgPath,strVideoPath,strCurTime);
-        if(yoloRpcElement.getRealNum()<m_cfg.paAlarmInfo.nAssembleCount)
-            return;
-        switch (triggerElement.getTriggerType()) {
-        case UP:
-            INFO("UP:sendVideoAlarm(true) num="<<yoloRpcElement.getRealNum());
-          //  this->sendVideoAlarm(true);
-            //this->openSoundAlarm();
-            //if(isSaveResult()) alarmResultSaveToDB(strImgPath,strVideoPath,strCurTime);
-            //if(isSaveVideo())  recordVideoElement.startRecord()strVideoPath.c_str());
-            break;
-        case DOWN:
-
-            INFO("UP:sendVideoAlarm(false) num="<<yoloRpcElement.getRealNum());
-           // this->sendVideoAlarm(false);
-           // this->closeSoundAlarm();
-            //if(isSaveVideo()) recordVideoElement.endRecord();
-            break;
-        default:
-            break;
-        };
-//        if(isSaveImage() &&triggerElement.getTriggerType()==UP)
-//        {
-
-//             std::vector<cv::Rect> rects ;
-//             std::vector<ScoredRect> scoredRects=yoloRpcElement.getLastScoreRects();
-//             for(auto scoreRect:scoredRects)
-//             {
-//                 rects.push_back(scoreRect.rect);
-//             }
-
-//            cv::Mat img = this->videoCaptureElement.getImage();
-//            AppPaController::saveRectsImage(rects,img,strImgPath.c_str());
-//        }
-
-    });
-    yoloRpcElement.registerConnector([&] {
-        imageDrawElement.setYoloObjects(yoloRpcElement.getLastScoreRects());
-        triggerElement.setState(yoloRpcElement.getRealNum()>=m_cfg.paAlarmInfo.nAssembleCount);
-
-    });
-
-
-    imageDrawElement.registerConnector([&] {
-        if (appPref.getIntData("show.image") == 1) {
-            ImageShowElement::showImage(to_string(this->m_index), *imageDrawElement.getImage());
-        }
-    });
-
-    registerElement(videoCaptureElement);
-
-    registerElement(yoloRpcElement);
-
-
-    registerElement(imageDrawElement);
-
-    registerElement(triggerElement);
-
-    videoCaptureElement.setOutPutInterval(3);
-
-}
-
-
-
-void AppPaController::setfdfsClient(FastFdsWithLock *p_fdfsClient) {
-    fdfsClient = p_fdfsClient;
-    yoloRpcElement.setFdfs(fdfsClient);
-}
-
-std::string AppPaController::getRtmp() {
-    std::string ret = "";// = videoPublishElement.getPath();
-    size_t pos = ret.find(".flv");
-    ret = ret.substr(0, pos);
-    INFO(ret);
-    return ret;
-}
-//void AppPaController::sendVideoAlarm(bool value)
-//{
-//    ::Alarm::AlarmInfo alarmInfo;
-//    alarmInfo.bAlarm = value;
-//    alarmInfo.strRtsp = m_cfg.camInfo.strRtsp;
-//    alarmInfo.wallNo = m_cfg.paAlarmInfo.nWallNum;
-//    alarmInfo.subWallNo = m_cfg.paAlarmInfo.nWallSubNum;
-//    alarmInfo.windowNo = m_cfg.paAlarmInfo.nWindowNum;
-//    try {
-//        auto server = alarmRpc.getServer();
-//        if(server){
-//            server->AlarmSingle(alarmInfo);
-//        }else{
-//            ERR("sendVideoAlarm falid; server is null");
-//        }
-//    } catch (std::exception& e) {
-//        ERR(e.what());
-//    }
-//}
-
-void AppPaController::openSoundAlarm()
-{
-    try {
-//        auto server = alarmRpc.getServer();
-//        if(server){
-//            server->AlarmSound(appPref.getStringData("pa.identity"),true);
-//        }else{
-//            ERR("openSoundAlarm falid; server is null");
-//        }
-    } catch (std::exception& e) {
-        ERR(e.what());
-    }
-}
-
-void AppPaController::closeSoundAlarm()
-{
-    try {
-//        auto server = alarmRpc.getServer();
-//        if(server){
-//            server->AlarmSound(appPref.getStringData("pa.identity"),false);
-//        }else{
-//            ERR("closeSoundAlarm falid; server is null");
-//        }
-    } catch (std::exception& e) {
-        ERR(e.what());
-    }
-}
-
-void AppPaController::playSound()
-{
-    try {
-//        auto server = soundRpc.getServer();
-//        if(server){
-
-//            server->SoundPlay(m_index,soundInfos);
-//        }else{
-//            ERR("playSound falid; server is null");
-//        }
-    } catch (std::exception& e) {
-        ERR(e.what());
-    }
-}
-
-void AppPaController::stopSound()
-{
-    try {
-//        auto server = soundRpc.getServer();
-//        if(server){
-//            server->SoundStop(m_index);
-//        }else{
-//            ERR("stopSound falid; server is null");
-//        }
-    } catch (std::exception& e) {
-        ERR(e.what());
-    }
-}
-
-
-
-
-//void AppPaController::alarmResultSaveToDB(std::string& imgPath,std::string& videoPath,std::string& curTime)
-//{
-//    try {
-//        auto server = m_SaveAlarmRpc.getServer();
-//        if(server){
-//            ::SaveModule::AlarmInfo iceAlarmInfo;
-//            iceAlarmInfo.nCamID = index;
-//            iceAlarmInfo.nStatus = 0;
-//            iceAlarmInfo.strAlarmDescribe = "invade";
-//            size_t pos = imgPath.find("/static");
-//            iceAlarmInfo.strAlarmImgPath = imgPath.substr(pos,imgPath.length()-pos);
-//            pos = videoPath.find("/static");
-//            iceAlarmInfo.strAlarmVideoPath = videoPath.substr(pos,videoPath.length()-pos);
-//            iceAlarmInfo.strCreateTime = curTime;
-//            server->saveAlarmInfo(iceAlarmInfo);
-//        }else{
-//            ERR("ice alarmSaveToDB falid; server is null");
-//        }
-//    }catch (std::exception& e) {
-//        ERR(e.what());
-//    }
-//}
-
-static int AppPaController::saveRectsImage(const vector<cv::Rect2f> &rects, const cv::Mat &img, const char *path)
-{
-    if(img.rows==0||img.cols==0)return -1;
-    cv::Mat image = img.clone();
-    for(auto& rectf:rects){
-        cv::Rect rect(rectf.x*image.cols,rectf.y*image.rows,rectf.width*image.cols,rectf.height*image.rows);
-        cv::rectangle(image, rect,cv::Scalar(0,0,255),4);
-    }
-    return cv::imwrite(path,image);
-
-}
-
-bool AppPaController::isSaveVideo()
-{
-    return appPref.getIntData("video.save") != 0;
-}
-
-bool AppPaController::isSaveResult()
-{
-    return appPref.getIntData("alarmresult.save") != 0;
-}
-
-bool AppPaController::isSaveImage()
-{
-    return appPref.getIntData("image.save") != 0;
-}
-
-
-
diff --git a/QiaoJiaSystem/PerimeterAlarm/AppPaController.h b/QiaoJiaSystem/PerimeterAlarm/AppPaController.h
deleted file mode 100644
index 4c5a8c2..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/AppPaController.h
+++ /dev/null
@@ -1,168 +0,0 @@
-#ifndef APPPACONTROLLER_H
-#define APPPACONTROLLER_H
-
-#include <basic/pipe/PipeController.h>
-#include <basic/pipe_element/ffmpeg/FfmpegElement.h>
-#include <basic/pipe_element/ImageShowElement.h>
-#include <basic/util/curl/HttpRequestWithCrul.hpp>
-#include "PaImageDrawElement.h"
-#include "../StructureApp/RecordVideoElement.h"
-#include "PaYoloRpcElement.h"
-#include <TriggerElement.h>
-#include <QtCore/QDateTime>
-#include <jsoncpp/json/json.h>
-//#include <basic/rpc/IceRpc.hpp>
-//#include "../Alarm/rpc/Alarm.h"
-//#include "../netsoundbox/rpc/NetSoundBox.h"
-//#include <QtCore/QVector>
-//缃戠粶闊崇閰嶇疆
-struct SoundPlayInfo
-{
-    SoundPlayInfo():nSoundDuration(-1)
-    {}
-    //int nID;
-    std::string strIP;//闊崇IP
-    int nSoundDuration;//澹伴煶闂撮殧鏃堕棿
-    std::string strPath;//澹伴煶璺緞
-};
-//鎽勫儚澶翠俊鎭�
-struct CamInfo
-{
-    int nFps;//甯х巼
-    std::string strCamId;
-    std::string strAdrr;
-    std::string strRtsp;//RTSP鍦板潃
-};
-
-//鎶ヨ淇℃伅
-struct PaAlarmInfo
-{
-//    int nWallNum;//澧欏彿
-//    int nWallSubNum;//瀛愬鍙�
-//    int nWindowNum;//绐楀彛鍙�
-    int nTriggerDelay;//鎶ヨ寮�濮嬪欢鏃舵椂闂撮棿闅�
-    int nAlarmDelay;//鎶ヨ缁撴潫寤舵椂鏃堕棿闂撮殧
-    QString strMaskPath; //alarm maskPath瑙g爜鍣ㄦ姤璀︾殑ROI鍖哄煙灏忓浘璺緞
-    float fSensitivity;//alarm sensitivity鎶ヨ鐨勬娴嬮槇鍊�
-    int nAssembleCount;//鑱氶泦鐨勪汉鏁�
-};
-
-//鑱氶泦淇℃伅
-struct AssembleInfo
-{
-    int nAssembleCount;//鑱氶泦鐨勪汉鏁�
-    float fSensitivity;//AssembleInfo sensitivity鑱氶泦鐨勬娴嬮槇鍊�
-    //std::string strProxy;
-    std::string strMaskPath;// AssembleInfo maskPath鑱氶泦鐨凴OI鍖哄煙灏忓浘璺緞
-    std::vector<SoundPlayInfo> sounds;//缃戠粶闊崇鎾斁淇℃伅
-};
-
-struct RuleWeekInfo
-{
-    RuleWeekInfo()
-    {
-        m_nType = 1;
-        m_strBegin = "";
-        m_strEnd = "";
-    }
-
-    int m_nType; //鍛ㄥ嚑
-    QString m_strBegin;//00:00
-    QString m_strEnd;
-};
-//addcamera閰嶇疆椤�
-struct ControllerConfig
-{
-
-    //NONE neither alarm nor assemble
-    //ALARM alarm
-    //ASSEMBLE Assemble
-
-    //camInfo
-    CamInfo camInfo;//鎽勫儚澶翠俊鎭�
-
-    //alarmInfo
-    PaAlarmInfo paAlarmInfo;//鎶ヨ淇℃伅
-
-    //AssembleInfo
-  //  AssembleInfo assembleInfo;//鑱氶泦淇℃伅
-
-    QVector<RuleWeekInfo> ruleWeekInfoVec;
-
-};
-
-class AppPaController : public PipeController {
-public:
-    /***
-     * 鐢ㄤ簬蹇�熻棰戠粨鏋勫寲
-     * @param folderPath 浠诲姟鏍圭洰褰曪紝鐢ㄤ簬鍋氬叡浜唴瀛榠d
-     * @param json 鍙傛暟涓簉tsp娴佸湴鍧� sdk鏄惁鍚敤鐨勬爣璇�
-     */
-
-    AppPaController(int index, const ControllerConfig& cfg);
-
-    virtual ~AppPaController();
-
-    void sendVideoAlarm(bool value);
-    //閫氱煡鎶ヨ鏈嶅姟鎶ヨ
-    void openSoundAlarm();
-    //閫氱煡鎶ヨ鏈嶅姟鍏抽棴鎶ヨ
-    void closeSoundAlarm();
-    //閫氱煡缃戠粶闊崇鎾斁闊充箰
-    void playSound();
-    //閫氱煡缃戠粶闊崇鍋滄鎾斁闊充箰
-    void stopSound();
-
-    //void alarmResultSaveToDB(std::string&,std::string&,std::string&);
-
-    //淇濆瓨浜轰綋瑁佸壀鍥�
-    static int saveRectsImage(const vector<cv::Rect2f>& rects,const cv::Mat& img,const char* path);
-
-
-    bool isSaveVideo();
-
-    bool isSaveResult();
-
-    bool isSaveImage();
-
-
-    bool getRunning();
-
-    std::string getRtmp();
-
-    void setfdfsClient(FastFdsWithLock *p_fdfsClient);
-
-private:
-    void init();
-
-private:
-    ffmpeg::VideoCaptureElement videoCaptureElement;
-    PaYoloRpcElement yoloRpcElement;
-    PaImageDrawElement imageDrawElement;
-    RecordVideoElement recordVideoElement;
-//    VideoPublishElement videoPublishElement;
-
-    int m_index;
-    std::string m_folderPath;
-    Json::Value m_json_Record;
-
-    Json::FastWriter m_fastWriter;
-    FastFdsWithLock *fdfsClient;
-
-
-    TriggerElement triggerElement;
-    std::atomic<bool> bUp;
-
-    QDateTime m_dt;
-
-
-    const ControllerConfig m_cfg;
-
-  //  NetSoundBox::SoundInfos soundInfos;
-//    IceRpcClient<Alarm::AlarmInterfacePrx> alarmRpc;
-//    IceRpcClient<NetSoundBox::SoundInterfacePrxPtr> soundRpc;
-  //  IceRpcClient<SaveModule::SaveAlarmPrx> m_SaveAlarmRpc;
-
-};
-
-#endif // APPPIPECONTROLLER_H
diff --git a/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt b/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt
deleted file mode 100644
index 43eebdc..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt
+++ /dev/null
@@ -1,120 +0,0 @@
-cmake_minimum_required(VERSION 3.5)
-project(PerimeterAlarm)
-set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE debug)
-add_compile_options(-fPIC)
-add_definitions(-DDEBUG_ERR -DDEBUG_INFO -DTESTCODE -fpermissive)
-
-SET(SOURCES
-    #    TrackingTrigger.cpp
-    PaYoloRpcElement.cpp
-    PaImageDrawElement.cpp
-
-    #    rpc/StructureApp.cpp
-    AppPaController.cpp
-    ../YoloServer/rpc/YoloServer.cpp
-    ../RecordVideo/rpc/RecordVideo.cpp
-    ../RapidStructureApp/TriggerElement.cpp
-    ../StructureApp/TrackingTrigger.cpp
-    ../StructureApp/RecordVideoElement.cpp
-    #    ../Alarm/rpc/Alarm.cpp
-    #   ../netsoundbox/rpc/NetSoundBox.cpp
-
-
-    #    rpc/AlarmInfo.cpp
-
-
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.cpp
-    ../../../BasicPlatForm/basic/util/BASE64/Base64.cpp
-    ../../../BasicPlatForm/basic/util/fastdfs/FastdfsClient.cpp
-    ../../../BasicPlatForm/basic/pipe/TimerElement.cpp
-    ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.cpp
-    ../../../BasicPlatForm/basic/util/curl/HttpRequestWithCrul.hpp
-    ../../../BasicPlatForm/basic/util/net_config/net_config.cpp
-    )
-
-SET(LIBS
-    Ice
-    crypto
-    opencv_world
-    avformat
-    avcodec
-    swresample
-    swscale
-    avutil
-    bz2 dl z
-    Qt5Core
-    pthread
-    jsoncpp
-    cuda
-    cudart
-    cublas
-    curand
-
-    glog
-
-    uuid
-    curl
-    fastcommon
-    fdfsclient
-    Qt5Gui
-    )
-
-include_directories(
-    #    ./rpc
-    ../YoloServer/rpc
-    ../RecordVideo/rpc
-    ../RapidStructureApp/
-
-    #    ../netsoundbox/rpc/
-    #    ../Alarm/rpc
-
-
-    ../../../BasicPlatForm
-    ../../../BasicPlatForm/libs/opencv/include
-    ../../../BasicPlatForm/libs/Ice-3.7.0/include
-    ../../../BasicPlatForm/libs/ffmpeg/include
-    ../../../BasicPlatForm/libs/jsoncpp/include
-
-    ../../../BasicPlatForm/basic/util/net_config/
-    ../../../BasicPlatForm/basic/util/fastdfs/
-    ../../../BasicPlatForm/libs/FastDFS/include
-    ../../../BasicPlatForm/libs/FastDFS/include/fastdfs
-    ../../../BasicPlatForm/libs/FastDFS/include/fastcommon
-
-    ../../../BasicPlatForm/basic/pipe/
-    ../../../BasicPlatForm/libs/crul/include
-    ../../../BasicPlatForm/basic/util/curl/
-    ../../../BasicPlatForm/libs/libuuid/include
-    ../../../BasicPlatForm/libs/glog/include
-    /usr/include/x86_64-linux-gnu/qt5
-)
-
-link_directories(
-    /usr/local/cuda/lib64
-    ../../../BasicPlatForm/libs/Ice-3.7.0/lib64
-    ../../../BasicPlatForm/libs/openssl/lib
-    ../../../BasicPlatForm/libs/opencv/lib
-    ../../../BasicPlatForm/libs/ffmpeg/lib
-    ../../../BasicPlatForm/libs/jsoncpp/lib
-    ../../../BasicPlatForm/libs/FastDFS/lib
-    ../../../BasicPlatForm/libs/libuuid/lib
-
-    ../../../BasicPlatForm/libs/glog/lib
-    ../../../BasicPlatForm/libs/crul/lib
-)
-
-add_executable(${PROJECT_NAME}
-    main.cpp
-    ${SOURCES}
-    )
-
-
-target_link_libraries(${PROJECT_NAME}
-    ${LIBS}
-    )
-
-
diff --git a/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt.user b/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt.user
deleted file mode 100644
index f16a61e..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/CMakeLists.txt.user
+++ /dev/null
@@ -1,484 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.5.1, 2018-11-26T18:16:49. -->
-<qtcreator>
- <data>
-  <variable>EnvironmentId</variable>
-  <value type="QByteArray">{e1ca3822-a9f7-41c4-8b27-ed35006d2304}</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.ActiveTarget</variable>
-  <value type="int">0</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.EditorSettings</variable>
-  <valuemap type="QVariantMap">
-   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
-   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
-   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
-   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
-    <value type="QString" key="language">Cpp</value>
-    <valuemap type="QVariantMap" key="value">
-     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
-    </valuemap>
-   </valuemap>
-   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
-    <value type="QString" key="language">QmlJS</value>
-    <valuemap type="QVariantMap" key="value">
-     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
-    </valuemap>
-   </valuemap>
-   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
-   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
-   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
-   <value type="int" key="EditorConfiguration.IndentSize">4</value>
-   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
-   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
-   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
-   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
-   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
-   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
-   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
-   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
-   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
-   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
-   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
-   <value type="int" key="EditorConfiguration.TabSize">8</value>
-   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
-   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
-   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
-   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
-   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
-   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.PluginSettings</variable>
-  <valuemap type="QVariantMap"/>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.0</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">妗岄潰</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">妗岄潰</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{9141802c-62f7-4eed-b036-21940bb88d33}</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">2</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <valuelist type="QVariantList" key="CMake.Configuration"/>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/basic/c++/Qt/QiaoJiaSystem/build-StructureApp-unknown-Default</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">all</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">clean</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呯悊</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Default</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Default</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=Debug</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/basic/c++/Qt/QiaoJiaSystem/build-StructureApp-unknown-Debug</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">all</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">clean</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呯悊</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=Release</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/basic/c++/Qt/QiaoJiaSystem/build-StructureApp-unknown-Release</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">all</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">clean</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呯悊</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=RelWithDebInfo</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/basic/c++/Qt/QiaoJiaSystem/build-StructureApp-unknown-Release with Debug Information</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">all</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">clean</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呯悊</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release with Debug Information</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.4">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=MinSizeRel</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/basic/c++/Qt/QiaoJiaSystem/build-StructureApp-unknown-Minimum Size Release</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">all</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鏋勫缓</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
-       <value type="QString">clean</value>
-      </valuelist>
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">CMake Build</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">娓呯悊</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Minimum Size Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
-   </valuemap>
-   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">5</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">閮ㄧ讲</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">鍦ㄦ湰鍦伴儴缃�</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
-    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
-    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
-    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
-    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
-    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
-    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
-    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
-    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
-    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
-     <value type="int">0</value>
-     <value type="int">1</value>
-     <value type="int">2</value>
-     <value type="int">3</value>
-     <value type="int">4</value>
-     <value type="int">5</value>
-     <value type="int">6</value>
-     <value type="int">7</value>
-     <value type="int">8</value>
-     <value type="int">9</value>
-     <value type="int">10</value>
-     <value type="int">11</value>
-     <value type="int">12</value>
-     <value type="int">13</value>
-     <value type="int">14</value>
-    </valuelist>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">StructureApp</value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory.default">/home/basic/c++/Qt/QiaoJiaSystem/build</value>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">StructureApp</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.StructureApp</value>
-    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
-    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
-    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
-    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
-    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
-    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
-    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
-    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
-    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
-    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
-    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
-     <value type="int">0</value>
-     <value type="int">1</value>
-     <value type="int">2</value>
-     <value type="int">3</value>
-     <value type="int">4</value>
-     <value type="int">5</value>
-     <value type="int">6</value>
-     <value type="int">7</value>
-     <value type="int">8</value>
-     <value type="int">9</value>
-     <value type="int">10</value>
-     <value type="int">11</value>
-     <value type="int">12</value>
-     <value type="int">13</value>
-     <value type="int">14</value>
-    </valuelist>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">AppPipeControllerTest</value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory.default">/home/basic/c++/Qt/QiaoJiaSystem/build</value>
-    <value type="int" key="PE.EnvironmentAspect.Base">-1</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">AppPipeControllerTest</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.AppPipeControllerTest</value>
-    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
-    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
-    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
-    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
-    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
-    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
-    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
-    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
-    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
-    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
-    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
-    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
-    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
-    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
-     <value type="int">0</value>
-     <value type="int">1</value>
-     <value type="int">2</value>
-     <value type="int">3</value>
-     <value type="int">4</value>
-     <value type="int">5</value>
-     <value type="int">6</value>
-     <value type="int">7</value>
-     <value type="int">8</value>
-     <value type="int">9</value>
-     <value type="int">10</value>
-     <value type="int">11</value>
-     <value type="int">12</value>
-     <value type="int">13</value>
-     <value type="int">14</value>
-    </valuelist>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">PerimeterAlarm</value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory.default">/home/basic/c++/Qt/QiaoJiaSystem/build</value>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">PerimeterAlarm</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.PerimeterAlarm</value>
-    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">3</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.TargetCount</variable>
-  <value type="int">1</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
-  <value type="int">18</value>
- </data>
- <data>
-  <variable>Version</variable>
-  <value type="int">18</value>
- </data>
-</qtcreator>
diff --git a/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.cpp b/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.cpp
deleted file mode 100644
index c466a20..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "PaImageDrawElement.h"
-#include <basic/util/opencv/CvUtil.h>
-
-PaImageDrawElement::PaImageDrawElement() {
-
-}
-
-void PaImageDrawElement::darwProperty(cv::Mat &image, string key, string value, int x, int y) {
-    cv::putText(image, key + ": " + value, cv::Point(x, y), cv::HersheyFonts::FONT_HERSHEY_PLAIN, 1.5,
-                cv::Scalar(255, 255, 0), 2);
-}
-
-void PaImageDrawElement::processImage(cv::Mat &image) {
-
-    auto yoloObjectsData = yoloObjects.getData();
-
-  //  {\"x\":4,\"y\":6},{\"x\":4,\"y\":537},{\"x\":955,\"y\":536},{\"x\":951,\"y\":9},{\"x\":4,\"y\":6}]
-        CvPoint spoint1[5] = {{4,6},{4,537},{955,536},{951,9},{4,6}};
-
-    cv::Rect rect(100,6,1700,1200);
-    cv::rectangle(image, rect, cv::Scalar(0, 0, 255), 2);
-    for (auto yoloObj: yoloObjectsData) {
-        auto rect = CvUtil::zoomRect(yoloObj.rect, 1, 1);
-       // Scalar scalar;
-        if(yoloObj.id>=0)
-        {
-            if(yoloObj.isMask)
-            {
-                //scalar=cv::Scalar(0, 0, 255);
-                  cv::rectangle(image, rect, cv::Scalar(0, 0, 255), 2);
-            }
-            else
-            {
-                //scalar=cv::Scalar(255, 0, 0);
-                 cv::rectangle(image, rect, cv::Scalar(255, 0, 0), 2);
-            }
-        }
-        else
-        {
-            // scalar=cv::Scalar(0, 255, 255);
-              cv::rectangle(image, rect, cv::Scalar(0, 255, 255), 2);
-        }
-        //cv::rectangle(image, rect, scalar, 2);
-        int i = 0;
-        for (auto &property:yoloObj.properties) {
-            darwProperty(image, property.first, property.second, rect.x + rect.width, rect.y + 40 * i++);
-        }
-    }
-}
-
-
-
-void PaImageDrawElement::setYoloObjects(std::vector<ScoredRect> value) {
-    yoloObjects = value;
-}
diff --git a/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.h b/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.h
deleted file mode 100644
index 0a7e51c..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/PaImageDrawElement.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef PAIMAGEDRAWELEMENT_H
-#define PAIMAGEDRAWELEMENT_H
-
-#include <YoloServer.h>
-#include <basic/pipe_element/ImageFactoryElement.h>
-#include <basic/core/DoubleBufferedData.h>
-#include "../StructureApp/TrackingTrigger.h"
-
-class PaImageDrawElement : public ImageFactoryElement {
-public:
-    PaImageDrawElement();
-
-    // ImageFactoryElement interface
-
-
-    void setYoloObjects(std::vector<ScoredRect> value);
-
-private:
-    virtual void processImage(cv::Mat &) override;
-
-    void darwProperty(cv::Mat &image, string key, string value, int x, int y);
-
-private:
-    DoubleBufferedData<std::vector<ScoredRect>> yoloObjects;
-};
-
-
-#endif // IMAGEDRAWELEMENT_H
diff --git a/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.cpp b/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.cpp
deleted file mode 100644
index d1e5bc8..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-#include "PaYoloRpcElement.h"
-#include <basic/util/app/AppPreference.hpp>
-#include <QtCore/QSharedMemory>
-#include <QtCore/QString>
-#include <basic/timer_counter/Clocktimer.h>
-#include <basic/util/opencv/CvUtil.h>
-
-#include "AppPaController.h"
-#include <basic/db/Elasticsearch/EsDBTool.h>
-#include <uuid/uuid.h>
-#include <jsoncpp/json/json.h>
-
-#include <basic/db/ES/es/ManagerEsDB.h>
-#include <QtCore/QJsonDocument>
-#include <QtCore/QJsonObject>
-
-
-PaYoloRpcElement::PaYoloRpcElement(string shareMemoryName) :
-    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
-              appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr),
-    mRealNum(0),mCfg(nullptr),
-    trackingTrigger(nullptr) {
-    sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
-//    DBG(shareMemoryName);
-    //1520 x 2688   1080 x 1920 //2560 * 1440 * 4
-    if (!sharedMemory->create(4608 * 2592 * 4)) {
-        sharedMemory->attach();
-    }
-    trackingTrigger = new TrackingTrigger(0.5);
-    try {
-        auto server = rpcClient.getServer();
-        cocoData = server->getCocoData();
-    }
-    catch (std::exception &e) {
-        ERR(e.what())
-    }
-}
-
-PaYoloRpcElement::~PaYoloRpcElement() {
-    if (sharedMemory) {
-        delete sharedMemory;
-    }
-    if (trackingTrigger) {
-        delete trackingTrigger;
-    }
-    if (mCfg)
-    {
-        delete mCfg;
-        mCfg=nullptr;
-    }
-    mPolygon.clear();
-}
-
-void PaYoloRpcElement::threadFunc() {
-//    ClockTimer ct("YoloRpcElement::threadFunc");.
-    triggerMats.clear();
-    int num=0;
-    bool bInWeekTime=false;
-    if(mCfg==nullptr)
-    {
-        return;
-    }
-
-    try {
-        auto server = rpcClient.getServer();
-        if (!server) {
-            ERR("server is null");
-            return;
-        }
-        objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
-        if (objs.size() <= 0) {
-            trackingTrigger->triggerLine();
-            return;
-        }
-        string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
-//        float t_det_sc =
-//            appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det");
-
-        bInWeekTime=isInWeekRuleTime();
-
-        for (auto &obj: objs) {
-            if (obj.type != 0)
-                continue;
-            if(obj.prob < ((1-mCfg->paAlarmInfo.fSensitivity)/2+0.5))continue;
-
-
-            ScoredRect scoredRect;
-
-            int x = obj.rcObj.left * image.cols;
-            int y = obj.rcObj.top * image.rows;
-            int w = (obj.rcObj.right - obj.rcObj.left) * image.cols;
-            int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows;
-            scoredRect.rect = cv::Rect(x, y, w, h);
-            QRect rect(x,y,w,h);
-            QPoint center = rect.center();
-            scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0;
-
-            if(mPolygon.containsPoint(center,Qt::OddEvenFill))
-            {
-                scoredRect.isMask=true;
-                if(bInWeekTime)
-                   num++;
-            }
-
-            if ( trackingTrigger->triggerOnce(scoredRect)) {
-
-                DBG("x="<<center.x()<<"y="<<center.y());
-                trackingTrigger->getLastRect().isMask= scoredRect.isMask;
-                trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
-                trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
-                auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
-                triggerMats.push_back(t_image);
-
-                std::string strImgUrl = "http://";
-                if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
-                    fdfsClient->rwLock.rdlock();
-                    std::vector<unsigned char> buffer;
-                    CvUtil::cvMat2Buffer(t_image, buffer);
-                    std::string strImgUrlTmp = "";
-                    fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
-                    strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
-                    fdfsClient->rwLock.unlock();
-                }
-
-                //浣跨敤鐨勬椂鍊欏皢false鏀逛负ture
-                if(0)
-                {
-                    //#todo
-                    EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
-
-                    string str_uuid;
-                    uuid_t t_uuid;
-                    char str[36];
-                    uuid_generate(t_uuid);
-                    uuid_unparse(t_uuid, str);
-                    str_uuid = str;
-
-//                jsonyolo.insert("HardCamId","");//纭洏鎽勫儚鏈篿d  锛燂紵锛熸嬁涓嶅埌
-//                jsonyolo.insert("ChannlId","");//閫氶亾id 锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("Time","");//鏃堕棿 鍙互鑾峰彇褰撳墠鏃堕棿 鏄庣‘鏃堕棿鏄幏鍙栧綋鍓嶇殑杩樻槸浼犺繃鏉ョ殑  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("ImgUrl","");//鍥惧儚img璺緞  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("Image","");//蹇収  锛燂紵锛� 鎷夸笉鍒�
-//                jsonyolo.insert("DataType",obj.type);//妫�娴嬬殑绫诲瀷
-//                jsonyolo.insert("Score",obj.prob);//妫�娴嬬殑寰楀垎
-
-                    Json::Value t_json;
-                    t_json["Id"] = str_uuid; //涓婚敭
-//#todo
-
-                    t_json["picName"] = "wait todo";
-                    t_json["DataType"] = cocoData[obj.type];
-                    t_json["Score"] = obj.prob;
-
-                    t_json["personPicUrl"] = "wait todo";//浜哄憳鍥剧墖 store
-                    t_json["likeDate"] = AppUtil::getTimeSecString();//姣旇緝鏃堕棿
-                    t_json["picAddress"] = getProperty("str_addr");//鎶撴媿鍦板潃
-                    t_json["picMaxUrl"] = "wait todo";//澶у浘璺緞
-                    t_json["picLocalUrl"] = "wait todo";//鏈湴璺緞
-                    t_json["picSmUrl"] = strImgUrl;//浜哄憳鎶撳皬鍥�
-
-//                    faceRpcElement.setProperty("frame_number", frame_number);
-                    t_json["picDate"] = getProperty("time");
-                    t_json["content"] = "wait todo";
-                    t_json["viType"] = "2";//鍙湁4绉嶇被鍨� 1:personface 2:personbody 3:car 4:bicycle 5:none 鏈煡绫诲瀷
-                    t_json["personIsHub"] = "4";//1: 鎶ヨ  2: 鍙枒  3: 瀹夊叏  4: 鏈煡
-                    t_json["videoIp"] = getProperty("local_ip");//褰撳墠鏈嶅姟鍣↖P鍦板潃
-
-
-                    t_json["videoNum"] = getProperty("path");//Vide缂栧彿 澶栭敭
-                    t_json["videoReqNum"] = getProperty("dev_id");//Video璁惧缂栧彿
-                    t_json["ChannlId"] = getProperty("ch_id");//閫氶亾id
-                    t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
-
-                    t_json["indeviceid"] = appPref.getStringData("fxDevID");
-                    t_json["indevicename"] = appPref.getStringData("fxDevNAME");
-
-                    DBG(t_json.toStyledString());
-                    bool retface = false;
-                    retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid);
-                    if (retface) {
-                        INFO("facedb success");
-                    } else {
-                        ERR("facedb fail");
-                    }
-                }
-            }
-        }
-        mRealNum=num;
-        trackingTrigger->triggerLine();
-        if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
-        fireConnectors();
-    } catch (std::exception &e) {
-        ERR(e.what())
-    }
-}
-
-::YoloDetect::ObjInfos PaYoloRpcElement::getObjects() const {
-    return objs;
-}
-
-std::vector<cv::Mat> PaYoloRpcElement::getTriggerMats() {
-    return triggerMats;
-}
-
-std::vector<ScoredRect> PaYoloRpcElement::getLastScoreRects() const {
-    return trackingTrigger->getLastScoreRects();
-}
-
-void PaYoloRpcElement::setImage(const cv::Mat &value) {
-    if (value.size != image.size) {
-        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
-    }
-    value.copyTo(image);
-}
-
-
-bool PaYoloRpcElement::isInWeekRuleTime()
-{
-
-    int nWeek = QDate::currentDate().dayOfWeek();
-    //QString strWeek = getWeekString(nWeek);
-    int size=mCfg->ruleWeekInfoVec.size();
-    for(int i = 0;i < size;++i)
-    {
-        if(mCfg->ruleWeekInfoVec[i].m_nType == nWeek)
-        {
-            QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
-            if(strCurrent >= mCfg->ruleWeekInfoVec[i].m_strBegin && strCurrent <= mCfg->ruleWeekInfoVec[i].m_strEnd)
-            {
-                    return true;
-            }
-        }
-    }
-    return false;
-}
-
-QJsonArray PaYoloRpcElement::getJsonArrayFromQString(const QString strJson)
-{
-    QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
-    if( jsonDocument.isNull() ){
-        //DBG("please check the string"<< strJson.toLocal8Bit());
-        return QJsonArray();
-    }
-    QJsonArray jsonArray = jsonDocument.array();
-    return jsonArray;
-}
-
- void PaYoloRpcElement::SetRuleCfg(const ControllerConfig* cfg)
- {
-    mCfg=cfg;
-    if(mCfg)
-    {
-
-        QJsonArray arrayAreas = getJsonArrayFromQString(mCfg->paAlarmInfo.strMaskPath);
-        if(arrayAreas.isEmpty())
-        {
-            return;//do not detect
-        }
-        for(int i = 0;i < arrayAreas.size();++i)
-        {
-            QJsonValue jsonValue = arrayAreas[i];
-            QJsonObject obj = jsonValue.toObject();
-            int x = obj.value("x").toInt();
-            int y = obj.value("y").toInt();
-            mPolygon<<(QPoint(x,y));
-
-        }
-
-    }
-
-
- }
- int PaYoloRpcElement::getRealNum() const
- {
-     return mRealNum;
- }
diff --git a/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.h b/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.h
deleted file mode 100644
index fe666d3..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/PaYoloRpcElement.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef PAYOLORPCELEMENT_H
-#define PAYOLORPCELEMENT_H
-
-#include <YoloServer.h>
-#include <basic/pipe/PipeElement.h>
-#include <basic/rpc/IceRpc.hpp>
-#include <opencv2/opencv.hpp>
-#include <basic/util/fastdfs/FastFds.hpp>
-#include "../StructureApp/TrackingTrigger.h"
-#include <QtCore/QVector>
-#include <QtCore/QJsonArray>
-#include <QtGui/qpolygon.h>
-class QSharedMemory;
-class ControllerConfig;
-class PaYoloRpcElement : public basic::PipeElement {
-public:
-    PaYoloRpcElement(string);
-
-    ~PaYoloRpcElement();
-
-    void setImage(const cv::Mat &value);
-
-    int getRealNum() const;
-    void SetRuleCfg(const ControllerConfig* cfg);
-
-    ::YoloDetect::ObjInfos getObjects() const;
-
-    std::vector<cv::Mat> getTriggerMats();
-
-    std::vector<ScoredRect> getLastScoreRects() const;
-
-
-
-    void setFdfs(FastFdsWithLock *p_fdfsClient) {
-        fdfsClient = p_fdfsClient;
-    }
-
-private:
-    virtual void threadFunc() override;
-    bool isInWeekRuleTime();
-    QJsonArray getJsonArrayFromQString(const QString strJson);
-private:
-    IceRpcClient<YoloDetect::YoloDetectServerPrx> rpcClient;
-    cv::Mat image;
-    QSharedMemory *sharedMemory;
-    ::YoloDetect::ObjInfos objs;
-    TrackingTrigger *trackingTrigger;
-    std::vector<cv::Mat> triggerMats;
-    ::YoloDetect::stringData cocoData;
-    FastFdsWithLock *fdfsClient;
-    cv::Mat mask,numMask;
-    QString mStrArea;
-    QPolygon mPolygon;
-    int mRealNum;
-    ControllerConfig* mCfg;
-
-};
-
-#endif // YOLORPCELEMENT_H
diff --git a/QiaoJiaSystem/PerimeterAlarm/main.cpp b/QiaoJiaSystem/PerimeterAlarm/main.cpp
deleted file mode 100644
index 868ca18..0000000
--- a/QiaoJiaSystem/PerimeterAlarm/main.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include <thread>
-#include "AppPaController.h"
-#include <basic/util/file/FileUtil.h>
-#include <basic/util/app/AppPreference.hpp>
-#include <basic/debug/Debug.h>
-#include <basic/util/app/AppConfig.h>
-using namespace std;
-
-
-int main(int argc, char **argv) {
-    SAVE_APP_ARGS;
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
-#ifdef GLOG
-    ENABLEGLOG("./log/");
-#endif
-
-//    std::string src_path = "/home/bsk/development/c++/Qt/QiaoJiaSystem/build/cut/123456/34/201808/28/123456-34-201808-20180828090100";
-    std::string src_path = "/home/basic/瑙嗛/test";
-
-
-    appPref.setIntData("gpu.index", 0);
-    appPref.setIntData("show.image", 1);
-
-    //yolo server
-    appPref.setStringData("yolo.proxy", "yoloServer");
-    //#todo
-    appPref.setStringData("yolo.ip", "");
-    appPref.setIntData("yolo.port", 10003);
-
-
-
-
-
-
-
-    //loopRecord server
-    appPref.setStringData("loopRecord.proxy", "LoopRecordVideoServer");
-    //#todo
-    appPref.setStringData("loopRecord.ip", "");
-    appPref.setIntData("loopRecord.port", 10010);
-//rpcClient(appPref.getStringData("loopRecord.proxy"), appPref.getStringData("loopRecord.ip"), appPref.getLongData("loopRecord.port"),"tcp"),
-
-    appPref.setStringData("ipAdd", "192.168.1.185");
-    appPref.setIntData("ipPort", 9200);
-    Json::Value json;
-
-    //split sdks enable
-    //#todo other sdk
-
-   // json["face.enable"] = "1";
-    json["yolo.enable"] = "1";
-    json["rtsp"] = "rtsp://admin:a1234567@192.168.1.188:554/h264/ch1/main/av_stream";
-//    json["rtsp"] = "rtsp://admin:a1234567@192.168.1.188:554/h264/ch1/main/av_stream";
-//    json["rtsp"] = "/home/bsk/test/realtime/test123/201809/27/test123-2018092717/2018-09-27 17:20:57.mp4";
-
-
-    FastFdsWithLock fdfsClient;
-//    fdfsClient.fastFds = new FastFds;
-
-    //#todo from path get file list
-    file_filter_type filter = [](const char *dirName, const char *dirent) {
-        return (strstr(dirent, ".mp4") != nullptr);// add format
-    };
-    std::vector<std::string> vec = for_each_file(src_path, filter);
-//    while (true) {
-    auto size = vec.size();
-//    int size = 1;
-    int pos = 0;
-
-    QVector<RuleWeekInfo> ruleWeekVec;
-    for(int i=1;i<=7;++i)
-    {
-         RuleWeekInfo info;
-         info.m_nType=i;
-         info.m_strBegin="00:00";
-         info.m_strEnd="23.59";
-         ruleWeekVec.push_back(info);
-    }
-
-    ControllerConfig cfg;
-    cfg.ruleWeekInfoVec.swap(ruleWeekVec);
-    cfg.camInfo.strRtsp="rtsp://admin:a1234567@192.168.1.188:554/h264/ch1/main/av_stream";
-    cfg.camInfo.strCamId="1";
-    cfg.paAlarmInfo.nTriggerDelay=25;
-    cfg.paAlarmInfo.nAlarmDelay=5;
-  //  cfg.paAlarmInfo.strMaskPath="/home/basic/aaa/1.png";
-     cfg.paAlarmInfo.strMaskPath="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]";
-    cfg.paAlarmInfo.fSensitivity=0.5;
-    cfg.paAlarmInfo.nAssembleCount=2;
-
-
-
-    AppPaController _AppPaController(1, cfg);
-//    AppPipeController _AppPipeController(src_path, json);
-    _AppPaController.setfdfsClient(&fdfsClient);
-//    for (; pos < size;) {
-//
-//        //#todo
-//        _AppPipeController.resetVideoCapturePath(vec[pos++]);
-//        _AppPipeController.resetVideoCapturePath(
-//            "/home/basic/work/qiaojia/cut/DS-7808N-SN0820161208AARR691369356WCVU/34/201810/11/DS-7808N-SN0820161208AARR691369356WCVU-34-20181011090000/2018-10-11 09:48:05.mp4");
-    _AppPaController.start();
-    while (_AppPaController.getRunning()) {
-        usleep(40000);
-    }
-    _AppPaController.stop();
-    _AppPaController.wait();
-    DBG("finish file");
-
-    getchar();
-
-    return 0;
-}
diff --git a/QiaoJiaSystem/RecordVideo/CMakeLists.txt b/QiaoJiaSystem/RecordVideo/CMakeLists.txt
deleted file mode 100644
index 732118d..0000000
--- a/QiaoJiaSystem/RecordVideo/CMakeLists.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-cmake_minimum_required(VERSION 3.5)
-project(RecordVideo)
-set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE debug)
-find_package(Qt5Core)
-add_definitions(-DDEBUG_ERR -DDEBUG_INFO)
-add_definitions(-DGLOG)
-add_compile_options(-fPIC)
-
-SET(SOURCES
-    rpc/RecordVideo.cpp
-    RecordVideoI.cpp
-    ImageGrabberI.cpp
-    LoopRecordVideoI.cpp
-    LoopVideoRecorder.cpp
-    ../VideoServer/QiaoJia/DB/LDBTool.cpp
-    ./VideoRecorder.cpp
-    ./CommonFFmpegFunc.hpp
-    ../../../BasicPlatForm/basic/util/opencv/CvUtil.cpp
-    ../../../BasicPlatForm/basic/util/app/AppConfig.h
-    ../../../BasicPlatForm/basic/util/app/AppPreference.hpp
-    ../../../BasicPlatForm/basic/util/fastdfs/FastdfsClient.cpp
-    ../../../BasicPlatForm/basic/pipe/TimerElement.cpp
-    )
-
-SET(LIBS
-    glog
-    Ice
-    opencv_world
-    avformat
-    avcodec
-    swresample
-    swscale
-    avutil
-    bz2 dl z
-    Qt5Core
-    pthread
-    fastcommon
-    fdfsclient
-    jsoncpp
-    Qt5Core
-    Qt5Sql
-    uuid
-    )
-
-include_directories(
-    ./rpc
-    ../../../BasicPlatForm
-    ../../../BasicPlatForm/libs/opencv/include
-    ../../../BasicPlatForm/libs/Ice-3.7.0/include
-    ../../../BasicPlatForm/libs/ffmpeg/include
-    ../../../BasicPlatForm/libs/FastDFS/include/fastcommon
-    ../../../BasicPlatForm/libs/FastDFS/include/fastdfs
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/ffmpegRecoder
-    ../../../BasicPlatForm/basic/pipe
-    ../../../BasicPlatForm/libs/jsoncpp/include
-    ../../../BasicPlatForm/libs/glog/include
-    ../../../BasicPlatForm/libs/libuuid/include
-
-    /usr/include/x86_64-linux-gnu/qt5
-    /usr/include/x86_64-linux-gnu/qt5/QtCore/
-    /usr/include/x86_64-linux-gnu/qt5/QtSql/
-    #glog
-    ../../../BasicPlatForm/libs/glog/include
-)
-
-link_directories(
-    #glog
-    ../../../BasicPlatForm/libs/glog/lib
-    ../../../BasicPlatForm/libs/Ice-3.7.0/lib64
-    ../../../BasicPlatForm/libs/opencv/lib
-    ../../../BasicPlatForm/libs/ffmpeg/lib
-    ../../../BasicPlatForm/libs/FastDFS/lib
-    ../../../BasicPlatForm/libs/openssl/lib
-    ../../../BasicPlatForm/libs/jsoncpp/lib
-    ../../../BasicPlatForm/libs/libuuid/lib
-)
-
-
-add_executable(${PROJECT_NAME}
-    main.cpp
-    ${SOURCES}
-    )
-
-target_link_libraries(${PROJECT_NAME}
-    ${LIBS}
-    )
diff --git a/QiaoJiaSystem/RecordVideo/CommonFFmpegFunc.hpp b/QiaoJiaSystem/RecordVideo/CommonFFmpegFunc.hpp
deleted file mode 100644
index 9e4e825..0000000
--- a/QiaoJiaSystem/RecordVideo/CommonFFmpegFunc.hpp
+++ /dev/null
@@ -1,264 +0,0 @@
-#ifndef COMMONFFMPEGFUNC_HPP
-#define COMMONFFMPEGFUNC_HPP
-
-#include <basic/debug/Debug.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <libavcodec/avcodec.h>
-#include <libavdevice/avdevice.h>
-#include <libavformat/avformat.h>
-#include <libavfilter/avfilter.h>
-#include <libavutil/avutil.h>
-#include <libswscale/swscale.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-
-
-#ifdef __cplusplus
-}
-#endif
-
-class CommonFFmpeg
-{
-public:
-    CommonFFmpeg():m_pInFmtCtx(nullptr),m_pInVideoStream(nullptr),m_pDict(nullptr){}
-    ~CommonFFmpeg(){}
-
-public:
-    void init()
-    {
-        av_register_all();
-        avformat_network_init();
-    }
-    int rtspInputOpen(const char* rtsp)
-    {
-        av_dict_set(&m_pDict, "rtsp_transport", "tcp", 0);
-        int ret = avformat_open_input(&m_pInFmtCtx, rtsp, NULL, &m_pDict);
-        if (ret!=0)
-        {
-            fprintf(stderr, "could not open input file, ret: %d,info: %x\n",ret,AVERROR(ret));
-            return ret;
-        }
-        ret = avformat_find_stream_info(m_pInFmtCtx, NULL);
-        if (ret<0)
-        {
-            fprintf(stderr, "could not find stream info\n");
-            return ret;
-        }
-
-        /* find first video stream */
-        for (unsigned i=0; i<m_pInFmtCtx->nb_streams; i++)
-        {
-            if (m_pInFmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
-            {
-                m_pInVideoStream = m_pInFmtCtx->streams[i];
-                break;
-            }
-        }
-        if (m_pInVideoStream == NULL)
-        {
-            fprintf(stderr, "didn't find any video stream\n");
-            return -1;
-        }
-        return 0;
-    }
-    void rtspInputClose()
-    {
-        if(m_pInFmtCtx!=nullptr)
-            avformat_close_input(&m_pInFmtCtx);
-        if(m_pDict!=nullptr)
-            av_dict_free(&m_pDict);
-    }
-
-    void* rtspCreatePkg()
-    {
-        //g_pkg.lock();
-        mutex().lock();
-        AVPacket* pkt = nullptr;
-        try{pkt=new AVPacket();av_init_packet(pkt);}
-        catch (...){if(pkt!=nullptr){delete pkt;pkt=nullptr;}}
-        //g_pkg.unlock();
-        mutex().unlock();
-        return pkt;
-    }
-    void rtspDestroyPkg(void* packet)
-    {
-        mutex().lock();
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            av_free_packet(pkg);
-            delete pkg;
-            pkg = nullptr;
-        }
-        mutex().unlock();
-    }
-
-    int rtspReadPkg(void* packet)
-    {
-        mutex().lock();
-        int ret = -1;
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            ret = av_read_frame(m_pInFmtCtx, pkg);
-        }
-        mutex().unlock();
-        return ret;
-    }
-
-    void* getRtspStream()
-    {
-        return (void*)m_pInVideoStream;
-    }
-
-    int fileOutOpen(const char* filename,void* inStream)
-    {
-        AVStream* pInstream = (AVStream*)inStream;
-        if(pInstream==nullptr)
-        {DBG("instream is null");return -1;}
-        int ret = avformat_alloc_output_context2(&m_pOutFmtCtx, NULL, NULL, filename);
-        if(ret<0)
-        {
-            fprintf(stderr, "avformat_alloc_output_context2 failed, errorCode: %d\n",AVERROR(ret));
-            return -1;
-        }
-        /*
-        * since all input files are supposed to be identical (framerate, dimension, color format, ...)
-        * we can safely set output codec values from first input file
-        */
-        m_pOutVideo_stream = avformat_new_stream(m_pOutFmtCtx, NULL);
-        {
-            AVCodecContext *c;
-            c = m_pOutVideo_stream->codec;
-            c->bit_rate = 400000;
-            c->codec_id = pInstream->codec->codec_id;
-            c->codec_type = pInstream->codec->codec_type;
-            c->time_base.num = pInstream->time_base.num;
-            c->time_base.den = pInstream->time_base.den;
-            fprintf(stderr, "time_base.num = %d time_base.den = %d\n", c->time_base.num, c->time_base.den);
-            c->width = pInstream->codec->width;
-            c->height = pInstream->codec->height;
-            c->pix_fmt = pInstream->codec->pix_fmt;
-            printf("%d %d %d", c->width, c->height, c->pix_fmt);
-            c->flags = pInstream->codec->flags;
-            c->flags |= CODEC_FLAG_GLOBAL_HEADER;
-            c->me_range = pInstream->codec->me_range;
-            c->max_qdiff = pInstream->codec->max_qdiff;
-
-            c->qmin = pInstream->codec->qmin;
-            c->qmax = pInstream->codec->qmax;
-
-            c->qcompress = pInstream->codec->qcompress;
-        }
-        ret =avio_open(&m_pOutFmtCtx->pb, filename, AVIO_FLAG_WRITE);
-        if(ret<0)
-        {
-            fprintf(stderr, "could not find stream info, errorCode: %d\n",AVERROR(ret));
-            return -1;
-        }
-
-        avformat_write_header(m_pOutFmtCtx, NULL);
-    }
-
-    void fileOutClose()
-    {
-        av_write_trailer(m_pOutFmtCtx);
-        avio_close(m_pOutFmtCtx->pb);
-        avcodec_close(m_pOutFmtCtx->streams[0]->codec);
-        av_freep(&m_pOutFmtCtx->streams[0]->codec);
-        av_freep(&m_pOutFmtCtx->streams[0]);
-
-        av_free(m_pOutFmtCtx);
-        m_pOutFmtCtx = nullptr;
-    }
-
-    int fileWritePkg(void* packet)
-    {
-        mutex().lock();
-        int ret = -1;
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            //av_interleaved_write_frame(thisPtr->m_pOutFmtCtx, &i_pkt);
-            ret = av_write_frame(m_pOutFmtCtx, pkg);
-        }
-        mutex().unlock();
-        return ret;
-    }
-
-    bool isKeyFrame(void* packet)
-    {
-        bool ret = false;
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            if(pkg->flags&AV_PKT_FLAG_KEY) ret = true;
-        }
-        return ret;
-    }
-
-    long int getPkgDts(void* packet)
-    {
-        long int ret = 0;
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            ret = pkg->dts;
-        }
-        return ret;
-    }
-    long int getPkgPts(void* packet)
-    {
-        long int ret = 0;
-        if(packet!=nullptr)
-        {
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            ret = pkg->pts;
-        }
-        return ret;
-    }
-
-    void conversion(void* packet,const long int& firstKeyPts,const long int& firstKeyDts,void* inVideoStream)
-    {
-        mutex().lock();
-        if((packet!=nullptr)&&(inVideoStream!=nullptr))
-        {
-            AVStream* inStream = (AVStream*)inVideoStream;
-            AVPacket* pkg = static_cast<AVPacket*>(packet);
-            pkg->pts -= firstKeyPts;
-            pkg->dts -= firstKeyDts;
-            pkg->pts = av_rescale_q_rnd(pkg->pts, inStream->time_base,
-                                         m_pOutVideo_stream->time_base,
-                                         (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
-            pkg->dts = av_rescale_q_rnd(pkg->dts, inStream->time_base,
-                                         m_pOutVideo_stream->time_base,
-                                         (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
-            pkg->duration = av_rescale_q(pkg->duration, inStream->time_base,
-                                          m_pOutVideo_stream->time_base);
-            pkg->pos = -1;
-        }
-        mutex().unlock();
-    }
-
-private:
-    AVFormatContext * m_pInFmtCtx;
-    AVStream *m_pInVideoStream;
-    AVDictionary *m_pDict;
-
-    AVFormatContext *m_pOutFmtCtx;
-    AVStream *m_pOutVideo_stream;
-    //static std::mutex g_pkg;
-    inline static int& n() { static int tn = 0; return tn;}
-
-    inline static std::mutex& mutex(){static std::mutex mtx;return mtx;}
-
-};
-#endif
-//std::mutex CommonFFmpeg::g_pkg;
diff --git a/QiaoJiaSystem/RecordVideo/ImageGrabberI.cpp b/QiaoJiaSystem/RecordVideo/ImageGrabberI.cpp
deleted file mode 100644
index 59fe9f2..0000000
--- a/QiaoJiaSystem/RecordVideo/ImageGrabberI.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "ImageGrabberI.h"
-#include <functional>
-#include <algorithm>
-#include <dirent.h>
-#include <basic/debug/Debug.h>
-#include <cstring>
-#include <opencv2/opencv.hpp>
-#include <QtCore/QDateTime>
-#include <basic/util/opencv/CvUtil.h>
-#include <basic/util/app/AppPreference.hpp>
-
-//鑾峰彇鐩綍涓嬫墍鏈夋枃浠剁殑鍚嶇О
-std::vector<std::string> forEachFile(const std::string &dir_name) {
-    std::vector<std::string> v;
-    auto dir = opendir(dir_name.data());
-    struct dirent *ent;
-    int len = 0;
-    if (dir) {
-        while ((ent = readdir(dir)) != NULL) {
-            std::string p = std::string(ent->d_name);
-            len = strlen(p.data());
-            if (len == 25) {
-                v.emplace_back(p);
-            }
-        }
-        closedir(dir);
-    }
-    return v;
-}
-
-//灏嗚棰戜腑鐨勬寚瀹氬抚瀛樹负鍥剧墖
-cv::Mat Video2Imag(std::string VideoName, int msec) {
-    cv::VideoCapture m;
-    cv::Mat img = cv::Mat();
-
-    m.open(VideoName);
-    m.set(CV_CAP_PROP_POS_MSEC, msec);
-    if (!m.isOpened()) {
-        ERR("瑙嗛璇诲叆閿欒");
-        return img;
-    }
-
-    m >> img;
-
-    return img;
-}
-
-ImageGrabberI::ImageGrabberI() : fdfsClient("./client.conf") {
-
-}
-
-RecordVideo::ByteSequence
-ImageGrabberI::grabImage(const Ice::Int index, const std::string &time, const Ice::Current &) {
-    ::RecordVideo::ByteSequence buffer;
-    QDateTime dt = QDateTime::fromString(time.data(), "yyyy-MM-dd hh:mm:ss");
-    QDateTime dtCurrent = QDateTime::currentDateTime();
-    qint64 diff = dtCurrent.toMSecsSinceEpoch() - dt.toMSecsSinceEpoch();
-    if (diff > appPref.getLongData("user.timeout") || diff < appPref.getLongData("user.interval.duration")) {
-        return buffer;
-    }
-    std::string path = appPref.getStringData("user.loop.absolute.path");
-    std::string absPath;
-
-    if (path.empty()) {
-        ERR("璺緞涓虹┖!");
-        return buffer;
-    }
-
-    char last = path.back();
-    if (last != '/') {
-        absPath = path + "/";
-    } else {
-        absPath = path;
-    }
-
-    std::string definitePath = absPath + QString::number(index).toStdString() + "/";
-
-    vec.clear();
-    vec = forEachFile(definitePath);
-    std::sort(vec.begin(), vec.end());
-
-    if (vec.empty()) {
-        ERR("娌℃湁鎵惧埌褰曞埗瑙嗛");
-        return buffer;
-    }
-
-    for (std::string &s : vec) {
-        std::string temp;
-        temp = s.substr(0, 21);
-
-        QDateTime dtFile = QDateTime::fromString(temp.data(), "yyyyMMdd_hh:mm:ss:zzz");
-        qint64 sub = dt.toMSecsSinceEpoch() - dtFile.toMSecsSinceEpoch();
-        if (sub <= appPref.getLongData("user.interval.duration") && sub > 0) {
-            std::string fullPath = definitePath + s;
-            cv::Mat img = Video2Imag(fullPath, sub);
-            CvUtil::cvMat2Buffer(img, buffer);
-            return buffer;
-        }
-    }
-
-    ERR("娌℃湁璇ユ椂娈电殑褰曞埗瑙嗛");
-    return buffer;
-}
-
-std::string ImageGrabberI::grabImageUrl(const Ice::Int index, const std::string &time, const Ice::Current &) {
-    std::string strHttpImgUrl;
-    ::RecordVideo::ByteSequence buffer = grabImage(index, time);
-
-    if (buffer.empty()) {
-        return strHttpImgUrl;
-    }
-
-    std::string strImgUrl;
-    fdfsClient.uploadFile(buffer, strImgUrl, "jpg");
-    strHttpImgUrl = appPref.getStringData("user.ip.port") + "/" + strImgUrl;
-    return strHttpImgUrl;
-}
diff --git a/QiaoJiaSystem/RecordVideo/ImageGrabberI.h b/QiaoJiaSystem/RecordVideo/ImageGrabberI.h
deleted file mode 100644
index 3a8be4e..0000000
--- a/QiaoJiaSystem/RecordVideo/ImageGrabberI.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef IMAGEGRABBERI_H
-#define IMAGEGRABBERI_H
-
-#include "RecordVideo.h"
-#include <iostream>
-#include <basic/util/fastdfs/FastdfsClient.h>
-
-class ImageGrabberI :public ::RecordVideo::ImageGrabber
-{
-public:
-    ImageGrabberI();
-
-    virtual ::RecordVideo::ByteSequence grabImage(const ::Ice::Int index,const ::std::string&time, const ::Ice::Current& = ::Ice::emptyCurrent);
-    virtual ::std::string grabImageUrl(const ::Ice::Int index,const ::std::string&time, const ::Ice::Current& = ::Ice::emptyCurrent);
-
-private:
-    std::vector<std::string> vec;
-    FastdfsClient fdfsClient;
-};
-
-#endif // IMAGEGRABBERI_H
diff --git a/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.cpp b/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.cpp
deleted file mode 100644
index 89082bb..0000000
--- a/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#include "LoopRecordVideoI.h"
-#include <basic/util/app/AppPreference.hpp>
-#include <QtCore/QDateTime>
-#include <uuid/uuid.h>
-#include "jsoncpp/json/json.h"
-
-LoopRecordVideoI::LoopRecordVideoI(int interval) : TimerElement(interval),db_c(nullptr){
-    start();
-
-}
-
-LoopRecordVideoI::~LoopRecordVideoI() {
-    qDeleteAll(m_mapRecorders);
-    if(db_c)
-    {
-        delete db_c;
-        db_c=nullptr;
-    }
-}
-
-::std::string
-LoopRecordVideoI::addCamera(const ::std::string &index, const std::string &t_str_json, const Ice::Current &) {
-    DBG(t_str_json);
-    Json::Reader reader;
-    Json::Value value;
-//"192.168.1.188/group1/M00/04/6C/wKgBvFuWLgeAJrdNAACdFDKB-U8853.jpg"
-    if (reader.parse(t_str_json, value)) {
-        // std::string filePathName = value["path"].asString();
-        // appPref.setStringData("user.loop.absolute.path", filePathName);
-        std::string t_rtsp = value["rtsp"].asString();
-
-        if (m_mapRecorders.find(index) == m_mapRecorders.end()) {
-            INFO("addCamera  <<  " << index << " time " << AppUtil::getTimeSecString());
-            uuid_t t_uuid;
-            uuid_generate(t_uuid);
-            char str[36] = {0};
-            uuid_unparse(t_uuid, str);
-            if(db_c==nullptr )
-            {
-                db_c=new LDBTool;
-            }
-            LoopVideoRecorder *pRecorder = new LoopVideoRecorder(appPref.getLongData("user.interval.duration"), index,
-                                                                 t_rtsp,std::string(str),db_c);
-            //da yin luzhi wenjian ming
-            std::lock_guard<std::mutex> lock(m_map_mutex);
-            m_mapRecorders[index] = pRecorder;
-            return std::string(str);
-        } else {
-            INFO("re addCamera  <<  " << index);
-            removeCamera(index);
-            return addCamera(index, t_str_json);
-        }
-
-    } else {
-        ERR("Json error ::  " << t_str_json);
-
-    }
-    return "";
-}
-
-void LoopRecordVideoI::removeCamera(const ::std::string &index, const Ice::Current &) {
-    if (m_mapRecorders.find(index) != m_mapRecorders.end()) {
-        INFO("removeCamera  << " << index);
-        m_mapRecorders[index]->stopTimer();
-        std::lock_guard<std::mutex> lock(m_map_mutex);
-        if (m_mapRecorders[index] != NULL) {
-            delete m_mapRecorders.value(index);
-        }
-        m_mapRecorders[index] = NULL;
-        m_mapRecorders.remove(index);
-    }
-}
-
-void LoopRecordVideoI::clearCamera(const Ice::Current &) {
-    auto iter = m_mapRecorders.begin();
-    while (iter != m_mapRecorders.end()) {
-        iter.value()->stopTimer();
-        delete iter.value();
-        iter.value() = NULL;
-        m_mapRecorders.remove(iter.key());
-        ++iter;
-    }
-}
-
-void LoopRecordVideoI::feedDog(const ::std::string &index, const Ice::Current &) {
-//    INFO("feedDog");
-    std::lock_guard<std::mutex> lock(m_mutex);
-    m_mapFeedDogTime[index] = QDateTime::currentDateTime();
-}
-
-void LoopRecordVideoI::timerFunc() {
-    m_mutex.lock();
-    auto mapFeedDogTime = m_mapFeedDogTime;
-    m_mutex.unlock();
-    auto iter = mapFeedDogTime.begin();
-    while (iter != mapFeedDogTime.end()) {
-        qint64 current = QDateTime::currentDateTime().toMSecsSinceEpoch();
-        qint64 feedDog = iter.value().toMSecsSinceEpoch();
-        qint64 sub = current - feedDog;
-        if (sub > 3000) {
-            removeCamera(iter.key());
-        }
-        ++iter;
-    }
-}
diff --git a/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.h b/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.h
deleted file mode 100644
index b4c4b50..0000000
--- a/QiaoJiaSystem/RecordVideo/LoopRecordVideoI.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef LOOPRECORDVIDEOI_H
-#define LOOPRECORDVIDEOI_H
-
-#include "RecordVideo.h"
-#include <iostream>
-#include <thread>
-#include <QtCore/QMap>
-#include "LoopVideoRecorder.h"
-#include "TimerElement.h"
-#include <mutex>
-#include "../VideoServer/QiaoJia/DB/LDBTool.h"
-class LoopRecordVideoI : public ::RecordVideo::LoopRecorder, TimerElement {
-public:
-    LoopRecordVideoI(int interval = 10000);
-
-    ~LoopRecordVideoI();
-
-    ::std::string addCamera(const ::std::string &index, const ::std::string &t_rtsp, const ::Ice::Current & = ::Ice::emptyCurrent);
-
-    void removeCamera(const ::std::string &index, const ::Ice::Current & = ::Ice::emptyCurrent);
-
-    void clearCamera(const ::Ice::Current & = ::Ice::emptyCurrent);
-
-    void feedDog(const ::std::string &index, const ::Ice::Current & = ::Ice::emptyCurrent);
-
-    void timerFunc();
-
-private:
-
-    QMap<std::string, LoopVideoRecorder *> m_mapRecorders;
-    QMap<std::string, QDateTime> m_mapFeedDogTime;
-    std::mutex m_mutex;
-    std::mutex m_map_mutex;
-    LDBTool* db_c;
-};
-
-#endif // LOOPRECORDVIDEOI_H
diff --git a/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.cpp b/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.cpp
deleted file mode 100644
index 3c196d0..0000000
--- a/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#include "LoopVideoRecorder.h"
-#include <functional>
-#include <algorithm>
-#include <dirent.h>
-#include <cstdio>
-#include <QtCore/QDateTime>
-#include <basic/util/app/AppPreference.hpp>
-//#include <sys/stat.h>
-extern std::vector<std::string> forEachFile(const std::string &dir_name);
-
-//loop record video
-void LoopVideoRecorder::loopRecordVideo() {
-    std::cout << "File " << __FILE__ << "FUNC " << __FUNCTION__ << "  line  " << __LINE__ << std::endl;
-
-    if (m_strRtsp.empty()) {
-        ERR("rtsp涓虹┖!");
-        return;
-    }
-
-    //#todo get Path
-
-    //    std::string loopAbsPath = appPref.getStringData("user.loop.absolute.path");
-    //    std::cout << "File " << __FILE__ << "FUNC " << __FUNCTION__ << "  line  " << __LINE__ << std::endl;
- //      std::string loopAbsPath = getFullFileName();
-//        if (loopAbsPath.empty()) {
-//            ERR("absolute.path涓虹┖");
-//           return ;
-//        }
-
-//        char last = loopAbsPath.back();
-//        if (last != '/') {
-//            loopAbsPath = loopAbsPath + "/";
-//        }
-
-
-
-      //  QString CmdMkdir = QString("cd %1 ; mkdir -p %2").arg(QString::fromStdString(loopAbsPath)).arg(QString::fromStdString(m_nIndex));
-       // system(CmdMkdir.toLatin1().data());
-
-        std::string fullPath = getFullFileName();
-       // std::string cmd="mkdir -p "+fullPath;
-       // system(cmd.c_str());
-        //mkdir(fullPath.c_str(),S_IRWXU);
-        if(fullPath.empty())
-        {
-            ERR("LoopVideoRecorder::getFullFileName() is empty");
-            return ;
-        }
-        m_pVideoRcd = new VideoRecorder(fullPath,m_pathId, m_strRtsp, m_nInterval,m_db);
-
-
-}
-
-void LoopVideoRecorder::stopTimer() {
-    stop();
-    wait();
-}
-
-void LoopVideoRecorder::timerFunc() {
-//    loopRecordVideo();
-}
-
-LoopVideoRecorder::LoopVideoRecorder(int interval, std::string index, std::string rtsp,std::string pathId,LDBTool* db_c)
-    : TimerElement(interval), m_nInterval(interval), m_nIndex(index), m_strRtsp(rtsp),m_pathId(pathId),m_db(db_c){
-//    start();
-//    std::cout << "File " << __FILE__ << "FUNC " << __FUNCTION__ << "  line  " << __LINE__ << std::endl;
-
-    loopRecordVideo();
-}
-
-LoopVideoRecorder::~LoopVideoRecorder() {
-    delete m_pVideoRcd;
-}
-std::string LoopVideoRecorder::getFullFileName() {
-
-    //# ./camIndex/YYYYMM/DD/camIndex-YYYYMMDDHHMMSS/
-    std::string t_FilePath = appPref.getStringData("user.loop.absolute.path");
-
-    if (t_FilePath.back() != '/') {
-        t_FilePath.push_back('/');
-    }
-    char buf[24];
-
-     time_t t=time(nullptr);
-     // 20180901113048 2018-09-01 11:30:48
-     strftime(buf,24,"%Y%m%d%H%M%S",localtime(&t));
-      std::string t_strTime(buf);
-       //# ./camIndex/YYYYMM/DD/
-     t_FilePath.append(m_nIndex + "/" + t_strTime.substr(0, 6)+ "/" +t_strTime.substr(6, 2) + "/");
-     //camIndex-YYYYMMDDHH/camIndex-YYYYMMDDHH/
-      t_FilePath.append(m_nIndex + "-" + t_strTime.substr(0,10) + "/");
-     std::string t_cmd = "mkdir -p '";
-    t_cmd.append(t_FilePath + "'");
-    //#get path mkdir path
-    system(t_cmd.c_str());
-
-    return t_FilePath;
-}
diff --git a/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.h b/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.h
deleted file mode 100644
index ffbfd27..0000000
--- a/QiaoJiaSystem/RecordVideo/LoopVideoRecorder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LOOPVIDEORECORDER_H
-#define LOOPVIDEORECORDER_H
-
-#include <iostream>
-#include <thread>
-#include <functional>
-#include <unistd.h>
-#include "VideoRecorder.h"
-#include <QtCore/QObject>
-#include "TimerElement.h"
-#include <queue>
-
-class LoopVideoRecorder : public TimerElement {
-
-public:
-    explicit LoopVideoRecorder(int interval, std::string index, std::string rtsp,std::string pathId,LDBTool* db_c);
-
-    ~LoopVideoRecorder();
-
-    void loopRecordVideo();
-
-    void stopTimer();
-
-private:
-    virtual void timerFunc() override;
-    std::string getFullFileName();
-
-private:
-    std::string m_nIndex;
-    std::string m_strRtsp;
-    std::string m_pathId;
-    int m_nInterval;
-    VideoRecorder *m_pVideoRcd;
-    std::queue<VideoRecorder *> m_queManager;
-    LDBTool* m_db;
-};
-
-#endif // LOOPVIDEORECORDER_H
diff --git a/QiaoJiaSystem/RecordVideo/RecordVideoI.cpp b/QiaoJiaSystem/RecordVideo/RecordVideoI.cpp
deleted file mode 100644
index 82e8be7..0000000
--- a/QiaoJiaSystem/RecordVideo/RecordVideoI.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "RecordVideoI.h"
-#include <QtCore/QDateTime>
-#include <basic/util/app/AppPreference.hpp>
-
-RecordVideoI::RecordVideoI()
-{
-
-}
-
-std::string RecordVideoI::recordVideo(const std::string &rtsp, Ice::Long ms, const Ice::Current &)
-{
-    QString rtspUrl = QString::fromStdString(rtsp);
-
-    int ss = 1000;
-    int mi = ss * 60;
-    int hh = mi * 60;
-
-    long hour = ms / hh;
-    long minute = (ms - hour * hh) / mi;
-    long second = (ms - hour * hh - minute * mi) / ss;
-
-    QString strHour = QString("%1").arg(hour,2,10,QChar('0'));
-    QString strMinute = QString("%1").arg(minute,2,10,QChar('0'));
-    QString strSecond = QString("%1").arg(second,2,10,QChar('0'));
-
-    QString currentTime = QDateTime::currentDateTime().toString("yyyyMMdd_hh:mm:ss:zzz");
-    QString fileName = currentTime + ".mp4";
-    QString CmdTouch = QString("touch %1").arg(fileName);
-    QString CmdOrder = QString("LD_LIBRARY_PATH=/usr/local/cuda/lib64 ffmpeg -y -i %1 -vcodec copy -acodec copy -t %2:%3:%4 %5/%6 &")
-            .arg(rtspUrl).arg(strHour).arg(strMinute)
-            .arg(strSecond).arg(QString::fromStdString(appPref.getStringData("user.absolute.path")))
-            .arg(fileName);
-
-    system(CmdTouch.toLatin1().data());
-    system(CmdOrder.toLatin1().data());
-
-    return fileName.toStdString();
-}
diff --git a/QiaoJiaSystem/RecordVideo/RecordVideoI.h b/QiaoJiaSystem/RecordVideo/RecordVideoI.h
deleted file mode 100644
index 950f097..0000000
--- a/QiaoJiaSystem/RecordVideo/RecordVideoI.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef RECORDVIDEOI_H
-#define RECORDVIDEOI_H
-
-#include "RecordVideo.h"
-
-class RecordVideoI : public::RecordVideo::Recorder
-{
-public:
-    RecordVideoI();
-
-    virtual ::std::string recordVideo(const ::std::string& rtsp, ::Ice::Long ms, const ::Ice::Current& = ::Ice::emptyCurrent);
-};
-
-#endif // RECORDVIDEOI_H
diff --git a/QiaoJiaSystem/RecordVideo/VideoRecorder.cpp b/QiaoJiaSystem/RecordVideo/VideoRecorder.cpp
deleted file mode 100644
index ae66290..0000000
--- a/QiaoJiaSystem/RecordVideo/VideoRecorder.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#include "VideoRecorder.h"
-#include <unistd.h>
-#include <QString>
-
-
-VideoRecorder::VideoRecorder(const std::string &fullPath,const std::string &uuid, const std::string &strRtsp, const int mseconds,LDBTool* db)
-    : m_pInFmtCtx(nullptr), m_pInVideoStream(nullptr), m_pOutFmtCtx(nullptr),
-      m_pDict(nullptr), m_pOutVideo_stream(nullptr), m_bStatus(true),/*m_thd(recodeFunc,this),*/
-      m_bStart(false), m_mseconds(mseconds), m_strfileName(""), m_uuid(uuid), m_bSave(false),
-      m_fullPath(fullPath),db_c(db){
-    m_CommonFFmpeg.init();
-    for (int i = 0; i < 3; i++) {
-        if (m_CommonFFmpeg.rtspInputOpen(strRtsp.c_str()) >= 0) {
-            m_thd = new std::thread(recodeFunc, this);
-            return;
-        }
-        usleep(20000);
-    }
-}
-
-VideoRecorder::~VideoRecorder() {
-
-    m_bSave = false;
-    m_bStatus = false;
-    m_thd->join();
-    delete m_thd;
-    m_thd = nullptr;
-    m_CommonFFmpeg.rtspInputClose();
-}
-
-void VideoRecorder::thisRecodeFunc() {
-    while (m_bStatus) {
-        //        std::string strDate;
-        //#todo get FilePath FileName
-
-        ///#todo shengcheng  luzhi wenjian ming
-
-
-
-        long lDate = getCurrentUs();
-        bool bFirstKeyFrame = true;
-        long int nFirstKeyPts = 0;
-        long int nFirstKeyDts = 0;
-
-        if (m_strfileName.empty() && !m_bSave) {
-            GetFileName(m_strfileName);
-
-            DBG("srtPath" << m_strfileName << "m_uuid" << m_uuid);
-        } else{
-            DBG("m_strfileName:" << m_strfileName);
-            DBG("m_bSave:" << m_bSave);
-        }
-
-
-        m_CommonFFmpeg.fileOutOpen(m_strfileName.c_str(), m_CommonFFmpeg.getRtspStream());
-        //#todo
-        while (m_bStatus && ((getCurrentUs() - lDate) < m_mseconds * 1000)) {
-            void *handle = m_CommonFFmpeg.rtspCreatePkg();
-            if (m_CommonFFmpeg.rtspReadPkg(handle) < 0) {
-                if(bFirstKeyFrame){
-                    ERR("rtspReadPkg m_strfileName:" << m_strfileName.c_str() << "getRtspStream:"
-                                                     << m_CommonFFmpeg.getRtspStream());
-                    usleep(20000);//20ms
-                    m_bSave = false;
-                    m_strfileName.clear();
-                    break;
-                } else{
-                    continue;
-                }
-
-            }
-
-            if (bFirstKeyFrame) {
-
-                if (m_CommonFFmpeg.isKeyFrame(handle)) {
-                    DBG("I");
-                    nFirstKeyPts = m_CommonFFmpeg.getPkgPts(handle);
-                    nFirstKeyDts = m_CommonFFmpeg.getPkgDts(handle);
-                    bFirstKeyFrame = false;
-
-                    if (!m_bSave && db_c) {
-                        if (db_c->insertRecordVedioPath(QString::fromStdString(m_uuid),
-                                                       QString::fromStdString(m_strfileName))) {
-                            m_bSave = true;
-                        } else {
-                            ERR("insertRecordVedioPath DB ERR m_uuid=" << m_uuid.c_str() << "m_strfileName="
-                                                                       << m_strfileName.c_str());
-                        }
-                    }
-                } else {
-                    //                       DBG("slice");
-                    m_CommonFFmpeg.rtspDestroyPkg(handle);
-                    continue;
-                    DBG("srtPath" << m_strfileName << "m_uuid" << m_uuid);
-                }
-            }
-            m_CommonFFmpeg.conversion(handle, nFirstKeyPts, nFirstKeyDts,
-                                      m_CommonFFmpeg.getRtspStream());
-
-            m_CommonFFmpeg.fileWritePkg(handle);
-
-            m_CommonFFmpeg.rtspDestroyPkg(handle);
-        }
-        m_CommonFFmpeg.fileOutClose();
-
-    }
-}
-
-long VideoRecorder::getCurrentUs() {
-    timeval time;
-    gettimeofday(&time, nullptr);
-    return time.tv_sec * 1000000 + time.tv_usec;
-}
-
-long VideoRecorder::getCurrentUs(std::string &strDateTime) {
-    timeval time;
-    gettimeofday(&time, nullptr);
-    __time_t sec = time.tv_sec;
-    char buf[128] = {0};
-    strftime(buf, 64, "%Y%m%d_%H:%M:%S", localtime(&sec));
-    char szDateTime[128] = {0};
-    sprintf(szDateTime, "%s/%s:%ld.mp4", m_strfileName.c_str(), buf, time.tv_usec / 1000);
-    strDateTime = szDateTime;
-    return time.tv_sec * 1000000 + time.tv_usec;
-}
-
-void VideoRecorder::recodeFunc(void *arg) {
-
-    VideoRecorder *thisPtr = (VideoRecorder *) arg;
-    thisPtr->thisRecodeFunc();
-}
-
-void VideoRecorder::GetFileName(std::string &fileName) {
-    //std::string tem="/home/basic/work_src/test_Rec/1";
-//    timeval time;
-//    gettimeofday(&time, nullptr);
-    time_t t = time(nullptr);
-
-    char buf[128] = {0};
-    strftime(buf, 64, "%Y-%m-%d %H:%M:%S", localtime(&t));
-    char szDateTime[256] = {0};
-    sprintf(szDateTime, "%s%s.mp4", m_fullPath.c_str(), buf);
-
-    fileName = szDateTime;
-    //std::cout << "File path " << fileName.c_str() << "FUNC " << __FUNCTION__ << "  line  " << __LINE__ << std::endl;
-}
diff --git a/QiaoJiaSystem/RecordVideo/VideoRecorder.h b/QiaoJiaSystem/RecordVideo/VideoRecorder.h
deleted file mode 100644
index cefbed1..0000000
--- a/QiaoJiaSystem/RecordVideo/VideoRecorder.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef VIDEORECORDER_H
-#define VIDEORECORDER_H
-
-#include<thread>
-#include <basic/util/app/AppPreference.hpp>
-#include "CommonFFmpegFunc.hpp"
-#include "../VideoServer/QiaoJia/DB/LDBTool.h"
-
-struct AVStream;
-struct AVDictionary;
-struct AVFormatContext;
-struct AVPacket;
-
-void ffmpegInit();
-
-class VideoRecorder {
-public:
-    VideoRecorder(const std::string& fullPath,const std::string &uuid, const std::string &strRtsp, const int mseconds,LDBTool* db);
-
-    virtual ~VideoRecorder();
-
-private:
-    AVFormatContext *m_pInFmtCtx;
-    AVStream *m_pInVideoStream;
-
-    AVFormatContext *m_pOutFmtCtx;
-    AVStream *m_pOutVideo_stream;
-    AVDictionary *m_pDict;
-    bool m_bStatus;
-
-    bool m_bStart;
-
-    std::thread *m_thd;
-
-    CommonFFmpeg m_CommonFFmpeg;
-
-    int m_mseconds;
-
-    std::string m_strfileName;
-    std::string m_uuid;
-    std::string m_fullPath;
-    LDBTool* db_c;
-    bool m_bSave;
-private:
-    void thisRecodeFunc();
-
-    long getCurrentUs();
-
-    long getCurrentUs(std::string &strDateTime);
-
-    void GetFileName(std::string &fileName);
-
-    static void recodeFunc(void *);
-};
-
-#endif
diff --git a/QiaoJiaSystem/RecordVideo/VideoRecorderManager.cpp b/QiaoJiaSystem/RecordVideo/VideoRecorderManager.cpp
deleted file mode 100644
index 413d939..0000000
--- a/QiaoJiaSystem/RecordVideo/VideoRecorderManager.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "VideoRecorderManager.h"
-
-VideoRecorderManager::VideoRecorderManager(int interval, std::string rtsp, std::string path, std::string fileName)
-    :TimerElement(interval),m_strPath(path),m_strFileName(fileName)
-{
-    ClockTimer ct("VideoRecorderManager::VideoRecorderManager()");
-    int nCount = 0;
-    while(nCount++ < 10)
-    {
-        if (m_videoRcd.start(rtsp,path+fileName) >= 0)
-        {
-            break;
-        }
-        usleep(10000);//10ms
-    }
-
-    if (nCount >= 10)
-    {
-        ERR("open rtsp "<< rtsp <<" failed!");
-    }else
-    {
-        m_dtRecordTime = QDateTime::currentDateTime();
-        start();
-    }
-}
-
-double VideoRecorderManager::getLastUs()
-{
-    return getCurrentUs();
-}
-
-void VideoRecorderManager::threadInitial()
-{
-    lastUs = getLastUs();
-}
-
-void VideoRecorderManager::timerFunc()
-{
-    ClockTimer ct("VideoRecorderManager::timerFunc()");
-    m_videoRcd.stop();
-    if (access((m_strPath+m_strFileName).c_str(),F_OK) != 0)
-    {
-        ERR("file not exist!");
-        stop();
-        return;
-    }
-    QString strMvCmd = QString("cd %1 ; mv %2 %3")
-            .arg(QString::fromStdString(m_strPath))
-            .arg(QString::fromStdString(m_strFileName))
-            .arg(m_dtRecordTime.toString("yyyyMMdd_hh:mm:ss:zzz")+".mp4");
-    system(strMvCmd.toLatin1().data());
-
-    stop();
-}
diff --git a/QiaoJiaSystem/RecordVideo/VideoRecorderManager.h b/QiaoJiaSystem/RecordVideo/VideoRecorderManager.h
deleted file mode 100644
index c28f2c1..0000000
--- a/QiaoJiaSystem/RecordVideo/VideoRecorderManager.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef VIDEORECORDERMANAGER_H
-#define VIDEORECORDERMANAGER_H
-
-#include "TimerElement.h"
-#include "VideoRecorder.h"
-#include <QtCore/QDateTime>
-
-class VideoRecorderManager : public TimerElement
-{
-public:
-    VideoRecorderManager(int interval,std::string rtsp,std::string path,std::string fileName);
-
-    virtual double getLastUs() override;
-private:
-    virtual void timerFunc() override;
-    virtual void threadInitial() override;
-private:
-    VideoRecorder m_videoRcd;
-    std::string m_strPath;
-    std::string m_strFileName;
-    QDateTime m_dtRecordTime;
-
-};
-
-#endif // VIDEORECORDERMANAGER_H
diff --git a/QiaoJiaSystem/RecordVideo/config.cfg b/QiaoJiaSystem/RecordVideo/config.cfg
deleted file mode 100644
index f9cb22e..0000000
--- a/QiaoJiaSystem/RecordVideo/config.cfg
+++ /dev/null
@@ -1 +0,0 @@
-Ice.Default.Locator=StructureAppRegistry/Locator:default -p 4062
\ No newline at end of file
diff --git a/QiaoJiaSystem/RecordVideo/main.cpp b/QiaoJiaSystem/RecordVideo/main.cpp
deleted file mode 100644
index 4396e2d..0000000
--- a/QiaoJiaSystem/RecordVideo/main.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#include <iostream>
-#include <QtCore/QDebug>
-#include <Ice/Ice.h>
-#include <IceUtil/IceUtil.h>
-#include "RecordVideoI.h"
-#include "ImageGrabberI.h"
-#include "LoopRecordVideoI.h"
-#include <basic/util/app/AppPreference.hpp>
-#include <basic/rpc/IceRpc.hpp>
-#include <basic/util/app/AppConfig.h>
-#include <basic/debug/Debug.h>
-
-
-using namespace std;
-
-int main2(int argc, char **argv) {
-    SAVE_APP_ARGS;
-    ENABLEGLOG("~/work/log/");
-    auto ich = Ice::initialize(argc, argv);
-
-    std::string identity = ich->getProperties()->getProperty("user.record.video.identity");
-    std::string identityCapture = ich->getProperties()->getProperty("user.capture.image.identity");
-    std::string identityLoop = ich->getProperties()->getProperty("user.loop.record.video.identity");
-    std::string adapterName = ich->getProperties()->getProperty("user.adapter.name");
-    std::string absolutePath = ich->getProperties()->getProperty("user.absolute.path");
-    std::string loopAbsolutePath = ich->getProperties()->getProperty("user.loop.absolute.path");
-    std::string intervalDuration = ich->getProperties()->getProperty("user.interval.duration");
-    std::string ipPort = ich->getProperties()->getProperty("user.ip.port");
-    std::string timeOut = ich->getProperties()->getProperty("user.timeout");
-
-    appPref.setStringData("user.absolute.path", absolutePath);
-    appPref.setStringData("user.loop.absolute.path", loopAbsolutePath);
-    appPref.setLongData("user.interval.duration", atol(intervalDuration.c_str()));
-    appPref.setStringData("user.ip.port", ipPort);
-    appPref.setLongData("user.timeout", atol(timeOut.c_str()));
-
-    auto adapter = ich->createObjectAdapter(adapterName);
-    adapter->add(new RecordVideoI(), Ice::stringToIdentity(identity));
-    adapter->add(new ImageGrabberI(), Ice::stringToIdentity(identityCapture));
-    adapter->add(new LoopRecordVideoI(), Ice::stringToIdentity(identityLoop));
-    adapter->activate();
-    ich->waitForShutdown();
-
-    return 0;
-}
-
-#include "jsoncpp/json/json.h"
-
-int main(int argc, char **argv) {
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
-    SAVE_APP_ARGS;
-    ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
-    auto ich = Ice::initialize(argc, argv);
-
-    std::string identity = "RecordVideoServer";
-    std::string identityCapture = "CaptureVideoImgServer";
-    std::string identityLoop = "LoopRecordVideoServer";
-    std::string adapterName = "RecordVideoServerAdapter";
-    std::string absolutePath = "build";
-    // std::string loopAbsolutePath = "/home/bsk/test/";
-    std::string loopAbsolutePath = appConfig.getStringProperty("cutPath");
-    std::string intervalDuration = "600000";
-    std::string ipPort = "192.168.1.65:8888";
-    std::string timeOut = "6000000";
-
-    appPref.setStringData("user.absolute.path", absolutePath);
-    appPref.setStringData("user.loop.absolute.path", loopAbsolutePath);
-    appPref.setLongData("user.interval.duration", atol(intervalDuration.c_str()));
-    appPref.setStringData("user.ip.port", ipPort);
-    appPref.setLongData("user.timeout", atol(timeOut.c_str()));
-
-//    auto adapter = ich->createObjectAdapter(adapterName);
-//    adapter->add(new RecordVideoI(), Ice::stringToIdentity(identity));
-//    adapter->add(new ImageGrabberI(), Ice::stringToIdentity(identityCapture));
-//    adapter->add(new LoopRecordVideoI(), Ice::stringToIdentity(identityLoop));
-//    adapter->activate();
-//    ich->waitForShutdown();
-
-//    Ice::ObjectAdapterPtr adapter = ich->createObjectAdapterWithEndpoints(identityLoop + "Adapter",
-//                                                                          " tcp -p " + std::to_string(10010));
-//
-//    adapter->add(new LoopRecordVideoI, Ice::stringToIdentity(identityLoop));
-//    adapter->activate();
-//    ich->waitForShutdown();
-
-    IceRpcServer<LoopRecordVideoI> server("LoopRecordVideoServer", 10010, "tcp");
-    server.setMessageSizeMax(1024 * 1024 * 50);
-    server.setPoolInitSize(5);
-    server.setPoolMaxSize(32);
-    server.runWaitShutDown();
-
-    return 0;
-}
diff --git a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.cpp b/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.cpp
deleted file mode 100644
index ab59d89..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.cpp
+++ /dev/null
@@ -1,1385 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-//
-// Ice version 3.7.0
-//
-// <auto-generated>
-//
-// Generated from file `RecordVideo.ice'
-//
-// Warning: do not edit this file.
-//
-// </auto-generated>
-//
-
-#include <RecordVideo.h>
-#include <IceUtil/PushDisableWarnings.h>
-#include <Ice/LocalException.h>
-#include <Ice/ValueFactory.h>
-#include <Ice/OutgoingAsync.h>
-#include <Ice/InputStream.h>
-#include <Ice/OutputStream.h>
-#include <IceUtil/PopDisableWarnings.h>
-
-#if defined(_MSC_VER)
-#   pragma warning(disable:4458) // declaration of ... hides class member
-#elif defined(__clang__)
-#   pragma clang diagnostic ignored "-Wshadow"
-#elif defined(__GNUC__)
-#   pragma GCC diagnostic ignored "-Wshadow"
-#endif
-
-#ifndef ICE_IGNORE_VERSION
-#   if ICE_INT_VERSION / 100 != 307
-#       error Ice version mismatch!
-#   endif
-#   if ICE_INT_VERSION % 100 > 50
-#       error Beta header file detected
-#   endif
-#   if ICE_INT_VERSION % 100 < 0
-#       error Ice patch level mismatch!
-#   endif
-#endif
-
-#ifdef ICE_CPP11_MAPPING // C++11 mapping
-
-namespace
-{
-
-const ::std::string iceC_RecordVideo_Recorder_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::Recorder"
-};
-const ::std::string iceC_RecordVideo_Recorder_ops[] =
-{
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "recordVideo"
-};
-const ::std::string iceC_RecordVideo_Recorder_recordVideo_name = "recordVideo";
-
-const ::std::string iceC_RecordVideo_ImageGrabber_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::ImageGrabber"
-};
-const ::std::string iceC_RecordVideo_ImageGrabber_ops[] =
-{
-    "grabImage",
-    "grabImageUrl",
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping"
-};
-const ::std::string iceC_RecordVideo_ImageGrabber_grabImage_name = "grabImage";
-const ::std::string iceC_RecordVideo_ImageGrabber_grabImageUrl_name = "grabImageUrl";
-
-const ::std::string iceC_RecordVideo_LoopRecorder_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::LoopRecorder"
-};
-const ::std::string iceC_RecordVideo_LoopRecorder_ops[] =
-{
-    "addCamera",
-    "clearCamera",
-    "feedDog",
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "removeCamera"
-};
-const ::std::string iceC_RecordVideo_LoopRecorder_addCamera_name = "addCamera";
-const ::std::string iceC_RecordVideo_LoopRecorder_removeCamera_name = "removeCamera";
-const ::std::string iceC_RecordVideo_LoopRecorder_clearCamera_name = "clearCamera";
-const ::std::string iceC_RecordVideo_LoopRecorder_feedDog_name = "feedDog";
-
-}
-
-bool
-RecordVideo::Recorder::ice_isA(::std::string s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_Recorder_ids, iceC_RecordVideo_Recorder_ids + 2, s);
-}
-
-::std::vector<::std::string>
-RecordVideo::Recorder::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector<::std::string>(&iceC_RecordVideo_Recorder_ids[0], &iceC_RecordVideo_Recorder_ids[2]);
-}
-
-::std::string
-RecordVideo::Recorder::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::Recorder::ice_staticId()
-{
-    static const ::std::string typeId = "::RecordVideo::Recorder";
-    return typeId;
-}
-
-bool
-RecordVideo::Recorder::_iceD_recordVideo(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    ::std::string iceP_rtsp;
-    long long int iceP_ms;
-    istr->readAll(iceP_rtsp, iceP_ms);
-    inS.endReadParams();
-    ::std::string ret = this->recordVideo(::std::move(iceP_rtsp), iceP_ms, current);
-    auto ostr = inS.startWriteParams();
-    ostr->writeAll(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::Recorder::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_Recorder_ops, iceC_RecordVideo_Recorder_ops + 5, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_Recorder_ops)
-    {
-        case 0:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 1:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 4:
-        {
-            return _iceD_recordVideo(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-bool
-RecordVideo::ImageGrabber::ice_isA(::std::string s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_ImageGrabber_ids, iceC_RecordVideo_ImageGrabber_ids + 2, s);
-}
-
-::std::vector<::std::string>
-RecordVideo::ImageGrabber::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector<::std::string>(&iceC_RecordVideo_ImageGrabber_ids[0], &iceC_RecordVideo_ImageGrabber_ids[2]);
-}
-
-::std::string
-RecordVideo::ImageGrabber::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::ImageGrabber::ice_staticId()
-{
-    static const ::std::string typeId = "::RecordVideo::ImageGrabber";
-    return typeId;
-}
-
-bool
-RecordVideo::ImageGrabber::_iceD_grabImage(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    int iceP_index;
-    ::std::string iceP_time;
-    istr->readAll(iceP_index, iceP_time);
-    inS.endReadParams();
-    ::RecordVideo::ByteSequence ret = this->grabImage(iceP_index, ::std::move(iceP_time), current);
-    auto ostr = inS.startWriteParams();
-    ostr->writeAll(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::ImageGrabber::_iceD_grabImageUrl(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    int iceP_index;
-    ::std::string iceP_time;
-    istr->readAll(iceP_index, iceP_time);
-    inS.endReadParams();
-    ::std::string ret = this->grabImageUrl(iceP_index, ::std::move(iceP_time), current);
-    auto ostr = inS.startWriteParams();
-    ostr->writeAll(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::ImageGrabber::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_ImageGrabber_ops, iceC_RecordVideo_ImageGrabber_ops + 6, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_ImageGrabber_ops)
-    {
-        case 0:
-        {
-            return _iceD_grabImage(in, current);
-        }
-        case 1:
-        {
-            return _iceD_grabImageUrl(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 4:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 5:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-bool
-RecordVideo::LoopRecorder::ice_isA(::std::string s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_LoopRecorder_ids, iceC_RecordVideo_LoopRecorder_ids + 2, s);
-}
-
-::std::vector<::std::string>
-RecordVideo::LoopRecorder::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector<::std::string>(&iceC_RecordVideo_LoopRecorder_ids[0], &iceC_RecordVideo_LoopRecorder_ids[2]);
-}
-
-::std::string
-RecordVideo::LoopRecorder::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::LoopRecorder::ice_staticId()
-{
-    static const ::std::string typeId = "::RecordVideo::LoopRecorder";
-    return typeId;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_addCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    ::std::string iceP_index;
-    ::std::string iceP_rtsp;
-    istr->readAll(iceP_index, iceP_rtsp);
-    inS.endReadParams();
-    ::std::string ret = this->addCamera(::std::move(iceP_index), ::std::move(iceP_rtsp), current);
-    auto ostr = inS.startWriteParams();
-    ostr->writeAll(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_removeCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    ::std::string iceP_index;
-    istr->readAll(iceP_index);
-    inS.endReadParams();
-    this->removeCamera(::std::move(iceP_index), current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_clearCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    inS.readEmptyParams();
-    this->clearCamera(current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_feedDog(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    ::std::string iceP_index;
-    istr->readAll(iceP_index);
-    inS.endReadParams();
-    this->feedDog(::std::move(iceP_index), current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_LoopRecorder_ops, iceC_RecordVideo_LoopRecorder_ops + 8, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_LoopRecorder_ops)
-    {
-        case 0:
-        {
-            return _iceD_addCamera(in, current);
-        }
-        case 1:
-        {
-            return _iceD_clearCamera(in, current);
-        }
-        case 2:
-        {
-            return _iceD_feedDog(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 4:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 5:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 6:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 7:
-        {
-            return _iceD_removeCamera(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RecordVideo::RecorderPrx::_iceI_recordVideo(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>& outAsync, const ::std::string& iceP_rtsp, long long int iceP_ms, const ::Ice::Context& context)
-{
-    _checkTwowayOnly(iceC_RecordVideo_Recorder_recordVideo_name);
-    outAsync->invoke(iceC_RecordVideo_Recorder_recordVideo_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_rtsp, iceP_ms);
-        },
-        nullptr);
-}
-
-::std::shared_ptr<::Ice::ObjectPrx>
-RecordVideo::RecorderPrx::_newInstance() const
-{
-    return ::IceInternal::createProxy<RecorderPrx>();
-}
-
-const ::std::string&
-RecordVideo::RecorderPrx::ice_staticId()
-{
-    return RecordVideo::Recorder::ice_staticId();
-}
-
-void
-RecordVideo::ImageGrabberPrx::_iceI_grabImage(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::RecordVideo::ByteSequence>>& outAsync, int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context)
-{
-    _checkTwowayOnly(iceC_RecordVideo_ImageGrabber_grabImage_name);
-    outAsync->invoke(iceC_RecordVideo_ImageGrabber_grabImage_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_index, iceP_time);
-        },
-        nullptr);
-}
-
-void
-RecordVideo::ImageGrabberPrx::_iceI_grabImageUrl(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>& outAsync, int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context)
-{
-    _checkTwowayOnly(iceC_RecordVideo_ImageGrabber_grabImageUrl_name);
-    outAsync->invoke(iceC_RecordVideo_ImageGrabber_grabImageUrl_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_index, iceP_time);
-        },
-        nullptr);
-}
-
-::std::shared_ptr<::Ice::ObjectPrx>
-RecordVideo::ImageGrabberPrx::_newInstance() const
-{
-    return ::IceInternal::createProxy<ImageGrabberPrx>();
-}
-
-const ::std::string&
-RecordVideo::ImageGrabberPrx::ice_staticId()
-{
-    return RecordVideo::ImageGrabber::ice_staticId();
-}
-
-void
-RecordVideo::LoopRecorderPrx::_iceI_addCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>& outAsync, const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context)
-{
-    _checkTwowayOnly(iceC_RecordVideo_LoopRecorder_addCamera_name);
-    outAsync->invoke(iceC_RecordVideo_LoopRecorder_addCamera_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_index, iceP_rtsp);
-        },
-        nullptr);
-}
-
-void
-RecordVideo::LoopRecorderPrx::_iceI_removeCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>& outAsync, const ::std::string& iceP_index, const ::Ice::Context& context)
-{
-    outAsync->invoke(iceC_RecordVideo_LoopRecorder_removeCamera_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_index);
-        },
-        nullptr);
-}
-
-void
-RecordVideo::LoopRecorderPrx::_iceI_clearCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>& outAsync, const ::Ice::Context& context)
-{
-    outAsync->invoke(iceC_RecordVideo_LoopRecorder_clearCamera_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        nullptr,
-        nullptr);
-}
-
-void
-RecordVideo::LoopRecorderPrx::_iceI_feedDog(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>& outAsync, const ::std::string& iceP_index, const ::Ice::Context& context)
-{
-    outAsync->invoke(iceC_RecordVideo_LoopRecorder_feedDog_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_index);
-        },
-        nullptr);
-}
-
-::std::shared_ptr<::Ice::ObjectPrx>
-RecordVideo::LoopRecorderPrx::_newInstance() const
-{
-    return ::IceInternal::createProxy<LoopRecorderPrx>();
-}
-
-const ::std::string&
-RecordVideo::LoopRecorderPrx::ice_staticId()
-{
-    return RecordVideo::LoopRecorder::ice_staticId();
-}
-
-#else // C++98 mapping
-
-namespace
-{
-
-const ::std::string iceC_RecordVideo_Recorder_recordVideo_name = "recordVideo";
-
-const ::std::string iceC_RecordVideo_ImageGrabber_grabImage_name = "grabImage";
-
-const ::std::string iceC_RecordVideo_ImageGrabber_grabImageUrl_name = "grabImageUrl";
-
-const ::std::string iceC_RecordVideo_LoopRecorder_addCamera_name = "addCamera";
-
-const ::std::string iceC_RecordVideo_LoopRecorder_removeCamera_name = "removeCamera";
-
-const ::std::string iceC_RecordVideo_LoopRecorder_clearCamera_name = "clearCamera";
-
-const ::std::string iceC_RecordVideo_LoopRecorder_feedDog_name = "feedDog";
-
-}
-::IceProxy::Ice::Object* ::IceProxy::RecordVideo::upCast(::IceProxy::RecordVideo::Recorder* p) { return p; }
-
-void
-::IceProxy::RecordVideo::_readProxy(::Ice::InputStream* istr, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::Recorder>& v)
-{
-    ::Ice::ObjectPrx proxy;
-    istr->read(proxy);
-    if(!proxy)
-    {
-        v = 0;
-    }
-    else
-    {
-        v = new ::IceProxy::RecordVideo::Recorder;
-        v->_copyFrom(proxy);
-    }
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::Recorder::_iceI_begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    _checkTwowayOnly(iceC_RecordVideo_Recorder_recordVideo_name, sync);
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_Recorder_recordVideo_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_Recorder_recordVideo_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_rtsp);
-        ostr->write(iceP_ms);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_Recorder_recordVideo_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-::std::string
-IceProxy::RecordVideo::Recorder::end_recordVideo(const ::Ice::AsyncResultPtr& result)
-{
-    ::Ice::AsyncResult::_check(result, this, iceC_RecordVideo_Recorder_recordVideo_name);
-    ::std::string ret;
-    if(!result->_waitForResponse())
-    {
-        try
-        {
-            result->_throwUserException();
-        }
-        catch(const ::Ice::UserException& ex)
-        {
-            throw ::Ice::UnknownUserException(__FILE__, __LINE__, ex.ice_id());
-        }
-    }
-    ::Ice::InputStream* istr = result->_startReadParams();
-    istr->read(ret);
-    result->_endReadParams();
-    return ret;
-}
-
-::IceProxy::Ice::Object*
-IceProxy::RecordVideo::Recorder::_newInstance() const
-{
-    return new Recorder;
-}
-
-const ::std::string&
-IceProxy::RecordVideo::Recorder::ice_staticId()
-{
-    return ::RecordVideo::Recorder::ice_staticId();
-}
-::IceProxy::Ice::Object* ::IceProxy::RecordVideo::upCast(::IceProxy::RecordVideo::ImageGrabber* p) { return p; }
-
-void
-::IceProxy::RecordVideo::_readProxy(::Ice::InputStream* istr, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::ImageGrabber>& v)
-{
-    ::Ice::ObjectPrx proxy;
-    istr->read(proxy);
-    if(!proxy)
-    {
-        v = 0;
-    }
-    else
-    {
-        v = new ::IceProxy::RecordVideo::ImageGrabber;
-        v->_copyFrom(proxy);
-    }
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::ImageGrabber::_iceI_begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    _checkTwowayOnly(iceC_RecordVideo_ImageGrabber_grabImage_name, sync);
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_ImageGrabber_grabImage_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_ImageGrabber_grabImage_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_index);
-        ostr->write(iceP_time);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_ImageGrabber_grabImage_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-::RecordVideo::ByteSequence
-IceProxy::RecordVideo::ImageGrabber::end_grabImage(const ::Ice::AsyncResultPtr& result)
-{
-    ::Ice::AsyncResult::_check(result, this, iceC_RecordVideo_ImageGrabber_grabImage_name);
-    ::RecordVideo::ByteSequence ret;
-    if(!result->_waitForResponse())
-    {
-        try
-        {
-            result->_throwUserException();
-        }
-        catch(const ::Ice::UserException& ex)
-        {
-            throw ::Ice::UnknownUserException(__FILE__, __LINE__, ex.ice_id());
-        }
-    }
-    ::Ice::InputStream* istr = result->_startReadParams();
-    istr->read(ret);
-    result->_endReadParams();
-    return ret;
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::ImageGrabber::_iceI_begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    _checkTwowayOnly(iceC_RecordVideo_ImageGrabber_grabImageUrl_name, sync);
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_ImageGrabber_grabImageUrl_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_ImageGrabber_grabImageUrl_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_index);
-        ostr->write(iceP_time);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_ImageGrabber_grabImageUrl_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-::std::string
-IceProxy::RecordVideo::ImageGrabber::end_grabImageUrl(const ::Ice::AsyncResultPtr& result)
-{
-    ::Ice::AsyncResult::_check(result, this, iceC_RecordVideo_ImageGrabber_grabImageUrl_name);
-    ::std::string ret;
-    if(!result->_waitForResponse())
-    {
-        try
-        {
-            result->_throwUserException();
-        }
-        catch(const ::Ice::UserException& ex)
-        {
-            throw ::Ice::UnknownUserException(__FILE__, __LINE__, ex.ice_id());
-        }
-    }
-    ::Ice::InputStream* istr = result->_startReadParams();
-    istr->read(ret);
-    result->_endReadParams();
-    return ret;
-}
-
-::IceProxy::Ice::Object*
-IceProxy::RecordVideo::ImageGrabber::_newInstance() const
-{
-    return new ImageGrabber;
-}
-
-const ::std::string&
-IceProxy::RecordVideo::ImageGrabber::ice_staticId()
-{
-    return ::RecordVideo::ImageGrabber::ice_staticId();
-}
-::IceProxy::Ice::Object* ::IceProxy::RecordVideo::upCast(::IceProxy::RecordVideo::LoopRecorder* p) { return p; }
-
-void
-::IceProxy::RecordVideo::_readProxy(::Ice::InputStream* istr, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::LoopRecorder>& v)
-{
-    ::Ice::ObjectPrx proxy;
-    istr->read(proxy);
-    if(!proxy)
-    {
-        v = 0;
-    }
-    else
-    {
-        v = new ::IceProxy::RecordVideo::LoopRecorder;
-        v->_copyFrom(proxy);
-    }
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::LoopRecorder::_iceI_begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    _checkTwowayOnly(iceC_RecordVideo_LoopRecorder_addCamera_name, sync);
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_LoopRecorder_addCamera_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_LoopRecorder_addCamera_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_index);
-        ostr->write(iceP_rtsp);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_LoopRecorder_addCamera_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-::std::string
-IceProxy::RecordVideo::LoopRecorder::end_addCamera(const ::Ice::AsyncResultPtr& result)
-{
-    ::Ice::AsyncResult::_check(result, this, iceC_RecordVideo_LoopRecorder_addCamera_name);
-    ::std::string ret;
-    if(!result->_waitForResponse())
-    {
-        try
-        {
-            result->_throwUserException();
-        }
-        catch(const ::Ice::UserException& ex)
-        {
-            throw ::Ice::UnknownUserException(__FILE__, __LINE__, ex.ice_id());
-        }
-    }
-    ::Ice::InputStream* istr = result->_startReadParams();
-    istr->read(ret);
-    result->_endReadParams();
-    return ret;
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::LoopRecorder::_iceI_begin_removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_LoopRecorder_removeCamera_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_LoopRecorder_removeCamera_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_index);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_LoopRecorder_removeCamera_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-void
-IceProxy::RecordVideo::LoopRecorder::end_removeCamera(const ::Ice::AsyncResultPtr& result)
-{
-    _end(result, iceC_RecordVideo_LoopRecorder_removeCamera_name);
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::LoopRecorder::_iceI_begin_clearCamera(const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_LoopRecorder_clearCamera_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_LoopRecorder_clearCamera_name, ::Ice::Normal, context);
-        result->writeEmptyParams();
-        result->invoke(iceC_RecordVideo_LoopRecorder_clearCamera_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-void
-IceProxy::RecordVideo::LoopRecorder::end_clearCamera(const ::Ice::AsyncResultPtr& result)
-{
-    _end(result, iceC_RecordVideo_LoopRecorder_clearCamera_name);
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RecordVideo::LoopRecorder::_iceI_begin_feedDog(const ::std::string& iceP_index, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RecordVideo_LoopRecorder_feedDog_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RecordVideo_LoopRecorder_feedDog_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_index);
-        result->endWriteParams();
-        result->invoke(iceC_RecordVideo_LoopRecorder_feedDog_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-void
-IceProxy::RecordVideo::LoopRecorder::end_feedDog(const ::Ice::AsyncResultPtr& result)
-{
-    _end(result, iceC_RecordVideo_LoopRecorder_feedDog_name);
-}
-
-::IceProxy::Ice::Object*
-IceProxy::RecordVideo::LoopRecorder::_newInstance() const
-{
-    return new LoopRecorder;
-}
-
-const ::std::string&
-IceProxy::RecordVideo::LoopRecorder::ice_staticId()
-{
-    return ::RecordVideo::LoopRecorder::ice_staticId();
-}
-
-RecordVideo::Recorder::~Recorder()
-{
-}
-
-::Ice::Object* RecordVideo::upCast(::RecordVideo::Recorder* p) { return p; }
-
-
-namespace
-{
-const ::std::string iceC_RecordVideo_Recorder_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::Recorder"
-};
-
-}
-
-bool
-RecordVideo::Recorder::ice_isA(const ::std::string& s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_Recorder_ids, iceC_RecordVideo_Recorder_ids + 2, s);
-}
-
-::std::vector< ::std::string>
-RecordVideo::Recorder::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector< ::std::string>(&iceC_RecordVideo_Recorder_ids[0], &iceC_RecordVideo_Recorder_ids[2]);
-}
-
-const ::std::string&
-RecordVideo::Recorder::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::Recorder::ice_staticId()
-{
-#ifdef ICE_HAS_THREAD_SAFE_LOCAL_STATIC
-    static const ::std::string typeId = "::RecordVideo::Recorder";
-    return typeId;
-#else
-    return iceC_RecordVideo_Recorder_ids[1];
-#endif
-}
-
-bool
-RecordVideo::Recorder::_iceD_recordVideo(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::std::string iceP_rtsp;
-    ::Ice::Long iceP_ms;
-    istr->read(iceP_rtsp);
-    istr->read(iceP_ms);
-    inS.endReadParams();
-    ::std::string ret = this->recordVideo(iceP_rtsp, iceP_ms, current);
-    ::Ice::OutputStream* ostr = inS.startWriteParams();
-    ostr->write(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-namespace
-{
-const ::std::string iceC_RecordVideo_Recorder_all[] =
-{
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "recordVideo"
-};
-
-}
-
-bool
-RecordVideo::Recorder::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_Recorder_all, iceC_RecordVideo_Recorder_all + 5, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_Recorder_all)
-    {
-        case 0:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 1:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 4:
-        {
-            return _iceD_recordVideo(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RecordVideo::Recorder::_iceWriteImpl(::Ice::OutputStream* ostr) const
-{
-    ostr->startSlice(ice_staticId(), -1, true);
-    Ice::StreamWriter< ::RecordVideo::Recorder, ::Ice::OutputStream>::write(ostr, *this);
-    ostr->endSlice();
-}
-
-void
-RecordVideo::Recorder::_iceReadImpl(::Ice::InputStream* istr)
-{
-    istr->startSlice();
-    Ice::StreamReader< ::RecordVideo::Recorder, ::Ice::InputStream>::read(istr, *this);
-    istr->endSlice();
-}
-
-void
-RecordVideo::_icePatchObjectPtr(RecorderPtr& handle, const ::Ice::ObjectPtr& v)
-{
-    handle = ::RecordVideo::RecorderPtr::dynamicCast(v);
-    if(v && !handle)
-    {
-        IceInternal::Ex::throwUOE(::RecordVideo::Recorder::ice_staticId(), v);
-    }
-}
-
-RecordVideo::ImageGrabber::~ImageGrabber()
-{
-}
-
-::Ice::Object* RecordVideo::upCast(::RecordVideo::ImageGrabber* p) { return p; }
-
-
-namespace
-{
-const ::std::string iceC_RecordVideo_ImageGrabber_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::ImageGrabber"
-};
-
-}
-
-bool
-RecordVideo::ImageGrabber::ice_isA(const ::std::string& s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_ImageGrabber_ids, iceC_RecordVideo_ImageGrabber_ids + 2, s);
-}
-
-::std::vector< ::std::string>
-RecordVideo::ImageGrabber::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector< ::std::string>(&iceC_RecordVideo_ImageGrabber_ids[0], &iceC_RecordVideo_ImageGrabber_ids[2]);
-}
-
-const ::std::string&
-RecordVideo::ImageGrabber::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::ImageGrabber::ice_staticId()
-{
-#ifdef ICE_HAS_THREAD_SAFE_LOCAL_STATIC
-    static const ::std::string typeId = "::RecordVideo::ImageGrabber";
-    return typeId;
-#else
-    return iceC_RecordVideo_ImageGrabber_ids[1];
-#endif
-}
-
-bool
-RecordVideo::ImageGrabber::_iceD_grabImage(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::Ice::Int iceP_index;
-    ::std::string iceP_time;
-    istr->read(iceP_index);
-    istr->read(iceP_time);
-    inS.endReadParams();
-    ::RecordVideo::ByteSequence ret = this->grabImage(iceP_index, iceP_time, current);
-    ::Ice::OutputStream* ostr = inS.startWriteParams();
-    ostr->write(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::ImageGrabber::_iceD_grabImageUrl(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::Ice::Int iceP_index;
-    ::std::string iceP_time;
-    istr->read(iceP_index);
-    istr->read(iceP_time);
-    inS.endReadParams();
-    ::std::string ret = this->grabImageUrl(iceP_index, iceP_time, current);
-    ::Ice::OutputStream* ostr = inS.startWriteParams();
-    ostr->write(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-namespace
-{
-const ::std::string iceC_RecordVideo_ImageGrabber_all[] =
-{
-    "grabImage",
-    "grabImageUrl",
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping"
-};
-
-}
-
-bool
-RecordVideo::ImageGrabber::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_ImageGrabber_all, iceC_RecordVideo_ImageGrabber_all + 6, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_ImageGrabber_all)
-    {
-        case 0:
-        {
-            return _iceD_grabImage(in, current);
-        }
-        case 1:
-        {
-            return _iceD_grabImageUrl(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 4:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 5:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RecordVideo::ImageGrabber::_iceWriteImpl(::Ice::OutputStream* ostr) const
-{
-    ostr->startSlice(ice_staticId(), -1, true);
-    Ice::StreamWriter< ::RecordVideo::ImageGrabber, ::Ice::OutputStream>::write(ostr, *this);
-    ostr->endSlice();
-}
-
-void
-RecordVideo::ImageGrabber::_iceReadImpl(::Ice::InputStream* istr)
-{
-    istr->startSlice();
-    Ice::StreamReader< ::RecordVideo::ImageGrabber, ::Ice::InputStream>::read(istr, *this);
-    istr->endSlice();
-}
-
-void
-RecordVideo::_icePatchObjectPtr(ImageGrabberPtr& handle, const ::Ice::ObjectPtr& v)
-{
-    handle = ::RecordVideo::ImageGrabberPtr::dynamicCast(v);
-    if(v && !handle)
-    {
-        IceInternal::Ex::throwUOE(::RecordVideo::ImageGrabber::ice_staticId(), v);
-    }
-}
-
-RecordVideo::LoopRecorder::~LoopRecorder()
-{
-}
-
-::Ice::Object* RecordVideo::upCast(::RecordVideo::LoopRecorder* p) { return p; }
-
-
-namespace
-{
-const ::std::string iceC_RecordVideo_LoopRecorder_ids[2] =
-{
-    "::Ice::Object",
-    "::RecordVideo::LoopRecorder"
-};
-
-}
-
-bool
-RecordVideo::LoopRecorder::ice_isA(const ::std::string& s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RecordVideo_LoopRecorder_ids, iceC_RecordVideo_LoopRecorder_ids + 2, s);
-}
-
-::std::vector< ::std::string>
-RecordVideo::LoopRecorder::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector< ::std::string>(&iceC_RecordVideo_LoopRecorder_ids[0], &iceC_RecordVideo_LoopRecorder_ids[2]);
-}
-
-const ::std::string&
-RecordVideo::LoopRecorder::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RecordVideo::LoopRecorder::ice_staticId()
-{
-#ifdef ICE_HAS_THREAD_SAFE_LOCAL_STATIC
-    static const ::std::string typeId = "::RecordVideo::LoopRecorder";
-    return typeId;
-#else
-    return iceC_RecordVideo_LoopRecorder_ids[1];
-#endif
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_addCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::std::string iceP_index;
-    ::std::string iceP_rtsp;
-    istr->read(iceP_index);
-    istr->read(iceP_rtsp);
-    inS.endReadParams();
-    ::std::string ret = this->addCamera(iceP_index, iceP_rtsp, current);
-    ::Ice::OutputStream* ostr = inS.startWriteParams();
-    ostr->write(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_removeCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::std::string iceP_index;
-    istr->read(iceP_index);
-    inS.endReadParams();
-    this->removeCamera(iceP_index, current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_clearCamera(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    inS.readEmptyParams();
-    this->clearCamera(current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-bool
-RecordVideo::LoopRecorder::_iceD_feedDog(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::std::string iceP_index;
-    istr->read(iceP_index);
-    inS.endReadParams();
-    this->feedDog(iceP_index, current);
-    inS.writeEmptyParams();
-    return true;
-}
-
-namespace
-{
-const ::std::string iceC_RecordVideo_LoopRecorder_all[] =
-{
-    "addCamera",
-    "clearCamera",
-    "feedDog",
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "removeCamera"
-};
-
-}
-
-bool
-RecordVideo::LoopRecorder::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RecordVideo_LoopRecorder_all, iceC_RecordVideo_LoopRecorder_all + 8, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RecordVideo_LoopRecorder_all)
-    {
-        case 0:
-        {
-            return _iceD_addCamera(in, current);
-        }
-        case 1:
-        {
-            return _iceD_clearCamera(in, current);
-        }
-        case 2:
-        {
-            return _iceD_feedDog(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 4:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 5:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 6:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 7:
-        {
-            return _iceD_removeCamera(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RecordVideo::LoopRecorder::_iceWriteImpl(::Ice::OutputStream* ostr) const
-{
-    ostr->startSlice(ice_staticId(), -1, true);
-    Ice::StreamWriter< ::RecordVideo::LoopRecorder, ::Ice::OutputStream>::write(ostr, *this);
-    ostr->endSlice();
-}
-
-void
-RecordVideo::LoopRecorder::_iceReadImpl(::Ice::InputStream* istr)
-{
-    istr->startSlice();
-    Ice::StreamReader< ::RecordVideo::LoopRecorder, ::Ice::InputStream>::read(istr, *this);
-    istr->endSlice();
-}
-
-void
-RecordVideo::_icePatchObjectPtr(LoopRecorderPtr& handle, const ::Ice::ObjectPtr& v)
-{
-    handle = ::RecordVideo::LoopRecorderPtr::dynamicCast(v);
-    if(v && !handle)
-    {
-        IceInternal::Ex::throwUOE(::RecordVideo::LoopRecorder::ice_staticId(), v);
-    }
-}
-
-namespace Ice
-{
-}
-
-#endif
diff --git a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.h b/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.h
deleted file mode 100644
index b6c1647..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.h
+++ /dev/null
@@ -1,1571 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-//
-// Ice version 3.7.0
-//
-// <auto-generated>
-//
-// Generated from file `RecordVideo.ice'
-//
-// Warning: do not edit this file.
-//
-// </auto-generated>
-//
-
-#ifndef __RecordVideo_h__
-#define __RecordVideo_h__
-
-#include <IceUtil/PushDisableWarnings.h>
-#include <Ice/ProxyF.h>
-#include <Ice/ObjectF.h>
-#include <Ice/ValueF.h>
-#include <Ice/Exception.h>
-#include <Ice/LocalObject.h>
-#include <Ice/StreamHelpers.h>
-#include <Ice/Comparable.h>
-#include <Ice/Proxy.h>
-#include <Ice/Object.h>
-#include <Ice/GCObject.h>
-#include <Ice/Value.h>
-#include <Ice/Incoming.h>
-#include <Ice/FactoryTableInit.h>
-#include <IceUtil/ScopedArray.h>
-#include <Ice/Optional.h>
-#include <IceUtil/UndefSysMacros.h>
-
-#ifndef ICE_IGNORE_VERSION
-#   if ICE_INT_VERSION / 100 != 307
-#       error Ice version mismatch!
-#   endif
-#   if ICE_INT_VERSION % 100 > 50
-#       error Beta header file detected
-#   endif
-#   if ICE_INT_VERSION % 100 < 0
-#       error Ice patch level mismatch!
-#   endif
-#endif
-
-#ifdef ICE_CPP11_MAPPING // C++11 mapping
-
-namespace RecordVideo
-{
-
-class Recorder;
-class RecorderPrx;
-class ImageGrabber;
-class ImageGrabberPrx;
-class LoopRecorder;
-class LoopRecorderPrx;
-
-}
-
-namespace RecordVideo
-{
-
-using ByteSequence = ::std::vector<::Ice::Byte>;
-
-}
-
-namespace RecordVideo
-{
-
-class Recorder : public virtual ::Ice::Object
-{
-public:
-
-    using ProxyType = RecorderPrx;
-
-    virtual bool ice_isA(::std::string, const ::Ice::Current&) const override;
-    virtual ::std::vector<::std::string> ice_ids(const ::Ice::Current&) const override;
-    virtual ::std::string ice_id(const ::Ice::Current&) const override;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string recordVideo(::std::string, long long int, const ::Ice::Current&) = 0;
-    bool _iceD_recordVideo(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&) override;
-};
-
-class ImageGrabber : public virtual ::Ice::Object
-{
-public:
-
-    using ProxyType = ImageGrabberPrx;
-
-    virtual bool ice_isA(::std::string, const ::Ice::Current&) const override;
-    virtual ::std::vector<::std::string> ice_ids(const ::Ice::Current&) const override;
-    virtual ::std::string ice_id(const ::Ice::Current&) const override;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::RecordVideo::ByteSequence grabImage(int, ::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_grabImage(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual ::std::string grabImageUrl(int, ::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_grabImageUrl(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&) override;
-};
-
-class LoopRecorder : public virtual ::Ice::Object
-{
-public:
-
-    using ProxyType = LoopRecorderPrx;
-
-    virtual bool ice_isA(::std::string, const ::Ice::Current&) const override;
-    virtual ::std::vector<::std::string> ice_ids(const ::Ice::Current&) const override;
-    virtual ::std::string ice_id(const ::Ice::Current&) const override;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string addCamera(::std::string, ::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_addCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void removeCamera(::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_removeCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void clearCamera(const ::Ice::Current&) = 0;
-    bool _iceD_clearCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void feedDog(::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_feedDog(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&) override;
-};
-
-}
-
-namespace RecordVideo
-{
-
-class RecorderPrx : public virtual ::Ice::Proxy<RecorderPrx, ::Ice::ObjectPrx>
-{
-public:
-
-    ::std::string recordVideo(const ::std::string& iceP_rtsp, long long int iceP_ms, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makePromiseOutgoing<::std::string>(true, this, &RecordVideo::RecorderPrx::_iceI_recordVideo, iceP_rtsp, iceP_ms, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto recordVideoAsync(const ::std::string& iceP_rtsp, long long int iceP_ms, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<::std::string>>().get_future())
-    {
-        return _makePromiseOutgoing<::std::string, P>(false, this, &RecordVideo::RecorderPrx::_iceI_recordVideo, iceP_rtsp, iceP_ms, context);
-    }
-
-    ::std::function<void()>
-    recordVideoAsync(const ::std::string& iceP_rtsp, long long int iceP_ms,
-                     ::std::function<void(::std::string)> response,
-                     ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                     ::std::function<void(bool)> sent = nullptr,
-                     const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<::std::string>(response, ex, sent, this, &RecordVideo::RecorderPrx::_iceI_recordVideo, iceP_rtsp, iceP_ms, context);
-    }
-
-    void _iceI_recordVideo(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>&, const ::std::string&, long long int, const ::Ice::Context&);
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    RecorderPrx() = default;
-    friend ::std::shared_ptr<RecorderPrx> IceInternal::createProxy<RecorderPrx>();
-
-    virtual ::std::shared_ptr<::Ice::ObjectPrx> _newInstance() const override;
-};
-
-class ImageGrabberPrx : public virtual ::Ice::Proxy<ImageGrabberPrx, ::Ice::ObjectPrx>
-{
-public:
-
-    ::RecordVideo::ByteSequence grabImage(int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makePromiseOutgoing<::RecordVideo::ByteSequence>(true, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImage, iceP_index, iceP_time, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto grabImageAsync(int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<::RecordVideo::ByteSequence>>().get_future())
-    {
-        return _makePromiseOutgoing<::RecordVideo::ByteSequence, P>(false, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImage, iceP_index, iceP_time, context);
-    }
-
-    ::std::function<void()>
-    grabImageAsync(int iceP_index, const ::std::string& iceP_time,
-                   ::std::function<void(::RecordVideo::ByteSequence)> response,
-                   ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                   ::std::function<void(bool)> sent = nullptr,
-                   const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<::RecordVideo::ByteSequence>(response, ex, sent, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImage, iceP_index, iceP_time, context);
-    }
-
-    void _iceI_grabImage(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::RecordVideo::ByteSequence>>&, int, const ::std::string&, const ::Ice::Context&);
-
-    ::std::string grabImageUrl(int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makePromiseOutgoing<::std::string>(true, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImageUrl, iceP_index, iceP_time, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto grabImageUrlAsync(int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<::std::string>>().get_future())
-    {
-        return _makePromiseOutgoing<::std::string, P>(false, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImageUrl, iceP_index, iceP_time, context);
-    }
-
-    ::std::function<void()>
-    grabImageUrlAsync(int iceP_index, const ::std::string& iceP_time,
-                      ::std::function<void(::std::string)> response,
-                      ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                      ::std::function<void(bool)> sent = nullptr,
-                      const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<::std::string>(response, ex, sent, this, &RecordVideo::ImageGrabberPrx::_iceI_grabImageUrl, iceP_index, iceP_time, context);
-    }
-
-    void _iceI_grabImageUrl(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>&, int, const ::std::string&, const ::Ice::Context&);
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    ImageGrabberPrx() = default;
-    friend ::std::shared_ptr<ImageGrabberPrx> IceInternal::createProxy<ImageGrabberPrx>();
-
-    virtual ::std::shared_ptr<::Ice::ObjectPrx> _newInstance() const override;
-};
-
-class LoopRecorderPrx : public virtual ::Ice::Proxy<LoopRecorderPrx, ::Ice::ObjectPrx>
-{
-public:
-
-    ::std::string addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makePromiseOutgoing<::std::string>(true, this, &RecordVideo::LoopRecorderPrx::_iceI_addCamera, iceP_index, iceP_rtsp, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto addCameraAsync(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<::std::string>>().get_future())
-    {
-        return _makePromiseOutgoing<::std::string, P>(false, this, &RecordVideo::LoopRecorderPrx::_iceI_addCamera, iceP_index, iceP_rtsp, context);
-    }
-
-    ::std::function<void()>
-    addCameraAsync(const ::std::string& iceP_index, const ::std::string& iceP_rtsp,
-                   ::std::function<void(::std::string)> response,
-                   ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                   ::std::function<void(bool)> sent = nullptr,
-                   const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<::std::string>(response, ex, sent, this, &RecordVideo::LoopRecorderPrx::_iceI_addCamera, iceP_index, iceP_rtsp, context);
-    }
-
-    void _iceI_addCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>&, const ::std::string&, const ::std::string&, const ::Ice::Context&);
-
-    void removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        _makePromiseOutgoing<void>(true, this, &RecordVideo::LoopRecorderPrx::_iceI_removeCamera, iceP_index, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto removeCameraAsync(const ::std::string& iceP_index, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<void>>().get_future())
-    {
-        return _makePromiseOutgoing<void, P>(false, this, &RecordVideo::LoopRecorderPrx::_iceI_removeCamera, iceP_index, context);
-    }
-
-    ::std::function<void()>
-    removeCameraAsync(const ::std::string& iceP_index,
-                      ::std::function<void()> response,
-                      ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                      ::std::function<void(bool)> sent = nullptr,
-                      const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<void>(response, ex, sent, this, &RecordVideo::LoopRecorderPrx::_iceI_removeCamera, iceP_index, context);
-    }
-
-    void _iceI_removeCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>&, const ::std::string&, const ::Ice::Context&);
-
-    void clearCamera(const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        _makePromiseOutgoing<void>(true, this, &RecordVideo::LoopRecorderPrx::_iceI_clearCamera, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto clearCameraAsync(const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<void>>().get_future())
-    {
-        return _makePromiseOutgoing<void, P>(false, this, &RecordVideo::LoopRecorderPrx::_iceI_clearCamera, context);
-    }
-
-    ::std::function<void()>
-    clearCameraAsync(::std::function<void()> response,
-                     ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                     ::std::function<void(bool)> sent = nullptr,
-                     const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<void>(response, ex, sent, this, &RecordVideo::LoopRecorderPrx::_iceI_clearCamera, context);
-    }
-
-    void _iceI_clearCamera(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>&, const ::Ice::Context&);
-
-    void feedDog(const ::std::string& iceP_index, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        _makePromiseOutgoing<void>(true, this, &RecordVideo::LoopRecorderPrx::_iceI_feedDog, iceP_index, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto feedDogAsync(const ::std::string& iceP_index, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<void>>().get_future())
-    {
-        return _makePromiseOutgoing<void, P>(false, this, &RecordVideo::LoopRecorderPrx::_iceI_feedDog, iceP_index, context);
-    }
-
-    ::std::function<void()>
-    feedDogAsync(const ::std::string& iceP_index,
-                 ::std::function<void()> response,
-                 ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                 ::std::function<void(bool)> sent = nullptr,
-                 const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<void>(response, ex, sent, this, &RecordVideo::LoopRecorderPrx::_iceI_feedDog, iceP_index, context);
-    }
-
-    void _iceI_feedDog(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<void>>&, const ::std::string&, const ::Ice::Context&);
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    LoopRecorderPrx() = default;
-    friend ::std::shared_ptr<LoopRecorderPrx> IceInternal::createProxy<LoopRecorderPrx>();
-
-    virtual ::std::shared_ptr<::Ice::ObjectPrx> _newInstance() const override;
-};
-
-}
-
-namespace Ice
-{
-
-}
-
-namespace RecordVideo
-{
-
-using RecorderPtr = ::std::shared_ptr<Recorder>;
-using RecorderPrxPtr = ::std::shared_ptr<RecorderPrx>;
-
-using ImageGrabberPtr = ::std::shared_ptr<ImageGrabber>;
-using ImageGrabberPrxPtr = ::std::shared_ptr<ImageGrabberPrx>;
-
-using LoopRecorderPtr = ::std::shared_ptr<LoopRecorder>;
-using LoopRecorderPrxPtr = ::std::shared_ptr<LoopRecorderPrx>;
-
-}
-
-#else // C++98 mapping
-
-namespace IceProxy
-{
-
-namespace RecordVideo
-{
-
-class Recorder;
-void _readProxy(::Ice::InputStream*, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::Recorder>&);
-::IceProxy::Ice::Object* upCast(::IceProxy::RecordVideo::Recorder*);
-
-class ImageGrabber;
-void _readProxy(::Ice::InputStream*, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::ImageGrabber>&);
-::IceProxy::Ice::Object* upCast(::IceProxy::RecordVideo::ImageGrabber*);
-
-class LoopRecorder;
-void _readProxy(::Ice::InputStream*, ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::LoopRecorder>&);
-::IceProxy::Ice::Object* upCast(::IceProxy::RecordVideo::LoopRecorder*);
-
-}
-
-}
-
-namespace RecordVideo
-{
-
-class Recorder;
-::Ice::Object* upCast(::RecordVideo::Recorder*);
-typedef ::IceInternal::Handle< ::RecordVideo::Recorder> RecorderPtr;
-typedef ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::Recorder> RecorderPrx;
-typedef RecorderPrx RecorderPrxPtr;
-void _icePatchObjectPtr(RecorderPtr&, const ::Ice::ObjectPtr&);
-
-class ImageGrabber;
-::Ice::Object* upCast(::RecordVideo::ImageGrabber*);
-typedef ::IceInternal::Handle< ::RecordVideo::ImageGrabber> ImageGrabberPtr;
-typedef ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::ImageGrabber> ImageGrabberPrx;
-typedef ImageGrabberPrx ImageGrabberPrxPtr;
-void _icePatchObjectPtr(ImageGrabberPtr&, const ::Ice::ObjectPtr&);
-
-class LoopRecorder;
-::Ice::Object* upCast(::RecordVideo::LoopRecorder*);
-typedef ::IceInternal::Handle< ::RecordVideo::LoopRecorder> LoopRecorderPtr;
-typedef ::IceInternal::ProxyHandle< ::IceProxy::RecordVideo::LoopRecorder> LoopRecorderPrx;
-typedef LoopRecorderPrx LoopRecorderPrxPtr;
-void _icePatchObjectPtr(LoopRecorderPtr&, const ::Ice::ObjectPtr&);
-
-}
-
-namespace RecordVideo
-{
-
-typedef ::std::vector< ::Ice::Byte> ByteSequence;
-
-}
-
-namespace RecordVideo
-{
-
-class Callback_Recorder_recordVideo_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_Recorder_recordVideo_Base> Callback_Recorder_recordVideoPtr;
-
-class Callback_ImageGrabber_grabImage_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_ImageGrabber_grabImage_Base> Callback_ImageGrabber_grabImagePtr;
-
-class Callback_ImageGrabber_grabImageUrl_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_ImageGrabber_grabImageUrl_Base> Callback_ImageGrabber_grabImageUrlPtr;
-
-class Callback_LoopRecorder_addCamera_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_LoopRecorder_addCamera_Base> Callback_LoopRecorder_addCameraPtr;
-
-class Callback_LoopRecorder_removeCamera_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_LoopRecorder_removeCamera_Base> Callback_LoopRecorder_removeCameraPtr;
-
-class Callback_LoopRecorder_clearCamera_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_LoopRecorder_clearCamera_Base> Callback_LoopRecorder_clearCameraPtr;
-
-class Callback_LoopRecorder_feedDog_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_LoopRecorder_feedDog_Base> Callback_LoopRecorder_feedDogPtr;
-
-}
-
-namespace IceProxy
-{
-
-namespace RecordVideo
-{
-
-class Recorder : public virtual ::Ice::Proxy<Recorder, ::IceProxy::Ice::Object>
-{
-public:
-
-    ::std::string recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return end_recordVideo(_iceI_begin_recordVideo(iceP_rtsp, iceP_ms, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_recordVideo(iceP_rtsp, iceP_ms, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_rtsp, iceP_ms, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_rtsp, iceP_ms, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::RecordVideo::Callback_Recorder_recordVideoPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_rtsp, iceP_ms, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_rtsp, ::Ice::Long iceP_ms, const ::Ice::Context& context, const ::RecordVideo::Callback_Recorder_recordVideoPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_rtsp, iceP_ms, context, del, cookie);
-    }
-
-    ::std::string end_recordVideo(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_recordVideo(const ::std::string&, ::Ice::Long, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    virtual ::IceProxy::Ice::Object* _newInstance() const;
-};
-
-class ImageGrabber : public virtual ::Ice::Proxy<ImageGrabber, ::IceProxy::Ice::Object>
-{
-public:
-
-    ::RecordVideo::ByteSequence grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return end_grabImage(_iceI_begin_grabImage(iceP_index, iceP_time, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_grabImage(iceP_index, iceP_time, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImage(iceP_index, iceP_time, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImage(iceP_index, iceP_time, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::RecordVideo::Callback_ImageGrabber_grabImagePtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImage(iceP_index, iceP_time, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImage(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::RecordVideo::Callback_ImageGrabber_grabImagePtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImage(iceP_index, iceP_time, context, del, cookie);
-    }
-
-    ::RecordVideo::ByteSequence end_grabImage(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_grabImage(::Ice::Int, const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    ::std::string grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return end_grabImageUrl(_iceI_begin_grabImageUrl(iceP_index, iceP_time, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_grabImageUrl(iceP_index, iceP_time, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImageUrl(iceP_index, iceP_time, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImageUrl(iceP_index, iceP_time, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::RecordVideo::Callback_ImageGrabber_grabImageUrlPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImageUrl(iceP_index, iceP_time, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_grabImageUrl(::Ice::Int iceP_index, const ::std::string& iceP_time, const ::Ice::Context& context, const ::RecordVideo::Callback_ImageGrabber_grabImageUrlPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_grabImageUrl(iceP_index, iceP_time, context, del, cookie);
-    }
-
-    ::std::string end_grabImageUrl(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_grabImageUrl(::Ice::Int, const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    virtual ::IceProxy::Ice::Object* _newInstance() const;
-};
-
-class LoopRecorder : public virtual ::Ice::Proxy<LoopRecorder, ::IceProxy::Ice::Object>
-{
-public:
-
-    ::std::string addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return end_addCamera(_iceI_begin_addCamera(iceP_index, iceP_rtsp, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_addCamera(iceP_index, iceP_rtsp, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_addCamera(iceP_index, iceP_rtsp, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_addCamera(iceP_index, iceP_rtsp, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::RecordVideo::Callback_LoopRecorder_addCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_addCamera(iceP_index, iceP_rtsp, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_addCamera(const ::std::string& iceP_index, const ::std::string& iceP_rtsp, const ::Ice::Context& context, const ::RecordVideo::Callback_LoopRecorder_addCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_addCamera(iceP_index, iceP_rtsp, context, del, cookie);
-    }
-
-    ::std::string end_addCamera(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_addCamera(const ::std::string&, const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    void removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        end_removeCamera(_iceI_begin_removeCamera(iceP_index, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_removeCamera(iceP_index, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_removeCamera(const ::std::string& iceP_index, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_removeCamera(iceP_index, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_removeCamera(iceP_index, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_removeCamera(const ::std::string& iceP_index, const ::RecordVideo::Callback_LoopRecorder_removeCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_removeCamera(iceP_index, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_removeCamera(const ::std::string& iceP_index, const ::Ice::Context& context, const ::RecordVideo::Callback_LoopRecorder_removeCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_removeCamera(iceP_index, context, del, cookie);
-    }
-
-    void end_removeCamera(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_removeCamera(const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    void clearCamera(const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        end_clearCamera(_iceI_begin_clearCamera(context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_clearCamera(const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_clearCamera(context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_clearCamera(const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_clearCamera(::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_clearCamera(const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_clearCamera(context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_clearCamera(const ::RecordVideo::Callback_LoopRecorder_clearCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_clearCamera(::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_clearCamera(const ::Ice::Context& context, const ::RecordVideo::Callback_LoopRecorder_clearCameraPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_clearCamera(context, del, cookie);
-    }
-
-    void end_clearCamera(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_clearCamera(const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    void feedDog(const ::std::string& iceP_index, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        end_feedDog(_iceI_begin_feedDog(iceP_index, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_feedDog(const ::std::string& iceP_index, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_feedDog(iceP_index, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_feedDog(const ::std::string& iceP_index, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_feedDog(iceP_index, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_feedDog(const ::std::string& iceP_index, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_feedDog(iceP_index, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_feedDog(const ::std::string& iceP_index, const ::RecordVideo::Callback_LoopRecorder_feedDogPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_feedDog(iceP_index, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_feedDog(const ::std::string& iceP_index, const ::Ice::Context& context, const ::RecordVideo::Callback_LoopRecorder_feedDogPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_feedDog(iceP_index, context, del, cookie);
-    }
-
-    void end_feedDog(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_feedDog(const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    virtual ::IceProxy::Ice::Object* _newInstance() const;
-};
-
-}
-
-}
-
-namespace RecordVideo
-{
-
-class Recorder : public virtual ::Ice::Object
-{
-public:
-
-    typedef RecorderPrx ProxyType;
-    typedef RecorderPtr PointerType;
-
-    virtual ~Recorder();
-
-    virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string recordVideo(const ::std::string&, ::Ice::Long, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_recordVideo(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&);
-
-protected:
-
-    virtual void _iceWriteImpl(::Ice::OutputStream*) const;
-    virtual void _iceReadImpl(::Ice::InputStream*);
-};
-
-inline bool operator==(const Recorder& lhs, const Recorder& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) == static_cast<const ::Ice::Object&>(rhs);
-}
-
-inline bool operator<(const Recorder& lhs, const Recorder& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) < static_cast<const ::Ice::Object&>(rhs);
-}
-
-class ImageGrabber : public virtual ::Ice::Object
-{
-public:
-
-    typedef ImageGrabberPrx ProxyType;
-    typedef ImageGrabberPtr PointerType;
-
-    virtual ~ImageGrabber();
-
-    virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::RecordVideo::ByteSequence grabImage(::Ice::Int, const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_grabImage(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual ::std::string grabImageUrl(::Ice::Int, const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_grabImageUrl(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&);
-
-protected:
-
-    virtual void _iceWriteImpl(::Ice::OutputStream*) const;
-    virtual void _iceReadImpl(::Ice::InputStream*);
-};
-
-inline bool operator==(const ImageGrabber& lhs, const ImageGrabber& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) == static_cast<const ::Ice::Object&>(rhs);
-}
-
-inline bool operator<(const ImageGrabber& lhs, const ImageGrabber& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) < static_cast<const ::Ice::Object&>(rhs);
-}
-
-class LoopRecorder : public virtual ::Ice::Object
-{
-public:
-
-    typedef LoopRecorderPrx ProxyType;
-    typedef LoopRecorderPtr PointerType;
-
-    virtual ~LoopRecorder();
-
-    virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string addCamera(const ::std::string&, const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_addCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void removeCamera(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_removeCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void clearCamera(const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_clearCamera(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual void feedDog(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_feedDog(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&);
-
-protected:
-
-    virtual void _iceWriteImpl(::Ice::OutputStream*) const;
-    virtual void _iceReadImpl(::Ice::InputStream*);
-};
-
-inline bool operator==(const LoopRecorder& lhs, const LoopRecorder& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) == static_cast<const ::Ice::Object&>(rhs);
-}
-
-inline bool operator<(const LoopRecorder& lhs, const LoopRecorder& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) < static_cast<const ::Ice::Object&>(rhs);
-}
-
-}
-
-namespace Ice
-{
-
-}
-
-namespace RecordVideo
-{
-
-template<class T>
-class CallbackNC_Recorder_recordVideo : public Callback_Recorder_recordVideo_Base, public ::IceInternal::TwowayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)(const ::std::string&);
-
-    CallbackNC_Recorder_recordVideo(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallbackNC<T>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::RecorderPrx proxy = ::RecordVideo::RecorderPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_recordVideo(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::CallbackNC<T>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::CallbackNC<T>::_callback.get()->*_response)(ret);
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T> Callback_Recorder_recordVideoPtr
-newCallback_Recorder_recordVideo(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_Recorder_recordVideo<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_Recorder_recordVideoPtr
-newCallback_Recorder_recordVideo(T* instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_Recorder_recordVideo<T>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_Recorder_recordVideo : public Callback_Recorder_recordVideo_Base, public ::IceInternal::TwowayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const ::std::string&, const CT&);
-
-    Callback_Recorder_recordVideo(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallback<T, CT>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::RecorderPrx proxy = ::RecordVideo::RecorderPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_recordVideo(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::Callback<T, CT>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::Callback<T, CT>::_callback.get()->*_response)(ret, CT::dynamicCast(result->getCookie()));
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T, typename CT> Callback_Recorder_recordVideoPtr
-newCallback_Recorder_recordVideo(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_Recorder_recordVideo<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_Recorder_recordVideoPtr
-newCallback_Recorder_recordVideo(T* instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_Recorder_recordVideo<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_ImageGrabber_grabImage : public Callback_ImageGrabber_grabImage_Base, public ::IceInternal::TwowayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)(const ::RecordVideo::ByteSequence&);
-
-    CallbackNC_ImageGrabber_grabImage(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallbackNC<T>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::ImageGrabberPrx proxy = ::RecordVideo::ImageGrabberPrx::uncheckedCast(result->getProxy());
-        ::RecordVideo::ByteSequence ret;
-        try
-        {
-            ret = proxy->end_grabImage(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::CallbackNC<T>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::CallbackNC<T>::_callback.get()->*_response)(ret);
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T> Callback_ImageGrabber_grabImagePtr
-newCallback_ImageGrabber_grabImage(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::RecordVideo::ByteSequence&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_ImageGrabber_grabImage<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_ImageGrabber_grabImagePtr
-newCallback_ImageGrabber_grabImage(T* instance, void (T::*cb)(const ::RecordVideo::ByteSequence&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_ImageGrabber_grabImage<T>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_ImageGrabber_grabImage : public Callback_ImageGrabber_grabImage_Base, public ::IceInternal::TwowayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const ::RecordVideo::ByteSequence&, const CT&);
-
-    Callback_ImageGrabber_grabImage(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallback<T, CT>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::ImageGrabberPrx proxy = ::RecordVideo::ImageGrabberPrx::uncheckedCast(result->getProxy());
-        ::RecordVideo::ByteSequence ret;
-        try
-        {
-            ret = proxy->end_grabImage(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::Callback<T, CT>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::Callback<T, CT>::_callback.get()->*_response)(ret, CT::dynamicCast(result->getCookie()));
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T, typename CT> Callback_ImageGrabber_grabImagePtr
-newCallback_ImageGrabber_grabImage(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::RecordVideo::ByteSequence&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_ImageGrabber_grabImage<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_ImageGrabber_grabImagePtr
-newCallback_ImageGrabber_grabImage(T* instance, void (T::*cb)(const ::RecordVideo::ByteSequence&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_ImageGrabber_grabImage<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_ImageGrabber_grabImageUrl : public Callback_ImageGrabber_grabImageUrl_Base, public ::IceInternal::TwowayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)(const ::std::string&);
-
-    CallbackNC_ImageGrabber_grabImageUrl(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallbackNC<T>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::ImageGrabberPrx proxy = ::RecordVideo::ImageGrabberPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_grabImageUrl(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::CallbackNC<T>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::CallbackNC<T>::_callback.get()->*_response)(ret);
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T> Callback_ImageGrabber_grabImageUrlPtr
-newCallback_ImageGrabber_grabImageUrl(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_ImageGrabber_grabImageUrl<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_ImageGrabber_grabImageUrlPtr
-newCallback_ImageGrabber_grabImageUrl(T* instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_ImageGrabber_grabImageUrl<T>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_ImageGrabber_grabImageUrl : public Callback_ImageGrabber_grabImageUrl_Base, public ::IceInternal::TwowayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const ::std::string&, const CT&);
-
-    Callback_ImageGrabber_grabImageUrl(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallback<T, CT>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::ImageGrabberPrx proxy = ::RecordVideo::ImageGrabberPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_grabImageUrl(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::Callback<T, CT>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::Callback<T, CT>::_callback.get()->*_response)(ret, CT::dynamicCast(result->getCookie()));
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T, typename CT> Callback_ImageGrabber_grabImageUrlPtr
-newCallback_ImageGrabber_grabImageUrl(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_ImageGrabber_grabImageUrl<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_ImageGrabber_grabImageUrlPtr
-newCallback_ImageGrabber_grabImageUrl(T* instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_ImageGrabber_grabImageUrl<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_LoopRecorder_addCamera : public Callback_LoopRecorder_addCamera_Base, public ::IceInternal::TwowayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)(const ::std::string&);
-
-    CallbackNC_LoopRecorder_addCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallbackNC<T>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::LoopRecorderPrx proxy = ::RecordVideo::LoopRecorderPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_addCamera(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::CallbackNC<T>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::CallbackNC<T>::_callback.get()->*_response)(ret);
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T> Callback_LoopRecorder_addCameraPtr
-newCallback_LoopRecorder_addCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_addCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_addCameraPtr
-newCallback_LoopRecorder_addCamera(T* instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_addCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_LoopRecorder_addCamera : public Callback_LoopRecorder_addCamera_Base, public ::IceInternal::TwowayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const ::std::string&, const CT&);
-
-    Callback_LoopRecorder_addCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallback<T, CT>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RecordVideo::LoopRecorderPrx proxy = ::RecordVideo::LoopRecorderPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_addCamera(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::Callback<T, CT>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::Callback<T, CT>::_callback.get()->*_response)(ret, CT::dynamicCast(result->getCookie()));
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T, typename CT> Callback_LoopRecorder_addCameraPtr
-newCallback_LoopRecorder_addCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_addCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_addCameraPtr
-newCallback_LoopRecorder_addCamera(T* instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_addCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_LoopRecorder_removeCamera : public Callback_LoopRecorder_removeCamera_Base, public ::IceInternal::OnewayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)();
-
-    CallbackNC_LoopRecorder_removeCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallbackNC<T>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_removeCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_removeCamera<T>(instance, 0, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(T* instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_removeCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(T* instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_removeCamera<T>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_LoopRecorder_removeCamera : public Callback_LoopRecorder_removeCamera_Base, public ::IceInternal::OnewayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const CT&);
-
-    Callback_LoopRecorder_removeCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallback<T, CT>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T, typename CT> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_removeCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_removeCamera<T, CT>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(T* instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_removeCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_removeCameraPtr
-newCallback_LoopRecorder_removeCamera(T* instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_removeCamera<T, CT>(instance, 0, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_LoopRecorder_clearCamera : public Callback_LoopRecorder_clearCamera_Base, public ::IceInternal::OnewayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)();
-
-    CallbackNC_LoopRecorder_clearCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallbackNC<T>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_clearCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_clearCamera<T>(instance, 0, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(T* instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_clearCamera<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(T* instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_clearCamera<T>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_LoopRecorder_clearCamera : public Callback_LoopRecorder_clearCamera_Base, public ::IceInternal::OnewayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const CT&);
-
-    Callback_LoopRecorder_clearCamera(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallback<T, CT>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T, typename CT> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(const IceUtil::Handle<T>& instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_clearCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_clearCamera<T, CT>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(T* instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_clearCamera<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_clearCameraPtr
-newCallback_LoopRecorder_clearCamera(T* instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_clearCamera<T, CT>(instance, 0, excb, sentcb);
-}
-
-template<class T>
-class CallbackNC_LoopRecorder_feedDog : public Callback_LoopRecorder_feedDog_Base, public ::IceInternal::OnewayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)();
-
-    CallbackNC_LoopRecorder_feedDog(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallbackNC<T>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(const IceUtil::Handle<T>& instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_feedDog<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_feedDog<T>(instance, 0, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(T* instance, void (T::*cb)(), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_feedDog<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(T* instance, void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_LoopRecorder_feedDog<T>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_LoopRecorder_feedDog : public Callback_LoopRecorder_feedDog_Base, public ::IceInternal::OnewayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const CT&);
-
-    Callback_LoopRecorder_feedDog(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::OnewayCallback<T, CT>(obj, cb, excb, sentcb)
-    {
-    }
-};
-
-template<class T, typename CT> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(const IceUtil::Handle<T>& instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_feedDog<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(const IceUtil::Handle<T>& instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_feedDog<T, CT>(instance, 0, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(T* instance, void (T::*cb)(const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_feedDog<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_LoopRecorder_feedDogPtr
-newCallback_LoopRecorder_feedDog(T* instance, void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_LoopRecorder_feedDog<T, CT>(instance, 0, excb, sentcb);
-}
-
-}
-
-#endif
-
-#include <IceUtil/PopDisableWarnings.h>
-#endif
diff --git a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.ice b/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.ice
deleted file mode 100644
index 5ed64ab..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo.ice
+++ /dev/null
@@ -1,24 +0,0 @@
-module RecordVideo
-{
-    sequence<byte> ByteSequence;
-
-    interface Recorder
-    {
-	string recordVideo(string rtsp,long ms);
-    }
-  
-    interface ImageGrabber
-    {
-	ByteSequence grabImage(int index,string time);
-	string grabImageUrl(int index,string time);
-    }
-
-    interface LoopRecorder
-    {
-	string addCamera(string index,string rtsp);
-	void removeCamera(string index);
-	void clearCamera();
-	void feedDog(string index);
-    }
-
-}
diff --git a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo/__init__.py b/QiaoJiaSystem/RecordVideo/rpc/RecordVideo/__init__.py
deleted file mode 100644
index b937f10..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Generated by slice2py - DO NOT EDIT!
-#
-
-import Ice
-Ice.updateModule("RecordVideo")
-
-# Modules:
-import RecordVideo_ice
-
-# Submodules:
diff --git a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo_ice.py b/QiaoJiaSystem/RecordVideo/rpc/RecordVideo_ice.py
deleted file mode 100644
index ba8a7ab..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/RecordVideo_ice.py
+++ /dev/null
@@ -1,285 +0,0 @@
-# -*- coding: utf-8 -*-
-# **********************************************************************
-#
-# Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
-#
-# This copy of Ice is licensed to you under the terms described in the
-# ICE_LICENSE file included in this distribution.
-#
-# **********************************************************************
-#
-# Ice version 3.7.0
-#
-# <auto-generated>
-#
-# Generated from file `RecordVideo.ice'
-#
-# Warning: do not edit this file.
-#
-# </auto-generated>
-#
-
-from sys import version_info as _version_info_
-import Ice, IcePy
-
-# Start of module RecordVideo
-_M_RecordVideo = Ice.openModule('RecordVideo')
-__name__ = 'RecordVideo'
-
-if '_t_ByteSequence' not in _M_RecordVideo.__dict__:
-    _M_RecordVideo._t_ByteSequence = IcePy.defineSequence('::RecordVideo::ByteSequence', (), IcePy._t_byte)
-
-_M_RecordVideo._t_Recorder = IcePy.defineValue('::RecordVideo::Recorder', Ice.Value, -1, (), False, True, None, ())
-
-if 'RecorderPrx' not in _M_RecordVideo.__dict__:
-    _M_RecordVideo.RecorderPrx = Ice.createTempClass()
-    class RecorderPrx(Ice.ObjectPrx):
-
-        def recordVideo(self, rtsp, ms, context=None):
-            return _M_RecordVideo.Recorder._op_recordVideo.invoke(self, ((rtsp, ms), context))
-
-        def recordVideoAsync(self, rtsp, ms, context=None):
-            return _M_RecordVideo.Recorder._op_recordVideo.invokeAsync(self, ((rtsp, ms), context))
-
-        def begin_recordVideo(self, rtsp, ms, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.Recorder._op_recordVideo.begin(self, ((rtsp, ms), _response, _ex, _sent, context))
-
-        def end_recordVideo(self, _r):
-            return _M_RecordVideo.Recorder._op_recordVideo.end(self, _r)
-
-        @staticmethod
-        def checkedCast(proxy, facetOrContext=None, context=None):
-            return _M_RecordVideo.RecorderPrx.ice_checkedCast(proxy, '::RecordVideo::Recorder', facetOrContext, context)
-
-        @staticmethod
-        def uncheckedCast(proxy, facet=None):
-            return _M_RecordVideo.RecorderPrx.ice_uncheckedCast(proxy, facet)
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::Recorder'
-    _M_RecordVideo._t_RecorderPrx = IcePy.defineProxy('::RecordVideo::Recorder', RecorderPrx)
-
-    _M_RecordVideo.RecorderPrx = RecorderPrx
-    del RecorderPrx
-
-    _M_RecordVideo.Recorder = Ice.createTempClass()
-    class Recorder(Ice.Object):
-
-        def ice_ids(self, current=None):
-            return ('::Ice::Object', '::RecordVideo::Recorder')
-
-        def ice_id(self, current=None):
-            return '::RecordVideo::Recorder'
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::Recorder'
-
-        def recordVideo(self, rtsp, ms, current=None):
-            raise NotImplementedError("servant method 'recordVideo' not implemented")
-
-        def __str__(self):
-            return IcePy.stringify(self, _M_RecordVideo._t_RecorderDisp)
-
-        __repr__ = __str__
-
-    _M_RecordVideo._t_RecorderDisp = IcePy.defineClass('::RecordVideo::Recorder', Recorder, (), None, ())
-    Recorder._ice_type = _M_RecordVideo._t_RecorderDisp
-
-    Recorder._op_recordVideo = IcePy.Operation('recordVideo', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_long, False, 0)), (), ((), IcePy._t_string, False, 0), ())
-
-    _M_RecordVideo.Recorder = Recorder
-    del Recorder
-
-_M_RecordVideo._t_ImageGrabber = IcePy.defineValue('::RecordVideo::ImageGrabber', Ice.Value, -1, (), False, True, None, ())
-
-if 'ImageGrabberPrx' not in _M_RecordVideo.__dict__:
-    _M_RecordVideo.ImageGrabberPrx = Ice.createTempClass()
-    class ImageGrabberPrx(Ice.ObjectPrx):
-
-        def grabImage(self, index, time, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImage.invoke(self, ((index, time), context))
-
-        def grabImageAsync(self, index, time, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImage.invokeAsync(self, ((index, time), context))
-
-        def begin_grabImage(self, index, time, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImage.begin(self, ((index, time), _response, _ex, _sent, context))
-
-        def end_grabImage(self, _r):
-            return _M_RecordVideo.ImageGrabber._op_grabImage.end(self, _r)
-
-        def grabImageUrl(self, index, time, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImageUrl.invoke(self, ((index, time), context))
-
-        def grabImageUrlAsync(self, index, time, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImageUrl.invokeAsync(self, ((index, time), context))
-
-        def begin_grabImageUrl(self, index, time, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.ImageGrabber._op_grabImageUrl.begin(self, ((index, time), _response, _ex, _sent, context))
-
-        def end_grabImageUrl(self, _r):
-            return _M_RecordVideo.ImageGrabber._op_grabImageUrl.end(self, _r)
-
-        @staticmethod
-        def checkedCast(proxy, facetOrContext=None, context=None):
-            return _M_RecordVideo.ImageGrabberPrx.ice_checkedCast(proxy, '::RecordVideo::ImageGrabber', facetOrContext, context)
-
-        @staticmethod
-        def uncheckedCast(proxy, facet=None):
-            return _M_RecordVideo.ImageGrabberPrx.ice_uncheckedCast(proxy, facet)
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::ImageGrabber'
-    _M_RecordVideo._t_ImageGrabberPrx = IcePy.defineProxy('::RecordVideo::ImageGrabber', ImageGrabberPrx)
-
-    _M_RecordVideo.ImageGrabberPrx = ImageGrabberPrx
-    del ImageGrabberPrx
-
-    _M_RecordVideo.ImageGrabber = Ice.createTempClass()
-    class ImageGrabber(Ice.Object):
-
-        def ice_ids(self, current=None):
-            return ('::Ice::Object', '::RecordVideo::ImageGrabber')
-
-        def ice_id(self, current=None):
-            return '::RecordVideo::ImageGrabber'
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::ImageGrabber'
-
-        def grabImage(self, index, time, current=None):
-            raise NotImplementedError("servant method 'grabImage' not implemented")
-
-        def grabImageUrl(self, index, time, current=None):
-            raise NotImplementedError("servant method 'grabImageUrl' not implemented")
-
-        def __str__(self):
-            return IcePy.stringify(self, _M_RecordVideo._t_ImageGrabberDisp)
-
-        __repr__ = __str__
-
-    _M_RecordVideo._t_ImageGrabberDisp = IcePy.defineClass('::RecordVideo::ImageGrabber', ImageGrabber, (), None, ())
-    ImageGrabber._ice_type = _M_RecordVideo._t_ImageGrabberDisp
-
-    ImageGrabber._op_grabImage = IcePy.Operation('grabImage', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), ((), _M_RecordVideo._t_ByteSequence, False, 0), ())
-    ImageGrabber._op_grabImageUrl = IcePy.Operation('grabImageUrl', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_int, False, 0), ((), IcePy._t_string, False, 0)), (), ((), IcePy._t_string, False, 0), ())
-
-    _M_RecordVideo.ImageGrabber = ImageGrabber
-    del ImageGrabber
-
-_M_RecordVideo._t_LoopRecorder = IcePy.defineValue('::RecordVideo::LoopRecorder', Ice.Value, -1, (), False, True, None, ())
-
-if 'LoopRecorderPrx' not in _M_RecordVideo.__dict__:
-    _M_RecordVideo.LoopRecorderPrx = Ice.createTempClass()
-    class LoopRecorderPrx(Ice.ObjectPrx):
-
-        def addCamera(self, index, rtsp, context=None):
-            return _M_RecordVideo.LoopRecorder._op_addCamera.invoke(self, ((index, rtsp), context))
-
-        def addCameraAsync(self, index, rtsp, context=None):
-            return _M_RecordVideo.LoopRecorder._op_addCamera.invokeAsync(self, ((index, rtsp), context))
-
-        def begin_addCamera(self, index, rtsp, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.LoopRecorder._op_addCamera.begin(self, ((index, rtsp), _response, _ex, _sent, context))
-
-        def end_addCamera(self, _r):
-            return _M_RecordVideo.LoopRecorder._op_addCamera.end(self, _r)
-
-        def removeCamera(self, index, context=None):
-            return _M_RecordVideo.LoopRecorder._op_removeCamera.invoke(self, ((index, ), context))
-
-        def removeCameraAsync(self, index, context=None):
-            return _M_RecordVideo.LoopRecorder._op_removeCamera.invokeAsync(self, ((index, ), context))
-
-        def begin_removeCamera(self, index, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.LoopRecorder._op_removeCamera.begin(self, ((index, ), _response, _ex, _sent, context))
-
-        def end_removeCamera(self, _r):
-            return _M_RecordVideo.LoopRecorder._op_removeCamera.end(self, _r)
-
-        def clearCamera(self, context=None):
-            return _M_RecordVideo.LoopRecorder._op_clearCamera.invoke(self, ((), context))
-
-        def clearCameraAsync(self, context=None):
-            return _M_RecordVideo.LoopRecorder._op_clearCamera.invokeAsync(self, ((), context))
-
-        def begin_clearCamera(self, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.LoopRecorder._op_clearCamera.begin(self, ((), _response, _ex, _sent, context))
-
-        def end_clearCamera(self, _r):
-            return _M_RecordVideo.LoopRecorder._op_clearCamera.end(self, _r)
-
-        def feedDog(self, index, context=None):
-            return _M_RecordVideo.LoopRecorder._op_feedDog.invoke(self, ((index, ), context))
-
-        def feedDogAsync(self, index, context=None):
-            return _M_RecordVideo.LoopRecorder._op_feedDog.invokeAsync(self, ((index, ), context))
-
-        def begin_feedDog(self, index, _response=None, _ex=None, _sent=None, context=None):
-            return _M_RecordVideo.LoopRecorder._op_feedDog.begin(self, ((index, ), _response, _ex, _sent, context))
-
-        def end_feedDog(self, _r):
-            return _M_RecordVideo.LoopRecorder._op_feedDog.end(self, _r)
-
-        @staticmethod
-        def checkedCast(proxy, facetOrContext=None, context=None):
-            return _M_RecordVideo.LoopRecorderPrx.ice_checkedCast(proxy, '::RecordVideo::LoopRecorder', facetOrContext, context)
-
-        @staticmethod
-        def uncheckedCast(proxy, facet=None):
-            return _M_RecordVideo.LoopRecorderPrx.ice_uncheckedCast(proxy, facet)
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::LoopRecorder'
-    _M_RecordVideo._t_LoopRecorderPrx = IcePy.defineProxy('::RecordVideo::LoopRecorder', LoopRecorderPrx)
-
-    _M_RecordVideo.LoopRecorderPrx = LoopRecorderPrx
-    del LoopRecorderPrx
-
-    _M_RecordVideo.LoopRecorder = Ice.createTempClass()
-    class LoopRecorder(Ice.Object):
-
-        def ice_ids(self, current=None):
-            return ('::Ice::Object', '::RecordVideo::LoopRecorder')
-
-        def ice_id(self, current=None):
-            return '::RecordVideo::LoopRecorder'
-
-        @staticmethod
-        def ice_staticId():
-            return '::RecordVideo::LoopRecorder'
-
-        def addCamera(self, index, rtsp, current=None):
-            raise NotImplementedError("servant method 'addCamera' not implemented")
-
-        def removeCamera(self, index, current=None):
-            raise NotImplementedError("servant method 'removeCamera' not implemented")
-
-        def clearCamera(self, current=None):
-            raise NotImplementedError("servant method 'clearCamera' not implemented")
-
-        def feedDog(self, index, current=None):
-            raise NotImplementedError("servant method 'feedDog' not implemented")
-
-        def __str__(self):
-            return IcePy.stringify(self, _M_RecordVideo._t_LoopRecorderDisp)
-
-        __repr__ = __str__
-
-    _M_RecordVideo._t_LoopRecorderDisp = IcePy.defineClass('::RecordVideo::LoopRecorder', LoopRecorder, (), None, ())
-    LoopRecorder._ice_type = _M_RecordVideo._t_LoopRecorderDisp
-
-    LoopRecorder._op_addCamera = IcePy.Operation('addCamera', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_string, False, 0), ((), IcePy._t_string, False, 0)), (), ((), IcePy._t_string, False, 0), ())
-    LoopRecorder._op_removeCamera = IcePy.Operation('removeCamera', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_string, False, 0),), (), None, ())
-    LoopRecorder._op_clearCamera = IcePy.Operation('clearCamera', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (), (), None, ())
-    LoopRecorder._op_feedDog = IcePy.Operation('feedDog', Ice.OperationMode.Normal, Ice.OperationMode.Normal, False, None, (), (((), IcePy._t_string, False, 0),), (), None, ())
-
-    _M_RecordVideo.LoopRecorder = LoopRecorder
-    del LoopRecorder
-
-# End of module RecordVideo
diff --git a/QiaoJiaSystem/RecordVideo/rpc/test2.py b/QiaoJiaSystem/RecordVideo/rpc/test2.py
deleted file mode 100644
index 241a545..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/test2.py
+++ /dev/null
@@ -1,70 +0,0 @@
-import time
-
-import Ice
-import sys
-import traceback
-
-import RecordVideo
-
-status = 0
-ic = None
-try:
-
-    # 鍒濆鍖栬繍琛岀幆澧�
-    ic = Ice.initialize(sys.argv)
-
-    # 鑾峰彇杩滅▼printer鏈嶅姟鐨勪唬鐞�
-    base = ic.stringToProxy("LoopRecordVideoServer:default -h 192.168.1.185 -p 11010")
-
-    # 璇锋眰鏈嶅姟绔‘璁わ細鈥濊繖鏄笉鏄� Demo::Printer鐨勪唬鐞嗘帴鍙o紵鈥�
-    printer = RecordVideo.LoopRecorderPrx.checkedCast(base)
-    if not printer:
-        raise RuntimeError("Invalid proxy")
-
-    str_json = "{\"rtsp\":\"rtsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream\"," \
-               "\"path\":\"/home/basic/work/qiaojia/realtime/21/"
-
-    # 杩滅▼璋冪敤锛岀湅璧锋潵鍍忔湰鍦扮殑鏈嶅姟涓�鏍�
-    # ti = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str1 = str_json + ti + ".mp4\"}"
-    # print(str1)
-    # printer.addCamera("2", "test")
-
-    time.sleep(2)
-    ti1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    str2 = str_json + ti1 + ".mp4\"}"
-    print(str2)
-    printer.addCamera("21", str2)
-
-    # time.sleep(2)
-    # ti1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str2 = str_json + ti1 + ".mp4\"}"
-    # print(str2)
-    # printer.addCamera("2", str2)
-
-    # printer.addCamera("2", "test")
-    # time.sleep(2)
-    # ti3 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str3 = str_json + ti3 + ".mp4\"}"
-    # print(str2)
-    # printer.addCamera("3", str3)
-
-    # printer.removeCamera("2")
-
-    while True:
-        printer.feedDog("21")
-        time.sleep(1)
-
-except:
-    traceback.print_exc()
-    status = 1
-
-if ic:
-    # Clean up
-    try:
-        ic.destroy()
-    except:
-        traceback.print_exc()
-        status = 1
-
-sys.exit(status)
diff --git a/QiaoJiaSystem/RecordVideo/rpc/testClient.py b/QiaoJiaSystem/RecordVideo/rpc/testClient.py
deleted file mode 100644
index 16189ce..0000000
--- a/QiaoJiaSystem/RecordVideo/rpc/testClient.py
+++ /dev/null
@@ -1,74 +0,0 @@
-import time
-
-import Ice
-import sys
-import traceback
-
-import RecordVideo
-
-status = 0
-ic = None
-try:
-
-    # 鍒濆鍖栬繍琛岀幆澧�
-    ic = Ice.initialize(sys.argv)
-
-    # 鑾峰彇杩滅▼printer鏈嶅姟鐨勪唬鐞�
-    base = ic.stringToProxy("LoopRecordVideoServer:default -p 10010")
-
-    # 璇锋眰鏈嶅姟绔‘璁わ細鈥濊繖鏄笉鏄� Demo::Printer鐨勪唬鐞嗘帴鍙o紵鈥�
-    printer = RecordVideo.LoopRecorderPrx.checkedCast(base)
-    if not printer:
-        raise RuntimeError("Invalid proxy")
-
-    str_json = "{\"rtsp\":\"rtsp://admin:a1234567@192.168.1.188:554/h264/ch1/main/av_stream\"," \
-               "\"path\":\"/home/bsk/test/2/"
-
-    # 杩滅▼璋冪敤锛岀湅璧锋潵鍍忔湰鍦扮殑鏈嶅姟涓�鏍�
-    # ti = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str1 = str_json + ti + ".mp4\"}"
-    # print(str1)
-    # printer.addCamera("2", "test")
-
-    time.sleep(2)
-    ti1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    str2 = str_json + ti1 + ".mp4\"}"
-    print(str2)
-    str_key = printer.addCamera("2", str2)
-
-    print(str_key)
-
-    # time.sleep(2)
-    # ti1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str2 = str_json + ti1 + ".mp4\"}"
-    # print(str2)
-    # printer.addCamera("2", str2)
-
-    # printer.addCamera("2", "test")
-    # time.sleep(2)
-    # ti3 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
-    # str3 = str_json + ti3 + ".mp4\"}"
-    # print(str2)
-    # printer.addCamera("3", str3)
-    #
-    # printer.removeCamera("2")
-    #
-    # printer.removeCamera("2")
-
-    while True:
-        printer.feedDog("2")
-        time.sleep(1)
-
-except:
-    traceback.print_exc()
-    status = 1
-
-if ic:
-    # Clean up
-    try:
-        ic.destroy()
-    except:
-        traceback.print_exc()
-        status = 1
-
-sys.exit(status)
diff --git a/QiaoJiaSystem/StructureApp/AppPipeController.h b/QiaoJiaSystem/StructureApp/AppPipeController.h
index 0bb873a..77862e0 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeController.h
+++ b/QiaoJiaSystem/StructureApp/AppPipeController.h
@@ -9,18 +9,19 @@
 #include "FaceRpcElement.h"
 #include "FaceExtractElement.h"
 #include "YoloRpcElement.h"
-#include "RecordVideoElement.h"
+//#include "RecordVideoElement.h"
 #include <TriggerElement.h>
 #include <QtCore/QDateTime>
 #include "PerimeterElement.h"
 #include "JudgmentRetrogradeTool.h"
-#include "NewRecordVideoElement.h"
+//#include "NewRecordVideoElement.h"
 #include "PersonElement.h"
 #include "PerStaticElement.h"
 #include <jsoncpp/json/json.h>
 #include "DBStruct.h"
 #include "SaveVideoRpc.h"
 #include "VptRpcElement.h"
+#include "HiredisTool.h"
 
 class VideoCaptureElementNotDecoder : public ffmpeg::VideoCaptureElement {
     using ffmpeg::VideoCaptureElement::VideoCaptureElement;
diff --git a/QiaoJiaSystem/StructureApp/CMakeLists.txt b/QiaoJiaSystem/StructureApp/CMakeLists.txt
index b15b23e..a220317 100644
--- a/QiaoJiaSystem/StructureApp/CMakeLists.txt
+++ b/QiaoJiaSystem/StructureApp/CMakeLists.txt
@@ -9,11 +9,11 @@
 SET(SOURCES
 
     #    HiredisTool.cpp
-    NewRecordVideoElement.cpp
+#    NewRecordVideoElement.cpp
     JudgmentRetrogradeTool.cpp
     PerimeterElement.cpp
-    NewEncodeVideoManager.cpp
-    NewEncodeVideo.cpp
+#    NewEncodeVideoManager.cpp
+#    NewEncodeVideo.cpp
     HiredisTool.cpp
     PersonElement.cpp
     PerStaticElement.cpp
@@ -24,14 +24,14 @@
     FaceExtractElement.cpp
     YoloRpcElement.cpp
     ImageDrawElement.cpp
-    RecordVideoElement.cpp
+#    RecordVideoElement.cpp
     rpc/StructureApp.cpp
     AppPipeController.cpp
     ../YoloServer/rpc/YoloServer.cpp
     ../FaceDetectServer/rpc/FaceServer.cpp
     ../FaceSearchServer/rpc/FaceSearchServer.cpp
-    ../RecordVideo/rpc/RecordVideo.cpp
-    ../VideoToImage/rpc/RtspAnalysServer.cpp
+#    ../RecordVideo/rpc/RecordVideo.cpp
+    ../VideoToImageMulth/rpc/RtspAnalysServer.cpp
     ../RapidStructureApp/TriggerElement.cpp
 
     ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
@@ -78,10 +78,10 @@
 include_directories(
     ./rpc
     ../YoloServer/rpc
-    ../RecordVideo/rpc
+#    ../RecordVideo/rpc
     ../FaceDetectServer/rpc
     ../FaceSearchServer/rpc
-    ../VideoToImage/rpc
+    ../VideoToImageMulth/rpc
     ../RapidStructureApp/
 
     ../../../BasicPlatForm
diff --git a/QiaoJiaSystem/StructureApp/NewEncodeVideo.cpp b/QiaoJiaSystem/StructureApp/NewEncodeVideo.cpp
deleted file mode 100644
index 0cd846f..0000000
--- a/QiaoJiaSystem/StructureApp/NewEncodeVideo.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "NewEncodeVideo.h"
-
-NewEncodeVideo::NewEncodeVideo():
-videoEncoderElement(cv::Size(1920, 1080), 8, 0)
-{
-
-}
-NewEncodeVideo::~NewEncodeVideo()
-{
-
-}
-
-void NewEncodeVideo::threadFunc()
-{
-
-    std::string src_path=getProperty("src_path");
-    if(src_path.empty())
-    {
-        return ;
-    }
-    int size=m_hiredisTool.getSize(src_path);
-  //  DBG("buf_size="<<size<<"  file_name="<<src_path);
-    bool fileCreate = false;
-    for(int i=0;i<size;++i)
-    {
-        cv::Mat img;
-        m_hiredisTool.getImage(src_path,img);
-        if(img.empty())
-         continue;
-        if(!fileCreate)
-        {
-            fileCreate = true;
-            DBG("fileCreate buf_size="<<size<<"  file_name="<<src_path);
-             videoEncoderElement.threadInitial(getProperty("src_path"),img);
-
-        }
-        else
-        {
-            videoEncoderElement.doFunc(img);
-        }
-         usleep(2*1000);
-    }
- //    bool isOpen=false;
-//    while(!m_imgQue.empty())
-//    {
-//        if(!isOpen)
-//        {
-//           videoEncoderElement.threadInitial(getProperty("src_path"),m_imgQue.back());
-//           isOpen=true;
-//        }
-//        else
-//        {
-//              videoEncoderElement.doFunc(m_imgQue.back());
-
-//        }
-//        m_imgQue.pop();
-//    }
-    videoEncoderElement.threadClosing();
-    m_hiredisTool.delKey(src_path);
-    m_hiredisTool.hashDel(file_list,src_path);
-}
diff --git a/QiaoJiaSystem/StructureApp/NewEncodeVideo.h b/QiaoJiaSystem/StructureApp/NewEncodeVideo.h
deleted file mode 100644
index c24375f..0000000
--- a/QiaoJiaSystem/StructureApp/NewEncodeVideo.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef NEWENCODEVIDEO_H
-#define NEWENCODEVIDEO_H
-#include "HiredisTool.h"
-#include <basic/pipe/PipeElement.h>
-#include <basic/pipe_element/ffmpeg/FfmpegElement.h>
-class NewEncodeVideo: public basic::PipeElement
-{
-public:
-    NewEncodeVideo();
-    ~NewEncodeVideo();
-   void thisEncodeFunc();
-   static void encodeFunc(void *arg);
-
-   void setImageQue(std::queue<cv::Mat>& imgQue);
-
-private:
-    virtual void threadFunc()override;
-private:
-
-    std::queue<cv::Mat> m_imgQue;
-     HiredisTool m_hiredisTool;
-    ffmpeg::VideoEncodeElement videoEncoderElement;
-};
-
-#endif // NEWENCODEVIDEO_H
diff --git a/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.cpp b/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.cpp
deleted file mode 100644
index a2c04ca..0000000
--- a/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "NewEncodeVideoManager.h"
-#include "NewRecordVideoElement.h"
-#include <basic/util/app/AppConfig.h>
-NewEncodeVideoManager::NewEncodeVideoManager():
-TimerElement(1000)
-{
-   // m_hiredisTool.delKey("")
-    int thread_num=appConfig.getIntProperty("encode_thread_num");
-    for(int i=0;i<thread_num;++i)
-    {
-         NewEncodeVideo* newEncodeViedo=new NewEncodeVideo;
-         if(newEncodeViedo)
-         {
-               m_newEncodeVideoVec.push_back(newEncodeViedo);
-               newEncodeViedo->start();
-         }
-
-    }
-
-}
-NewEncodeVideoManager::~NewEncodeVideoManager()
-{
-    for(int i=0;i<m_newEncodeVideoVec.size();++i)
-    {
-        if(m_newEncodeVideoVec[i])
-        {
-            m_newEncodeVideoVec[i]->stop();
-            delete m_newEncodeVideoVec[i];
-        }
-    }
-
-}
-void NewEncodeVideoManager::timerFunc()
-{
-   std::map<std::string,int> fileMap=m_hiredisTool.findAllFileStatus();
-//   auto it=fileMap.begin();
-   for(auto it=fileMap.begin();it!=fileMap.end();it++)
-   {
-       if(it->second == RECORD_ENDING)
-       {
-
-
-
-
-           for(int i=0;i<m_newEncodeVideoVec.size();++i)
-           {
-               if(m_newEncodeVideoVec[i] && !m_newEncodeVideoVec[i]->isBusy())
-               {
-                  m_hiredisTool.hashSet(file_list,it->first,RECORD_STOP);
-                  m_newEncodeVideoVec[i]->setProperty("src_path",it->first);
-                  m_newEncodeVideoVec[i]->submit();
-                  break;
-               }
-           }
-
-
-       }
-   }
-}
diff --git a/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.h b/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.h
deleted file mode 100644
index 3d6ac72..0000000
--- a/QiaoJiaSystem/StructureApp/NewEncodeVideoManager.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef NEWENCODEVIDEOMANAGER_H
-#define NEWENCODEVIDEOMANAGER_H
-#include <basic/pipe/TimerElement.h>
-#include "NewEncodeVideo.h"
-
-class NewEncodeVideoManager: public TimerElement
-{
-public:
-    NewEncodeVideoManager();
-   ~NewEncodeVideoManager();
-private:
-    virtual void timerFunc();
-
-private:
-   HiredisTool m_hiredisTool;
-   std::vector<NewEncodeVideo*> m_newEncodeVideoVec;
-
-};
-
-#endif // NEWENCODEVIDEOMANAGER_H
diff --git a/QiaoJiaSystem/StructureApp/NewRecordVideoElement.cpp b/QiaoJiaSystem/StructureApp/NewRecordVideoElement.cpp
deleted file mode 100644
index 3b8498f..0000000
--- a/QiaoJiaSystem/StructureApp/NewRecordVideoElement.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#include "NewRecordVideoElement.h"
-#include <basic/util/app/AppPreference.hpp>
-#include <QString>
-#include <QDateTime>
-//#todo index int -> string
-NewRecordVideoElement::NewRecordVideoElement(std::string camid) :
-//videoEncoderElement(cv::Size(1920, 1080), 5, 0),
-camID(camid),
-m_bSaveWH(false)
-{
-
-   // basicPath();
-    //isRecord=false;
-    m_cutPath= appPref.getStringData("user.loop.absolute.path");
-
-     recordInit(appPref.getIntData("n_cut_min_duration"),appPref.getIntData("n_cut_max_duration"));
-}
-
-NewRecordVideoElement::~NewRecordVideoElement() {
-    std::queue<ImgInfo> empty;
-    empty.swap(m_imgBufQue);
-
-
-}
-
-std::string NewRecordVideoElement::startRecord() {
-
-
-
-     ImgInfo info;
-     getImg(info);
-    std::string srcPath= getFileName(info.time);
-    m_filename=srcPath;
-   // DBG("m_filename: " << m_filename);
-    if(!m_bSaveWH)
-    {
-       m_bSaveWH=m_hiredisTool.hashSet(camID,"width",info.img.cols) && m_hiredisTool.hashSet(camID,"height",info.img.rows);
-       DBG("m_bSaveWH="<<m_bSaveWH);
-    }
-
-    m_hiredisTool.pushImageBuf(m_filename,info.img);
-     m_hiredisTool.addFileInfo(m_filename,RECORD_DOING);
-    return srcPath;
-}
-
-void NewRecordVideoElement::endRecord() {
-
-    ImgInfo info;
-    getImg(info);
-//    DBG("m_filename: " << m_filename);
-//    DBG("recordDelay:" << recordDelay);
-//    DBG("videoLength:" << videoLength);
-//    DBG("sdkTrigger:" << sdkTrigger);
-    m_hiredisTool.pushImageBuf(m_filename,info.img);
-    m_hiredisTool.addFileInfo(m_filename,RECORD_ENDING);
-
-}
-
-void NewRecordVideoElement::doRecord() {
-
-
-  //  ImgInfo info=m_HiredisTool.getImage(camID);
-     ImgInfo info;
-     getImg(info);
-
-     m_hiredisTool.pushImageBuf(m_filename,info.img);
-     m_hiredisTool.addFileInfo(m_filename,RECORD_DOING);
-}
-
- std::string NewRecordVideoElement::getFileName(const std::string& timeStamp)
-{
-    std::string dirPath=makeDir(timeStamp);
-
-    char szDateTime[256] = {0};
-    sprintf(szDateTime, "%s%s.mp4", dirPath.c_str(), timeStamp.c_str());
-    DBG(szDateTime);
-    return szDateTime;
-}
-
-
-std::string NewRecordVideoElement::makeDir(const std::string& timeStamp) {
-
-    //# ./camIndex/YYYYMM/DD/YYYYMMDDHH/
-    std::string t_FilePath = m_cutPath;
-
-    if (t_FilePath.back() != '/') {
-        t_FilePath.push_back('/');
-    }
-    char buf[24];
-    QDateTime dt = QDateTime::fromString(QString::fromStdString(timeStamp), "yyyy-MM-dd hh:mm:ss:zzz");
-
-     std::string t_strTime=dt.toString("yyyyMMddhh").toStdString();
-    // DBG("t_strTime="<<t_strTime);
-     t_FilePath.append(camID + "/" + t_strTime.substr(0, 6)+ "/" +t_strTime.substr(6, 2) + "/");
-     //YYYYMMDDHH
-      t_FilePath.append(t_strTime.substr(0,10)+ "/");
-     std::string t_cmd = "mkdir -p '";
-    t_cmd.append(t_FilePath + "'");
-    //#get path mkdir path
-    system(t_cmd.c_str());
-
-    return t_FilePath;
-}
-void NewRecordVideoElement::pushImgBuf(const std::string& time,cv::Mat& img)
-{
-//    std::string tmp="camId="+camID+"pushImgBuf";
-//    ClockTimer cl(tmp);
-     ImgInfo info;
-     img.copyTo(info.img);
-//     info.img=img;
-     info.time=time;
-     m_imgBufQue.push(info);
-    // if(isRecord)
-    // DBG("camId="<<camID<<"pushtime="<<info.time);
-//     int size=m_imgBufQue.size();
-//     DBG("m_imgBufQue size="<<size);
-}
- void NewRecordVideoElement::getImg(ImgInfo& info)
- {
-//     std::string tmp="camId="+camID+"getImg";
-//     ClockTimer cl(tmp);
-        info=m_imgBufQue.front();
-        int size=m_imgBufQue.size();
-//        DBG("m_imgBufQue size="<<size<<" camId="<<camID<<" fileMin="<<fileMin/2);
-        if(size>fileMin/2)
-        {
-             m_imgBufQue.pop();
-        }
-//        if(isRecord)
-//        DBG("camId="<<camID<<"gettime="<<info.time);
-
-
- }
-// void NewRecordVideoElement::threadFunc()
-// {
-//       Record();
-// }
-// void NewRecordVideoElement::threadInitial()
-// {
-
-
-// }
-
- void NewRecordVideoElement::Record() {
-     switch(recordStatus)
-     {
-         case RECORD_STOP:
- //        DBG("recordDelay:" << recordDelay);
- //        DBG("videoLength:" << videoLength);
- //        DBG("sdkTrigger:" << sdkTrigger);
-             videoLength = 0;
-             recordDelay = 0;
-             if(sdkTrigger){
-                 recordStatus = RECORD_DOING;
-                 startRecord();
-             }
-             else
-             {
-                 ImgInfo info;
-                 getImg(info);
-             }
-             break;
-
-         case RECORD_DOING:
-             videoLength++;
-             if(sdkTrigger){
-                 if(videoLength < fileMax){
-                     doRecord();
-                 }
-                 else
-                 {
-                     recordStatus = RECORD_STOP;
-                     endRecord();
-                 }
-             }
-             else
-             {
-                 recordStatus = RECORD_ENDING;
-                 doRecord();
-             }
-             break;
-
-         case RECORD_ENDING:
-//             DBG("recordDelay:" << recordDelay);
-//             DBG("videoLength:" << videoLength);
-//             DBG("sdkTrigger:" << sdkTrigger);
-             recordDelay++;
-             videoLength++;
-             if(sdkTrigger){
-                 if( (recordDelay < fileMin/4) &&
-                     (videoLength < fileMax)){
-                     doRecord();
-                 }else{
-                     recordStatus = RECORD_STOP;
-                     endRecord();
-                 }
-             }else{
-                 if( (recordDelay < fileMin/2) &&
-                     (videoLength < fileMax)){
-                    doRecord();
-                 }else{
-                     recordStatus = RECORD_STOP;
-                     endRecord();
-                 }
-             }
-             break;
-
-         default:
-             break;
-     }
- }
- void NewRecordVideoElement::setSdkTrigger(bool isTrigger) {
-//     std::string tmp="camId="+camID+"setSdkTrigger";
-//     ClockTimer cl(tmp);
-     if(isTrigger)
-     {
-//         DBG("setSdkTrigger time=" << AppUtil::getTimeUSecString());
-         triggerDelay = 0;
-         sdkTrigger = true;
-     }
-     else
-     {
-         if(triggerDelay++ >= fileMin/2) {
-             sdkTrigger = false;
-         }
-         else{
-             sdkTrigger = true;
-         }
-     }
-     Record();
- }
- void NewRecordVideoElement::recordInit(int videoMin, int videoMax) {
-
-     sdkTrigger = false;
-     fileMin = videoMin*8;//fps=8
-     fileMax = videoMax*8;
-     triggerDelay = fileMin/2;
-
-     recordStatus = RECORD_STOP;
-     videoLength = 0;
-     recordDelay = 0;
- }
diff --git a/QiaoJiaSystem/StructureApp/NewRecordVideoElement.h b/QiaoJiaSystem/StructureApp/NewRecordVideoElement.h
deleted file mode 100644
index 2b578f5..0000000
--- a/QiaoJiaSystem/StructureApp/NewRecordVideoElement.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef NEWRECORDVIDEOELEMENT_H
-#define NEWRECORDVIDEOELEMENT_H
-//#include <basic/pipe/PipeElement.h>
-#include <basic/pipe_element/ffmpeg/FfmpegElement.h>
-#include "HiredisTool.h"
-//struct ImgInfo
-//{
-//    std::string time;
-//    cv::Mat img;
-//};
-class NewRecordVideoElement {
-
-public:
-
-    NewRecordVideoElement(){}
-    NewRecordVideoElement(std::string camid);
-
-    ~NewRecordVideoElement();
-
-    void setSdkTrigger(bool isTrigger);
-    void pushImgBuf(const std::string& time,cv::Mat& img);
-
-//private:
-//    virtual void threadFunc() override;
-//    virtual void threadInitial() override;
-private:
-    void recordInit(int videoMin, int videoMax);
-    void Record();
-
-    int fileMin;
-    int fileMax;
-    bool sdkTrigger;
-    int triggerDelay;
-
-#define RECORD_STOP (0)
-#define RECORD_DOING (1)
-#define RECORD_ENDING (2)
-    int recordStatus;
-    int videoLength;
-    int recordDelay;
-private:
-    std::string startRecord();
-    void doRecord();
-    void endRecord();
-    void getImg(ImgInfo& info);
-    std::string getFileName(const std::string& timeStamp);
-    std::string makeDir(const std::string& timeStamp);
-
-    ffmpeg::VideoEncodeElement videoEncoderElement;
-    std::string camID;
-    std::string m_cutPath;
-    std::queue<ImgInfo> m_imgBufQue;
-    HiredisTool m_hiredisTool;
-    std::string m_filename;
-    bool m_bSaveWH;
-};
-
-#endif // RECORDVIDEOELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/RecordVideoElement.cpp b/QiaoJiaSystem/StructureApp/RecordVideoElement.cpp
deleted file mode 100644
index a4ced8a..0000000
--- a/QiaoJiaSystem/StructureApp/RecordVideoElement.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "RecordVideoElement.h"
-#include <basic/util/app/AppPreference.hpp>
-
-RecordVideoElement::RecordVideoElement(int index, std::string rtsp)
-    : m_nIndex(std::to_string(index)), m_strRtsp(rtsp),
-      loopRecordClient(appPref.getStringData("loopRecord.proxy"), appPref.getStringData("loopRecord.ip"),
-                       appPref.getIntData("loopRecord.port"), "tcp") {
-
-}
-
-//#todo index int -> string
-RecordVideoElement::RecordVideoElement(std::string index, std::string rtsp)
-    : m_nIndex(index), m_strRtsp(rtsp),
-      loopRecordClient(appPref.getStringData("loopRecord.proxy"), appPref.getStringData("loopRecord.ip"),
-                       appPref.getIntData("loopRecord.port"), "tcp") {
-
-}
-
-RecordVideoElement::~RecordVideoElement() {
-
-}
-
-std::string RecordVideoElement::startRecord() {
-    return callStartRecord(m_strRtsp);
-}
-
-std::string RecordVideoElement::callStartRecord(std::string jsonValue) {
-    try {
-        auto server = loopRecordClient.getServer();
-        return server->addCamera(m_nIndex, jsonValue);
-    }
-    catch (std::exception &e) {
-        ERR(e.what())
-        return "";
-    }
-}
-
-std::string RecordVideoElement::startRecord(std::string json) {
-    return callStartRecord(json);
-}
-
-void RecordVideoElement::endRecord() {
-    try {
-        auto server = loopRecordClient.getServer();
-        server->removeCamera(m_nIndex);
-    }
-    catch (std::exception &e) {
-        ERR(e.what())
-    }
-}
-
-void RecordVideoElement::feedDog() {
-    try {
-        auto server = loopRecordClient.getServer();
-        server->feedDog(m_nIndex);
-        //INFO("feedDog:" + m_nIndex);
-    }
-    catch (std::exception &e) {
-        ERR(e.what())
-    }
-}
-
-
diff --git a/QiaoJiaSystem/StructureApp/RecordVideoElement.h b/QiaoJiaSystem/StructureApp/RecordVideoElement.h
deleted file mode 100644
index c036246..0000000
--- a/QiaoJiaSystem/StructureApp/RecordVideoElement.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef RECORDVIDEOELEMENT_H
-#define RECORDVIDEOELEMENT_H
-
-#include "TimerElement.h"
-#include <basic/rpc/IceRpc.hpp>
-#include "RecordVideo.h"
-
-class RecordVideoElement {
-
-public:
-    RecordVideoElement(int index, std::string rtsp);
-
-    RecordVideoElement(std::string index, std::string rtsp);
-
-    ~RecordVideoElement();
-
-    std::string startRecord();
-
-    std::string startRecord(std::string json);
-
-    void endRecord();
-
-    void feedDog();
-
-private:
-    std::string m_nIndex;
-    std::string m_strRtsp;
-    IceRpcClient<RecordVideo::LoopRecorderPrx> loopRecordClient;
-
-    std::string callStartRecord(std::string jsonValue);
-};
-
-#endif // RECORDVIDEOELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/SaveVideoRpc.h b/QiaoJiaSystem/StructureApp/SaveVideoRpc.h
index 4275aaa..39fc817 100644
--- a/QiaoJiaSystem/StructureApp/SaveVideoRpc.h
+++ b/QiaoJiaSystem/StructureApp/SaveVideoRpc.h
@@ -6,6 +6,6 @@
 #define QIAOJIASYSTEM_SAVEVIDEORPC_H
 
 #include "../../../BasicPlatForm/basic/rpc/IceRpc.hpp"
-#include "../VideoToImage/rpc/RtspAnalysServer.h"
+#include "../VideoToImageMulth/rpc/RtspAnalysServer.h"
 using SaveVideoRpcClient_t = IceRpcClient<RtspAnalys::RtspAnalysServerPrx>;
 #endif //QIAOJIASYSTEM_SAVEVIDEORPC_H
diff --git a/QiaoJiaSystem/UnitTest/BasicStruct_test.cpp b/QiaoJiaSystem/UnitTest/BasicStruct_test.cpp
deleted file mode 100644
index f4184c6..0000000
--- a/QiaoJiaSystem/UnitTest/BasicStruct_test.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "doctest/doctest.h"
-#include "basic/pipe_element/ffmpeg/basic_struct_for_video_image.h"
-#include "basic/util/app/AppUtil.h"
-#include <iostream>
-TEST_CASE("BaseTest1") {
-    ImageName_s_t st;
-    st.m_timeStamp="1245656";
-    st.m_camId="2222";
-    st.m_frameId =1;
-    std::string imageName = st.toString();
-    CHECK(!imageName.empty());
-    ImageName_s_t s2 = ImageName_s_t::fromString(imageName);
-    CHECK(s2.Valid());
-    std::string str2 = s2.toString();
-    CHECK_EQ(imageName,str2);
-}
-
-TEST_CASE("BaseTest2"){
-    //ImageName_s_t s2 = ImageName_s_t::fromString("1548399702_DS-2CD5026EFWD20180202AACH181129936_244");
-
-    //CHECK(s2.Valid());
-}
-
-TEST_CASE("BaseTest3"){
-    //ImageName_s_t s2 = ImageName_s_t::fromString("2019-01-25-16-49-19_DS-2CD2T46WDA2-I20180622AACHC30488278_253");
-    //CHECK(s2.Valid());
-}
-
-
-TEST_CASE("VideoName") {
-    VideoName_s_t st;
-    st.m_timeStamp="22222";
-    st.m_camId="abdfdf_234234_";
-    st.m_startFrameId = 3333;
-    st.m_endFrameId =4444;
-    std::string videoName=st.ToVideoName();
-    CHECK_FALSE(videoName.empty());
-    VideoName_s_t fromString = VideoName_s_t::fromString(videoName);
-
-    std::cout<<fromString.m_camId<<std::endl;
-    std::cout<<fromString.m_timeStamp<<std::endl;
-    std::cout<<fromString.m_startFrameId<<std::endl;
-    std::cout<<fromString.m_endFrameId<<std::endl;
-    std::cout<<fromString.ToVideoName()<<std::endl;
-            CHECK(fromString.Valid());
-
-}
-
-
-TEST_CASE("BetweenTest"){
-    std::string strImageKey ="_20160718AACH626459906$2019-01-31-10-34-20_1170200";
-    std::string strVideoName = "_20160718AACH626459906$2019-01-31-10-34-30_1170065_1170464.mp4";
-
-    ImageName_s_t imgSt = ImageName_s_t::fromString(strImageKey);
-    VideoName_s_t videoSt = VideoName_s_t::fromString(strVideoName);
-    CHECK(imgSt.Valid());
-    CHECK(videoSt.Valid());
-    CHECK((imgSt.m_frameId < videoSt.m_endFrameId));
-    CHECK(imgSt.m_frameId > videoSt.m_startFrameId);
-    auto firstTime = AppUtil::ParseFromHypenTimeStr(imgSt.m_timeStamp);
-    auto secondTime = AppUtil::ParseFromHypenTimeStr(videoSt.m_timeStamp);
-    CHECK(AppUtil::IsRightAfterLeft(firstTime,secondTime));
-    CHECK_FALSE(AppUtil::IsRightAfterLeft(secondTime,firstTime));
-
-}
-
-
-TEST_CASE("BetweenTest"){
-    std::string strImageKey ="DS-2CD5026EFWD20180202AACH181129936$2019-02-01-09-49-24_1588152";
-    std::string strVideoName = "DS-2CD5026EFWD20180202AACH181129936$2019-02-01-09-49-35_1587925_1588424.mp4";
-
-    ImageName_s_t imgSt = ImageName_s_t::fromString(strImageKey);
-    VideoName_s_t videoSt = VideoName_s_t::fromString(strVideoName);
-    CHECK(imgSt.Valid());
-    CHECK(videoSt.Valid());
-    CHECK((imgSt.m_frameId < videoSt.m_endFrameId));
-    CHECK(imgSt.m_frameId > videoSt.m_startFrameId);
-    auto firstTime = AppUtil::ParseFromHypenTimeStr(imgSt.m_timeStamp);
-    auto secondTime = AppUtil::ParseFromHypenTimeStr(videoSt.m_timeStamp);
-    CHECK(AppUtil::IsRightAfterLeft(firstTime,secondTime));
-    CHECK_FALSE(AppUtil::IsRightAfterLeft(secondTime,firstTime));
-
-}
-
-TEST_CASE("BetweenLimit"){
-    std::string strImageKey ="DS-2CD5026EFWD20180202AACH181129936$2019-02-01-09-49-35_1588152";
-    std::string strVideoName = "DS-2CD5026EFWD20180202AACH181129936$2019-02-01-09-49-35_1587925_1588424.mp4";
-
-    ImageName_s_t imgSt = ImageName_s_t::fromString(strImageKey);
-    VideoName_s_t videoSt = VideoName_s_t::fromString(strVideoName);
-    CHECK(imgSt.Valid());
-    CHECK(videoSt.Valid());
-    CHECK((imgSt.m_frameId < videoSt.m_endFrameId));
-    CHECK(imgSt.m_frameId > videoSt.m_startFrameId);
-    auto firstTime = AppUtil::ParseFromHypenTimeStr(imgSt.m_timeStamp);
-    auto secondTime = AppUtil::ParseFromHypenTimeStr(videoSt.m_timeStamp);
-    CHECK(AppUtil::IsRightAfterLeft(firstTime,secondTime));
-    //CHECK_FALSE(AppUtil::IsRightAfterLeft(secondTime,firstTime));
-
-}
\ No newline at end of file
diff --git a/QiaoJiaSystem/UnitTest/CMakeLists.txt b/QiaoJiaSystem/UnitTest/CMakeLists.txt
deleted file mode 100644
index a805388..0000000
--- a/QiaoJiaSystem/UnitTest/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-cmake_minimum_required(VERSION 3.2)
-project(UnitTest)
-include_directories(./doctest
-        ../../../BasicPlatForm/basic/pipe_element/ffmpeg/)
-
-
-include_directories(
-
-        #glog
-        ../../../BasicPlatForm/libs/glog/include)
-link_directories(
-        #glog
-        ../../../BasicPlatForm/libs/glog/lib)
-SET(SOURCE_FILE
-        BasicStruct_test.cpp
-        main.cpp)
-SET(LIBS
-        glog)
-
-add_executable(baseTest ${SOURCE_FILE})
-target_link_libraries(baseTest
-        ${LIBS}
-        )
\ No newline at end of file
diff --git a/QiaoJiaSystem/UnitTest/doctest/doctest.h b/QiaoJiaSystem/UnitTest/doctest/doctest.h
deleted file mode 100644
index eda93fc..0000000
--- a/QiaoJiaSystem/UnitTest/doctest/doctest.h
+++ /dev/null
@@ -1,5269 +0,0 @@
-// ======================================================================
-// == DO NOT MODIFY THIS FILE BY HAND - IT IS AUTO GENERATED BY CMAKE! ==
-// ======================================================================
-//
-// doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD
-//
-// Copyright (c) 2016-2018 Viktor Kirilov
-//
-// Distributed under the MIT Software License
-// See accompanying file LICENSE.txt or copy at
-// https://opensource.org/licenses/MIT
-//
-// The documentation can be found at the library's page:
-// https://github.com/onqtam/doctest/blob/master/doc/markdown/readme.md
-//
-// =================================================================================================
-// =================================================================================================
-// =================================================================================================
-//
-// The library is heavily influenced by Catch - https://github.com/philsquared/Catch
-// which uses the Boost Software License - Version 1.0
-// see here - https://github.com/philsquared/Catch/blob/master/LICENSE.txt
-//
-// The concept of subcases (sections in Catch) and expression decomposition are from there.
-// Some parts of the code are taken directly:
-// - stringification - the detection of "ostream& operator<<(ostream&, const T&)" and StringMaker<>
-// - the Approx() helper class for floating point comparison
-// - colors in the console
-// - breaking into a debugger
-// - signal / SEH handling
-// - timer
-//
-// The expression decomposing templates are taken from lest - https://github.com/martinmoene/lest
-// which uses the Boost Software License - Version 1.0
-// see here - https://github.com/martinmoene/lest/blob/master/LICENSE.txt
-//
-// =================================================================================================
-// =================================================================================================
-// =================================================================================================
-
-#ifndef DOCTEST_LIBRARY_INCLUDED
-#define DOCTEST_LIBRARY_INCLUDED
-
-// =================================================================================================
-// == VERSION ======================================================================================
-// =================================================================================================
-
-#define DOCTEST_VERSION_MAJOR 2
-#define DOCTEST_VERSION_MINOR 2
-#define DOCTEST_VERSION_PATCH 1
-#define DOCTEST_VERSION_STR "2.2.1"
-
-#define DOCTEST_VERSION                                                                            \
-    (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
-
-// =================================================================================================
-// == COMPILER VERSION =============================================================================
-// =================================================================================================
-
-// ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect
-
-#define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))
-
-// GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl...
-#if defined(_MSC_VER) && defined(_MSC_FULL_VER)
-#if _MSC_VER == _MSC_FULL_VER / 10000
-#define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)
-#else // MSVC
-#define DOCTEST_MSVC                                                                               \
-    DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)
-#endif // MSVC
-#endif // MSVC
-#if defined(__clang__) && defined(__clang_minor__)
-#define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)
-#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) &&              \
-        !defined(__INTEL_COMPILER)
-#define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
-#endif // GCC
-
-#ifndef DOCTEST_MSVC
-#define DOCTEST_MSVC 0
-#endif // DOCTEST_MSVC
-#ifndef DOCTEST_CLANG
-#define DOCTEST_CLANG 0
-#endif // DOCTEST_CLANG
-#ifndef DOCTEST_GCC
-#define DOCTEST_GCC 0
-#endif // DOCTEST_GCC
-
-// =================================================================================================
-// == COMPILER WARNINGS HELPERS ====================================================================
-// =================================================================================================
-
-#if DOCTEST_CLANG
-#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push")
-#define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop")
-#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)                                                \
-    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)
-#else // DOCTEST_CLANG
-#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
-#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_CLANG
-
-#if DOCTEST_GCC
-#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
-#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push")
-#define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)
-#define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop")
-#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)                                                  \
-    DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)
-#else // DOCTEST_GCC
-#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-#define DOCTEST_GCC_SUPPRESS_WARNING(w)
-#define DOCTEST_GCC_SUPPRESS_WARNING_POP
-#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_GCC
-
-#if DOCTEST_MSVC
-#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))
-#define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))
-#define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))
-#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)                                                 \
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)
-#else // DOCTEST_MSVC
-#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
-#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
-#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_MSVC
-
-// =================================================================================================
-// == COMPILER WARNINGS ============================================================================
-// =================================================================================================
-
-DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
-
-DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor")
-DOCTEST_GCC_SUPPRESS_WARNING("-Winline")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
-
-DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
-DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
-DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
-DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
-DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding
-DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
-// static analysis
-DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
-DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
-DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
-DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtr...
-
-// 4548 - expression before comma has no effect; expected expression with side - effect
-// 4265 - class has virtual functions, but destructor is not virtual
-// 4986 - exception specification does not match previous declaration
-// 4350 - behavior change: 'member1' called instead of 'member2'
-// 4668 - 'x' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
-// 4365 - conversion from 'int' to 'unsigned long', signed/unsigned mismatch
-// 4774 - format string expected in argument 'x' is not a string literal
-// 4820 - padding in structs
-
-// only 4 should be disabled globally:
-// - 4514 # unreferenced inline function has been removed
-// - 4571 # SEH related
-// - 4710 # function not inlined
-// - 4711 # function 'x' selected for automatic inline expansion
-
-#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN                                 \
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH                                                             \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4548)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4265)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4986)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4350)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4668)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4365)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4774)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4820)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4625)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4626)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5027)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5026)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4623)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5039)
-
-#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-// =================================================================================================
-// == FEATURE DETECTION ============================================================================
-// =================================================================================================
-
-// general compiler feature support table: https://en.cppreference.com/w/cpp/compiler_support
-// MSVC C++11 feature support table: https://msdn.microsoft.com/en-us/library/hh567368.aspx
-// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html
-// MSVC version table:
-// MSVC++ 15.0 _MSC_VER == 1910 (Visual Studio 2017)
-// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
-// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
-// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
-// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
-// MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)
-// MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)
-
-#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
-#define DOCTEST_CONFIG_WINDOWS_SEH
-#endif // MSVC
-#if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)
-#undef DOCTEST_CONFIG_WINDOWS_SEH
-#endif // DOCTEST_CONFIG_NO_WINDOWS_SEH
-
-#if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS)
-#define DOCTEST_CONFIG_POSIX_SIGNALS
-#endif // _WIN32
-#if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)
-#undef DOCTEST_CONFIG_POSIX_SIGNALS
-#endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS
-
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-#if(DOCTEST_GCC || (DOCTEST_CLANG && !DOCTEST_MSVC)) && !defined(__EXCEPTIONS)
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // clang and gcc
-#if DOCTEST_MSVC && (defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS == 0)
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // MSVC
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)
-#define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-
-#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)
-#define DOCTEST_CONFIG_IMPLEMENT
-#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-
-#if defined(_WIN32) || defined(__CYGWIN__)
-#if DOCTEST_MSVC
-#define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)
-#define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)
-#else // MSVC
-#define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))
-#define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))
-#endif // MSVC
-#else  // _WIN32
-#define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default")))
-#define DOCTEST_SYMBOL_IMPORT
-#endif // _WIN32
-
-#ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-#ifdef DOCTEST_CONFIG_IMPLEMENT
-#define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT
-#else // DOCTEST_CONFIG_IMPLEMENT
-#define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT
-#endif // DOCTEST_CONFIG_IMPLEMENT
-#else  // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-#define DOCTEST_INTERFACE
-#endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-
-#if DOCTEST_MSVC
-#define DOCTEST_NOINLINE __declspec(noinline)
-#define DOCTEST_UNUSED
-#define DOCTEST_ALIGNMENT(x)
-#else // MSVC
-#define DOCTEST_NOINLINE __attribute__((noinline))
-#define DOCTEST_UNUSED __attribute__((unused))
-#define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))
-#endif // MSVC
-
-#ifndef DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
-#define DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK 5
-#endif // DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
-
-// =================================================================================================
-// == FEATURE DETECTION END ========================================================================
-// =================================================================================================
-
-// internal macros for string concatenation and anonymous variable name generation
-#define DOCTEST_CAT_IMPL(s1, s2) s1##s2
-#define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)
-#ifdef __COUNTER__ // not standard and may be missing for some compilers
-#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)
-#else // __COUNTER__
-#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
-#endif // __COUNTER__
-
-#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-#define DOCTEST_REF_WRAP(x) x&
-#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-#define DOCTEST_REF_WRAP(x) x
-#endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-
-// not using __APPLE__ because... this is how Catch does it
-#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
-#define DOCTEST_PLATFORM_MAC
-#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
-#define DOCTEST_PLATFORM_IPHONE
-#elif defined(_WIN32)
-#define DOCTEST_PLATFORM_WINDOWS
-#else // DOCTEST_PLATFORM
-#define DOCTEST_PLATFORM_LINUX
-#endif // DOCTEST_PLATFORM
-
-// clang-format off
-#define DOCTEST_DELETE_COPIES(type)     type(const type&) = delete; type& operator=(const type&) = delete
-#define DOCTEST_DECLARE_COPIES(type)    type(const type&); type& operator=(const type&)
-#define DOCTEST_DEFINE_COPIES(type)     type::type(const type&) = default; type& type::operator=(const type&) = default
-#define DOCTEST_DECLARE_DEFAULTS(type)  type(); ~type()
-#define DOCTEST_DEFINE_DEFAULTS(type)   type::type()  = default; type::~type() = default
-// clang-format on
-
-#define DOCTEST_GLOBAL_NO_WARNINGS(var)                                                            \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors")                              \
-    static int var DOCTEST_UNUSED // NOLINT(fuchsia-statically-constructed-objects,cert-err58-cpp)
-#define DOCTEST_GLOBAL_NO_WARNINGS_END() DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-// should probably take a look at https://github.com/scottt/debugbreak
-#ifdef DOCTEST_PLATFORM_MAC
-#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :)
-#elif DOCTEST_MSVC
-#define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()
-#elif defined(__MINGW32__)
-extern "C" __declspec(dllimport) void __stdcall DebugBreak();
-#define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()
-#else // linux
-#define DOCTEST_BREAK_INTO_DEBUGGER() ((void)0)
-#endif // linux
-
-#if DOCTEST_CLANG
-// to detect if libc++ is being used with clang (the _LIBCPP_VERSION identifier)
-#include <ciso646>
-#endif // clang
-
-// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
-DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)
-
-#if defined(_LIBCPP_VERSION) || defined(DOCTEST_CONFIG_USE_IOSFWD)
-// not forward declaring ostream for libc++ because I had some problems (inline namespaces vs c++98)
-// so the <iosfwd> header is used - also it is very light and doesn't drag a ton of stuff
-#include <iosfwd>
-#else  // _LIBCPP_VERSION
-namespace std {
-template <class charT>
-struct char_traits;
-template <>
-struct char_traits<char>;
-template <class charT, class traits>
-class basic_ostream;
-typedef basic_ostream<char, char_traits<char> > ostream;
-} // namespace std
-#endif // _LIBCPP_VERSION || DOCTEST_CONFIG_USE_IOSFWD
-
-#ifdef _LIBCPP_VERSION
-#include <cstddef>
-#else  // _LIBCPP_VERSION
-namespace std {
-typedef decltype(nullptr) nullptr_t;
-}
-#endif // _LIBCPP_VERSION
-
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-#include <type_traits>
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-namespace doctest {
-
-DOCTEST_INTERFACE extern bool is_running_in_test;
-
-// A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length
-// of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for:
-// - "is small" bit - the highest bit - if "0" then it is small - otherwise its "1" (128)
-// - if small - capacity left before going on the heap - using the lowest 5 bits
-// - if small - 2 bits are left unused - the second and third highest ones
-// - if small - acts as a null terminator if strlen() is 23 (24 including the null terminator)
-//              and the "is small" bit remains "0" ("as well as the capacity left") so its OK
-// Idea taken from this lecture about the string implementation of facebook/folly - fbstring
-// https://www.youtube.com/watch?v=kPR8h4-qZdk
-// TODO:
-// - optimizations - like not deleting memory unnecessarily in operator= and etc.
-// - resize/reserve/clear
-// - substr
-// - replace
-// - back/front
-// - iterator stuff
-// - find & friends
-// - push_back/pop_back
-// - assign/insert/erase
-// - relational operators as free functions - taking const char* as one of the params
-class DOCTEST_INTERFACE String
-{
-    static const unsigned len  = 24;      //!OCLINT avoid private static members
-    static const unsigned last = len - 1; //!OCLINT avoid private static members
-
-    struct view // len should be more than sizeof(view) - because of the final byte for flags
-    {
-        char*    ptr;
-        unsigned size;
-        unsigned capacity;
-    };
-
-    union
-    {
-        char buf[len];
-        view data;
-    };
-
-    bool isOnStack() const { return (buf[last] & 128) == 0; }
-    void setOnHeap();
-    void setLast(unsigned in = last);
-
-    void copy(const String& other);
-
-public:
-    String();
-    ~String();
-
-    String(const char* in);
-    String(const char* in, unsigned in_size);
-
-    String(const String& other);
-    String& operator=(const String& other);
-
-    String& operator+=(const String& other);
-    String  operator+(const String& other) const;
-
-    String(String&& other);
-    String& operator=(String&& other);
-
-    char  operator[](unsigned i) const;
-    char& operator[](unsigned i);
-
-    // the only functions I'm willing to leave in the interface - available for inlining
-    const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT
-    char*       c_str() {
-        if(isOnStack())
-            return reinterpret_cast<char*>(buf);
-        return data.ptr;
-    }
-
-    unsigned size() const;
-    unsigned capacity() const;
-
-    int compare(const char* other, bool no_case = false) const;
-    int compare(const String& other, bool no_case = false) const;
-};
-
-DOCTEST_INTERFACE bool operator==(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator!=(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator<(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs);
-
-DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in);
-
-namespace Color {
-    enum Enum
-    {
-        None = 0,
-        White,
-        Red,
-        Green,
-        Blue,
-        Cyan,
-        Yellow,
-        Grey,
-
-        Bright = 0x10,
-
-        BrightRed   = Bright | Red,
-        BrightGreen = Bright | Green,
-        LightGrey   = Bright | Grey,
-        BrightWhite = Bright | White
-    };
-
-    DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, Color::Enum code);
-} // namespace Color
-
-namespace assertType {
-    enum Enum
-    {
-        // macro traits
-
-        is_warn    = 1,
-        is_check   = 2 * is_warn,
-        is_require = 2 * is_check,
-
-        is_normal      = 2 * is_require,
-        is_throws      = 2 * is_normal,
-        is_throws_as   = 2 * is_throws,
-        is_throws_with = 2 * is_throws_as,
-        is_nothrow     = 2 * is_throws_with,
-
-        is_false = 2 * is_nothrow,
-        is_unary = 2 * is_false, // not checked anywhere - used just to distinguish the types
-
-        is_eq = 2 * is_unary,
-        is_ne = 2 * is_eq,
-
-        is_lt = 2 * is_ne,
-        is_gt = 2 * is_lt,
-
-        is_ge = 2 * is_gt,
-        is_le = 2 * is_ge,
-
-        // macro types
-
-        DT_WARN    = is_normal | is_warn,
-        DT_CHECK   = is_normal | is_check,
-        DT_REQUIRE = is_normal | is_require,
-
-        DT_WARN_FALSE    = is_normal | is_false | is_warn,
-        DT_CHECK_FALSE   = is_normal | is_false | is_check,
-        DT_REQUIRE_FALSE = is_normal | is_false | is_require,
-
-        DT_WARN_THROWS    = is_throws | is_warn,
-        DT_CHECK_THROWS   = is_throws | is_check,
-        DT_REQUIRE_THROWS = is_throws | is_require,
-
-        DT_WARN_THROWS_AS    = is_throws_as | is_warn,
-        DT_CHECK_THROWS_AS   = is_throws_as | is_check,
-        DT_REQUIRE_THROWS_AS = is_throws_as | is_require,
-
-        DT_WARN_THROWS_WITH    = is_throws_with | is_warn,
-        DT_CHECK_THROWS_WITH   = is_throws_with | is_check,
-        DT_REQUIRE_THROWS_WITH = is_throws_with | is_require,
-
-        DT_WARN_NOTHROW    = is_nothrow | is_warn,
-        DT_CHECK_NOTHROW   = is_nothrow | is_check,
-        DT_REQUIRE_NOTHROW = is_nothrow | is_require,
-
-        DT_WARN_EQ    = is_normal | is_eq | is_warn,
-        DT_CHECK_EQ   = is_normal | is_eq | is_check,
-        DT_REQUIRE_EQ = is_normal | is_eq | is_require,
-
-        DT_WARN_NE    = is_normal | is_ne | is_warn,
-        DT_CHECK_NE   = is_normal | is_ne | is_check,
-        DT_REQUIRE_NE = is_normal | is_ne | is_require,
-
-        DT_WARN_GT    = is_normal | is_gt | is_warn,
-        DT_CHECK_GT   = is_normal | is_gt | is_check,
-        DT_REQUIRE_GT = is_normal | is_gt | is_require,
-
-        DT_WARN_LT    = is_normal | is_lt | is_warn,
-        DT_CHECK_LT   = is_normal | is_lt | is_check,
-        DT_REQUIRE_LT = is_normal | is_lt | is_require,
-
-        DT_WARN_GE    = is_normal | is_ge | is_warn,
-        DT_CHECK_GE   = is_normal | is_ge | is_check,
-        DT_REQUIRE_GE = is_normal | is_ge | is_require,
-
-        DT_WARN_LE    = is_normal | is_le | is_warn,
-        DT_CHECK_LE   = is_normal | is_le | is_check,
-        DT_REQUIRE_LE = is_normal | is_le | is_require,
-
-        DT_WARN_UNARY    = is_normal | is_unary | is_warn,
-        DT_CHECK_UNARY   = is_normal | is_unary | is_check,
-        DT_REQUIRE_UNARY = is_normal | is_unary | is_require,
-
-        DT_WARN_UNARY_FALSE    = is_normal | is_false | is_unary | is_warn,
-        DT_CHECK_UNARY_FALSE   = is_normal | is_false | is_unary | is_check,
-        DT_REQUIRE_UNARY_FALSE = is_normal | is_false | is_unary | is_require,
-    };
-} // namespace assertType
-
-DOCTEST_INTERFACE const char* assertString(assertType::Enum at);
-DOCTEST_INTERFACE const char* failureString(assertType::Enum at);
-DOCTEST_INTERFACE const char* removePathFromFilename(const char* file);
-
-struct DOCTEST_INTERFACE TestCaseData
-{
-    const char* m_file;       // the file in which the test was registered
-    unsigned    m_line;       // the line where the test was registered
-    const char* m_name;       // name of the test case
-    const char* m_test_suite; // the test suite in which the test was added
-    const char* m_description;
-    bool        m_skip;
-    bool        m_may_fail;
-    bool        m_should_fail;
-    int         m_expected_failures;
-    double      m_timeout;
-
-    DOCTEST_DECLARE_DEFAULTS(TestCaseData);
-    DOCTEST_DECLARE_COPIES(TestCaseData);
-};
-
-struct DOCTEST_INTERFACE AssertData
-{
-    // common - for all asserts
-    const TestCaseData* m_test_case;
-    assertType::Enum    m_at;
-    const char*         m_file;
-    int                 m_line;
-    const char*         m_expr;
-    bool                m_failed;
-
-    // exception-related - for all asserts
-    bool   m_threw;
-    String m_exception;
-
-    // for normal asserts
-    String m_decomp;
-
-    // for specific exception-related asserts
-    bool        m_threw_as;
-    const char* m_exception_type;
-
-    DOCTEST_DECLARE_DEFAULTS(AssertData);
-    DOCTEST_DELETE_COPIES(AssertData);
-};
-
-struct DOCTEST_INTERFACE MessageData
-{
-    String           m_string;
-    const char*      m_file;
-    int              m_line;
-    assertType::Enum m_severity;
-
-    DOCTEST_DECLARE_DEFAULTS(MessageData);
-    DOCTEST_DELETE_COPIES(MessageData);
-};
-
-struct DOCTEST_INTERFACE SubcaseSignature
-{
-    const char* m_name;
-    const char* m_file;
-    int         m_line;
-
-    SubcaseSignature(const char* name, const char* file, int line);
-
-    bool operator<(const SubcaseSignature& other) const;
-
-    DOCTEST_DECLARE_DEFAULTS(SubcaseSignature);
-    DOCTEST_DECLARE_COPIES(SubcaseSignature);
-};
-
-struct DOCTEST_INTERFACE IContextScope
-{
-    DOCTEST_DELETE_COPIES(IContextScope);
-
-    IContextScope();
-    virtual ~IContextScope();
-    virtual void stringify(std::ostream*) const = 0;
-};
-
-struct ContextOptions //!OCLINT too many fields
-{
-    // == parameters from the command line
-    String   order_by;  // how tests should be ordered
-    unsigned rand_seed; // the seed for rand ordering
-
-    unsigned first; // the first (matching) test to be executed
-    unsigned last;  // the last (matching) test to be executed
-
-    int abort_after;           // stop tests after this many failed assertions
-    int subcase_filter_levels; // apply the subcase filters for the first N levels
-
-    bool success;              // include successful assertions in output
-    bool case_sensitive;       // if filtering should be case sensitive
-    bool exit;                 // if the program should be exited after the tests are ran/whatever
-    bool duration;             // print the time duration of each test case
-    bool no_throw;             // to skip exceptions-related assertion macros
-    bool no_exitcode;          // if the framework should return 0 as the exitcode
-    bool no_run;               // to not run the tests at all (can be done with an "*" exclude)
-    bool no_version;           // to not print the version of the framework
-    bool no_colors;            // if output to the console should be colorized
-    bool force_colors;         // forces the use of colors even when a tty cannot be detected
-    bool no_breaks;            // to not break into the debugger
-    bool no_skip;              // don't skip test cases which are marked to be skipped
-    bool gnu_file_line;        // if line numbers should be surrounded with :x: and not (x):
-    bool no_path_in_filenames; // if the path to files should be removed from the output
-    bool no_line_numbers;      // if source code line numbers should be omitted from the output
-    bool no_skipped_summary;   // don't print "skipped" in the summary !!! UNDOCUMENTED !!!
-
-    bool help;             // to print the help
-    bool version;          // to print the version
-    bool count;            // if only the count of matching tests is to be retreived
-    bool list_test_cases;  // to list all tests matching the filters
-    bool list_test_suites; // to list all suites matching the filters
-    bool list_reporters;   // lists all registered reporters
-
-    DOCTEST_DECLARE_DEFAULTS(ContextOptions);
-    DOCTEST_DELETE_COPIES(ContextOptions);
-};
-
-namespace detail {
-#if defined(DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || defined(DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS)
-    template <bool CONDITION, typename TYPE = void>
-    struct enable_if
-    {};
-
-    template <typename TYPE>
-    struct enable_if<true, TYPE>
-    { typedef TYPE type; };
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format off
-    template<class T> struct remove_reference      { typedef T type; };
-    template<class T> struct remove_reference<T&>  { typedef T type; };
-    template<class T> struct remove_reference<T&&> { typedef T type; };
-
-    template<class T> struct remove_const          { typedef T type; };
-    template<class T> struct remove_const<const T> { typedef T type; };
-    // clang-format on
-
-    template <typename T>
-    struct deferred_false
-    // cppcheck-suppress unusedStructMember
-    { static const bool value = false; };
-
-    namespace has_insertion_operator_impl {
-        typedef char no;
-        typedef char yes[2];
-
-        struct any_t
-        {
-            template <typename T>
-            // cppcheck-suppress noExplicitConstructor
-            any_t(const DOCTEST_REF_WRAP(T));
-        };
-
-        yes& testStreamable(std::ostream&);
-        no   testStreamable(no);
-
-        no operator<<(const std::ostream&, const any_t&);
-
-        template <typename T>
-        struct has_insertion_operator
-        {
-            static std::ostream& s;
-            static const DOCTEST_REF_WRAP(T) t;
-            static const bool value = sizeof(testStreamable(s << t)) == sizeof(yes);
-        };
-    } // namespace has_insertion_operator_impl
-
-    template <typename T>
-    struct has_insertion_operator : has_insertion_operator_impl::has_insertion_operator<T>
-    {};
-
-    DOCTEST_INTERFACE void my_memcpy(void* dest, const void* src, unsigned num);
-
-    DOCTEST_INTERFACE std::ostream* getTlsOss(); // returns a thread-local ostringstream
-    DOCTEST_INTERFACE String getTlsOssResult();
-
-    template <bool C>
-    struct StringMakerBase
-    {
-        template <typename T>
-        static String convert(const DOCTEST_REF_WRAP(T)) {
-            return "{?}";
-        }
-    };
-
-    template <>
-    struct StringMakerBase<true>
-    {
-        template <typename T>
-        static String convert(const DOCTEST_REF_WRAP(T) in) {
-            *getTlsOss() << in;
-            return getTlsOssResult();
-        }
-    };
-
-    DOCTEST_INTERFACE String rawMemoryToString(const void* object, unsigned size);
-
-    template <typename T>
-    String rawMemoryToString(const DOCTEST_REF_WRAP(T) object) {
-        return rawMemoryToString(&object, sizeof(object));
-    }
-
-    template <typename T>
-    const char* type_to_string() {
-        return "<>";
-    }
-} // namespace detail
-
-template <typename T>
-struct StringMaker : public detail::StringMakerBase<detail::has_insertion_operator<T>::value>
-{};
-
-template <typename T>
-struct StringMaker<T*>
-{
-    template <typename U>
-    static String convert(U* p) {
-        if(p)
-            return detail::rawMemoryToString(p);
-        return "NULL";
-    }
-};
-
-template <typename R, typename C>
-struct StringMaker<R C::*>
-{
-    static String convert(R C::*p) {
-        if(p)
-            return detail::rawMemoryToString(p);
-        return "NULL";
-    }
-};
-
-template <typename T>
-String toString(const DOCTEST_REF_WRAP(T) value) {
-    return StringMaker<T>::convert(value);
-}
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-DOCTEST_INTERFACE String toString(char* in);
-DOCTEST_INTERFACE String toString(const char* in);
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-DOCTEST_INTERFACE String toString(bool in);
-DOCTEST_INTERFACE String toString(float in);
-DOCTEST_INTERFACE String toString(double in);
-DOCTEST_INTERFACE String toString(double long in);
-
-DOCTEST_INTERFACE String toString(char in);
-DOCTEST_INTERFACE String toString(char signed in);
-DOCTEST_INTERFACE String toString(char unsigned in);
-DOCTEST_INTERFACE String toString(int short in);
-DOCTEST_INTERFACE String toString(int short unsigned in);
-DOCTEST_INTERFACE String toString(int in);
-DOCTEST_INTERFACE String toString(int unsigned in);
-DOCTEST_INTERFACE String toString(int long in);
-DOCTEST_INTERFACE String toString(int long unsigned in);
-DOCTEST_INTERFACE String toString(int long long in);
-DOCTEST_INTERFACE String toString(int long long unsigned in);
-DOCTEST_INTERFACE String toString(std::nullptr_t in);
-
-class DOCTEST_INTERFACE Approx
-{
-public:
-    explicit Approx(double value);
-
-    DOCTEST_DECLARE_COPIES(Approx);
-
-    Approx operator()(double value) const;
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    explicit Approx(const T& value,
-                    typename detail::enable_if<std::is_constructible<double, T>::value>::type* =
-                            static_cast<T*>(nullptr)) {
-        *this = Approx(static_cast<double>(value));
-    }
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    Approx& epsilon(double newEpsilon);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon(
-            const T& newEpsilon) {
-        m_epsilon = static_cast<double>(newEpsilon);
-        return *this;
-    }
-#endif //  DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    Approx& scale(double newScale);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale(
-            const T& newScale) {
-        m_scale = static_cast<double>(newScale);
-        return *this;
-    }
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format off
-    DOCTEST_INTERFACE friend bool operator==(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator==(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator!=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator!=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator<=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator<=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator>=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator>=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator< (double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator< (const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs);
-
-    DOCTEST_INTERFACE friend String toString(const Approx& in);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-#define DOCTEST_APPROX_PREFIX \
-    template <typename T> friend typename detail::enable_if<std::is_constructible<double, T>::value, bool>::type
-
-    DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(double(lhs), rhs); }
-    DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); }
-    DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
-    DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); }
-    DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) && lhs != rhs; }
-#undef DOCTEST_APPROX_PREFIX
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format on
-
-private:
-    double m_epsilon;
-    double m_scale;
-    double m_value;
-};
-
-DOCTEST_INTERFACE String toString(const Approx& in);
-
-DOCTEST_INTERFACE const ContextOptions* getContextOptions();
-
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-namespace detail {
-    // clang-format off
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    template<class T>               struct decay_array       { typedef T type; };
-    template<class T, unsigned N>   struct decay_array<T[N]> { typedef T* type; };
-    template<class T>               struct decay_array<T[]>  { typedef T* type; };
-
-    template<class T>   struct not_char_pointer              { enum { value = 1 }; };
-    template<>          struct not_char_pointer<char*>       { enum { value = 0 }; };
-    template<>          struct not_char_pointer<const char*> { enum { value = 0 }; };
-
-    template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {};
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    // clang-format on
-
-    struct DOCTEST_INTERFACE TestFailureException
-    {
-        DOCTEST_DECLARE_DEFAULTS(TestFailureException);
-        DOCTEST_DECLARE_COPIES(TestFailureException);
-    };
-
-    DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at);
-    DOCTEST_INTERFACE void throwException();
-
-    struct DOCTEST_INTERFACE Subcase
-    {
-        SubcaseSignature m_signature;
-        bool             m_entered = false;
-
-        Subcase(const char* name, const char* file, int line);
-        ~Subcase();
-
-        DOCTEST_DELETE_COPIES(Subcase);
-
-        operator bool() const;
-    };
-
-    template <typename L, typename R>
-    String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op,
-                               const DOCTEST_REF_WRAP(R) rhs) {
-        return toString(lhs) + op + toString(rhs);
-    }
-
-#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro)                              \
-    template <typename R>                                                                          \
-    DOCTEST_NOINLINE Result operator op(const DOCTEST_REF_WRAP(R) rhs) {                           \
-        bool res = op_macro(lhs, rhs);                                                             \
-        if(m_at & assertType::is_false)                                                            \
-            res = !res;                                                                            \
-        if(!res || doctest::getContextOptions()->success)                                          \
-            return Result(res, stringifyBinaryExpr(lhs, op_str, rhs));                             \
-        return Result(res);                                                                        \
-    }
-
-#define DOCTEST_FORBIT_EXPRESSION(rt, op)                                                          \
-    template <typename R>                                                                          \
-    rt& operator op(const R&) {                                                                    \
-        static_assert(deferred_false<R>::value,                                                    \
-                      "Expression Too Complex Please Rewrite As Binary Comparison!");              \
-        return *this;                                                                              \
-    }
-
-    struct DOCTEST_INTERFACE Result
-    {
-        bool   m_passed;
-        String m_decomp;
-
-        Result(bool passed, const String& decomposition = String());
-
-        DOCTEST_DECLARE_DEFAULTS(Result);
-        DOCTEST_DECLARE_COPIES(Result);
-
-        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence
-        DOCTEST_FORBIT_EXPRESSION(Result, &)
-        DOCTEST_FORBIT_EXPRESSION(Result, ^)
-        DOCTEST_FORBIT_EXPRESSION(Result, |)
-        DOCTEST_FORBIT_EXPRESSION(Result, &&)
-        DOCTEST_FORBIT_EXPRESSION(Result, ||)
-        DOCTEST_FORBIT_EXPRESSION(Result, ==)
-        DOCTEST_FORBIT_EXPRESSION(Result, !=)
-        DOCTEST_FORBIT_EXPRESSION(Result, <)
-        DOCTEST_FORBIT_EXPRESSION(Result, >)
-        DOCTEST_FORBIT_EXPRESSION(Result, <=)
-        DOCTEST_FORBIT_EXPRESSION(Result, >=)
-        DOCTEST_FORBIT_EXPRESSION(Result, =)
-        DOCTEST_FORBIT_EXPRESSION(Result, +=)
-        DOCTEST_FORBIT_EXPRESSION(Result, -=)
-        DOCTEST_FORBIT_EXPRESSION(Result, *=)
-        DOCTEST_FORBIT_EXPRESSION(Result, /=)
-        DOCTEST_FORBIT_EXPRESSION(Result, %=)
-        DOCTEST_FORBIT_EXPRESSION(Result, <<=)
-        DOCTEST_FORBIT_EXPRESSION(Result, >>=)
-        DOCTEST_FORBIT_EXPRESSION(Result, &=)
-        DOCTEST_FORBIT_EXPRESSION(Result, ^=)
-        DOCTEST_FORBIT_EXPRESSION(Result, |=)
-    };
-
-#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-    DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
-    DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-compare")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wdouble-promotion")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wconversion")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wfloat-equal")
-
-    DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-    DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
-    DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-compare")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wdouble-promotion")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wfloat-equal")
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-    // http://stackoverflow.com/questions/39479163 what's the difference between 4018 and 4389
-    DOCTEST_MSVC_SUPPRESS_WARNING(4388) // signed/unsigned mismatch
-    DOCTEST_MSVC_SUPPRESS_WARNING(4389) // 'operator' : signed/unsigned mismatch
-    DOCTEST_MSVC_SUPPRESS_WARNING(4018) // 'expression' : signed/unsigned mismatch
-    //DOCTEST_MSVC_SUPPRESS_WARNING(4805) // 'operation' : unsafe mix of type 'type' and type 'type' in operation
-
-#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    // clang-format off
-#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_COMPARISON_RETURN_TYPE bool
-#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_COMPARISON_RETURN_TYPE typename enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type
-    inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); }
-    inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); }
-    inline bool lt(const char* lhs, const char* rhs) { return String(lhs) <  String(rhs); }
-    inline bool gt(const char* lhs, const char* rhs) { return String(lhs) >  String(rhs); }
-    inline bool le(const char* lhs, const char* rhs) { return String(lhs) <= String(rhs); }
-    inline bool ge(const char* lhs, const char* rhs) { return String(lhs) >= String(rhs); }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    // clang-format on
-
-#define DOCTEST_RELATIONAL_OP(name, op)                                                            \
-    template <typename L, typename R>                                                              \
-    DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs,                             \
-                                        const DOCTEST_REF_WRAP(R) rhs) {                           \
-        return lhs op rhs;                                                                         \
-    }
-
-    DOCTEST_RELATIONAL_OP(eq, ==)
-    DOCTEST_RELATIONAL_OP(ne, !=)
-    DOCTEST_RELATIONAL_OP(lt, <)
-    DOCTEST_RELATIONAL_OP(gt, >)
-    DOCTEST_RELATIONAL_OP(le, <=)
-    DOCTEST_RELATIONAL_OP(ge, >=)
-
-#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_CMP_EQ(l, r) l == r
-#define DOCTEST_CMP_NE(l, r) l != r
-#define DOCTEST_CMP_GT(l, r) l > r
-#define DOCTEST_CMP_LT(l, r) l < r
-#define DOCTEST_CMP_GE(l, r) l >= r
-#define DOCTEST_CMP_LE(l, r) l <= r
-#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_CMP_EQ(l, r) eq(l, r)
-#define DOCTEST_CMP_NE(l, r) ne(l, r)
-#define DOCTEST_CMP_GT(l, r) gt(l, r)
-#define DOCTEST_CMP_LT(l, r) lt(l, r)
-#define DOCTEST_CMP_GE(l, r) ge(l, r)
-#define DOCTEST_CMP_LE(l, r) le(l, r)
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-
-    template <typename L>
-    // cppcheck-suppress copyCtorAndEqOperator
-    struct Expression_lhs
-    {
-        L                lhs;
-        assertType::Enum m_at;
-
-        explicit Expression_lhs(L in, assertType::Enum at)
-                : lhs(in)
-                , m_at(at) {}
-
-        DOCTEST_NOINLINE operator Result() {
-            bool res = !!lhs;
-            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional
-                res = !res;
-
-            if(!res || getContextOptions()->success)
-                return Result(res, toString(lhs));
-            return Result(res);
-        }
-
-        // clang-format off
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(==, " == ", DOCTEST_CMP_EQ) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(!=, " != ", DOCTEST_CMP_NE) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>,  " >  ", DOCTEST_CMP_GT) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<,  " <  ", DOCTEST_CMP_LT) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>=, " >= ", DOCTEST_CMP_GE) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<=, " <= ", DOCTEST_CMP_LE) //!OCLINT bitwise operator in conditional
-        // clang-format on
-
-        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &&)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ||)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, =)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, +=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, -=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, *=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, /=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, %=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |=)
-        // these 2 are unfortunate because they should be allowed - they have higher precedence over the comparisons, but the
-        // ExpressionDecomposer class uses the left shift operator to capture the left operand of the binary expression...
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>)
-    };
-
-#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    struct DOCTEST_INTERFACE ExpressionDecomposer
-    {
-        assertType::Enum m_at;
-
-        ExpressionDecomposer(assertType::Enum at);
-
-        DOCTEST_DECLARE_DEFAULTS(ExpressionDecomposer);
-        DOCTEST_DELETE_COPIES(ExpressionDecomposer);
-
-        // The right operator for capturing expressions is "<=" instead of "<<" (based on the operator precedence table)
-        // but then there will be warnings from GCC about "-Wparentheses" and since "_Pragma()" is problematic this will stay for now...
-        // https://github.com/philsquared/Catch/issues/870
-        // https://github.com/philsquared/Catch/issues/565
-        template <typename L>
-        Expression_lhs<const DOCTEST_REF_WRAP(L)> operator<<(const DOCTEST_REF_WRAP(L) operand) {
-            return Expression_lhs<const DOCTEST_REF_WRAP(L)>(operand, m_at);
-        }
-    };
-
-    struct DOCTEST_INTERFACE TestSuite
-    {
-        const char* m_test_suite;
-        const char* m_description;
-        bool        m_skip;
-        bool        m_may_fail;
-        bool        m_should_fail;
-        int         m_expected_failures;
-        double      m_timeout;
-
-        DOCTEST_DECLARE_DEFAULTS(TestSuite);
-        DOCTEST_DECLARE_COPIES(TestSuite);
-
-        TestSuite& operator*(const char* in);
-
-        template <typename T>
-        TestSuite& operator*(const T& in) {
-            in.fill(*this);
-            return *this;
-        }
-    };
-
-    typedef void (*funcType)();
-
-    struct DOCTEST_INTERFACE TestCase : public TestCaseData
-    {
-        funcType m_test; // a function pointer to the test case
-
-        const char* m_type; // for templated test cases - gets appended to the real name
-        int m_template_id; // an ID used to distinguish between the different versions of a templated test case
-        String m_full_name; // contains the name (only for templated test cases!) + the template type
-
-        TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
-                 const char* type = "", int template_id = -1);
-
-        DOCTEST_DECLARE_DEFAULTS(TestCase);
-
-        TestCase(const TestCase& other);
-
-        DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
-        TestCase& operator=(const TestCase& other);
-        DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-        TestCase& operator*(const char* in);
-
-        template <typename T>
-        TestCase& operator*(const T& in) {
-            in.fill(*this);
-            return *this;
-        }
-
-        bool operator<(const TestCase& other) const;
-    };
-
-    // forward declarations of functions used by the macros
-    DOCTEST_INTERFACE int  regTest(const TestCase& tc);
-    DOCTEST_INTERFACE int  setTestSuite(const TestSuite& ts);
-    DOCTEST_INTERFACE bool isDebuggerActive();
-
-    namespace binaryAssertComparison {
-        enum Enum
-        {
-            eq = 0,
-            ne,
-            gt,
-            lt,
-            ge,
-            le
-        };
-    } // namespace binaryAssertComparison
-
-    // clang-format off
-    template <int, class L, class R> struct RelationalComparator     { bool operator()(const DOCTEST_REF_WRAP(L),     const DOCTEST_REF_WRAP(R)    ) const { return false;        } };
-    
-#define DOCTEST_BINARY_RELATIONAL_OP(n, op) \
-    template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };
-    // clang-format on
-
-    DOCTEST_BINARY_RELATIONAL_OP(0, eq)
-    DOCTEST_BINARY_RELATIONAL_OP(1, ne)
-    DOCTEST_BINARY_RELATIONAL_OP(2, gt)
-    DOCTEST_BINARY_RELATIONAL_OP(3, lt)
-    DOCTEST_BINARY_RELATIONAL_OP(4, ge)
-    DOCTEST_BINARY_RELATIONAL_OP(5, le)
-
-    struct DOCTEST_INTERFACE ResultBuilder : public AssertData
-    {
-        ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
-                      const char* exception_type = "");
-
-        DOCTEST_DECLARE_DEFAULTS(ResultBuilder);
-        DOCTEST_DELETE_COPIES(ResultBuilder);
-
-        void setResult(const Result& res);
-
-        template <int comparison, typename L, typename R>
-        DOCTEST_NOINLINE void binary_assert(const DOCTEST_REF_WRAP(L) lhs,
-                                            const DOCTEST_REF_WRAP(R) rhs) {
-            m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
-            if(m_failed || getContextOptions()->success)
-                m_decomp = stringifyBinaryExpr(lhs, ", ", rhs);
-        }
-
-        template <typename L>
-        DOCTEST_NOINLINE void unary_assert(const DOCTEST_REF_WRAP(L) val) {
-            m_failed = !val;
-
-            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional
-                m_failed = !m_failed;
-
-            if(m_failed || getContextOptions()->success)
-                m_decomp = toString(val);
-        }
-
-        void translateException();
-
-        bool log();
-        void react() const;
-    };
-
-    namespace assertAction {
-        enum Enum
-        {
-            nothing     = 0,
-            dbgbreak    = 1,
-            shouldthrow = 2
-        };
-    } // namespace assertAction
-
-    DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);
-
-    DOCTEST_INTERFACE void decomp_assert(assertType::Enum at, const char* file, int line,
-                                         const char* expr, Result result);
-
-#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp)                                                        \
-    do {                                                                                           \
-        if(!is_running_in_test) {                                                                  \
-            if(failed) {                                                                           \
-                ResultBuilder rb(at, file, line, expr);                                            \
-                rb.m_failed = failed;                                                              \
-                rb.m_decomp = decomp;                                                              \
-                failed_out_of_a_testing_context(rb);                                               \
-                if(isDebuggerActive() && !getContextOptions()->no_breaks)                          \
-                    DOCTEST_BREAK_INTO_DEBUGGER();                                                 \
-                if(checkIfShouldThrow(at))                                                         \
-                    throwException();                                                              \
-            }                                                                                      \
-            return;                                                                                \
-        }                                                                                          \
-    } while(false)
-
-#define DOCTEST_ASSERT_IN_TESTS(decomp)                                                            \
-    ResultBuilder rb(at, file, line, expr);                                                        \
-    rb.m_failed = failed;                                                                          \
-    if(rb.m_failed || getContextOptions()->success)                                                \
-        rb.m_decomp = decomp;                                                                      \
-    if(rb.log())                                                                                   \
-        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \
-    if(rb.m_failed && checkIfShouldThrow(at))                                                      \
-    throwException()
-
-    template <int comparison, typename L, typename R>
-    DOCTEST_NOINLINE void binary_assert(assertType::Enum at, const char* file, int line,
-                                        const char* expr, const DOCTEST_REF_WRAP(L) lhs,
-                                        const DOCTEST_REF_WRAP(R) rhs) {
-        bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
-        DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
-    }
-
-    template <typename L>
-    DOCTEST_NOINLINE void unary_assert(assertType::Enum at, const char* file, int line,
-                                       const char* expr, const DOCTEST_REF_WRAP(L) val) {
-        bool failed = !val;
-
-        if(at & assertType::is_false) //!OCLINT bitwise operator in conditional
-            failed = !failed;
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(toString(val));
-        DOCTEST_ASSERT_IN_TESTS(toString(val));
-    }
-
-    struct DOCTEST_INTERFACE IExceptionTranslator
-    {
-        DOCTEST_DELETE_COPIES(IExceptionTranslator);
-
-        IExceptionTranslator();
-        virtual ~IExceptionTranslator();
-        virtual bool translate(String&) const = 0;
-    };
-
-    template <typename T>
-    class ExceptionTranslator : public IExceptionTranslator //!OCLINT destructor of virtual class
-    {
-    public:
-        explicit ExceptionTranslator(String (*translateFunction)(T))
-                : m_translateFunction(translateFunction) {}
-
-        bool translate(String& res) const {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-            try {
-                throw;
-                // cppcheck-suppress catchExceptionByValue
-            } catch(T ex) {                    // NOLINT
-                res = m_translateFunction(ex); //!OCLINT parameter reassignment
-                return true;
-            } catch(...) {} //!OCLINT -  empty catch statement
-#endif                      // DOCTEST_CONFIG_NO_EXCEPTIONS
-            ((void)res);    // to silence -Wunused-parameter
-            return false;
-        }
-
-    private:
-        String (*m_translateFunction)(T);
-    };
-
-    DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et);
-
-    // FIX FOR VISUAL STUDIO VERSIONS PRIOR TO 2015 - they failed to compile the call to operator<< with
-    // std::ostream passed as a reference noting that there is a use of an undefined type (which there isn't)
-    DOCTEST_INTERFACE void writeStringToStream(std::ostream* s, const String& str);
-
-    template <bool C>
-    struct StringStreamBase
-    {
-        template <typename T>
-        static void convert(std::ostream* s, const T& in) {
-            writeStringToStream(s, toString(in));
-        }
-
-        // always treat char* as a string in this context - no matter
-        // if DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING is defined
-        static void convert(std::ostream* s, const char* in) { writeStringToStream(s, String(in)); }
-    };
-
-    template <>
-    struct StringStreamBase<true>
-    {
-        template <typename T>
-        static void convert(std::ostream* s, const T& in) {
-            *s << in;
-        }
-    };
-
-    template <typename T>
-    struct StringStream : public StringStreamBase<has_insertion_operator<T>::value>
-    {};
-
-    template <typename T>
-    void toStream(std::ostream* s, const T& value) {
-        StringStream<T>::convert(s, value);
-    }
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char* in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, const char* in);
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    DOCTEST_INTERFACE void toStream(std::ostream* s, bool in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, float in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, double in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, double long in);
-
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char signed in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int short in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int short unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long unsigned in);
-
-    class DOCTEST_INTERFACE ContextBuilder
-    {
-        friend class ContextScope;
-
-        struct DOCTEST_INTERFACE ICapture
-        {
-            DOCTEST_DELETE_COPIES(ICapture);
-            ICapture();
-            virtual ~ICapture();
-            virtual void toStream(std::ostream*) const = 0;
-        };
-
-        template <typename T>
-        struct Capture : public ICapture //!OCLINT destructor of virtual class
-        {
-            const T* capture;
-
-            explicit Capture(const T* in)
-                    : capture(in) {}
-            void toStream(std::ostream* s) const override { detail::toStream(s, *capture); }
-        };
-
-        struct DOCTEST_INTERFACE Chunk
-        {
-            char buf[sizeof(Capture<char>)] DOCTEST_ALIGNMENT(
-                    2 * sizeof(void*)); // place to construct a Capture<T>
-
-            DOCTEST_DECLARE_DEFAULTS(Chunk);
-            DOCTEST_DELETE_COPIES(Chunk);
-        };
-
-        struct DOCTEST_INTERFACE Node
-        {
-            Chunk chunk;
-            Node* next;
-
-            DOCTEST_DECLARE_DEFAULTS(Node);
-            DOCTEST_DELETE_COPIES(Node);
-        };
-
-        Chunk stackChunks[DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK];
-        int   numCaptures = 0;
-        Node* head        = nullptr;
-        Node* tail        = nullptr;
-
-        ContextBuilder(ContextBuilder& other);
-
-        ContextBuilder& operator=(const ContextBuilder&) = delete;
-
-        void stringify(std::ostream* s) const;
-
-    public:
-        ContextBuilder();
-        ~ContextBuilder();
-
-        template <typename T>
-        DOCTEST_NOINLINE ContextBuilder& operator<<(T& in) {
-            Capture<T> temp(&in);
-
-            // construct either on stack or on heap
-            // copy the bytes for the whole object - including the vtable because we cant construct
-            // the object directly in the buffer using placement new - need the <new> header...
-            if(numCaptures < DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK) {
-                my_memcpy(stackChunks[numCaptures].buf, &temp, sizeof(Chunk));
-            } else {
-                auto curr  = new Node;
-                curr->next = nullptr;
-                if(tail) {
-                    tail->next = curr;
-                    tail       = curr;
-                } else {
-                    head = tail = curr;
-                }
-
-                my_memcpy(tail->chunk.buf, &temp, sizeof(Chunk));
-            }
-            ++numCaptures;
-            return *this;
-        }
-
-        template <typename T>
-        ContextBuilder& operator<<(const T&&) {
-            static_assert(deferred_false<T>::value,
-                          "Cannot pass temporaries or rvalues to the streaming operator because it "
-                          "caches pointers to the passed objects for lazy evaluation!");
-            return *this;
-        }
-    };
-
-    class DOCTEST_INTERFACE ContextScope : public IContextScope
-    {
-        ContextBuilder contextBuilder;
-
-    public:
-        explicit ContextScope(ContextBuilder& temp);
-
-        DOCTEST_DELETE_COPIES(ContextScope);
-
-        ~ContextScope();
-
-        void stringify(std::ostream* s) const;
-    };
-
-    struct DOCTEST_INTERFACE MessageBuilder : public MessageData
-    {
-        std::ostream* m_stream;
-
-        MessageBuilder(const char* file, int line, assertType::Enum severity);
-        MessageBuilder() = delete;
-        ~MessageBuilder();
-
-        DOCTEST_DELETE_COPIES(MessageBuilder);
-
-        template <typename T>
-        MessageBuilder& operator<<(const T& in) {
-            toStream(m_stream, in);
-            return *this;
-        }
-
-        bool log();
-        void react();
-    };
-} // namespace detail
-
-#define DOCTEST_DEFINE_DECORATOR(name, type, def)                                                  \
-    struct name                                                                                    \
-    {                                                                                              \
-        type data;                                                                                 \
-        name(type in = def)                                                                        \
-                : data(in) {}                                                                      \
-        void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; }           \
-        void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; }          \
-    }
-
-DOCTEST_DEFINE_DECORATOR(test_suite, const char*, "");
-DOCTEST_DEFINE_DECORATOR(description, const char*, "");
-DOCTEST_DEFINE_DECORATOR(skip, bool, true);
-DOCTEST_DEFINE_DECORATOR(timeout, double, 0);
-DOCTEST_DEFINE_DECORATOR(may_fail, bool, true);
-DOCTEST_DEFINE_DECORATOR(should_fail, bool, true);
-DOCTEST_DEFINE_DECORATOR(expected_failures, int, 0);
-
-template <typename T>
-int registerExceptionTranslator(String (*translateFunction)(T)) {
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")
-    static detail::ExceptionTranslator<T> exceptionTranslator(translateFunction);
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    detail::registerExceptionTranslatorImpl(&exceptionTranslator);
-    return 0;
-}
-
-} // namespace doctest
-
-// in a separate namespace outside of doctest because the DOCTEST_TEST_SUITE macro
-// introduces an anonymous namespace in which getCurrentTestSuite gets overridden
-namespace doctest_detail_test_suite_ns {
-DOCTEST_INTERFACE doctest::detail::TestSuite& getCurrentTestSuite();
-} // namespace doctest_detail_test_suite_ns
-
-namespace doctest {
-#else  // DOCTEST_CONFIG_DISABLE
-template <typename T>
-int registerExceptionTranslator(String (*)(T)) {
-    return 0;
-}
-#endif // DOCTEST_CONFIG_DISABLE
-
-namespace detail {
-    typedef void (*assert_handler)(const AssertData&);
-    struct ContextState;
-} // namespace detail
-
-class DOCTEST_INTERFACE Context
-{
-    detail::ContextState* p;
-
-    void parseArgs(int argc, const char* const* argv, bool withDefaults = false);
-
-public:
-    explicit Context(int argc = 0, const char* const* argv = nullptr);
-
-    DOCTEST_DELETE_COPIES(Context);
-
-    ~Context();
-
-    void applyCommandLine(int argc, const char* const* argv);
-
-    void addFilter(const char* filter, const char* value);
-    void clearFilters();
-    void setOption(const char* option, int value);
-    void setOption(const char* option, const char* value);
-
-    bool shouldExit();
-
-    void setAsDefaultForAssertsOutOfTestCases();
-
-    void setAssertHandler(detail::assert_handler ah);
-
-    int run();
-};
-
-namespace TestCaseFailureReason {
-    enum Enum
-    {
-        None                     = 0,
-        AssertFailure            = 1,   // an assertion has failed in the test case
-        Exception                = 2,   // test case threw an exception
-        Crash                    = 4,   // a crash...
-        TooManyFailedAsserts     = 8,   // the abort-after option
-        Timeout                  = 16,  // see the timeout decorator
-        ShouldHaveFailedButDidnt = 32,  // see the should_fail decorator
-        ShouldHaveFailedAndDid   = 64,  // see the should_fail decorator
-        DidntFailExactlyNumTimes = 128, // see the expected_failures decorator
-        FailedExactlyNumTimes    = 256, // see the expected_failures decorator
-        CouldHaveFailedAndDid    = 512  // see the may_fail decorator
-    };
-} // namespace TestCaseFailureReason
-
-struct DOCTEST_INTERFACE CurrentTestCaseStats
-{
-    int    numAssertsForCurrentTestCase;
-    int    numAssertsFailedForCurrentTestCase;
-    double seconds_so_far;
-    int    failure_flags; // use TestCaseFailureReason::Enum
-    String error_string;
-    bool   should_reenter; // means we are not done with the test case because of subcases
-
-    DOCTEST_DECLARE_DEFAULTS(CurrentTestCaseStats);
-    DOCTEST_DELETE_COPIES(CurrentTestCaseStats);
-};
-
-struct DOCTEST_INTERFACE TestRunStats
-{
-    unsigned numTestCases;
-    unsigned numTestCasesPassingFilters;
-    unsigned numTestSuitesPassingFilters;
-    unsigned numTestCasesFailed;
-    int      numAsserts;
-    int      numAssertsFailed;
-
-    DOCTEST_DECLARE_DEFAULTS(TestRunStats);
-    DOCTEST_DELETE_COPIES(TestRunStats);
-};
-
-struct DOCTEST_INTERFACE IReporter
-{
-    // called when the whole test run starts (safe to cache a pointer to the input)
-    virtual void test_run_start(const ContextOptions&) = 0;
-    // called when the whole test run ends (caching a pointer to the input doesn't make sense here)
-    virtual void test_run_end(const TestRunStats&) = 0;
-
-    // called when a test case is started (safe to cache a pointer to the input)
-    virtual void test_case_start(const TestCaseData&) = 0;
-    // called when a test case has ended - could be re-entered if more subcases have to be
-    // traversed - check CurrentTestCaseStats::should_reenter (caching a pointer to the input doesn't make sense here)
-    virtual void test_case_end(const CurrentTestCaseStats&) = 0;
-
-    // called whenever a subcase is entered (don't cache pointers to the input)
-    virtual void subcase_start(const SubcaseSignature&) = 0;
-    // called whenever a subcase is exited (don't cache pointers to the input)
-    virtual void subcase_end(const SubcaseSignature&) = 0;
-
-    // called for each assert (don't cache pointers to the input)
-    virtual void log_assert(const AssertData&) = 0;
-    // called for each message (don't cache pointers to the input)
-    virtual void log_message(const MessageData&) = 0;
-
-    // called when a test case is skipped either because it doesn't pass the filters, has a skip decorator
-    // or isn't in the execution range (between first and last) (safe to cache a pointer to the input)
-    virtual void test_case_skipped(const TestCaseData&) = 0;
-
-    // doctest will not be managing the lifetimes of reporters given to it but this would still be nice to have
-    virtual ~IReporter();
-
-    // can obtain all currently active contexts and stringify them if one wishes to do so
-    static int                         get_num_active_contexts();
-    static const IContextScope* const* get_active_contexts();
-
-    // can iterate through contexts which have been stringified automatically in their destructors when an exception has been thrown
-    static int           get_num_stringified_contexts();
-    static const String* get_stringified_contexts();
-};
-
-int registerReporter(const char* name, int priority, IReporter& r);
-
-} // namespace doctest
-
-// if registering is not disabled
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-// common code in asserts - for convenience
-#define DOCTEST_ASSERT_LOG_AND_REACT(b)                                                            \
-    if(b.log())                                                                                    \
-        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \
-    b.react()
-
-#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#define DOCTEST_WRAP_IN_TRY(x) x;
-#else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#define DOCTEST_WRAP_IN_TRY(x)                                                                     \
-    try {                                                                                          \
-        x;                                                                                         \
-    } catch(...) { _DOCTEST_RB.translateException(); }
-#endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-
-// registers the test by initializing a dummy var with a function
-#define DOCTEST_REGISTER_FUNCTION(f, decorators)                                                   \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) = doctest::detail::regTest(  \
-            doctest::detail::TestCase(f, __FILE__, __LINE__,                                       \
-                                      doctest_detail_test_suite_ns::getCurrentTestSuite()) *       \
-            decorators);                                                                           \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()
-
-#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators)                                     \
-    namespace {                                                                                    \
-        struct der : public base                                                                   \
-        {                                                                                          \
-            void f();                                                                              \
-        };                                                                                         \
-        static void func() {                                                                       \
-            der v;                                                                                 \
-            v.f();                                                                                 \
-        }                                                                                          \
-        DOCTEST_REGISTER_FUNCTION(func, decorators)                                                \
-    }                                                                                              \
-    inline DOCTEST_NOINLINE void der::f()
-
-#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators)                                        \
-    static void f();                                                                               \
-    DOCTEST_REGISTER_FUNCTION(f, decorators)                                                       \
-    static void f()
-
-// for registering tests
-#define DOCTEST_TEST_CASE(decorators)                                                              \
-    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)
-
-// for registering tests with a fixture
-#define DOCTEST_TEST_CASE_FIXTURE(c, decorators)                                                   \
-    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), c,                          \
-                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)
-
-// for converting types to strings without the <typeinfo> header and demangling
-#define DOCTEST_TYPE_TO_STRING_IMPL(...)                                                           \
-    template <>                                                                                    \
-    inline const char* type_to_string<__VA_ARGS__>() {                                             \
-        return "<" #__VA_ARGS__ ">";                                                               \
-    }
-#define DOCTEST_TYPE_TO_STRING(...)                                                                \
-    namespace doctest { namespace detail {                                                         \
-            DOCTEST_TYPE_TO_STRING_IMPL(__VA_ARGS__)                                               \
-        }                                                                                          \
-    }                                                                                              \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for typed tests
-#define DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(func, type, decorators, idx)                         \
-    doctest::detail::regTest(                                                                      \
-            doctest::detail::TestCase(func, __FILE__, __LINE__,                                    \
-                                      doctest_detail_test_suite_ns::getCurrentTestSuite(),         \
-                                      doctest::detail::type_to_string<type>(), idx) *              \
-            decorators)
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, id, anon)                                   \
-    template <typename T>                                                                          \
-    inline void anon();                                                                            \
-    template <typename Type, typename... Rest>                                                     \
-    struct DOCTEST_CAT(id, ITERATOR)                                                               \
-    {                                                                                              \
-        DOCTEST_CAT(id, ITERATOR)(int line, int index) {                                           \
-            DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(anon<Type>, Type, dec, line * 1000 + index);     \
-            DOCTEST_CAT(id, ITERATOR)<Rest...>(line, index + 1);                                   \
-        }                                                                                          \
-    };                                                                                             \
-    template <typename Type>                                                                       \
-    struct DOCTEST_CAT(id, ITERATOR)<Type>                                                         \
-    {                                                                                              \
-        DOCTEST_CAT(id, ITERATOR)(int line, int index) {                                           \
-            DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(anon<Type>, Type, dec, line * 1000 + index);     \
-        }                                                                                          \
-    }
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, id, anon)                             \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, id, anon);                                      \
-    template <typename T>                                                                          \
-    inline void anon()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id)                                              \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_))
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...)                                 \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY)) = []() {                                  \
-        DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__> DOCTEST_UNUSED DOCTEST_CAT(anon, inner_dummy)(      \
-                __LINE__, 0);                                                                      \
-        return 0;                                                                                  \
-    }();                                                                                           \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...)                                            \
-    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_),         \
-                                                __VA_ARGS__)                                       \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-#define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...)                                         \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, anon, anon);                              \
-    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, __VA_ARGS__)                           \
-    template <typename T>                                                                          \
-    inline void anon()
-
-#define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...)                                                    \
-    DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__)
-
-// for subcases
-#define DOCTEST_SUBCASE(name)                                                                      \
-    if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \
-               doctest::detail::Subcase(name, __FILE__, __LINE__))
-
-// for grouping tests in test suites by using code blocks
-#define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name)                                               \
-    namespace ns_name { namespace doctest_detail_test_suite_ns {                                   \
-            static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() {            \
-                DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640)                                      \
-                DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")                \
-                static doctest::detail::TestSuite data;                                            \
-                static bool                       inited = false;                                  \
-                DOCTEST_MSVC_SUPPRESS_WARNING_POP                                                  \
-                DOCTEST_CLANG_SUPPRESS_WARNING_POP                                                 \
-                if(!inited) {                                                                      \
-                    data* decorators;                                                              \
-                    inited = true;                                                                 \
-                }                                                                                  \
-                return data;                                                                       \
-            }                                                                                      \
-        }                                                                                          \
-    }                                                                                              \
-    namespace ns_name
-
-#define DOCTEST_TEST_SUITE(decorators)                                                             \
-    DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUITE_))
-
-// for starting a testsuite block
-#define DOCTEST_TEST_SUITE_BEGIN(decorators)                                                       \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \
-            doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators);              \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for ending a testsuite block
-#define DOCTEST_TEST_SUITE_END                                                                     \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \
-            doctest::detail::setTestSuite(doctest::detail::TestSuite() * "");                      \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for registering exception translators
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature)                      \
-    inline doctest::String translatorName(signature);                                              \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)) =                     \
-            doctest::registerExceptionTranslator(translatorName);                                  \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    doctest::String translatorName(signature)
-
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \
-    DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_),       \
-                                               signature)
-
-// for registering
-#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)                                        \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) =                       \
-            doctest::registerReporter(name, priority, reporter);                                   \
-    DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for logging
-#define DOCTEST_INFO(x)                                                                            \
-    doctest::detail::ContextScope DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_)(                            \
-            doctest::detail::ContextBuilder() << x)
-#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := " << x)
-
-#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, x)                                               \
-    do {                                                                                           \
-        doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type);                 \
-        mb << x;                                                                                   \
-        DOCTEST_ASSERT_LOG_AND_REACT(mb);                                                          \
-    } while((void)0, 0)
-
-// clang-format off
-#define DOCTEST_ADD_MESSAGE_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-#define DOCTEST_ADD_FAIL_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-// clang-format on
-
-#define DOCTEST_MESSAGE(x) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, x)
-#define DOCTEST_FAIL_CHECK(x) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, x)
-#define DOCTEST_FAIL(x) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, x)
-
-// hack for macros like INFO() that require lvalues
-#if __cplusplus >= 201402L || (DOCTEST_MSVC >= DOCTEST_COMPILER(19, 10, 0))
-template <class T, T x>
-constexpr T to_lvalue = x;
-#define DOCTEST_TO_LVALUE(...) to_lvalue<decltype(__VA_ARGS__), __VA_ARGS__>
-#else // TO_LVALUE
-#define DOCTEST_TO_LVALUE(...) TO_LVALUE_CAN_BE_USED_ONLY_IN_CPP14_MODE_OR_WITH_VS_2017_OR_NEWER
-#endif // TO_LVALUE
-
-#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...)                                               \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses")                  \
-    doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,         \
-                                               __LINE__, #__VA_ARGS__);                            \
-    DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.setResult(                                                     \
-            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \
-            << __VA_ARGS__))                                                                       \
-    DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB)                                                      \
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \
-    do {                                                                                           \
-        DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__);                                      \
-    } while((void)0, 0)
-
-#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses")                  \
-    doctest::detail::decomp_assert(                                                                \
-            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__,                    \
-            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \
-                    << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)
-#define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)
-#define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)
-#define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)
-#define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)
-#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
-
-// clang-format off
-#define DOCTEST_WARN_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } while((void)0, 0)
-#define DOCTEST_CHECK_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } while((void)0, 0)
-#define DOCTEST_REQUIRE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } while((void)0, 0)
-#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } while((void)0, 0)
-#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } while((void)0, 0)
-#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } while((void)0, 0)
-// clang-format on
-
-#define DOCTEST_ASSERT_THROWS(expr, assert_type)                                                   \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr);                           \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(...) { _DOCTEST_RB.m_threw = true; }                                           \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, ...)                                           \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr, #__VA_ARGS__);             \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(const doctest::detail::remove_const<                                           \
-                    doctest::detail::remove_reference<__VA_ARGS__>::type>::type&) {                \
-                _DOCTEST_RB.m_threw    = true;                                                     \
-                _DOCTEST_RB.m_threw_as = true;                                                     \
-            } catch(...) { _DOCTEST_RB.translateException(); }                                     \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_THROWS_WITH(expr, assert_type, ...)                                         \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr, __VA_ARGS__);              \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(...) { _DOCTEST_RB.translateException(); }                                     \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_NOTHROW(expr, assert_type)                                                  \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #expr);                               \
-        try {                                                                                      \
-            expr;                                                                                  \
-        } catch(...) { _DOCTEST_RB.translateException(); }                                         \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-// clang-format off
-#define DOCTEST_WARN_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_WARN_THROWS)
-#define DOCTEST_CHECK_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_CHECK_THROWS)
-#define DOCTEST_REQUIRE_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_REQUIRE_THROWS)
-
-#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, __VA_ARGS__)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, __VA_ARGS__)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, __VA_ARGS__)
-
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS_WITH, __VA_ARGS__)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)
-
-#define DOCTEST_WARN_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_WARN_NOTHROW)
-#define DOCTEST_CHECK_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_CHECK_NOTHROW)
-#define DOCTEST_REQUIRE_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_REQUIRE_NOTHROW)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_NOTHROW(expr); } while((void)0, 0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_NOTHROW(expr); } while((void)0, 0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_NOTHROW(expr); } while((void)0, 0)
-// clang-format on
-
-#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...)                                              \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #__VA_ARGS__);                        \
-        DOCTEST_WRAP_IN_TRY(                                                                       \
-                _DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>(          \
-                        __VA_ARGS__))                                                              \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #__VA_ARGS__);                        \
-        DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.unary_assert(__VA_ARGS__))                                 \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...)                                        \
-    doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>(           \
-            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)
-
-#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \
-    doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__,            \
-                                  #__VA_ARGS__, __VA_ARGS__)
-
-#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)
-#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)
-#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)
-#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)
-#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)
-#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)
-#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)
-#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)
-#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)
-#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)
-#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)
-#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)
-#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)
-#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)
-#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)
-#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)
-#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)
-#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)
-
-#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)
-#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)
-#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)
-#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)
-#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)
-#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS
-
-#undef DOCTEST_WARN_THROWS
-#undef DOCTEST_CHECK_THROWS
-#undef DOCTEST_REQUIRE_THROWS
-#undef DOCTEST_WARN_THROWS_AS
-#undef DOCTEST_CHECK_THROWS_AS
-#undef DOCTEST_REQUIRE_THROWS_AS
-#undef DOCTEST_WARN_THROWS_WITH
-#undef DOCTEST_CHECK_THROWS_WITH
-#undef DOCTEST_REQUIRE_THROWS_WITH
-#undef DOCTEST_WARN_NOTHROW
-#undef DOCTEST_CHECK_NOTHROW
-#undef DOCTEST_REQUIRE_NOTHROW
-
-#undef DOCTEST_WARN_THROWS_MESSAGE
-#undef DOCTEST_CHECK_THROWS_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_MESSAGE
-#undef DOCTEST_WARN_THROWS_AS_MESSAGE
-#undef DOCTEST_CHECK_THROWS_AS_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_AS_MESSAGE
-#undef DOCTEST_WARN_THROWS_WITH_MESSAGE
-#undef DOCTEST_CHECK_THROWS_WITH_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_WITH_MESSAGE
-#undef DOCTEST_WARN_NOTHROW_MESSAGE
-#undef DOCTEST_CHECK_NOTHROW_MESSAGE
-#undef DOCTEST_REQUIRE_NOTHROW_MESSAGE
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#define DOCTEST_WARN_THROWS(expr) ((void)0)
-#define DOCTEST_CHECK_THROWS(expr) ((void)0)
-#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)
-#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_WARN_NOTHROW(expr) ((void)0)
-#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)
-
-#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#undef DOCTEST_REQUIRE
-#undef DOCTEST_REQUIRE_FALSE
-#undef DOCTEST_REQUIRE_MESSAGE
-#undef DOCTEST_REQUIRE_FALSE_MESSAGE
-#undef DOCTEST_REQUIRE_EQ
-#undef DOCTEST_REQUIRE_NE
-#undef DOCTEST_REQUIRE_GT
-#undef DOCTEST_REQUIRE_LT
-#undef DOCTEST_REQUIRE_GE
-#undef DOCTEST_REQUIRE_LE
-#undef DOCTEST_REQUIRE_UNARY
-#undef DOCTEST_REQUIRE_UNARY_FALSE
-
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-// =================================================================================================
-// == WHAT FOLLOWS IS VERSIONS OF THE MACROS THAT DO NOT DO ANY REGISTERING!                      ==
-// == THIS CAN BE ENABLED BY DEFINING DOCTEST_CONFIG_DISABLE GLOBALLY!                            ==
-// =================================================================================================
-#else // DOCTEST_CONFIG_DISABLE
-
-#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name)                                           \
-    namespace {                                                                                    \
-        template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                           \
-        struct der : public base                                                                   \
-        { void f(); };                                                                             \
-    }                                                                                              \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()
-
-#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name)                                              \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    static inline void f()
-
-// for registering tests
-#define DOCTEST_TEST_CASE(name)                                                                    \
-    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)
-
-// for registering tests with a fixture
-#define DOCTEST_TEST_CASE_FIXTURE(x, name)                                                         \
-    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), x,                          \
-                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)
-
-// for converting types to strings without the <typeinfo> header and demangling
-#define DOCTEST_TYPE_TO_STRING(...) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-#define DOCTEST_TYPE_TO_STRING_IMPL(...)
-
-// for typed tests
-#define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...)                                                \
-    template <typename type>                                                                       \
-    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id)                                          \
-    template <typename type>                                                                       \
-    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...)                                            \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for subcases
-#define DOCTEST_SUBCASE(name)
-
-// for a testsuite block
-#define DOCTEST_TEST_SUITE(name) namespace
-
-// for starting a testsuite block
-#define DOCTEST_TEST_SUITE_BEGIN(name) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for ending a testsuite block
-#define DOCTEST_TEST_SUITE_END typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    static inline doctest::String DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)(signature)
-
-#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
-
-#define DOCTEST_INFO(x) ((void)0)
-#define DOCTEST_CAPTURE(x) ((void)0)
-#define DOCTEST_ADD_MESSAGE_AT(file, line, x) ((void)0)
-#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) ((void)0)
-#define DOCTEST_ADD_FAIL_AT(file, line, x) ((void)0)
-#define DOCTEST_MESSAGE(x) ((void)0)
-#define DOCTEST_FAIL_CHECK(x) ((void)0)
-#define DOCTEST_FAIL(x) ((void)0)
-
-#define DOCTEST_WARN(...) ((void)0)
-#define DOCTEST_CHECK(...) ((void)0)
-#define DOCTEST_REQUIRE(...) ((void)0)
-#define DOCTEST_WARN_FALSE(...) ((void)0)
-#define DOCTEST_CHECK_FALSE(...) ((void)0)
-#define DOCTEST_REQUIRE_FALSE(...) ((void)0)
-
-#define DOCTEST_WARN_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_CHECK_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_REQUIRE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) ((void)0)
-
-#define DOCTEST_WARN_THROWS(expr) ((void)0)
-#define DOCTEST_CHECK_THROWS(expr) ((void)0)
-#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)
-#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_WARN_NOTHROW(expr) ((void)0)
-#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)
-
-#define DOCTEST_WARN_EQ(...) ((void)0)
-#define DOCTEST_CHECK_EQ(...) ((void)0)
-#define DOCTEST_REQUIRE_EQ(...) ((void)0)
-#define DOCTEST_WARN_NE(...) ((void)0)
-#define DOCTEST_CHECK_NE(...) ((void)0)
-#define DOCTEST_REQUIRE_NE(...) ((void)0)
-#define DOCTEST_WARN_GT(...) ((void)0)
-#define DOCTEST_CHECK_GT(...) ((void)0)
-#define DOCTEST_REQUIRE_GT(...) ((void)0)
-#define DOCTEST_WARN_LT(...) ((void)0)
-#define DOCTEST_CHECK_LT(...) ((void)0)
-#define DOCTEST_REQUIRE_LT(...) ((void)0)
-#define DOCTEST_WARN_GE(...) ((void)0)
-#define DOCTEST_CHECK_GE(...) ((void)0)
-#define DOCTEST_REQUIRE_GE(...) ((void)0)
-#define DOCTEST_WARN_LE(...) ((void)0)
-#define DOCTEST_CHECK_LE(...) ((void)0)
-#define DOCTEST_REQUIRE_LE(...) ((void)0)
-
-#define DOCTEST_WARN_UNARY(...) ((void)0)
-#define DOCTEST_CHECK_UNARY(...) ((void)0)
-#define DOCTEST_REQUIRE_UNARY(...) ((void)0)
-#define DOCTEST_WARN_UNARY_FALSE(...) ((void)0)
-#define DOCTEST_CHECK_UNARY_FALSE(...) ((void)0)
-#define DOCTEST_REQUIRE_UNARY_FALSE(...) ((void)0)
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-// clang-format off
-// KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS
-#define DOCTEST_FAST_WARN_EQ             DOCTEST_WARN_EQ
-#define DOCTEST_FAST_CHECK_EQ            DOCTEST_CHECK_EQ
-#define DOCTEST_FAST_REQUIRE_EQ          DOCTEST_REQUIRE_EQ
-#define DOCTEST_FAST_WARN_NE             DOCTEST_WARN_NE
-#define DOCTEST_FAST_CHECK_NE            DOCTEST_CHECK_NE
-#define DOCTEST_FAST_REQUIRE_NE          DOCTEST_REQUIRE_NE
-#define DOCTEST_FAST_WARN_GT             DOCTEST_WARN_GT
-#define DOCTEST_FAST_CHECK_GT            DOCTEST_CHECK_GT
-#define DOCTEST_FAST_REQUIRE_GT          DOCTEST_REQUIRE_GT
-#define DOCTEST_FAST_WARN_LT             DOCTEST_WARN_LT
-#define DOCTEST_FAST_CHECK_LT            DOCTEST_CHECK_LT
-#define DOCTEST_FAST_REQUIRE_LT          DOCTEST_REQUIRE_LT
-#define DOCTEST_FAST_WARN_GE             DOCTEST_WARN_GE
-#define DOCTEST_FAST_CHECK_GE            DOCTEST_CHECK_GE
-#define DOCTEST_FAST_REQUIRE_GE          DOCTEST_REQUIRE_GE
-#define DOCTEST_FAST_WARN_LE             DOCTEST_WARN_LE
-#define DOCTEST_FAST_CHECK_LE            DOCTEST_CHECK_LE
-#define DOCTEST_FAST_REQUIRE_LE          DOCTEST_REQUIRE_LE
-
-#define DOCTEST_FAST_WARN_UNARY          DOCTEST_WARN_UNARY
-#define DOCTEST_FAST_CHECK_UNARY         DOCTEST_CHECK_UNARY
-#define DOCTEST_FAST_REQUIRE_UNARY       DOCTEST_REQUIRE_UNARY
-#define DOCTEST_FAST_WARN_UNARY_FALSE    DOCTEST_WARN_UNARY_FALSE
-#define DOCTEST_FAST_CHECK_UNARY_FALSE   DOCTEST_CHECK_UNARY_FALSE
-#define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
-// clang-format on
-
-// BDD style macros
-// clang-format off
-#define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE("  Scenario: " name)
-#define DOCTEST_SCENARIO_TEMPLATE(name, T, ...)  DOCTEST_TEST_CASE_TEMPLATE("  Scenario: " name, T, __VA_ARGS__)
-#define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE("  Scenario: " name, T, id)
-
-#define DOCTEST_GIVEN(name)     SUBCASE("   Given: " name)
-#define DOCTEST_WHEN(name)      SUBCASE("    When: " name)
-#define DOCTEST_AND_WHEN(name)  SUBCASE("And when: " name)
-#define DOCTEST_THEN(name)      SUBCASE("    Then: " name)
-#define DOCTEST_AND_THEN(name)  SUBCASE("     And: " name)
-// clang-format on
-
-// == SHORT VERSIONS OF THE MACROS
-#if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES)
-
-#define TEST_CASE DOCTEST_TEST_CASE
-#define TEST_CASE_FIXTURE DOCTEST_TEST_CASE_FIXTURE
-#define TYPE_TO_STRING DOCTEST_TYPE_TO_STRING
-#define TEST_CASE_TEMPLATE DOCTEST_TEST_CASE_TEMPLATE
-#define TEST_CASE_TEMPLATE_DEFINE DOCTEST_TEST_CASE_TEMPLATE_DEFINE
-#define TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE
-#define SUBCASE DOCTEST_SUBCASE
-#define TEST_SUITE DOCTEST_TEST_SUITE
-#define TEST_SUITE_BEGIN DOCTEST_TEST_SUITE_BEGIN
-#define TEST_SUITE_END DOCTEST_TEST_SUITE_END
-#define REGISTER_EXCEPTION_TRANSLATOR DOCTEST_REGISTER_EXCEPTION_TRANSLATOR
-#define REGISTER_REPORTER DOCTEST_REGISTER_REPORTER
-#define INFO DOCTEST_INFO
-#define CAPTURE DOCTEST_CAPTURE
-#define ADD_MESSAGE_AT DOCTEST_ADD_MESSAGE_AT
-#define ADD_FAIL_CHECK_AT DOCTEST_ADD_FAIL_CHECK_AT
-#define ADD_FAIL_AT DOCTEST_ADD_FAIL_AT
-#define MESSAGE DOCTEST_MESSAGE
-#define FAIL_CHECK DOCTEST_FAIL_CHECK
-#define FAIL DOCTEST_FAIL
-#define TO_LVALUE DOCTEST_TO_LVALUE
-
-#define WARN DOCTEST_WARN
-#define WARN_FALSE DOCTEST_WARN_FALSE
-#define WARN_THROWS DOCTEST_WARN_THROWS
-#define WARN_THROWS_AS DOCTEST_WARN_THROWS_AS
-#define WARN_THROWS_WITH DOCTEST_WARN_THROWS_WITH
-#define WARN_NOTHROW DOCTEST_WARN_NOTHROW
-#define CHECK DOCTEST_CHECK
-#define CHECK_FALSE DOCTEST_CHECK_FALSE
-#define CHECK_THROWS DOCTEST_CHECK_THROWS
-#define CHECK_THROWS_AS DOCTEST_CHECK_THROWS_AS
-#define CHECK_THROWS_WITH DOCTEST_CHECK_THROWS_WITH
-#define CHECK_NOTHROW DOCTEST_CHECK_NOTHROW
-#define REQUIRE DOCTEST_REQUIRE
-#define REQUIRE_FALSE DOCTEST_REQUIRE_FALSE
-#define REQUIRE_THROWS DOCTEST_REQUIRE_THROWS
-#define REQUIRE_THROWS_AS DOCTEST_REQUIRE_THROWS_AS
-#define REQUIRE_THROWS_WITH DOCTEST_REQUIRE_THROWS_WITH
-#define REQUIRE_NOTHROW DOCTEST_REQUIRE_NOTHROW
-
-#define WARN_MESSAGE DOCTEST_WARN_MESSAGE
-#define WARN_FALSE_MESSAGE DOCTEST_WARN_FALSE_MESSAGE
-#define WARN_THROWS_MESSAGE DOCTEST_WARN_THROWS_MESSAGE
-#define WARN_THROWS_AS_MESSAGE DOCTEST_WARN_THROWS_AS_MESSAGE
-#define WARN_THROWS_WITH_MESSAGE DOCTEST_WARN_THROWS_WITH_MESSAGE
-#define WARN_NOTHROW_MESSAGE DOCTEST_WARN_NOTHROW_MESSAGE
-#define CHECK_MESSAGE DOCTEST_CHECK_MESSAGE
-#define CHECK_FALSE_MESSAGE DOCTEST_CHECK_FALSE_MESSAGE
-#define CHECK_THROWS_MESSAGE DOCTEST_CHECK_THROWS_MESSAGE
-#define CHECK_THROWS_AS_MESSAGE DOCTEST_CHECK_THROWS_AS_MESSAGE
-#define CHECK_THROWS_WITH_MESSAGE DOCTEST_CHECK_THROWS_WITH_MESSAGE
-#define CHECK_NOTHROW_MESSAGE DOCTEST_CHECK_NOTHROW_MESSAGE
-#define REQUIRE_MESSAGE DOCTEST_REQUIRE_MESSAGE
-#define REQUIRE_FALSE_MESSAGE DOCTEST_REQUIRE_FALSE_MESSAGE
-#define REQUIRE_THROWS_MESSAGE DOCTEST_REQUIRE_THROWS_MESSAGE
-#define REQUIRE_THROWS_AS_MESSAGE DOCTEST_REQUIRE_THROWS_AS_MESSAGE
-#define REQUIRE_THROWS_WITH_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_MESSAGE
-#define REQUIRE_NOTHROW_MESSAGE DOCTEST_REQUIRE_NOTHROW_MESSAGE
-
-#define SCENARIO DOCTEST_SCENARIO
-#define SCENARIO_TEMPLATE DOCTEST_SCENARIO_TEMPLATE
-#define SCENARIO_TEMPLATE_DEFINE DOCTEST_SCENARIO_TEMPLATE_DEFINE
-#define GIVEN DOCTEST_GIVEN
-#define WHEN DOCTEST_WHEN
-#define AND_WHEN DOCTEST_AND_WHEN
-#define THEN DOCTEST_THEN
-#define AND_THEN DOCTEST_AND_THEN
-
-#define WARN_EQ DOCTEST_WARN_EQ
-#define CHECK_EQ DOCTEST_CHECK_EQ
-#define REQUIRE_EQ DOCTEST_REQUIRE_EQ
-#define WARN_NE DOCTEST_WARN_NE
-#define CHECK_NE DOCTEST_CHECK_NE
-#define REQUIRE_NE DOCTEST_REQUIRE_NE
-#define WARN_GT DOCTEST_WARN_GT
-#define CHECK_GT DOCTEST_CHECK_GT
-#define REQUIRE_GT DOCTEST_REQUIRE_GT
-#define WARN_LT DOCTEST_WARN_LT
-#define CHECK_LT DOCTEST_CHECK_LT
-#define REQUIRE_LT DOCTEST_REQUIRE_LT
-#define WARN_GE DOCTEST_WARN_GE
-#define CHECK_GE DOCTEST_CHECK_GE
-#define REQUIRE_GE DOCTEST_REQUIRE_GE
-#define WARN_LE DOCTEST_WARN_LE
-#define CHECK_LE DOCTEST_CHECK_LE
-#define REQUIRE_LE DOCTEST_REQUIRE_LE
-#define WARN_UNARY DOCTEST_WARN_UNARY
-#define CHECK_UNARY DOCTEST_CHECK_UNARY
-#define REQUIRE_UNARY DOCTEST_REQUIRE_UNARY
-#define WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE
-#define CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE
-#define REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
-
-// KEPT FOR BACKWARDS COMPATIBILITY
-#define FAST_WARN_EQ DOCTEST_FAST_WARN_EQ
-#define FAST_CHECK_EQ DOCTEST_FAST_CHECK_EQ
-#define FAST_REQUIRE_EQ DOCTEST_FAST_REQUIRE_EQ
-#define FAST_WARN_NE DOCTEST_FAST_WARN_NE
-#define FAST_CHECK_NE DOCTEST_FAST_CHECK_NE
-#define FAST_REQUIRE_NE DOCTEST_FAST_REQUIRE_NE
-#define FAST_WARN_GT DOCTEST_FAST_WARN_GT
-#define FAST_CHECK_GT DOCTEST_FAST_CHECK_GT
-#define FAST_REQUIRE_GT DOCTEST_FAST_REQUIRE_GT
-#define FAST_WARN_LT DOCTEST_FAST_WARN_LT
-#define FAST_CHECK_LT DOCTEST_FAST_CHECK_LT
-#define FAST_REQUIRE_LT DOCTEST_FAST_REQUIRE_LT
-#define FAST_WARN_GE DOCTEST_FAST_WARN_GE
-#define FAST_CHECK_GE DOCTEST_FAST_CHECK_GE
-#define FAST_REQUIRE_GE DOCTEST_FAST_REQUIRE_GE
-#define FAST_WARN_LE DOCTEST_FAST_WARN_LE
-#define FAST_CHECK_LE DOCTEST_FAST_CHECK_LE
-#define FAST_REQUIRE_LE DOCTEST_FAST_REQUIRE_LE
-#define FAST_WARN_UNARY DOCTEST_FAST_WARN_UNARY
-#define FAST_CHECK_UNARY DOCTEST_FAST_CHECK_UNARY
-#define FAST_REQUIRE_UNARY DOCTEST_FAST_REQUIRE_UNARY
-#define FAST_WARN_UNARY_FALSE DOCTEST_FAST_WARN_UNARY_FALSE
-#define FAST_CHECK_UNARY_FALSE DOCTEST_FAST_CHECK_UNARY_FALSE
-#define FAST_REQUIRE_UNARY_FALSE DOCTEST_FAST_REQUIRE_UNARY_FALSE
-
-#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
-
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-// this is here to clear the 'current test suite' for the current translation unit - at the top
-DOCTEST_TEST_SUITE_END();
-
-// add stringification for primitive/fundamental types
-namespace doctest { namespace detail {
-    DOCTEST_TYPE_TO_STRING_IMPL(bool)
-    DOCTEST_TYPE_TO_STRING_IMPL(float)
-    DOCTEST_TYPE_TO_STRING_IMPL(double)
-    DOCTEST_TYPE_TO_STRING_IMPL(long double)
-    DOCTEST_TYPE_TO_STRING_IMPL(char)
-    DOCTEST_TYPE_TO_STRING_IMPL(signed char)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned char)
-    DOCTEST_TYPE_TO_STRING_IMPL(wchar_t)
-    DOCTEST_TYPE_TO_STRING_IMPL(short int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned short int)
-    DOCTEST_TYPE_TO_STRING_IMPL(int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned int)
-    DOCTEST_TYPE_TO_STRING_IMPL(long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(long long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long long int)
-}} // namespace doctest::detail
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_LIBRARY_INCLUDED
-
-#ifndef DOCTEST_SINGLE_HEADER
-#define DOCTEST_SINGLE_HEADER
-#endif // DOCTEST_SINGLE_HEADER
-
-#if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)
-#ifndef DOCTEST_LIBRARY_IMPLEMENTATION
-#define DOCTEST_LIBRARY_IMPLEMENTATION
-
-#ifndef DOCTEST_SINGLE_HEADER
-#include "doctest_fwd.h"
-#endif // DOCTEST_SINGLE_HEADER
-
-DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
-
-DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
-DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Winline")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
-
-DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
-DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data
-DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
-DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
-DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
-DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled
-DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified
-DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal
-DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch
-DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding in structs
-DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
-DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C
-DOCTEST_MSVC_SUPPRESS_WARNING(5045) // Spectre mitigation stuff
-DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)
-// static analysis
-DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
-DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
-DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
-DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtor...
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
-
-// required includes - will go only in one translation unit!
-#include <ctime>
-#include <cmath>
-#include <climits>
-// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/onqtam/doctest/pull/37
-#ifdef __BORLANDC__
-#include <math.h>
-#endif // __BORLANDC__
-#include <new>
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <limits>
-#include <utility>
-#include <sstream>
-#include <iostream>
-#include <algorithm>
-#include <iomanip>
-#include <vector>
-#include <atomic>
-#include <mutex>
-#include <set>
-#include <map>
-#include <exception>
-#include <stdexcept>
-#include <csignal>
-#include <cfloat>
-#include <cctype>
-#include <cstdint>
-
-#ifdef DOCTEST_PLATFORM_MAC
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/sysctl.h>
-#endif // DOCTEST_PLATFORM_MAC
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
-
-// counts the number of elements in a C array
-#define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
-
-#ifdef DOCTEST_CONFIG_DISABLE
-#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled
-#else // DOCTEST_CONFIG_DISABLE
-#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled
-#endif // DOCTEST_CONFIG_DISABLE
-
-#ifndef DOCTEST_CONFIG_OPTIONS_PREFIX
-#define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-"
-#endif
-
-#ifndef DOCTEST_THREAD_LOCAL
-#define DOCTEST_THREAD_LOCAL thread_local
-#endif
-
-#ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-#define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX
-#else
-#define DOCTEST_OPTIONS_PREFIX_DISPLAY ""
-#endif
-
-namespace doctest {
-
-bool is_running_in_test = false;
-
-namespace {
-    using namespace detail;
-    // case insensitive strcmp
-    int stricmp(const char* a, const char* b) {
-        for(;; a++, b++) {
-            const int d = tolower(*a) - tolower(*b);
-            if(d != 0 || !*a)
-                return d;
-        }
-    }
-
-    template <typename T>
-    String fpToString(T value, int precision) {
-        std::ostringstream oss;
-        oss << std::setprecision(precision) << std::fixed << value;
-        std::string d = oss.str();
-        size_t      i = d.find_last_not_of('0');
-        if(i != std::string::npos && i != d.size() - 1) {
-            if(d[i] == '.')
-                i++;
-            d = d.substr(0, i + 1);
-        }
-        return d.c_str();
-    }
-
-    struct Endianness
-    {
-        enum Arch
-        {
-            Big,
-            Little
-        };
-
-        static Arch which() {
-            union _
-            {
-                int  asInt;
-                char asChar[sizeof(int)];
-            } u;
-
-            u.asInt = 1;                                            // NOLINT
-            return (u.asChar[sizeof(int) - 1] == 1) ? Big : Little; // NOLINT
-        }
-    };
-} // namespace
-
-namespace detail {
-    void my_memcpy(void* dest, const void* src, unsigned num) { memcpy(dest, src, num); }
-
-    String rawMemoryToString(const void* object, unsigned size) {
-        // Reverse order for little endian architectures
-        int i = 0, end = static_cast<int>(size), inc = 1;
-        if(Endianness::which() == Endianness::Little) {
-            i   = end - 1;
-            end = inc = -1;
-        }
-
-        unsigned const char* bytes = static_cast<unsigned const char*>(object);
-        std::ostringstream   oss;
-        oss << "0x" << std::setfill('0') << std::hex;
-        for(; i != end; i += inc)
-            oss << std::setw(2) << static_cast<unsigned>(bytes[i]);
-        return oss.str().c_str();
-    }
-
-    DOCTEST_THREAD_LOCAL std::ostringstream g_oss;
-
-    std::ostream* getTlsOss() {
-        g_oss.clear(); // there shouldn't be anything worth clearing in the flags
-        g_oss.str(""); // the slow way of resetting a string stream
-        //g_oss.seekp(0); // optimal reset - as seen here: https://stackoverflow.com/a/624291/3162383
-        return &g_oss;
-    }
-
-    String getTlsOssResult() {
-        //g_oss << std::ends; // needed - as shown here: https://stackoverflow.com/a/624291/3162383
-        return g_oss.str().c_str();
-    }
-
-#ifndef DOCTEST_CONFIG_DISABLE
-    // this holds both parameters from the command line and runtime data for tests
-    struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats
-    {
-        std::atomic<int> numAssertsForCurrentTestCase_atomic;
-        std::atomic<int> numAssertsFailedForCurrentTestCase_atomic;
-
-        std::vector<std::vector<String> > filters = decltype(filters)(9); // 9 different filters
-
-        std::vector<IReporter*> reporters_currently_used;
-
-        const TestCase* currentTest = nullptr;
-
-        assert_handler ah = nullptr;
-
-        std::vector<String> stringifiedContexts; // logging from INFO() due to an exception
-
-        // stuff for subcases
-        std::set<SubcaseSignature> subcasesPassed;
-        std::set<int>              subcasesEnteredLevels;
-        int                        subcasesCurrentLevel;
-
-        void resetRunData() {
-            numTestCases                = 0;
-            numTestCasesPassingFilters  = 0;
-            numTestSuitesPassingFilters = 0;
-            numTestCasesFailed          = 0;
-            numAsserts                  = 0;
-            numAssertsFailed            = 0;
-        }
-    };
-
-    ContextState*             g_cs = nullptr;
-    DOCTEST_THREAD_LOCAL bool g_no_colors; // used to avoid locks for the debug output
-
-#endif // DOCTEST_CONFIG_DISABLE
-} // namespace detail
-
-void String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }
-void String::setLast(unsigned in) { buf[last] = char(in); }
-
-void String::copy(const String& other) {
-    if(other.isOnStack()) {
-        memcpy(buf, other.buf, len);
-    } else {
-        setOnHeap();
-        data.size     = other.data.size;
-        data.capacity = data.size + 1;
-        data.ptr      = new char[data.capacity];
-        memcpy(data.ptr, other.data.ptr, data.size + 1);
-    }
-}
-
-String::String() {
-    buf[0] = '\0';
-    setLast();
-}
-
-String::~String() {
-    if(!isOnStack())
-        delete[] data.ptr;
-}
-
-String::String(const char* in)
-        : String(in, strlen(in)) {}
-
-String::String(const char* in, unsigned in_size) {
-    if(in_size <= last) {
-        memcpy(buf, in, in_size + 1);
-        setLast(last - in_size);
-    } else {
-        setOnHeap();
-        data.size     = in_size;
-        data.capacity = data.size + 1;
-        data.ptr      = new char[data.capacity];
-        memcpy(data.ptr, in, in_size + 1);
-    }
-}
-
-String::String(const String& other) { copy(other); }
-
-String& String::operator=(const String& other) {
-    if(this != &other) {
-        if(!isOnStack())
-            delete[] data.ptr;
-
-        copy(other);
-    }
-
-    return *this;
-}
-
-String& String::operator+=(const String& other) {
-    const unsigned my_old_size = size();
-    const unsigned other_size  = other.size();
-    const unsigned total_size  = my_old_size + other_size;
-    if(isOnStack()) {
-        if(total_size < len) {
-            // append to the current stack space
-            memcpy(buf + my_old_size, other.c_str(), other_size + 1);
-            setLast(last - total_size);
-        } else {
-            // alloc new chunk
-            char* temp = new char[total_size + 1];
-            // copy current data to new location before writing in the union
-            memcpy(temp, buf, my_old_size); // skip the +1 ('\0') for speed
-            // update data in union
-            setOnHeap();
-            data.size     = total_size;
-            data.capacity = data.size + 1;
-            data.ptr      = temp;
-            // transfer the rest of the data
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        }
-    } else {
-        if(data.capacity > total_size) {
-            // append to the current heap block
-            data.size = total_size;
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        } else {
-            // resize
-            data.capacity *= 2;
-            if(data.capacity <= total_size)
-                data.capacity = total_size + 1;
-            // alloc new chunk
-            char* temp = new char[data.capacity];
-            // copy current data to new location before releasing it
-            memcpy(temp, data.ptr, my_old_size); // skip the +1 ('\0') for speed
-            // release old chunk
-            delete[] data.ptr;
-            // update the rest of the union members
-            data.size = total_size;
-            data.ptr  = temp;
-            // transfer the rest of the data
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        }
-    }
-
-    return *this;
-}
-
-String String::operator+(const String& other) const { return String(*this) += other; }
-
-String::String(String&& other) {
-    memcpy(buf, other.buf, len);
-    other.buf[0] = '\0';
-    other.setLast();
-}
-
-String& String::operator=(String&& other) {
-    if(this != &other) {
-        if(!isOnStack())
-            delete[] data.ptr;
-        memcpy(buf, other.buf, len);
-        other.buf[0] = '\0';
-        other.setLast();
-    }
-    return *this;
-}
-
-char String::operator[](unsigned i) const {
-    return const_cast<String*>(this)->operator[](i); // NOLINT
-}
-
-char& String::operator[](unsigned i) {
-    if(isOnStack())
-        return reinterpret_cast<char*>(buf)[i];
-    return data.ptr[i];
-}
-
-DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmaybe-uninitialized")
-unsigned String::size() const {
-    if(isOnStack())
-        return last - (unsigned(buf[last]) & 31); // using "last" would work only if "len" is 32
-    return data.size;
-}
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-unsigned String::capacity() const {
-    if(isOnStack())
-        return len;
-    return data.capacity;
-}
-
-int String::compare(const char* other, bool no_case) const {
-    if(no_case)
-        return stricmp(c_str(), other);
-    return std::strcmp(c_str(), other);
-}
-
-int String::compare(const String& other, bool no_case) const {
-    return compare(other.c_str(), no_case);
-}
-
-// clang-format off
-bool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; }
-bool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; }
-bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }
-bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }
-bool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; }
-bool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; }
-// clang-format on
-
-std::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); }
-
-namespace {
-    void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;)
-} // namespace
-
-namespace Color {
-    std::ostream& operator<<(std::ostream& s, Color::Enum code) {
-        color_to_stream(s, code);
-        return s;
-    }
-} // namespace Color
-
-// clang-format off
-const char* assertString(assertType::Enum at) {
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4062) // enum 'x' in switch of enum 'y' is not handled
-    switch(at) {  //!OCLINT missing default in switch statements
-        case assertType::DT_WARN                    : return "WARN";
-        case assertType::DT_CHECK                   : return "CHECK";
-        case assertType::DT_REQUIRE                 : return "REQUIRE";
-
-        case assertType::DT_WARN_FALSE              : return "WARN_FALSE";
-        case assertType::DT_CHECK_FALSE             : return "CHECK_FALSE";
-        case assertType::DT_REQUIRE_FALSE           : return "REQUIRE_FALSE";
-
-        case assertType::DT_WARN_THROWS             : return "WARN_THROWS";
-        case assertType::DT_CHECK_THROWS            : return "CHECK_THROWS";
-        case assertType::DT_REQUIRE_THROWS          : return "REQUIRE_THROWS";
-
-        case assertType::DT_WARN_THROWS_AS          : return "WARN_THROWS_AS";
-        case assertType::DT_CHECK_THROWS_AS         : return "CHECK_THROWS_AS";
-        case assertType::DT_REQUIRE_THROWS_AS       : return "REQUIRE_THROWS_AS";
-
-        case assertType::DT_WARN_THROWS_WITH        : return "WARN_THROWS_WITH";
-        case assertType::DT_CHECK_THROWS_WITH       : return "CHECK_THROWS_WITH";
-        case assertType::DT_REQUIRE_THROWS_WITH     : return "REQUIRE_THROWS_WITH";
-
-        case assertType::DT_WARN_NOTHROW            : return "WARN_NOTHROW";
-        case assertType::DT_CHECK_NOTHROW           : return "CHECK_NOTHROW";
-        case assertType::DT_REQUIRE_NOTHROW         : return "REQUIRE_NOTHROW";
-
-        case assertType::DT_WARN_EQ                 : return "WARN_EQ";
-        case assertType::DT_CHECK_EQ                : return "CHECK_EQ";
-        case assertType::DT_REQUIRE_EQ              : return "REQUIRE_EQ";
-        case assertType::DT_WARN_NE                 : return "WARN_NE";
-        case assertType::DT_CHECK_NE                : return "CHECK_NE";
-        case assertType::DT_REQUIRE_NE              : return "REQUIRE_NE";
-        case assertType::DT_WARN_GT                 : return "WARN_GT";
-        case assertType::DT_CHECK_GT                : return "CHECK_GT";
-        case assertType::DT_REQUIRE_GT              : return "REQUIRE_GT";
-        case assertType::DT_WARN_LT                 : return "WARN_LT";
-        case assertType::DT_CHECK_LT                : return "CHECK_LT";
-        case assertType::DT_REQUIRE_LT              : return "REQUIRE_LT";
-        case assertType::DT_WARN_GE                 : return "WARN_GE";
-        case assertType::DT_CHECK_GE                : return "CHECK_GE";
-        case assertType::DT_REQUIRE_GE              : return "REQUIRE_GE";
-        case assertType::DT_WARN_LE                 : return "WARN_LE";
-        case assertType::DT_CHECK_LE                : return "CHECK_LE";
-        case assertType::DT_REQUIRE_LE              : return "REQUIRE_LE";
-
-        case assertType::DT_WARN_UNARY              : return "WARN_UNARY";
-        case assertType::DT_CHECK_UNARY             : return "CHECK_UNARY";
-        case assertType::DT_REQUIRE_UNARY           : return "REQUIRE_UNARY";
-        case assertType::DT_WARN_UNARY_FALSE        : return "WARN_UNARY_FALSE";
-        case assertType::DT_CHECK_UNARY_FALSE       : return "CHECK_UNARY_FALSE";
-        case assertType::DT_REQUIRE_UNARY_FALSE     : return "REQUIRE_UNARY_FALSE";
-    }
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-    return "";
-}
-// clang-format on
-
-const char* failureString(assertType::Enum at) {
-    if(at & assertType::is_warn) //!OCLINT bitwise operator in conditional
-        return "WARNING: ";
-    if(at & assertType::is_check) //!OCLINT bitwise operator in conditional
-        return "ERROR: ";
-    if(at & assertType::is_require) //!OCLINT bitwise operator in conditional
-        return "FATAL ERROR: ";
-    return "";
-}
-
-DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
-DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
-// depending on the current options this will remove the path of filenames
-const char* removePathFromFilename(const char* file) {
-    if(getContextOptions()->no_path_in_filenames) {
-        auto back    = std::strrchr(file, '\\');
-        auto forward = std::strrchr(file, '/');
-        if(back || forward) {
-            if(back > forward)
-                forward = back;
-            return forward + 1;
-        }
-    }
-    return file;
-}
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-DOCTEST_DEFINE_DEFAULTS(TestCaseData);
-DOCTEST_DEFINE_COPIES(TestCaseData);
-
-DOCTEST_DEFINE_DEFAULTS(AssertData);
-
-DOCTEST_DEFINE_DEFAULTS(MessageData);
-
-SubcaseSignature::SubcaseSignature(const char* name, const char* file, int line)
-        : m_name(name)
-        , m_file(file)
-        , m_line(line) {}
-
-DOCTEST_DEFINE_DEFAULTS(SubcaseSignature);
-DOCTEST_DEFINE_COPIES(SubcaseSignature);
-
-bool SubcaseSignature::operator<(const SubcaseSignature& other) const {
-    if(m_line != other.m_line)
-        return m_line < other.m_line;
-    if(std::strcmp(m_file, other.m_file) != 0)
-        return std::strcmp(m_file, other.m_file) < 0;
-    return std::strcmp(m_name, other.m_name) < 0;
-}
-
-IContextScope::IContextScope()  = default;
-IContextScope::~IContextScope() = default;
-
-DOCTEST_DEFINE_DEFAULTS(ContextOptions);
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-String toString(char* in) { return toString(static_cast<const char*>(in)); }
-String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-String toString(bool in) { return in ? "true" : "false"; }
-String toString(float in) { return fpToString(in, 5) + "f"; }
-String toString(double in) { return fpToString(in, 10); }
-String toString(double long in) { return fpToString(in, 15); }
-
-#define DOCTEST_TO_STRING_OVERLOAD(type, fmt)                                                      \
-    String toString(type in) {                                                                     \
-        char buf[64];                                                                              \
-        std::sprintf(buf, fmt, in);                                                                \
-        return buf;                                                                                \
-    }
-
-DOCTEST_TO_STRING_OVERLOAD(char, "%d")
-DOCTEST_TO_STRING_OVERLOAD(char signed, "%d")
-DOCTEST_TO_STRING_OVERLOAD(char unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int short, "%d")
-DOCTEST_TO_STRING_OVERLOAD(int short unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int, "%d")
-DOCTEST_TO_STRING_OVERLOAD(unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int long, "%ld")
-DOCTEST_TO_STRING_OVERLOAD(int long unsigned, "%lu")
-DOCTEST_TO_STRING_OVERLOAD(int long long, "%lld")
-DOCTEST_TO_STRING_OVERLOAD(int long long unsigned, "%llu")
-
-String toString(std::nullptr_t) { return "NULL"; }
-
-Approx::Approx(double value)
-        : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
-        , m_scale(1.0)
-        , m_value(value) {}
-
-DOCTEST_DEFINE_COPIES(Approx);
-
-Approx Approx::operator()(double value) const {
-    Approx approx(value);
-    approx.epsilon(m_epsilon);
-    approx.scale(m_scale);
-    return approx;
-}
-
-Approx& Approx::epsilon(double newEpsilon) {
-    m_epsilon = newEpsilon;
-    return *this;
-}
-Approx& Approx::scale(double newScale) {
-    m_scale = newScale;
-    return *this;
-}
-
-bool operator==(double lhs, const Approx& rhs) {
-    // Thanks to Richard Harris for his help refining this formula
-    return std::fabs(lhs - rhs.m_value) <
-           rhs.m_epsilon * (rhs.m_scale + std::max(std::fabs(lhs), std::fabs(rhs.m_value)));
-}
-bool operator==(const Approx& lhs, double rhs) { return operator==(rhs, lhs); }
-bool operator!=(double lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
-bool operator!=(const Approx& lhs, double rhs) { return !operator==(rhs, lhs); }
-bool operator<=(double lhs, const Approx& rhs) { return lhs < rhs.m_value || lhs == rhs; }
-bool operator<=(const Approx& lhs, double rhs) { return lhs.m_value < rhs || lhs == rhs; }
-bool operator>=(double lhs, const Approx& rhs) { return lhs > rhs.m_value || lhs == rhs; }
-bool operator>=(const Approx& lhs, double rhs) { return lhs.m_value > rhs || lhs == rhs; }
-bool operator<(double lhs, const Approx& rhs) { return lhs < rhs.m_value && lhs != rhs; }
-bool operator<(const Approx& lhs, double rhs) { return lhs.m_value < rhs && lhs != rhs; }
-bool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs != rhs; }
-bool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; }
-
-String toString(const Approx& in) {
-    return String("Approx( ") + doctest::toString(in.m_value) + " )";
-}
-const ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); }
-
-} // namespace doctest
-
-#ifdef DOCTEST_CONFIG_DISABLE
-namespace doctest {
-Context::Context(int, const char* const*) {}
-Context::~Context() = default;
-void Context::applyCommandLine(int, const char* const*) {}
-void Context::addFilter(const char*, const char*) {}
-void Context::clearFilters() {}
-void Context::setOption(const char*, int) {}
-void Context::setOption(const char*, const char*) {}
-bool Context::shouldExit() { return false; }
-void Context::setAsDefaultForAssertsOutOfTestCases() {}
-void Context::setAssertHandler(detail::assert_handler) {}
-int  Context::run() { return 0; }
-
-DOCTEST_DEFINE_DEFAULTS(CurrentTestCaseStats);
-
-DOCTEST_DEFINE_DEFAULTS(TestRunStats);
-
-IReporter::~IReporter() = default;
-
-int                         IReporter::get_num_active_contexts() { return 0; }
-const IContextScope* const* IReporter::get_active_contexts() { return nullptr; }
-int                         IReporter::get_num_stringified_contexts() { return 0; }
-const String*               IReporter::get_stringified_contexts() { return nullptr; }
-
-int registerReporter(const char*, int, IReporter*) { return 0; }
-
-} // namespace doctest
-#else // DOCTEST_CONFIG_DISABLE
-
-#if !defined(DOCTEST_CONFIG_COLORS_NONE)
-#if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)
-#ifdef DOCTEST_PLATFORM_WINDOWS
-#define DOCTEST_CONFIG_COLORS_WINDOWS
-#else // linux
-#define DOCTEST_CONFIG_COLORS_ANSI
-#endif // platform
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI
-#endif // DOCTEST_CONFIG_COLORS_NONE
-
-#if DOCTEST_MSVC || defined(__MINGW32__)
-#if DOCTEST_MSVC
-#define DOCTEST_WINDOWS_SAL_IN_OPT _In_opt_
-#else // MSVC
-#define DOCTEST_WINDOWS_SAL_IN_OPT
-#endif // MSVC
-extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(
-        DOCTEST_WINDOWS_SAL_IN_OPT const char*);
-extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
-#endif // MSVC || __MINGW32__
-
-#ifdef DOCTEST_CONFIG_COLORS_ANSI
-#include <unistd.h>
-#endif // DOCTEST_CONFIG_COLORS_ANSI
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-// defines for a leaner windows.h
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#ifndef VC_EXTRA_LEAN
-#define VC_EXTRA_LEAN
-#endif // VC_EXTRA_LEAN
-#ifndef NOMINMAX
-#define NOMINMAX
-#endif // NOMINMAX
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
-
-// not sure what AfxWin.h is for - here I do what Catch does
-#ifdef __AFXDLL
-#include <AfxWin.h>
-#else
-#include <Windows.h>
-#endif
-#include <io.h>
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
-
-#else // DOCTEST_PLATFORM_WINDOWS
-
-#include <sys/time.h>
-
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-namespace doctest_detail_test_suite_ns {
-// holds the current test suite
-doctest::detail::TestSuite& getCurrentTestSuite() {
-    static doctest::detail::TestSuite data;
-    return data;
-}
-} // namespace doctest_detail_test_suite_ns
-
-namespace doctest {
-namespace {
-    using namespace detail;
-    typedef std::map<std::pair<int, String>, IReporter*> reporterMap;
-    reporterMap&                                         getReporters() {
-        static reporterMap data;
-        return data;
-    }
-} // namespace
-namespace detail {
-#define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...)                                           \
-    for(auto& curr_rep : g_cs->reporters_currently_used)                                           \
-    curr_rep->function(__VA_ARGS__)
-
-    DOCTEST_DEFINE_DEFAULTS(TestFailureException);
-    DOCTEST_DEFINE_COPIES(TestFailureException);
-    bool checkIfShouldThrow(assertType::Enum at) {
-        if(at & assertType::is_require) //!OCLINT bitwise operator in conditional
-            return true;
-
-        if((at & assertType::is_check) //!OCLINT bitwise operator in conditional
-           && getContextOptions()->abort_after > 0 &&
-           (g_cs->numAssertsFailed + g_cs->numAssertsFailedForCurrentTestCase_atomic) >=
-                   getContextOptions()->abort_after)
-            return true;
-
-        return false;
-    }
-
-    void throwException() {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-        throw TestFailureException();
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-    }
-} // namespace detail
-
-namespace {
-    using namespace detail;
-    // matching of a string against a wildcard mask (case sensitivity configurable) taken from
-    // https://www.codeproject.com/Articles/1088/Wildcard-string-compare-globbing
-    int wildcmp(const char* str, const char* wild, bool caseSensitive) {
-        const char* cp = nullptr;
-        const char* mp = nullptr;
-
-        while((*str) && (*wild != '*')) {
-            if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
-               (*wild != '?')) {
-                return 0;
-            }
-            wild++;
-            str++;
-        }
-
-        while(*str) {
-            if(*wild == '*') {
-                if(!*++wild) {
-                    return 1;
-                }
-                mp = wild;
-                cp = str + 1;
-            } else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
-                      (*wild == '?')) {
-                wild++;
-                str++;
-            } else {
-                wild = mp;   //!OCLINT parameter reassignment
-                str  = cp++; //!OCLINT parameter reassignment
-            }
-        }
-
-        while(*wild == '*') {
-            wild++;
-        }
-        return !*wild;
-    }
-
-    //// C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html
-    //unsigned hashStr(unsigned const char* str) {
-    //    unsigned long hash = 5381;
-    //    char          c;
-    //    while((c = *str++))
-    //        hash = ((hash << 5) + hash) + c; // hash * 33 + c
-    //    return hash;
-    //}
-
-    // checks if the name matches any of the filters (and can be configured what to do when empty)
-    bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty,
-                    bool caseSensitive) {
-        if(filters.empty() && matchEmpty)
-            return true;
-        for(auto& curr : filters)
-            if(wildcmp(name, curr.c_str(), caseSensitive))
-                return true;
-        return false;
-    }
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-    typedef unsigned long long UInt64;
-
-    UInt64 getCurrentTicks() {
-        static UInt64 hz = 0, hzo = 0;
-        if(!hz) {
-            QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&hz));
-            QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&hzo));
-        }
-        UInt64 t;
-        QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&t));
-        return ((t - hzo) * 1000000) / hz;
-    }
-#else  // DOCTEST_PLATFORM_WINDOWS
-
-    typedef uint64_t UInt64;
-
-    UInt64 getCurrentTicks() {
-        timeval t;
-        gettimeofday(&t, nullptr);
-        return static_cast<UInt64>(t.tv_sec) * 1000000 + static_cast<UInt64>(t.tv_usec);
-    }
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    struct Timer
-    {
-        void         start() { m_ticks = getCurrentTicks(); }
-        unsigned int getElapsedMicroseconds() const {
-            return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
-        }
-        //unsigned int getElapsedMilliseconds() const {
-        //    return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
-        //}
-        double getElapsedSeconds() const { return getElapsedMicroseconds() / 1000000.0; }
-
-    private:
-        UInt64 m_ticks = 0;
-    };
-
-    Timer g_timer;
-} // namespace
-namespace detail {
-
-    Subcase::Subcase(const char* name, const char* file, int line)
-            : m_signature(name, file, line) {
-        ContextState* s = g_cs;
-
-        // if we have already completed it
-        if(s->subcasesPassed.count(m_signature) != 0)
-            return;
-
-        // check subcase filters
-        if(s->subcasesCurrentLevel < s->subcase_filter_levels) {
-            if(!matchesAny(m_signature.m_name, s->filters[6], true, s->case_sensitive))
-                return;
-            if(matchesAny(m_signature.m_name, s->filters[7], false, s->case_sensitive))
-                return;
-        }
-
-        // if a Subcase on the same level has already been entered
-        if(s->subcasesEnteredLevels.count(s->subcasesCurrentLevel) != 0) {
-            s->should_reenter = true;
-            return;
-        }
-
-        s->subcasesEnteredLevels.insert(s->subcasesCurrentLevel++);
-        m_entered = true;
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
-    }
-
-    Subcase::~Subcase() {
-        if(m_entered) {
-            ContextState* s = g_cs;
-
-            s->subcasesCurrentLevel--;
-            // only mark the subcase as passed if no subcases have been skipped
-            if(s->should_reenter == false)
-                s->subcasesPassed.insert(m_signature);
-
-            DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, m_signature);
-        }
-    }
-
-    Subcase::operator bool() const { return m_entered; }
-
-    Result::Result(bool passed, const String& decomposition)
-            : m_passed(passed)
-            , m_decomp(decomposition) {}
-
-    DOCTEST_DEFINE_DEFAULTS(Result);
-    DOCTEST_DEFINE_COPIES(Result);
-
-    ExpressionDecomposer::ExpressionDecomposer(assertType::Enum at)
-            : m_at(at) {}
-
-    DOCTEST_DEFINE_DEFAULTS(ExpressionDecomposer);
-
-    DOCTEST_DEFINE_DEFAULTS(TestSuite);
-    DOCTEST_DEFINE_COPIES(TestSuite);
-
-    TestSuite& TestSuite::operator*(const char* in) {
-        m_test_suite = in;
-        // clear state
-        m_description       = nullptr;
-        m_skip              = false;
-        m_may_fail          = false;
-        m_should_fail       = false;
-        m_expected_failures = 0;
-        m_timeout           = 0;
-        return *this;
-    }
-
-    TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
-                       const char* type, int template_id) {
-        m_file              = file;
-        m_line              = line;
-        m_name              = nullptr;
-        m_test_suite        = test_suite.m_test_suite;
-        m_description       = test_suite.m_description;
-        m_skip              = test_suite.m_skip;
-        m_may_fail          = test_suite.m_may_fail;
-        m_should_fail       = test_suite.m_should_fail;
-        m_expected_failures = test_suite.m_expected_failures;
-        m_timeout           = test_suite.m_timeout;
-
-        m_test        = test;
-        m_type        = type;
-        m_template_id = template_id;
-    }
-
-    DOCTEST_DEFINE_DEFAULTS(TestCase);
-
-    TestCase::TestCase(const TestCase& other)
-            : TestCaseData() {
-        *this = other;
-    }
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
-    DOCTEST_MSVC_SUPPRESS_WARNING(26437)           // Do not slice
-    TestCase& TestCase::operator=(const TestCase& other) {
-        static_cast<TestCaseData&>(*this) = static_cast<const TestCaseData&>(other);
-
-        m_test        = other.m_test;
-        m_type        = other.m_type;
-        m_template_id = other.m_template_id;
-        m_full_name   = other.m_full_name;
-
-        if(m_template_id != -1)
-            m_name = m_full_name.c_str();
-        return *this;
-    }
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-    TestCase& TestCase::operator*(const char* in) {
-        m_name = in;
-        // make a new name with an appended type for templated test case
-        if(m_template_id != -1) {
-            m_full_name = String(m_name) + m_type;
-            // redirect the name to point to the newly constructed full name
-            m_name = m_full_name.c_str();
-        }
-        return *this;
-    }
-
-    bool TestCase::operator<(const TestCase& other) const {
-        if(m_line != other.m_line)
-            return m_line < other.m_line;
-        const int file_cmp = std::strcmp(m_file, other.m_file);
-        if(file_cmp != 0)
-            return file_cmp < 0;
-        return m_template_id < other.m_template_id;
-    }
-} // namespace detail
-namespace {
-    using namespace detail;
-    // for sorting tests by file/line
-    int fileOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-#if DOCTEST_MSVC
-        // this is needed because MSVC gives different case for drive letters
-        // for __FILE__ when evaluated in a header and a source file
-        const int res = stricmp(lhs->m_file, rhs->m_file);
-#else  // MSVC
-        const int res = std::strcmp(lhs->m_file, rhs->m_file);
-#endif // MSVC
-        if(res != 0)
-            return res;
-        return static_cast<int>(lhs->m_line) - static_cast<int>(rhs->m_line);
-    }
-
-    // for sorting tests by suite/file/line
-    int suiteOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-
-        const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
-        if(res != 0)
-            return res;
-        return fileOrderComparator(a, b);
-    }
-
-    // for sorting tests by name/suite/file/line
-    int nameOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-
-        const int res_name = std::strcmp(lhs->m_name, rhs->m_name);
-        if(res_name != 0)
-            return res_name;
-        return suiteOrderComparator(a, b);
-    }
-
-    // all the registered tests
-    std::set<TestCase>& getRegisteredTests() {
-        static std::set<TestCase> data;
-        return data;
-    }
-
-#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
-    HANDLE g_stdoutHandle;
-    WORD   g_origFgAttrs;
-    WORD   g_origBgAttrs;
-    bool   g_attrsInitted = false;
-
-    int colors_init() {
-        if(!g_attrsInitted) {
-            g_stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
-            g_attrsInitted = true;
-            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
-            GetConsoleScreenBufferInfo(g_stdoutHandle, &csbiInfo);
-            g_origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
-                                                     BACKGROUND_BLUE | BACKGROUND_INTENSITY);
-            g_origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
-                                                     FOREGROUND_BLUE | FOREGROUND_INTENSITY);
-        }
-        return 0;
-    }
-
-    int dumy_init_console_colors = colors_init();
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    void color_to_stream(std::ostream& s, Color::Enum code) {
-        ((void)s);    // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS
-        ((void)code); // for DOCTEST_CONFIG_COLORS_NONE
-#ifdef DOCTEST_CONFIG_COLORS_ANSI
-        if(g_no_colors ||
-           (isatty(STDOUT_FILENO) == false && getContextOptions()->force_colors == false))
-            return;
-
-        auto col = "";
-        // clang-format off
-            switch(code) { //!OCLINT missing break in switch statement / unnecessary default statement in covered switch statement
-                case Color::Red:         col = "[0;31m"; break;
-                case Color::Green:       col = "[0;32m"; break;
-                case Color::Blue:        col = "[0;34m"; break;
-                case Color::Cyan:        col = "[0;36m"; break;
-                case Color::Yellow:      col = "[0;33m"; break;
-                case Color::Grey:        col = "[1;30m"; break;
-                case Color::LightGrey:   col = "[0;37m"; break;
-                case Color::BrightRed:   col = "[1;31m"; break;
-                case Color::BrightGreen: col = "[1;32m"; break;
-                case Color::BrightWhite: col = "[1;37m"; break;
-                case Color::Bright: // invalid
-                case Color::None:
-                case Color::White:
-                default:                 col = "[0m";
-            }
-        // clang-format on
-        s << "\033" << col;
-#endif // DOCTEST_CONFIG_COLORS_ANSI
-
-#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
-        if(g_no_colors ||
-           (isatty(fileno(stdout)) == false && getContextOptions()->force_colors == false))
-            return;
-
-#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(g_stdoutHandle, x | g_origBgAttrs)
-
-        // clang-format off
-        switch (code) {
-            case Color::White:       DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
-            case Color::Red:         DOCTEST_SET_ATTR(FOREGROUND_RED);                                      break;
-            case Color::Green:       DOCTEST_SET_ATTR(FOREGROUND_GREEN);                                    break;
-            case Color::Blue:        DOCTEST_SET_ATTR(FOREGROUND_BLUE);                                     break;
-            case Color::Cyan:        DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN);                  break;
-            case Color::Yellow:      DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN);                   break;
-            case Color::Grey:        DOCTEST_SET_ATTR(0);                                                   break;
-            case Color::LightGrey:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY);                                break;
-            case Color::BrightRed:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED);               break;
-            case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN);             break;
-            case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
-            case Color::None:
-            case Color::Bright: // invalid
-            default:                 DOCTEST_SET_ATTR(g_origFgAttrs);
-        }
-            // clang-format on
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS
-    }
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-    std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
-        static std::vector<const IExceptionTranslator*> data;
-        return data;
-    }
-
-    String translateActiveException() {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-        String res;
-        auto&  translators = getExceptionTranslators();
-        for(auto& curr : translators)
-            if(curr->translate(res))
-                return res;
-        // clang-format off
-        try {
-            throw;
-        } catch(std::exception& ex) {
-            return ex.what();
-        } catch(std::string& msg) {
-            return msg.c_str();
-        } catch(const char* msg) {
-            return msg;
-        } catch(...) {
-            return "unknown exception";
-        }
-// clang-format on
-#else  // DOCTEST_CONFIG_NO_EXCEPTIONS
-        return "";
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-    }
-} // namespace
-
-namespace detail {
-    // used by the macros for registering tests
-    int regTest(const TestCase& tc) {
-        getRegisteredTests().insert(tc);
-        return 0;
-    }
-
-    // sets the current test suite
-    int setTestSuite(const TestSuite& ts) {
-        doctest_detail_test_suite_ns::getCurrentTestSuite() = ts;
-        return 0;
-    }
-
-#ifdef DOCTEST_PLATFORM_MAC
-    // The following function is taken directly from the following technical note:
-    // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
-    // Returns true if the current process is being debugged (either
-    // running under the debugger or has a debugger attached post facto).
-    bool isDebuggerActive() {
-        int        mib[4];
-        kinfo_proc info;
-        size_t     size;
-        // Initialize the flags so that, if sysctl fails for some bizarre
-        // reason, we get a predictable result.
-        info.kp_proc.p_flag = 0;
-        // Initialize mib, which tells sysctl the info we want, in this case
-        // we're looking for information about a specific process ID.
-        mib[0] = CTL_KERN;
-        mib[1] = KERN_PROC;
-        mib[2] = KERN_PROC_PID;
-        mib[3] = getpid();
-        // Call sysctl.
-        size = sizeof(info);
-        if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {
-            fprintf(stderr, "\n** Call to sysctl failed - unable to determine if debugger is "
-                            "active **\n\n");
-            return false;
-        }
-        // We're being debugged if the P_TRACED flag is set.
-        return ((info.kp_proc.p_flag & P_TRACED) != 0);
-    }
-#elif DOCTEST_MSVC || defined(__MINGW32__)
-    bool isDebuggerActive() { return ::IsDebuggerPresent() != 0; }
-#else
-    bool isDebuggerActive() { return false; }
-#endif // Platform
-
-    void registerExceptionTranslatorImpl(const IExceptionTranslator* et) {
-        if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
-           getExceptionTranslators().end())
-            getExceptionTranslators().push_back(et);
-    }
-
-    void writeStringToStream(std::ostream* s, const String& str) { *s << str; }
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    void toStream(std::ostream* s, char* in) { *s << in; }
-    void toStream(std::ostream* s, const char* in) { *s << in; }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    void toStream(std::ostream* s, bool in) { *s << std::boolalpha << in << std::noboolalpha; }
-    void toStream(std::ostream* s, float in) { *s << in; }
-    void toStream(std::ostream* s, double in) { *s << in; }
-    void toStream(std::ostream* s, double long in) { *s << in; }
-
-    void toStream(std::ostream* s, char in) { *s << in; }
-    void toStream(std::ostream* s, char signed in) { *s << in; }
-    void toStream(std::ostream* s, char unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int short in) { *s << in; }
-    void toStream(std::ostream* s, int short unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int in) { *s << in; }
-    void toStream(std::ostream* s, int unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int long in) { *s << in; }
-    void toStream(std::ostream* s, int long unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int long long in) { *s << in; }
-    void toStream(std::ostream* s, int long long unsigned in) { *s << in; }
-
-    DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO()
-
-    ContextBuilder::ICapture::ICapture()  = default;
-    ContextBuilder::ICapture::~ICapture() = default;
-
-    ContextBuilder::Chunk::Chunk()  = default;
-    ContextBuilder::Chunk::~Chunk() = default;
-
-    ContextBuilder::Node::Node()  = default;
-    ContextBuilder::Node::~Node() = default;
-
-    // steal the contents of the other - acting as a move constructor...
-    ContextBuilder::ContextBuilder(ContextBuilder& other)
-            : numCaptures(other.numCaptures)
-            , head(other.head)
-            , tail(other.tail) {
-        other.numCaptures = 0;
-        other.head        = nullptr;
-        other.tail        = nullptr;
-        memcpy(stackChunks, other.stackChunks,
-               unsigned(int(sizeof(Chunk)) * DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK));
-    }
-
-    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wcast-align")
-    void ContextBuilder::stringify(std::ostream* s) const {
-        int curr = 0;
-        // iterate over small buffer
-        while(curr < numCaptures && curr < DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK)
-            reinterpret_cast<const ICapture*>(stackChunks[curr++].buf)->toStream(s);
-        // iterate over list
-        auto curr_elem = head;
-        while(curr < numCaptures) {
-            reinterpret_cast<const ICapture*>(curr_elem->chunk.buf)->toStream(s);
-            curr_elem = curr_elem->next;
-            ++curr;
-        }
-    }
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-    ContextBuilder::ContextBuilder() = default;
-
-    ContextBuilder::~ContextBuilder() {
-        // free the linked list - the ones on the stack are left as-is
-        // no destructors are called at all - there is no need
-        while(head) {
-            auto next = head->next;
-            delete head;
-            head = next;
-        }
-    }
-
-    ContextScope::ContextScope(ContextBuilder& temp)
-            : contextBuilder(temp) {
-        g_infoContexts.push_back(this);
-    }
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
-    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    ContextScope::~ContextScope() {
-        if(std::uncaught_exception()) {
-            std::ostringstream s;
-            this->stringify(&s);
-            g_cs->stringifiedContexts.push_back(s.str().c_str());
-        }
-        g_infoContexts.pop_back();
-    }
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-    void ContextScope::stringify(std::ostream* s) const { contextBuilder.stringify(s); }
-} // namespace detail
-namespace {
-    using namespace detail;
-#if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
-    struct FatalConditionHandler
-    {
-        void reset() {}
-    };
-#else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-
-    void reportFatal(const std::string&);
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-    struct SignalDefs
-    {
-        DWORD       id;
-        const char* name;
-    };
-    // There is no 1-1 mapping between signals and windows exceptions.
-    // Windows can easily distinguish between SO and SigSegV,
-    // but SigInt, SigTerm, etc are handled differently.
-    SignalDefs signalDefs[] = {
-            {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal"},
-            {EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow"},
-            {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal"},
-            {EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error"},
-    };
-
-    struct FatalConditionHandler
-    {
-        static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
-            for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
-                    reportFatal(signalDefs[i].name);
-                }
-            }
-            // If its not an exception we care about, pass it along.
-            // This stops us from eating debugger breaks etc.
-            return EXCEPTION_CONTINUE_SEARCH;
-        }
-
-        FatalConditionHandler() {
-            isSet = true;
-            // 32k seems enough for doctest to handle stack overflow,
-            // but the value was found experimentally, so there is no strong guarantee
-            guaranteeSize          = 32 * 1024;
-            exceptionHandlerHandle = nullptr;
-            // Register as first handler in current chain
-            exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
-            // Pass in guarantee size to be filled
-            SetThreadStackGuarantee(&guaranteeSize);
-        }
-
-        static void reset() {
-            if(isSet) {
-                // Unregister handler and restore the old guarantee
-                RemoveVectoredExceptionHandler(exceptionHandlerHandle);
-                SetThreadStackGuarantee(&guaranteeSize);
-                exceptionHandlerHandle = nullptr;
-                isSet                  = false;
-            }
-        }
-
-        ~FatalConditionHandler() { reset(); }
-
-    private:
-        static bool  isSet;
-        static ULONG guaranteeSize;
-        static PVOID exceptionHandlerHandle;
-    };
-
-    bool  FatalConditionHandler::isSet                  = false;
-    ULONG FatalConditionHandler::guaranteeSize          = 0;
-    PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr;
-
-#else // DOCTEST_PLATFORM_WINDOWS
-
-    struct SignalDefs
-    {
-        int         id;
-        const char* name;
-    };
-    SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
-                               {SIGILL, "SIGILL - Illegal instruction signal"},
-                               {SIGFPE, "SIGFPE - Floating point error signal"},
-                               {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
-                               {SIGTERM, "SIGTERM - Termination request signal"},
-                               {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};
-
-    struct FatalConditionHandler
-    {
-        static bool             isSet;
-        static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
-        static stack_t          oldSigStack;
-        static char             altStackMem[4 * SIGSTKSZ];
-
-        static void handleSignal(int sig) {
-            const char* name = "<unknown signal>";
-            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                SignalDefs& def = signalDefs[i];
-                if(sig == def.id) {
-                    name = def.name;
-                    break;
-                }
-            }
-            reset();
-            reportFatal(name);
-            raise(sig);
-        }
-
-        FatalConditionHandler() {
-            isSet = true;
-            stack_t sigStack;
-            sigStack.ss_sp    = altStackMem;
-            sigStack.ss_size  = sizeof(altStackMem);
-            sigStack.ss_flags = 0;
-            sigaltstack(&sigStack, &oldSigStack);
-            struct sigaction sa = {};
-            sa.sa_handler       = handleSignal; // NOLINT
-            sa.sa_flags         = SA_ONSTACK;
-            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
-            }
-        }
-
-        ~FatalConditionHandler() { reset(); }
-        static void reset() {
-            if(isSet) {
-                // Set signals back to previous values -- hopefully nobody overwrote them in the meantime
-                for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                    sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
-                }
-                // Return the old stack
-                sigaltstack(&oldSigStack, nullptr);
-                isSet = false;
-            }
-        }
-    };
-
-    bool             FatalConditionHandler::isSet                                      = false;
-    struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
-    stack_t          FatalConditionHandler::oldSigStack                                = {};
-    char             FatalConditionHandler::altStackMem[]                              = {};
-
-#endif // DOCTEST_PLATFORM_WINDOWS
-#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-
-} // namespace
-
-namespace {
-    using namespace detail;
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-#define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)
-#else
-    // TODO: integration with XCode and other IDEs
-#define DOCTEST_OUTPUT_DEBUG_STRING(text)
-#endif // Platform
-
-    void addAssert(assertType::Enum at) {
-        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional
-            g_cs->numAssertsForCurrentTestCase_atomic++;
-    }
-
-    void addFailedAssert(assertType::Enum at) {
-        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional
-            g_cs->numAssertsFailedForCurrentTestCase_atomic++;
-    }
-
-#if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)
-    void reportFatal(const std::string& message) {
-        g_cs->seconds_so_far += g_timer.getElapsedSeconds();
-        g_cs->failure_flags |= TestCaseFailureReason::Crash;
-        g_cs->error_string   = message.c_str();
-        g_cs->should_reenter = false;
-
-        // TODO: end all currently opened subcases...?
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-
-        g_cs->numTestCasesFailed++;
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
-    }
-#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-} // namespace
-namespace detail {
-
-    ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
-                                 const char* exception_type) {
-        m_test_case      = g_cs->currentTest;
-        m_at             = at;
-        m_file           = file;
-        m_line           = line;
-        m_expr           = expr;
-        m_failed         = true;
-        m_threw          = false;
-        m_threw_as       = false;
-        m_exception_type = exception_type;
-#if DOCTEST_MSVC
-        if(m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC
-            ++m_expr;
-#endif // MSVC
-    }
-
-    DOCTEST_DEFINE_DEFAULTS(ResultBuilder);
-
-    void ResultBuilder::setResult(const Result& res) {
-        m_decomp = res.m_decomp;
-        m_failed = !res.m_passed;
-    }
-
-    void ResultBuilder::translateException() {
-        m_threw     = true;
-        m_exception = translateActiveException();
-    }
-
-    bool ResultBuilder::log() {
-        if(m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional
-            m_failed = !m_threw;
-        } else if(m_at & assertType::is_throws_as) { //!OCLINT bitwise operator in conditional
-            m_failed = !m_threw_as;
-        } else if(m_at & assertType::is_throws_with) { //!OCLINT bitwise operator in conditional
-            m_failed = m_exception != m_exception_type;
-        } else if(m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional
-            m_failed = m_threw;
-        }
-
-        if(m_exception.size())
-            m_exception = String("\"") + m_exception + "\"";
-
-        if(is_running_in_test) {
-            addAssert(m_at);
-            DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *this);
-
-            if(m_failed)
-                addFailedAssert(m_at);
-        } else if(m_failed) {
-            failed_out_of_a_testing_context(*this);
-        }
-
-        return m_failed && isDebuggerActive() &&
-               !getContextOptions()->no_breaks; // break into debugger
-    }
-
-    void ResultBuilder::react() const {
-        if(m_failed && checkIfShouldThrow(m_at))
-            throwException();
-    }
-
-    void failed_out_of_a_testing_context(const AssertData& ad) {
-        if(g_cs->ah)
-            g_cs->ah(ad);
-        else
-            std::abort();
-    }
-
-    void decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,
-                       Result result) {
-        bool failed = !result.m_passed;
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);
-        DOCTEST_ASSERT_IN_TESTS(result.m_decomp);
-    }
-
-    MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {
-        m_stream   = getTlsOss();
-        m_file     = file;
-        m_line     = line;
-        m_severity = severity;
-    }
-
-    IExceptionTranslator::IExceptionTranslator()  = default;
-    IExceptionTranslator::~IExceptionTranslator() = default;
-
-    bool MessageBuilder::log() {
-        m_string = getTlsOssResult();
-        DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);
-
-        const bool isWarn = m_severity & assertType::is_warn;
-
-        // warn is just a message in this context so we dont treat it as an assert
-        if(!isWarn) {
-            addAssert(m_severity);
-            addFailedAssert(m_severity);
-        }
-
-        return isDebuggerActive() && !getContextOptions()->no_breaks && !isWarn; // break
-    }
-
-    void MessageBuilder::react() {
-        if(m_severity & assertType::is_require) //!OCLINT bitwise operator in conditional
-            throwException();
-    }
-
-    MessageBuilder::~MessageBuilder() = default;
-} // namespace detail
-namespace {
-    std::mutex g_mutex;
-
-    using namespace detail;
-    struct ConsoleReporter : public IReporter
-    {
-        std::ostream&                 s;
-        bool                          hasLoggedCurrentTestStart;
-        std::vector<SubcaseSignature> subcasesStack;
-
-        // caching pointers to objects of these types - safe to do
-        const ContextOptions* opt;
-        const TestCaseData*   tc;
-
-        ConsoleReporter(std::ostream& in)
-                : s(in) {}
-
-        // =========================================================================================
-        // WHAT FOLLOWS ARE HELPERS USED BY THE OVERRIDES OF THE VIRTUAL METHODS OF THE INTERFACE
-        // =========================================================================================
-
-        void separator_to_stream() {
-            s << Color::Yellow
-              << "============================================================================="
-                 "=="
-                 "\n";
-        }
-
-        void file_line_to_stream(const char* file, int line, const char* tail = "") {
-            s << Color::LightGrey << removePathFromFilename(file)
-              << (opt->gnu_file_line ? ":" : "(")
-              << (opt->no_line_numbers ? 0 : line) // 0 or the real num depending on the option
-              << (opt->gnu_file_line ? ":" : "):") << tail;
-        }
-
-        const char* getSuccessOrFailString(bool success, assertType::Enum at,
-                                           const char* success_str) {
-            if(success)
-                return success_str;
-            return failureString(at);
-        }
-
-        Color::Enum getSuccessOrFailColor(bool success, assertType::Enum at) {
-            return success ? Color::BrightGreen :
-                             (at & assertType::is_warn) ? Color::Yellow : Color::Red;
-        }
-
-        void successOrFailColoredStringToStream(bool success, assertType::Enum at,
-                                                const char* success_str = "SUCCESS: ") {
-            s << getSuccessOrFailColor(success, at)
-              << getSuccessOrFailString(success, at, success_str);
-        }
-
-        void log_contexts() {
-            int num_contexts = get_num_active_contexts();
-            if(num_contexts) {
-                auto contexts = get_active_contexts();
-
-                s << Color::None << "  logged: ";
-                for(int i = 0; i < num_contexts; ++i) {
-                    s << (i == 0 ? "" : "          ");
-                    contexts[i]->stringify(&s);
-                    s << "\n";
-                }
-            }
-
-            s << "\n";
-        }
-
-        void logTestStart() {
-            if(hasLoggedCurrentTestStart)
-                return;
-
-            separator_to_stream();
-            file_line_to_stream(tc->m_file, tc->m_line, "\n");
-            if(tc->m_description)
-                s << Color::Yellow << "DESCRIPTION: " << Color::None << tc->m_description << "\n";
-            if(tc->m_test_suite && tc->m_test_suite[0] != '\0')
-                s << Color::Yellow << "TEST SUITE: " << Color::None << tc->m_test_suite << "\n";
-            if(strncmp(tc->m_name, "  Scenario:", 11) != 0)
-                s << Color::None << "TEST CASE:  ";
-            s << Color::None << tc->m_name << "\n";
-
-            for(auto& curr : subcasesStack)
-                if(curr.m_name[0] != '\0')
-                    s << "  " << curr.m_name << "\n";
-
-            s << "\n";
-
-            hasLoggedCurrentTestStart = true;
-        }
-
-        // =========================================================================================
-        // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
-        // =========================================================================================
-
-        void test_run_start(const ContextOptions& o) override { opt = &o; }
-
-        void test_run_end(const TestRunStats& p) override {
-            separator_to_stream();
-
-            const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
-            s << Color::Cyan << "[doctest] " << Color::None << "test cases: " << std::setw(6)
-              << p.numTestCasesPassingFilters << " | "
-              << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ? Color::None :
-                                                                          Color::Green)
-              << std::setw(6) << p.numTestCasesPassingFilters - p.numTestCasesFailed << " passed"
-              << Color::None << " | " << (p.numTestCasesFailed > 0 ? Color::Red : Color::None)
-              << std::setw(6) << p.numTestCasesFailed << " failed" << Color::None << " | ";
-            if(opt->no_skipped_summary == false) {
-                const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
-                s << (numSkipped == 0 ? Color::None : Color::Yellow) << std::setw(6) << numSkipped
-                  << " skipped" << Color::None;
-            }
-            s << "\n";
-            s << Color::Cyan << "[doctest] " << Color::None << "assertions: " << std::setw(6)
-              << p.numAsserts << " | "
-              << ((p.numAsserts == 0 || anythingFailed) ? Color::None : Color::Green)
-              << std::setw(6) << (p.numAsserts - p.numAssertsFailed) << " passed" << Color::None
-              << " | " << (p.numAssertsFailed > 0 ? Color::Red : Color::None) << std::setw(6)
-              << p.numAssertsFailed << " failed" << Color::None << " |\n";
-            s << Color::Cyan << "[doctest] " << Color::None
-              << "Status: " << (p.numTestCasesFailed > 0 ? Color::Red : Color::Green)
-              << ((p.numTestCasesFailed > 0) ? "FAILURE!\n" : "SUCCESS!\n") << Color::None;
-        }
-
-        void test_case_start(const TestCaseData& in) override {
-            hasLoggedCurrentTestStart = false;
-            tc                        = &in;
-        }
-
-        void test_case_end(const CurrentTestCaseStats& st) override {
-            // log the preamble of the test case only if there is something
-            // else to print - something other than that an assert has failed
-            if(opt->duration ||
-               (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure))
-                logTestStart();
-
-            // report test case exceptions and crashes
-            bool crashed = st.failure_flags & TestCaseFailureReason::Crash;
-            if(crashed || (st.failure_flags & TestCaseFailureReason::Exception)) {
-                file_line_to_stream(tc->m_file, tc->m_line, " ");
-                successOrFailColoredStringToStream(false, crashed ? assertType::is_require :
-                                                                    assertType::is_check);
-                s << Color::Red << (crashed ? "test case CRASHED: " : "test case THREW exception: ")
-                  << Color::Cyan << st.error_string << "\n";
-
-                int num_stringified_contexts = get_num_stringified_contexts();
-                if(num_stringified_contexts) {
-                    auto stringified_contexts = get_stringified_contexts();
-                    s << Color::None << "  logged: ";
-                    for(int i = num_stringified_contexts - 1; i >= 0; --i) {
-                        s << (i == num_stringified_contexts - 1 ? "" : "          ")
-                          << stringified_contexts[i] << "\n";
-                    }
-                }
-                s << "\n";
-            }
-
-            // means the test case will be re-entered because there are untraversed (but discovered) subcases
-            if(st.should_reenter)
-                return;
-
-            if(opt->duration)
-                s << Color::None << std::setprecision(6) << std::fixed << st.seconds_so_far
-                  << " s: " << tc->m_name << "\n";
-
-            if(st.failure_flags & TestCaseFailureReason::Timeout)
-                s << Color::Red << "Test case exceeded time limit of " << std::setprecision(6)
-                  << std::fixed << tc->m_timeout << "!\n";
-
-            if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedButDidnt) {
-                s << Color::Red << "Should have failed but didn't! Marking it as failed!\n";
-            } else if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedAndDid) {
-                s << Color::Yellow << "Failed as expected so marking it as not failed\n";
-            } else if(st.failure_flags & TestCaseFailureReason::CouldHaveFailedAndDid) {
-                s << Color::Yellow << "Allowed to fail so marking it as not failed\n";
-            } else if(st.failure_flags & TestCaseFailureReason::DidntFailExactlyNumTimes) {
-                s << Color::Red << "Didn't fail exactly " << tc->m_expected_failures
-                  << " times so marking it as failed!\n";
-            } else if(st.failure_flags & TestCaseFailureReason::FailedExactlyNumTimes) {
-                s << Color::Yellow << "Failed exactly " << tc->m_expected_failures
-                  << " times as expected so marking it as not failed!\n";
-            }
-            if(st.failure_flags & TestCaseFailureReason::TooManyFailedAsserts) {
-                s << Color::Red << "Aborting - too many failed asserts!\n";
-            }
-            s << Color::None;
-        }
-
-        void subcase_start(const SubcaseSignature& subc) override {
-            subcasesStack.push_back(subc);
-            hasLoggedCurrentTestStart = false;
-        }
-
-        void subcase_end(const SubcaseSignature& /*subc*/) override {
-            subcasesStack.pop_back();
-            hasLoggedCurrentTestStart = false;
-        }
-
-        void log_assert(const AssertData& rb) override {
-            if(!rb.m_failed && !opt->success)
-                return;
-
-            std::lock_guard<std::mutex> lock(g_mutex);
-
-            logTestStart();
-
-            file_line_to_stream(rb.m_file, rb.m_line, " ");
-            successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
-            if((rb.m_at & (assertType::is_throws_as | assertType::is_throws_with)) ==
-               0) //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << " ) "
-                  << Color::None;
-
-            if(rb.m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional
-                s << (rb.m_threw ? "threw as expected!" : "did NOT throw at all!") << "\n";
-            } else if(rb.m_at &
-                      assertType::is_throws_as) { //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", "
-                  << rb.m_exception_type << " ) " << Color::None
-                  << (rb.m_threw ? (rb.m_threw_as ? "threw as expected!" :
-                                                    "threw a DIFFERENT exception: ") :
-                                   "did NOT throw at all!")
-                  << Color::Cyan << rb.m_exception << "\n";
-            } else if(rb.m_at &
-                      assertType::is_throws_with) { //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
-                  << rb.m_exception_type << "\" ) " << Color::None
-                  << (rb.m_threw ? (!rb.m_failed ? "threw as expected!" :
-                                                   "threw a DIFFERENT exception: ") :
-                                   "did NOT throw at all!")
-                  << Color::Cyan << rb.m_exception << "\n";
-            } else if(rb.m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional
-                s << (rb.m_threw ? "THREW exception: " : "didn't throw!") << Color::Cyan
-                  << rb.m_exception << "\n";
-            } else {
-                s << (rb.m_threw ? "THREW exception: " :
-                                   (!rb.m_failed ? "is correct!\n" : "is NOT correct!\n"));
-                if(rb.m_threw)
-                    s << rb.m_exception << "\n";
-                else
-                    s << "  values: " << assertString(rb.m_at) << "( " << rb.m_decomp << " )\n";
-            }
-
-            log_contexts();
-        }
-
-        void log_message(const MessageData& mb) override {
-            std::lock_guard<std::mutex> lock(g_mutex);
-
-            logTestStart();
-
-            file_line_to_stream(mb.m_file, mb.m_line, " ");
-            s << getSuccessOrFailColor(false, mb.m_severity)
-              << getSuccessOrFailString(mb.m_severity & assertType::is_warn, mb.m_severity,
-                                        "MESSAGE: ");
-            s << Color::None << mb.m_string << "\n";
-            log_contexts();
-        }
-
-        void test_case_skipped(const TestCaseData&) override {}
-    };
-
-    struct Whitespace
-    {
-        int nrSpaces;
-        explicit Whitespace(int nr)
-                : nrSpaces(nr) {}
-    };
-
-    std::ostream& operator<<(std::ostream& out, const Whitespace& ws) {
-        if(ws.nrSpaces != 0)
-            out << std::setw(ws.nrSpaces) << ' ';
-        return out;
-    }
-
-    // extension of the console reporter - with a bunch of helpers for the stdout stream redirection
-    struct ConsoleReporterWithHelpers : public ConsoleReporter
-    {
-        ConsoleReporterWithHelpers(std::ostream& in)
-                : ConsoleReporter(in) {}
-
-        void printVersion() {
-            if(getContextOptions()->no_version == false)
-                s << Color::Cyan << "[doctest] " << Color::None << "doctest version is \""
-                  << DOCTEST_VERSION_STR << "\"\n";
-        }
-
-        void printIntro() {
-            printVersion();
-            s << Color::Cyan << "[doctest] " << Color::None
-              << "run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY "help\" for options\n";
-        }
-
-        void printHelp() {
-            int sizePrefixDisplay = static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
-            printVersion();
-            // clang-format off
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "filter  values: \"str1,str2,str3\" (comma separated strings)\n";
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "filters use wildcards for matching strings\n";
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "something passes a filter if any of the strings in a filter matches\n";
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX "\" PREFIX!!!\n";
-#endif
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "Query flags - the program quits after them. Available:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "?,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY "h                      "
-              << Whitespace(sizePrefixDisplay*0) <<  "prints this message\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "v,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "version                       "
-              << Whitespace(sizePrefixDisplay*1) << "prints the version\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "c,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "count                         "
-              << Whitespace(sizePrefixDisplay*1) << "prints the number of matching tests\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-cases               "
-              << Whitespace(sizePrefixDisplay*1) << "lists all matching tests by name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-suites              "
-              << Whitespace(sizePrefixDisplay*1) << "lists all matching test suites\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lr,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-reporters                "
-              << Whitespace(sizePrefixDisplay*1) << "lists all registered reporters\n\n";
-            // ================================================================================== << 79
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "The available <int>/<string> options/filters are:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case=<filters>           "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case-exclude=<filters>   "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sf,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file=<filters>         "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their file\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file-exclude=<filters> "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their file\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ts,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite=<filters>          "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their test suite\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite-exclude=<filters>  "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their test suite\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase=<filters>             "
-              << Whitespace(sizePrefixDisplay*1) << "filters     subcases by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-exclude=<filters>     "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT subcases by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "r,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "reporters=<filters>           "
-              << Whitespace(sizePrefixDisplay*1) << "reporters to use (console is default)\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ob,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "order-by=<string>             "
-              << Whitespace(sizePrefixDisplay*1) << "how the tests should be ordered\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       <string> - by [file/suite/name/rand]\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "rs,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "rand-seed=<int>               "
-              << Whitespace(sizePrefixDisplay*1) << "seed for random ordering\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "f,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "first=<int>                   "
-              << Whitespace(sizePrefixDisplay*1) << "the first test passing the filters to\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       execute - for range-based execution\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "l,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "last=<int>                    "
-              << Whitespace(sizePrefixDisplay*1) << "the last test passing the filters to\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       execute - for range-based execution\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "aa,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "abort-after=<int>             "
-              << Whitespace(sizePrefixDisplay*1) << "stop after <int> failed assertions\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-filter-levels=<int>   "
-              << Whitespace(sizePrefixDisplay*1) << "apply filters for the first <int> levels\n";
-            s << Color::Cyan << "\n[doctest] " << Color::None;
-            s << "Bool options - can be used like flags and true is assumed. Available:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "s,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "success=<bool>                "
-              << Whitespace(sizePrefixDisplay*1) << "include successful assertions in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "cs,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "case-sensitive=<bool>         "
-              << Whitespace(sizePrefixDisplay*1) << "filters being treated as case sensitive\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "e,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "exit=<bool>                   "
-              << Whitespace(sizePrefixDisplay*1) << "exits after the tests finish\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "d,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "duration=<bool>               "
-              << Whitespace(sizePrefixDisplay*1) << "prints the time duration of each test\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nt,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-throw=<bool>               "
-              << Whitespace(sizePrefixDisplay*1) << "skips exceptions-related assert checks\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ne,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-exitcode=<bool>            "
-              << Whitespace(sizePrefixDisplay*1) << "returns (or exits) always with success\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nr,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-run=<bool>                 "
-              << Whitespace(sizePrefixDisplay*1) << "skips all runtime doctest operations\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nv,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-version=<bool>             "
-              << Whitespace(sizePrefixDisplay*1) << "omit the framework version in the output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-colors=<bool>              "
-              << Whitespace(sizePrefixDisplay*1) << "disables colors in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "fc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "force-colors=<bool>           "
-              << Whitespace(sizePrefixDisplay*1) << "use colors even when not in a tty\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nb,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-breaks=<bool>              "
-              << Whitespace(sizePrefixDisplay*1) << "disables breakpoints in debuggers\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ns,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-skip=<bool>                "
-              << Whitespace(sizePrefixDisplay*1) << "don't skip test cases marked as skip\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "gnu-file-line=<bool>          "
-              << Whitespace(sizePrefixDisplay*1) << ":n: vs (n): for line numbers in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-path-filenames=<bool>      "
-              << Whitespace(sizePrefixDisplay*1) << "only filenames and no paths in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-line-numbers=<bool>        "
-              << Whitespace(sizePrefixDisplay*1) << "0 instead of real line numbers in output\n";
-            // ================================================================================== << 79
-            // clang-format on
-
-            s << Color::Cyan << "\n[doctest] " << Color::None;
-            s << "for more information visit the project documentation\n\n";
-        }
-
-        void printRegisteredReporters() {
-            printVersion();
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all registered reporters\n";
-            for(auto& curr : getReporters())
-                s << "priority: " << std::setw(5) << curr.first.first
-                  << " name: " << curr.first.second << "\n";
-        }
-
-        void output_query_results() {
-            separator_to_stream();
-            if(getContextOptions()->count || getContextOptions()->list_test_cases) {
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "unskipped test cases passing the current filters: "
-                  << g_cs->numTestCasesPassingFilters << "\n";
-            } else if(getContextOptions()->list_test_suites) {
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "unskipped test cases passing the current filters: "
-                  << g_cs->numTestCasesPassingFilters << "\n";
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "test suites with unskipped test cases passing the current filters: "
-                  << g_cs->numTestSuitesPassingFilters << "\n";
-            }
-        }
-
-        void output_query_preamble_test_cases() {
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all test case names\n";
-            separator_to_stream();
-        }
-
-        void output_query_preamble_test_suites() {
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all test suites\n";
-            separator_to_stream();
-        }
-
-        void output_c_string_with_newline(const char* str) { s << Color::None << str << "\n"; }
-    };
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-    struct DebugOutputWindowReporter : public ConsoleReporter
-    {
-        DOCTEST_THREAD_LOCAL static std::ostringstream oss;
-
-        DebugOutputWindowReporter()
-                : ConsoleReporter(oss) {}
-
-#define DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(func, type)                                  \
-    void func(type in) override {                                                                  \
-        if(isDebuggerActive()) {                                                                   \
-            bool with_col = g_no_colors;                                                           \
-            g_no_colors   = false;                                                                 \
-            ConsoleReporter::func(in);                                                             \
-            DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str());                                        \
-            oss.str("");                                                                           \
-            g_no_colors = with_col;                                                                \
-        }                                                                                          \
-    }
-
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_run_start, const ContextOptions&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_run_end, const TestRunStats&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_start, const TestCaseData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_end, const CurrentTestCaseStats&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(subcase_start, const SubcaseSignature&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(subcase_end, const SubcaseSignature&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(log_assert, const AssertData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(log_message, const MessageData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_skipped, const TestCaseData&)
-    };
-
-    DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
-
-    DebugOutputWindowReporter g_debug_output_rep;
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    // the implementation of parseFlag()
-    bool parseFlagImpl(int argc, const char* const* argv, const char* pattern) {
-        for(int i = argc - 1; i >= 0; --i) {
-            auto temp = std::strstr(argv[i], pattern);
-            if(temp && strlen(temp) == strlen(pattern)) {
-                // eliminate strings in which the chars before the option are not '-'
-                bool noBadCharsFound = true; //!OCLINT prefer early exits and continue
-                while(temp != argv[i]) {
-                    if(*--temp != '-') {
-                        noBadCharsFound = false;
-                        break;
-                    }
-                }
-                if(noBadCharsFound && argv[i][0] == '-')
-                    return true;
-            }
-        }
-        return false;
-    }
-
-    // locates a flag on the command line
-    bool parseFlag(int argc, const char* const* argv, const char* pattern) {
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        // offset (normally 3 for "dt-") to skip prefix
-        if(parseFlagImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX)))
-            return true;
-#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        return parseFlagImpl(argc, argv, pattern);
-    }
-
-    // the implementation of parseOption()
-    bool parseOptionImpl(int argc, const char* const* argv, const char* pattern, String& res) {
-        for(int i = argc - 1; i >= 0; --i) {
-            auto temp = std::strstr(argv[i], pattern);
-            if(temp) { //!OCLINT prefer early exits and continue
-                // eliminate matches in which the chars before the option are not '-'
-                bool noBadCharsFound = true;
-                auto curr            = argv[i];
-                while(curr != temp) {
-                    if(*curr++ != '-') {
-                        noBadCharsFound = false;
-                        break;
-                    }
-                }
-                if(noBadCharsFound && argv[i][0] == '-') {
-                    temp += strlen(pattern);
-                    const unsigned len = strlen(temp);
-                    if(len) {
-                        res = temp;
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    // parses an option and returns the string after the '=' character
-    bool parseOption(int argc, const char* const* argv, const char* pattern, String& res,
-                     const String& defaultVal = String()) {
-        res = defaultVal;
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        // offset (normally 3 for "dt-") to skip prefix
-        if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), res))
-            return true;
-#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        return parseOptionImpl(argc, argv, pattern, res);
-    }
-
-    // parses a comma separated list of words after a pattern in one of the arguments in argv
-    bool parseCommaSepArgs(int argc, const char* const* argv, const char* pattern,
-                           std::vector<String>& res) {
-        String filtersString;
-        if(parseOption(argc, argv, pattern, filtersString)) {
-            // tokenize with "," as a separator
-            // cppcheck-suppress strtokCalled
-            DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-            auto pch = std::strtok(filtersString.c_str(), ","); // modifies the string
-            while(pch != nullptr) {
-                if(strlen(pch))
-                    res.push_back(pch);
-                // uses the strtok() internal state to go to the next token
-                // cppcheck-suppress strtokCalled
-                pch = std::strtok(nullptr, ",");
-            }
-            DOCTEST_CLANG_SUPPRESS_WARNING_POP
-            return true;
-        }
-        return false;
-    }
-
-    enum optionType
-    {
-        option_bool,
-        option_int
-    };
-
-    // parses an int/bool option from the command line
-    bool parseIntOption(int argc, const char* const* argv, const char* pattern, optionType type,
-                        int& res) {
-        String parsedValue;
-        if(!parseOption(argc, argv, pattern, parsedValue))
-            return false;
-
-        if(type == 0) {
-            // boolean
-            const char positive[][5] = {"1", "true", "on", "yes"};  // 5 - strlen("true") + 1
-            const char negative[][6] = {"0", "false", "off", "no"}; // 6 - strlen("false") + 1
-
-            // if the value matches any of the positive/negative possibilities
-            for(unsigned i = 0; i < 4; i++) {
-                if(parsedValue.compare(positive[i], true) == 0) {
-                    res = 1; //!OCLINT parameter reassignment
-                    return true;
-                }
-                if(parsedValue.compare(negative[i], true) == 0) {
-                    res = 0; //!OCLINT parameter reassignment
-                    return true;
-                }
-            }
-        } else {
-            // integer
-            // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on unsuccessful parse...
-            int theInt = std::atoi(parsedValue.c_str()); // NOLINT
-            if(theInt != 0) {
-                res = theInt; //!OCLINT parameter reassignment
-                return true;
-            }
-        }
-        return false;
-    }
-} // namespace
-
-Context::Context(int argc, const char* const* argv)
-        : p(new detail::ContextState) {
-    parseArgs(argc, argv, true);
-}
-
-Context::~Context() {
-    if(g_cs == p)
-        g_cs = nullptr;
-    delete p;
-}
-
-void Context::applyCommandLine(int argc, const char* const* argv) { parseArgs(argc, argv); }
-
-// parses args
-void Context::parseArgs(int argc, const char* const* argv, bool withDefaults) {
-    using namespace detail;
-
-    // clang-format off
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file=",        p->filters[0]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sf=",                 p->filters[0]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file-exclude=",p->filters[1]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sfe=",                p->filters[1]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite=",         p->filters[2]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ts=",                 p->filters[2]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite-exclude=", p->filters[3]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tse=",                p->filters[3]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case=",          p->filters[4]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tc=",                 p->filters[4]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case-exclude=",  p->filters[5]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tce=",                p->filters[5]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase=",            p->filters[6]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sc=",                 p->filters[6]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase-exclude=",    p->filters[7]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sce=",                p->filters[7]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "reporters=",          p->filters[8]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "r=",                  p->filters[8]);
-    // clang-format on
-
-    int    intRes = 0;
-    String strRes;
-
-#define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default)                                   \
-    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) ||  \
-       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes))   \
-        p->var = !!intRes;                                                                         \
-    else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) ||                           \
-            parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname))                            \
-        p->var = true;                                                                             \
-    else if(withDefaults)                                                                          \
-    p->var = default
-
-#define DOCTEST_PARSE_INT_OPTION(name, sname, var, default)                                        \
-    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) ||   \
-       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes))    \
-        p->var = intRes;                                                                           \
-    else if(withDefaults)                                                                          \
-    p->var = default
-
-#define DOCTEST_PARSE_STR_OPTION(name, sname, var, default)                                        \
-    if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", strRes, default) ||         \
-       parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", strRes, default) ||        \
-       withDefaults)                                                                               \
-    p->var = strRes
-
-    // clang-format off
-    DOCTEST_PARSE_STR_OPTION("order-by", "ob", order_by, "file");
-    DOCTEST_PARSE_INT_OPTION("rand-seed", "rs", rand_seed, 0);
-
-    DOCTEST_PARSE_INT_OPTION("first", "f", first, 0);
-    DOCTEST_PARSE_INT_OPTION("last", "l", last, UINT_MAX);
-
-    DOCTEST_PARSE_INT_OPTION("abort-after", "aa", abort_after, 0);
-    DOCTEST_PARSE_INT_OPTION("subcase-filter-levels", "scfl", subcase_filter_levels, 2000000000);
-
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("success", "s", success, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("case-sensitive", "cs", case_sensitive, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("exit", "e", exit, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("duration", "d", duration, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-throw", "nt", no_throw, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-exitcode", "ne", no_exitcode, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-run", "nr", no_run, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-version", "nv", no_version, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-colors", "nc", no_colors, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("force-colors", "fc", force_colors, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-breaks", "nb", no_breaks, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skip", "ns", no_skip, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("gnu-file-line", "gfl", gnu_file_line, !bool(DOCTEST_MSVC));
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-path-filenames", "npf", no_path_in_filenames, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-line-numbers", "nln", no_line_numbers, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skipped-summary", "nss", no_skipped_summary, false);
-    // clang-format on
-
-    if(withDefaults) {
-        p->help             = false;
-        p->version          = false;
-        p->count            = false;
-        p->list_test_cases  = false;
-        p->list_test_suites = false;
-        p->list_reporters   = false;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "help") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "h") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "?")) {
-        p->help = true;
-        p->exit = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "version") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "v")) {
-        p->version = true;
-        p->exit    = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "count") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "c")) {
-        p->count = true;
-        p->exit  = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-cases") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ltc")) {
-        p->list_test_cases = true;
-        p->exit            = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-suites") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lts")) {
-        p->list_test_suites = true;
-        p->exit             = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-reporters") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lr")) {
-        p->list_reporters = true;
-        p->exit           = true;
-    }
-}
-
-// allows the user to add procedurally to the filters from the command line
-void Context::addFilter(const char* filter, const char* value) { setOption(filter, value); }
-
-// allows the user to clear all filters from the command line
-void Context::clearFilters() {
-    for(auto& curr : p->filters)
-        curr.clear();
-}
-
-// allows the user to override procedurally the int/bool options from the command line
-void Context::setOption(const char* option, int value) {
-    setOption(option, toString(value).c_str());
-}
-
-// allows the user to override procedurally the string options from the command line
-void Context::setOption(const char* option, const char* value) {
-    auto argv   = String("-") + option + "=" + value;
-    auto lvalue = argv.c_str();
-    parseArgs(1, &lvalue);
-}
-
-// users should query this in their main() and exit the program if true
-bool Context::shouldExit() { return p->exit; }
-
-void Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }
-
-void Context::setAssertHandler(detail::assert_handler ah) { p->ah = ah; }
-
-// the main function that does all the filtering and test running
-int Context::run() {
-    using namespace detail;
-
-    auto old_cs        = g_cs;
-    g_cs               = p;
-    is_running_in_test = true;
-    g_no_colors        = p->no_colors;
-    p->resetRunData();
-
-    ConsoleReporterWithHelpers g_con_rep(std::cout);
-    registerReporter("console", 0, g_con_rep);
-
-    // setup default reporter if none is given through the command line
-    p->reporters_currently_used.clear();
-    if(p->filters[8].empty())
-        p->reporters_currently_used.push_back(getReporters()[reporterMap::key_type(0, "console")]);
-
-    // check to see if any of the registered reporters has been selected
-    for(auto& curr : getReporters()) {
-        if(matchesAny(curr.first.second.c_str(), p->filters[8], false, p->case_sensitive))
-            p->reporters_currently_used.push_back(curr.second);
-    }
-
-    // always use the debug output window reporter
-#ifdef DOCTEST_PLATFORM_WINDOWS
-    if(isDebuggerActive())
-        p->reporters_currently_used.push_back(&g_debug_output_rep);
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    // handle version, help and no_run
-    if(p->no_run || p->version || p->help || p->list_reporters) {
-        if(p->version)
-            g_con_rep.printVersion();
-        if(p->help)
-            g_con_rep.printHelp();
-        if(p->list_reporters)
-            g_con_rep.printRegisteredReporters();
-
-        g_cs               = old_cs;
-        is_running_in_test = false;
-
-        return EXIT_SUCCESS;
-    }
-
-    g_con_rep.printIntro();
-
-    std::vector<const TestCase*> testArray;
-    for(auto& curr : getRegisteredTests())
-        testArray.push_back(&curr);
-    p->numTestCases = testArray.size();
-
-    // sort the collected records
-    if(!testArray.empty()) {
-        if(p->order_by.compare("file", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), fileOrderComparator);
-        } else if(p->order_by.compare("suite", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), suiteOrderComparator);
-        } else if(p->order_by.compare("name", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), nameOrderComparator);
-        } else if(p->order_by.compare("rand", true) == 0) {
-            std::srand(p->rand_seed);
-
-            // random_shuffle implementation
-            const auto first = &testArray[0];
-            for(size_t i = testArray.size() - 1; i > 0; --i) {
-                int idxToSwap = std::rand() % (i + 1); // NOLINT
-
-                const auto temp = first[i];
-
-                first[i]         = first[idxToSwap];
-                first[idxToSwap] = temp;
-            }
-        }
-    }
-
-    if(p->list_test_cases)
-        g_con_rep.output_query_preamble_test_cases();
-
-    std::set<String> testSuitesPassingFilt;
-    if(p->list_test_suites)
-        g_con_rep.output_query_preamble_test_suites();
-
-    bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
-
-    if(!query_mode)
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start, *g_cs);
-
-    // invoke the registered functions if they match the filter criteria (or just count them)
-    for(auto& curr : testArray) {
-        const auto tc = *curr;
-
-        bool skip_me = false;
-        if(tc.m_skip && !p->no_skip)
-            skip_me = true;
-
-        if(!matchesAny(tc.m_file, p->filters[0], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_file, p->filters[1], false, p->case_sensitive))
-            skip_me = true;
-        if(!matchesAny(tc.m_test_suite, p->filters[2], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_test_suite, p->filters[3], false, p->case_sensitive))
-            skip_me = true;
-        if(!matchesAny(tc.m_name, p->filters[4], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_name, p->filters[5], false, p->case_sensitive))
-            skip_me = true;
-
-        if(!skip_me)
-            p->numTestCasesPassingFilters++;
-
-        // skip the test if it is not in the execution range
-        if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
-           (p->first > p->numTestCasesPassingFilters))
-            skip_me = true;
-
-        if(skip_me) {
-            if(!query_mode)
-                DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
-            continue;
-        }
-
-        // do not execute the test if we are to only count the number of filter passing tests
-        if(p->count)
-            continue;
-
-        // print the name of the test and don't execute it
-        if(p->list_test_cases) {
-            g_con_rep.output_c_string_with_newline(tc.m_name);
-            continue;
-        }
-
-        // print the name of the test suite if not done already and don't execute it
-        if(p->list_test_suites) {
-            if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] != '\0') {
-                g_con_rep.output_c_string_with_newline(tc.m_test_suite);
-                testSuitesPassingFilt.insert(tc.m_test_suite);
-                p->numTestSuitesPassingFilters++;
-            }
-            continue;
-        }
-
-        // execute the test if it passes all the filtering
-        {
-            p->currentTest = &tc;
-
-            p->failure_flags  = TestCaseFailureReason::None;
-            p->seconds_so_far = 0;
-            p->error_string   = "";
-
-            // reset non-atomic counters
-            p->numAssertsFailedForCurrentTestCase = 0;
-            p->numAssertsForCurrentTestCase       = 0;
-
-            p->subcasesPassed.clear();
-            do {
-                // reset some of the fields for subcases (except for the set of fully passed ones)
-                p->should_reenter       = false;
-                p->subcasesCurrentLevel = 0;
-                p->subcasesEnteredLevels.clear();
-
-                // reset stuff for logging with INFO()
-                p->stringifiedContexts.clear();
-
-                // reset atomic counters
-                p->numAssertsFailedForCurrentTestCase_atomic = 0;
-                p->numAssertsForCurrentTestCase_atomic       = 0;
-
-                DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
-
-                g_timer.start();
-
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-                try {
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-                    FatalConditionHandler fatalConditionHandler; // Handle signals
-                    // execute the test
-                    tc.m_test();
-                    fatalConditionHandler.reset();
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-                } catch(const TestFailureException&) {
-                    p->failure_flags |= TestCaseFailureReason::AssertFailure;
-                } catch(...) {
-                    p->error_string = translateActiveException();
-                    p->failure_flags |= TestCaseFailureReason::Exception;
-                }
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-                p->seconds_so_far += g_timer.getElapsedSeconds();
-
-                // update the non-atomic counters
-                p->numAsserts += p->numAssertsForCurrentTestCase_atomic;
-                p->numAssertsForCurrentTestCase += p->numAssertsForCurrentTestCase_atomic;
-                p->numAssertsFailed += p->numAssertsFailedForCurrentTestCase_atomic;
-                p->numAssertsFailedForCurrentTestCase +=
-                        p->numAssertsFailedForCurrentTestCase_atomic;
-
-                // exit this loop if enough assertions have failed - even if there are more subcases
-                if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after) {
-                    p->should_reenter = false;
-                    p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts;
-                }
-
-                // call it from here only if we will continue looping for other subcases and
-                // call it again outside of the loop for one final time - with updated flags
-                if(p->should_reenter == true) {
-                    DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-                    // remove these flags - it is expected that the reporters have handled these issues
-                    p->failure_flags &= ~TestCaseFailureReason::Exception;
-                    p->failure_flags &= ~TestCaseFailureReason::AssertFailure;
-                }
-            } while(p->should_reenter == true);
-
-            if(p->numAssertsFailedForCurrentTestCase)
-                p->failure_flags |= TestCaseFailureReason::AssertFailure;
-
-            if(Approx(p->currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
-               Approx(p->seconds_so_far).epsilon(DBL_EPSILON) > p->currentTest->m_timeout)
-                p->failure_flags |= TestCaseFailureReason::Timeout;
-
-            if(tc.m_should_fail) {
-                if(p->failure_flags) {
-                    p->failure_flags |= TestCaseFailureReason::ShouldHaveFailedAndDid;
-                } else {
-                    p->failure_flags |= TestCaseFailureReason::ShouldHaveFailedButDidnt;
-                }
-            } else if(p->failure_flags && tc.m_may_fail) {
-                p->failure_flags |= TestCaseFailureReason::CouldHaveFailedAndDid;
-            } else if(tc.m_expected_failures > 0) {
-                if(p->numAssertsFailedForCurrentTestCase == tc.m_expected_failures) {
-                    p->failure_flags |= TestCaseFailureReason::FailedExactlyNumTimes;
-                } else {
-                    p->failure_flags |= TestCaseFailureReason::DidntFailExactlyNumTimes;
-                }
-            }
-
-            bool ok_to_fail = (TestCaseFailureReason::ShouldHaveFailedAndDid & p->failure_flags) ||
-                              (TestCaseFailureReason::CouldHaveFailedAndDid & p->failure_flags) ||
-                              (TestCaseFailureReason::FailedExactlyNumTimes & p->failure_flags);
-
-            // if any subcase has failed - the whole test case has failed
-            if(p->failure_flags && !ok_to_fail)
-                p->numTestCasesFailed++;
-
-            DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-
-            p->currentTest = nullptr;
-
-            // stop executing tests if enough assertions have failed
-            if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
-                break;
-        }
-    }
-
-    if(!query_mode)
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
-    else
-        g_con_rep.output_query_results();
-
-    g_cs               = old_cs;
-    is_running_in_test = false;
-
-    if(p->numTestCasesFailed && !p->no_exitcode)
-        return EXIT_FAILURE;
-    return EXIT_SUCCESS;
-}
-
-DOCTEST_DEFINE_DEFAULTS(CurrentTestCaseStats);
-
-DOCTEST_DEFINE_DEFAULTS(TestRunStats);
-
-IReporter::~IReporter() = default;
-
-int IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); }
-const IContextScope* const* IReporter::get_active_contexts() {
-    return get_num_active_contexts() ? &detail::g_infoContexts[0] : nullptr;
-}
-
-int IReporter::get_num_stringified_contexts() { return detail::g_cs->stringifiedContexts.size(); }
-const String* IReporter::get_stringified_contexts() {
-    return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] : nullptr;
-}
-
-int registerReporter(const char* name, int priority, IReporter& r) {
-    getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), &r));
-    return 0;
-}
-
-// see these issues on the reasoning for this:
-// - https://github.com/onqtam/doctest/issues/143#issuecomment-414418903
-// - https://github.com/onqtam/doctest/issues/126
-void DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS() { std::cout << std::string(); }
-
-} // namespace doctest
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); }
-#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_LIBRARY_IMPLEMENTATION
-#endif // DOCTEST_CONFIG_IMPLEMENT
diff --git a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_fwd.h b/QiaoJiaSystem/UnitTest/doctest/parts/doctest_fwd.h
deleted file mode 100644
index 217c89a..0000000
--- a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_fwd.h
+++ /dev/null
@@ -1,2577 +0,0 @@
-//
-// doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD
-//
-// Copyright (c) 2016-2018 Viktor Kirilov
-//
-// Distributed under the MIT Software License
-// See accompanying file LICENSE.txt or copy at
-// https://opensource.org/licenses/MIT
-//
-// The documentation can be found at the library's page:
-// https://github.com/onqtam/doctest/blob/master/doc/markdown/readme.md
-//
-// =================================================================================================
-// =================================================================================================
-// =================================================================================================
-//
-// The library is heavily influenced by Catch - https://github.com/philsquared/Catch
-// which uses the Boost Software License - Version 1.0
-// see here - https://github.com/philsquared/Catch/blob/master/LICENSE.txt
-//
-// The concept of subcases (sections in Catch) and expression decomposition are from there.
-// Some parts of the code are taken directly:
-// - stringification - the detection of "ostream& operator<<(ostream&, const T&)" and StringMaker<>
-// - the Approx() helper class for floating point comparison
-// - colors in the console
-// - breaking into a debugger
-// - signal / SEH handling
-// - timer
-//
-// The expression decomposing templates are taken from lest - https://github.com/martinmoene/lest
-// which uses the Boost Software License - Version 1.0
-// see here - https://github.com/martinmoene/lest/blob/master/LICENSE.txt
-//
-// =================================================================================================
-// =================================================================================================
-// =================================================================================================
-
-#ifndef DOCTEST_LIBRARY_INCLUDED
-#define DOCTEST_LIBRARY_INCLUDED
-
-// =================================================================================================
-// == VERSION ======================================================================================
-// =================================================================================================
-
-#define DOCTEST_VERSION_MAJOR 2
-#define DOCTEST_VERSION_MINOR 2
-#define DOCTEST_VERSION_PATCH 1
-#define DOCTEST_VERSION_STR "2.2.1"
-
-#define DOCTEST_VERSION                                                                            \
-    (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
-
-// =================================================================================================
-// == COMPILER VERSION =============================================================================
-// =================================================================================================
-
-// ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect
-
-#define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))
-
-// GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl...
-#if defined(_MSC_VER) && defined(_MSC_FULL_VER)
-#if _MSC_VER == _MSC_FULL_VER / 10000
-#define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)
-#else // MSVC
-#define DOCTEST_MSVC                                                                               \
-    DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)
-#endif // MSVC
-#endif // MSVC
-#if defined(__clang__) && defined(__clang_minor__)
-#define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)
-#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) &&              \
-        !defined(__INTEL_COMPILER)
-#define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
-#endif // GCC
-
-#ifndef DOCTEST_MSVC
-#define DOCTEST_MSVC 0
-#endif // DOCTEST_MSVC
-#ifndef DOCTEST_CLANG
-#define DOCTEST_CLANG 0
-#endif // DOCTEST_CLANG
-#ifndef DOCTEST_GCC
-#define DOCTEST_GCC 0
-#endif // DOCTEST_GCC
-
-// =================================================================================================
-// == COMPILER WARNINGS HELPERS ====================================================================
-// =================================================================================================
-
-#if DOCTEST_CLANG
-#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push")
-#define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop")
-#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)                                                \
-    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)
-#else // DOCTEST_CLANG
-#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
-#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
-#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_CLANG
-
-#if DOCTEST_GCC
-#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
-#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push")
-#define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)
-#define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop")
-#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)                                                  \
-    DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)
-#else // DOCTEST_GCC
-#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-#define DOCTEST_GCC_SUPPRESS_WARNING(w)
-#define DOCTEST_GCC_SUPPRESS_WARNING_POP
-#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_GCC
-
-#if DOCTEST_MSVC
-#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))
-#define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))
-#define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))
-#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)                                                 \
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)
-#else // DOCTEST_MSVC
-#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
-#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
-#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
-#endif // DOCTEST_MSVC
-
-// =================================================================================================
-// == COMPILER WARNINGS ============================================================================
-// =================================================================================================
-
-DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
-
-DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor")
-DOCTEST_GCC_SUPPRESS_WARNING("-Winline")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
-
-DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
-DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
-DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
-DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
-DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding
-DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
-// static analysis
-DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
-DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
-DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
-DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtr...
-
-// 4548 - expression before comma has no effect; expected expression with side - effect
-// 4265 - class has virtual functions, but destructor is not virtual
-// 4986 - exception specification does not match previous declaration
-// 4350 - behavior change: 'member1' called instead of 'member2'
-// 4668 - 'x' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
-// 4365 - conversion from 'int' to 'unsigned long', signed/unsigned mismatch
-// 4774 - format string expected in argument 'x' is not a string literal
-// 4820 - padding in structs
-
-// only 4 should be disabled globally:
-// - 4514 # unreferenced inline function has been removed
-// - 4571 # SEH related
-// - 4710 # function not inlined
-// - 4711 # function 'x' selected for automatic inline expansion
-
-#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN                                 \
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH                                                             \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4548)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4265)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4986)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4350)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4668)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4365)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4774)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4820)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4625)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4626)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5027)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5026)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(4623)                                                            \
-    DOCTEST_MSVC_SUPPRESS_WARNING(5039)
-
-#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-// =================================================================================================
-// == FEATURE DETECTION ============================================================================
-// =================================================================================================
-
-// general compiler feature support table: https://en.cppreference.com/w/cpp/compiler_support
-// MSVC C++11 feature support table: https://msdn.microsoft.com/en-us/library/hh567368.aspx
-// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html
-// MSVC version table:
-// MSVC++ 15.0 _MSC_VER == 1910 (Visual Studio 2017)
-// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
-// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
-// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
-// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
-// MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)
-// MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)
-
-#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
-#define DOCTEST_CONFIG_WINDOWS_SEH
-#endif // MSVC
-#if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)
-#undef DOCTEST_CONFIG_WINDOWS_SEH
-#endif // DOCTEST_CONFIG_NO_WINDOWS_SEH
-
-#if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS)
-#define DOCTEST_CONFIG_POSIX_SIGNALS
-#endif // _WIN32
-#if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)
-#undef DOCTEST_CONFIG_POSIX_SIGNALS
-#endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS
-
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-#if(DOCTEST_GCC || (DOCTEST_CLANG && !DOCTEST_MSVC)) && !defined(__EXCEPTIONS)
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // clang and gcc
-#if DOCTEST_MSVC && (defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS == 0)
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // MSVC
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-#define DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)
-#define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-
-#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)
-#define DOCTEST_CONFIG_IMPLEMENT
-#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-
-#if defined(_WIN32) || defined(__CYGWIN__)
-#if DOCTEST_MSVC
-#define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)
-#define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)
-#else // MSVC
-#define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))
-#define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))
-#endif // MSVC
-#else  // _WIN32
-#define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default")))
-#define DOCTEST_SYMBOL_IMPORT
-#endif // _WIN32
-
-#ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-#ifdef DOCTEST_CONFIG_IMPLEMENT
-#define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT
-#else // DOCTEST_CONFIG_IMPLEMENT
-#define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT
-#endif // DOCTEST_CONFIG_IMPLEMENT
-#else  // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-#define DOCTEST_INTERFACE
-#endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
-
-#if DOCTEST_MSVC
-#define DOCTEST_NOINLINE __declspec(noinline)
-#define DOCTEST_UNUSED
-#define DOCTEST_ALIGNMENT(x)
-#else // MSVC
-#define DOCTEST_NOINLINE __attribute__((noinline))
-#define DOCTEST_UNUSED __attribute__((unused))
-#define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))
-#endif // MSVC
-
-#ifndef DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
-#define DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK 5
-#endif // DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK
-
-// =================================================================================================
-// == FEATURE DETECTION END ========================================================================
-// =================================================================================================
-
-// internal macros for string concatenation and anonymous variable name generation
-#define DOCTEST_CAT_IMPL(s1, s2) s1##s2
-#define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)
-#ifdef __COUNTER__ // not standard and may be missing for some compilers
-#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)
-#else // __COUNTER__
-#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
-#endif // __COUNTER__
-
-#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-#define DOCTEST_REF_WRAP(x) x&
-#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-#define DOCTEST_REF_WRAP(x) x
-#endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
-
-// not using __APPLE__ because... this is how Catch does it
-#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
-#define DOCTEST_PLATFORM_MAC
-#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
-#define DOCTEST_PLATFORM_IPHONE
-#elif defined(_WIN32)
-#define DOCTEST_PLATFORM_WINDOWS
-#else // DOCTEST_PLATFORM
-#define DOCTEST_PLATFORM_LINUX
-#endif // DOCTEST_PLATFORM
-
-// clang-format off
-#define DOCTEST_DELETE_COPIES(type)     type(const type&) = delete; type& operator=(const type&) = delete
-#define DOCTEST_DECLARE_COPIES(type)    type(const type&); type& operator=(const type&)
-#define DOCTEST_DEFINE_COPIES(type)     type::type(const type&) = default; type& type::operator=(const type&) = default
-#define DOCTEST_DECLARE_DEFAULTS(type)  type(); ~type()
-#define DOCTEST_DEFINE_DEFAULTS(type)   type::type()  = default; type::~type() = default
-// clang-format on
-
-#define DOCTEST_GLOBAL_NO_WARNINGS(var)                                                            \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors")                              \
-    static int var DOCTEST_UNUSED // NOLINT(fuchsia-statically-constructed-objects,cert-err58-cpp)
-#define DOCTEST_GLOBAL_NO_WARNINGS_END() DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-// should probably take a look at https://github.com/scottt/debugbreak
-#ifdef DOCTEST_PLATFORM_MAC
-#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :)
-#elif DOCTEST_MSVC
-#define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()
-#elif defined(__MINGW32__)
-extern "C" __declspec(dllimport) void __stdcall DebugBreak();
-#define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()
-#else // linux
-#define DOCTEST_BREAK_INTO_DEBUGGER() ((void)0)
-#endif // linux
-
-#if DOCTEST_CLANG
-// to detect if libc++ is being used with clang (the _LIBCPP_VERSION identifier)
-#include <ciso646>
-#endif // clang
-
-// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
-DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)
-
-#if defined(_LIBCPP_VERSION) || defined(DOCTEST_CONFIG_USE_IOSFWD)
-// not forward declaring ostream for libc++ because I had some problems (inline namespaces vs c++98)
-// so the <iosfwd> header is used - also it is very light and doesn't drag a ton of stuff
-#include <iosfwd>
-#else  // _LIBCPP_VERSION
-namespace std {
-template <class charT>
-struct char_traits;
-template <>
-struct char_traits<char>;
-template <class charT, class traits>
-class basic_ostream;
-typedef basic_ostream<char, char_traits<char> > ostream;
-} // namespace std
-#endif // _LIBCPP_VERSION || DOCTEST_CONFIG_USE_IOSFWD
-
-#ifdef _LIBCPP_VERSION
-#include <cstddef>
-#else  // _LIBCPP_VERSION
-namespace std {
-typedef decltype(nullptr) nullptr_t;
-}
-#endif // _LIBCPP_VERSION
-
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-#include <type_traits>
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-namespace doctest {
-
-DOCTEST_INTERFACE extern bool is_running_in_test;
-
-// A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length
-// of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for:
-// - "is small" bit - the highest bit - if "0" then it is small - otherwise its "1" (128)
-// - if small - capacity left before going on the heap - using the lowest 5 bits
-// - if small - 2 bits are left unused - the second and third highest ones
-// - if small - acts as a null terminator if strlen() is 23 (24 including the null terminator)
-//              and the "is small" bit remains "0" ("as well as the capacity left") so its OK
-// Idea taken from this lecture about the string implementation of facebook/folly - fbstring
-// https://www.youtube.com/watch?v=kPR8h4-qZdk
-// TODO:
-// - optimizations - like not deleting memory unnecessarily in operator= and etc.
-// - resize/reserve/clear
-// - substr
-// - replace
-// - back/front
-// - iterator stuff
-// - find & friends
-// - push_back/pop_back
-// - assign/insert/erase
-// - relational operators as free functions - taking const char* as one of the params
-class DOCTEST_INTERFACE String
-{
-    static const unsigned len  = 24;      //!OCLINT avoid private static members
-    static const unsigned last = len - 1; //!OCLINT avoid private static members
-
-    struct view // len should be more than sizeof(view) - because of the final byte for flags
-    {
-        char*    ptr;
-        unsigned size;
-        unsigned capacity;
-    };
-
-    union
-    {
-        char buf[len];
-        view data;
-    };
-
-    bool isOnStack() const { return (buf[last] & 128) == 0; }
-    void setOnHeap();
-    void setLast(unsigned in = last);
-
-    void copy(const String& other);
-
-public:
-    String();
-    ~String();
-
-    String(const char* in);
-    String(const char* in, unsigned in_size);
-
-    String(const String& other);
-    String& operator=(const String& other);
-
-    String& operator+=(const String& other);
-    String  operator+(const String& other) const;
-
-    String(String&& other);
-    String& operator=(String&& other);
-
-    char  operator[](unsigned i) const;
-    char& operator[](unsigned i);
-
-    // the only functions I'm willing to leave in the interface - available for inlining
-    const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT
-    char*       c_str() {
-        if(isOnStack())
-            return reinterpret_cast<char*>(buf);
-        return data.ptr;
-    }
-
-    unsigned size() const;
-    unsigned capacity() const;
-
-    int compare(const char* other, bool no_case = false) const;
-    int compare(const String& other, bool no_case = false) const;
-};
-
-DOCTEST_INTERFACE bool operator==(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator!=(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator<(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs);
-DOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs);
-
-DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in);
-
-namespace Color {
-    enum Enum
-    {
-        None = 0,
-        White,
-        Red,
-        Green,
-        Blue,
-        Cyan,
-        Yellow,
-        Grey,
-
-        Bright = 0x10,
-
-        BrightRed   = Bright | Red,
-        BrightGreen = Bright | Green,
-        LightGrey   = Bright | Grey,
-        BrightWhite = Bright | White
-    };
-
-    DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, Color::Enum code);
-} // namespace Color
-
-namespace assertType {
-    enum Enum
-    {
-        // macro traits
-
-        is_warn    = 1,
-        is_check   = 2 * is_warn,
-        is_require = 2 * is_check,
-
-        is_normal      = 2 * is_require,
-        is_throws      = 2 * is_normal,
-        is_throws_as   = 2 * is_throws,
-        is_throws_with = 2 * is_throws_as,
-        is_nothrow     = 2 * is_throws_with,
-
-        is_false = 2 * is_nothrow,
-        is_unary = 2 * is_false, // not checked anywhere - used just to distinguish the types
-
-        is_eq = 2 * is_unary,
-        is_ne = 2 * is_eq,
-
-        is_lt = 2 * is_ne,
-        is_gt = 2 * is_lt,
-
-        is_ge = 2 * is_gt,
-        is_le = 2 * is_ge,
-
-        // macro types
-
-        DT_WARN    = is_normal | is_warn,
-        DT_CHECK   = is_normal | is_check,
-        DT_REQUIRE = is_normal | is_require,
-
-        DT_WARN_FALSE    = is_normal | is_false | is_warn,
-        DT_CHECK_FALSE   = is_normal | is_false | is_check,
-        DT_REQUIRE_FALSE = is_normal | is_false | is_require,
-
-        DT_WARN_THROWS    = is_throws | is_warn,
-        DT_CHECK_THROWS   = is_throws | is_check,
-        DT_REQUIRE_THROWS = is_throws | is_require,
-
-        DT_WARN_THROWS_AS    = is_throws_as | is_warn,
-        DT_CHECK_THROWS_AS   = is_throws_as | is_check,
-        DT_REQUIRE_THROWS_AS = is_throws_as | is_require,
-
-        DT_WARN_THROWS_WITH    = is_throws_with | is_warn,
-        DT_CHECK_THROWS_WITH   = is_throws_with | is_check,
-        DT_REQUIRE_THROWS_WITH = is_throws_with | is_require,
-
-        DT_WARN_NOTHROW    = is_nothrow | is_warn,
-        DT_CHECK_NOTHROW   = is_nothrow | is_check,
-        DT_REQUIRE_NOTHROW = is_nothrow | is_require,
-
-        DT_WARN_EQ    = is_normal | is_eq | is_warn,
-        DT_CHECK_EQ   = is_normal | is_eq | is_check,
-        DT_REQUIRE_EQ = is_normal | is_eq | is_require,
-
-        DT_WARN_NE    = is_normal | is_ne | is_warn,
-        DT_CHECK_NE   = is_normal | is_ne | is_check,
-        DT_REQUIRE_NE = is_normal | is_ne | is_require,
-
-        DT_WARN_GT    = is_normal | is_gt | is_warn,
-        DT_CHECK_GT   = is_normal | is_gt | is_check,
-        DT_REQUIRE_GT = is_normal | is_gt | is_require,
-
-        DT_WARN_LT    = is_normal | is_lt | is_warn,
-        DT_CHECK_LT   = is_normal | is_lt | is_check,
-        DT_REQUIRE_LT = is_normal | is_lt | is_require,
-
-        DT_WARN_GE    = is_normal | is_ge | is_warn,
-        DT_CHECK_GE   = is_normal | is_ge | is_check,
-        DT_REQUIRE_GE = is_normal | is_ge | is_require,
-
-        DT_WARN_LE    = is_normal | is_le | is_warn,
-        DT_CHECK_LE   = is_normal | is_le | is_check,
-        DT_REQUIRE_LE = is_normal | is_le | is_require,
-
-        DT_WARN_UNARY    = is_normal | is_unary | is_warn,
-        DT_CHECK_UNARY   = is_normal | is_unary | is_check,
-        DT_REQUIRE_UNARY = is_normal | is_unary | is_require,
-
-        DT_WARN_UNARY_FALSE    = is_normal | is_false | is_unary | is_warn,
-        DT_CHECK_UNARY_FALSE   = is_normal | is_false | is_unary | is_check,
-        DT_REQUIRE_UNARY_FALSE = is_normal | is_false | is_unary | is_require,
-    };
-} // namespace assertType
-
-DOCTEST_INTERFACE const char* assertString(assertType::Enum at);
-DOCTEST_INTERFACE const char* failureString(assertType::Enum at);
-DOCTEST_INTERFACE const char* removePathFromFilename(const char* file);
-
-struct DOCTEST_INTERFACE TestCaseData
-{
-    const char* m_file;       // the file in which the test was registered
-    unsigned    m_line;       // the line where the test was registered
-    const char* m_name;       // name of the test case
-    const char* m_test_suite; // the test suite in which the test was added
-    const char* m_description;
-    bool        m_skip;
-    bool        m_may_fail;
-    bool        m_should_fail;
-    int         m_expected_failures;
-    double      m_timeout;
-
-    DOCTEST_DECLARE_DEFAULTS(TestCaseData);
-    DOCTEST_DECLARE_COPIES(TestCaseData);
-};
-
-struct DOCTEST_INTERFACE AssertData
-{
-    // common - for all asserts
-    const TestCaseData* m_test_case;
-    assertType::Enum    m_at;
-    const char*         m_file;
-    int                 m_line;
-    const char*         m_expr;
-    bool                m_failed;
-
-    // exception-related - for all asserts
-    bool   m_threw;
-    String m_exception;
-
-    // for normal asserts
-    String m_decomp;
-
-    // for specific exception-related asserts
-    bool        m_threw_as;
-    const char* m_exception_type;
-
-    DOCTEST_DECLARE_DEFAULTS(AssertData);
-    DOCTEST_DELETE_COPIES(AssertData);
-};
-
-struct DOCTEST_INTERFACE MessageData
-{
-    String           m_string;
-    const char*      m_file;
-    int              m_line;
-    assertType::Enum m_severity;
-
-    DOCTEST_DECLARE_DEFAULTS(MessageData);
-    DOCTEST_DELETE_COPIES(MessageData);
-};
-
-struct DOCTEST_INTERFACE SubcaseSignature
-{
-    const char* m_name;
-    const char* m_file;
-    int         m_line;
-
-    SubcaseSignature(const char* name, const char* file, int line);
-
-    bool operator<(const SubcaseSignature& other) const;
-
-    DOCTEST_DECLARE_DEFAULTS(SubcaseSignature);
-    DOCTEST_DECLARE_COPIES(SubcaseSignature);
-};
-
-struct DOCTEST_INTERFACE IContextScope
-{
-    DOCTEST_DELETE_COPIES(IContextScope);
-
-    IContextScope();
-    virtual ~IContextScope();
-    virtual void stringify(std::ostream*) const = 0;
-};
-
-struct ContextOptions //!OCLINT too many fields
-{
-    // == parameters from the command line
-    String   order_by;  // how tests should be ordered
-    unsigned rand_seed; // the seed for rand ordering
-
-    unsigned first; // the first (matching) test to be executed
-    unsigned last;  // the last (matching) test to be executed
-
-    int abort_after;           // stop tests after this many failed assertions
-    int subcase_filter_levels; // apply the subcase filters for the first N levels
-
-    bool success;              // include successful assertions in output
-    bool case_sensitive;       // if filtering should be case sensitive
-    bool exit;                 // if the program should be exited after the tests are ran/whatever
-    bool duration;             // print the time duration of each test case
-    bool no_throw;             // to skip exceptions-related assertion macros
-    bool no_exitcode;          // if the framework should return 0 as the exitcode
-    bool no_run;               // to not run the tests at all (can be done with an "*" exclude)
-    bool no_version;           // to not print the version of the framework
-    bool no_colors;            // if output to the console should be colorized
-    bool force_colors;         // forces the use of colors even when a tty cannot be detected
-    bool no_breaks;            // to not break into the debugger
-    bool no_skip;              // don't skip test cases which are marked to be skipped
-    bool gnu_file_line;        // if line numbers should be surrounded with :x: and not (x):
-    bool no_path_in_filenames; // if the path to files should be removed from the output
-    bool no_line_numbers;      // if source code line numbers should be omitted from the output
-    bool no_skipped_summary;   // don't print "skipped" in the summary !!! UNDOCUMENTED !!!
-
-    bool help;             // to print the help
-    bool version;          // to print the version
-    bool count;            // if only the count of matching tests is to be retreived
-    bool list_test_cases;  // to list all tests matching the filters
-    bool list_test_suites; // to list all suites matching the filters
-    bool list_reporters;   // lists all registered reporters
-
-    DOCTEST_DECLARE_DEFAULTS(ContextOptions);
-    DOCTEST_DELETE_COPIES(ContextOptions);
-};
-
-namespace detail {
-#if defined(DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || defined(DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS)
-    template <bool CONDITION, typename TYPE = void>
-    struct enable_if
-    {};
-
-    template <typename TYPE>
-    struct enable_if<true, TYPE>
-    { typedef TYPE type; };
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format off
-    template<class T> struct remove_reference      { typedef T type; };
-    template<class T> struct remove_reference<T&>  { typedef T type; };
-    template<class T> struct remove_reference<T&&> { typedef T type; };
-
-    template<class T> struct remove_const          { typedef T type; };
-    template<class T> struct remove_const<const T> { typedef T type; };
-    // clang-format on
-
-    template <typename T>
-    struct deferred_false
-    // cppcheck-suppress unusedStructMember
-    { static const bool value = false; };
-
-    namespace has_insertion_operator_impl {
-        typedef char no;
-        typedef char yes[2];
-
-        struct any_t
-        {
-            template <typename T>
-            // cppcheck-suppress noExplicitConstructor
-            any_t(const DOCTEST_REF_WRAP(T));
-        };
-
-        yes& testStreamable(std::ostream&);
-        no   testStreamable(no);
-
-        no operator<<(const std::ostream&, const any_t&);
-
-        template <typename T>
-        struct has_insertion_operator
-        {
-            static std::ostream& s;
-            static const DOCTEST_REF_WRAP(T) t;
-            static const bool value = sizeof(testStreamable(s << t)) == sizeof(yes);
-        };
-    } // namespace has_insertion_operator_impl
-
-    template <typename T>
-    struct has_insertion_operator : has_insertion_operator_impl::has_insertion_operator<T>
-    {};
-
-    DOCTEST_INTERFACE void my_memcpy(void* dest, const void* src, unsigned num);
-
-    DOCTEST_INTERFACE std::ostream* getTlsOss(); // returns a thread-local ostringstream
-    DOCTEST_INTERFACE String getTlsOssResult();
-
-    template <bool C>
-    struct StringMakerBase
-    {
-        template <typename T>
-        static String convert(const DOCTEST_REF_WRAP(T)) {
-            return "{?}";
-        }
-    };
-
-    template <>
-    struct StringMakerBase<true>
-    {
-        template <typename T>
-        static String convert(const DOCTEST_REF_WRAP(T) in) {
-            *getTlsOss() << in;
-            return getTlsOssResult();
-        }
-    };
-
-    DOCTEST_INTERFACE String rawMemoryToString(const void* object, unsigned size);
-
-    template <typename T>
-    String rawMemoryToString(const DOCTEST_REF_WRAP(T) object) {
-        return rawMemoryToString(&object, sizeof(object));
-    }
-
-    template <typename T>
-    const char* type_to_string() {
-        return "<>";
-    }
-} // namespace detail
-
-template <typename T>
-struct StringMaker : public detail::StringMakerBase<detail::has_insertion_operator<T>::value>
-{};
-
-template <typename T>
-struct StringMaker<T*>
-{
-    template <typename U>
-    static String convert(U* p) {
-        if(p)
-            return detail::rawMemoryToString(p);
-        return "NULL";
-    }
-};
-
-template <typename R, typename C>
-struct StringMaker<R C::*>
-{
-    static String convert(R C::*p) {
-        if(p)
-            return detail::rawMemoryToString(p);
-        return "NULL";
-    }
-};
-
-template <typename T>
-String toString(const DOCTEST_REF_WRAP(T) value) {
-    return StringMaker<T>::convert(value);
-}
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-DOCTEST_INTERFACE String toString(char* in);
-DOCTEST_INTERFACE String toString(const char* in);
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-DOCTEST_INTERFACE String toString(bool in);
-DOCTEST_INTERFACE String toString(float in);
-DOCTEST_INTERFACE String toString(double in);
-DOCTEST_INTERFACE String toString(double long in);
-
-DOCTEST_INTERFACE String toString(char in);
-DOCTEST_INTERFACE String toString(char signed in);
-DOCTEST_INTERFACE String toString(char unsigned in);
-DOCTEST_INTERFACE String toString(int short in);
-DOCTEST_INTERFACE String toString(int short unsigned in);
-DOCTEST_INTERFACE String toString(int in);
-DOCTEST_INTERFACE String toString(int unsigned in);
-DOCTEST_INTERFACE String toString(int long in);
-DOCTEST_INTERFACE String toString(int long unsigned in);
-DOCTEST_INTERFACE String toString(int long long in);
-DOCTEST_INTERFACE String toString(int long long unsigned in);
-DOCTEST_INTERFACE String toString(std::nullptr_t in);
-
-class DOCTEST_INTERFACE Approx
-{
-public:
-    explicit Approx(double value);
-
-    DOCTEST_DECLARE_COPIES(Approx);
-
-    Approx operator()(double value) const;
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    explicit Approx(const T& value,
-                    typename detail::enable_if<std::is_constructible<double, T>::value>::type* =
-                            static_cast<T*>(nullptr)) {
-        *this = Approx(static_cast<double>(value));
-    }
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    Approx& epsilon(double newEpsilon);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon(
-            const T& newEpsilon) {
-        m_epsilon = static_cast<double>(newEpsilon);
-        return *this;
-    }
-#endif //  DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    Approx& scale(double newScale);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-    template <typename T>
-    typename detail::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale(
-            const T& newScale) {
-        m_scale = static_cast<double>(newScale);
-        return *this;
-    }
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format off
-    DOCTEST_INTERFACE friend bool operator==(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator==(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator!=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator!=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator<=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator<=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator>=(double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator>=(const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator< (double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator< (const Approx & lhs, double rhs);
-    DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs);
-    DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs);
-
-    DOCTEST_INTERFACE friend String toString(const Approx& in);
-
-#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-#define DOCTEST_APPROX_PREFIX \
-    template <typename T> friend typename detail::enable_if<std::is_constructible<double, T>::value, bool>::type
-
-    DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(double(lhs), rhs); }
-    DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); }
-    DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
-    DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); }
-    DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) || lhs == rhs; }
-    DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return double(lhs) < rhs.m_value && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < double(rhs) && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return double(lhs) > rhs.m_value && lhs != rhs; }
-    DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > double(rhs) && lhs != rhs; }
-#undef DOCTEST_APPROX_PREFIX
-#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
-
-    // clang-format on
-
-private:
-    double m_epsilon;
-    double m_scale;
-    double m_value;
-};
-
-DOCTEST_INTERFACE String toString(const Approx& in);
-
-DOCTEST_INTERFACE const ContextOptions* getContextOptions();
-
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-namespace detail {
-    // clang-format off
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    template<class T>               struct decay_array       { typedef T type; };
-    template<class T, unsigned N>   struct decay_array<T[N]> { typedef T* type; };
-    template<class T>               struct decay_array<T[]>  { typedef T* type; };
-
-    template<class T>   struct not_char_pointer              { enum { value = 1 }; };
-    template<>          struct not_char_pointer<char*>       { enum { value = 0 }; };
-    template<>          struct not_char_pointer<const char*> { enum { value = 0 }; };
-
-    template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {};
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    // clang-format on
-
-    struct DOCTEST_INTERFACE TestFailureException
-    {
-        DOCTEST_DECLARE_DEFAULTS(TestFailureException);
-        DOCTEST_DECLARE_COPIES(TestFailureException);
-    };
-
-    DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at);
-    DOCTEST_INTERFACE void throwException();
-
-    struct DOCTEST_INTERFACE Subcase
-    {
-        SubcaseSignature m_signature;
-        bool             m_entered = false;
-
-        Subcase(const char* name, const char* file, int line);
-        ~Subcase();
-
-        DOCTEST_DELETE_COPIES(Subcase);
-
-        operator bool() const;
-    };
-
-    template <typename L, typename R>
-    String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op,
-                               const DOCTEST_REF_WRAP(R) rhs) {
-        return toString(lhs) + op + toString(rhs);
-    }
-
-#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro)                              \
-    template <typename R>                                                                          \
-    DOCTEST_NOINLINE Result operator op(const DOCTEST_REF_WRAP(R) rhs) {                           \
-        bool res = op_macro(lhs, rhs);                                                             \
-        if(m_at & assertType::is_false)                                                            \
-            res = !res;                                                                            \
-        if(!res || doctest::getContextOptions()->success)                                          \
-            return Result(res, stringifyBinaryExpr(lhs, op_str, rhs));                             \
-        return Result(res);                                                                        \
-    }
-
-#define DOCTEST_FORBIT_EXPRESSION(rt, op)                                                          \
-    template <typename R>                                                                          \
-    rt& operator op(const R&) {                                                                    \
-        static_assert(deferred_false<R>::value,                                                    \
-                      "Expression Too Complex Please Rewrite As Binary Comparison!");              \
-        return *this;                                                                              \
-    }
-
-    struct DOCTEST_INTERFACE Result
-    {
-        bool   m_passed;
-        String m_decomp;
-
-        Result(bool passed, const String& decomposition = String());
-
-        DOCTEST_DECLARE_DEFAULTS(Result);
-        DOCTEST_DECLARE_COPIES(Result);
-
-        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence
-        DOCTEST_FORBIT_EXPRESSION(Result, &)
-        DOCTEST_FORBIT_EXPRESSION(Result, ^)
-        DOCTEST_FORBIT_EXPRESSION(Result, |)
-        DOCTEST_FORBIT_EXPRESSION(Result, &&)
-        DOCTEST_FORBIT_EXPRESSION(Result, ||)
-        DOCTEST_FORBIT_EXPRESSION(Result, ==)
-        DOCTEST_FORBIT_EXPRESSION(Result, !=)
-        DOCTEST_FORBIT_EXPRESSION(Result, <)
-        DOCTEST_FORBIT_EXPRESSION(Result, >)
-        DOCTEST_FORBIT_EXPRESSION(Result, <=)
-        DOCTEST_FORBIT_EXPRESSION(Result, >=)
-        DOCTEST_FORBIT_EXPRESSION(Result, =)
-        DOCTEST_FORBIT_EXPRESSION(Result, +=)
-        DOCTEST_FORBIT_EXPRESSION(Result, -=)
-        DOCTEST_FORBIT_EXPRESSION(Result, *=)
-        DOCTEST_FORBIT_EXPRESSION(Result, /=)
-        DOCTEST_FORBIT_EXPRESSION(Result, %=)
-        DOCTEST_FORBIT_EXPRESSION(Result, <<=)
-        DOCTEST_FORBIT_EXPRESSION(Result, >>=)
-        DOCTEST_FORBIT_EXPRESSION(Result, &=)
-        DOCTEST_FORBIT_EXPRESSION(Result, ^=)
-        DOCTEST_FORBIT_EXPRESSION(Result, |=)
-    };
-
-#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-    DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
-    DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-compare")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wdouble-promotion")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wconversion")
-    //DOCTEST_CLANG_SUPPRESS_WARNING("-Wfloat-equal")
-
-    DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-    DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
-    DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-compare")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wdouble-promotion")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
-    //DOCTEST_GCC_SUPPRESS_WARNING("-Wfloat-equal")
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-    // http://stackoverflow.com/questions/39479163 what's the difference between 4018 and 4389
-    DOCTEST_MSVC_SUPPRESS_WARNING(4388) // signed/unsigned mismatch
-    DOCTEST_MSVC_SUPPRESS_WARNING(4389) // 'operator' : signed/unsigned mismatch
-    DOCTEST_MSVC_SUPPRESS_WARNING(4018) // 'expression' : signed/unsigned mismatch
-    //DOCTEST_MSVC_SUPPRESS_WARNING(4805) // 'operation' : unsafe mix of type 'type' and type 'type' in operation
-
-#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    // clang-format off
-#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_COMPARISON_RETURN_TYPE bool
-#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_COMPARISON_RETURN_TYPE typename enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type
-    inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); }
-    inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); }
-    inline bool lt(const char* lhs, const char* rhs) { return String(lhs) <  String(rhs); }
-    inline bool gt(const char* lhs, const char* rhs) { return String(lhs) >  String(rhs); }
-    inline bool le(const char* lhs, const char* rhs) { return String(lhs) <= String(rhs); }
-    inline bool ge(const char* lhs, const char* rhs) { return String(lhs) >= String(rhs); }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    // clang-format on
-
-#define DOCTEST_RELATIONAL_OP(name, op)                                                            \
-    template <typename L, typename R>                                                              \
-    DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs,                             \
-                                        const DOCTEST_REF_WRAP(R) rhs) {                           \
-        return lhs op rhs;                                                                         \
-    }
-
-    DOCTEST_RELATIONAL_OP(eq, ==)
-    DOCTEST_RELATIONAL_OP(ne, !=)
-    DOCTEST_RELATIONAL_OP(lt, <)
-    DOCTEST_RELATIONAL_OP(gt, >)
-    DOCTEST_RELATIONAL_OP(le, <=)
-    DOCTEST_RELATIONAL_OP(ge, >=)
-
-#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_CMP_EQ(l, r) l == r
-#define DOCTEST_CMP_NE(l, r) l != r
-#define DOCTEST_CMP_GT(l, r) l > r
-#define DOCTEST_CMP_LT(l, r) l < r
-#define DOCTEST_CMP_GE(l, r) l >= r
-#define DOCTEST_CMP_LE(l, r) l <= r
-#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-#define DOCTEST_CMP_EQ(l, r) eq(l, r)
-#define DOCTEST_CMP_NE(l, r) ne(l, r)
-#define DOCTEST_CMP_GT(l, r) gt(l, r)
-#define DOCTEST_CMP_LT(l, r) lt(l, r)
-#define DOCTEST_CMP_GE(l, r) ge(l, r)
-#define DOCTEST_CMP_LE(l, r) le(l, r)
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-
-    template <typename L>
-    // cppcheck-suppress copyCtorAndEqOperator
-    struct Expression_lhs
-    {
-        L                lhs;
-        assertType::Enum m_at;
-
-        explicit Expression_lhs(L in, assertType::Enum at)
-                : lhs(in)
-                , m_at(at) {}
-
-        DOCTEST_NOINLINE operator Result() {
-            bool res = !!lhs;
-            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional
-                res = !res;
-
-            if(!res || getContextOptions()->success)
-                return Result(res, toString(lhs));
-            return Result(res);
-        }
-
-        // clang-format off
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(==, " == ", DOCTEST_CMP_EQ) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(!=, " != ", DOCTEST_CMP_NE) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>,  " >  ", DOCTEST_CMP_GT) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<,  " <  ", DOCTEST_CMP_LT) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>=, " >= ", DOCTEST_CMP_GE) //!OCLINT bitwise operator in conditional
-        DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<=, " <= ", DOCTEST_CMP_LE) //!OCLINT bitwise operator in conditional
-        // clang-format on
-
-        // forbidding some expressions based on this table: http://en.cppreference.com/w/cpp/language/operator_precedence
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &&)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ||)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, =)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, +=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, -=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, *=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, /=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, %=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^=)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |=)
-        // these 2 are unfortunate because they should be allowed - they have higher precedence over the comparisons, but the
-        // ExpressionDecomposer class uses the left shift operator to capture the left operand of the binary expression...
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<)
-        DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>)
-    };
-
-#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
-
-    struct DOCTEST_INTERFACE ExpressionDecomposer
-    {
-        assertType::Enum m_at;
-
-        ExpressionDecomposer(assertType::Enum at);
-
-        DOCTEST_DECLARE_DEFAULTS(ExpressionDecomposer);
-        DOCTEST_DELETE_COPIES(ExpressionDecomposer);
-
-        // The right operator for capturing expressions is "<=" instead of "<<" (based on the operator precedence table)
-        // but then there will be warnings from GCC about "-Wparentheses" and since "_Pragma()" is problematic this will stay for now...
-        // https://github.com/philsquared/Catch/issues/870
-        // https://github.com/philsquared/Catch/issues/565
-        template <typename L>
-        Expression_lhs<const DOCTEST_REF_WRAP(L)> operator<<(const DOCTEST_REF_WRAP(L) operand) {
-            return Expression_lhs<const DOCTEST_REF_WRAP(L)>(operand, m_at);
-        }
-    };
-
-    struct DOCTEST_INTERFACE TestSuite
-    {
-        const char* m_test_suite;
-        const char* m_description;
-        bool        m_skip;
-        bool        m_may_fail;
-        bool        m_should_fail;
-        int         m_expected_failures;
-        double      m_timeout;
-
-        DOCTEST_DECLARE_DEFAULTS(TestSuite);
-        DOCTEST_DECLARE_COPIES(TestSuite);
-
-        TestSuite& operator*(const char* in);
-
-        template <typename T>
-        TestSuite& operator*(const T& in) {
-            in.fill(*this);
-            return *this;
-        }
-    };
-
-    typedef void (*funcType)();
-
-    struct DOCTEST_INTERFACE TestCase : public TestCaseData
-    {
-        funcType m_test; // a function pointer to the test case
-
-        const char* m_type; // for templated test cases - gets appended to the real name
-        int m_template_id; // an ID used to distinguish between the different versions of a templated test case
-        String m_full_name; // contains the name (only for templated test cases!) + the template type
-
-        TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
-                 const char* type = "", int template_id = -1);
-
-        DOCTEST_DECLARE_DEFAULTS(TestCase);
-
-        TestCase(const TestCase& other);
-
-        DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
-        TestCase& operator=(const TestCase& other);
-        DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-        TestCase& operator*(const char* in);
-
-        template <typename T>
-        TestCase& operator*(const T& in) {
-            in.fill(*this);
-            return *this;
-        }
-
-        bool operator<(const TestCase& other) const;
-    };
-
-    // forward declarations of functions used by the macros
-    DOCTEST_INTERFACE int  regTest(const TestCase& tc);
-    DOCTEST_INTERFACE int  setTestSuite(const TestSuite& ts);
-    DOCTEST_INTERFACE bool isDebuggerActive();
-
-    namespace binaryAssertComparison {
-        enum Enum
-        {
-            eq = 0,
-            ne,
-            gt,
-            lt,
-            ge,
-            le
-        };
-    } // namespace binaryAssertComparison
-
-    // clang-format off
-    template <int, class L, class R> struct RelationalComparator     { bool operator()(const DOCTEST_REF_WRAP(L),     const DOCTEST_REF_WRAP(R)    ) const { return false;        } };
-    
-#define DOCTEST_BINARY_RELATIONAL_OP(n, op) \
-    template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };
-    // clang-format on
-
-    DOCTEST_BINARY_RELATIONAL_OP(0, eq)
-    DOCTEST_BINARY_RELATIONAL_OP(1, ne)
-    DOCTEST_BINARY_RELATIONAL_OP(2, gt)
-    DOCTEST_BINARY_RELATIONAL_OP(3, lt)
-    DOCTEST_BINARY_RELATIONAL_OP(4, ge)
-    DOCTEST_BINARY_RELATIONAL_OP(5, le)
-
-    struct DOCTEST_INTERFACE ResultBuilder : public AssertData
-    {
-        ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
-                      const char* exception_type = "");
-
-        DOCTEST_DECLARE_DEFAULTS(ResultBuilder);
-        DOCTEST_DELETE_COPIES(ResultBuilder);
-
-        void setResult(const Result& res);
-
-        template <int comparison, typename L, typename R>
-        DOCTEST_NOINLINE void binary_assert(const DOCTEST_REF_WRAP(L) lhs,
-                                            const DOCTEST_REF_WRAP(R) rhs) {
-            m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
-            if(m_failed || getContextOptions()->success)
-                m_decomp = stringifyBinaryExpr(lhs, ", ", rhs);
-        }
-
-        template <typename L>
-        DOCTEST_NOINLINE void unary_assert(const DOCTEST_REF_WRAP(L) val) {
-            m_failed = !val;
-
-            if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional
-                m_failed = !m_failed;
-
-            if(m_failed || getContextOptions()->success)
-                m_decomp = toString(val);
-        }
-
-        void translateException();
-
-        bool log();
-        void react() const;
-    };
-
-    namespace assertAction {
-        enum Enum
-        {
-            nothing     = 0,
-            dbgbreak    = 1,
-            shouldthrow = 2
-        };
-    } // namespace assertAction
-
-    DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);
-
-    DOCTEST_INTERFACE void decomp_assert(assertType::Enum at, const char* file, int line,
-                                         const char* expr, Result result);
-
-#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp)                                                        \
-    do {                                                                                           \
-        if(!is_running_in_test) {                                                                  \
-            if(failed) {                                                                           \
-                ResultBuilder rb(at, file, line, expr);                                            \
-                rb.m_failed = failed;                                                              \
-                rb.m_decomp = decomp;                                                              \
-                failed_out_of_a_testing_context(rb);                                               \
-                if(isDebuggerActive() && !getContextOptions()->no_breaks)                          \
-                    DOCTEST_BREAK_INTO_DEBUGGER();                                                 \
-                if(checkIfShouldThrow(at))                                                         \
-                    throwException();                                                              \
-            }                                                                                      \
-            return;                                                                                \
-        }                                                                                          \
-    } while(false)
-
-#define DOCTEST_ASSERT_IN_TESTS(decomp)                                                            \
-    ResultBuilder rb(at, file, line, expr);                                                        \
-    rb.m_failed = failed;                                                                          \
-    if(rb.m_failed || getContextOptions()->success)                                                \
-        rb.m_decomp = decomp;                                                                      \
-    if(rb.log())                                                                                   \
-        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \
-    if(rb.m_failed && checkIfShouldThrow(at))                                                      \
-    throwException()
-
-    template <int comparison, typename L, typename R>
-    DOCTEST_NOINLINE void binary_assert(assertType::Enum at, const char* file, int line,
-                                        const char* expr, const DOCTEST_REF_WRAP(L) lhs,
-                                        const DOCTEST_REF_WRAP(R) rhs) {
-        bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
-        DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
-    }
-
-    template <typename L>
-    DOCTEST_NOINLINE void unary_assert(assertType::Enum at, const char* file, int line,
-                                       const char* expr, const DOCTEST_REF_WRAP(L) val) {
-        bool failed = !val;
-
-        if(at & assertType::is_false) //!OCLINT bitwise operator in conditional
-            failed = !failed;
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(toString(val));
-        DOCTEST_ASSERT_IN_TESTS(toString(val));
-    }
-
-    struct DOCTEST_INTERFACE IExceptionTranslator
-    {
-        DOCTEST_DELETE_COPIES(IExceptionTranslator);
-
-        IExceptionTranslator();
-        virtual ~IExceptionTranslator();
-        virtual bool translate(String&) const = 0;
-    };
-
-    template <typename T>
-    class ExceptionTranslator : public IExceptionTranslator //!OCLINT destructor of virtual class
-    {
-    public:
-        explicit ExceptionTranslator(String (*translateFunction)(T))
-                : m_translateFunction(translateFunction) {}
-
-        bool translate(String& res) const {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-            try {
-                throw;
-                // cppcheck-suppress catchExceptionByValue
-            } catch(T ex) {                    // NOLINT
-                res = m_translateFunction(ex); //!OCLINT parameter reassignment
-                return true;
-            } catch(...) {} //!OCLINT -  empty catch statement
-#endif                      // DOCTEST_CONFIG_NO_EXCEPTIONS
-            ((void)res);    // to silence -Wunused-parameter
-            return false;
-        }
-
-    private:
-        String (*m_translateFunction)(T);
-    };
-
-    DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et);
-
-    // FIX FOR VISUAL STUDIO VERSIONS PRIOR TO 2015 - they failed to compile the call to operator<< with
-    // std::ostream passed as a reference noting that there is a use of an undefined type (which there isn't)
-    DOCTEST_INTERFACE void writeStringToStream(std::ostream* s, const String& str);
-
-    template <bool C>
-    struct StringStreamBase
-    {
-        template <typename T>
-        static void convert(std::ostream* s, const T& in) {
-            writeStringToStream(s, toString(in));
-        }
-
-        // always treat char* as a string in this context - no matter
-        // if DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING is defined
-        static void convert(std::ostream* s, const char* in) { writeStringToStream(s, String(in)); }
-    };
-
-    template <>
-    struct StringStreamBase<true>
-    {
-        template <typename T>
-        static void convert(std::ostream* s, const T& in) {
-            *s << in;
-        }
-    };
-
-    template <typename T>
-    struct StringStream : public StringStreamBase<has_insertion_operator<T>::value>
-    {};
-
-    template <typename T>
-    void toStream(std::ostream* s, const T& value) {
-        StringStream<T>::convert(s, value);
-    }
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char* in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, const char* in);
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    DOCTEST_INTERFACE void toStream(std::ostream* s, bool in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, float in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, double in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, double long in);
-
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char signed in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, char unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int short in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int short unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long unsigned in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long in);
-    DOCTEST_INTERFACE void toStream(std::ostream* s, int long long unsigned in);
-
-    class DOCTEST_INTERFACE ContextBuilder
-    {
-        friend class ContextScope;
-
-        struct DOCTEST_INTERFACE ICapture
-        {
-            DOCTEST_DELETE_COPIES(ICapture);
-            ICapture();
-            virtual ~ICapture();
-            virtual void toStream(std::ostream*) const = 0;
-        };
-
-        template <typename T>
-        struct Capture : public ICapture //!OCLINT destructor of virtual class
-        {
-            const T* capture;
-
-            explicit Capture(const T* in)
-                    : capture(in) {}
-            void toStream(std::ostream* s) const override { detail::toStream(s, *capture); }
-        };
-
-        struct DOCTEST_INTERFACE Chunk
-        {
-            char buf[sizeof(Capture<char>)] DOCTEST_ALIGNMENT(
-                    2 * sizeof(void*)); // place to construct a Capture<T>
-
-            DOCTEST_DECLARE_DEFAULTS(Chunk);
-            DOCTEST_DELETE_COPIES(Chunk);
-        };
-
-        struct DOCTEST_INTERFACE Node
-        {
-            Chunk chunk;
-            Node* next;
-
-            DOCTEST_DECLARE_DEFAULTS(Node);
-            DOCTEST_DELETE_COPIES(Node);
-        };
-
-        Chunk stackChunks[DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK];
-        int   numCaptures = 0;
-        Node* head        = nullptr;
-        Node* tail        = nullptr;
-
-        ContextBuilder(ContextBuilder& other);
-
-        ContextBuilder& operator=(const ContextBuilder&) = delete;
-
-        void stringify(std::ostream* s) const;
-
-    public:
-        ContextBuilder();
-        ~ContextBuilder();
-
-        template <typename T>
-        DOCTEST_NOINLINE ContextBuilder& operator<<(T& in) {
-            Capture<T> temp(&in);
-
-            // construct either on stack or on heap
-            // copy the bytes for the whole object - including the vtable because we cant construct
-            // the object directly in the buffer using placement new - need the <new> header...
-            if(numCaptures < DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK) {
-                my_memcpy(stackChunks[numCaptures].buf, &temp, sizeof(Chunk));
-            } else {
-                auto curr  = new Node;
-                curr->next = nullptr;
-                if(tail) {
-                    tail->next = curr;
-                    tail       = curr;
-                } else {
-                    head = tail = curr;
-                }
-
-                my_memcpy(tail->chunk.buf, &temp, sizeof(Chunk));
-            }
-            ++numCaptures;
-            return *this;
-        }
-
-        template <typename T>
-        ContextBuilder& operator<<(const T&&) {
-            static_assert(deferred_false<T>::value,
-                          "Cannot pass temporaries or rvalues to the streaming operator because it "
-                          "caches pointers to the passed objects for lazy evaluation!");
-            return *this;
-        }
-    };
-
-    class DOCTEST_INTERFACE ContextScope : public IContextScope
-    {
-        ContextBuilder contextBuilder;
-
-    public:
-        explicit ContextScope(ContextBuilder& temp);
-
-        DOCTEST_DELETE_COPIES(ContextScope);
-
-        ~ContextScope();
-
-        void stringify(std::ostream* s) const;
-    };
-
-    struct DOCTEST_INTERFACE MessageBuilder : public MessageData
-    {
-        std::ostream* m_stream;
-
-        MessageBuilder(const char* file, int line, assertType::Enum severity);
-        MessageBuilder() = delete;
-        ~MessageBuilder();
-
-        DOCTEST_DELETE_COPIES(MessageBuilder);
-
-        template <typename T>
-        MessageBuilder& operator<<(const T& in) {
-            toStream(m_stream, in);
-            return *this;
-        }
-
-        bool log();
-        void react();
-    };
-} // namespace detail
-
-#define DOCTEST_DEFINE_DECORATOR(name, type, def)                                                  \
-    struct name                                                                                    \
-    {                                                                                              \
-        type data;                                                                                 \
-        name(type in = def)                                                                        \
-                : data(in) {}                                                                      \
-        void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; }           \
-        void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; }          \
-    }
-
-DOCTEST_DEFINE_DECORATOR(test_suite, const char*, "");
-DOCTEST_DEFINE_DECORATOR(description, const char*, "");
-DOCTEST_DEFINE_DECORATOR(skip, bool, true);
-DOCTEST_DEFINE_DECORATOR(timeout, double, 0);
-DOCTEST_DEFINE_DECORATOR(may_fail, bool, true);
-DOCTEST_DEFINE_DECORATOR(should_fail, bool, true);
-DOCTEST_DEFINE_DECORATOR(expected_failures, int, 0);
-
-template <typename T>
-int registerExceptionTranslator(String (*translateFunction)(T)) {
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")
-    static detail::ExceptionTranslator<T> exceptionTranslator(translateFunction);
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    detail::registerExceptionTranslatorImpl(&exceptionTranslator);
-    return 0;
-}
-
-} // namespace doctest
-
-// in a separate namespace outside of doctest because the DOCTEST_TEST_SUITE macro
-// introduces an anonymous namespace in which getCurrentTestSuite gets overridden
-namespace doctest_detail_test_suite_ns {
-DOCTEST_INTERFACE doctest::detail::TestSuite& getCurrentTestSuite();
-} // namespace doctest_detail_test_suite_ns
-
-namespace doctest {
-#else  // DOCTEST_CONFIG_DISABLE
-template <typename T>
-int registerExceptionTranslator(String (*)(T)) {
-    return 0;
-}
-#endif // DOCTEST_CONFIG_DISABLE
-
-namespace detail {
-    typedef void (*assert_handler)(const AssertData&);
-    struct ContextState;
-} // namespace detail
-
-class DOCTEST_INTERFACE Context
-{
-    detail::ContextState* p;
-
-    void parseArgs(int argc, const char* const* argv, bool withDefaults = false);
-
-public:
-    explicit Context(int argc = 0, const char* const* argv = nullptr);
-
-    DOCTEST_DELETE_COPIES(Context);
-
-    ~Context();
-
-    void applyCommandLine(int argc, const char* const* argv);
-
-    void addFilter(const char* filter, const char* value);
-    void clearFilters();
-    void setOption(const char* option, int value);
-    void setOption(const char* option, const char* value);
-
-    bool shouldExit();
-
-    void setAsDefaultForAssertsOutOfTestCases();
-
-    void setAssertHandler(detail::assert_handler ah);
-
-    int run();
-};
-
-namespace TestCaseFailureReason {
-    enum Enum
-    {
-        None                     = 0,
-        AssertFailure            = 1,   // an assertion has failed in the test case
-        Exception                = 2,   // test case threw an exception
-        Crash                    = 4,   // a crash...
-        TooManyFailedAsserts     = 8,   // the abort-after option
-        Timeout                  = 16,  // see the timeout decorator
-        ShouldHaveFailedButDidnt = 32,  // see the should_fail decorator
-        ShouldHaveFailedAndDid   = 64,  // see the should_fail decorator
-        DidntFailExactlyNumTimes = 128, // see the expected_failures decorator
-        FailedExactlyNumTimes    = 256, // see the expected_failures decorator
-        CouldHaveFailedAndDid    = 512  // see the may_fail decorator
-    };
-} // namespace TestCaseFailureReason
-
-struct DOCTEST_INTERFACE CurrentTestCaseStats
-{
-    int    numAssertsForCurrentTestCase;
-    int    numAssertsFailedForCurrentTestCase;
-    double seconds_so_far;
-    int    failure_flags; // use TestCaseFailureReason::Enum
-    String error_string;
-    bool   should_reenter; // means we are not done with the test case because of subcases
-
-    DOCTEST_DECLARE_DEFAULTS(CurrentTestCaseStats);
-    DOCTEST_DELETE_COPIES(CurrentTestCaseStats);
-};
-
-struct DOCTEST_INTERFACE TestRunStats
-{
-    unsigned numTestCases;
-    unsigned numTestCasesPassingFilters;
-    unsigned numTestSuitesPassingFilters;
-    unsigned numTestCasesFailed;
-    int      numAsserts;
-    int      numAssertsFailed;
-
-    DOCTEST_DECLARE_DEFAULTS(TestRunStats);
-    DOCTEST_DELETE_COPIES(TestRunStats);
-};
-
-struct DOCTEST_INTERFACE IReporter
-{
-    // called when the whole test run starts (safe to cache a pointer to the input)
-    virtual void test_run_start(const ContextOptions&) = 0;
-    // called when the whole test run ends (caching a pointer to the input doesn't make sense here)
-    virtual void test_run_end(const TestRunStats&) = 0;
-
-    // called when a test case is started (safe to cache a pointer to the input)
-    virtual void test_case_start(const TestCaseData&) = 0;
-    // called when a test case has ended - could be re-entered if more subcases have to be
-    // traversed - check CurrentTestCaseStats::should_reenter (caching a pointer to the input doesn't make sense here)
-    virtual void test_case_end(const CurrentTestCaseStats&) = 0;
-
-    // called whenever a subcase is entered (don't cache pointers to the input)
-    virtual void subcase_start(const SubcaseSignature&) = 0;
-    // called whenever a subcase is exited (don't cache pointers to the input)
-    virtual void subcase_end(const SubcaseSignature&) = 0;
-
-    // called for each assert (don't cache pointers to the input)
-    virtual void log_assert(const AssertData&) = 0;
-    // called for each message (don't cache pointers to the input)
-    virtual void log_message(const MessageData&) = 0;
-
-    // called when a test case is skipped either because it doesn't pass the filters, has a skip decorator
-    // or isn't in the execution range (between first and last) (safe to cache a pointer to the input)
-    virtual void test_case_skipped(const TestCaseData&) = 0;
-
-    // doctest will not be managing the lifetimes of reporters given to it but this would still be nice to have
-    virtual ~IReporter();
-
-    // can obtain all currently active contexts and stringify them if one wishes to do so
-    static int                         get_num_active_contexts();
-    static const IContextScope* const* get_active_contexts();
-
-    // can iterate through contexts which have been stringified automatically in their destructors when an exception has been thrown
-    static int           get_num_stringified_contexts();
-    static const String* get_stringified_contexts();
-};
-
-int registerReporter(const char* name, int priority, IReporter& r);
-
-} // namespace doctest
-
-// if registering is not disabled
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-// common code in asserts - for convenience
-#define DOCTEST_ASSERT_LOG_AND_REACT(b)                                                            \
-    if(b.log())                                                                                    \
-        DOCTEST_BREAK_INTO_DEBUGGER();                                                             \
-    b.react()
-
-#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#define DOCTEST_WRAP_IN_TRY(x) x;
-#else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-#define DOCTEST_WRAP_IN_TRY(x)                                                                     \
-    try {                                                                                          \
-        x;                                                                                         \
-    } catch(...) { _DOCTEST_RB.translateException(); }
-#endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
-
-// registers the test by initializing a dummy var with a function
-#define DOCTEST_REGISTER_FUNCTION(f, decorators)                                                   \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) = doctest::detail::regTest(  \
-            doctest::detail::TestCase(f, __FILE__, __LINE__,                                       \
-                                      doctest_detail_test_suite_ns::getCurrentTestSuite()) *       \
-            decorators);                                                                           \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()
-
-#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators)                                     \
-    namespace {                                                                                    \
-        struct der : public base                                                                   \
-        {                                                                                          \
-            void f();                                                                              \
-        };                                                                                         \
-        static void func() {                                                                       \
-            der v;                                                                                 \
-            v.f();                                                                                 \
-        }                                                                                          \
-        DOCTEST_REGISTER_FUNCTION(func, decorators)                                                \
-    }                                                                                              \
-    inline DOCTEST_NOINLINE void der::f()
-
-#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators)                                        \
-    static void f();                                                                               \
-    DOCTEST_REGISTER_FUNCTION(f, decorators)                                                       \
-    static void f()
-
-// for registering tests
-#define DOCTEST_TEST_CASE(decorators)                                                              \
-    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)
-
-// for registering tests with a fixture
-#define DOCTEST_TEST_CASE_FIXTURE(c, decorators)                                                   \
-    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), c,                          \
-                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators)
-
-// for converting types to strings without the <typeinfo> header and demangling
-#define DOCTEST_TYPE_TO_STRING_IMPL(...)                                                           \
-    template <>                                                                                    \
-    inline const char* type_to_string<__VA_ARGS__>() {                                             \
-        return "<" #__VA_ARGS__ ">";                                                               \
-    }
-#define DOCTEST_TYPE_TO_STRING(...)                                                                \
-    namespace doctest { namespace detail {                                                         \
-            DOCTEST_TYPE_TO_STRING_IMPL(__VA_ARGS__)                                               \
-        }                                                                                          \
-    }                                                                                              \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for typed tests
-#define DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(func, type, decorators, idx)                         \
-    doctest::detail::regTest(                                                                      \
-            doctest::detail::TestCase(func, __FILE__, __LINE__,                                    \
-                                      doctest_detail_test_suite_ns::getCurrentTestSuite(),         \
-                                      doctest::detail::type_to_string<type>(), idx) *              \
-            decorators)
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, id, anon)                                   \
-    template <typename T>                                                                          \
-    inline void anon();                                                                            \
-    template <typename Type, typename... Rest>                                                     \
-    struct DOCTEST_CAT(id, ITERATOR)                                                               \
-    {                                                                                              \
-        DOCTEST_CAT(id, ITERATOR)(int line, int index) {                                           \
-            DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(anon<Type>, Type, dec, line * 1000 + index);     \
-            DOCTEST_CAT(id, ITERATOR)<Rest...>(line, index + 1);                                   \
-        }                                                                                          \
-    };                                                                                             \
-    template <typename Type>                                                                       \
-    struct DOCTEST_CAT(id, ITERATOR)<Type>                                                         \
-    {                                                                                              \
-        DOCTEST_CAT(id, ITERATOR)(int line, int index) {                                           \
-            DOCTEST_REGISTER_TYPED_TEST_CASE_IMPL(anon<Type>, Type, dec, line * 1000 + index);     \
-        }                                                                                          \
-    }
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, id, anon)                             \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, id, anon);                                      \
-    template <typename T>                                                                          \
-    inline void anon()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id)                                              \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_))
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...)                                 \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY)) = []() {                                  \
-        DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__> DOCTEST_UNUSED DOCTEST_CAT(anon, inner_dummy)(      \
-                __LINE__, 0);                                                                      \
-        return 0;                                                                                  \
-    }();                                                                                           \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...)                                            \
-    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_),         \
-                                                __VA_ARGS__)                                       \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-#define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...)                                         \
-    DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL_PROXY(dec, T, anon, anon);                              \
-    DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, __VA_ARGS__)                           \
-    template <typename T>                                                                          \
-    inline void anon()
-
-#define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...)                                                    \
-    DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__)
-
-// for subcases
-#define DOCTEST_SUBCASE(name)                                                                      \
-    if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \
-               doctest::detail::Subcase(name, __FILE__, __LINE__))
-
-// for grouping tests in test suites by using code blocks
-#define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name)                                               \
-    namespace ns_name { namespace doctest_detail_test_suite_ns {                                   \
-            static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() {            \
-                DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640)                                      \
-                DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")                \
-                static doctest::detail::TestSuite data;                                            \
-                static bool                       inited = false;                                  \
-                DOCTEST_MSVC_SUPPRESS_WARNING_POP                                                  \
-                DOCTEST_CLANG_SUPPRESS_WARNING_POP                                                 \
-                if(!inited) {                                                                      \
-                    data* decorators;                                                              \
-                    inited = true;                                                                 \
-                }                                                                                  \
-                return data;                                                                       \
-            }                                                                                      \
-        }                                                                                          \
-    }                                                                                              \
-    namespace ns_name
-
-#define DOCTEST_TEST_SUITE(decorators)                                                             \
-    DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUITE_))
-
-// for starting a testsuite block
-#define DOCTEST_TEST_SUITE_BEGIN(decorators)                                                       \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \
-            doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators);              \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for ending a testsuite block
-#define DOCTEST_TEST_SUITE_END                                                                     \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) =                            \
-            doctest::detail::setTestSuite(doctest::detail::TestSuite() * "");                      \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for registering exception translators
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature)                      \
-    inline doctest::String translatorName(signature);                                              \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)) =                     \
-            doctest::registerExceptionTranslator(translatorName);                                  \
-    DOCTEST_GLOBAL_NO_WARNINGS_END()                                                               \
-    doctest::String translatorName(signature)
-
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \
-    DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_),       \
-                                               signature)
-
-// for registering
-#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)                                        \
-    DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) =                       \
-            doctest::registerReporter(name, priority, reporter);                                   \
-    DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for logging
-#define DOCTEST_INFO(x)                                                                            \
-    doctest::detail::ContextScope DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_)(                            \
-            doctest::detail::ContextBuilder() << x)
-#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := " << x)
-
-#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, x)                                               \
-    do {                                                                                           \
-        doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type);                 \
-        mb << x;                                                                                   \
-        DOCTEST_ASSERT_LOG_AND_REACT(mb);                                                          \
-    } while((void)0, 0)
-
-// clang-format off
-#define DOCTEST_ADD_MESSAGE_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-#define DOCTEST_ADD_FAIL_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x)
-// clang-format on
-
-#define DOCTEST_MESSAGE(x) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, x)
-#define DOCTEST_FAIL_CHECK(x) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, x)
-#define DOCTEST_FAIL(x) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, x)
-
-// hack for macros like INFO() that require lvalues
-#if __cplusplus >= 201402L || (DOCTEST_MSVC >= DOCTEST_COMPILER(19, 10, 0))
-template <class T, T x>
-constexpr T to_lvalue = x;
-#define DOCTEST_TO_LVALUE(...) to_lvalue<decltype(__VA_ARGS__), __VA_ARGS__>
-#else // TO_LVALUE
-#define DOCTEST_TO_LVALUE(...) TO_LVALUE_CAN_BE_USED_ONLY_IN_CPP14_MODE_OR_WITH_VS_2017_OR_NEWER
-#endif // TO_LVALUE
-
-#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...)                                               \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses")                  \
-    doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,         \
-                                               __LINE__, #__VA_ARGS__);                            \
-    DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.setResult(                                                     \
-            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \
-            << __VA_ARGS__))                                                                       \
-    DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB)                                                      \
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \
-    do {                                                                                           \
-        DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__);                                      \
-    } while((void)0, 0)
-
-#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...)                                               \
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses")                  \
-    doctest::detail::decomp_assert(                                                                \
-            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__,                    \
-            doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type)                \
-                    << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)
-#define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)
-#define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)
-#define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)
-#define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)
-#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
-
-// clang-format off
-#define DOCTEST_WARN_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } while((void)0, 0)
-#define DOCTEST_CHECK_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } while((void)0, 0)
-#define DOCTEST_REQUIRE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } while((void)0, 0)
-#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } while((void)0, 0)
-#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } while((void)0, 0)
-#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } while((void)0, 0)
-// clang-format on
-
-#define DOCTEST_ASSERT_THROWS(expr, assert_type)                                                   \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr);                           \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(...) { _DOCTEST_RB.m_threw = true; }                                           \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, ...)                                           \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr, #__VA_ARGS__);             \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(const doctest::detail::remove_const<                                           \
-                    doctest::detail::remove_reference<__VA_ARGS__>::type>::type&) {                \
-                _DOCTEST_RB.m_threw    = true;                                                     \
-                _DOCTEST_RB.m_threw_as = true;                                                     \
-            } catch(...) { _DOCTEST_RB.translateException(); }                                     \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_THROWS_WITH(expr, assert_type, ...)                                         \
-    do {                                                                                           \
-        if(!doctest::getContextOptions()->no_throw) {                                              \
-            doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
-                                                       __LINE__, #expr, __VA_ARGS__);              \
-            try {                                                                                  \
-                expr;                                                                              \
-            } catch(...) { _DOCTEST_RB.translateException(); }                                     \
-            DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                             \
-        }                                                                                          \
-    } while((void)0, 0)
-
-#define DOCTEST_ASSERT_NOTHROW(expr, assert_type)                                                  \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #expr);                               \
-        try {                                                                                      \
-            expr;                                                                                  \
-        } catch(...) { _DOCTEST_RB.translateException(); }                                         \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-// clang-format off
-#define DOCTEST_WARN_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_WARN_THROWS)
-#define DOCTEST_CHECK_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_CHECK_THROWS)
-#define DOCTEST_REQUIRE_THROWS(expr) DOCTEST_ASSERT_THROWS(expr, DT_REQUIRE_THROWS)
-
-#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, __VA_ARGS__)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, __VA_ARGS__)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, __VA_ARGS__)
-
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS_WITH, __VA_ARGS__)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)
-
-#define DOCTEST_WARN_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_WARN_NOTHROW)
-#define DOCTEST_CHECK_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_CHECK_NOTHROW)
-#define DOCTEST_REQUIRE_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_REQUIRE_NOTHROW)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS(expr); } while((void)0, 0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } while((void)0, 0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH(expr, ex); } while((void)0, 0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_NOTHROW(expr); } while((void)0, 0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_NOTHROW(expr); } while((void)0, 0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_NOTHROW(expr); } while((void)0, 0)
-// clang-format on
-
-#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...)                                              \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #__VA_ARGS__);                        \
-        DOCTEST_WRAP_IN_TRY(                                                                       \
-                _DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>(          \
-                        __VA_ARGS__))                                                              \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \
-    do {                                                                                           \
-        doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__,     \
-                                                   __LINE__, #__VA_ARGS__);                        \
-        DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.unary_assert(__VA_ARGS__))                                 \
-        DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB);                                                 \
-    } while((void)0, 0)
-
-#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...)                                        \
-    doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>(           \
-            doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)
-
-#define DOCTEST_UNARY_ASSERT(assert_type, ...)                                                     \
-    doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__,            \
-                                  #__VA_ARGS__, __VA_ARGS__)
-
-#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
-
-#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)
-#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)
-#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)
-#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)
-#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)
-#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)
-#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)
-#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)
-#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)
-#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)
-#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)
-#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)
-#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)
-#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)
-#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)
-#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)
-#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)
-#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)
-
-#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)
-#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)
-#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)
-#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)
-#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)
-#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS
-
-#undef DOCTEST_WARN_THROWS
-#undef DOCTEST_CHECK_THROWS
-#undef DOCTEST_REQUIRE_THROWS
-#undef DOCTEST_WARN_THROWS_AS
-#undef DOCTEST_CHECK_THROWS_AS
-#undef DOCTEST_REQUIRE_THROWS_AS
-#undef DOCTEST_WARN_THROWS_WITH
-#undef DOCTEST_CHECK_THROWS_WITH
-#undef DOCTEST_REQUIRE_THROWS_WITH
-#undef DOCTEST_WARN_NOTHROW
-#undef DOCTEST_CHECK_NOTHROW
-#undef DOCTEST_REQUIRE_NOTHROW
-
-#undef DOCTEST_WARN_THROWS_MESSAGE
-#undef DOCTEST_CHECK_THROWS_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_MESSAGE
-#undef DOCTEST_WARN_THROWS_AS_MESSAGE
-#undef DOCTEST_CHECK_THROWS_AS_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_AS_MESSAGE
-#undef DOCTEST_WARN_THROWS_WITH_MESSAGE
-#undef DOCTEST_CHECK_THROWS_WITH_MESSAGE
-#undef DOCTEST_REQUIRE_THROWS_WITH_MESSAGE
-#undef DOCTEST_WARN_NOTHROW_MESSAGE
-#undef DOCTEST_CHECK_NOTHROW_MESSAGE
-#undef DOCTEST_REQUIRE_NOTHROW_MESSAGE
-
-#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#define DOCTEST_WARN_THROWS(expr) ((void)0)
-#define DOCTEST_CHECK_THROWS(expr) ((void)0)
-#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)
-#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_WARN_NOTHROW(expr) ((void)0)
-#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)
-
-#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#undef DOCTEST_REQUIRE
-#undef DOCTEST_REQUIRE_FALSE
-#undef DOCTEST_REQUIRE_MESSAGE
-#undef DOCTEST_REQUIRE_FALSE_MESSAGE
-#undef DOCTEST_REQUIRE_EQ
-#undef DOCTEST_REQUIRE_NE
-#undef DOCTEST_REQUIRE_GT
-#undef DOCTEST_REQUIRE_LT
-#undef DOCTEST_REQUIRE_GE
-#undef DOCTEST_REQUIRE_LE
-#undef DOCTEST_REQUIRE_UNARY
-#undef DOCTEST_REQUIRE_UNARY_FALSE
-
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
-
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-// =================================================================================================
-// == WHAT FOLLOWS IS VERSIONS OF THE MACROS THAT DO NOT DO ANY REGISTERING!                      ==
-// == THIS CAN BE ENABLED BY DEFINING DOCTEST_CONFIG_DISABLE GLOBALLY!                            ==
-// =================================================================================================
-#else // DOCTEST_CONFIG_DISABLE
-
-#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name)                                           \
-    namespace {                                                                                    \
-        template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                           \
-        struct der : public base                                                                   \
-        { void f(); };                                                                             \
-    }                                                                                              \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()
-
-#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name)                                              \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    static inline void f()
-
-// for registering tests
-#define DOCTEST_TEST_CASE(name)                                                                    \
-    DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)
-
-// for registering tests with a fixture
-#define DOCTEST_TEST_CASE_FIXTURE(x, name)                                                         \
-    DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), x,                          \
-                              DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name)
-
-// for converting types to strings without the <typeinfo> header and demangling
-#define DOCTEST_TYPE_TO_STRING(...) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-#define DOCTEST_TYPE_TO_STRING_IMPL(...)
-
-// for typed tests
-#define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...)                                                \
-    template <typename type>                                                                       \
-    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id)                                          \
-    template <typename type>                                                                       \
-    inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)()
-
-#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...)                                            \
-    typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for subcases
-#define DOCTEST_SUBCASE(name)
-
-// for a testsuite block
-#define DOCTEST_TEST_SUITE(name) namespace
-
-// for starting a testsuite block
-#define DOCTEST_TEST_SUITE_BEGIN(name) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-// for ending a testsuite block
-#define DOCTEST_TEST_SUITE_END typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_)
-
-#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)                                           \
-    template <typename DOCTEST_UNUSED_TEMPLATE_TYPE>                                               \
-    static inline doctest::String DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)(signature)
-
-#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
-
-#define DOCTEST_INFO(x) ((void)0)
-#define DOCTEST_CAPTURE(x) ((void)0)
-#define DOCTEST_ADD_MESSAGE_AT(file, line, x) ((void)0)
-#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) ((void)0)
-#define DOCTEST_ADD_FAIL_AT(file, line, x) ((void)0)
-#define DOCTEST_MESSAGE(x) ((void)0)
-#define DOCTEST_FAIL_CHECK(x) ((void)0)
-#define DOCTEST_FAIL(x) ((void)0)
-
-#define DOCTEST_WARN(...) ((void)0)
-#define DOCTEST_CHECK(...) ((void)0)
-#define DOCTEST_REQUIRE(...) ((void)0)
-#define DOCTEST_WARN_FALSE(...) ((void)0)
-#define DOCTEST_CHECK_FALSE(...) ((void)0)
-#define DOCTEST_REQUIRE_FALSE(...) ((void)0)
-
-#define DOCTEST_WARN_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_CHECK_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_REQUIRE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) ((void)0)
-#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) ((void)0)
-
-#define DOCTEST_WARN_THROWS(expr) ((void)0)
-#define DOCTEST_CHECK_THROWS(expr) ((void)0)
-#define DOCTEST_REQUIRE_THROWS(expr) ((void)0)
-#define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0)
-#define DOCTEST_WARN_NOTHROW(expr) ((void)0)
-#define DOCTEST_CHECK_NOTHROW(expr) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0)
-
-#define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, ex, msg) ((void)0)
-#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0)
-#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0)
-
-#define DOCTEST_WARN_EQ(...) ((void)0)
-#define DOCTEST_CHECK_EQ(...) ((void)0)
-#define DOCTEST_REQUIRE_EQ(...) ((void)0)
-#define DOCTEST_WARN_NE(...) ((void)0)
-#define DOCTEST_CHECK_NE(...) ((void)0)
-#define DOCTEST_REQUIRE_NE(...) ((void)0)
-#define DOCTEST_WARN_GT(...) ((void)0)
-#define DOCTEST_CHECK_GT(...) ((void)0)
-#define DOCTEST_REQUIRE_GT(...) ((void)0)
-#define DOCTEST_WARN_LT(...) ((void)0)
-#define DOCTEST_CHECK_LT(...) ((void)0)
-#define DOCTEST_REQUIRE_LT(...) ((void)0)
-#define DOCTEST_WARN_GE(...) ((void)0)
-#define DOCTEST_CHECK_GE(...) ((void)0)
-#define DOCTEST_REQUIRE_GE(...) ((void)0)
-#define DOCTEST_WARN_LE(...) ((void)0)
-#define DOCTEST_CHECK_LE(...) ((void)0)
-#define DOCTEST_REQUIRE_LE(...) ((void)0)
-
-#define DOCTEST_WARN_UNARY(...) ((void)0)
-#define DOCTEST_CHECK_UNARY(...) ((void)0)
-#define DOCTEST_REQUIRE_UNARY(...) ((void)0)
-#define DOCTEST_WARN_UNARY_FALSE(...) ((void)0)
-#define DOCTEST_CHECK_UNARY_FALSE(...) ((void)0)
-#define DOCTEST_REQUIRE_UNARY_FALSE(...) ((void)0)
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-// clang-format off
-// KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS
-#define DOCTEST_FAST_WARN_EQ             DOCTEST_WARN_EQ
-#define DOCTEST_FAST_CHECK_EQ            DOCTEST_CHECK_EQ
-#define DOCTEST_FAST_REQUIRE_EQ          DOCTEST_REQUIRE_EQ
-#define DOCTEST_FAST_WARN_NE             DOCTEST_WARN_NE
-#define DOCTEST_FAST_CHECK_NE            DOCTEST_CHECK_NE
-#define DOCTEST_FAST_REQUIRE_NE          DOCTEST_REQUIRE_NE
-#define DOCTEST_FAST_WARN_GT             DOCTEST_WARN_GT
-#define DOCTEST_FAST_CHECK_GT            DOCTEST_CHECK_GT
-#define DOCTEST_FAST_REQUIRE_GT          DOCTEST_REQUIRE_GT
-#define DOCTEST_FAST_WARN_LT             DOCTEST_WARN_LT
-#define DOCTEST_FAST_CHECK_LT            DOCTEST_CHECK_LT
-#define DOCTEST_FAST_REQUIRE_LT          DOCTEST_REQUIRE_LT
-#define DOCTEST_FAST_WARN_GE             DOCTEST_WARN_GE
-#define DOCTEST_FAST_CHECK_GE            DOCTEST_CHECK_GE
-#define DOCTEST_FAST_REQUIRE_GE          DOCTEST_REQUIRE_GE
-#define DOCTEST_FAST_WARN_LE             DOCTEST_WARN_LE
-#define DOCTEST_FAST_CHECK_LE            DOCTEST_CHECK_LE
-#define DOCTEST_FAST_REQUIRE_LE          DOCTEST_REQUIRE_LE
-
-#define DOCTEST_FAST_WARN_UNARY          DOCTEST_WARN_UNARY
-#define DOCTEST_FAST_CHECK_UNARY         DOCTEST_CHECK_UNARY
-#define DOCTEST_FAST_REQUIRE_UNARY       DOCTEST_REQUIRE_UNARY
-#define DOCTEST_FAST_WARN_UNARY_FALSE    DOCTEST_WARN_UNARY_FALSE
-#define DOCTEST_FAST_CHECK_UNARY_FALSE   DOCTEST_CHECK_UNARY_FALSE
-#define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
-// clang-format on
-
-// BDD style macros
-// clang-format off
-#define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE("  Scenario: " name)
-#define DOCTEST_SCENARIO_TEMPLATE(name, T, ...)  DOCTEST_TEST_CASE_TEMPLATE("  Scenario: " name, T, __VA_ARGS__)
-#define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE("  Scenario: " name, T, id)
-
-#define DOCTEST_GIVEN(name)     SUBCASE("   Given: " name)
-#define DOCTEST_WHEN(name)      SUBCASE("    When: " name)
-#define DOCTEST_AND_WHEN(name)  SUBCASE("And when: " name)
-#define DOCTEST_THEN(name)      SUBCASE("    Then: " name)
-#define DOCTEST_AND_THEN(name)  SUBCASE("     And: " name)
-// clang-format on
-
-// == SHORT VERSIONS OF THE MACROS
-#if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES)
-
-#define TEST_CASE DOCTEST_TEST_CASE
-#define TEST_CASE_FIXTURE DOCTEST_TEST_CASE_FIXTURE
-#define TYPE_TO_STRING DOCTEST_TYPE_TO_STRING
-#define TEST_CASE_TEMPLATE DOCTEST_TEST_CASE_TEMPLATE
-#define TEST_CASE_TEMPLATE_DEFINE DOCTEST_TEST_CASE_TEMPLATE_DEFINE
-#define TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE
-#define SUBCASE DOCTEST_SUBCASE
-#define TEST_SUITE DOCTEST_TEST_SUITE
-#define TEST_SUITE_BEGIN DOCTEST_TEST_SUITE_BEGIN
-#define TEST_SUITE_END DOCTEST_TEST_SUITE_END
-#define REGISTER_EXCEPTION_TRANSLATOR DOCTEST_REGISTER_EXCEPTION_TRANSLATOR
-#define REGISTER_REPORTER DOCTEST_REGISTER_REPORTER
-#define INFO DOCTEST_INFO
-#define CAPTURE DOCTEST_CAPTURE
-#define ADD_MESSAGE_AT DOCTEST_ADD_MESSAGE_AT
-#define ADD_FAIL_CHECK_AT DOCTEST_ADD_FAIL_CHECK_AT
-#define ADD_FAIL_AT DOCTEST_ADD_FAIL_AT
-#define MESSAGE DOCTEST_MESSAGE
-#define FAIL_CHECK DOCTEST_FAIL_CHECK
-#define FAIL DOCTEST_FAIL
-#define TO_LVALUE DOCTEST_TO_LVALUE
-
-#define WARN DOCTEST_WARN
-#define WARN_FALSE DOCTEST_WARN_FALSE
-#define WARN_THROWS DOCTEST_WARN_THROWS
-#define WARN_THROWS_AS DOCTEST_WARN_THROWS_AS
-#define WARN_THROWS_WITH DOCTEST_WARN_THROWS_WITH
-#define WARN_NOTHROW DOCTEST_WARN_NOTHROW
-#define CHECK DOCTEST_CHECK
-#define CHECK_FALSE DOCTEST_CHECK_FALSE
-#define CHECK_THROWS DOCTEST_CHECK_THROWS
-#define CHECK_THROWS_AS DOCTEST_CHECK_THROWS_AS
-#define CHECK_THROWS_WITH DOCTEST_CHECK_THROWS_WITH
-#define CHECK_NOTHROW DOCTEST_CHECK_NOTHROW
-#define REQUIRE DOCTEST_REQUIRE
-#define REQUIRE_FALSE DOCTEST_REQUIRE_FALSE
-#define REQUIRE_THROWS DOCTEST_REQUIRE_THROWS
-#define REQUIRE_THROWS_AS DOCTEST_REQUIRE_THROWS_AS
-#define REQUIRE_THROWS_WITH DOCTEST_REQUIRE_THROWS_WITH
-#define REQUIRE_NOTHROW DOCTEST_REQUIRE_NOTHROW
-
-#define WARN_MESSAGE DOCTEST_WARN_MESSAGE
-#define WARN_FALSE_MESSAGE DOCTEST_WARN_FALSE_MESSAGE
-#define WARN_THROWS_MESSAGE DOCTEST_WARN_THROWS_MESSAGE
-#define WARN_THROWS_AS_MESSAGE DOCTEST_WARN_THROWS_AS_MESSAGE
-#define WARN_THROWS_WITH_MESSAGE DOCTEST_WARN_THROWS_WITH_MESSAGE
-#define WARN_NOTHROW_MESSAGE DOCTEST_WARN_NOTHROW_MESSAGE
-#define CHECK_MESSAGE DOCTEST_CHECK_MESSAGE
-#define CHECK_FALSE_MESSAGE DOCTEST_CHECK_FALSE_MESSAGE
-#define CHECK_THROWS_MESSAGE DOCTEST_CHECK_THROWS_MESSAGE
-#define CHECK_THROWS_AS_MESSAGE DOCTEST_CHECK_THROWS_AS_MESSAGE
-#define CHECK_THROWS_WITH_MESSAGE DOCTEST_CHECK_THROWS_WITH_MESSAGE
-#define CHECK_NOTHROW_MESSAGE DOCTEST_CHECK_NOTHROW_MESSAGE
-#define REQUIRE_MESSAGE DOCTEST_REQUIRE_MESSAGE
-#define REQUIRE_FALSE_MESSAGE DOCTEST_REQUIRE_FALSE_MESSAGE
-#define REQUIRE_THROWS_MESSAGE DOCTEST_REQUIRE_THROWS_MESSAGE
-#define REQUIRE_THROWS_AS_MESSAGE DOCTEST_REQUIRE_THROWS_AS_MESSAGE
-#define REQUIRE_THROWS_WITH_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_MESSAGE
-#define REQUIRE_NOTHROW_MESSAGE DOCTEST_REQUIRE_NOTHROW_MESSAGE
-
-#define SCENARIO DOCTEST_SCENARIO
-#define SCENARIO_TEMPLATE DOCTEST_SCENARIO_TEMPLATE
-#define SCENARIO_TEMPLATE_DEFINE DOCTEST_SCENARIO_TEMPLATE_DEFINE
-#define GIVEN DOCTEST_GIVEN
-#define WHEN DOCTEST_WHEN
-#define AND_WHEN DOCTEST_AND_WHEN
-#define THEN DOCTEST_THEN
-#define AND_THEN DOCTEST_AND_THEN
-
-#define WARN_EQ DOCTEST_WARN_EQ
-#define CHECK_EQ DOCTEST_CHECK_EQ
-#define REQUIRE_EQ DOCTEST_REQUIRE_EQ
-#define WARN_NE DOCTEST_WARN_NE
-#define CHECK_NE DOCTEST_CHECK_NE
-#define REQUIRE_NE DOCTEST_REQUIRE_NE
-#define WARN_GT DOCTEST_WARN_GT
-#define CHECK_GT DOCTEST_CHECK_GT
-#define REQUIRE_GT DOCTEST_REQUIRE_GT
-#define WARN_LT DOCTEST_WARN_LT
-#define CHECK_LT DOCTEST_CHECK_LT
-#define REQUIRE_LT DOCTEST_REQUIRE_LT
-#define WARN_GE DOCTEST_WARN_GE
-#define CHECK_GE DOCTEST_CHECK_GE
-#define REQUIRE_GE DOCTEST_REQUIRE_GE
-#define WARN_LE DOCTEST_WARN_LE
-#define CHECK_LE DOCTEST_CHECK_LE
-#define REQUIRE_LE DOCTEST_REQUIRE_LE
-#define WARN_UNARY DOCTEST_WARN_UNARY
-#define CHECK_UNARY DOCTEST_CHECK_UNARY
-#define REQUIRE_UNARY DOCTEST_REQUIRE_UNARY
-#define WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE
-#define CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE
-#define REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
-
-// KEPT FOR BACKWARDS COMPATIBILITY
-#define FAST_WARN_EQ DOCTEST_FAST_WARN_EQ
-#define FAST_CHECK_EQ DOCTEST_FAST_CHECK_EQ
-#define FAST_REQUIRE_EQ DOCTEST_FAST_REQUIRE_EQ
-#define FAST_WARN_NE DOCTEST_FAST_WARN_NE
-#define FAST_CHECK_NE DOCTEST_FAST_CHECK_NE
-#define FAST_REQUIRE_NE DOCTEST_FAST_REQUIRE_NE
-#define FAST_WARN_GT DOCTEST_FAST_WARN_GT
-#define FAST_CHECK_GT DOCTEST_FAST_CHECK_GT
-#define FAST_REQUIRE_GT DOCTEST_FAST_REQUIRE_GT
-#define FAST_WARN_LT DOCTEST_FAST_WARN_LT
-#define FAST_CHECK_LT DOCTEST_FAST_CHECK_LT
-#define FAST_REQUIRE_LT DOCTEST_FAST_REQUIRE_LT
-#define FAST_WARN_GE DOCTEST_FAST_WARN_GE
-#define FAST_CHECK_GE DOCTEST_FAST_CHECK_GE
-#define FAST_REQUIRE_GE DOCTEST_FAST_REQUIRE_GE
-#define FAST_WARN_LE DOCTEST_FAST_WARN_LE
-#define FAST_CHECK_LE DOCTEST_FAST_CHECK_LE
-#define FAST_REQUIRE_LE DOCTEST_FAST_REQUIRE_LE
-#define FAST_WARN_UNARY DOCTEST_FAST_WARN_UNARY
-#define FAST_CHECK_UNARY DOCTEST_FAST_CHECK_UNARY
-#define FAST_REQUIRE_UNARY DOCTEST_FAST_REQUIRE_UNARY
-#define FAST_WARN_UNARY_FALSE DOCTEST_FAST_WARN_UNARY_FALSE
-#define FAST_CHECK_UNARY_FALSE DOCTEST_FAST_CHECK_UNARY_FALSE
-#define FAST_REQUIRE_UNARY_FALSE DOCTEST_FAST_REQUIRE_UNARY_FALSE
-
-#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
-
-#if !defined(DOCTEST_CONFIG_DISABLE)
-
-// this is here to clear the 'current test suite' for the current translation unit - at the top
-DOCTEST_TEST_SUITE_END();
-
-// add stringification for primitive/fundamental types
-namespace doctest { namespace detail {
-    DOCTEST_TYPE_TO_STRING_IMPL(bool)
-    DOCTEST_TYPE_TO_STRING_IMPL(float)
-    DOCTEST_TYPE_TO_STRING_IMPL(double)
-    DOCTEST_TYPE_TO_STRING_IMPL(long double)
-    DOCTEST_TYPE_TO_STRING_IMPL(char)
-    DOCTEST_TYPE_TO_STRING_IMPL(signed char)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned char)
-    DOCTEST_TYPE_TO_STRING_IMPL(wchar_t)
-    DOCTEST_TYPE_TO_STRING_IMPL(short int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned short int)
-    DOCTEST_TYPE_TO_STRING_IMPL(int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned int)
-    DOCTEST_TYPE_TO_STRING_IMPL(long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(long long int)
-    DOCTEST_TYPE_TO_STRING_IMPL(unsigned long long int)
-}} // namespace doctest::detail
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_LIBRARY_INCLUDED
diff --git a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_impl.h b/QiaoJiaSystem/UnitTest/doctest/parts/doctest_impl.h
deleted file mode 100644
index c8d3d6a..0000000
--- a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_impl.h
+++ /dev/null
@@ -1,2684 +0,0 @@
-#if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)
-#ifndef DOCTEST_LIBRARY_IMPLEMENTATION
-#define DOCTEST_LIBRARY_IMPLEMENTATION
-
-#ifndef DOCTEST_SINGLE_HEADER
-#include "doctest_fwd.h"
-#endif // DOCTEST_SINGLE_HEADER
-
-DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
-DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
-
-DOCTEST_GCC_SUPPRESS_WARNING_PUSH
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
-DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Winline")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
-DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
-
-DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
-DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
-DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
-DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data
-DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
-DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
-DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
-DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled
-DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified
-DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal
-DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch
-DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding in structs
-DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
-DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C
-DOCTEST_MSVC_SUPPRESS_WARNING(5045) // Spectre mitigation stuff
-DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
-DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)
-// static analysis
-DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
-DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
-DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
-DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtor...
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
-
-// required includes - will go only in one translation unit!
-#include <ctime>
-#include <cmath>
-#include <climits>
-// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/onqtam/doctest/pull/37
-#ifdef __BORLANDC__
-#include <math.h>
-#endif // __BORLANDC__
-#include <new>
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <limits>
-#include <utility>
-#include <sstream>
-#include <iostream>
-#include <algorithm>
-#include <iomanip>
-#include <vector>
-#include <atomic>
-#include <mutex>
-#include <set>
-#include <map>
-#include <exception>
-#include <stdexcept>
-#include <csignal>
-#include <cfloat>
-#include <cctype>
-#include <cstdint>
-
-#ifdef DOCTEST_PLATFORM_MAC
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/sysctl.h>
-#endif // DOCTEST_PLATFORM_MAC
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
-
-// counts the number of elements in a C array
-#define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
-
-#ifdef DOCTEST_CONFIG_DISABLE
-#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled
-#else // DOCTEST_CONFIG_DISABLE
-#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled
-#endif // DOCTEST_CONFIG_DISABLE
-
-#ifndef DOCTEST_CONFIG_OPTIONS_PREFIX
-#define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-"
-#endif
-
-#ifndef DOCTEST_THREAD_LOCAL
-#define DOCTEST_THREAD_LOCAL thread_local
-#endif
-
-#ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-#define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX
-#else
-#define DOCTEST_OPTIONS_PREFIX_DISPLAY ""
-#endif
-
-namespace doctest {
-
-bool is_running_in_test = false;
-
-namespace {
-    using namespace detail;
-    // case insensitive strcmp
-    int stricmp(const char* a, const char* b) {
-        for(;; a++, b++) {
-            const int d = tolower(*a) - tolower(*b);
-            if(d != 0 || !*a)
-                return d;
-        }
-    }
-
-    template <typename T>
-    String fpToString(T value, int precision) {
-        std::ostringstream oss;
-        oss << std::setprecision(precision) << std::fixed << value;
-        std::string d = oss.str();
-        size_t      i = d.find_last_not_of('0');
-        if(i != std::string::npos && i != d.size() - 1) {
-            if(d[i] == '.')
-                i++;
-            d = d.substr(0, i + 1);
-        }
-        return d.c_str();
-    }
-
-    struct Endianness
-    {
-        enum Arch
-        {
-            Big,
-            Little
-        };
-
-        static Arch which() {
-            union _
-            {
-                int  asInt;
-                char asChar[sizeof(int)];
-            } u;
-
-            u.asInt = 1;                                            // NOLINT
-            return (u.asChar[sizeof(int) - 1] == 1) ? Big : Little; // NOLINT
-        }
-    };
-} // namespace
-
-namespace detail {
-    void my_memcpy(void* dest, const void* src, unsigned num) { memcpy(dest, src, num); }
-
-    String rawMemoryToString(const void* object, unsigned size) {
-        // Reverse order for little endian architectures
-        int i = 0, end = static_cast<int>(size), inc = 1;
-        if(Endianness::which() == Endianness::Little) {
-            i   = end - 1;
-            end = inc = -1;
-        }
-
-        unsigned const char* bytes = static_cast<unsigned const char*>(object);
-        std::ostringstream   oss;
-        oss << "0x" << std::setfill('0') << std::hex;
-        for(; i != end; i += inc)
-            oss << std::setw(2) << static_cast<unsigned>(bytes[i]);
-        return oss.str().c_str();
-    }
-
-    DOCTEST_THREAD_LOCAL std::ostringstream g_oss;
-
-    std::ostream* getTlsOss() {
-        g_oss.clear(); // there shouldn't be anything worth clearing in the flags
-        g_oss.str(""); // the slow way of resetting a string stream
-        //g_oss.seekp(0); // optimal reset - as seen here: https://stackoverflow.com/a/624291/3162383
-        return &g_oss;
-    }
-
-    String getTlsOssResult() {
-        //g_oss << std::ends; // needed - as shown here: https://stackoverflow.com/a/624291/3162383
-        return g_oss.str().c_str();
-    }
-
-#ifndef DOCTEST_CONFIG_DISABLE
-    // this holds both parameters from the command line and runtime data for tests
-    struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats
-    {
-        std::atomic<int> numAssertsForCurrentTestCase_atomic;
-        std::atomic<int> numAssertsFailedForCurrentTestCase_atomic;
-
-        std::vector<std::vector<String> > filters = decltype(filters)(9); // 9 different filters
-
-        std::vector<IReporter*> reporters_currently_used;
-
-        const TestCase* currentTest = nullptr;
-
-        assert_handler ah = nullptr;
-
-        std::vector<String> stringifiedContexts; // logging from INFO() due to an exception
-
-        // stuff for subcases
-        std::set<SubcaseSignature> subcasesPassed;
-        std::set<int>              subcasesEnteredLevels;
-        int                        subcasesCurrentLevel;
-
-        void resetRunData() {
-            numTestCases                = 0;
-            numTestCasesPassingFilters  = 0;
-            numTestSuitesPassingFilters = 0;
-            numTestCasesFailed          = 0;
-            numAsserts                  = 0;
-            numAssertsFailed            = 0;
-        }
-    };
-
-    ContextState*             g_cs = nullptr;
-    DOCTEST_THREAD_LOCAL bool g_no_colors; // used to avoid locks for the debug output
-
-#endif // DOCTEST_CONFIG_DISABLE
-} // namespace detail
-
-void String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }
-void String::setLast(unsigned in) { buf[last] = char(in); }
-
-void String::copy(const String& other) {
-    if(other.isOnStack()) {
-        memcpy(buf, other.buf, len);
-    } else {
-        setOnHeap();
-        data.size     = other.data.size;
-        data.capacity = data.size + 1;
-        data.ptr      = new char[data.capacity];
-        memcpy(data.ptr, other.data.ptr, data.size + 1);
-    }
-}
-
-String::String() {
-    buf[0] = '\0';
-    setLast();
-}
-
-String::~String() {
-    if(!isOnStack())
-        delete[] data.ptr;
-}
-
-String::String(const char* in)
-        : String(in, strlen(in)) {}
-
-String::String(const char* in, unsigned in_size) {
-    if(in_size <= last) {
-        memcpy(buf, in, in_size + 1);
-        setLast(last - in_size);
-    } else {
-        setOnHeap();
-        data.size     = in_size;
-        data.capacity = data.size + 1;
-        data.ptr      = new char[data.capacity];
-        memcpy(data.ptr, in, in_size + 1);
-    }
-}
-
-String::String(const String& other) { copy(other); }
-
-String& String::operator=(const String& other) {
-    if(this != &other) {
-        if(!isOnStack())
-            delete[] data.ptr;
-
-        copy(other);
-    }
-
-    return *this;
-}
-
-String& String::operator+=(const String& other) {
-    const unsigned my_old_size = size();
-    const unsigned other_size  = other.size();
-    const unsigned total_size  = my_old_size + other_size;
-    if(isOnStack()) {
-        if(total_size < len) {
-            // append to the current stack space
-            memcpy(buf + my_old_size, other.c_str(), other_size + 1);
-            setLast(last - total_size);
-        } else {
-            // alloc new chunk
-            char* temp = new char[total_size + 1];
-            // copy current data to new location before writing in the union
-            memcpy(temp, buf, my_old_size); // skip the +1 ('\0') for speed
-            // update data in union
-            setOnHeap();
-            data.size     = total_size;
-            data.capacity = data.size + 1;
-            data.ptr      = temp;
-            // transfer the rest of the data
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        }
-    } else {
-        if(data.capacity > total_size) {
-            // append to the current heap block
-            data.size = total_size;
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        } else {
-            // resize
-            data.capacity *= 2;
-            if(data.capacity <= total_size)
-                data.capacity = total_size + 1;
-            // alloc new chunk
-            char* temp = new char[data.capacity];
-            // copy current data to new location before releasing it
-            memcpy(temp, data.ptr, my_old_size); // skip the +1 ('\0') for speed
-            // release old chunk
-            delete[] data.ptr;
-            // update the rest of the union members
-            data.size = total_size;
-            data.ptr  = temp;
-            // transfer the rest of the data
-            memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
-        }
-    }
-
-    return *this;
-}
-
-String String::operator+(const String& other) const { return String(*this) += other; }
-
-String::String(String&& other) {
-    memcpy(buf, other.buf, len);
-    other.buf[0] = '\0';
-    other.setLast();
-}
-
-String& String::operator=(String&& other) {
-    if(this != &other) {
-        if(!isOnStack())
-            delete[] data.ptr;
-        memcpy(buf, other.buf, len);
-        other.buf[0] = '\0';
-        other.setLast();
-    }
-    return *this;
-}
-
-char String::operator[](unsigned i) const {
-    return const_cast<String*>(this)->operator[](i); // NOLINT
-}
-
-char& String::operator[](unsigned i) {
-    if(isOnStack())
-        return reinterpret_cast<char*>(buf)[i];
-    return data.ptr[i];
-}
-
-DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmaybe-uninitialized")
-unsigned String::size() const {
-    if(isOnStack())
-        return last - (unsigned(buf[last]) & 31); // using "last" would work only if "len" is 32
-    return data.size;
-}
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-unsigned String::capacity() const {
-    if(isOnStack())
-        return len;
-    return data.capacity;
-}
-
-int String::compare(const char* other, bool no_case) const {
-    if(no_case)
-        return stricmp(c_str(), other);
-    return std::strcmp(c_str(), other);
-}
-
-int String::compare(const String& other, bool no_case) const {
-    return compare(other.c_str(), no_case);
-}
-
-// clang-format off
-bool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; }
-bool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; }
-bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }
-bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }
-bool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; }
-bool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; }
-// clang-format on
-
-std::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); }
-
-namespace {
-    void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;)
-} // namespace
-
-namespace Color {
-    std::ostream& operator<<(std::ostream& s, Color::Enum code) {
-        color_to_stream(s, code);
-        return s;
-    }
-} // namespace Color
-
-// clang-format off
-const char* assertString(assertType::Enum at) {
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4062) // enum 'x' in switch of enum 'y' is not handled
-    switch(at) {  //!OCLINT missing default in switch statements
-        case assertType::DT_WARN                    : return "WARN";
-        case assertType::DT_CHECK                   : return "CHECK";
-        case assertType::DT_REQUIRE                 : return "REQUIRE";
-
-        case assertType::DT_WARN_FALSE              : return "WARN_FALSE";
-        case assertType::DT_CHECK_FALSE             : return "CHECK_FALSE";
-        case assertType::DT_REQUIRE_FALSE           : return "REQUIRE_FALSE";
-
-        case assertType::DT_WARN_THROWS             : return "WARN_THROWS";
-        case assertType::DT_CHECK_THROWS            : return "CHECK_THROWS";
-        case assertType::DT_REQUIRE_THROWS          : return "REQUIRE_THROWS";
-
-        case assertType::DT_WARN_THROWS_AS          : return "WARN_THROWS_AS";
-        case assertType::DT_CHECK_THROWS_AS         : return "CHECK_THROWS_AS";
-        case assertType::DT_REQUIRE_THROWS_AS       : return "REQUIRE_THROWS_AS";
-
-        case assertType::DT_WARN_THROWS_WITH        : return "WARN_THROWS_WITH";
-        case assertType::DT_CHECK_THROWS_WITH       : return "CHECK_THROWS_WITH";
-        case assertType::DT_REQUIRE_THROWS_WITH     : return "REQUIRE_THROWS_WITH";
-
-        case assertType::DT_WARN_NOTHROW            : return "WARN_NOTHROW";
-        case assertType::DT_CHECK_NOTHROW           : return "CHECK_NOTHROW";
-        case assertType::DT_REQUIRE_NOTHROW         : return "REQUIRE_NOTHROW";
-
-        case assertType::DT_WARN_EQ                 : return "WARN_EQ";
-        case assertType::DT_CHECK_EQ                : return "CHECK_EQ";
-        case assertType::DT_REQUIRE_EQ              : return "REQUIRE_EQ";
-        case assertType::DT_WARN_NE                 : return "WARN_NE";
-        case assertType::DT_CHECK_NE                : return "CHECK_NE";
-        case assertType::DT_REQUIRE_NE              : return "REQUIRE_NE";
-        case assertType::DT_WARN_GT                 : return "WARN_GT";
-        case assertType::DT_CHECK_GT                : return "CHECK_GT";
-        case assertType::DT_REQUIRE_GT              : return "REQUIRE_GT";
-        case assertType::DT_WARN_LT                 : return "WARN_LT";
-        case assertType::DT_CHECK_LT                : return "CHECK_LT";
-        case assertType::DT_REQUIRE_LT              : return "REQUIRE_LT";
-        case assertType::DT_WARN_GE                 : return "WARN_GE";
-        case assertType::DT_CHECK_GE                : return "CHECK_GE";
-        case assertType::DT_REQUIRE_GE              : return "REQUIRE_GE";
-        case assertType::DT_WARN_LE                 : return "WARN_LE";
-        case assertType::DT_CHECK_LE                : return "CHECK_LE";
-        case assertType::DT_REQUIRE_LE              : return "REQUIRE_LE";
-
-        case assertType::DT_WARN_UNARY              : return "WARN_UNARY";
-        case assertType::DT_CHECK_UNARY             : return "CHECK_UNARY";
-        case assertType::DT_REQUIRE_UNARY           : return "REQUIRE_UNARY";
-        case assertType::DT_WARN_UNARY_FALSE        : return "WARN_UNARY_FALSE";
-        case assertType::DT_CHECK_UNARY_FALSE       : return "CHECK_UNARY_FALSE";
-        case assertType::DT_REQUIRE_UNARY_FALSE     : return "REQUIRE_UNARY_FALSE";
-    }
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-    return "";
-}
-// clang-format on
-
-const char* failureString(assertType::Enum at) {
-    if(at & assertType::is_warn) //!OCLINT bitwise operator in conditional
-        return "WARNING: ";
-    if(at & assertType::is_check) //!OCLINT bitwise operator in conditional
-        return "ERROR: ";
-    if(at & assertType::is_require) //!OCLINT bitwise operator in conditional
-        return "FATAL ERROR: ";
-    return "";
-}
-
-DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
-DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
-// depending on the current options this will remove the path of filenames
-const char* removePathFromFilename(const char* file) {
-    if(getContextOptions()->no_path_in_filenames) {
-        auto back    = std::strrchr(file, '\\');
-        auto forward = std::strrchr(file, '/');
-        if(back || forward) {
-            if(back > forward)
-                forward = back;
-            return forward + 1;
-        }
-    }
-    return file;
-}
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-DOCTEST_DEFINE_DEFAULTS(TestCaseData);
-DOCTEST_DEFINE_COPIES(TestCaseData);
-
-DOCTEST_DEFINE_DEFAULTS(AssertData);
-
-DOCTEST_DEFINE_DEFAULTS(MessageData);
-
-SubcaseSignature::SubcaseSignature(const char* name, const char* file, int line)
-        : m_name(name)
-        , m_file(file)
-        , m_line(line) {}
-
-DOCTEST_DEFINE_DEFAULTS(SubcaseSignature);
-DOCTEST_DEFINE_COPIES(SubcaseSignature);
-
-bool SubcaseSignature::operator<(const SubcaseSignature& other) const {
-    if(m_line != other.m_line)
-        return m_line < other.m_line;
-    if(std::strcmp(m_file, other.m_file) != 0)
-        return std::strcmp(m_file, other.m_file) < 0;
-    return std::strcmp(m_name, other.m_name) < 0;
-}
-
-IContextScope::IContextScope()  = default;
-IContextScope::~IContextScope() = default;
-
-DOCTEST_DEFINE_DEFAULTS(ContextOptions);
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-String toString(char* in) { return toString(static_cast<const char*>(in)); }
-String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-String toString(bool in) { return in ? "true" : "false"; }
-String toString(float in) { return fpToString(in, 5) + "f"; }
-String toString(double in) { return fpToString(in, 10); }
-String toString(double long in) { return fpToString(in, 15); }
-
-#define DOCTEST_TO_STRING_OVERLOAD(type, fmt)                                                      \
-    String toString(type in) {                                                                     \
-        char buf[64];                                                                              \
-        std::sprintf(buf, fmt, in);                                                                \
-        return buf;                                                                                \
-    }
-
-DOCTEST_TO_STRING_OVERLOAD(char, "%d")
-DOCTEST_TO_STRING_OVERLOAD(char signed, "%d")
-DOCTEST_TO_STRING_OVERLOAD(char unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int short, "%d")
-DOCTEST_TO_STRING_OVERLOAD(int short unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int, "%d")
-DOCTEST_TO_STRING_OVERLOAD(unsigned, "%u")
-DOCTEST_TO_STRING_OVERLOAD(int long, "%ld")
-DOCTEST_TO_STRING_OVERLOAD(int long unsigned, "%lu")
-DOCTEST_TO_STRING_OVERLOAD(int long long, "%lld")
-DOCTEST_TO_STRING_OVERLOAD(int long long unsigned, "%llu")
-
-String toString(std::nullptr_t) { return "NULL"; }
-
-Approx::Approx(double value)
-        : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
-        , m_scale(1.0)
-        , m_value(value) {}
-
-DOCTEST_DEFINE_COPIES(Approx);
-
-Approx Approx::operator()(double value) const {
-    Approx approx(value);
-    approx.epsilon(m_epsilon);
-    approx.scale(m_scale);
-    return approx;
-}
-
-Approx& Approx::epsilon(double newEpsilon) {
-    m_epsilon = newEpsilon;
-    return *this;
-}
-Approx& Approx::scale(double newScale) {
-    m_scale = newScale;
-    return *this;
-}
-
-bool operator==(double lhs, const Approx& rhs) {
-    // Thanks to Richard Harris for his help refining this formula
-    return std::fabs(lhs - rhs.m_value) <
-           rhs.m_epsilon * (rhs.m_scale + std::max(std::fabs(lhs), std::fabs(rhs.m_value)));
-}
-bool operator==(const Approx& lhs, double rhs) { return operator==(rhs, lhs); }
-bool operator!=(double lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
-bool operator!=(const Approx& lhs, double rhs) { return !operator==(rhs, lhs); }
-bool operator<=(double lhs, const Approx& rhs) { return lhs < rhs.m_value || lhs == rhs; }
-bool operator<=(const Approx& lhs, double rhs) { return lhs.m_value < rhs || lhs == rhs; }
-bool operator>=(double lhs, const Approx& rhs) { return lhs > rhs.m_value || lhs == rhs; }
-bool operator>=(const Approx& lhs, double rhs) { return lhs.m_value > rhs || lhs == rhs; }
-bool operator<(double lhs, const Approx& rhs) { return lhs < rhs.m_value && lhs != rhs; }
-bool operator<(const Approx& lhs, double rhs) { return lhs.m_value < rhs && lhs != rhs; }
-bool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs != rhs; }
-bool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; }
-
-String toString(const Approx& in) {
-    return String("Approx( ") + doctest::toString(in.m_value) + " )";
-}
-const ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); }
-
-} // namespace doctest
-
-#ifdef DOCTEST_CONFIG_DISABLE
-namespace doctest {
-Context::Context(int, const char* const*) {}
-Context::~Context() = default;
-void Context::applyCommandLine(int, const char* const*) {}
-void Context::addFilter(const char*, const char*) {}
-void Context::clearFilters() {}
-void Context::setOption(const char*, int) {}
-void Context::setOption(const char*, const char*) {}
-bool Context::shouldExit() { return false; }
-void Context::setAsDefaultForAssertsOutOfTestCases() {}
-void Context::setAssertHandler(detail::assert_handler) {}
-int  Context::run() { return 0; }
-
-DOCTEST_DEFINE_DEFAULTS(CurrentTestCaseStats);
-
-DOCTEST_DEFINE_DEFAULTS(TestRunStats);
-
-IReporter::~IReporter() = default;
-
-int                         IReporter::get_num_active_contexts() { return 0; }
-const IContextScope* const* IReporter::get_active_contexts() { return nullptr; }
-int                         IReporter::get_num_stringified_contexts() { return 0; }
-const String*               IReporter::get_stringified_contexts() { return nullptr; }
-
-int registerReporter(const char*, int, IReporter*) { return 0; }
-
-} // namespace doctest
-#else // DOCTEST_CONFIG_DISABLE
-
-#if !defined(DOCTEST_CONFIG_COLORS_NONE)
-#if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)
-#ifdef DOCTEST_PLATFORM_WINDOWS
-#define DOCTEST_CONFIG_COLORS_WINDOWS
-#else // linux
-#define DOCTEST_CONFIG_COLORS_ANSI
-#endif // platform
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI
-#endif // DOCTEST_CONFIG_COLORS_NONE
-
-#if DOCTEST_MSVC || defined(__MINGW32__)
-#if DOCTEST_MSVC
-#define DOCTEST_WINDOWS_SAL_IN_OPT _In_opt_
-#else // MSVC
-#define DOCTEST_WINDOWS_SAL_IN_OPT
-#endif // MSVC
-extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(
-        DOCTEST_WINDOWS_SAL_IN_OPT const char*);
-extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
-#endif // MSVC || __MINGW32__
-
-#ifdef DOCTEST_CONFIG_COLORS_ANSI
-#include <unistd.h>
-#endif // DOCTEST_CONFIG_COLORS_ANSI
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-// defines for a leaner windows.h
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif // WIN32_LEAN_AND_MEAN
-#ifndef VC_EXTRA_LEAN
-#define VC_EXTRA_LEAN
-#endif // VC_EXTRA_LEAN
-#ifndef NOMINMAX
-#define NOMINMAX
-#endif // NOMINMAX
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
-
-// not sure what AfxWin.h is for - here I do what Catch does
-#ifdef __AFXDLL
-#include <AfxWin.h>
-#else
-#include <Windows.h>
-#endif
-#include <io.h>
-
-DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
-
-#else // DOCTEST_PLATFORM_WINDOWS
-
-#include <sys/time.h>
-
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-namespace doctest_detail_test_suite_ns {
-// holds the current test suite
-doctest::detail::TestSuite& getCurrentTestSuite() {
-    static doctest::detail::TestSuite data;
-    return data;
-}
-} // namespace doctest_detail_test_suite_ns
-
-namespace doctest {
-namespace {
-    using namespace detail;
-    typedef std::map<std::pair<int, String>, IReporter*> reporterMap;
-    reporterMap&                                         getReporters() {
-        static reporterMap data;
-        return data;
-    }
-} // namespace
-namespace detail {
-#define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...)                                           \
-    for(auto& curr_rep : g_cs->reporters_currently_used)                                           \
-    curr_rep->function(__VA_ARGS__)
-
-    DOCTEST_DEFINE_DEFAULTS(TestFailureException);
-    DOCTEST_DEFINE_COPIES(TestFailureException);
-    bool checkIfShouldThrow(assertType::Enum at) {
-        if(at & assertType::is_require) //!OCLINT bitwise operator in conditional
-            return true;
-
-        if((at & assertType::is_check) //!OCLINT bitwise operator in conditional
-           && getContextOptions()->abort_after > 0 &&
-           (g_cs->numAssertsFailed + g_cs->numAssertsFailedForCurrentTestCase_atomic) >=
-                   getContextOptions()->abort_after)
-            return true;
-
-        return false;
-    }
-
-    void throwException() {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-        throw TestFailureException();
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-    }
-} // namespace detail
-
-namespace {
-    using namespace detail;
-    // matching of a string against a wildcard mask (case sensitivity configurable) taken from
-    // https://www.codeproject.com/Articles/1088/Wildcard-string-compare-globbing
-    int wildcmp(const char* str, const char* wild, bool caseSensitive) {
-        const char* cp = nullptr;
-        const char* mp = nullptr;
-
-        while((*str) && (*wild != '*')) {
-            if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
-               (*wild != '?')) {
-                return 0;
-            }
-            wild++;
-            str++;
-        }
-
-        while(*str) {
-            if(*wild == '*') {
-                if(!*++wild) {
-                    return 1;
-                }
-                mp = wild;
-                cp = str + 1;
-            } else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
-                      (*wild == '?')) {
-                wild++;
-                str++;
-            } else {
-                wild = mp;   //!OCLINT parameter reassignment
-                str  = cp++; //!OCLINT parameter reassignment
-            }
-        }
-
-        while(*wild == '*') {
-            wild++;
-        }
-        return !*wild;
-    }
-
-    //// C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html
-    //unsigned hashStr(unsigned const char* str) {
-    //    unsigned long hash = 5381;
-    //    char          c;
-    //    while((c = *str++))
-    //        hash = ((hash << 5) + hash) + c; // hash * 33 + c
-    //    return hash;
-    //}
-
-    // checks if the name matches any of the filters (and can be configured what to do when empty)
-    bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty,
-                    bool caseSensitive) {
-        if(filters.empty() && matchEmpty)
-            return true;
-        for(auto& curr : filters)
-            if(wildcmp(name, curr.c_str(), caseSensitive))
-                return true;
-        return false;
-    }
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-    typedef unsigned long long UInt64;
-
-    UInt64 getCurrentTicks() {
-        static UInt64 hz = 0, hzo = 0;
-        if(!hz) {
-            QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&hz));
-            QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&hzo));
-        }
-        UInt64 t;
-        QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&t));
-        return ((t - hzo) * 1000000) / hz;
-    }
-#else  // DOCTEST_PLATFORM_WINDOWS
-
-    typedef uint64_t UInt64;
-
-    UInt64 getCurrentTicks() {
-        timeval t;
-        gettimeofday(&t, nullptr);
-        return static_cast<UInt64>(t.tv_sec) * 1000000 + static_cast<UInt64>(t.tv_usec);
-    }
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    struct Timer
-    {
-        void         start() { m_ticks = getCurrentTicks(); }
-        unsigned int getElapsedMicroseconds() const {
-            return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
-        }
-        //unsigned int getElapsedMilliseconds() const {
-        //    return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
-        //}
-        double getElapsedSeconds() const { return getElapsedMicroseconds() / 1000000.0; }
-
-    private:
-        UInt64 m_ticks = 0;
-    };
-
-    Timer g_timer;
-} // namespace
-namespace detail {
-
-    Subcase::Subcase(const char* name, const char* file, int line)
-            : m_signature(name, file, line) {
-        ContextState* s = g_cs;
-
-        // if we have already completed it
-        if(s->subcasesPassed.count(m_signature) != 0)
-            return;
-
-        // check subcase filters
-        if(s->subcasesCurrentLevel < s->subcase_filter_levels) {
-            if(!matchesAny(m_signature.m_name, s->filters[6], true, s->case_sensitive))
-                return;
-            if(matchesAny(m_signature.m_name, s->filters[7], false, s->case_sensitive))
-                return;
-        }
-
-        // if a Subcase on the same level has already been entered
-        if(s->subcasesEnteredLevels.count(s->subcasesCurrentLevel) != 0) {
-            s->should_reenter = true;
-            return;
-        }
-
-        s->subcasesEnteredLevels.insert(s->subcasesCurrentLevel++);
-        m_entered = true;
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
-    }
-
-    Subcase::~Subcase() {
-        if(m_entered) {
-            ContextState* s = g_cs;
-
-            s->subcasesCurrentLevel--;
-            // only mark the subcase as passed if no subcases have been skipped
-            if(s->should_reenter == false)
-                s->subcasesPassed.insert(m_signature);
-
-            DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, m_signature);
-        }
-    }
-
-    Subcase::operator bool() const { return m_entered; }
-
-    Result::Result(bool passed, const String& decomposition)
-            : m_passed(passed)
-            , m_decomp(decomposition) {}
-
-    DOCTEST_DEFINE_DEFAULTS(Result);
-    DOCTEST_DEFINE_COPIES(Result);
-
-    ExpressionDecomposer::ExpressionDecomposer(assertType::Enum at)
-            : m_at(at) {}
-
-    DOCTEST_DEFINE_DEFAULTS(ExpressionDecomposer);
-
-    DOCTEST_DEFINE_DEFAULTS(TestSuite);
-    DOCTEST_DEFINE_COPIES(TestSuite);
-
-    TestSuite& TestSuite::operator*(const char* in) {
-        m_test_suite = in;
-        // clear state
-        m_description       = nullptr;
-        m_skip              = false;
-        m_may_fail          = false;
-        m_should_fail       = false;
-        m_expected_failures = 0;
-        m_timeout           = 0;
-        return *this;
-    }
-
-    TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
-                       const char* type, int template_id) {
-        m_file              = file;
-        m_line              = line;
-        m_name              = nullptr;
-        m_test_suite        = test_suite.m_test_suite;
-        m_description       = test_suite.m_description;
-        m_skip              = test_suite.m_skip;
-        m_may_fail          = test_suite.m_may_fail;
-        m_should_fail       = test_suite.m_should_fail;
-        m_expected_failures = test_suite.m_expected_failures;
-        m_timeout           = test_suite.m_timeout;
-
-        m_test        = test;
-        m_type        = type;
-        m_template_id = template_id;
-    }
-
-    DOCTEST_DEFINE_DEFAULTS(TestCase);
-
-    TestCase::TestCase(const TestCase& other)
-            : TestCaseData() {
-        *this = other;
-    }
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
-    DOCTEST_MSVC_SUPPRESS_WARNING(26437)           // Do not slice
-    TestCase& TestCase::operator=(const TestCase& other) {
-        static_cast<TestCaseData&>(*this) = static_cast<const TestCaseData&>(other);
-
-        m_test        = other.m_test;
-        m_type        = other.m_type;
-        m_template_id = other.m_template_id;
-        m_full_name   = other.m_full_name;
-
-        if(m_template_id != -1)
-            m_name = m_full_name.c_str();
-        return *this;
-    }
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-    TestCase& TestCase::operator*(const char* in) {
-        m_name = in;
-        // make a new name with an appended type for templated test case
-        if(m_template_id != -1) {
-            m_full_name = String(m_name) + m_type;
-            // redirect the name to point to the newly constructed full name
-            m_name = m_full_name.c_str();
-        }
-        return *this;
-    }
-
-    bool TestCase::operator<(const TestCase& other) const {
-        if(m_line != other.m_line)
-            return m_line < other.m_line;
-        const int file_cmp = std::strcmp(m_file, other.m_file);
-        if(file_cmp != 0)
-            return file_cmp < 0;
-        return m_template_id < other.m_template_id;
-    }
-} // namespace detail
-namespace {
-    using namespace detail;
-    // for sorting tests by file/line
-    int fileOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-#if DOCTEST_MSVC
-        // this is needed because MSVC gives different case for drive letters
-        // for __FILE__ when evaluated in a header and a source file
-        const int res = stricmp(lhs->m_file, rhs->m_file);
-#else  // MSVC
-        const int res = std::strcmp(lhs->m_file, rhs->m_file);
-#endif // MSVC
-        if(res != 0)
-            return res;
-        return static_cast<int>(lhs->m_line) - static_cast<int>(rhs->m_line);
-    }
-
-    // for sorting tests by suite/file/line
-    int suiteOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-
-        const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
-        if(res != 0)
-            return res;
-        return fileOrderComparator(a, b);
-    }
-
-    // for sorting tests by name/suite/file/line
-    int nameOrderComparator(const void* a, const void* b) {
-        auto lhs = *static_cast<TestCase* const*>(a);
-        auto rhs = *static_cast<TestCase* const*>(b);
-
-        const int res_name = std::strcmp(lhs->m_name, rhs->m_name);
-        if(res_name != 0)
-            return res_name;
-        return suiteOrderComparator(a, b);
-    }
-
-    // all the registered tests
-    std::set<TestCase>& getRegisteredTests() {
-        static std::set<TestCase> data;
-        return data;
-    }
-
-#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
-    HANDLE g_stdoutHandle;
-    WORD   g_origFgAttrs;
-    WORD   g_origBgAttrs;
-    bool   g_attrsInitted = false;
-
-    int colors_init() {
-        if(!g_attrsInitted) {
-            g_stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
-            g_attrsInitted = true;
-            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
-            GetConsoleScreenBufferInfo(g_stdoutHandle, &csbiInfo);
-            g_origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
-                                                     BACKGROUND_BLUE | BACKGROUND_INTENSITY);
-            g_origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
-                                                     FOREGROUND_BLUE | FOREGROUND_INTENSITY);
-        }
-        return 0;
-    }
-
-    int dumy_init_console_colors = colors_init();
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS
-
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    void color_to_stream(std::ostream& s, Color::Enum code) {
-        ((void)s);    // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS
-        ((void)code); // for DOCTEST_CONFIG_COLORS_NONE
-#ifdef DOCTEST_CONFIG_COLORS_ANSI
-        if(g_no_colors ||
-           (isatty(STDOUT_FILENO) == false && getContextOptions()->force_colors == false))
-            return;
-
-        auto col = "";
-        // clang-format off
-            switch(code) { //!OCLINT missing break in switch statement / unnecessary default statement in covered switch statement
-                case Color::Red:         col = "[0;31m"; break;
-                case Color::Green:       col = "[0;32m"; break;
-                case Color::Blue:        col = "[0;34m"; break;
-                case Color::Cyan:        col = "[0;36m"; break;
-                case Color::Yellow:      col = "[0;33m"; break;
-                case Color::Grey:        col = "[1;30m"; break;
-                case Color::LightGrey:   col = "[0;37m"; break;
-                case Color::BrightRed:   col = "[1;31m"; break;
-                case Color::BrightGreen: col = "[1;32m"; break;
-                case Color::BrightWhite: col = "[1;37m"; break;
-                case Color::Bright: // invalid
-                case Color::None:
-                case Color::White:
-                default:                 col = "[0m";
-            }
-        // clang-format on
-        s << "\033" << col;
-#endif // DOCTEST_CONFIG_COLORS_ANSI
-
-#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
-        if(g_no_colors ||
-           (isatty(fileno(stdout)) == false && getContextOptions()->force_colors == false))
-            return;
-
-#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(g_stdoutHandle, x | g_origBgAttrs)
-
-        // clang-format off
-        switch (code) {
-            case Color::White:       DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
-            case Color::Red:         DOCTEST_SET_ATTR(FOREGROUND_RED);                                      break;
-            case Color::Green:       DOCTEST_SET_ATTR(FOREGROUND_GREEN);                                    break;
-            case Color::Blue:        DOCTEST_SET_ATTR(FOREGROUND_BLUE);                                     break;
-            case Color::Cyan:        DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN);                  break;
-            case Color::Yellow:      DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN);                   break;
-            case Color::Grey:        DOCTEST_SET_ATTR(0);                                                   break;
-            case Color::LightGrey:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY);                                break;
-            case Color::BrightRed:   DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED);               break;
-            case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN);             break;
-            case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
-            case Color::None:
-            case Color::Bright: // invalid
-            default:                 DOCTEST_SET_ATTR(g_origFgAttrs);
-        }
-            // clang-format on
-#endif // DOCTEST_CONFIG_COLORS_WINDOWS
-    }
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-
-    std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
-        static std::vector<const IExceptionTranslator*> data;
-        return data;
-    }
-
-    String translateActiveException() {
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-        String res;
-        auto&  translators = getExceptionTranslators();
-        for(auto& curr : translators)
-            if(curr->translate(res))
-                return res;
-        // clang-format off
-        try {
-            throw;
-        } catch(std::exception& ex) {
-            return ex.what();
-        } catch(std::string& msg) {
-            return msg.c_str();
-        } catch(const char* msg) {
-            return msg;
-        } catch(...) {
-            return "unknown exception";
-        }
-// clang-format on
-#else  // DOCTEST_CONFIG_NO_EXCEPTIONS
-        return "";
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-    }
-} // namespace
-
-namespace detail {
-    // used by the macros for registering tests
-    int regTest(const TestCase& tc) {
-        getRegisteredTests().insert(tc);
-        return 0;
-    }
-
-    // sets the current test suite
-    int setTestSuite(const TestSuite& ts) {
-        doctest_detail_test_suite_ns::getCurrentTestSuite() = ts;
-        return 0;
-    }
-
-#ifdef DOCTEST_PLATFORM_MAC
-    // The following function is taken directly from the following technical note:
-    // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
-    // Returns true if the current process is being debugged (either
-    // running under the debugger or has a debugger attached post facto).
-    bool isDebuggerActive() {
-        int        mib[4];
-        kinfo_proc info;
-        size_t     size;
-        // Initialize the flags so that, if sysctl fails for some bizarre
-        // reason, we get a predictable result.
-        info.kp_proc.p_flag = 0;
-        // Initialize mib, which tells sysctl the info we want, in this case
-        // we're looking for information about a specific process ID.
-        mib[0] = CTL_KERN;
-        mib[1] = KERN_PROC;
-        mib[2] = KERN_PROC_PID;
-        mib[3] = getpid();
-        // Call sysctl.
-        size = sizeof(info);
-        if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {
-            fprintf(stderr, "\n** Call to sysctl failed - unable to determine if debugger is "
-                            "active **\n\n");
-            return false;
-        }
-        // We're being debugged if the P_TRACED flag is set.
-        return ((info.kp_proc.p_flag & P_TRACED) != 0);
-    }
-#elif DOCTEST_MSVC || defined(__MINGW32__)
-    bool isDebuggerActive() { return ::IsDebuggerPresent() != 0; }
-#else
-    bool isDebuggerActive() { return false; }
-#endif // Platform
-
-    void registerExceptionTranslatorImpl(const IExceptionTranslator* et) {
-        if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
-           getExceptionTranslators().end())
-            getExceptionTranslators().push_back(et);
-    }
-
-    void writeStringToStream(std::ostream* s, const String& str) { *s << str; }
-
-#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    void toStream(std::ostream* s, char* in) { *s << in; }
-    void toStream(std::ostream* s, const char* in) { *s << in; }
-#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
-    void toStream(std::ostream* s, bool in) { *s << std::boolalpha << in << std::noboolalpha; }
-    void toStream(std::ostream* s, float in) { *s << in; }
-    void toStream(std::ostream* s, double in) { *s << in; }
-    void toStream(std::ostream* s, double long in) { *s << in; }
-
-    void toStream(std::ostream* s, char in) { *s << in; }
-    void toStream(std::ostream* s, char signed in) { *s << in; }
-    void toStream(std::ostream* s, char unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int short in) { *s << in; }
-    void toStream(std::ostream* s, int short unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int in) { *s << in; }
-    void toStream(std::ostream* s, int unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int long in) { *s << in; }
-    void toStream(std::ostream* s, int long unsigned in) { *s << in; }
-    void toStream(std::ostream* s, int long long in) { *s << in; }
-    void toStream(std::ostream* s, int long long unsigned in) { *s << in; }
-
-    DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO()
-
-    ContextBuilder::ICapture::ICapture()  = default;
-    ContextBuilder::ICapture::~ICapture() = default;
-
-    ContextBuilder::Chunk::Chunk()  = default;
-    ContextBuilder::Chunk::~Chunk() = default;
-
-    ContextBuilder::Node::Node()  = default;
-    ContextBuilder::Node::~Node() = default;
-
-    // steal the contents of the other - acting as a move constructor...
-    ContextBuilder::ContextBuilder(ContextBuilder& other)
-            : numCaptures(other.numCaptures)
-            , head(other.head)
-            , tail(other.tail) {
-        other.numCaptures = 0;
-        other.head        = nullptr;
-        other.tail        = nullptr;
-        memcpy(stackChunks, other.stackChunks,
-               unsigned(int(sizeof(Chunk)) * DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK));
-    }
-
-    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wcast-align")
-    void ContextBuilder::stringify(std::ostream* s) const {
-        int curr = 0;
-        // iterate over small buffer
-        while(curr < numCaptures && curr < DOCTEST_CONFIG_NUM_CAPTURES_ON_STACK)
-            reinterpret_cast<const ICapture*>(stackChunks[curr++].buf)->toStream(s);
-        // iterate over list
-        auto curr_elem = head;
-        while(curr < numCaptures) {
-            reinterpret_cast<const ICapture*>(curr_elem->chunk.buf)->toStream(s);
-            curr_elem = curr_elem->next;
-            ++curr;
-        }
-    }
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-    ContextBuilder::ContextBuilder() = default;
-
-    ContextBuilder::~ContextBuilder() {
-        // free the linked list - the ones on the stack are left as-is
-        // no destructors are called at all - there is no need
-        while(head) {
-            auto next = head->next;
-            delete head;
-            head = next;
-        }
-    }
-
-    ContextScope::ContextScope(ContextBuilder& temp)
-            : contextBuilder(temp) {
-        g_infoContexts.push_back(this);
-    }
-
-    DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
-    DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-    ContextScope::~ContextScope() {
-        if(std::uncaught_exception()) {
-            std::ostringstream s;
-            this->stringify(&s);
-            g_cs->stringifiedContexts.push_back(s.str().c_str());
-        }
-        g_infoContexts.pop_back();
-    }
-    DOCTEST_CLANG_SUPPRESS_WARNING_POP
-    DOCTEST_GCC_SUPPRESS_WARNING_POP
-    DOCTEST_MSVC_SUPPRESS_WARNING_POP
-
-    void ContextScope::stringify(std::ostream* s) const { contextBuilder.stringify(s); }
-} // namespace detail
-namespace {
-    using namespace detail;
-#if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
-    struct FatalConditionHandler
-    {
-        void reset() {}
-    };
-#else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-
-    void reportFatal(const std::string&);
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-
-    struct SignalDefs
-    {
-        DWORD       id;
-        const char* name;
-    };
-    // There is no 1-1 mapping between signals and windows exceptions.
-    // Windows can easily distinguish between SO and SigSegV,
-    // but SigInt, SigTerm, etc are handled differently.
-    SignalDefs signalDefs[] = {
-            {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal"},
-            {EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow"},
-            {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal"},
-            {EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error"},
-    };
-
-    struct FatalConditionHandler
-    {
-        static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
-            for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
-                    reportFatal(signalDefs[i].name);
-                }
-            }
-            // If its not an exception we care about, pass it along.
-            // This stops us from eating debugger breaks etc.
-            return EXCEPTION_CONTINUE_SEARCH;
-        }
-
-        FatalConditionHandler() {
-            isSet = true;
-            // 32k seems enough for doctest to handle stack overflow,
-            // but the value was found experimentally, so there is no strong guarantee
-            guaranteeSize          = 32 * 1024;
-            exceptionHandlerHandle = nullptr;
-            // Register as first handler in current chain
-            exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
-            // Pass in guarantee size to be filled
-            SetThreadStackGuarantee(&guaranteeSize);
-        }
-
-        static void reset() {
-            if(isSet) {
-                // Unregister handler and restore the old guarantee
-                RemoveVectoredExceptionHandler(exceptionHandlerHandle);
-                SetThreadStackGuarantee(&guaranteeSize);
-                exceptionHandlerHandle = nullptr;
-                isSet                  = false;
-            }
-        }
-
-        ~FatalConditionHandler() { reset(); }
-
-    private:
-        static bool  isSet;
-        static ULONG guaranteeSize;
-        static PVOID exceptionHandlerHandle;
-    };
-
-    bool  FatalConditionHandler::isSet                  = false;
-    ULONG FatalConditionHandler::guaranteeSize          = 0;
-    PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr;
-
-#else // DOCTEST_PLATFORM_WINDOWS
-
-    struct SignalDefs
-    {
-        int         id;
-        const char* name;
-    };
-    SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
-                               {SIGILL, "SIGILL - Illegal instruction signal"},
-                               {SIGFPE, "SIGFPE - Floating point error signal"},
-                               {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
-                               {SIGTERM, "SIGTERM - Termination request signal"},
-                               {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};
-
-    struct FatalConditionHandler
-    {
-        static bool             isSet;
-        static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
-        static stack_t          oldSigStack;
-        static char             altStackMem[4 * SIGSTKSZ];
-
-        static void handleSignal(int sig) {
-            const char* name = "<unknown signal>";
-            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                SignalDefs& def = signalDefs[i];
-                if(sig == def.id) {
-                    name = def.name;
-                    break;
-                }
-            }
-            reset();
-            reportFatal(name);
-            raise(sig);
-        }
-
-        FatalConditionHandler() {
-            isSet = true;
-            stack_t sigStack;
-            sigStack.ss_sp    = altStackMem;
-            sigStack.ss_size  = sizeof(altStackMem);
-            sigStack.ss_flags = 0;
-            sigaltstack(&sigStack, &oldSigStack);
-            struct sigaction sa = {};
-            sa.sa_handler       = handleSignal; // NOLINT
-            sa.sa_flags         = SA_ONSTACK;
-            for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
-            }
-        }
-
-        ~FatalConditionHandler() { reset(); }
-        static void reset() {
-            if(isSet) {
-                // Set signals back to previous values -- hopefully nobody overwrote them in the meantime
-                for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
-                    sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
-                }
-                // Return the old stack
-                sigaltstack(&oldSigStack, nullptr);
-                isSet = false;
-            }
-        }
-    };
-
-    bool             FatalConditionHandler::isSet                                      = false;
-    struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
-    stack_t          FatalConditionHandler::oldSigStack                                = {};
-    char             FatalConditionHandler::altStackMem[]                              = {};
-
-#endif // DOCTEST_PLATFORM_WINDOWS
-#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-
-} // namespace
-
-namespace {
-    using namespace detail;
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-#define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)
-#else
-    // TODO: integration with XCode and other IDEs
-#define DOCTEST_OUTPUT_DEBUG_STRING(text)
-#endif // Platform
-
-    void addAssert(assertType::Enum at) {
-        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional
-            g_cs->numAssertsForCurrentTestCase_atomic++;
-    }
-
-    void addFailedAssert(assertType::Enum at) {
-        if((at & assertType::is_warn) == 0) //!OCLINT bitwise operator in conditional
-            g_cs->numAssertsFailedForCurrentTestCase_atomic++;
-    }
-
-#if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)
-    void reportFatal(const std::string& message) {
-        g_cs->seconds_so_far += g_timer.getElapsedSeconds();
-        g_cs->failure_flags |= TestCaseFailureReason::Crash;
-        g_cs->error_string   = message.c_str();
-        g_cs->should_reenter = false;
-
-        // TODO: end all currently opened subcases...?
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-
-        g_cs->numTestCasesFailed++;
-
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
-    }
-#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
-} // namespace
-namespace detail {
-
-    ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
-                                 const char* exception_type) {
-        m_test_case      = g_cs->currentTest;
-        m_at             = at;
-        m_file           = file;
-        m_line           = line;
-        m_expr           = expr;
-        m_failed         = true;
-        m_threw          = false;
-        m_threw_as       = false;
-        m_exception_type = exception_type;
-#if DOCTEST_MSVC
-        if(m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC
-            ++m_expr;
-#endif // MSVC
-    }
-
-    DOCTEST_DEFINE_DEFAULTS(ResultBuilder);
-
-    void ResultBuilder::setResult(const Result& res) {
-        m_decomp = res.m_decomp;
-        m_failed = !res.m_passed;
-    }
-
-    void ResultBuilder::translateException() {
-        m_threw     = true;
-        m_exception = translateActiveException();
-    }
-
-    bool ResultBuilder::log() {
-        if(m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional
-            m_failed = !m_threw;
-        } else if(m_at & assertType::is_throws_as) { //!OCLINT bitwise operator in conditional
-            m_failed = !m_threw_as;
-        } else if(m_at & assertType::is_throws_with) { //!OCLINT bitwise operator in conditional
-            m_failed = m_exception != m_exception_type;
-        } else if(m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional
-            m_failed = m_threw;
-        }
-
-        if(m_exception.size())
-            m_exception = String("\"") + m_exception + "\"";
-
-        if(is_running_in_test) {
-            addAssert(m_at);
-            DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *this);
-
-            if(m_failed)
-                addFailedAssert(m_at);
-        } else if(m_failed) {
-            failed_out_of_a_testing_context(*this);
-        }
-
-        return m_failed && isDebuggerActive() &&
-               !getContextOptions()->no_breaks; // break into debugger
-    }
-
-    void ResultBuilder::react() const {
-        if(m_failed && checkIfShouldThrow(m_at))
-            throwException();
-    }
-
-    void failed_out_of_a_testing_context(const AssertData& ad) {
-        if(g_cs->ah)
-            g_cs->ah(ad);
-        else
-            std::abort();
-    }
-
-    void decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,
-                       Result result) {
-        bool failed = !result.m_passed;
-
-        // ###################################################################################
-        // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
-        // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
-        // ###################################################################################
-        DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);
-        DOCTEST_ASSERT_IN_TESTS(result.m_decomp);
-    }
-
-    MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {
-        m_stream   = getTlsOss();
-        m_file     = file;
-        m_line     = line;
-        m_severity = severity;
-    }
-
-    IExceptionTranslator::IExceptionTranslator()  = default;
-    IExceptionTranslator::~IExceptionTranslator() = default;
-
-    bool MessageBuilder::log() {
-        m_string = getTlsOssResult();
-        DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);
-
-        const bool isWarn = m_severity & assertType::is_warn;
-
-        // warn is just a message in this context so we dont treat it as an assert
-        if(!isWarn) {
-            addAssert(m_severity);
-            addFailedAssert(m_severity);
-        }
-
-        return isDebuggerActive() && !getContextOptions()->no_breaks && !isWarn; // break
-    }
-
-    void MessageBuilder::react() {
-        if(m_severity & assertType::is_require) //!OCLINT bitwise operator in conditional
-            throwException();
-    }
-
-    MessageBuilder::~MessageBuilder() = default;
-} // namespace detail
-namespace {
-    std::mutex g_mutex;
-
-    using namespace detail;
-    struct ConsoleReporter : public IReporter
-    {
-        std::ostream&                 s;
-        bool                          hasLoggedCurrentTestStart;
-        std::vector<SubcaseSignature> subcasesStack;
-
-        // caching pointers to objects of these types - safe to do
-        const ContextOptions* opt;
-        const TestCaseData*   tc;
-
-        ConsoleReporter(std::ostream& in)
-                : s(in) {}
-
-        // =========================================================================================
-        // WHAT FOLLOWS ARE HELPERS USED BY THE OVERRIDES OF THE VIRTUAL METHODS OF THE INTERFACE
-        // =========================================================================================
-
-        void separator_to_stream() {
-            s << Color::Yellow
-              << "============================================================================="
-                 "=="
-                 "\n";
-        }
-
-        void file_line_to_stream(const char* file, int line, const char* tail = "") {
-            s << Color::LightGrey << removePathFromFilename(file)
-              << (opt->gnu_file_line ? ":" : "(")
-              << (opt->no_line_numbers ? 0 : line) // 0 or the real num depending on the option
-              << (opt->gnu_file_line ? ":" : "):") << tail;
-        }
-
-        const char* getSuccessOrFailString(bool success, assertType::Enum at,
-                                           const char* success_str) {
-            if(success)
-                return success_str;
-            return failureString(at);
-        }
-
-        Color::Enum getSuccessOrFailColor(bool success, assertType::Enum at) {
-            return success ? Color::BrightGreen :
-                             (at & assertType::is_warn) ? Color::Yellow : Color::Red;
-        }
-
-        void successOrFailColoredStringToStream(bool success, assertType::Enum at,
-                                                const char* success_str = "SUCCESS: ") {
-            s << getSuccessOrFailColor(success, at)
-              << getSuccessOrFailString(success, at, success_str);
-        }
-
-        void log_contexts() {
-            int num_contexts = get_num_active_contexts();
-            if(num_contexts) {
-                auto contexts = get_active_contexts();
-
-                s << Color::None << "  logged: ";
-                for(int i = 0; i < num_contexts; ++i) {
-                    s << (i == 0 ? "" : "          ");
-                    contexts[i]->stringify(&s);
-                    s << "\n";
-                }
-            }
-
-            s << "\n";
-        }
-
-        void logTestStart() {
-            if(hasLoggedCurrentTestStart)
-                return;
-
-            separator_to_stream();
-            file_line_to_stream(tc->m_file, tc->m_line, "\n");
-            if(tc->m_description)
-                s << Color::Yellow << "DESCRIPTION: " << Color::None << tc->m_description << "\n";
-            if(tc->m_test_suite && tc->m_test_suite[0] != '\0')
-                s << Color::Yellow << "TEST SUITE: " << Color::None << tc->m_test_suite << "\n";
-            if(strncmp(tc->m_name, "  Scenario:", 11) != 0)
-                s << Color::None << "TEST CASE:  ";
-            s << Color::None << tc->m_name << "\n";
-
-            for(auto& curr : subcasesStack)
-                if(curr.m_name[0] != '\0')
-                    s << "  " << curr.m_name << "\n";
-
-            s << "\n";
-
-            hasLoggedCurrentTestStart = true;
-        }
-
-        // =========================================================================================
-        // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
-        // =========================================================================================
-
-        void test_run_start(const ContextOptions& o) override { opt = &o; }
-
-        void test_run_end(const TestRunStats& p) override {
-            separator_to_stream();
-
-            const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
-            s << Color::Cyan << "[doctest] " << Color::None << "test cases: " << std::setw(6)
-              << p.numTestCasesPassingFilters << " | "
-              << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ? Color::None :
-                                                                          Color::Green)
-              << std::setw(6) << p.numTestCasesPassingFilters - p.numTestCasesFailed << " passed"
-              << Color::None << " | " << (p.numTestCasesFailed > 0 ? Color::Red : Color::None)
-              << std::setw(6) << p.numTestCasesFailed << " failed" << Color::None << " | ";
-            if(opt->no_skipped_summary == false) {
-                const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
-                s << (numSkipped == 0 ? Color::None : Color::Yellow) << std::setw(6) << numSkipped
-                  << " skipped" << Color::None;
-            }
-            s << "\n";
-            s << Color::Cyan << "[doctest] " << Color::None << "assertions: " << std::setw(6)
-              << p.numAsserts << " | "
-              << ((p.numAsserts == 0 || anythingFailed) ? Color::None : Color::Green)
-              << std::setw(6) << (p.numAsserts - p.numAssertsFailed) << " passed" << Color::None
-              << " | " << (p.numAssertsFailed > 0 ? Color::Red : Color::None) << std::setw(6)
-              << p.numAssertsFailed << " failed" << Color::None << " |\n";
-            s << Color::Cyan << "[doctest] " << Color::None
-              << "Status: " << (p.numTestCasesFailed > 0 ? Color::Red : Color::Green)
-              << ((p.numTestCasesFailed > 0) ? "FAILURE!\n" : "SUCCESS!\n") << Color::None;
-        }
-
-        void test_case_start(const TestCaseData& in) override {
-            hasLoggedCurrentTestStart = false;
-            tc                        = &in;
-        }
-
-        void test_case_end(const CurrentTestCaseStats& st) override {
-            // log the preamble of the test case only if there is something
-            // else to print - something other than that an assert has failed
-            if(opt->duration ||
-               (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure))
-                logTestStart();
-
-            // report test case exceptions and crashes
-            bool crashed = st.failure_flags & TestCaseFailureReason::Crash;
-            if(crashed || (st.failure_flags & TestCaseFailureReason::Exception)) {
-                file_line_to_stream(tc->m_file, tc->m_line, " ");
-                successOrFailColoredStringToStream(false, crashed ? assertType::is_require :
-                                                                    assertType::is_check);
-                s << Color::Red << (crashed ? "test case CRASHED: " : "test case THREW exception: ")
-                  << Color::Cyan << st.error_string << "\n";
-
-                int num_stringified_contexts = get_num_stringified_contexts();
-                if(num_stringified_contexts) {
-                    auto stringified_contexts = get_stringified_contexts();
-                    s << Color::None << "  logged: ";
-                    for(int i = num_stringified_contexts - 1; i >= 0; --i) {
-                        s << (i == num_stringified_contexts - 1 ? "" : "          ")
-                          << stringified_contexts[i] << "\n";
-                    }
-                }
-                s << "\n";
-            }
-
-            // means the test case will be re-entered because there are untraversed (but discovered) subcases
-            if(st.should_reenter)
-                return;
-
-            if(opt->duration)
-                s << Color::None << std::setprecision(6) << std::fixed << st.seconds_so_far
-                  << " s: " << tc->m_name << "\n";
-
-            if(st.failure_flags & TestCaseFailureReason::Timeout)
-                s << Color::Red << "Test case exceeded time limit of " << std::setprecision(6)
-                  << std::fixed << tc->m_timeout << "!\n";
-
-            if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedButDidnt) {
-                s << Color::Red << "Should have failed but didn't! Marking it as failed!\n";
-            } else if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedAndDid) {
-                s << Color::Yellow << "Failed as expected so marking it as not failed\n";
-            } else if(st.failure_flags & TestCaseFailureReason::CouldHaveFailedAndDid) {
-                s << Color::Yellow << "Allowed to fail so marking it as not failed\n";
-            } else if(st.failure_flags & TestCaseFailureReason::DidntFailExactlyNumTimes) {
-                s << Color::Red << "Didn't fail exactly " << tc->m_expected_failures
-                  << " times so marking it as failed!\n";
-            } else if(st.failure_flags & TestCaseFailureReason::FailedExactlyNumTimes) {
-                s << Color::Yellow << "Failed exactly " << tc->m_expected_failures
-                  << " times as expected so marking it as not failed!\n";
-            }
-            if(st.failure_flags & TestCaseFailureReason::TooManyFailedAsserts) {
-                s << Color::Red << "Aborting - too many failed asserts!\n";
-            }
-            s << Color::None;
-        }
-
-        void subcase_start(const SubcaseSignature& subc) override {
-            subcasesStack.push_back(subc);
-            hasLoggedCurrentTestStart = false;
-        }
-
-        void subcase_end(const SubcaseSignature& /*subc*/) override {
-            subcasesStack.pop_back();
-            hasLoggedCurrentTestStart = false;
-        }
-
-        void log_assert(const AssertData& rb) override {
-            if(!rb.m_failed && !opt->success)
-                return;
-
-            std::lock_guard<std::mutex> lock(g_mutex);
-
-            logTestStart();
-
-            file_line_to_stream(rb.m_file, rb.m_line, " ");
-            successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
-            if((rb.m_at & (assertType::is_throws_as | assertType::is_throws_with)) ==
-               0) //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << " ) "
-                  << Color::None;
-
-            if(rb.m_at & assertType::is_throws) { //!OCLINT bitwise operator in conditional
-                s << (rb.m_threw ? "threw as expected!" : "did NOT throw at all!") << "\n";
-            } else if(rb.m_at &
-                      assertType::is_throws_as) { //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", "
-                  << rb.m_exception_type << " ) " << Color::None
-                  << (rb.m_threw ? (rb.m_threw_as ? "threw as expected!" :
-                                                    "threw a DIFFERENT exception: ") :
-                                   "did NOT throw at all!")
-                  << Color::Cyan << rb.m_exception << "\n";
-            } else if(rb.m_at &
-                      assertType::is_throws_with) { //!OCLINT bitwise operator in conditional
-                s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
-                  << rb.m_exception_type << "\" ) " << Color::None
-                  << (rb.m_threw ? (!rb.m_failed ? "threw as expected!" :
-                                                   "threw a DIFFERENT exception: ") :
-                                   "did NOT throw at all!")
-                  << Color::Cyan << rb.m_exception << "\n";
-            } else if(rb.m_at & assertType::is_nothrow) { //!OCLINT bitwise operator in conditional
-                s << (rb.m_threw ? "THREW exception: " : "didn't throw!") << Color::Cyan
-                  << rb.m_exception << "\n";
-            } else {
-                s << (rb.m_threw ? "THREW exception: " :
-                                   (!rb.m_failed ? "is correct!\n" : "is NOT correct!\n"));
-                if(rb.m_threw)
-                    s << rb.m_exception << "\n";
-                else
-                    s << "  values: " << assertString(rb.m_at) << "( " << rb.m_decomp << " )\n";
-            }
-
-            log_contexts();
-        }
-
-        void log_message(const MessageData& mb) override {
-            std::lock_guard<std::mutex> lock(g_mutex);
-
-            logTestStart();
-
-            file_line_to_stream(mb.m_file, mb.m_line, " ");
-            s << getSuccessOrFailColor(false, mb.m_severity)
-              << getSuccessOrFailString(mb.m_severity & assertType::is_warn, mb.m_severity,
-                                        "MESSAGE: ");
-            s << Color::None << mb.m_string << "\n";
-            log_contexts();
-        }
-
-        void test_case_skipped(const TestCaseData&) override {}
-    };
-
-    struct Whitespace
-    {
-        int nrSpaces;
-        explicit Whitespace(int nr)
-                : nrSpaces(nr) {}
-    };
-
-    std::ostream& operator<<(std::ostream& out, const Whitespace& ws) {
-        if(ws.nrSpaces != 0)
-            out << std::setw(ws.nrSpaces) << ' ';
-        return out;
-    }
-
-    // extension of the console reporter - with a bunch of helpers for the stdout stream redirection
-    struct ConsoleReporterWithHelpers : public ConsoleReporter
-    {
-        ConsoleReporterWithHelpers(std::ostream& in)
-                : ConsoleReporter(in) {}
-
-        void printVersion() {
-            if(getContextOptions()->no_version == false)
-                s << Color::Cyan << "[doctest] " << Color::None << "doctest version is \""
-                  << DOCTEST_VERSION_STR << "\"\n";
-        }
-
-        void printIntro() {
-            printVersion();
-            s << Color::Cyan << "[doctest] " << Color::None
-              << "run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY "help\" for options\n";
-        }
-
-        void printHelp() {
-            int sizePrefixDisplay = static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
-            printVersion();
-            // clang-format off
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "filter  values: \"str1,str2,str3\" (comma separated strings)\n";
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "filters use wildcards for matching strings\n";
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "something passes a filter if any of the strings in a filter matches\n";
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX "\" PREFIX!!!\n";
-#endif
-            s << Color::Cyan << "[doctest]\n" << Color::None;
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "Query flags - the program quits after them. Available:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "?,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY "h                      "
-              << Whitespace(sizePrefixDisplay*0) <<  "prints this message\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "v,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "version                       "
-              << Whitespace(sizePrefixDisplay*1) << "prints the version\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "c,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "count                         "
-              << Whitespace(sizePrefixDisplay*1) << "prints the number of matching tests\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-cases               "
-              << Whitespace(sizePrefixDisplay*1) << "lists all matching tests by name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-suites              "
-              << Whitespace(sizePrefixDisplay*1) << "lists all matching test suites\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lr,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-reporters                "
-              << Whitespace(sizePrefixDisplay*1) << "lists all registered reporters\n\n";
-            // ================================================================================== << 79
-            s << Color::Cyan << "[doctest] " << Color::None;
-            s << "The available <int>/<string> options/filters are:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case=<filters>           "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case-exclude=<filters>   "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sf,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file=<filters>         "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their file\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file-exclude=<filters> "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their file\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ts,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite=<filters>          "
-              << Whitespace(sizePrefixDisplay*1) << "filters     tests by their test suite\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite-exclude=<filters>  "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their test suite\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase=<filters>             "
-              << Whitespace(sizePrefixDisplay*1) << "filters     subcases by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-exclude=<filters>     "
-              << Whitespace(sizePrefixDisplay*1) << "filters OUT subcases by their name\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "r,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "reporters=<filters>           "
-              << Whitespace(sizePrefixDisplay*1) << "reporters to use (console is default)\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ob,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "order-by=<string>             "
-              << Whitespace(sizePrefixDisplay*1) << "how the tests should be ordered\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       <string> - by [file/suite/name/rand]\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "rs,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "rand-seed=<int>               "
-              << Whitespace(sizePrefixDisplay*1) << "seed for random ordering\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "f,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "first=<int>                   "
-              << Whitespace(sizePrefixDisplay*1) << "the first test passing the filters to\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       execute - for range-based execution\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "l,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "last=<int>                    "
-              << Whitespace(sizePrefixDisplay*1) << "the last test passing the filters to\n";
-            s << Whitespace(sizePrefixDisplay*3) << "                                       execute - for range-based execution\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "aa,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "abort-after=<int>             "
-              << Whitespace(sizePrefixDisplay*1) << "stop after <int> failed assertions\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-filter-levels=<int>   "
-              << Whitespace(sizePrefixDisplay*1) << "apply filters for the first <int> levels\n";
-            s << Color::Cyan << "\n[doctest] " << Color::None;
-            s << "Bool options - can be used like flags and true is assumed. Available:\n\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "s,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "success=<bool>                "
-              << Whitespace(sizePrefixDisplay*1) << "include successful assertions in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "cs,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "case-sensitive=<bool>         "
-              << Whitespace(sizePrefixDisplay*1) << "filters being treated as case sensitive\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "e,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "exit=<bool>                   "
-              << Whitespace(sizePrefixDisplay*1) << "exits after the tests finish\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "d,   --" DOCTEST_OPTIONS_PREFIX_DISPLAY "duration=<bool>               "
-              << Whitespace(sizePrefixDisplay*1) << "prints the time duration of each test\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nt,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-throw=<bool>               "
-              << Whitespace(sizePrefixDisplay*1) << "skips exceptions-related assert checks\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ne,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-exitcode=<bool>            "
-              << Whitespace(sizePrefixDisplay*1) << "returns (or exits) always with success\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nr,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-run=<bool>                 "
-              << Whitespace(sizePrefixDisplay*1) << "skips all runtime doctest operations\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nv,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-version=<bool>             "
-              << Whitespace(sizePrefixDisplay*1) << "omit the framework version in the output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-colors=<bool>              "
-              << Whitespace(sizePrefixDisplay*1) << "disables colors in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "fc,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "force-colors=<bool>           "
-              << Whitespace(sizePrefixDisplay*1) << "use colors even when not in a tty\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nb,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-breaks=<bool>              "
-              << Whitespace(sizePrefixDisplay*1) << "disables breakpoints in debuggers\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ns,  --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-skip=<bool>                "
-              << Whitespace(sizePrefixDisplay*1) << "don't skip test cases marked as skip\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "gnu-file-line=<bool>          "
-              << Whitespace(sizePrefixDisplay*1) << ":n: vs (n): for line numbers in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-path-filenames=<bool>      "
-              << Whitespace(sizePrefixDisplay*1) << "only filenames and no paths in output\n";
-            s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-line-numbers=<bool>        "
-              << Whitespace(sizePrefixDisplay*1) << "0 instead of real line numbers in output\n";
-            // ================================================================================== << 79
-            // clang-format on
-
-            s << Color::Cyan << "\n[doctest] " << Color::None;
-            s << "for more information visit the project documentation\n\n";
-        }
-
-        void printRegisteredReporters() {
-            printVersion();
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all registered reporters\n";
-            for(auto& curr : getReporters())
-                s << "priority: " << std::setw(5) << curr.first.first
-                  << " name: " << curr.first.second << "\n";
-        }
-
-        void output_query_results() {
-            separator_to_stream();
-            if(getContextOptions()->count || getContextOptions()->list_test_cases) {
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "unskipped test cases passing the current filters: "
-                  << g_cs->numTestCasesPassingFilters << "\n";
-            } else if(getContextOptions()->list_test_suites) {
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "unskipped test cases passing the current filters: "
-                  << g_cs->numTestCasesPassingFilters << "\n";
-                s << Color::Cyan << "[doctest] " << Color::None
-                  << "test suites with unskipped test cases passing the current filters: "
-                  << g_cs->numTestSuitesPassingFilters << "\n";
-            }
-        }
-
-        void output_query_preamble_test_cases() {
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all test case names\n";
-            separator_to_stream();
-        }
-
-        void output_query_preamble_test_suites() {
-            s << Color::Cyan << "[doctest] " << Color::None << "listing all test suites\n";
-            separator_to_stream();
-        }
-
-        void output_c_string_with_newline(const char* str) { s << Color::None << str << "\n"; }
-    };
-
-#ifdef DOCTEST_PLATFORM_WINDOWS
-    struct DebugOutputWindowReporter : public ConsoleReporter
-    {
-        DOCTEST_THREAD_LOCAL static std::ostringstream oss;
-
-        DebugOutputWindowReporter()
-                : ConsoleReporter(oss) {}
-
-#define DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(func, type)                                  \
-    void func(type in) override {                                                                  \
-        if(isDebuggerActive()) {                                                                   \
-            bool with_col = g_no_colors;                                                           \
-            g_no_colors   = false;                                                                 \
-            ConsoleReporter::func(in);                                                             \
-            DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str());                                        \
-            oss.str("");                                                                           \
-            g_no_colors = with_col;                                                                \
-        }                                                                                          \
-    }
-
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_run_start, const ContextOptions&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_run_end, const TestRunStats&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_start, const TestCaseData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_end, const CurrentTestCaseStats&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(subcase_start, const SubcaseSignature&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(subcase_end, const SubcaseSignature&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(log_assert, const AssertData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(log_message, const MessageData&)
-        DOCTEST_DEBUG_OUTPUT_WINDOW_REPORTER_OVERRIDE(test_case_skipped, const TestCaseData&)
-    };
-
-    DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
-
-    DebugOutputWindowReporter g_debug_output_rep;
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    // the implementation of parseFlag()
-    bool parseFlagImpl(int argc, const char* const* argv, const char* pattern) {
-        for(int i = argc - 1; i >= 0; --i) {
-            auto temp = std::strstr(argv[i], pattern);
-            if(temp && strlen(temp) == strlen(pattern)) {
-                // eliminate strings in which the chars before the option are not '-'
-                bool noBadCharsFound = true; //!OCLINT prefer early exits and continue
-                while(temp != argv[i]) {
-                    if(*--temp != '-') {
-                        noBadCharsFound = false;
-                        break;
-                    }
-                }
-                if(noBadCharsFound && argv[i][0] == '-')
-                    return true;
-            }
-        }
-        return false;
-    }
-
-    // locates a flag on the command line
-    bool parseFlag(int argc, const char* const* argv, const char* pattern) {
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        // offset (normally 3 for "dt-") to skip prefix
-        if(parseFlagImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX)))
-            return true;
-#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        return parseFlagImpl(argc, argv, pattern);
-    }
-
-    // the implementation of parseOption()
-    bool parseOptionImpl(int argc, const char* const* argv, const char* pattern, String& res) {
-        for(int i = argc - 1; i >= 0; --i) {
-            auto temp = std::strstr(argv[i], pattern);
-            if(temp) { //!OCLINT prefer early exits and continue
-                // eliminate matches in which the chars before the option are not '-'
-                bool noBadCharsFound = true;
-                auto curr            = argv[i];
-                while(curr != temp) {
-                    if(*curr++ != '-') {
-                        noBadCharsFound = false;
-                        break;
-                    }
-                }
-                if(noBadCharsFound && argv[i][0] == '-') {
-                    temp += strlen(pattern);
-                    const unsigned len = strlen(temp);
-                    if(len) {
-                        res = temp;
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    // parses an option and returns the string after the '=' character
-    bool parseOption(int argc, const char* const* argv, const char* pattern, String& res,
-                     const String& defaultVal = String()) {
-        res = defaultVal;
-#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        // offset (normally 3 for "dt-") to skip prefix
-        if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), res))
-            return true;
-#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
-        return parseOptionImpl(argc, argv, pattern, res);
-    }
-
-    // parses a comma separated list of words after a pattern in one of the arguments in argv
-    bool parseCommaSepArgs(int argc, const char* const* argv, const char* pattern,
-                           std::vector<String>& res) {
-        String filtersString;
-        if(parseOption(argc, argv, pattern, filtersString)) {
-            // tokenize with "," as a separator
-            // cppcheck-suppress strtokCalled
-            DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
-            auto pch = std::strtok(filtersString.c_str(), ","); // modifies the string
-            while(pch != nullptr) {
-                if(strlen(pch))
-                    res.push_back(pch);
-                // uses the strtok() internal state to go to the next token
-                // cppcheck-suppress strtokCalled
-                pch = std::strtok(nullptr, ",");
-            }
-            DOCTEST_CLANG_SUPPRESS_WARNING_POP
-            return true;
-        }
-        return false;
-    }
-
-    enum optionType
-    {
-        option_bool,
-        option_int
-    };
-
-    // parses an int/bool option from the command line
-    bool parseIntOption(int argc, const char* const* argv, const char* pattern, optionType type,
-                        int& res) {
-        String parsedValue;
-        if(!parseOption(argc, argv, pattern, parsedValue))
-            return false;
-
-        if(type == 0) {
-            // boolean
-            const char positive[][5] = {"1", "true", "on", "yes"};  // 5 - strlen("true") + 1
-            const char negative[][6] = {"0", "false", "off", "no"}; // 6 - strlen("false") + 1
-
-            // if the value matches any of the positive/negative possibilities
-            for(unsigned i = 0; i < 4; i++) {
-                if(parsedValue.compare(positive[i], true) == 0) {
-                    res = 1; //!OCLINT parameter reassignment
-                    return true;
-                }
-                if(parsedValue.compare(negative[i], true) == 0) {
-                    res = 0; //!OCLINT parameter reassignment
-                    return true;
-                }
-            }
-        } else {
-            // integer
-            // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on unsuccessful parse...
-            int theInt = std::atoi(parsedValue.c_str()); // NOLINT
-            if(theInt != 0) {
-                res = theInt; //!OCLINT parameter reassignment
-                return true;
-            }
-        }
-        return false;
-    }
-} // namespace
-
-Context::Context(int argc, const char* const* argv)
-        : p(new detail::ContextState) {
-    parseArgs(argc, argv, true);
-}
-
-Context::~Context() {
-    if(g_cs == p)
-        g_cs = nullptr;
-    delete p;
-}
-
-void Context::applyCommandLine(int argc, const char* const* argv) { parseArgs(argc, argv); }
-
-// parses args
-void Context::parseArgs(int argc, const char* const* argv, bool withDefaults) {
-    using namespace detail;
-
-    // clang-format off
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file=",        p->filters[0]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sf=",                 p->filters[0]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file-exclude=",p->filters[1]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sfe=",                p->filters[1]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite=",         p->filters[2]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ts=",                 p->filters[2]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite-exclude=", p->filters[3]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tse=",                p->filters[3]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case=",          p->filters[4]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tc=",                 p->filters[4]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case-exclude=",  p->filters[5]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tce=",                p->filters[5]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase=",            p->filters[6]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sc=",                 p->filters[6]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase-exclude=",    p->filters[7]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sce=",                p->filters[7]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "reporters=",          p->filters[8]);
-    parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "r=",                  p->filters[8]);
-    // clang-format on
-
-    int    intRes = 0;
-    String strRes;
-
-#define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default)                                   \
-    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) ||  \
-       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes))   \
-        p->var = !!intRes;                                                                         \
-    else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) ||                           \
-            parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname))                            \
-        p->var = true;                                                                             \
-    else if(withDefaults)                                                                          \
-    p->var = default
-
-#define DOCTEST_PARSE_INT_OPTION(name, sname, var, default)                                        \
-    if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) ||   \
-       parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes))    \
-        p->var = intRes;                                                                           \
-    else if(withDefaults)                                                                          \
-    p->var = default
-
-#define DOCTEST_PARSE_STR_OPTION(name, sname, var, default)                                        \
-    if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", strRes, default) ||         \
-       parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", strRes, default) ||        \
-       withDefaults)                                                                               \
-    p->var = strRes
-
-    // clang-format off
-    DOCTEST_PARSE_STR_OPTION("order-by", "ob", order_by, "file");
-    DOCTEST_PARSE_INT_OPTION("rand-seed", "rs", rand_seed, 0);
-
-    DOCTEST_PARSE_INT_OPTION("first", "f", first, 0);
-    DOCTEST_PARSE_INT_OPTION("last", "l", last, UINT_MAX);
-
-    DOCTEST_PARSE_INT_OPTION("abort-after", "aa", abort_after, 0);
-    DOCTEST_PARSE_INT_OPTION("subcase-filter-levels", "scfl", subcase_filter_levels, 2000000000);
-
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("success", "s", success, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("case-sensitive", "cs", case_sensitive, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("exit", "e", exit, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("duration", "d", duration, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-throw", "nt", no_throw, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-exitcode", "ne", no_exitcode, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-run", "nr", no_run, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-version", "nv", no_version, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-colors", "nc", no_colors, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("force-colors", "fc", force_colors, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-breaks", "nb", no_breaks, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skip", "ns", no_skip, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("gnu-file-line", "gfl", gnu_file_line, !bool(DOCTEST_MSVC));
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-path-filenames", "npf", no_path_in_filenames, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-line-numbers", "nln", no_line_numbers, false);
-    DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skipped-summary", "nss", no_skipped_summary, false);
-    // clang-format on
-
-    if(withDefaults) {
-        p->help             = false;
-        p->version          = false;
-        p->count            = false;
-        p->list_test_cases  = false;
-        p->list_test_suites = false;
-        p->list_reporters   = false;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "help") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "h") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "?")) {
-        p->help = true;
-        p->exit = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "version") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "v")) {
-        p->version = true;
-        p->exit    = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "count") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "c")) {
-        p->count = true;
-        p->exit  = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-cases") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ltc")) {
-        p->list_test_cases = true;
-        p->exit            = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-suites") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lts")) {
-        p->list_test_suites = true;
-        p->exit             = true;
-    }
-    if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-reporters") ||
-       parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lr")) {
-        p->list_reporters = true;
-        p->exit           = true;
-    }
-}
-
-// allows the user to add procedurally to the filters from the command line
-void Context::addFilter(const char* filter, const char* value) { setOption(filter, value); }
-
-// allows the user to clear all filters from the command line
-void Context::clearFilters() {
-    for(auto& curr : p->filters)
-        curr.clear();
-}
-
-// allows the user to override procedurally the int/bool options from the command line
-void Context::setOption(const char* option, int value) {
-    setOption(option, toString(value).c_str());
-}
-
-// allows the user to override procedurally the string options from the command line
-void Context::setOption(const char* option, const char* value) {
-    auto argv   = String("-") + option + "=" + value;
-    auto lvalue = argv.c_str();
-    parseArgs(1, &lvalue);
-}
-
-// users should query this in their main() and exit the program if true
-bool Context::shouldExit() { return p->exit; }
-
-void Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }
-
-void Context::setAssertHandler(detail::assert_handler ah) { p->ah = ah; }
-
-// the main function that does all the filtering and test running
-int Context::run() {
-    using namespace detail;
-
-    auto old_cs        = g_cs;
-    g_cs               = p;
-    is_running_in_test = true;
-    g_no_colors        = p->no_colors;
-    p->resetRunData();
-
-    ConsoleReporterWithHelpers g_con_rep(std::cout);
-    registerReporter("console", 0, g_con_rep);
-
-    // setup default reporter if none is given through the command line
-    p->reporters_currently_used.clear();
-    if(p->filters[8].empty())
-        p->reporters_currently_used.push_back(getReporters()[reporterMap::key_type(0, "console")]);
-
-    // check to see if any of the registered reporters has been selected
-    for(auto& curr : getReporters()) {
-        if(matchesAny(curr.first.second.c_str(), p->filters[8], false, p->case_sensitive))
-            p->reporters_currently_used.push_back(curr.second);
-    }
-
-    // always use the debug output window reporter
-#ifdef DOCTEST_PLATFORM_WINDOWS
-    if(isDebuggerActive())
-        p->reporters_currently_used.push_back(&g_debug_output_rep);
-#endif // DOCTEST_PLATFORM_WINDOWS
-
-    // handle version, help and no_run
-    if(p->no_run || p->version || p->help || p->list_reporters) {
-        if(p->version)
-            g_con_rep.printVersion();
-        if(p->help)
-            g_con_rep.printHelp();
-        if(p->list_reporters)
-            g_con_rep.printRegisteredReporters();
-
-        g_cs               = old_cs;
-        is_running_in_test = false;
-
-        return EXIT_SUCCESS;
-    }
-
-    g_con_rep.printIntro();
-
-    std::vector<const TestCase*> testArray;
-    for(auto& curr : getRegisteredTests())
-        testArray.push_back(&curr);
-    p->numTestCases = testArray.size();
-
-    // sort the collected records
-    if(!testArray.empty()) {
-        if(p->order_by.compare("file", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), fileOrderComparator);
-        } else if(p->order_by.compare("suite", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), suiteOrderComparator);
-        } else if(p->order_by.compare("name", true) == 0) {
-            std::qsort(&testArray[0], testArray.size(), sizeof(TestCase*), nameOrderComparator);
-        } else if(p->order_by.compare("rand", true) == 0) {
-            std::srand(p->rand_seed);
-
-            // random_shuffle implementation
-            const auto first = &testArray[0];
-            for(size_t i = testArray.size() - 1; i > 0; --i) {
-                int idxToSwap = std::rand() % (i + 1); // NOLINT
-
-                const auto temp = first[i];
-
-                first[i]         = first[idxToSwap];
-                first[idxToSwap] = temp;
-            }
-        }
-    }
-
-    if(p->list_test_cases)
-        g_con_rep.output_query_preamble_test_cases();
-
-    std::set<String> testSuitesPassingFilt;
-    if(p->list_test_suites)
-        g_con_rep.output_query_preamble_test_suites();
-
-    bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
-
-    if(!query_mode)
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start, *g_cs);
-
-    // invoke the registered functions if they match the filter criteria (or just count them)
-    for(auto& curr : testArray) {
-        const auto tc = *curr;
-
-        bool skip_me = false;
-        if(tc.m_skip && !p->no_skip)
-            skip_me = true;
-
-        if(!matchesAny(tc.m_file, p->filters[0], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_file, p->filters[1], false, p->case_sensitive))
-            skip_me = true;
-        if(!matchesAny(tc.m_test_suite, p->filters[2], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_test_suite, p->filters[3], false, p->case_sensitive))
-            skip_me = true;
-        if(!matchesAny(tc.m_name, p->filters[4], true, p->case_sensitive))
-            skip_me = true;
-        if(matchesAny(tc.m_name, p->filters[5], false, p->case_sensitive))
-            skip_me = true;
-
-        if(!skip_me)
-            p->numTestCasesPassingFilters++;
-
-        // skip the test if it is not in the execution range
-        if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
-           (p->first > p->numTestCasesPassingFilters))
-            skip_me = true;
-
-        if(skip_me) {
-            if(!query_mode)
-                DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
-            continue;
-        }
-
-        // do not execute the test if we are to only count the number of filter passing tests
-        if(p->count)
-            continue;
-
-        // print the name of the test and don't execute it
-        if(p->list_test_cases) {
-            g_con_rep.output_c_string_with_newline(tc.m_name);
-            continue;
-        }
-
-        // print the name of the test suite if not done already and don't execute it
-        if(p->list_test_suites) {
-            if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] != '\0') {
-                g_con_rep.output_c_string_with_newline(tc.m_test_suite);
-                testSuitesPassingFilt.insert(tc.m_test_suite);
-                p->numTestSuitesPassingFilters++;
-            }
-            continue;
-        }
-
-        // execute the test if it passes all the filtering
-        {
-            p->currentTest = &tc;
-
-            p->failure_flags  = TestCaseFailureReason::None;
-            p->seconds_so_far = 0;
-            p->error_string   = "";
-
-            // reset non-atomic counters
-            p->numAssertsFailedForCurrentTestCase = 0;
-            p->numAssertsForCurrentTestCase       = 0;
-
-            p->subcasesPassed.clear();
-            do {
-                // reset some of the fields for subcases (except for the set of fully passed ones)
-                p->should_reenter       = false;
-                p->subcasesCurrentLevel = 0;
-                p->subcasesEnteredLevels.clear();
-
-                // reset stuff for logging with INFO()
-                p->stringifiedContexts.clear();
-
-                // reset atomic counters
-                p->numAssertsFailedForCurrentTestCase_atomic = 0;
-                p->numAssertsForCurrentTestCase_atomic       = 0;
-
-                DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
-
-                g_timer.start();
-
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-                try {
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-                    FatalConditionHandler fatalConditionHandler; // Handle signals
-                    // execute the test
-                    tc.m_test();
-                    fatalConditionHandler.reset();
-#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
-                } catch(const TestFailureException&) {
-                    p->failure_flags |= TestCaseFailureReason::AssertFailure;
-                } catch(...) {
-                    p->error_string = translateActiveException();
-                    p->failure_flags |= TestCaseFailureReason::Exception;
-                }
-#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
-
-                p->seconds_so_far += g_timer.getElapsedSeconds();
-
-                // update the non-atomic counters
-                p->numAsserts += p->numAssertsForCurrentTestCase_atomic;
-                p->numAssertsForCurrentTestCase += p->numAssertsForCurrentTestCase_atomic;
-                p->numAssertsFailed += p->numAssertsFailedForCurrentTestCase_atomic;
-                p->numAssertsFailedForCurrentTestCase +=
-                        p->numAssertsFailedForCurrentTestCase_atomic;
-
-                // exit this loop if enough assertions have failed - even if there are more subcases
-                if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after) {
-                    p->should_reenter = false;
-                    p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts;
-                }
-
-                // call it from here only if we will continue looping for other subcases and
-                // call it again outside of the loop for one final time - with updated flags
-                if(p->should_reenter == true) {
-                    DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-                    // remove these flags - it is expected that the reporters have handled these issues
-                    p->failure_flags &= ~TestCaseFailureReason::Exception;
-                    p->failure_flags &= ~TestCaseFailureReason::AssertFailure;
-                }
-            } while(p->should_reenter == true);
-
-            if(p->numAssertsFailedForCurrentTestCase)
-                p->failure_flags |= TestCaseFailureReason::AssertFailure;
-
-            if(Approx(p->currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
-               Approx(p->seconds_so_far).epsilon(DBL_EPSILON) > p->currentTest->m_timeout)
-                p->failure_flags |= TestCaseFailureReason::Timeout;
-
-            if(tc.m_should_fail) {
-                if(p->failure_flags) {
-                    p->failure_flags |= TestCaseFailureReason::ShouldHaveFailedAndDid;
-                } else {
-                    p->failure_flags |= TestCaseFailureReason::ShouldHaveFailedButDidnt;
-                }
-            } else if(p->failure_flags && tc.m_may_fail) {
-                p->failure_flags |= TestCaseFailureReason::CouldHaveFailedAndDid;
-            } else if(tc.m_expected_failures > 0) {
-                if(p->numAssertsFailedForCurrentTestCase == tc.m_expected_failures) {
-                    p->failure_flags |= TestCaseFailureReason::FailedExactlyNumTimes;
-                } else {
-                    p->failure_flags |= TestCaseFailureReason::DidntFailExactlyNumTimes;
-                }
-            }
-
-            bool ok_to_fail = (TestCaseFailureReason::ShouldHaveFailedAndDid & p->failure_flags) ||
-                              (TestCaseFailureReason::CouldHaveFailedAndDid & p->failure_flags) ||
-                              (TestCaseFailureReason::FailedExactlyNumTimes & p->failure_flags);
-
-            // if any subcase has failed - the whole test case has failed
-            if(p->failure_flags && !ok_to_fail)
-                p->numTestCasesFailed++;
-
-            DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
-
-            p->currentTest = nullptr;
-
-            // stop executing tests if enough assertions have failed
-            if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
-                break;
-        }
-    }
-
-    if(!query_mode)
-        DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
-    else
-        g_con_rep.output_query_results();
-
-    g_cs               = old_cs;
-    is_running_in_test = false;
-
-    if(p->numTestCasesFailed && !p->no_exitcode)
-        return EXIT_FAILURE;
-    return EXIT_SUCCESS;
-}
-
-DOCTEST_DEFINE_DEFAULTS(CurrentTestCaseStats);
-
-DOCTEST_DEFINE_DEFAULTS(TestRunStats);
-
-IReporter::~IReporter() = default;
-
-int IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); }
-const IContextScope* const* IReporter::get_active_contexts() {
-    return get_num_active_contexts() ? &detail::g_infoContexts[0] : nullptr;
-}
-
-int IReporter::get_num_stringified_contexts() { return detail::g_cs->stringifiedContexts.size(); }
-const String* IReporter::get_stringified_contexts() {
-    return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] : nullptr;
-}
-
-int registerReporter(const char* name, int priority, IReporter& r) {
-    getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), &r));
-    return 0;
-}
-
-// see these issues on the reasoning for this:
-// - https://github.com/onqtam/doctest/issues/143#issuecomment-414418903
-// - https://github.com/onqtam/doctest/issues/126
-void DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS() { std::cout << std::string(); }
-
-} // namespace doctest
-
-#endif // DOCTEST_CONFIG_DISABLE
-
-#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); }
-#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-
-DOCTEST_CLANG_SUPPRESS_WARNING_POP
-DOCTEST_MSVC_SUPPRESS_WARNING_POP
-DOCTEST_GCC_SUPPRESS_WARNING_POP
-
-#endif // DOCTEST_LIBRARY_IMPLEMENTATION
-#endif // DOCTEST_CONFIG_IMPLEMENT
diff --git a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_main.cpp b/QiaoJiaSystem/UnitTest/doctest/parts/doctest_main.cpp
deleted file mode 100644
index a3f832e..0000000
--- a/QiaoJiaSystem/UnitTest/doctest/parts/doctest_main.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
-#include "doctest.h"
diff --git a/QiaoJiaSystem/UnitTest/main.cpp b/QiaoJiaSystem/UnitTest/main.cpp
deleted file mode 100644
index ba78ed0..0000000
--- a/QiaoJiaSystem/UnitTest/main.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Created by basic on 19-1-25.
-//
-
-#define DOCTEST_CONFIG_IMPLEMENT
-#include "doctest.h"
-
-int main(int argc, char** argv) {
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
-    doctest::Context context;
-
-    // !!! THIS IS JUST AN EXAMPLE SHOWING HOW DEFAULTS/OVERRIDES ARE SET !!!
-
-    // defaults
-    context.addFilter("test-case-exclude", "*math*"); // exclude test cases with "math" in the name
-    context.setOption("rand-seed", 324);              // if order-by is set to "rand" ise this seed
-    context.setOption("order-by", "file");            // sort the test cases by file and line
-
-    context.applyCommandLine(argc, argv);
-
-    // overrides
-    context.setOption("no-breaks", true); // don't break in the debugger when assertions fail
-
-    int res = context.run(); // run queries, or run tests unless --no-run is specified
-
-    if(context.shouldExit()) // important - query flags (and --exit) rely on the user doing this
-        return res;          // propagate the result of the tests
-
-    context.clearFilters(); // removes all filters added up to this point
-
-    //int client_stuff_return_code = program();
-    //some_program_code(argc, argv);
-    // your program - if the testing framework is integrated in your production code
-
-    return res ;
-    //client_stuff_return_code; // the result from doctest is propagated here as well
-}
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
index 65da203..6c6d6f1 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
+++ b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
@@ -50,13 +50,13 @@
     ../StructureApp/FaceRpcElement.cpp
     ../StructureApp/FaceExtractElement.cpp
     ../StructureApp/ImageDrawElement.cpp
-    ../StructureApp/RecordVideoElement.cpp
+#    ../StructureApp/RecordVideoElement.cpp
     ../StructureApp/JudgmentRetrogradeTool.cpp
     ../StructureApp/PerimeterElement.cpp
 
-    ../StructureApp/NewRecordVideoElement.cpp
-    ../StructureApp/NewEncodeVideoManager.cpp
-    ../StructureApp/NewEncodeVideo.cpp
+#    ../StructureApp/NewRecordVideoElement.cpp
+#    ../StructureApp/NewEncodeVideoManager.cpp
+#    ../StructureApp/NewEncodeVideo.cpp
     ../StructureApp/HiredisTool.cpp
     ../StructureApp/PersonElement.cpp
     ../StructureApp/PerStaticElement.cpp
@@ -67,8 +67,8 @@
     ../YoloServer/rpc/YoloServer.cpp
     ../FaceDetectServer/rpc/FaceServer.cpp
     ../FaceSearchServer/rpc/FaceSearchServer.cpp
-    ../RecordVideo/rpc/RecordVideo.cpp
-    ../VideoToImage/rpc/RtspAnalysServer.cpp
+#    ../RecordVideo/rpc/RecordVideo.cpp
+    ../VideoToImageMulth/rpc/RtspAnalysServer.cpp
 
     #閫氱敤妯″潡
     ../../../BasicPlatForm/basic/io/io.cpp
@@ -185,12 +185,12 @@
     ../VideoServer/QiaoJia/dispatchTool
 
     ../VptServer/rpc
-    ../RecordVideo/rpc
+#    ../RecordVideo/rpc
     ../StructureApp/rpc
     ../YoloServer/rpc
     ../FaceDetectServer/rpc
     ../FaceSearchServer/rpc
-    ../VideoToImage/rpc
+    ../VideoToImageMulth/rpc
 
     ../../../BasicPlatForm/
 
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/main.cpp b/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
index d5a83dd..d54a387 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
@@ -9,7 +9,7 @@
 #include "DBManageClass.h"
 #include "RtspAnalysElement.h"
 #include <basic/debug/Debug.h>
-#include "StructureApp/NewEncodeVideoManager.h"
+//#include "StructureApp/NewEncodeVideoManager.h"
 //#include "PerimeterAlarmManager.h"
 //#include "KeepRightManager.h"
 //"192.168.1.4", 8000, "admin", "basic123"
diff --git a/QiaoJiaSystem/VideoToImage/CMakeLists.txt b/QiaoJiaSystem/VideoToImage/CMakeLists.txt
deleted file mode 100644
index 6ca2f70..0000000
--- a/QiaoJiaSystem/VideoToImage/CMakeLists.txt
+++ /dev/null
@@ -1,103 +0,0 @@
-#cmake_minimum_required(VERSION 2.8)
-
-#project(VideoAnalysFromHC)
-#add_executable(${PROJECT_NAME} "main.cpp")
-cmake_minimum_required(VERSION 3.5)
-project(VideoToImage)
-set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_BUILD_TYPE debug)
-add_compile_options(-fPIC)
-add_definitions(-DGLOG)
-add_definitions(-DDEBUG_ERR -DDEBUG_INFO -fpermissive)
-
-SET(LIBS
-    glog
-    Ice
-
-    crypto
-
-
-    #ffmpeg
-    avformat
-    avcodec
-    swresample
-    swscale
-    avutil
-    bz2 dl z
-
-    #QT5
-    Qt5Core
-    Qt5Sql
-    Qt5Gui
-
-
-    cuda jsoncpp
-    #    cudart
-    #    cublas
-    opencv_world
-    jsoncpp
-    pthread
-    hiredis
-    )
-include_directories(
-
-    #glog
-    ../../../BasicPlatForm/libs/glog/include
-    ./rpc
-    ../VideoServer
-
-    ../VideoServer/QiaoJia/DB
-    ../VideoServer/QiaoJia/dispatchTool
-    ../StructureApp/
-
-    ../../../BasicPlatForm/
-
-    ../../../BasicPlatForm/basic/pipe/
-
-
-
-    ../../../BasicPlatForm/libs/opencv/include
-
-    ../../../BasicPlatForm/libs/ffmpeg/include
-    ../../../BasicPlatForm/libs/jsoncpp/include
-    ../../../BasicPlatForm/libs/Ice-3.7.0/include
-
-
-    /usr/include/x86_64-linux-gnu/qt5
-    /usr/include/x86_64-linux-gnu/qt5/QtCore/
-    /usr/include/x86_64-linux-gnu/qt5/QtSql/
-
-    ../../../BasicPlatForm/libs/hiredis-master/include
-    ../../../BasicPlatForm/basic/timer_counter/
-)
-
-link_directories(
-    #glog
-    ../../../BasicPlatForm/libs/glog/lib
-    ../../../BasicPlatForm/libs/openssl/lib
-    ../../../BasicPlatForm/libs/opencv/lib
-    ../../../BasicPlatForm/libs/ffmpeg/lib
-    ../../../BasicPlatForm/libs/jsoncpp/lib
-
-#   ../../../BasicPlatForm/libs/libuuid/lib
-    ../../../BasicPlatForm/libs/Ice-3.7.0/lib64
-
-    ../../../BasicPlatForm/libs/hiredis-master/lib
-)
-
-add_executable(${PROJECT_NAME}
-      ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
-#       ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
-       ../VideoServer/QiaoJia/DB/LDBTool.cpp
-       ./rpc/RtspAnalysServer.cpp
-        RtspCaptureElement.cpp
-        RtspAnalysManager.cpp
-       ../StructureApp/HiredisTool.cpp
-       ../../../BasicPlatForm/basic/timer_counter/Clocktimer.h
-       ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
-       main.cpp
-    )
-target_link_libraries(${PROJECT_NAME}
-    ${LIBS}
-    )
diff --git a/QiaoJiaSystem/VideoToImage/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImage/RtspAnalysManager.cpp
deleted file mode 100644
index 267aa27..0000000
--- a/QiaoJiaSystem/VideoToImage/RtspAnalysManager.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-//
-// Created by ps on 18-9-26.
-//
-
-#include "RtspAnalysManager.h"
-#include <basic/pipe_element/ffmpeg/basic_struct_for_video_image.h>
-
-
-using std::string;
-
-RtspAnalysManager::RtspAnalysManager(LDBTool *_dbTool) : m_lDBTool(nullptr), m_maxCount(50), m_currentCount(0) {
-    m_lDBTool=new LDBTool;
-    init();
-
-}
-
-
-
-static std::string rtspAddrBuild(std::string ip, const int port, std::string username,
-                                 std::string passwd, std::string brand) {
-    std::string rtsp_url;
-    if (brand == "haikang") {
-        rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
-                   "/h264/ch1/main/av_stream";
-    } else if (brand == "dahua") {
-        //rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0
-        rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
-                   "/cam/realmonitor?channel=1&subtype=0";
-        //TODO
-    } else if (brand == "yushi") {
-        rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
-                   "/video1";
-    } else {
-        //TODO
-    }
-
-    return rtsp_url;
-}
-
-void RtspAnalysManager::init() {
-
-    auto lst = m_lDBTool->searchCamDevTableAll();
-    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
-
-    //璁剧疆瑙嗛鐨勬渶闀垮拰鏈�鐭椂闂撮棿闅�
-    appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
-    appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
-    if (lst.size() > 0) {
-
-        for (auto item : lst)
-        {
-            std::string t_camIdex = item.str_cam_dev_id.toStdString();
-            std::string rtsp_url = rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(),
-                                                 item.str_password.toStdString(), item.str_brand.toStdString());
-            INFO("cam add is " << item.str_addr.toStdString());
-
-            addCamera(t_camIdex, rtsp_url);
-
-        }
-    } else {
-        ERR("searchCamDevTableAll size is 0");
-    }
-
-}
-
-RtspAnalysManager::~RtspAnalysManager() {
-    for (auto controller: m_controllers) {
-        delete controller.second;
-    }
-    m_controllers.clear();
-}
-
-int RtspAnalysManager::addCamera(const std::string &index, const std::string& rtsp) {
-    auto lst = m_lDBTool->searchCamDevTableAll();
-    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
-
-    //appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
-    //appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
-
-    if (m_controllers.find(index) == m_controllers.end()) {
-        if (m_currentCount >= m_maxCount) {
-            ERR("addCamera faild, camera's num is full!")
-            return -1;
-        }
-        DBG("RTSP: "<<rtsp<<"  INDEX:"<<index);
-        m_controllers[index] = new RtspCaptureElement(rtsp,index, 25,3000,0);
-        m_controllers[index]->start();
-        m_controllers[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,lst_dev.n_cut_max_duration);
-        m_currentCount++;
-        return 0;
-
-    } else {
-        removeCamera(index);
-        DBG("removeCamera " << index)
-        return addCamera(rtsp, index);
-    }
-}
-
-int RtspAnalysManager::removeCamera(const std::string &index) {
-    if (m_controllers.find(index) == m_controllers.end())return -1;
-    auto controller = m_controllers[index];
-    controller->stop();
-    controller->wait();
-    delete controller;
-    m_controllers.erase(index);
-    m_currentCount--;
-    return 0;
-}
-
-int RtspAnalysManager::removeAll() {
-    for (auto controller: m_controllers) {
-        controller.second->stop();
-    }
-    for (auto controller: m_controllers) {
-        controller.second->wait();
-        delete controller.second;
-    }
-    m_controllers.clear();
-    m_currentCount = 0;
-    return 0;
-}
-
-int RtspAnalysManager::getMaxCamCount() {
-    return m_maxCount;
-}
-
-int RtspAnalysManager::getCurrentCamCount() {
-    return m_currentCount;
-}
-::std::string RtspAnalysManager::recordVideo(const ::std::string& name, const ::Ice::Current&)
-{
-    ImageName_s_t nameSt=ImageName_s_t::fromString(name);
-    if(nameSt.Valid())
-    {
-        auto pCaptureElem = m_controllers.find(nameSt.m_camId);
-        if(pCaptureElem!= m_controllers.end())
-        {
-            pCaptureElem->second->SaveVideo(name);
-        }
-    }
-    else{
-        ERR("Record Video Failed:Name Not Valid  Name:  "<<name);
-    }
-    return name;
-}
-
-
-
diff --git a/QiaoJiaSystem/VideoToImage/RtspAnalysManager.h b/QiaoJiaSystem/VideoToImage/RtspAnalysManager.h
deleted file mode 100644
index ec0f259..0000000
--- a/QiaoJiaSystem/VideoToImage/RtspAnalysManager.h
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Created by ps on 18-9-26.
-//
-
-#ifndef RTSPANALYSMANAGER
-#define RTSPANALYSMANAGER
-
-#include <iostream>
-#include <map>
-#include "RtspCaptureElement.h"
-#include <VideoServer/QiaoJia/DB/LDBTool.h>
-#include <basic/util/app/AppPreference.hpp>
-#include "RtspAnalysServer.h"
-
-class RtspAnalysManager :public ::RtspAnalys::RtspAnalysServer{
-
-public:
-
-    RtspAnalysManager():m_maxCount(50), m_currentCount(0){
-        m_lDBTool=new LDBTool;
-        init();
-    }
-    RtspAnalysManager(LDBTool *_dbTool);
-    virtual ::std::string recordVideo(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent);
-    virtual ~RtspAnalysManager();
-
-    int addCamera(const std::string &, const std::string& rtsp);
-
-    int removeCamera(const std::string &);
-
-    int removeAll();
-
-    int getMaxCamCount();
-
-    int getCurrentCamCount();
-
-private:
-    void init();
-
-private:
-    LDBTool *m_lDBTool;
-
-    std::map<std::string, RtspCaptureElement *> m_controllers;
-    //褰撳墠鎽勫儚澶寸殑鏁伴噺
-    int m_currentCount;
-    // 鎽勫儚澶寸殑鏈�澶ф暟閲�
-    int m_maxCount;
-
-};
-
-
-#endif //VIDEOANALYSFROMHC_RTSPANALYSELEMENT_H
diff --git a/QiaoJiaSystem/VideoToImage/RtspCaptureElement.cpp b/QiaoJiaSystem/VideoToImage/RtspCaptureElement.cpp
deleted file mode 100644
index 67ad6cd..0000000
--- a/QiaoJiaSystem/VideoToImage/RtspCaptureElement.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#include "RtspCaptureElement.h"
-#include <basic/debug/Debug.h>
-#include <opencv2/opencv.hpp>
-#include <basic/timer_counter/Clocktimer.h>
-#include <basic/pipe_element/ffmpeg/cap_ffmpeg_impl.hpp>
-#include <thread>
-#include <basic/util/app/AppPreference.hpp>
-#include <QString>
-#include <QDateTime>
-RtspCaptureElement::RtspCaptureElement(const std::string &path, const std::string& camId,int fps, int reopenTime, int gpuIndex):
-    TimerElement(10),m_path(path),m_gpuIndex(gpuIndex),
-    m_reopenTime(reopenTime),m_camId(camId){
-    m_cutPath= appPref.getStringData("user.loop.absolute.path");
-
-    assert(!m_cutPath.empty());
-    m_capture = new CvCapture_FFMPEG(m_camId);
-}
-
-//瀹氭椂鎵ц,灏�
-void RtspCaptureElement::timerFunc()
-{
-    u_char *data = nullptr;
-    int width = 0;
-    int height = 0;
-    int step = 0;
-    int cn = 0;
-    DBG("GRABFrame "<<m_camId);
-    bool ret = m_capture->grabFrame();
-    if (!ret) {
-        if (m_reopenTime < 0) {
-            stop();
-            INFO("grabFrame faild, element stopping");
-            return;
-        } else {
-            usleep(m_reopenTime * 100);
-            INFO("grabFrame faild, try reopen video: " << m_path);
-            openVideo();
-            ret = m_capture->grabFrame();
-            if (!ret)return;
-        }
-    }
-
-    m_picCount++;
-    //鍑犲紶閫変竴寮犳斁鍏edis
-    if (m_picCount % m_nPicsPickOne != 0) {
-        return;
-    } else {
-        m_picCount.store(0);
-    }
-
-    {
-        ClockTimer timer("FrameToImage");
-        m_capture->retrieveFrame(0, &data, &step, &width, &height, &cn);
-
-        cv::Mat img(height, width, CV_8UC3, data, step);
-        cv::Mat copyMat;
-        img.copyTo(copyMat);
-        std::string imageName = m_capture->GetImageName();
-    }
-    fireConnectors();
-}
-
-std::string RtspCaptureElement::MakeDir(const std::string &timeStamp)
-{
-    std::string t_FilePath = m_cutPath;
-
-    if (t_FilePath.back() != '/') {
-        t_FilePath.push_back('/');
-    }
-    char buf[24];
-    QDateTime dt = QDateTime::fromString(QString::fromStdString(timeStamp), "yyyy-MM-dd hh:mm:ss:zzz");
-
-    std::string t_strTime=dt.toString("yyyyMMddhh").toStdString();
-    // DBG("t_strTime="<<t_strTime);
-    t_FilePath.append(m_camId + "/" + t_strTime.substr(0, 6)+ "/" +t_strTime.substr(6, 2) + "/");
-    //YYYYMMDDHH
-    t_FilePath.append(t_strTime.substr(0,10)+ "/");
-    std::string t_cmd = "mkdir -p '";
-    t_cmd.append(t_FilePath + "'");
-    //#get path mkdir path
-    system(t_cmd.c_str());
-
-    return t_FilePath;
-}
-void RtspCaptureElement::SaveVideo(const std::string &strImageName)
-{
-    std::string strTimeStamp= AppUtil::getTimeUSecString();
-    std::string strPath=MakeDir(strTimeStamp);
-    m_capture->SaveVideoByImageName(strPath,strImageName);
-}
-
-
-void RtspCaptureElement::openVideo()
-{
-    if(m_gpuIndex>=0){
-        setenv("CUDA_VISIBLE_DEVICES", std::to_string(m_gpuIndex).c_str(),0);
-    }
-    bool bResult = m_capture->open(m_path.c_str(),m_gpuIndex>=0);
-    if(bResult)
-    {
-        INFO("GPUIndex: "<<m_gpuIndex<<" VideoPath:"<<m_path<<" Succeed");
-    } else{
-        ERR("GPUIndex: "<<m_gpuIndex<<" VideoPath:"<<m_path<<" Failed");
-    }
-}
-
-//绾跨▼鍚姩涔嬪墠璋冪敤,
-void RtspCaptureElement::threadInitial()
-{
-    openVideo();
-}
-
-//绾跨▼缁撴潫鐨勬椂鍊欒皟鐢�,鍏抽棴ffmpeg娴�
-void RtspCaptureElement::threadClosing()
-{
-    m_capture->close();
-    delete m_capture;
-    m_capture = nullptr;
-}
-
-//璁剧疆淇濆瓨瑙嗛鐨勬渶灏忓拰鏈�澶ф椂闀�
-void RtspCaptureElement::SetVideoMinMaxSeconds(const int minSeconds, const int maxSeconds)
-{
-    INFO("VideoMinSeconds: "<<minSeconds<<" VideoMaxSeconds: "<<maxSeconds);
-    m_capture->SetMinMaxVideoSeconds(minSeconds,maxSeconds);
-}
-
diff --git a/QiaoJiaSystem/VideoToImage/RtspCaptureElement.h b/QiaoJiaSystem/VideoToImage/RtspCaptureElement.h
deleted file mode 100644
index 7ea7625..0000000
--- a/QiaoJiaSystem/VideoToImage/RtspCaptureElement.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef RTSPCAPTUREELEMENT_H
-#define RTSPCAPTUREELEMENT_H
-
-#include <basic/pipe/TimerElement.h>
-#include <opencv2/opencv.hpp>
-#include "../StructureApp/HiredisTool.h"
-#include <atomic>
-struct CvCapture_FFMPEG;
-
-    /**
-     * 浣跨敤ffmpeg灏佽鐨勮棰戦噰闆嗘祦姘村厓绱�
-     * 杈撳叆锛宺tsp鍦板潃鎴栨枃浠讹紙mp4鎴朼vi锛夎矾寰勶紝杈撳嚭opencv涓殑cv::Mat
-     * 鏀寔GPU纭В鐮�
-     */
-    class RtspCaptureElement: public TimerElement {
-    public:
-        RtspCaptureElement(const std::string& path,const std::string& camId, int fps = 30, int reOpenTime = -1, int gpuIndex = -1);
-        void SaveVideo(const std::string& strImageName);
-        void SetVideoMinMaxSeconds(const int minSeconds,const int maxSeconds);
-    private:
-        virtual void timerFunc() override;
-        virtual void threadInitial() override;
-        virtual void threadClosing() override;
-        void openVideo();
-
-        //
-        std::string MakeDir(const std::string& timeStamp);
-    private:
-        //鐢ㄦ潵鎶撳彇瑙嗛鐨凢fmpeg鐨勫皝瑁呯被
-        CvCapture_FFMPEG* m_capture;
-        //淇濆瓨瑙嗛娴佺殑璺緞,绫讳技浜巖tsp://admin:a1234567@192.168.1.201:554/h264/ch2/main/av_stream
-        std::string m_path;
-
-        // Redis鐨勫伐鍏风被
-        HiredisTool m_redisTool;
-
-        //瀵逛繚瀛樺埌Redis鐨勫浘鐗囪繘琛岃鏁�
-        std::atomic<int> m_picCount{0};
-        //GPU鐨勭储寮�
-        int m_gpuIndex;
-
-        //鎵撳紑瑙嗛娴佸け璐ョ殑鏃跺�欙紝sleep涓�娈垫椂闂�
-        int m_reopenTime;
-
-        //鎽勫儚鏈篒D
-        std::string m_camId;
-
-        //鐢ㄦ潵淇濆瓨褰曞儚瑙嗛鐨勮矾寰�
-        std::string m_cutPath;
-
-        //鍑犲紶鍥句涪涓�寮�,鐩墠鏄�4寮犱涪涓�寮�
-        const int m_nPicsPickOne = 8;
-
-        //姣忓彴鎽勫儚鏈轰繚瀛樺埌Redis鐨勫浘鐗囨暟閲忕殑鏈�澶у��
-        const int M_CAM_PIC_MAX_COUNT = 50;
-    };
-
-#endif // VIDEOCAPTUREELEMENT_H
diff --git a/QiaoJiaSystem/VideoToImage/main.cpp b/QiaoJiaSystem/VideoToImage/main.cpp
deleted file mode 100644
index 31fee0b..0000000
--- a/QiaoJiaSystem/VideoToImage/main.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <stdio.h>
-#include <iostream>
-#include <unistd.h>
-#include <cstring>
-#include "RtspAnalysManager.h"
-#include <basic/debug/Debug.h>
-#include <thread>
-#include <Ice/Ice.h>
-#include <basic/rpc/IceRpc.hpp>
-//"192.168.1.4", 8000, "admin", "basic123"
-
-using namespace std;
-
-#include <basic/util/file/FileUtil.h>
-#include <basic/util/app/AppPreference.hpp>
-#include <basic/util/app/AppConfig.h>
-#include <basic/util/app/AppConfig.h>
-
-static void startManager(LDBTool *_dbTool) {
-    RtspAnalysManager rtspAnalysManager(_dbTool);
-    while (1) {
-        sleep(1 * 60 * 60 * 12);
-    }
-}
-
-
-
-int main(int argc, char **argv) {
-    SAVE_APP_ARGS
-    std::cout<<__DATE__<<" "<<__TIME__<<std::endl;
-#ifdef GLOG
-        ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
-#endif
-
-    appPref.setIntData("gpu.index", 0);
-    appPref.setIntData("show.image", 0);
-
-
-
-//    LDBTool _dbTool;
-//    thread startRtspAnalys(startManager, &_dbTool);
-//    startRtspAnalys.detach();
-    appPref.setStringData("user.loop.absolute.path", appConfig.getStringProperty("cutPath"));
-    IceRpcServer<RtspAnalysManager> server("RtspAnalysServer", 10009, "tcp");
-    server.setMessageSizeMax(1024 * 1024 * 50);
-    server.setPoolInitSize(1);
-    server.setPoolMaxSize(1);
-    server.runWaitShutDown();
-    return 0;
-
-}
diff --git a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.cpp b/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.cpp
deleted file mode 100644
index 28a545a..0000000
--- a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-//
-// Ice version 3.7.0
-//
-// <auto-generated>
-//
-// Generated from file `RtspAnalysServer.ice'
-//
-// Warning: do not edit this file.
-//
-// </auto-generated>
-//
-
-#include <RtspAnalysServer.h>
-#include <IceUtil/PushDisableWarnings.h>
-#include <Ice/LocalException.h>
-#include <Ice/ValueFactory.h>
-#include <Ice/OutgoingAsync.h>
-#include <Ice/InputStream.h>
-#include <Ice/OutputStream.h>
-#include <IceUtil/PopDisableWarnings.h>
-
-#if defined(_MSC_VER)
-#   pragma warning(disable:4458) // declaration of ... hides class member
-#elif defined(__clang__)
-#   pragma clang diagnostic ignored "-Wshadow"
-#elif defined(__GNUC__)
-#   pragma GCC diagnostic ignored "-Wshadow"
-#endif
-
-#ifndef ICE_IGNORE_VERSION
-#   if ICE_INT_VERSION / 100 != 307
-#       error Ice version mismatch!
-#   endif
-#   if ICE_INT_VERSION % 100 > 50
-#       error Beta header file detected
-#   endif
-#   if ICE_INT_VERSION % 100 < 0
-#       error Ice patch level mismatch!
-#   endif
-#endif
-
-#ifdef ICE_CPP11_MAPPING // C++11 mapping
-
-namespace
-{
-
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_ids[2] =
-{
-    "::Ice::Object",
-    "::RtspAnalys::RtspAnalysServer"
-};
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_ops[] =
-{
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "recordVideo"
-};
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_recordVideo_name = "recordVideo";
-
-}
-
-bool
-RtspAnalys::RtspAnalysServer::ice_isA(::std::string s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RtspAnalys_RtspAnalysServer_ids, iceC_RtspAnalys_RtspAnalysServer_ids + 2, s);
-}
-
-::std::vector<::std::string>
-RtspAnalys::RtspAnalysServer::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector<::std::string>(&iceC_RtspAnalys_RtspAnalysServer_ids[0], &iceC_RtspAnalys_RtspAnalysServer_ids[2]);
-}
-
-::std::string
-RtspAnalys::RtspAnalysServer::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RtspAnalys::RtspAnalysServer::ice_staticId()
-{
-    static const ::std::string typeId = "::RtspAnalys::RtspAnalysServer";
-    return typeId;
-}
-
-bool
-RtspAnalys::RtspAnalysServer::_iceD_recordVideo(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::OperationMode::Normal, current.mode);
-    auto istr = inS.startReadParams();
-    ::std::string iceP_name;
-    istr->readAll(iceP_name);
-    inS.endReadParams();
-    ::std::string ret = this->recordVideo(::std::move(iceP_name), current);
-    auto ostr = inS.startWriteParams();
-    ostr->writeAll(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-bool
-RtspAnalys::RtspAnalysServer::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RtspAnalys_RtspAnalysServer_ops, iceC_RtspAnalys_RtspAnalysServer_ops + 5, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RtspAnalys_RtspAnalysServer_ops)
-    {
-        case 0:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 1:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 4:
-        {
-            return _iceD_recordVideo(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RtspAnalys::RtspAnalysServerPrx::_iceI_recordVideo(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>& outAsync, const ::std::string& iceP_name, const ::Ice::Context& context)
-{
-    _checkTwowayOnly(iceC_RtspAnalys_RtspAnalysServer_recordVideo_name);
-    outAsync->invoke(iceC_RtspAnalys_RtspAnalysServer_recordVideo_name, ::Ice::OperationMode::Normal, ::Ice::FormatType::DefaultFormat, context,
-        [&](::Ice::OutputStream* ostr)
-        {
-            ostr->writeAll(iceP_name);
-        },
-        nullptr);
-}
-
-::std::shared_ptr<::Ice::ObjectPrx>
-RtspAnalys::RtspAnalysServerPrx::_newInstance() const
-{
-    return ::IceInternal::createProxy<RtspAnalysServerPrx>();
-}
-
-const ::std::string&
-RtspAnalys::RtspAnalysServerPrx::ice_staticId()
-{
-    return RtspAnalys::RtspAnalysServer::ice_staticId();
-}
-
-#else // C++98 mapping
-
-namespace
-{
-
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_recordVideo_name = "recordVideo";
-
-}
-::IceProxy::Ice::Object* ::IceProxy::RtspAnalys::upCast(::IceProxy::RtspAnalys::RtspAnalysServer* p) { return p; }
-
-void
-::IceProxy::RtspAnalys::_readProxy(::Ice::InputStream* istr, ::IceInternal::ProxyHandle< ::IceProxy::RtspAnalys::RtspAnalysServer>& v)
-{
-    ::Ice::ObjectPrx proxy;
-    istr->read(proxy);
-    if(!proxy)
-    {
-        v = 0;
-    }
-    else
-    {
-        v = new ::IceProxy::RtspAnalys::RtspAnalysServer;
-        v->_copyFrom(proxy);
-    }
-}
-
-::Ice::AsyncResultPtr
-IceProxy::RtspAnalys::RtspAnalysServer::_iceI_begin_recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context, const ::IceInternal::CallbackBasePtr& del, const ::Ice::LocalObjectPtr& cookie, bool sync)
-{
-    _checkTwowayOnly(iceC_RtspAnalys_RtspAnalysServer_recordVideo_name, sync);
-    ::IceInternal::OutgoingAsyncPtr result = new ::IceInternal::CallbackOutgoing(this, iceC_RtspAnalys_RtspAnalysServer_recordVideo_name, del, cookie, sync);
-    try
-    {
-        result->prepare(iceC_RtspAnalys_RtspAnalysServer_recordVideo_name, ::Ice::Normal, context);
-        ::Ice::OutputStream* ostr = result->startWriteParams(::Ice::DefaultFormat);
-        ostr->write(iceP_name);
-        result->endWriteParams();
-        result->invoke(iceC_RtspAnalys_RtspAnalysServer_recordVideo_name);
-    }
-    catch(const ::Ice::Exception& ex)
-    {
-        result->abort(ex);
-    }
-    return result;
-}
-
-::std::string
-IceProxy::RtspAnalys::RtspAnalysServer::end_recordVideo(const ::Ice::AsyncResultPtr& result)
-{
-    ::Ice::AsyncResult::_check(result, this, iceC_RtspAnalys_RtspAnalysServer_recordVideo_name);
-    ::std::string ret;
-    if(!result->_waitForResponse())
-    {
-        try
-        {
-            result->_throwUserException();
-        }
-        catch(const ::Ice::UserException& ex)
-        {
-            throw ::Ice::UnknownUserException(__FILE__, __LINE__, ex.ice_id());
-        }
-    }
-    ::Ice::InputStream* istr = result->_startReadParams();
-    istr->read(ret);
-    result->_endReadParams();
-    return ret;
-}
-
-::IceProxy::Ice::Object*
-IceProxy::RtspAnalys::RtspAnalysServer::_newInstance() const
-{
-    return new RtspAnalysServer;
-}
-
-const ::std::string&
-IceProxy::RtspAnalys::RtspAnalysServer::ice_staticId()
-{
-    return ::RtspAnalys::RtspAnalysServer::ice_staticId();
-}
-
-RtspAnalys::RtspAnalysServer::~RtspAnalysServer()
-{
-}
-
-::Ice::Object* RtspAnalys::upCast(::RtspAnalys::RtspAnalysServer* p) { return p; }
-
-
-namespace
-{
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_ids[2] =
-{
-    "::Ice::Object",
-    "::RtspAnalys::RtspAnalysServer"
-};
-
-}
-
-bool
-RtspAnalys::RtspAnalysServer::ice_isA(const ::std::string& s, const ::Ice::Current&) const
-{
-    return ::std::binary_search(iceC_RtspAnalys_RtspAnalysServer_ids, iceC_RtspAnalys_RtspAnalysServer_ids + 2, s);
-}
-
-::std::vector< ::std::string>
-RtspAnalys::RtspAnalysServer::ice_ids(const ::Ice::Current&) const
-{
-    return ::std::vector< ::std::string>(&iceC_RtspAnalys_RtspAnalysServer_ids[0], &iceC_RtspAnalys_RtspAnalysServer_ids[2]);
-}
-
-const ::std::string&
-RtspAnalys::RtspAnalysServer::ice_id(const ::Ice::Current&) const
-{
-    return ice_staticId();
-}
-
-const ::std::string&
-RtspAnalys::RtspAnalysServer::ice_staticId()
-{
-#ifdef ICE_HAS_THREAD_SAFE_LOCAL_STATIC
-    static const ::std::string typeId = "::RtspAnalys::RtspAnalysServer";
-    return typeId;
-#else
-    return iceC_RtspAnalys_RtspAnalysServer_ids[1];
-#endif
-}
-
-bool
-RtspAnalys::RtspAnalysServer::_iceD_recordVideo(::IceInternal::Incoming& inS, const ::Ice::Current& current)
-{
-    _iceCheckMode(::Ice::Normal, current.mode);
-    ::Ice::InputStream* istr = inS.startReadParams();
-    ::std::string iceP_name;
-    istr->read(iceP_name);
-    inS.endReadParams();
-    ::std::string ret = this->recordVideo(iceP_name, current);
-    ::Ice::OutputStream* ostr = inS.startWriteParams();
-    ostr->write(ret);
-    inS.endWriteParams();
-    return true;
-}
-
-namespace
-{
-const ::std::string iceC_RtspAnalys_RtspAnalysServer_all[] =
-{
-    "ice_id",
-    "ice_ids",
-    "ice_isA",
-    "ice_ping",
-    "recordVideo"
-};
-
-}
-
-bool
-RtspAnalys::RtspAnalysServer::_iceDispatch(::IceInternal::Incoming& in, const ::Ice::Current& current)
-{
-    ::std::pair<const ::std::string*, const ::std::string*> r = ::std::equal_range(iceC_RtspAnalys_RtspAnalysServer_all, iceC_RtspAnalys_RtspAnalysServer_all + 5, current.operation);
-    if(r.first == r.second)
-    {
-        throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-    }
-
-    switch(r.first - iceC_RtspAnalys_RtspAnalysServer_all)
-    {
-        case 0:
-        {
-            return _iceD_ice_id(in, current);
-        }
-        case 1:
-        {
-            return _iceD_ice_ids(in, current);
-        }
-        case 2:
-        {
-            return _iceD_ice_isA(in, current);
-        }
-        case 3:
-        {
-            return _iceD_ice_ping(in, current);
-        }
-        case 4:
-        {
-            return _iceD_recordVideo(in, current);
-        }
-        default:
-        {
-            assert(false);
-            throw ::Ice::OperationNotExistException(__FILE__, __LINE__, current.id, current.facet, current.operation);
-        }
-    }
-}
-
-void
-RtspAnalys::RtspAnalysServer::_iceWriteImpl(::Ice::OutputStream* ostr) const
-{
-    ostr->startSlice(ice_staticId(), -1, true);
-    Ice::StreamWriter< ::RtspAnalys::RtspAnalysServer, ::Ice::OutputStream>::write(ostr, *this);
-    ostr->endSlice();
-}
-
-void
-RtspAnalys::RtspAnalysServer::_iceReadImpl(::Ice::InputStream* istr)
-{
-    istr->startSlice();
-    Ice::StreamReader< ::RtspAnalys::RtspAnalysServer, ::Ice::InputStream>::read(istr, *this);
-    istr->endSlice();
-}
-
-void
-RtspAnalys::_icePatchObjectPtr(RtspAnalysServerPtr& handle, const ::Ice::ObjectPtr& v)
-{
-    handle = ::RtspAnalys::RtspAnalysServerPtr::dynamicCast(v);
-    if(v && !handle)
-    {
-        IceInternal::Ex::throwUOE(::RtspAnalys::RtspAnalysServer::ice_staticId(), v);
-    }
-}
-
-namespace Ice
-{
-}
-
-#endif
diff --git a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.h b/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.h
deleted file mode 100644
index e101863..0000000
--- a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.h
+++ /dev/null
@@ -1,396 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-//
-// Ice version 3.7.0
-//
-// <auto-generated>
-//
-// Generated from file `RtspAnalysServer.ice'
-//
-// Warning: do not edit this file.
-//
-// </auto-generated>
-//
-
-#ifndef __RtspAnalysServer_h__
-#define __RtspAnalysServer_h__
-
-#include <IceUtil/PushDisableWarnings.h>
-#include <Ice/ProxyF.h>
-#include <Ice/ObjectF.h>
-#include <Ice/ValueF.h>
-#include <Ice/Exception.h>
-#include <Ice/LocalObject.h>
-#include <Ice/StreamHelpers.h>
-#include <Ice/Comparable.h>
-#include <Ice/Proxy.h>
-#include <Ice/Object.h>
-#include <Ice/GCObject.h>
-#include <Ice/Value.h>
-#include <Ice/Incoming.h>
-#include <Ice/FactoryTableInit.h>
-#include <IceUtil/ScopedArray.h>
-#include <Ice/Optional.h>
-#include <IceUtil/UndefSysMacros.h>
-
-#ifndef ICE_IGNORE_VERSION
-#   if ICE_INT_VERSION / 100 != 307
-#       error Ice version mismatch!
-#   endif
-#   if ICE_INT_VERSION % 100 > 50
-#       error Beta header file detected
-#   endif
-#   if ICE_INT_VERSION % 100 < 0
-#       error Ice patch level mismatch!
-#   endif
-#endif
-
-#ifdef ICE_CPP11_MAPPING // C++11 mapping
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer;
-class RtspAnalysServerPrx;
-
-}
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer : public virtual ::Ice::Object
-{
-public:
-
-    using ProxyType = RtspAnalysServerPrx;
-
-    virtual bool ice_isA(::std::string, const ::Ice::Current&) const override;
-    virtual ::std::vector<::std::string> ice_ids(const ::Ice::Current&) const override;
-    virtual ::std::string ice_id(const ::Ice::Current&) const override;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string recordVideo(::std::string, const ::Ice::Current&) = 0;
-    bool _iceD_recordVideo(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&) override;
-};
-
-}
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServerPrx : public virtual ::Ice::Proxy<RtspAnalysServerPrx, ::Ice::ObjectPrx>
-{
-public:
-
-    ::std::string recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makePromiseOutgoing<::std::string>(true, this, &RtspAnalys::RtspAnalysServerPrx::_iceI_recordVideo, iceP_name, context).get();
-    }
-
-    template<template<typename> class P = ::std::promise>
-    auto recordVideoAsync(const ::std::string& iceP_name, const ::Ice::Context& context = Ice::noExplicitContext)
-        -> decltype(::std::declval<P<::std::string>>().get_future())
-    {
-        return _makePromiseOutgoing<::std::string, P>(false, this, &RtspAnalys::RtspAnalysServerPrx::_iceI_recordVideo, iceP_name, context);
-    }
-
-    ::std::function<void()>
-    recordVideoAsync(const ::std::string& iceP_name,
-                     ::std::function<void(::std::string)> response,
-                     ::std::function<void(::std::exception_ptr)> ex = nullptr,
-                     ::std::function<void(bool)> sent = nullptr,
-                     const ::Ice::Context& context = Ice::noExplicitContext)
-    {
-        return _makeLamdaOutgoing<::std::string>(response, ex, sent, this, &RtspAnalys::RtspAnalysServerPrx::_iceI_recordVideo, iceP_name, context);
-    }
-
-    void _iceI_recordVideo(const ::std::shared_ptr<::IceInternal::OutgoingAsyncT<::std::string>>&, const ::std::string&, const ::Ice::Context&);
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    RtspAnalysServerPrx() = default;
-    friend ::std::shared_ptr<RtspAnalysServerPrx> IceInternal::createProxy<RtspAnalysServerPrx>();
-
-    virtual ::std::shared_ptr<::Ice::ObjectPrx> _newInstance() const override;
-};
-
-}
-
-namespace Ice
-{
-
-}
-
-namespace RtspAnalys
-{
-
-using RtspAnalysServerPtr = ::std::shared_ptr<RtspAnalysServer>;
-using RtspAnalysServerPrxPtr = ::std::shared_ptr<RtspAnalysServerPrx>;
-
-}
-
-#else // C++98 mapping
-
-namespace IceProxy
-{
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer;
-void _readProxy(::Ice::InputStream*, ::IceInternal::ProxyHandle< ::IceProxy::RtspAnalys::RtspAnalysServer>&);
-::IceProxy::Ice::Object* upCast(::IceProxy::RtspAnalys::RtspAnalysServer*);
-
-}
-
-}
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer;
-::Ice::Object* upCast(::RtspAnalys::RtspAnalysServer*);
-typedef ::IceInternal::Handle< ::RtspAnalys::RtspAnalysServer> RtspAnalysServerPtr;
-typedef ::IceInternal::ProxyHandle< ::IceProxy::RtspAnalys::RtspAnalysServer> RtspAnalysServerPrx;
-typedef RtspAnalysServerPrx RtspAnalysServerPrxPtr;
-void _icePatchObjectPtr(RtspAnalysServerPtr&, const ::Ice::ObjectPtr&);
-
-}
-
-namespace RtspAnalys
-{
-
-class Callback_RtspAnalysServer_recordVideo_Base : public virtual ::IceInternal::CallbackBase { };
-typedef ::IceUtil::Handle< Callback_RtspAnalysServer_recordVideo_Base> Callback_RtspAnalysServer_recordVideoPtr;
-
-}
-
-namespace IceProxy
-{
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer : public virtual ::Ice::Proxy<RtspAnalysServer, ::IceProxy::Ice::Object>
-{
-public:
-
-    ::std::string recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return end_recordVideo(_iceI_begin_recordVideo(iceP_name, context, ::IceInternal::dummyCallback, 0, true));
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context = ::Ice::noExplicitContext)
-    {
-        return _iceI_begin_recordVideo(iceP_name, context, ::IceInternal::dummyCallback, 0);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_name, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_name, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context, const ::Ice::CallbackPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_name, context, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_name, const ::RtspAnalys::Callback_RtspAnalysServer_recordVideoPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_name, ::Ice::noExplicitContext, del, cookie);
-    }
-
-    ::Ice::AsyncResultPtr begin_recordVideo(const ::std::string& iceP_name, const ::Ice::Context& context, const ::RtspAnalys::Callback_RtspAnalysServer_recordVideoPtr& del, const ::Ice::LocalObjectPtr& cookie = 0)
-    {
-        return _iceI_begin_recordVideo(iceP_name, context, del, cookie);
-    }
-
-    ::std::string end_recordVideo(const ::Ice::AsyncResultPtr&);
-
-private:
-
-    ::Ice::AsyncResultPtr _iceI_begin_recordVideo(const ::std::string&, const ::Ice::Context&, const ::IceInternal::CallbackBasePtr&, const ::Ice::LocalObjectPtr& cookie = 0, bool sync = false);
-
-public:
-
-    static const ::std::string& ice_staticId();
-
-protected:
-
-    virtual ::IceProxy::Ice::Object* _newInstance() const;
-};
-
-}
-
-}
-
-namespace RtspAnalys
-{
-
-class RtspAnalysServer : public virtual ::Ice::Object
-{
-public:
-
-    typedef RtspAnalysServerPrx ProxyType;
-    typedef RtspAnalysServerPtr PointerType;
-
-    virtual ~RtspAnalysServer();
-
-    virtual bool ice_isA(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual ::std::vector< ::std::string> ice_ids(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-    virtual const ::std::string& ice_id(const ::Ice::Current& = ::Ice::emptyCurrent) const;
-
-    static const ::std::string& ice_staticId();
-
-    virtual ::std::string recordVideo(const ::std::string&, const ::Ice::Current& = ::Ice::emptyCurrent) = 0;
-    bool _iceD_recordVideo(::IceInternal::Incoming&, const ::Ice::Current&);
-
-    virtual bool _iceDispatch(::IceInternal::Incoming&, const ::Ice::Current&);
-
-protected:
-
-    virtual void _iceWriteImpl(::Ice::OutputStream*) const;
-    virtual void _iceReadImpl(::Ice::InputStream*);
-};
-
-inline bool operator==(const RtspAnalysServer& lhs, const RtspAnalysServer& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) == static_cast<const ::Ice::Object&>(rhs);
-}
-
-inline bool operator<(const RtspAnalysServer& lhs, const RtspAnalysServer& rhs)
-{
-    return static_cast<const ::Ice::Object&>(lhs) < static_cast<const ::Ice::Object&>(rhs);
-}
-
-}
-
-namespace Ice
-{
-
-}
-
-namespace RtspAnalys
-{
-
-template<class T>
-class CallbackNC_RtspAnalysServer_recordVideo : public Callback_RtspAnalysServer_recordVideo_Base, public ::IceInternal::TwowayCallbackNC<T>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception&);
-    typedef void (T::*Sent)(bool);
-    typedef void (T::*Response)(const ::std::string&);
-
-    CallbackNC_RtspAnalysServer_recordVideo(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallbackNC<T>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RtspAnalys::RtspAnalysServerPrx proxy = ::RtspAnalys::RtspAnalysServerPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_recordVideo(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::CallbackNC<T>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::CallbackNC<T>::_callback.get()->*_response)(ret);
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T> Callback_RtspAnalysServer_recordVideoPtr
-newCallback_RtspAnalysServer_recordVideo(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_RtspAnalysServer_recordVideo<T>(instance, cb, excb, sentcb);
-}
-
-template<class T> Callback_RtspAnalysServer_recordVideoPtr
-newCallback_RtspAnalysServer_recordVideo(T* instance, void (T::*cb)(const ::std::string&), void (T::*excb)(const ::Ice::Exception&), void (T::*sentcb)(bool) = 0)
-{
-    return new CallbackNC_RtspAnalysServer_recordVideo<T>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT>
-class Callback_RtspAnalysServer_recordVideo : public Callback_RtspAnalysServer_recordVideo_Base, public ::IceInternal::TwowayCallback<T, CT>
-{
-public:
-
-    typedef IceUtil::Handle<T> TPtr;
-
-    typedef void (T::*Exception)(const ::Ice::Exception& , const CT&);
-    typedef void (T::*Sent)(bool , const CT&);
-    typedef void (T::*Response)(const ::std::string&, const CT&);
-
-    Callback_RtspAnalysServer_recordVideo(const TPtr& obj, Response cb, Exception excb, Sent sentcb)
-        : ::IceInternal::TwowayCallback<T, CT>(obj, cb != 0, excb, sentcb), _response(cb)
-    {
-    }
-
-    virtual void completed(const ::Ice::AsyncResultPtr& result) const
-    {
-        ::RtspAnalys::RtspAnalysServerPrx proxy = ::RtspAnalys::RtspAnalysServerPrx::uncheckedCast(result->getProxy());
-        ::std::string ret;
-        try
-        {
-            ret = proxy->end_recordVideo(result);
-        }
-        catch(const ::Ice::Exception& ex)
-        {
-            ::IceInternal::Callback<T, CT>::exception(result, ex);
-            return;
-        }
-        if(_response)
-        {
-            (::IceInternal::Callback<T, CT>::_callback.get()->*_response)(ret, CT::dynamicCast(result->getCookie()));
-        }
-    }
-
-private:
-
-    Response _response;
-};
-
-template<class T, typename CT> Callback_RtspAnalysServer_recordVideoPtr
-newCallback_RtspAnalysServer_recordVideo(const IceUtil::Handle<T>& instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_RtspAnalysServer_recordVideo<T, CT>(instance, cb, excb, sentcb);
-}
-
-template<class T, typename CT> Callback_RtspAnalysServer_recordVideoPtr
-newCallback_RtspAnalysServer_recordVideo(T* instance, void (T::*cb)(const ::std::string&, const CT&), void (T::*excb)(const ::Ice::Exception&, const CT&), void (T::*sentcb)(bool, const CT&) = 0)
-{
-    return new Callback_RtspAnalysServer_recordVideo<T, CT>(instance, cb, excb, sentcb);
-}
-
-}
-
-#endif
-
-#include <IceUtil/PopDisableWarnings.h>
-#endif
diff --git a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.ice b/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.ice
deleted file mode 100644
index ae8e7d9..0000000
--- a/QiaoJiaSystem/VideoToImage/rpc/RtspAnalysServer.ice
+++ /dev/null
@@ -1,12 +0,0 @@
-module RtspAnalys
-{
-    
-
-    interface RtspAnalysServer
-    {
-	string recordVideo(string name);
-    }
-  
-   
-
-}
diff --git a/QiaoJiaSystem/YoloServer/CMakeLists.txt b/QiaoJiaSystem/YoloServer/CMakeLists.txt
index c170c9e..2407eb9 100644
--- a/QiaoJiaSystem/YoloServer/CMakeLists.txt
+++ b/QiaoJiaSystem/YoloServer/CMakeLists.txt
@@ -77,35 +77,35 @@
     ${LIBS}
     )
 
-add_executable(YoloDetectClientTest
-    ../../../BasicPlatForm/basic/util/opencv/CvUtil.cpp
-    ../../../BasicPlatForm/basic/util/opencv/CvUtil.h
-    ../../../BasicPlatForm/basic/pipe/PipeConnector.cpp
-    ../../../BasicPlatForm/basic/pipe/PipeConnector.h
-    ../../../BasicPlatForm/basic/pipe/PipeController.cpp
-    ../../../BasicPlatForm/basic/pipe/PipeController.h
-    ../../../BasicPlatForm/basic/pipe/PipeElement.cpp
-    ../../../BasicPlatForm/basic/pipe/PipeElement.h
-    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.h
-    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
-
-    ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.h
-    ../../../BasicPlatForm/basic/pipe_element/ImageShowElement.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ImageShowElement.h
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.cpp
-    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.h
-    ../../../BasicPlatForm/basic/util/fastdfs/FastdfsClient.cpp
-    ../../../BasicPlatForm/basic/pipe/TimerElement.cpp
-    ../RapidStructureApp/TriggerElement.cpp
-    ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.cpp
-    ../../../BasicPlatForm/basic/util/curl/HttpRequestWithCrul.hpp
-    rpc/YoloServer.cpp
-    YoloDetectClientTest.cpp
-    ./YoloRpcElement.cpp
-    ./YoloRpcElement.h
-    ImageDrawElement.cpp
-    )
+#add_executable(YoloDetectClientTest
+#    ../../../BasicPlatForm/basic/util/opencv/CvUtil.cpp
+#    ../../../BasicPlatForm/basic/util/opencv/CvUtil.h
+#    ../../../BasicPlatForm/basic/pipe/PipeConnector.cpp
+#    ../../../BasicPlatForm/basic/pipe/PipeConnector.h
+#    ../../../BasicPlatForm/basic/pipe/PipeController.cpp
+#    ../../../BasicPlatForm/basic/pipe/PipeController.h
+#    ../../../BasicPlatForm/basic/pipe/PipeElement.cpp
+#    ../../../BasicPlatForm/basic/pipe/PipeElement.h
+#    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.h
+#    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
+#
+#    ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.cpp
+#    ../../../BasicPlatForm/basic/pipe_element/ImageFactoryElement.h
+#    ../../../BasicPlatForm/basic/pipe_element/ImageShowElement.cpp
+#    ../../../BasicPlatForm/basic/pipe_element/ImageShowElement.h
+#    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.cpp
+#    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoCaptureElement.h
+#    ../../../BasicPlatForm/basic/util/fastdfs/FastdfsClient.cpp
+#    ../../../BasicPlatForm/basic/pipe/TimerElement.cpp
+##    ../StructureApp/TriggerElement.cpp
+#    ../../../BasicPlatForm/basic/db/Elasticsearch/EsDBTool.cpp
+#    ../../../BasicPlatForm/basic/util/curl/HttpRequestWithCrul.hpp
+#    rpc/YoloServer.cpp
+#    YoloDetectClientTest.cpp
+#    ./YoloRpcElement.cpp
+#    ./YoloRpcElement.h
+#    ImageDrawElement.cpp
+#    )
 
 link_directories(
 
@@ -138,16 +138,16 @@
     #glog
     ../../../BasicPlatForm/libs/glog/include
 )
-target_link_libraries(YoloDetectClientTest
-    Ice
-    Qt5Core
-    avformat avcodec avutil avfilter swscale swresample
-    opencv_world
-    curl
-    uuid
-    jsoncpp
-    fastcommon
-    fdfsclient
-    glog
-    pthread
-    )
+#target_link_libraries(YoloDetectClientTest
+#    Ice
+#    Qt5Core
+#    avformat avcodec avutil avfilter swscale swresample
+#    opencv_world
+#    curl
+#    uuid
+#    jsoncpp
+#    fastcommon
+#    fdfsclient
+#    glog
+#    pthread
+#    )

--
Gitblit v1.8.0