From e74de4e96bc037e0fffa652a6f96ee84b002a72f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 14:58:11 +0800 Subject: [PATCH 01/34] ci:add fedora system support ci:improved build --- .github/workflows/Rocky_build.yml | 16 +++--- .github/workflows/Ubuntu_build.yml | 30 +++------- .github/workflows/codeql.yml | 3 + .github/workflows/debian_build.yml | 15 ++--- .github/workflows/fedora_build.yml | 89 ++++++++++++++++++++++++++++++ .github/workflows/macbuild.yml | 5 +- .github/workflows/release.yml | 9 +++ 7 files changed, 127 insertions(+), 40 deletions(-) create mode 100644 .github/workflows/fedora_build.yml diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 9e982e2..1c30b47 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -51,12 +51,11 @@ jobs: - name: install system package run: | dnf update -y - dnf install gcc g++ make git jq unzip -y - - name: Set up Dependency rocky linux Environment - run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 + dnf install gcc g++ make git jq unzip wget -y + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: install xengine library run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) @@ -64,9 +63,8 @@ jobs: unzip ./XEngine_RockyLinux_9_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_9_${{ matrix.artifact }} cd XEngine_RockyLinux_9_${{ matrix.artifact }} - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; - ldconfig + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make run: | diff --git a/.github/workflows/Ubuntu_build.yml b/.github/workflows/Ubuntu_build.yml index d73e183..736d591 100644 --- a/.github/workflows/Ubuntu_build.yml +++ b/.github/workflows/Ubuntu_build.yml @@ -39,6 +39,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency ubuntu24.04 Environment if: matrix.os == 'ubuntu-24.04' run: | @@ -48,48 +51,33 @@ jobs: - name: Set up Dependency ubuntu24.04 ARM64 Environment if: matrix.os == 'ubuntu-24.04-arm' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip unzip ./XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 cd XEngine_UBuntu_24.04_Arm64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: Set up Dependency ubuntu22.04 Environment if: matrix.os == 'ubuntu-22.04' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_x86-64.zip unzip ./XEngine_UBuntu_22.04_x86-64.zip -d ./XEngine_UBuntu_22.04_x86-64 cd XEngine_UBuntu_22.04_x86-64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: Set up Dependency ubuntu22.04 arm64 Environment if: matrix.os == 'ubuntu-22.04-arm' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip unzip ./XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 cd XEngine_UBuntu_22.04_Arm64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: make x86 if: matrix.os == 'ubuntu-24.04' || matrix.os == 'ubuntu-22.04' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1716d18..75bb2a8 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -40,6 +40,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency Environment run: | cd libxengine diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml index 3a31b94..c493883 100644 --- a/.github/workflows/debian_build.yml +++ b/.github/workflows/debian_build.yml @@ -45,13 +45,11 @@ jobs: - name: install system package run: | apt update -y - apt install gcc g++ make git jq unzip curl -y + apt install gcc g++ make git jq unzip curl wget -y - - name: Set up Dependency rocky linux Environment - run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: install xengine library run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) @@ -59,9 +57,8 @@ jobs: unzip ./XEngine_Debian_12_${{ matrix.artifact }}.zip -d ./XEngine_Debian_12_${{ matrix.artifact }} cd XEngine_Debian_12_${{ matrix.artifact }} - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - ldconfig + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make run: | diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml new file mode 100644 index 0000000..fe1d161 --- /dev/null +++ b/.github/workflows/fedora_build.yml @@ -0,0 +1,89 @@ +name: fedora build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: fedora:${{ matrix.fedora-version }} + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 42 + artifact: x86-64 + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 41 + artifact: x86-64 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v4 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_Depend + + - name: install system package + run: | + dnf update -y + dnf install gcc g++ make git jq unzip wget -y + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: install xengine library + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip + unzip ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip -d ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + cd XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + + chmod 777 * + ./XEngine_LINEnv.sh -i 3 + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_ProxyServiceApp -t + + - name: Upload folder as artifact + uses: actions/upload-artifact@v4 + with: + name: XEngine_ProxyServiceApp-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/macbuild.yml b/.github/workflows/macbuild.yml index 6cdbbd3..71f0537 100644 --- a/.github/workflows/macbuild.yml +++ b/.github/workflows/macbuild.yml @@ -38,7 +38,10 @@ jobs: - name: brew install run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency x86_64 Environment if: matrix.os == 'macos-13' run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d09fa5f..03cc0ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,15 @@ jobs: skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ + - name: Download fedora build + uses: dawidd6/action-download-artifact@v6 + with: + workflow: fedora_build.yml + workflow_conclusion: success + check_artifacts: false + skip_unpack: true + if_no_artifact_found: fail + path: ./XRelease/ - name: Download RockyLinux build uses: dawidd6/action-download-artifact@v6 with: -- Gitee From aec1b4382cacdf81dc6afe0c3a8391012d2dc47b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 15:22:17 +0800 Subject: [PATCH 02/34] ci:fedora fix build --- .github/workflows/fedora_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml index fe1d161..87bb84f 100644 --- a/.github/workflows/fedora_build.yml +++ b/.github/workflows/fedora_build.yml @@ -79,11 +79,11 @@ jobs: - name: test run: | cd XEngine_Release - ./XEngine_ProxyServiceApp -t + ./XEngine_AuthorizeService -t - name: Upload folder as artifact uses: actions/upload-artifact@v4 with: - name: XEngine_ProxyServiceApp-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + name: XEngine_AuthorizeService-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 \ No newline at end of file -- Gitee From 8718fdad4139240abdfb3e773139c9b570fc6b28 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 29 May 2025 10:41:02 +0800 Subject: [PATCH 03/34] update:match xengine v9.20 --- .../Authorize_APPClient.cpp | 14 ++++----- .../Authorize_APPLocal/Authorize_APPLocal.cpp | 2 +- .../Authorize_CDKey/Authorize_CDKey.cpp | 10 +++---- .../Authorize_Serial/Authorize_Serial.cpp | 12 ++++---- .../AuthClient_Connector.cpp | 4 +-- .../AuthClient_Connector.h | 2 +- .../AuthClient_HTTPVer/AuthClient_HTTPVer.cpp | 2 +- .../AuthorizeModule_Configure/Config_Define.h | 16 +++++----- .../DBModule_MySQL/DBModule_MySQL.cpp | 4 +-- .../DBModule_SQLite/DBModule_SQLite.cpp | 4 +-- .../AuthHelp_DynamicCode.cpp | 2 +- .../AuthHelp_DynamicCode.h | 2 +- .../AuthorizeModule_Session/Session_Define.h | 4 +-- XEngine_Source/XAuth_Protocol.h | 4 +-- .../Authorize_Dialog/Dialog_Announcement.cpp | 12 ++++---- .../Authorize_Dialog/Dialog_Banned.cpp | 16 +++++----- .../Authorize_Dialog/Dialog_Config.cpp | 18 +++++------ .../Authorize_Dialog/Dialog_Modify.cpp | 8 ++--- .../Authorize_Dialog/Dialog_Serial.cpp | 30 +++++++++---------- .../Authorize_Dialog/Dialog_Switch.cpp | 8 ++--- .../Authorize_Dialog/Dialog_Try.cpp | 30 +++++++++---------- .../Authorize_Dialog/Dialog_User.cpp | 30 +++++++++---------- .../XEngine_AuthorizeAppDlg.cpp | 2 +- .../Authorize_HttpTask.cpp | 2 +- .../Authorize_HttpTask.h | 2 +- .../Authorize_Net.cpp | 28 ++++++++--------- .../XEngine_AuthorizeService/Authorize_Net.h | 24 +++++++-------- .../Authorize_TCPTask.cpp | 2 +- .../Authorize_TCPTask.h | 2 +- .../Authorize_Task.cpp | 4 +-- .../XEngine_AuthorizeService/Authorize_Task.h | 4 +-- .../Authorize_WSTask.cpp | 6 ++-- .../Authorize_WSTask.h | 2 +- .../XEngine_AuthorizeService.cpp | 2 +- XEngine_Source/XEngine_Depend | 2 +- 35 files changed, 158 insertions(+), 158 deletions(-) diff --git a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp index d6ecdc7..7849b2a 100644 --- a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp +++ b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp @@ -131,7 +131,7 @@ int AuthClient_Register() #ifdef _PASS_ENCRYPT XCHAR tszPassCodec[128] = {}; int nPLen = _tcsxlen(lpszPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(lpszPass, byMD5Buffer, &nPLen); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, tszPassCodec); st_JsonUserInfo["tszUserPass"] = tszPassCodec; @@ -275,7 +275,7 @@ int AuthClient_Login() #ifdef _PASS_ENCRYPT int nPLen = _tcsxlen(st_AuthUser.tszUserPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(st_AuthUser.tszUserPass, byMD5Buffer, &nPLen); memset(st_AuthUser.tszUserPass, '\0', sizeof(st_AuthUser.tszUserPass)); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, st_AuthUser.tszUserPass); @@ -322,7 +322,7 @@ int AuthClient_Login() } int AuthClient_Notice() { - XCHAR tszURLStr[MAX_PATH] = {}; + XCHAR tszURLStr[XPATH_MAX] = {}; _xstprintf(tszURLStr, _X("http://127.0.0.1:5302/api?function=notice&token=%lld"), xhToken); int nMsgLen = 0; @@ -379,7 +379,7 @@ int AuthClient_GetPass() #ifdef _PASS_ENCRYPT XCHAR tszPASSCodec[128] = {}; int nPLen = _tcsxlen(lpszPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(lpszPass, byMD5Buffer, &nPLen); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, tszPASSCodec); st_JsonObject["tszUserPass"] = tszPASSCodec; @@ -423,7 +423,7 @@ int AuthClient_GetTime() { Json::Value st_JsonRoot; Json::Value st_JsonObject; - XCHAR tszURLStr[MAX_PATH] = {}; + XCHAR tszURLStr[XPATH_MAX] = {}; _xstprintf(tszURLStr, _X("http://127.0.0.1:5302/api?function=time&token=%lld"),xhToken); st_JsonObject["tszUserName"] = lpszUser; @@ -431,7 +431,7 @@ int AuthClient_GetTime() #ifdef _PASS_ENCRYPT XCHAR tszPASSCodec[128] = {}; int nPLen = _tcsxlen(lpszPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(lpszPass, byMD5Buffer, &nPLen); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, tszPASSCodec); st_JsonObject["tszUserPass"] = tszPASSCodec; @@ -475,7 +475,7 @@ int AuthClient_Delete() #ifdef _PASS_ENCRYPT XCHAR tszPASSCodec[128] = {}; int nPLen = _tcsxlen(lpszPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(lpszPass, byMD5Buffer, &nPLen); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, tszPASSCodec); st_JsonObject["tszUserPass"] = tszPASSCodec; diff --git a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp index 548feec..785c7b1 100644 --- a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp +++ b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp @@ -35,7 +35,7 @@ //WINDOWS支持VS2022 x86 debug 编译调试 //g++ -std=c++17 -Wall -g Authorize_APPLocal.cpp -o Authorize_APPLocal.exe -I ../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp -L ../../XEngine_Release -lXEngine_BaseLib -lXEngine_Cryption -lXEngine_SystemApi -lAuthorizeModule_CDKey -ljsoncpp -Wl,-rpath=../../XEngine_Release -XCHAR tszSerialStr[MAX_PATH] = {}; +XCHAR tszSerialStr[XPATH_MAX] = {}; //1.创建CDKEY.或者由管理员创建. bool Authorize_APPLocal_Create(LPCXSTR lpszKeyFile, LPCXSTR lpszPasswd) { diff --git a/XEngine_Source/AuthorizeModule_CDKey/Authorize_CDKey/Authorize_CDKey.cpp b/XEngine_Source/AuthorizeModule_CDKey/Authorize_CDKey/Authorize_CDKey.cpp index 4d57d36..102927b 100644 --- a/XEngine_Source/AuthorizeModule_CDKey/Authorize_CDKey/Authorize_CDKey.cpp +++ b/XEngine_Source/AuthorizeModule_CDKey/Authorize_CDKey/Authorize_CDKey.cpp @@ -1067,12 +1067,12 @@ bool CAuthorize_CDKey::Authorize_CDKey_WriteTime(LPCXSTR lpszFileKey, int nCount Authorize_dwErrorCode = ERROR_AUTHORIZE_MODULE_CDKEY_OPENFILE; return false; } - XCHAR tszMsgBuffer[MAX_PATH]; - memset(tszMsgBuffer, '\0', MAX_PATH); + XCHAR tszMsgBuffer[XPATH_MAX]; + memset(tszMsgBuffer, '\0', XPATH_MAX); //查找是否有时间列表字段 while (1) { - if (NULL == fgets(tszMsgBuffer, MAX_PATH, pSt_File)) + if (NULL == fgets(tszMsgBuffer, XPATH_MAX, pSt_File)) { break; } @@ -1211,12 +1211,12 @@ bool CAuthorize_CDKey::Authorize_CDKey_ReadTime(LPCXSTR lpszFileKey, XCHAR*** pp Authorize_dwErrorCode = ERROR_AUTHORIZE_MODULE_CDKEY_OPENFILE; return false; } - XCHAR tszMsgBuffer[MAX_PATH]; + XCHAR tszMsgBuffer[XPATH_MAX]; //查找是否有时间列表字段 while (1) { memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (NULL == fgets(tszMsgBuffer, MAX_PATH, pSt_File)) + if (NULL == fgets(tszMsgBuffer, XPATH_MAX, pSt_File)) { break; } diff --git a/XEngine_Source/AuthorizeModule_CDKey/Authorize_Serial/Authorize_Serial.cpp b/XEngine_Source/AuthorizeModule_CDKey/Authorize_Serial/Authorize_Serial.cpp index 256d976..2dc41a4 100644 --- a/XEngine_Source/AuthorizeModule_CDKey/Authorize_Serial/Authorize_Serial.cpp +++ b/XEngine_Source/AuthorizeModule_CDKey/Authorize_Serial/Authorize_Serial.cpp @@ -79,13 +79,13 @@ bool CAuthorize_Serial::Authorize_Serial_Creator(XCHAR*** ppptszSerialNumber, LP Authorize_dwErrorCode = ERROR_AUTHORIZE_MODULE_CDKEY_PARAMENT; return false; } - BaseLib_Memory_Malloc((XPPPMEM)ppptszSerialNumber, nCardNumber, MAX_PATH); + BaseLib_Memory_Malloc((XPPPMEM)ppptszSerialNumber, nCardNumber, XPATH_MAX); srand((unsigned int)time(NULL)); //取随机因子 for (int i = 0; i < nCardNumber; i++) { - XCHAR tszSerialNumber[MAX_PATH]; - memset(tszSerialNumber, '\0', MAX_PATH); + XCHAR tszSerialNumber[XPATH_MAX]; + memset(tszSerialNumber, '\0', XPATH_MAX); //检查生成类型 switch (enSerialType) { @@ -225,13 +225,13 @@ bool CAuthorize_Serial::Authorize_Serial_Create(XCHAR*** ppptszSerialNumber, LPC Authorize_dwErrorCode = ERROR_AUTHORIZE_MODULE_CDKEY_PARAMENT; return false; } - BaseLib_Memory_Malloc((XPPPMEM)ppptszSerialNumber, nCardNumber, MAX_PATH); + BaseLib_Memory_Malloc((XPPPMEM)ppptszSerialNumber, nCardNumber, XPATH_MAX); srand((unsigned int)time(NULL)); //取随机因子 for (int i = 0; i < nCardNumber; i++) { - XCHAR tszSerialNumber[MAX_PATH]; - memset(tszSerialNumber, '\0', MAX_PATH);; + XCHAR tszSerialNumber[XPATH_MAX]; + memset(tszSerialNumber, '\0', XPATH_MAX);; _xstprintf(tszSerialNumber, _X("%s"), lpszUserHeader); if (!Authorize_Serial_Fill(tszSerialNumber, nFieldNumber)) diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp index ab57a93..0eaf425 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp @@ -183,7 +183,7 @@ bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR if (dwCryption > 0) { int nPLen = _tcsxlen(lpszPass); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(lpszPass, byMD5Buffer, &nPLen, false, dwCryption); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, st_AuthUser.tszUserPass); } @@ -293,7 +293,7 @@ bool CAuthClient_Connector::AuthClient_Connector_Heart(bool bEnable /* = true */ ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// -XHTHREAD CALLBACK CAuthClient_Connector::AuthClient_Connector_Thread(XPVOID lParam) +XHTHREAD XCALLBACK CAuthClient_Connector::AuthClient_Connector_Thread(XPVOID lParam) { CAuthClient_Connector* pClass_This = (CAuthClient_Connector*)lParam; diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h index aaebe89..a07ca39 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h @@ -29,7 +29,7 @@ public: bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, XSHOT nDYCode = 0, XNETHANDLE xhToken = 0, XLONG dwCryption = 0); bool AuthClient_Connector_Heart(bool bEnable = true); protected: - static XHTHREAD CALLBACK AuthClient_Connector_Thread(XPVOID lParam); + static XHTHREAD XCALLBACK AuthClient_Connector_Thread(XPVOID lParam); private: bool m_bRun = false; bool m_bLogin = false; diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_HTTPVer/AuthClient_HTTPVer.cpp b/XEngine_Source/AuthorizeModule_Client/AuthClient_HTTPVer/AuthClient_HTTPVer.cpp index a670d58..c1e8f1d 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_HTTPVer/AuthClient_HTTPVer.cpp +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_HTTPVer/AuthClient_HTTPVer.cpp @@ -50,7 +50,7 @@ bool CAuthClient_HTTPVer::AuthClient_HTTPVer_TryRequest(LPCXSTR lpszURLAddr, LPC } #if (1 == _XAUTH_BUILD_SWITCH_CLIENT_HTTP) int nHTTPCode = 0; - XCHAR tszJsonStr[MAX_PATH] = {}; + XCHAR tszJsonStr[XPATH_MAX] = {}; Json::Value st_JsonRoot; Json::Value st_JsonObject; JSONCPP_STRING st_JsonError; diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index 2cc0e88..7118d13 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -42,8 +42,8 @@ typedef struct { struct { - XCHAR tszKeyFile[MAX_PATH]; //本地CDKEY文件地址 - XCHAR tszKeyPass[MAX_PATH]; //本地CDKEY密码 + XCHAR tszKeyFile[XPATH_MAX]; //本地CDKEY文件地址 + XCHAR tszKeyPass[XPATH_MAX]; //本地CDKEY密码 }st_XCDKey; struct { @@ -66,9 +66,9 @@ typedef struct int nMultiMode; //多端登录模式,0按照平台(PC,WEB,PAD,PHONE 4种),1按照类型(每种都可以),2无限制 struct { - XCHAR tszPassLogin[MAX_PATH]; //三方认证登录验证 - XCHAR tszPassLogout[MAX_PATH]; //三方认证登出通知 - XCHAR tszPassTimeout[MAX_PATH]; //三方认证超时通知 + XCHAR tszPassLogin[XPATH_MAX]; //三方认证登录验证 + XCHAR tszPassLogout[XPATH_MAX]; //三方认证登出通知 + XCHAR tszPassTimeout[XPATH_MAX]; //三方认证超时通知 }st_PassUrl; //多端登录支持的计时方式 struct @@ -97,12 +97,12 @@ typedef struct }st_MYSQL; struct { - XCHAR tszSQLite[MAX_PATH]; //数据库文件位置 + XCHAR tszSQLite[XPATH_MAX]; //数据库文件位置 }st_SQLite; }st_XSql; struct { - XCHAR tszLogFile[MAX_PATH]; //日志文件 + XCHAR tszLogFile[XPATH_MAX]; //日志文件 int nMaxSize; //最大大小 int nMaxCount; //备份个数 int nLogLeave; //日志级别 @@ -111,7 +111,7 @@ typedef struct struct { bool bEnable; - XCHAR tszAPIUrl[MAX_PATH]; + XCHAR tszAPIUrl[XPATH_MAX]; XCHAR tszServiceName[128]; }st_XReport; struct diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index c2241c2..15606e5 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -694,8 +694,8 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber) } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_CUSTOM == enAuthSerialType) { - XCHAR tszLeftTime[MAX_PATH]; - memset(tszLeftTime, '\0', MAX_PATH); + XCHAR tszLeftTime[XPATH_MAX]; + memset(tszLeftTime, '\0', XPATH_MAX); _xstprintf(tszLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_AuthTimer.wYear, st_AuthTimer.wMonth, st_AuthTimer.wDay, st_AuthTimer.wHour, st_AuthTimer.wMinute, st_AuthTimer.wSecond); _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%s','%d',0,NOW())"), lpszSerialNumber, tszLeftTime, enAuthSerialType); } diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index 80d13c6..12ccd75 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -645,8 +645,8 @@ bool CDBModule_SQLite::DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber) } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_CUSTOM == enAuthSerialType) { - XCHAR tszLeftTime[MAX_PATH]; - memset(tszLeftTime, '\0', MAX_PATH); + XCHAR tszLeftTime[XPATH_MAX]; + memset(tszLeftTime, '\0', XPATH_MAX); _xstprintf(tszLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_AuthTimer.wYear, st_AuthTimer.wMonth, st_AuthTimer.wDay, st_AuthTimer.wHour, st_AuthTimer.wMinute, st_AuthTimer.wSecond); _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%s','%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, tszLeftTime, enAuthSerialType); } diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp b/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp index e52a239..e56a213 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp @@ -158,7 +158,7 @@ bool CAuthHelp_DynamicCode::AuthHelp_DynamicCode_Get(XNETHANDLE xhToken, int nDy ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// -XHTHREAD CALLBACK CAuthHelp_DynamicCode::AuthHelp_DynamicCode_Thread(XPVOID lParam) +XHTHREAD XCALLBACK CAuthHelp_DynamicCode::AuthHelp_DynamicCode_Thread(XPVOID lParam) { CAuthHelp_DynamicCode* pClass_This = (CAuthHelp_DynamicCode*)lParam; //用于处理超时的token diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.h b/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.h index 10be31c..f4ba1c1 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.h +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_DynamicCode/AuthHelp_DynamicCode.h @@ -28,7 +28,7 @@ public: bool AuthHelp_DynamicCode_Create(XNETHANDLE* pxhToken, XSHOT* pInt_DynamicCode); bool AuthHelp_DynamicCode_Get(XNETHANDLE xhToken, int nDynamicCode); protected: - static XHTHREAD CALLBACK AuthHelp_DynamicCode_Thread(XPVOID lParam); + static XHTHREAD XCALLBACK AuthHelp_DynamicCode_Thread(XPVOID lParam); private: int m_nSescond = 0; bool m_bRun = false; diff --git a/XEngine_Source/AuthorizeModule_Session/Session_Define.h b/XEngine_Source/AuthorizeModule_Session/Session_Define.h index e25adb9..0274311 100644 --- a/XEngine_Source/AuthorizeModule_Session/Session_Define.h +++ b/XEngine_Source/AuthorizeModule_Session/Session_Define.h @@ -25,8 +25,8 @@ typedef struct // 导出的回调函数 ////////////////////////////////////////////////////////////////////////// //用户在线时间事件回调处理函数,用户名 在线时间 剩余时间(分,天) 注册的卡类型 自定义参数 -typedef void(CALLBACK* CALLBACK_XENGIEN_AUTHORIZE_SESSION_CLIENT_EVENTS)(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam); -typedef void(CALLBACK* CALLBACK_XENGIEN_AUTHORIZE_SESSION_TOKEN_EVENTS)(XNETHANDLE xhToken, XPVOID lParam); +typedef void(XCALLBACK* CALLBACK_XENGIEN_AUTHORIZE_SESSION_CLIENT_EVENTS)(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam); +typedef void(XCALLBACK* CALLBACK_XENGIEN_AUTHORIZE_SESSION_TOKEN_EVENTS)(XNETHANDLE xhToken, XPVOID lParam); ////////////////////////////////////////////////////////////////////////// // 导出的函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/XAuth_Protocol.h b/XEngine_Source/XAuth_Protocol.h index 3f7f969..4f08e92 100644 --- a/XEngine_Source/XAuth_Protocol.h +++ b/XEngine_Source/XAuth_Protocol.h @@ -105,7 +105,7 @@ typedef enum ////////////////////////////////////////////////////////////////////////// typedef struct { - XCHAR tszAddr[MAX_PATH]; //服务器或者域名地址 + XCHAR tszAddr[XPATH_MAX]; //服务器或者域名地址 int nPort; //端口号码,如果>0表示CDKEY验证失败后改为网络验证 //版本信息 struct @@ -212,7 +212,7 @@ typedef struct typedef struct { __int64x nID; //ID - XCHAR tszUserName[MAX_PATH]; //用户名 + XCHAR tszUserName[XPATH_MAX]; //用户名 XCHAR tszIPAddr[128]; //IP XCHAR tszLeftTime[64]; //过期时间 XCHAR tszCreateTime[64]; //创建时间 diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Announcement.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Announcement.cpp index f3b8bdf..6e8fc89 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Announcement.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Announcement.cpp @@ -72,8 +72,8 @@ void CDialog_Announcement::OnBnClickedButton1() AfxMessageBox(_T("内容不能小于1个字节")); return; } - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/notice/insert"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); @@ -169,8 +169,8 @@ void CDialog_Announcement::OnBnClickedButton2() } m_StrNotice = m_ListAnnouncement.GetItemText(nSelect, 0); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/notice/delete"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); int nMsgLen = 0; @@ -249,8 +249,8 @@ void CDialog_Announcement::OnBnClickedButton3() pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/notice/list"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp index a7a4906..66241e6 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp @@ -118,8 +118,8 @@ void CDialog_Banned::OnBnClickedButton2() m_EditUser.GetWindowText(m_StrUser); m_DataTime.GetWindowText(m_StrTime); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/banned/insert"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); int nMsgLen = 0; @@ -223,8 +223,8 @@ void CDialog_Banned::OnBnClickedButton4() m_EditPosStart.GetWindowText(m_StrPosStart); m_EditPosEnd.GetWindowText(m_StrPosEnd); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/banned/list"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); @@ -352,10 +352,10 @@ void CDialog_Banned::OnBnClickedButton3() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); @@ -454,8 +454,8 @@ void CDialog_Banned::OnBnClickedButton5() m_EditUser.GetWindowText(m_StrUser); m_DataTime.GetWindowText(m_StrTime); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/banned/modify"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); int nMsgLen = 0; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Config.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Config.cpp index afd2f12..4a86416 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Config.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Config.cpp @@ -106,8 +106,8 @@ void CDialog_Config::OnBnClickedButton1() CString m_StrPass; CString m_StrToken; CString m_StrDCode; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); //组合请求URL m_EditIPAddr.GetWindowText(m_StrIPAddr); m_EditIPPort.GetWindowText(m_StrIPPort); @@ -120,7 +120,7 @@ void CDialog_Config::OnBnClickedButton1() if (m_RadioPassEnable.GetCheck() == BST_CHECKED) { int nPLen = m_StrPass.GetLength(); - XBYTE byMD5Buffer[MAX_PATH] = {}; + XBYTE byMD5Buffer[XPATH_MAX] = {}; Cryption_Api_Digest(W2A(m_StrPass.GetBuffer()), byMD5Buffer, &nPLen, false, m_ComboPassCodec.GetCurSel() + 1); BaseLib_String_StrToHex((LPCXSTR)byMD5Buffer, nPLen, tszMDBuffer); } @@ -195,8 +195,8 @@ void CDialog_Config::OnBnClickedButton2() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); //组合请求URL m_EditIPAddr.GetWindowText(m_StrIPAddr); m_EditIPPort.GetWindowText(m_StrIPPort); @@ -257,8 +257,8 @@ void CDialog_Config::OnBnClickedButton5() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); //组合请求URL m_EditIPAddr.GetWindowText(m_StrIPAddr); m_EditIPPort.GetWindowText(m_StrIPPort); @@ -329,8 +329,8 @@ void CDialog_Config::OnBnClickedButton8() // TODO: 在此添加控件通知处理程序代码 CString m_StrIPAddr; CString m_StrIPPort; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); //组合请求URL m_EditIPAddr.GetWindowText(m_StrIPAddr); m_EditIPPort.GetWindowText(m_StrIPPort); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp index 759d9d3..8e2050e 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Modify.cpp @@ -83,8 +83,8 @@ BOOL CDialog_Modify::OnInitDialog() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); //组合请求URL pConfigWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pConfigWnd->m_EditIPPort.GetWindowText(m_StrIPPort); @@ -225,8 +225,8 @@ void CDialog_Modify::OnBnClickedButton2() CString m_StrToken; CString m_StrBtnModify; - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); m_BtnModify.GetWindowText(m_StrBtnModify); //组合请求URL CDialog_Config* pConfigWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp index 49b6fa1..a078527 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp @@ -101,8 +101,8 @@ void CDialog_Serial::OnBnClickedButton1() m_EditPosStart.GetWindowText(m_StrPosStart); m_EditPosEnd.GetWindowText(m_StrPosEnd); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/serial/list"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); int nMsgLen = 0; @@ -186,10 +186,10 @@ void CDialog_Serial::OnBnClickedButton2() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); @@ -287,10 +287,10 @@ void CDialog_Serial::OnBnClickedButton4() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); @@ -403,9 +403,9 @@ void CDialog_Serial::OnBnClickedButton6() } FILE* pSt_File = _tfopen(m_FileDlg.GetPathName(), _T("rb")); - XCHAR tszMsgBuffer[MAX_PATH]; + XCHAR tszMsgBuffer[XPATH_MAX]; //跳过第一行 - if (NULL == fgets(tszMsgBuffer, MAX_PATH, pSt_File)) + if (NULL == fgets(tszMsgBuffer, XPATH_MAX, pSt_File)) { //没有数据 AfxMessageBox(_T("没有数据")); @@ -414,9 +414,9 @@ void CDialog_Serial::OnBnClickedButton6() list stl_ListSerial; while (true) { - memset(tszMsgBuffer, '\0', MAX_PATH); + memset(tszMsgBuffer, '\0', XPATH_MAX); //一行一行读取 - if (NULL == fgets(tszMsgBuffer, MAX_PATH, pSt_File)) + if (NULL == fgets(tszMsgBuffer, XPATH_MAX, pSt_File)) { break; } @@ -434,10 +434,10 @@ void CDialog_Serial::OnBnClickedButton6() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); @@ -539,8 +539,8 @@ void CDialog_Serial::OnBnClickedButton7() } FILE* pSt_File = _tfopen(m_FileDlg.GetPathName(), _T("wb")); - XCHAR tszMsgBuffer[MAX_PATH]; - memset(tszMsgBuffer, '\0', MAX_PATH); + XCHAR tszMsgBuffer[XPATH_MAX]; + memset(tszMsgBuffer, '\0', XPATH_MAX); //写字段头 int nRet = _xstprintf(tszMsgBuffer, _X("ID UserName SerialNumber MaxTime CardSerialType bIsUsed CreateTime\r\n")); fwrite(tszMsgBuffer, 1, nRet, pSt_File); @@ -549,7 +549,7 @@ void CDialog_Serial::OnBnClickedButton7() { int nSerialType = 0; int nUsedType = 0; - memset(tszMsgBuffer, '\0', MAX_PATH); + memset(tszMsgBuffer, '\0', XPATH_MAX); USES_CONVERSION; for (int j = 0; j < sizeof(lpszXSerialType) - 1; j++) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp index 106c3ee..ebc26f6 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp @@ -70,10 +70,10 @@ void CDialog_Switch::OnBnClickedButton1() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); @@ -285,10 +285,10 @@ void CDialog_Switch::OnBnClickedButton2() CString m_StrIPAddr; CString m_StrIPPort; CString m_StrToken; - XCHAR tszUrlAddr[MAX_PATH]; + XCHAR tszUrlAddr[XPATH_MAX]; CDialog_Config* pWnd = (CDialog_Config*)CDialog_Config::FromHandle(hConfigWnd); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszUrlAddr, '\0', XPATH_MAX); pWnd->m_EditIPAddr.GetWindowText(m_StrIPAddr); pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp index db29df8..01338a1 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp @@ -74,23 +74,23 @@ void CDialog_Try::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_ListTry.DeleteAllItems(); - TCHAR tszIPAddr[MAX_PATH]; - TCHAR tszIPPort[MAX_PATH]; - TCHAR tszToken[MAX_PATH]; - XCHAR tszUrlAddr[MAX_PATH]; + TCHAR tszIPAddr[XPATH_MAX]; + TCHAR tszIPPort[XPATH_MAX]; + TCHAR tszToken[XPATH_MAX]; + XCHAR tszUrlAddr[XPATH_MAX]; CString m_StrPosStart; CString m_StrPosEnd; - memset(tszIPAddr, '\0', MAX_PATH); - memset(tszIPPort, '\0', MAX_PATH); - memset(tszToken, '\0', MAX_PATH); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszIPAddr, '\0', XPATH_MAX); + memset(tszIPPort, '\0', XPATH_MAX); + memset(tszToken, '\0', XPATH_MAX); + memset(tszUrlAddr, '\0', XPATH_MAX); m_EditPosStart.GetWindowText(m_StrPosStart); m_EditPosEnd.GetWindowText(m_StrPosEnd); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT1), tszIPAddr, MAX_PATH); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT2), tszIPPort, MAX_PATH); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT9), tszToken, MAX_PATH); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT1), tszIPAddr, XPATH_MAX); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT2), tszIPPort, XPATH_MAX); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT9), tszToken, XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/try/list"), W2A(tszIPAddr), W2A(tszIPPort)); @@ -184,8 +184,8 @@ void CDialog_Try::OnBnClickedButton2() pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/try/delete"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); @@ -309,8 +309,8 @@ void CDialog_Try::OnBnClickedButton3() pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/try/modify"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp index acf2d94..adb0552 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp @@ -77,23 +77,23 @@ void CDialog_User::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_ListCtrlClient.DeleteAllItems(); - TCHAR tszIPAddr[MAX_PATH]; - TCHAR tszIPPort[MAX_PATH]; - TCHAR tszToken[MAX_PATH]; - XCHAR tszUrlAddr[MAX_PATH]; + TCHAR tszIPAddr[XPATH_MAX]; + TCHAR tszIPPort[XPATH_MAX]; + TCHAR tszToken[XPATH_MAX]; + XCHAR tszUrlAddr[XPATH_MAX]; CString m_StrPosStart; CString m_StrPosEnd; - memset(tszIPAddr, '\0', MAX_PATH); - memset(tszIPPort, '\0', MAX_PATH); - memset(tszToken, '\0', MAX_PATH); - memset(tszUrlAddr, '\0', MAX_PATH); + memset(tszIPAddr, '\0', XPATH_MAX); + memset(tszIPPort, '\0', XPATH_MAX); + memset(tszToken, '\0', XPATH_MAX); + memset(tszUrlAddr, '\0', XPATH_MAX); m_EditPosStart.GetWindowText(m_StrPosStart); m_EditPosEnd.GetWindowText(m_StrPosEnd); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT1), tszIPAddr, MAX_PATH); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT2), tszIPPort, MAX_PATH); - ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT9), tszToken, MAX_PATH); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT1), tszIPAddr, XPATH_MAX); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT2), tszIPPort, XPATH_MAX); + ::GetWindowText(::GetDlgItem(hConfigWnd, IDC_EDIT9), tszToken, XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/client/list"), W2A(tszIPAddr), W2A(tszIPPort)); int nMsgLen = 0; @@ -210,8 +210,8 @@ void CDialog_User::OnBnClickedButton2() pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/client/close"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); @@ -301,8 +301,8 @@ void CDialog_User::OnBnClickedButton3() pWnd->m_EditIPPort.GetWindowText(m_StrIPPort); pWnd->m_EditToken.GetWindowText(m_StrToken); - XCHAR tszUrlAddr[MAX_PATH]; - memset(tszUrlAddr, '\0', MAX_PATH); + XCHAR tszUrlAddr[XPATH_MAX]; + memset(tszUrlAddr, '\0', XPATH_MAX); USES_CONVERSION; _xstprintf(tszUrlAddr, _X("http://%s:%s/auth/client/delete"), W2A(m_StrIPAddr.GetBuffer()), W2A(m_StrIPPort.GetBuffer())); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeAppDlg.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeAppDlg.cpp index c8df52f..aed7a92 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeAppDlg.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeAppDlg.cpp @@ -43,7 +43,7 @@ END_MESSAGE_MAP() LONG WINAPI Coredump_ExceptionFilter(EXCEPTION_POINTERS* pExceptionPointers) { static int i = 0; - XCHAR tszFileStr[MAX_PATH] = {}; + XCHAR tszFileStr[XPATH_MAX] = {}; XCHAR tszTimeStr[128] = {}; BaseLib_Time_TimeToStr(tszTimeStr); _xstprintf(tszFileStr, _X("./XEngine_Coredump/dumpfile_%s_%d.dmp"), tszTimeStr, i++); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index 9aa7a45..bd79708 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -1,6 +1,6 @@ #include "Authorize_Hdr.h" -XHTHREAD CALLBACK XEngine_AuthService_HttpThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_AuthService_HttpThread(XPVOID lParam) { int nPoolIndex = *(int*)lParam; int nThreadPos = nPoolIndex + 1; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h index 80a560c..a716388 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h @@ -1,4 +1,4 @@ #pragma once -XHTHREAD CALLBACK XEngine_AuthService_HttpThread(XPVOID lParam); +XHTHREAD XCALLBACK XEngine_AuthService_HttpThread(XPVOID lParam); bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParament); \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp index 20c0092..f3e40a2 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.cpp @@ -1,13 +1,13 @@ #include "Authorize_Hdr.h" ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Client_TCPAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Client_TCPAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { HelpComponents_Datas_CreateEx(xhTCPPacket, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhTCPHeart, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("TCP客户端:%s,进入服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Client_TCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Client_TCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (!HelpComponents_Datas_PostEx(xhTCPPacket, lpszClientAddr, lpszRecvMsg, nMsgLen)) { @@ -15,23 +15,23 @@ void CALLBACK XEngine_Client_TCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LP } SocketOpt_HeartBeat_ActiveAddrEx(xhTCPHeart, lpszClientAddr); } -void CALLBACK XEngine_Client_TCPClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Client_TCPClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 1); } -void CALLBACK XEngine_Client_TCPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Client_TCPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 2); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Client_WSAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Client_WSAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { RfcComponents_WSPacket_CreateEx(xhWSPacket, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhWSHeart, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WS客户端:%s,进入服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Client_WSRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Client_WSRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { bool bLogin = false; RfcComponents_WSPacket_GetLoginEx(xhWSPacket, lpszClientAddr, &bLogin); @@ -55,23 +55,23 @@ void CALLBACK XEngine_Client_WSRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPC } SocketOpt_HeartBeat_ActiveAddrEx(xhWSHeart, lpszClientAddr); } -void CALLBACK XEngine_Client_WSClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Client_WSClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 1); } -void CALLBACK XEngine_Client_WSHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Client_WSHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 2); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Client_HttpAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Client_HttpAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { HttpProtocol_Server_CreateClientEx(xhHttpPacket, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhHTTPHeart, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,进入服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (!HttpProtocol_Server_InserQueueEx(xhHttpPacket, lpszClientAddr, lpszRecvMsg, nMsgLen)) { @@ -79,11 +79,11 @@ void CALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, L } SocketOpt_HeartBeat_ActiveAddrEx(xhHTTPHeart, lpszClientAddr); } -void CALLBACK XEngine_Client_HttpClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Client_HttpClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 1); } -void CALLBACK XEngine_Client_HttpHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Client_HttpHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_CloseClient(lpszClientAddr, 2); } @@ -138,8 +138,8 @@ bool XEngine_CloseClient(LPCXSTR lpszClientAddr, int nLeaveType) if (st_AuthConfig.st_XLogin.bPassAuth) { int nSDLen = 0; - XCHAR tszSDBuffer[MAX_PATH]; - memset(tszSDBuffer, '\0', MAX_PATH); + XCHAR tszSDBuffer[XPATH_MAX]; + memset(tszSDBuffer, '\0', XPATH_MAX); Protocol_Packet_HttpUserTime(tszSDBuffer, &nSDLen, &st_AuthTime); APIClient_Http_Request(_X("POST"), st_AuthConfig.st_XLogin.st_PassUrl.tszPassLogout, tszSDBuffer); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.h index 143ae7a..3e7e53d 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Net.h @@ -1,19 +1,19 @@ #pragma once -bool CALLBACK XEngine_Client_TCPAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_TCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Client_TCPClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_TCPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +bool XCALLBACK XEngine_Client_TCPAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_TCPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Client_TCPClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_TCPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -bool CALLBACK XEngine_Client_WSAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_WSRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Client_WSClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_WSHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +bool XCALLBACK XEngine_Client_WSAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_WSRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Client_WSClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_WSHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -bool CALLBACK XEngine_Client_HttpAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Client_HttpClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Client_HttpHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +bool XCALLBACK XEngine_Client_HttpAccept(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_HttpRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Client_HttpClose(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Client_HttpHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); bool XEngine_CloseClient(LPCXSTR lpszClientAddr, int nLeaveType = 0); bool XEngine_Client_TaskSend(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nNetType); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp index 842bcd9..9714b5f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp @@ -1,6 +1,6 @@ #include "Authorize_Hdr.h" -XHTHREAD CALLBACK XEngine_AuthService_TCPThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_AuthService_TCPThread(XPVOID lParam) { int nPoolIndex = *(int*)lParam; int nThreadPos = nPoolIndex + 1; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.h index c9ef91f..87b185e 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.h @@ -1,4 +1,4 @@ #pragma once -XHTHREAD CALLBACK XEngine_AuthService_TCPThread(XPVOID lParam); +XHTHREAD XCALLBACK XEngine_AuthService_TCPThread(XPVOID lParam); bool XEngine_Client_TCPTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, int nNetType); \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp index 6b1208c..751971f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.cpp @@ -1,6 +1,6 @@ #include "Authorize_Hdr.h" -void CALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam) +void XCALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam) { if (nLeftTimer <= 0) { @@ -61,7 +61,7 @@ void CALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserNam DBModule_MySQL_UserLeave(&st_AuthTime); } } -void CALLBACK XEngine_TaskEvent_Token(XNETHANDLE xhToken, XPVOID lParam) +void XCALLBACK XEngine_TaskEvent_Token(XNETHANDLE xhToken, XPVOID lParam) { bool bRemove = true; AUTHREG_USERTABLE st_UserTable; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.h index 3217c24..61d4ba0 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Task.h @@ -1,4 +1,4 @@ #pragma once -void CALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam); -void CALLBACK XEngine_TaskEvent_Token(XNETHANDLE xhToken, XPVOID lParam); \ No newline at end of file +void XCALLBACK XEngine_TaskEvent_Client(LPCXSTR lpszUserAddr, LPCXSTR lpszUserName, __int64x nOnlineTimer, __int64x nLeftTimer, LPCXSTR lpszLeftDate, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType, ENUM_PROTOCOLDEVICE_TYPE enDeviceType, int nNetType, XPVOID lParam); +void XCALLBACK XEngine_TaskEvent_Token(XNETHANDLE xhToken, XPVOID lParam); \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp index 87b9cb9..80494e8 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp @@ -1,6 +1,6 @@ #include "Authorize_Hdr.h" -XHTHREAD CALLBACK XEngine_AuthService_WSThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_AuthService_WSThread(XPVOID lParam) { int nPoolIndex = *(int*)lParam; int nThreadPos = nPoolIndex + 1; @@ -55,14 +55,14 @@ bool XEngine_Client_WSTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nM if (ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_CLOSE == enOPCode) { int nSDLen = 0; - XCHAR tszMSGBuffer[MAX_PATH] = {}; + XCHAR tszMSGBuffer[XPATH_MAX] = {}; RfcComponents_WSCodec_EncodeMsg(NULL, tszMSGBuffer, &nSDLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_CLOSE); NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, tszMSGBuffer, nSDLen); } else if (ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_PING == enOPCode) { int nSDLen = 0; - XCHAR tszMSGBuffer[MAX_PATH] = {}; + XCHAR tszMSGBuffer[XPATH_MAX] = {}; RfcComponents_WSCodec_EncodeMsg(NULL, tszMSGBuffer, &nSDLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_PONG); NetCore_TCPXCore_SendEx(xhWSSocket, lpszClientAddr, tszMSGBuffer, nSDLen); } diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.h index b2d203d..bbaabcb 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.h @@ -1,4 +1,4 @@ #pragma once -XHTHREAD CALLBACK XEngine_AuthService_WSThread(XPVOID lParam); +XHTHREAD XCALLBACK XEngine_AuthService_WSThread(XPVOID lParam); bool XEngine_Client_WSTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE enOPCode); \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp index 604bb36..fb6b555 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp @@ -98,7 +98,7 @@ static int ServiceApp_Deamon(int wait) LONG WINAPI Coredump_ExceptionFilter(EXCEPTION_POINTERS* pExceptionPointers) { static int i = 0; - XCHAR tszFileStr[MAX_PATH] = {}; + XCHAR tszFileStr[XPATH_MAX] = {}; XCHAR tszTimeStr[128] = {}; BaseLib_Time_TimeToStr(tszTimeStr); _xstprintf(tszFileStr, _X("./XEngine_Coredump/dumpfile_%s_%d.dmp"), tszTimeStr, i++); diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 2dd56fa..78d2ea2 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 2dd56facd7c93dfd3810d1db4341fff469e0786b +Subproject commit 78d2ea2cfcfa4701e122ee3e4ac536f712831f86 -- Gitee From bad5f68f1f038f048807ce496fa665c3a090b8d2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 6 Jun 2025 17:17:14 +0800 Subject: [PATCH 04/34] update:depend library --- XEngine_Source/XEngine_Depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 78d2ea2..66e6bf3 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 78d2ea2cfcfa4701e122ee3e4ac536f712831f86 +Subproject commit 66e6bf39df14cd66d4bcbbb44a3e168ff75fed99 -- Gitee From 013a0da4aedab277e4748bd4d1af86e94224e6ef Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 6 Jun 2025 17:17:40 +0800 Subject: [PATCH 05/34] fixed:sometime configure read memory leak --- .../ModuleConfigure_Json/ModuleConfigure_Json.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index c21f251..b8f923a 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -61,21 +61,12 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Config_dwErrorCode = ERROR_AUTHORIZE_MODULE_CONFIGURE_OPENFILE; return false; } - size_t nCount = 0; - XCHAR tszMsgBuffer[4096]; - while (1) - { - size_t nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); - if (nRet <= 0) - { - break; - } - nCount += nRet; - } + XCHAR tszMsgBuffer[8192] = {}; + size_t nRet = fread(tszMsgBuffer, 1, sizeof(tszMsgBuffer), pSt_File); fclose(pSt_File); //开始解析配置文件 std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); - if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nRet, &st_JsonRoot, &st_JsonError)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_AUTHORIZE_MODULE_CONFIGURE_PARSE; -- Gitee From 734913948321f97498aef0ffcd54be65f8c07ef1 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 23 Jun 2025 09:47:29 +0800 Subject: [PATCH 06/34] improved:parameter command --- .../Authorize_Config.cpp | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp index 7563dd0..869fcb0 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp @@ -57,6 +57,30 @@ bool Authorize_Service_Parament(int argc, char** argv) { bIsTest = true; } + else if (0 == _tcsxcmp("-lt", argv[i])) + { + st_AuthConfig.st_XLog.nLogType = _ttxoi(argv[++i]); + } + else if (0 == _tcsxcmp("-ll", argv[i])) + { + st_AuthConfig.st_XLog.nLogLeave = _ttxoi(argv[++i]); + } + else if (0 == _tcsxcmp("-l", argv[i])) + { + LPCXSTR lpszLogLevel = argv[++i]; + if (0 == _tcsxcmp("debug", lpszLogLevel)) + { + st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG; + } + else if (0 == _tcsxcmp("detail", lpszLogLevel)) + { + st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DETAIL; + } + else if (0 == _tcsxcmp("info", lpszLogLevel)) + { + st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO; + } + } } return true; -- Gitee From 2a699f58e4cddb8dbe15239010c67bb1084a6148 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 3 Jul 2025 15:30:22 +0800 Subject: [PATCH 07/34] modify:depend library directory name --- .gitmodules | 2 +- .../AuthorizeModule_Client.vcxproj | 12 +++---- .../AuthorizeModule_Client/Makefile | 4 +-- .../AuthorizeModule_Configure.vcxproj | 12 +++---- .../AuthorizeModule_Configure/Makefile | 4 +-- .../AuthorizeModule_Protocol.vcxproj | 12 +++---- .../AuthorizeModule_Protocol/Makefile | 4 +-- XEngine_Source/Makefile | 4 +-- XEngine_Source/VSClean.bat | 1 + XEngine_Source/XEngine.sln | 35 ++++++++++--------- .../XEngine_AuthorizeApp.vcxproj | 12 +++---- .../XEngine_AuthorizeService/Authorize_Hdr.h | 4 +-- .../XEngine_AuthorizeService/Makefile | 2 +- XEngine_Source/XEngine_Depend | 1 - XEngine_Source/XEngine_DependLibrary | 1 + 15 files changed, 56 insertions(+), 54 deletions(-) delete mode 160000 XEngine_Source/XEngine_Depend create mode 160000 XEngine_Source/XEngine_DependLibrary diff --git a/.gitmodules b/.gitmodules index 1cc1974..3949a92 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "XEngine_Source/XEngine_Depend"] - path = XEngine_Source/XEngine_Depend + path = XEngine_Source/XEngine_DependLibrary url = https://github.com/libxengine/XEngine_OPenSource.git diff --git a/XEngine_Source/AuthorizeModule_Client/AuthorizeModule_Client.vcxproj b/XEngine_Source/AuthorizeModule_Client/AuthorizeModule_Client.vcxproj index d1255bb..5431318 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthorizeModule_Client.vcxproj +++ b/XEngine_Source/AuthorizeModule_Client/AuthorizeModule_Client.vcxproj @@ -98,27 +98,27 @@ - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) - $(XEngine_Include);..\AuthorizeModule_Client;../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);..\AuthorizeModule_Client;../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) diff --git a/XEngine_Source/AuthorizeModule_Client/Makefile b/XEngine_Source/AuthorizeModule_Client/Makefile index 3f22854..310b153 100644 --- a/XEngine_Source/AuthorizeModule_Client/Makefile +++ b/XEngine_Source/AuthorizeModule_Client/Makefile @@ -2,8 +2,8 @@ CC = g++ -Wall -std=c++20 -fPIC PLATVER = FILEEXT = LIBFLAG = -LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp -LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp +LOADHDR = -I ./ -I ../XEngine_DependLibrary/XEngine_Module/jsoncpp +LOADSO = -L ../XEngine_DependLibrary/XEngine_Module/jsoncpp LIB = -ljsoncpp -lXEngine_BaseLib -lXEngine_Cryption -lXClient_Socket -lXClient_APIHelp -lXEngine_SystemApi LIBEX = OBJECTS = AuthClient_Connector.o AuthClient_HTTPVer.o pch.o diff --git a/XEngine_Source/AuthorizeModule_Configure/AuthorizeModule_Configure.vcxproj b/XEngine_Source/AuthorizeModule_Configure/AuthorizeModule_Configure.vcxproj index e41937b..4fcbc8a 100644 --- a/XEngine_Source/AuthorizeModule_Configure/AuthorizeModule_Configure.vcxproj +++ b/XEngine_Source/AuthorizeModule_Configure/AuthorizeModule_Configure.vcxproj @@ -99,32 +99,32 @@ true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;..\AuthorizeModule_Configure;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;..\AuthorizeModule_Configure;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) diff --git a/XEngine_Source/AuthorizeModule_Configure/Makefile b/XEngine_Source/AuthorizeModule_Configure/Makefile index 923ca65..dd8ea3e 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Makefile +++ b/XEngine_Source/AuthorizeModule_Configure/Makefile @@ -2,8 +2,8 @@ CC = g++ -Wall -std=c++20 -fPIC PLATVER = FILEEXT = LIBFLAG = -LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp -LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp +LOADHDR = -I ./ -I ../XEngine_DependLibrary/XEngine_Module/jsoncpp +LOADSO = -L ../XEngine_DependLibrary/XEngine_Module/jsoncpp LIB = -ljsoncpp LIBEX = OBJECTS = ModuleConfigure_Json.o pch.o diff --git a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.vcxproj b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.vcxproj index e039230..693e0fd 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.vcxproj +++ b/XEngine_Source/AuthorizeModule_Protocol/AuthorizeModule_Protocol.vcxproj @@ -99,32 +99,32 @@ true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;..\AuthorizeModule_Protocol;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;..\AuthorizeModule_Protocol;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) diff --git a/XEngine_Source/AuthorizeModule_Protocol/Makefile b/XEngine_Source/AuthorizeModule_Protocol/Makefile index 63f4c33..f06fc59 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Makefile +++ b/XEngine_Source/AuthorizeModule_Protocol/Makefile @@ -2,8 +2,8 @@ CC = g++ -Wall -std=c++20 -fPIC PLATVER = FILEEXT = LIBFLAG = -LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp -LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp +LOADHDR = -I ./ -I ../XEngine_DependLibrary/XEngine_Module/jsoncpp +LOADSO = -L ../XEngine_DependLibrary/XEngine_Module/jsoncpp LIB = -ljsoncpp -lXEngine_BaseLib LIBEX = OBJECTS = Protocol_Packet.o Protocol_Parse.o pch.o diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 3436b2c..039598a 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -3,8 +3,8 @@ UNICODE = 0 PLATFORM=linux FLAGS= -DEPEND_JSONCPP_PATH = ./XEngine_Depend/XEngine_Module/jsoncpp -DEPEND_REPORT_PATH = ./XEngine_Depend/XEngine_Module/XEngine_InfoReport +DEPEND_JSONCPP_PATH = ./XEngine_DependLibrary/XEngine_Module/jsoncpp +DEPEND_REPORT_PATH = ./XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport AUTH_CDKEY_PATH = ./AuthorizeModule_CDKey AUTH_SESSION_PATH = ./AuthorizeModule_Session diff --git a/XEngine_Source/VSClean.bat b/XEngine_Source/VSClean.bat index bf8eca3..1ca651d 100644 --- a/XEngine_Source/VSClean.bat +++ b/XEngine_Source/VSClean.bat @@ -5,6 +5,7 @@ FOR /R . %%d IN (.) DO rd /s /q "%%d\Release" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\x64" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\Debug" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\ipch" 2>nul +FOR /R . %%d IN (.) DO rd /s /q "%%d\ARM64" 2>nul rem If the Properties directory is empty, remove it FOR /R . %%d in (.) do rd /q "%%d\Properties" 2> nul diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index 7b92e0d..b41abeb 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -51,6 +51,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_AuthorizeApp", "XEn {1391B739-713B-4A3A-9233-FEAB92E0566C} = {1391B739-713B-4A3A-9233-FEAB92E0566C} {AB3DB24C-E1B3-41CF-B2F4-6C12E13C2894} = {AB3DB24C-E1B3-41CF-B2F4-6C12E13C2894} {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AuthorizeModule_Help", "AuthorizeModule_Help\AuthorizeModule_Help.vcxproj", "{AB3DB24C-E1B3-41CF-B2F4-6C12E13C2894}" @@ -63,16 +64,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AuthorizeModule_Client", "A {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_Depend", "XEngine_Depend", "{6444F125-63DE-4120-98B3-DF097A9758FA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_Depend\XEngine_Module\jsoncpp\jsoncpp.vcxproj", "{F1736B3F-03A2-4FC7-B045-A12BA8D724FB}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_DependLibrary", "XEngine_DependLibrary", "{6444F125-63DE-4120-98B3-DF097A9758FA}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_InfoReport", "XEngine_Depend\XEngine_Module\XEngine_InfoReport\XEngine_InfoReport.vcxproj", "{F6520D2C-BB8E-45BB-964B-F5D6A4318A89}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AuthorizeModule_CDKey", "AuthorizeModule_CDKey\AuthorizeModule_CDKey.vcxproj", "{02A75BD0-416E-4AEF-BF34-BD85BD86384F}" ProjectSection(ProjectDependencies) = postProject {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AuthorizeModule_CDKey", "AuthorizeModule_CDKey\AuthorizeModule_CDKey.vcxproj", "{02A75BD0-416E-4AEF-BF34-BD85BD86384F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_DependLibrary\XEngine_Module\jsoncpp\jsoncpp.vcxproj", "{F1736B3F-03A2-4FC7-B045-A12BA8D724FB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_InfoReport", "XEngine_DependLibrary\XEngine_Module\XEngine_InfoReport\XEngine_InfoReport.vcxproj", "{F6520D2C-BB8E-45BB-964B-F5D6A4318A89}" ProjectSection(ProjectDependencies) = postProject {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} EndProjectSection @@ -183,6 +184,18 @@ Global {DD8CB5F1-980F-48C3-BA2F-3CF534903B14}.Release|x64.Build.0 = Release|x64 {DD8CB5F1-980F-48C3-BA2F-3CF534903B14}.Release|x86.ActiveCfg = Release|Win32 {DD8CB5F1-980F-48C3-BA2F-3CF534903B14}.Release|x86.Build.0 = Release|Win32 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|ARM64.Build.0 = Debug|ARM64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x64.ActiveCfg = Debug|x64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x64.Build.0 = Debug|x64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x86.ActiveCfg = Debug|Win32 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x86.Build.0 = Debug|Win32 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|ARM64.ActiveCfg = Release|ARM64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|ARM64.Build.0 = Release|ARM64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x64.ActiveCfg = Release|x64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x64.Build.0 = Release|x64 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x86.ActiveCfg = Release|Win32 + {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x86.Build.0 = Release|Win32 {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|ARM64.Build.0 = Debug|ARM64 {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x64.ActiveCfg = Debug|x64 @@ -207,18 +220,6 @@ Global {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x64.Build.0 = Release|x64 {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.ActiveCfg = Release|Win32 {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.Build.0 = Release|Win32 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|ARM64.Build.0 = Debug|ARM64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x64.ActiveCfg = Debug|x64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x64.Build.0 = Debug|x64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x86.ActiveCfg = Debug|Win32 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Debug|x86.Build.0 = Debug|Win32 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|ARM64.ActiveCfg = Release|ARM64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|ARM64.Build.0 = Release|ARM64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x64.ActiveCfg = Release|x64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x64.Build.0 = Release|x64 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x86.ActiveCfg = Release|Win32 - {02A75BD0-416E-4AEF-BF34-BD85BD86384F}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeApp.vcxproj b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeApp.vcxproj index 9b63435..16cc6b9 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeApp.vcxproj +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngine_AuthorizeApp.vcxproj @@ -105,32 +105,32 @@ true - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;..\XEngine_AuthorizeApp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;..\XEngine_AuthorizeApp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) true - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) true - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) false - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) false - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) false - $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_LibArm64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h index 025ac4e..3bb5043 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h @@ -58,8 +58,8 @@ using namespace std; #include "../../AuthorizeModule_Help/AuthHelp_Error.h" #include "../../AuthorizeModule_CDKey/CDKey_Define.h" #include "../../AuthorizeModule_CDKey/CDKey_Error.h" -#include "../../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" -#include "../../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" +#include "../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" +#include "../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" extern bool bIsRun; extern bool bIsTest; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile index 72c6ec9..f67f76f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile @@ -3,7 +3,7 @@ PLATVER = FILEEXT = LIBFLAG = LOADHDR = -I ./ -LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp -L ../../XEngine_Depend/XEngine_Module/XEngine_InfoReport \ +LOADSO = -L ../../XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport \ -L ../../AuthorizeModule_Session -L ../../AuthorizeModule_Database -L ../../AuthorizeModule_Protocol -L ../../AuthorizeModule_Configure -L ../../AuthorizeModule_Help -L ../../AuthorizeModule_CDKey LIB = -lXEngine_InfoReport -ljsoncpp \ -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_Cryption -lXClient_APIHelp -lNetHelp_APIAddr -lHelpComponents_Packets -lHelpComponents_DataBase -lHelpComponents_XLog -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lXEngine_ProcFile -lXEngine_SystemApi \ diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend deleted file mode 160000 index 66e6bf3..0000000 --- a/XEngine_Source/XEngine_Depend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66e6bf39df14cd66d4bcbbb44a3e168ff75fed99 diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary new file mode 160000 index 0000000..ff00013 --- /dev/null +++ b/XEngine_Source/XEngine_DependLibrary @@ -0,0 +1 @@ +Subproject commit ff000130f5a7f702371d1555de1e216a27f2e321 -- Gitee From d454bc2a2cbf697f5b4f3c18b2448dddef4e3a75 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 3 Jul 2025 15:30:56 +0800 Subject: [PATCH 08/34] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index ff00013..2b47966 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit ff000130f5a7f702371d1555de1e216a27f2e321 +Subproject commit 2b4796680134656c5144b3665aac9ec65ea6292a -- Gitee From 5f70ee38a48e62e17f94f265dcb88e99ce9bfcbf Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 3 Jul 2025 15:41:54 +0800 Subject: [PATCH 09/34] fixed:lost copy module file --- XEngine_Source/VSCopy_Arm64.bat | 1 + XEngine_Source/VSCopy_Debug.bat | 1 + XEngine_Source/VSCopy_x64.bat | 1 + XEngine_Source/VSCopy_x86.bat | 1 + 4 files changed, 4 insertions(+) diff --git a/XEngine_Source/VSCopy_Arm64.bat b/XEngine_Source/VSCopy_Arm64.bat index 9d58afb..b589fba 100644 --- a/XEngine_Source/VSCopy_Arm64.bat +++ b/XEngine_Source/VSCopy_Arm64.bat @@ -7,6 +7,7 @@ copy /y "%XEngine_LibArm64%\XEngine_Core\XEngine_Cryption.dll" "./" copy /y "%XEngine_LibArm64%\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" copy /y "%XEngine_LibArm64%\XEngine_NetHelp\NetHelp_APIAddr.dll" "./" +copy /y "%XEngine_LibArm64%\XEngine_NetHelp\NetHelp_XSocket.dll" "./" copy /y "%XEngine_LibArm64%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_LibArm64%\XEngine_HelpComponents\HelpComponents_Packets.dll" "./" diff --git a/XEngine_Source/VSCopy_Debug.bat b/XEngine_Source/VSCopy_Debug.bat index 65b1df8..b813a8b 100644 --- a/XEngine_Source/VSCopy_Debug.bat +++ b/XEngine_Source/VSCopy_Debug.bat @@ -7,6 +7,7 @@ copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_Cryption.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\NetHelp_APIHelp.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\NetHelp_APIAddr.dll" "./" +copy /y "D:\XEngine\XEngine_SourceCode\Debug\NetHelp_XSocket.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_DataBase.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_Packets.dll" "./" diff --git a/XEngine_Source/VSCopy_x64.bat b/XEngine_Source/VSCopy_x64.bat index 449407a..af2923e 100644 --- a/XEngine_Source/VSCopy_x64.bat +++ b/XEngine_Source/VSCopy_x64.bat @@ -7,6 +7,7 @@ copy /y "%XEngine_Lib64%\XEngine_Core\XEngine_Cryption.dll" "./" copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_APIAddr.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_XSocket.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_Packets.dll" "./" diff --git a/XEngine_Source/VSCopy_x86.bat b/XEngine_Source/VSCopy_x86.bat index c70e5a4..e37f3b1 100644 --- a/XEngine_Source/VSCopy_x86.bat +++ b/XEngine_Source/VSCopy_x86.bat @@ -7,6 +7,7 @@ copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_Cryption.dll" "./" copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_APIAddr.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_XSocket.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_Packets.dll" "./" -- Gitee From f5ef36c7971aa45bf48ad5f372292023b0df9bb5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 3 Jul 2025 16:00:19 +0800 Subject: [PATCH 10/34] ci:fixed directory path --- .github/workflows/Rocky_build.yml | 2 +- .github/workflows/debian_build.yml | 2 +- .github/workflows/fedora_build.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 1c30b47..6a89b38 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v4 with: repository: libxengine/XEngine_OPenSource - path: XEngine_Source/XEngine_Depend + path: XEngine_Source/XEngine_DependLibrary - name: install system package run: | diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml index c493883..c2be054 100644 --- a/.github/workflows/debian_build.yml +++ b/.github/workflows/debian_build.yml @@ -40,7 +40,7 @@ jobs: uses: actions/checkout@v4 with: repository: libxengine/XEngine_OPenSource - path: XEngine_Source/XEngine_Depend + path: XEngine_Source/XEngine_DependLibrary - name: install system package run: | diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml index 87bb84f..608d9f8 100644 --- a/.github/workflows/fedora_build.yml +++ b/.github/workflows/fedora_build.yml @@ -46,7 +46,7 @@ jobs: uses: actions/checkout@v4 with: repository: libxengine/XEngine_OPenSource - path: XEngine_Source/XEngine_Depend + path: XEngine_Source/XEngine_DependLibrary - name: install system package run: | -- Gitee From eeca2bf1b681b37d286e4ef96d4833fdbdf2dba7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 4 Jul 2025 09:35:44 +0800 Subject: [PATCH 11/34] ci:added rocky linux 10 support --- .github/workflows/Rocky_build.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 6a89b38..c8d7b96 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -25,10 +25,22 @@ jobs: runner: ubuntu-24.04 platform: linux/amd64 artifact: x86-64 + version: 9 + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + version: 10 + - arch: arm64 + runner: ubuntu-24.04-arm + platform: linux/arm64 + artifact: Arm64 + version: 9 - arch: arm64 runner: ubuntu-24.04-arm platform: linux/arm64 artifact: Arm64 + version: 10 steps: - name: Checkout main repository code -- Gitee From eb4a2e9660d1a707fde76fe6fcc763c9baf97450 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 4 Jul 2025 10:05:33 +0800 Subject: [PATCH 12/34] ci:fixed version choice incorrect --- .github/workflows/Rocky_build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index c8d7b96..90f8ae9 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -16,7 +16,7 @@ jobs: build: runs-on: ${{ matrix.runner }} container: - image: rockylinux/rockylinux:9.5 + image: rockylinux/rockylinux:${{ matrix.version }} options: --platform ${{ matrix.platform }} strategy: matrix: @@ -71,9 +71,9 @@ jobs: - name: install xengine library run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_${{ matrix.artifact }}.zip - unzip ./XEngine_RockyLinux_9_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_9_${{ matrix.artifact }} - cd XEngine_RockyLinux_9_${{ matrix.artifact }} + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_${{ matrix.version }}_${{ matrix.artifact }}.zip + unzip ./XEngine_RockyLinux_${{ matrix.version }}_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} + cd XEngine_RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} chmod 777 * ./XEngine_LINEnv.sh -i 3 @@ -97,6 +97,6 @@ jobs: - name: Upload folder as artifact with RockyLinux uses: actions/upload-artifact@v4 with: - name: XEngine_AuthorizeService-RockyLinux_9_${{ matrix.artifact }} + name: XEngine_AuthorizeService-RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 -- Gitee From dcb54cdb16fd367e84eab3399821da15221644b4 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 5 Jul 2025 11:01:14 +0800 Subject: [PATCH 13/34] modify:start parameter are not case sensitive --- .../Authorize_Config.cpp | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp index 869fcb0..1369937 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Config.cpp @@ -24,59 +24,47 @@ bool Authorize_Service_Parament(int argc, char** argv) for (int i = 0;i < argc;i++) { - if ((0 == _tcsxcmp("-h", argv[i])) || (0 == _tcsxcmp("-H", argv[i]))) + if (0 == _tcsxicmp("-h", argv[i])) { Authorize_Service_ParamentHelp(); return false; } - else if (0 == _tcsxcmp("-d", argv[i])) + else if (0 == _tcsxicmp("-d", argv[i])) { st_AuthConfig.bDeamon = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-TP", argv[i])) + else if (0 == _tcsxicmp("-tp", argv[i])) { st_AuthConfig.nTCPPort = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-WP", argv[i])) + else if (0 == _tcsxicmp("-wp", argv[i])) { st_AuthConfig.nWSPort = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-HP", argv[i])) + else if (0 == _tcsxicmp("-hp", argv[i])) { st_AuthConfig.nHTTPPort = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-LL", argv[i])) - { - st_AuthConfig.st_XLog.nLogLeave = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-LT", argv[i])) - { - st_AuthConfig.st_XLog.nLogType = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-t", argv[i])) + else if (0 == _tcsxicmp("-t", argv[i])) { bIsTest = true; } - else if (0 == _tcsxcmp("-lt", argv[i])) + else if (0 == _tcsxicmp("-lt", argv[i])) { st_AuthConfig.st_XLog.nLogType = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-ll", argv[i])) - { - st_AuthConfig.st_XLog.nLogLeave = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-l", argv[i])) + else if (0 == _tcsxicmp("-l", argv[i])) { LPCXSTR lpszLogLevel = argv[++i]; - if (0 == _tcsxcmp("debug", lpszLogLevel)) + if (0 == _tcsxicmp("debug", lpszLogLevel)) { st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG; } - else if (0 == _tcsxcmp("detail", lpszLogLevel)) + else if (0 == _tcsxicmp("detail", lpszLogLevel)) { st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DETAIL; } - else if (0 == _tcsxcmp("info", lpszLogLevel)) + else if (0 == _tcsxicmp("info", lpszLogLevel)) { st_AuthConfig.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO; } -- Gitee From 3db69ac8a96b420dd974e1e587cb0af72ce90700 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 10 Jul 2025 14:42:43 +0800 Subject: [PATCH 14/34] update:read me --- README.en.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.en.md b/README.en.md index 1c4e905..ddca58a 100644 --- a/README.en.md +++ b/README.en.md @@ -64,7 +64,7 @@ Linux Exection:sudo ./XEngine_LINEnv.sh -i 3 Macos Exection:./XEngine_LINEnv.sh -i 3 #### sub module -Due to the dependent sub-modules, after you checkout the warehouse, execute the following command in the warehouse directory to pull the sub-modules +Due to the dependent sub-modules, after you checkout the resprepository, execute the following command in the resprepository directory to pull the sub-modules git submodule init git submodule update diff --git a/README.md b/README.md index 80882e3..407def2 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ macos执行:./XEngine_LINEnv.sh -i 3 由于依赖的子模块,在你checkout仓库后,在仓库目录下执行下面的命令拉取子模块 git submodule init git submodule update -如果github访问失败,你也可以clone该项目,在主目录下使用命令:git clone https://gitee.com/xengine/XEngine_OPenSource.git XEngine_Source/XEngine_Depend +如果github访问失败,你也可以clone该项目,在主目录下使用命令:git clone https://gitee.com/xengine/XEngine_OPenSource.git XEngine_Source/XEngine_DependLibrary #### Windows 使用VS打开并且编译,支持WINDOWS 7SP1以上系统 -- Gitee From 20d67a7c72842c348b539c7d86230f0c0062a763 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 12 Aug 2025 14:55:34 +0800 Subject: [PATCH 15/34] update:depend library --- XEngine_Source/XEngine_DependLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 2b47966..8d4fe15 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 2b4796680134656c5144b3665aac9ec65ea6292a +Subproject commit 8d4fe1580afe4c02f4a13a3fe21c6e77a22b18cd -- Gitee From da891360b77229f02bb9834024a35e32f4b74ab8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 14 Aug 2025 11:19:54 +0800 Subject: [PATCH 16/34] added:storage log support --- XEngine_Source/AuthorizeModule_Configure/Config_Define.h | 2 ++ .../ModuleConfigure_Json/ModuleConfigure_Json.cpp | 6 ++++-- .../XEngine_AuthorizeService/XEngine_AuthorizeService.cpp | 8 +++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index 7118d13..c81e230 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -103,10 +103,12 @@ typedef struct struct { XCHAR tszLogFile[XPATH_MAX]; //日志文件 + XCHAR tszKeyFile[XPATH_MAX]; int nMaxSize; //最大大小 int nMaxCount; //备份个数 int nLogLeave; //日志级别 int nLogType; //日志类型 + bool bLogStorage; //强日志 }st_XLog; struct { diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index b8f923a..9fbfc09 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -173,7 +173,7 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE _tcsxcpy(pSt_ServerConfig->st_XSql.st_MYSQL.tszSQLUser, st_JsonXSql["SQLUser"].asCString()); _tcsxcpy(pSt_ServerConfig->st_XSql.st_MYSQL.tszSQLPass, st_JsonXSql["SQLPass"].asCString()); //日志配置 - if (st_JsonRoot["XLog"].empty() || (5 != st_JsonRoot["XLog"].size())) + if (st_JsonRoot["XLog"].empty() || (7 != st_JsonRoot["XLog"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_AUTHORIZE_MODULE_CONFIGURE_XLOG; @@ -184,8 +184,10 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE pSt_ServerConfig->st_XLog.nMaxCount = st_JsonXLog["MaxCount"].asInt(); pSt_ServerConfig->st_XLog.nLogLeave = st_JsonXLog["LogLeave"].asInt(); pSt_ServerConfig->st_XLog.nLogType = st_JsonXLog["nLogType"].asInt(); + pSt_ServerConfig->st_XLog.bLogStorage = st_JsonXLog["bLogStorage"].asBool(); _tcsxcpy(pSt_ServerConfig->st_XLog.tszLogFile, st_JsonXLog["tszLogFile"].asCString()); - + _tcsxcpy(pSt_ServerConfig->st_XLog.tszKeyFile, st_JsonXLog["tszKeyFile"].asCString()); + if (st_JsonRoot["XReport"].empty() || (3 != st_JsonRoot["XReport"].size())) { Config_IsErrorOccur = true; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp index fb6b555..4b59046 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp @@ -48,6 +48,7 @@ void ServiceApp_Stop(int signo) ManagePool_Thread_NQDestroy(xhHttpPool); ManagePool_Memory_Destory(xhMemPool); + HelpComponents_XLog_StrongClose(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE); HelpComponents_XLog_Destroy(xhLog); Session_Authorize_Destroy(); Session_Token_Destroy(); @@ -163,7 +164,11 @@ int main(int argc, char** argv) } HelpComponents_XLog_SetLogPriority(xhLog, st_AuthConfig.st_XLog.nLogLeave); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化日志系统成功,日志文件:%s"), st_AuthConfig.st_XLog.tszLogFile); - + if (st_AuthConfig.st_XLog.bLogStorage) + { + HelpComponents_XLog_StrongOPen(xhLog, st_AuthConfig.st_XLog.tszKeyFile, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化关键日志存储功能成功...")); + } if (st_AuthConfig.bDeamon) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,使用守护进程启动服务...")); @@ -476,6 +481,7 @@ XENGINE_EXITAPP: ManagePool_Thread_NQDestroy(xhHttpPool); ManagePool_Memory_Destory(xhMemPool); + HelpComponents_XLog_StrongClose(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE); HelpComponents_XLog_Destroy(xhLog); Session_Authorize_Destroy(); Session_Token_Destroy(); -- Gitee From 1331ada8280afaac55a8e917084bf761ef7fe69c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 14 Aug 2025 11:31:15 +0800 Subject: [PATCH 17/34] added:storage log use to user pay --- .../AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp index df6bcd7..b3ca075 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp @@ -180,7 +180,7 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX { Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_NOTMATCH, "Serial number not available"); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户名:%s,充值失败,无法继续,错误:%X"), lpszClientAddr, st_UserPay.tszUserName, DBModule_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _X("HTTP客户端:%s,用户名:%s,充值失败,序列号:%s,无法继续,错误:%X"), lpszClientAddr, st_UserPay.tszUserName, st_UserPay.tszSerialNumber, DBModule_GetLastError()); return false; } if (0 == st_AuthConfig.st_XSql.nDBType) @@ -194,7 +194,7 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX Session_Authorize_SetUser(&st_UserInfo); Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,用户名:%s,充值成功,序列号:%s"), lpszClientAddr, st_UserPay.tszUserName, st_UserPay.tszSerialNumber); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _X("HTTP客户端:%s,用户名:%s,充值成功,序列号:%s"), lpszClientAddr, st_UserPay.tszUserName, st_UserPay.tszSerialNumber); } else if (0 == _tcsxnicmp(lpszAPIName, lpszAPIPass, _tcsxlen(lpszAPIName))) { -- Gitee From cf3c71673fb80c717e3aa99314c6e2836f42b907 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 14 Aug 2025 11:35:06 +0800 Subject: [PATCH 18/34] added:set color for key log --- .../XEngine_Config/XEngine_Config.json | 124 +++++++++--------- .../XEngine_AuthorizeService.cpp | 5 + 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 1982d09..7df9f80 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -1,77 +1,79 @@ { - "nTCPPort":5300, - "nWSPort":5301, - "nHTTPPort":5302, - "bDeamon":false, - "bTimeNotify":false, - "XMax":{ - "nMaxClient":10000, - "nMaxQueue":10000, - "nIOThread":2, - "nTCPThread":2, - "nWSThread":2, - "nHTTPThread":2 + "nTCPPort": 5300, + "nWSPort": 5301, + "nHTTPPort": 5302, + "bDeamon": false, + "bTimeNotify": false, + "XMax": { + "nMaxClient": 10000, + "nMaxQueue": 10000, + "nIOThread": 2, + "nTCPThread": 2, + "nWSThread": 2, + "nHTTPThread": 2 }, - "XTime":{ - "nHeartCheck":3, - "nTCPTime":5, - "nWSTime":5, - "nHTTPTime":5 + "XTime": { + "nHeartCheck": 3, + "nTCPTime": 5, + "nWSTime": 5, + "nHTTPTime": 5 }, - "XVerification":{ - "nTokenTimeout":3600, - "nDynamicTimeout":30, - "nVerTime":5, - "nVerMode":2, - "nTryTime":30, - "nTryMode":1, - "st_XCDKey":{ - "tszKeyFile":"./APPVer.key", - "tszKeyPass":"123123qa" + "XVerification": { + "nTokenTimeout": 3600, + "nDynamicTimeout": 30, + "nVerTime": 5, + "nVerMode": 2, + "nTryTime": 30, + "nTryMode": 1, + "st_XCDKey": { + "tszKeyFile": "./APPVer.key", + "tszKeyPass": "123123qa" }, - "st_XToken":{ - "bAutoRenewal":false, - "nRenewalTime":-1 - } + "st_XToken": { + "bAutoRenewal": false, + "nRenewalTime": -1 + } }, - "XLogin":{ - "bHTTPAuth":false, - "bPassAuth":false, - "nMultiMode":0, - "st_PassUrl":{ - "tszPassLogin":"http://127.0.0.1:5303/auth/pass/login", - "tszPassLogout":"http://127.0.0.1:5303/auth/pass/logout", - "tszPassTimeout":"http://127.0.0.1:5303/auth/pass/timeout" + "XLogin": { + "bHTTPAuth": false, + "bPassAuth": false, + "nMultiMode": 0, + "st_PassUrl": { + "tszPassLogin": "http://127.0.0.1:5303/auth/pass/login", + "tszPassLogout": "http://127.0.0.1:5303/auth/pass/logout", + "tszPassTimeout": "http://127.0.0.1:5303/auth/pass/timeout" }, - "st_MulitLogin":{ - "bSecond":true, - "bTime":true, - "bDay":true, - "bCustom":false + "st_MulitLogin": { + "bSecond": true, + "bTime": true, + "bDay": true, + "bCustom": false } }, - "XCrypto":{ - "bEnable":false, - "nPass":123123 + "XCrypto": { + "bEnable": false, + "nPass": 123123 }, - "XSql":{ - "nSQLType":0, + "XSql": { + "nSQLType": 0, "SQLAddr": "127.0.0.1", "SQLPort": 3306, "SQLUser": "root", "SQLPass": "123123", - "SQLFile":"./XEngine_DataBase/SQL_User.db" + "SQLFile": "./XEngine_DataBase/SQL_User.db" }, - "XLog":{ - "tszLogFile":"./XEngine_XLog/XEngine_Authorize.log", - "MaxSize":1024000, - "MaxCount":10, - "LogLeave":32, - "nLogType":17 + "XLog": { + "tszLogFile": "./XEngine_XLog/XEngine_Authorize.log", + "tszKeyFile": "./XEngine_XLog/Storage/Key.log", + "MaxSize": 1024000, + "MaxCount": 10, + "LogLeave": 32, + "nLogType": 17, + "bLogStorage": true }, - "XReport":{ - "bEnable":true, - "tszServiceName":"XEngine_Authorize", - "tszAPIUrl":"http://app.xyry.org:5501/api?function=machine" + "XReport": { + "bEnable": true, + "tszServiceName": "XEngine_Authorize", + "tszAPIUrl": "http://app.xyry.org:5501/api?function=machine" } -} +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp index 4b59046..87bb450 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp @@ -168,6 +168,11 @@ int main(int argc, char** argv) { HelpComponents_XLog_StrongOPen(xhLog, st_AuthConfig.st_XLog.tszKeyFile, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化关键日志存储功能成功...")); + + HELPCOMPONENTS_XLOG_COLOR st_XLogColor = {}; + st_XLogColor.wNotice = XENGINE_HELPCOMPONENTS_XLOG_TEXT_RED; + HelpComponents_XLog_SetLogColor(xhLog, &st_XLogColor); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化关键日志输出颜色成功...")); } if (st_AuthConfig.bDeamon) { -- Gitee From 8f017d05945eafd89dc4583ff808fb33211aee75 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 14 Aug 2025 11:37:58 +0800 Subject: [PATCH 19/34] fixed:build failed --- XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp | 4 ++-- XEngine_Apps/Authorize_APPClient/Authorize_APPClient.vcxproj | 4 ++-- XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.vcxproj | 4 ++-- .../Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.vcxproj | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp index 7849b2a..3a7ccd6 100644 --- a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp +++ b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp @@ -32,7 +32,7 @@ using namespace std; #include "../../XEngine_Source/XAuth_Protocol.h" //Windows::vs2022 x86 debug 编译即可 -//Linux::g++ -std=c++17 -Wall -g Authorize_APPClient.cpp -o Authorize_APPClient.exe -I ../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp -L ../../XEngine_Release -lXEngine_Cryption -lXClient_Socket -lXEngine_BaseLib -lXClient_APIHelp -lpthread -ljsoncpp -Wl,-rpath=../../XEngine_Release +//Linux::g++ -std=c++17 -Wall -g Authorize_APPClient.cpp -o Authorize_APPClient.exe -I ../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../../XEngine_Release -lXEngine_Cryption -lXClient_Socket -lXEngine_BaseLib -lXClient_APIHelp -lpthread -ljsoncpp -Wl,-rpath=../../XEngine_Release //#define _DYNAMIC_CODE #define _PASS_ENCRYPT @@ -47,7 +47,7 @@ int nDYCode = 0; XSOCKET m_Socket = 0; LPCXSTR lpszUser = _X("123123aa"); LPCXSTR lpszPass = _X("123123"); -LPCXSTR lpszSerial = _X("XAUTH-XYRYD-NONN5-FSM45-XBLAZ-23475-28MNL-VUTJD-32956-AKF24"); +LPCXSTR lpszSerial = _X("XAUTH-XYRYS-EWW60-UZO37-MHJAW-48386-Z806P"); LPCXSTR lpszEmail = _X("486179@qq.com"); __int64x nPhoneNumber = 1366666666; __int64x nIDNumber = 511025111111111111; diff --git a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.vcxproj b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.vcxproj index 9511b05..a1404cd 100644 --- a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.vcxproj +++ b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) @@ -80,7 +80,7 @@ true - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);../../XEngine_Source/Debug;$(LibraryPath) diff --git a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.vcxproj b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.vcxproj index 2fbd4f4..e9a4b82 100644 --- a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.vcxproj +++ b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.vcxproj @@ -71,11 +71,11 @@ - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);../../XEngine_Source/Debug;$(LibraryPath) - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);../../XEngine_Source/Debug;$(LibraryPath) diff --git a/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.vcxproj b/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.vcxproj index 95fcd56..fd661db 100644 --- a/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.vcxproj +++ b/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.vcxproj @@ -71,11 +71,11 @@ - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);../../XEngine_Source/Debug;$(LibraryPath) - $(XEngine_Include);../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);../../XEngine_Source/x64/Debug;$(LibraryPath) -- Gitee From b1724cef83efec85f5c70bcfac019ece7c573e00 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 14 Aug 2025 13:44:49 +0800 Subject: [PATCH 20/34] modify:adjust windows app list size --- .../Authorize_APPLocal/Authorize_APPLocal.cpp | 2 +- .../Authorize_CDKeyNetVer.cpp | 2 +- .../Authorize_Dialog/Dialog_Banned.cpp | 16 ++++++++-------- .../Authorize_Dialog/Dialog_Serial.cpp | 6 +++--- .../Authorize_Dialog/Dialog_Try.cpp | 2 +- .../Authorize_Dialog/Dialog_User.cpp | 12 ++++++------ 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp index 785c7b1..23fad03 100644 --- a/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp +++ b/XEngine_Apps/Authorize_APPLocal/Authorize_APPLocal.cpp @@ -33,7 +33,7 @@ //需要优先配置XEngine //WINDOWS支持VS2022 x86 debug 编译调试 -//g++ -std=c++17 -Wall -g Authorize_APPLocal.cpp -o Authorize_APPLocal.exe -I ../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp -L ../../XEngine_Release -lXEngine_BaseLib -lXEngine_Cryption -lXEngine_SystemApi -lAuthorizeModule_CDKey -ljsoncpp -Wl,-rpath=../../XEngine_Release +//g++ -std=c++17 -Wall -g Authorize_APPLocal.cpp -o Authorize_APPLocal.exe -I ../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../../XEngine_Release -lXEngine_BaseLib -lXEngine_Cryption -lXEngine_SystemApi -lAuthorizeModule_CDKey -ljsoncpp -Wl,-rpath=../../XEngine_Release XCHAR tszSerialStr[XPATH_MAX] = {}; //1.创建CDKEY.或者由管理员创建. diff --git a/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.cpp b/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.cpp index f3dc0b6..1bc0f65 100644 --- a/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.cpp +++ b/XEngine_Apps/Authorize_CDKeyNetVer/Authorize_CDKeyNetVer.cpp @@ -35,7 +35,7 @@ //需要优先配置XEngine //WINDOWS支持VS2022 x64 debug 编译调试 -//g++ -std=c++17 -Wall -g Authorize_CDKeyNetVer.cpp -o Authorize_CDKeyNetVer.exe -I ../../XEngine_Source/XEngine_Depend/XEngine_Module/jsoncpp -lXEngine_BaseLib -L ../../XEngine_Release -lXEngine_Cryption -lXClient_APIHelp -lXEngine_SystemConfig -lAuthorizeModule_CDKey -ljsoncpp -Wl,-rpath=../../XEngine_Release +//g++ -std=c++17 -Wall -g Authorize_CDKeyNetVer.cpp -o Authorize_CDKeyNetVer.exe -I ../../XEngine_Source/XEngine_DependLibrary/XEngine_Module/jsoncpp -lXEngine_BaseLib -L ../../XEngine_Release -lXEngine_Cryption -lXClient_APIHelp -lXEngine_SystemConfig -lAuthorizeModule_CDKey -ljsoncpp -Wl,-rpath=../../XEngine_Release //#define XENGINE_AUTHORIZE_CDKEY_CRYPTO diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp index 66241e6..9c1b379 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Banned.cpp @@ -78,17 +78,17 @@ BOOL CDialog_Banned::OnInitDialog() m_RadioUser.SetCheck(BST_CHECKED); m_ListAddr.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 80); - m_ListAddr.InsertColumn(1, _T("是否启用"), LVCFMT_LEFT, 60); - m_ListAddr.InsertColumn(2, _T("IP地址"), LVCFMT_LEFT, 120); - m_ListAddr.InsertColumn(3, _T("过期日期"), LVCFMT_LEFT, 120); - m_ListAddr.InsertColumn(4, _T("创建日期"), LVCFMT_LEFT, 120); + m_ListAddr.InsertColumn(1, _T("是否启用"), LVCFMT_LEFT, 80); + m_ListAddr.InsertColumn(2, _T("IP地址"), LVCFMT_LEFT, 250); + m_ListAddr.InsertColumn(3, _T("过期日期"), LVCFMT_LEFT, 250); + m_ListAddr.InsertColumn(4, _T("创建日期"), LVCFMT_LEFT, 250); m_ListAddr.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_ListUser.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 80); - m_ListUser.InsertColumn(1, _T("是否启用"), LVCFMT_LEFT, 60); - m_ListUser.InsertColumn(2, _T("用户名"), LVCFMT_LEFT, 120); - m_ListUser.InsertColumn(3, _T("过期日期"), LVCFMT_LEFT, 120); - m_ListUser.InsertColumn(4, _T("创建日期"), LVCFMT_LEFT, 120); + m_ListUser.InsertColumn(1, _T("是否启用"), LVCFMT_LEFT, 80); + m_ListUser.InsertColumn(2, _T("用户名"), LVCFMT_LEFT, 250); + m_ListUser.InsertColumn(3, _T("过期日期"), LVCFMT_LEFT, 250); + m_ListUser.InsertColumn(4, _T("创建日期"), LVCFMT_LEFT, 250); m_ListUser.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_EditPosStart.SetWindowText(_T("0")); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp index a078527..d415116 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp @@ -53,11 +53,11 @@ BOOL CDialog_Serial::OnInitDialog() // TODO: 在此添加额外的初始化 m_ListSerial.InsertColumn(0, _T("使用者"), LVCFMT_LEFT, 80); - m_ListSerial.InsertColumn(1, _T("序列号"), LVCFMT_LEFT, 180); + m_ListSerial.InsertColumn(1, _T("序列号"), LVCFMT_LEFT, 450); m_ListSerial.InsertColumn(2, _T("时间/次数"), LVCFMT_LEFT, 90); m_ListSerial.InsertColumn(3, _T("卡类型"), LVCFMT_LEFT, 80); - m_ListSerial.InsertColumn(4, _T("是否使用"), LVCFMT_LEFT, 60); - m_ListSerial.InsertColumn(5, _T("创建日期"), LVCFMT_LEFT, 120); + m_ListSerial.InsertColumn(4, _T("是否使用"), LVCFMT_LEFT, 80); + m_ListSerial.InsertColumn(5, _T("创建日期"), LVCFMT_LEFT, 180); m_ListSerial.SetExtendedStyle(LVS_EX_FULLROWSELECT); for (int i = 0; i < 5; i++) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp index 01338a1..7ae7440 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Try.cpp @@ -53,7 +53,7 @@ BOOL CDialog_Try::OnInitDialog() m_ListTry.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 40); m_ListTry.InsertColumn(1, _T("序列号"), LVCFMT_LEFT, 120); m_ListTry.InsertColumn(2, _T("试用类型"), LVCFMT_LEFT, 100); - m_ListTry.InsertColumn(3, _T("试用时间"), LVCFMT_LEFT, 70); + m_ListTry.InsertColumn(3, _T("试用时间"), LVCFMT_LEFT, 100); m_ListTry.InsertColumn(4, _T("剩余时间"), LVCFMT_LEFT, 100); m_ListTry.InsertColumn(5, _T("创建时间"), LVCFMT_LEFT, 120); m_ListTry.SetExtendedStyle(LVS_EX_FULLROWSELECT); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp index adb0552..50c9c29 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_User.cpp @@ -54,14 +54,14 @@ BOOL CDialog_User::OnInitDialog() // TODO: 在此添加额外的初始化 m_ListCtrlClient.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 40); - m_ListCtrlClient.InsertColumn(1, _T("用户名"), LVCFMT_LEFT, 85); + m_ListCtrlClient.InsertColumn(1, _T("用户名"), LVCFMT_LEFT, 120); m_ListCtrlClient.InsertColumn(2, _T("IP地址"), LVCFMT_LEFT, 100); - m_ListCtrlClient.InsertColumn(3, _T("级别"), LVCFMT_LEFT, 70); - m_ListCtrlClient.InsertColumn(4, _T("在线时间(秒钟)"), LVCFMT_LEFT, 100); - m_ListCtrlClient.InsertColumn(5, _T("剩余时间/过期时间"), LVCFMT_LEFT, 120); + m_ListCtrlClient.InsertColumn(3, _T("级别"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(4, _T("在线时间(秒钟)"), LVCFMT_LEFT, 150); + m_ListCtrlClient.InsertColumn(5, _T("剩余时间/过期时间"), LVCFMT_LEFT, 150); m_ListCtrlClient.InsertColumn(6, _T("充值类型"), LVCFMT_LEFT, 80); - m_ListCtrlClient.InsertColumn(7, _T("设备类型"), LVCFMT_LEFT, 60); - m_ListCtrlClient.InsertColumn(8, _T("是否在线"), LVCFMT_LEFT, 60); + m_ListCtrlClient.InsertColumn(7, _T("设备类型"), LVCFMT_LEFT, 80); + m_ListCtrlClient.InsertColumn(8, _T("是否在线"), LVCFMT_LEFT, 80); m_ListCtrlClient.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_EditFlushTime.SetWindowText(_T("10")); -- Gitee From 49e1617f4ceb6be26d0684bfefba2cf46c424b29 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 15 Aug 2025 11:38:35 +0800 Subject: [PATCH 21/34] added:hardware code bind with login and register --- .../AuthClient_Connector.cpp | 6 ++--- .../AuthorizeModule_Configure/Config_Define.h | 1 + .../ModuleConfigure_Json.cpp | 1 + .../Protocol_Define.h | 4 +-- .../Protocol_Packet/Protocol_Packet.cpp | 3 ++- .../Protocol_Packet/Protocol_Packet.h | 2 +- .../Protocol_Parse/Protocol_Parse.cpp | 6 ++++- .../Protocol_Parse/Protocol_Parse.h | 2 +- .../AuthorizeModule_Protocol/pch.cpp | 4 +-- XEngine_Source/XAuth_Protocol.h | 6 ++++- .../AuthorizeHTTP_Post/AuthorizeHTTP_Pass.cpp | 4 +-- .../AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp | 16 +++++++++--- .../Authorize_TCPTask.cpp | 25 ++++++++++++++++--- .../Authorize_WSTask.cpp | 6 ++--- 14 files changed, 62 insertions(+), 24 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp index 0eaf425..d88a85b 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp @@ -163,12 +163,12 @@ bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR #if (1 == _XAUTH_BUILD_SWITCH_CLIENT_TCP) XCHAR tszMsgBuffer[2048] = {}; XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - XENGINE_PROTOCOL_USERAUTH st_AuthUser = {}; + AUTHORIZE_PROTOCOL_USERAUTHEX st_AuthUser = {}; //协议头 st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_AUTH; st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQLOGIN; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_USERAUTH); + st_ProtocolHdr.unPacketSize = sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX); st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; #ifdef _MSC_BUILD @@ -216,7 +216,7 @@ bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_AuthUser, st_ProtocolHdr.unPacketSize); - nMsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_USERAUTH); + nMsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX); } //发送数据 if (!XClient_TCPSelect_SendMsg(m_hSocket, tszMsgBuffer, nMsgLen)) diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index c81e230..8814727 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -138,6 +138,7 @@ typedef struct bool bSwitchBanned; //黑名单 bool bSwitchTokenLogin; //TOKEN开关 bool bSwitchHCLogin; //硬件码登录 + bool bSwitchHWBind; //硬件码绑定 }XENGINE_FUNCTIONSWITCH; ////////////////////////////////////////////////////////////////////////// // 导出的函数 diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 9fbfc09..28f0e74 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -353,5 +353,6 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_Switch(LPCXSTR lpszConfigFile, pSt_ServerConfig->bSwitchBanned = st_JsonRoot["bSwitchBanned"].asBool(); pSt_ServerConfig->bSwitchTokenLogin = st_JsonRoot["bSwitchTokenLogin"].asBool(); pSt_ServerConfig->bSwitchHCLogin = st_JsonRoot["bSwitchHCLogin"].asBool(); + pSt_ServerConfig->bSwitchHWBind = st_JsonRoot["bSwitchHWBind"].asBool(); return true; } \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h index 1297585..bae3758 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h @@ -98,7 +98,7 @@ extern "C" bool Protocol_Packet_HttpComm(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, 意思:是否成功 备注: *********************************************************************/ -extern "C" bool Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_PROTOCOL_USERAUTH* pSt_UserAuth); +extern "C" bool Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth); /******************************************************************** 函数名称:Protocol_Packet_UserTime 函数功能:用户时间打包函数 @@ -473,7 +473,7 @@ extern "C" bool Protocol_Parse_HttpParseToken(LPCXSTR lpszMsgBuffer, int nMsgLen 意思:是否成功 备注: *********************************************************************/ -extern "C" bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERAUTH * pSt_UserAuth); +extern "C" bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth); /******************************************************************** 函数名称:Protocol_Parse_HttpParseUser 函数功能:解析用户信息 diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index 9e67289..b592c8b 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -159,7 +159,7 @@ bool CProtocol_Packet::Protocol_Packet_HttpComm(XCHAR* ptszMsgBuffer, int* pInt_ 意思:是否成功 备注: *********************************************************************/ -bool CProtocol_Packet::Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_PROTOCOL_USERAUTH* pSt_UserAuth) +bool CProtocol_Packet::Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth) { Protocol_IsErrorOccur = false; @@ -174,6 +174,7 @@ bool CProtocol_Packet::Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* p st_JsonUser["tszUserName"] = pSt_UserAuth->tszUserName; st_JsonUser["tszUserPass"] = pSt_UserAuth->tszUserPass; + st_JsonUser["tszHWCode"] = pSt_UserAuth->tszHWCode; st_JsonUser["enDeviceType"] = pSt_UserAuth->enDeviceType; st_JsonUser["enClientType"] = pSt_UserAuth->enClientType; diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h index d2caf40..229c446 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.h @@ -20,7 +20,7 @@ public: bool Protocol_Packet_HDRComm(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, int enDeviceType); public: bool Protocol_Packet_HttpComm(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode = 0, LPCXSTR lpszMsgBuffer = NULL); - bool Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_PROTOCOL_USERAUTH* pSt_UserAuth); + bool Protocol_Packet_HttpUserPass(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth); bool Protocol_Packet_UserTime(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHSESSION_NETCLIENT*** pppSt_ListClient, int nListCount); bool Protocol_Packet_HttpUserTime(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_PROTOCOL_TIME* pSt_ProtocolTime); bool Protocol_Packet_HttpClientInfo(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, AUTHREG_USERTABLE* pSt_UserTable); diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp index 50cad0f..8d000c6 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp @@ -154,7 +154,7 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseToken(LPCXSTR lpszMsgBuffer, int n 意思:是否成功 备注: *********************************************************************/ -bool CProtocol_Parse::Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERAUTH* pSt_UserAuth) +bool CProtocol_Parse::Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth) { Protocol_IsErrorOccur = false; @@ -197,6 +197,10 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nM { pSt_UserAuth->enDeviceType = (ENUM_PROTOCOLDEVICE_TYPE)st_JsonProtocol["enDeviceType"].asInt(); } + if (!st_JsonProtocol["tszHWCode"].isNull()) + { + _tcsxcpy(pSt_UserAuth->tszHWCode, st_JsonProtocol["tszHWCode"].asCString()); + } return true; } /******************************************************************** diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h index e8a69b0..19de9e3 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h @@ -20,7 +20,7 @@ public: bool Protocol_Parse_WSHdr(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr); public: bool Protocol_Parse_HttpParseToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); - bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERAUTH* pSt_UserAuth); + bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth); bool Protocol_Parse_HttpParseUser(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); bool Protocol_Parse_HttpParsePay(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_PROTOCOL_USERPAY* pSt_UserPay); bool Protocol_Parse_HttpParseTry(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_TEMPVER* pSt_NETTry); diff --git a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp index 0b46821..1005b4b 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp @@ -39,7 +39,7 @@ extern "C" bool Protocol_Packet_HttpComm(XCHAR * ptszMsgBuffer, int* pInt_MsgLen { return m_ProtocolPacket.Protocol_Packet_HttpComm(ptszMsgBuffer, pInt_MsgLen, nCode, lpszMsgBuffer); } -extern "C" bool Protocol_Packet_HttpUserPass(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_PROTOCOL_USERAUTH * pSt_UserAuth) +extern "C" bool Protocol_Packet_HttpUserPass(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth) { return m_ProtocolPacket.Protocol_Packet_HttpUserPass(ptszMsgBuffer, pInt_MsgLen, pSt_UserAuth); } @@ -94,7 +94,7 @@ extern "C" bool Protocol_Parse_HttpParseToken(LPCXSTR lpszMsgBuffer, int nMsgLen { return m_ProtocolParse.Protocol_Parse_HttpParseToken(lpszMsgBuffer, nMsgLen, pxhToken); } -extern "C" bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERAUTH * pSt_UserAuth) +extern "C" bool Protocol_Parse_HttpParseAuth(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHORIZE_PROTOCOL_USERAUTHEX* pSt_UserAuth) { return m_ProtocolParse.Protocol_Parse_HttpParseAuth(lpszMsgBuffer, nMsgLen, pSt_UserAuth); } diff --git a/XEngine_Source/XAuth_Protocol.h b/XEngine_Source/XAuth_Protocol.h index 4f08e92..8f7cbc0 100644 --- a/XEngine_Source/XAuth_Protocol.h +++ b/XEngine_Source/XAuth_Protocol.h @@ -224,4 +224,8 @@ typedef struct XCHAR tszContext[4096]; //信息 XCHAR tszCreateTime[64]; //创建时间 __int64x nID; //ID -}AUTHREG_ANNOUNCEMENT, * LPAUTHREG_ANNOUNCEMENT; \ No newline at end of file +}AUTHREG_ANNOUNCEMENT, * LPAUTHREG_ANNOUNCEMENT; +//扩展登录协议 +struct AUTHORIZE_PROTOCOL_USERAUTHEX : public XENGINE_PROTOCOL_USERAUTH { + XCHAR tszHWCode[64]; +}; \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Pass.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Pass.cpp index 5a24347..244dcf8 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Pass.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Pass.cpp @@ -12,10 +12,10 @@ bool XEngine_AuthorizeHTTP_Pass(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, LPC if (0 == _tcsxnicmp(lpszAPIName, lpszAPILogin, _tcsxlen(lpszAPIName))) { - XENGINE_PROTOCOL_USERAUTH st_UserAuth; + AUTHORIZE_PROTOCOL_USERAUTHEX st_UserAuth; AUTHREG_USERTABLE st_UserTable; - memset(&st_UserAuth, '\0', sizeof(XENGINE_PROTOCOL_USERAUTH)); + memset(&st_UserAuth, '\0', sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX)); memset(&st_UserTable, '\0', sizeof(AUTHREG_USERTABLE)); Protocol_Parse_HttpParseAuth(lpszMsgBuffer, nMsgLen, &st_UserAuth); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp index b3ca075..7acaa31 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp @@ -117,9 +117,9 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX //禁止权限0和1注册 if (st_UserTable.st_UserInfo.nUserLevel < 10) { - Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_PERMISSION, "user and pass does not set"); + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_PERMISSION, "user permission level incorrect"); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,注册失败,没有设置用户和密码"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,注册失败,配置的用户权限错误"), lpszClientAddr); return false; } //默认普通用户 @@ -131,6 +131,16 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,注册失败,没有设置用户和密码"), lpszClientAddr); return false; } + if (st_FunSwitch.bSwitchHWBind) + { + if (_tcsxlen(st_UserTable.tszHardCode) <= 0) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_REQUEST, "not set hardware code"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,注册失败,启用硬件绑定没有配置硬件吗"), lpszClientAddr); + return false; + } + } bSuccess = false; if (0 == st_AuthConfig.st_XSql.nDBType) { @@ -254,7 +264,7 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX return false; } - XENGINE_PROTOCOL_USERAUTH st_AuthProtocol = {}; + AUTHORIZE_PROTOCOL_USERAUTHEX st_AuthProtocol = {}; _tcsxcpy(st_AuthProtocol.tszUserName, st_UserTable.st_UserInfo.tszUserName); _tcsxcpy(st_AuthProtocol.tszUserPass, st_UserTable.st_UserInfo.tszUserPass); Protocol_Packet_HttpUserPass(tszSDBuffer, &nSDLen, &st_AuthProtocol); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp index 9714b5f..3ddbfd2 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_TCPTask.cpp @@ -73,12 +73,18 @@ bool XEngine_Client_TCPTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQLOGIN == pSt_ProtocolHdr->unOperatorCode) { AUTHREG_USERTABLE st_UserTable; - XENGINE_PROTOCOL_USERAUTH st_AuthProtocol; + AUTHORIZE_PROTOCOL_USERAUTHEX st_AuthProtocol; memset(&st_UserTable, '\0', sizeof(AUTHREG_USERTABLE)); - memset(&st_AuthProtocol, '\0', sizeof(XENGINE_PROTOCOL_USERAUTH)); - memcpy(&st_AuthProtocol, lpszMsgBuffer, sizeof(XENGINE_PROTOCOL_USERAUTH)); - + memset(&st_AuthProtocol, '\0', sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX)); + if (nMsgLen == sizeof(XENGINE_PROTOCOL_USERAUTH)) + { + memcpy(&st_AuthProtocol, lpszMsgBuffer, sizeof(XENGINE_PROTOCOL_USERAUTH)); + } + else + { + memcpy(&st_AuthProtocol, lpszMsgBuffer, sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX)); + } _tcsxcpy(st_Banned.tszIPAddr, lpszClientAddr); _tcsxcpy(st_Banned.tszUserName, st_AuthProtocol.tszUserName); APIAddr_IPAddr_SegAddr(st_Banned.tszIPAddr); @@ -183,6 +189,17 @@ bool XEngine_Client_TCPTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int n XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("客户端:%s,用户名:%s,登录失败,密码错误"), lpszClientAddr, st_AuthProtocol.tszUserName); return false; } + if (st_FunSwitch.bSwitchHWBind) + { + if (0 != _tcsxnicmp(st_UserTable.tszHardCode, st_AuthProtocol.tszHWCode, _tcsxlen(st_UserTable.tszHardCode))) + { + pSt_ProtocolHdr->wReserve = ERROR_AUTHORIZE_PROTOCOL_HARDCODE; + Protocol_Packet_HDRComm(tszSDBuffer, &nSDLen, pSt_ProtocolHdr, nNetType); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("客户端:%s,用户名:%s,硬件码:%s 错误"), lpszClientAddr, st_AuthProtocol.tszUserName, st_AuthProtocol.tszHWCode); + return false; + } + } } else { diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp index 80494e8..e1f7caf 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_WSTask.cpp @@ -76,11 +76,11 @@ bool XEngine_Client_WSTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nM if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQLOGIN == st_ProtocolHdr.unOperatorCode) { - XENGINE_PROTOCOL_USERAUTH st_UserAuth; - memset(&st_UserAuth, '\0', sizeof(XENGINE_PROTOCOL_USERAUTH)); + AUTHORIZE_PROTOCOL_USERAUTHEX st_UserAuth; + memset(&st_UserAuth, '\0', sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX)); Protocol_Parse_HttpParseAuth(lpszMsgBuffer, nMsgLen, &st_UserAuth); - XEngine_Client_TCPTask(lpszClientAddr, (LPCXSTR)&st_UserAuth, sizeof(XENGINE_PROTOCOL_USERAUTH), &st_ProtocolHdr, XENGINE_AUTH_APP_NETTYPE_WS); + XEngine_Client_TCPTask(lpszClientAddr, (LPCXSTR)&st_UserAuth, sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX), &st_ProtocolHdr, XENGINE_AUTH_APP_NETTYPE_WS); } if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_HB_SYN == st_ProtocolHdr.unOperatorCode) { -- Gitee From 073fa744646477ce3a83fa02abfd9c7df28fea2b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 15 Aug 2025 13:35:04 +0800 Subject: [PATCH 22/34] added:hardware bind switch app support --- .../Protocol_Packet/Protocol_Packet.cpp | 1 + .../Protocol_Parse/Protocol_Parse.cpp | 1 + .../Authorize_Dialog/Dialog_Switch.cpp | 20 ++++++++++++++++++ .../Authorize_Dialog/Dialog_Switch.h | 2 ++ .../XEngineAuthorizeApp.rc | Bin 49166 -> 49618 bytes .../XEngine_AuthorizeApp/resource.h | 2 ++ .../AuthorizeHTTP_Switch.cpp | 4 ++-- .../XEngine_AuthorizeService.cpp | 2 +- 8 files changed, 29 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index b592c8b..b5ad71c 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -665,6 +665,7 @@ bool CProtocol_Packet::Protocol_Packet_HttpSwitch(XCHAR* ptszMsgBuffer, int* pIn st_JsonRoot["bSwitchBanned"] = pSt_FunSwitch->bSwitchBanned; st_JsonRoot["bSwitchTokenLogin"] = pSt_FunSwitch->bSwitchTokenLogin; st_JsonRoot["bSwitchHCLogin"] = pSt_FunSwitch->bSwitchHCLogin; + st_JsonRoot["bSwitchHWBind"] = pSt_FunSwitch->bSwitchHWBind; *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp index 8d000c6..a0032ed 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp @@ -851,6 +851,7 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseSwitch(LPCXSTR lpszMsgBuffer, int pSt_FunSwitch->bSwitchBanned = st_JsonObject["bSwitchBanned"].asBool(); pSt_FunSwitch->bSwitchTokenLogin = st_JsonObject["bSwitchTokenLogin"].asBool(); pSt_FunSwitch->bSwitchHCLogin = st_JsonObject["bSwitchHCLogin"].asBool(); + pSt_FunSwitch->bSwitchHWBind = st_JsonObject["bSwitchHWBind"].asBool(); return true; } /******************************************************************** diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp index ebc26f6..92b4234 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.cpp @@ -52,6 +52,8 @@ void CDialog_Switch::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_RADIO24, m_RadioTokenClose); DDX_Control(pDX, IDC_RADIO25, m_RadioHCLoginOPen); DDX_Control(pDX, IDC_RADIO26, m_RadioHCLoginClose); + DDX_Control(pDX, IDC_RADIO27, m_RadioHWBindOPen); + DDX_Control(pDX, IDC_RADIO28, m_RadioHWBindClose); } @@ -269,6 +271,16 @@ void CDialog_Switch::OnBnClickedButton1() m_RadioHCLoginOPen.SetCheck(BST_UNCHECKED); m_RadioHCLoginClose.SetCheck(BST_CHECKED); } + if (st_JsonRoot["bSwitchHWBind"].asBool()) + { + m_RadioHWBindOPen.SetCheck(BST_CHECKED); + m_RadioHWBindClose.SetCheck(BST_UNCHECKED); + } + else + { + m_RadioHWBindOPen.SetCheck(BST_UNCHECKED); + m_RadioHWBindClose.SetCheck(BST_CHECKED); + } m_BtnSetConfigure.EnableWindow(true); } else @@ -411,6 +423,14 @@ void CDialog_Switch::OnBnClickedButton2() { st_JsonObject["bSwitchHCLogin"] = false; } + if (BST_CHECKED == m_RadioHWBindOPen.GetCheck()) + { + st_JsonObject["bSwitchHWBind"] = true; + } + else + { + st_JsonObject["bSwitchHWBind"] = false; + } st_JsonRoot["st_SwitchInfo"] = st_JsonObject; st_JsonRoot["xhToken"] = _ttoll(m_StrToken.GetBuffer()); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.h index 4663823..57d7d62 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Switch.h @@ -53,4 +53,6 @@ public: CButton m_RadioTokenClose; CButton m_RadioHCLoginOPen; CButton m_RadioHCLoginClose; + CButton m_RadioHWBindOPen; + CButton m_RadioHWBindClose; }; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngineAuthorizeApp.rc b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngineAuthorizeApp.rc index 94012f1fd42f838aed991632b0db167d8039c57d..b44301a80451811595979af54478e4de9ab7c373 100644 GIT binary patch delta 106 zcmeBcV7}DMydlP&(R6dH`*exP1wLAnC%Ce)T&$ZFJy|bOjn$CBkimHJ{m@WGqsbTj zLb;6@Oc`{5Vnz&>lP`KoPELronY<{%X7ZdU4t}sGP}YdS1f*s%<2LQdQtNp(t0cUN F2LK;xAUFU3 delta 21 ccmccA%-q+&ydlP&(QI?9`*exTI})W509^wJKmY&$ diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/resource.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/resource.h index b3be7d6..2968d3f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/resource.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/resource.h @@ -96,6 +96,8 @@ #define IDC_RADIO24 1038 #define IDC_RADIO25 1039 #define IDC_RADIO26 1040 +#define IDC_RADIO27 1041 +#define IDC_RADIO28 1042 // Next default values for new objects // diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Switch.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Switch.cpp index d9eceda..8303c7c 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Switch.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Switch.cpp @@ -13,14 +13,14 @@ bool XEngine_AuthorizeHTTP_Switch(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, L { Protocol_Packet_HttpSwitch(tszSDBuffer, &nSDLen, &st_FunSwitch); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求获取功能开关成功,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,多端登录:%d,临时试用:%d,普通Token:%d,硬件码登录:%d"), lpszClientAddr, st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求获取功能开关成功,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,多端登录:%d,临时试用:%d,普通Token:%d,硬件码登录:%d,硬件码绑定:%d"), lpszClientAddr, st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin, st_FunSwitch.bSwitchHWBind); } else if (0 == _tcsxnicmp(lpszAPISet, lpszAPIName, _tcsxlen(lpszAPISet))) { Protocol_Parse_HttpParseSwitch(lpszMsgBuffer, nMsgLen, &st_FunSwitch); Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen); XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求设置功能开关成功,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,多端登录:%d,临时试用:%d,普通Token:%d,硬件码登录:%d"), lpszClientAddr, st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求设置功能开关成功,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,多端登录:%d,临时试用:%d,普通Token:%d,硬件码登录:%d,硬件码绑定:%d"), lpszClientAddr, st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin, st_FunSwitch.bSwitchHWBind); } return true; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp index 87bb450..6f4c645 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/XEngine_AuthorizeService.cpp @@ -442,7 +442,7 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); } #endif - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,功能开关选项,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,动态验证:%d,多端登录:%d,临时试用:%d,黑名单功能:%d,普通TOKEN:%d,硬件码登录:%d"), st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchDCode, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchBanned, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,功能开关选项,删除功能:%d,登录功能:%d,找回密码:%d,充值功能:%d,注册功能:%d,CDKey功能:%d,公告系统:%d,动态验证:%d,多端登录:%d,临时试用:%d,黑名单功能:%d,普通TOKEN:%d,硬件码登录:%d,硬件码绑定:%d"), st_FunSwitch.bSwitchDelete, st_FunSwitch.bSwitchLogin, st_FunSwitch.bSwitchPass, st_FunSwitch.bSwitchPay, st_FunSwitch.bSwitchRegister, st_FunSwitch.bSwitchCDKey, st_FunSwitch.bSwitchNotice, st_FunSwitch.bSwitchDCode, st_FunSwitch.bSwitchMulti, st_FunSwitch.bSwitchTry, st_FunSwitch.bSwitchBanned, st_FunSwitch.bSwitchTokenLogin, st_FunSwitch.bSwitchHCLogin, st_FunSwitch.bSwitchHWBind); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,网络验证服务运行中,XEngien版本:%s%s,发行版本次数:%d,当前运行版本:%s。。。"), BaseLib_Version_XNumberStr(), BaseLib_Version_XTypeStr(), st_AuthConfig.st_XVer.pStl_ListVer->size(), st_AuthConfig.st_XVer.pStl_ListVer->front().c_str()); while (true) -- Gitee From 45f803c4eb1d3715e408da62266c313a66ac6945 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 15 Aug 2025 13:49:22 +0800 Subject: [PATCH 23/34] added:hardware bind login support for client module --- .../Authorize_APPClient.cpp | 12 ++++---- .../XEngine_Config/XEngine_SwitchConfig.json | 29 ++++++++++--------- XEngine_Release/XEngine_XLog/Storage/keepfile | 0 .../AuthClient_Connector.cpp | 19 ++++++++---- .../AuthClient_Connector.h | 2 +- .../AuthClient_Define.h | 13 ++++++--- XEngine_Source/AuthorizeModule_Client/pch.cpp | 4 +-- 7 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 XEngine_Release/XEngine_XLog/Storage/keepfile diff --git a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp index 3a7ccd6..c8132b3 100644 --- a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp +++ b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp @@ -47,6 +47,7 @@ int nDYCode = 0; XSOCKET m_Socket = 0; LPCXSTR lpszUser = _X("123123aa"); LPCXSTR lpszPass = _X("123123"); +LPCXSTR lpszHWCode = _X("2FDWAD02JD2091"); LPCXSTR lpszSerial = _X("XAUTH-XYRYS-EWW60-UZO37-MHJAW-48386-Z806P"); LPCXSTR lpszEmail = _X("486179@qq.com"); __int64x nPhoneNumber = 1366666666; @@ -145,7 +146,7 @@ int AuthClient_Register() st_JsonUserInfo["nIDNumber"] = (Json::Value::Int64)nIDNumber; st_JsonUserInfo["nUserLevel"] = ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_USER; - st_JsonUserTable["tszHardCode"] = "2FDWAD02JD2091"; + st_JsonUserTable["tszHardCode"] = lpszHWCode; st_JsonUserTable["st_UserInfo"] = st_JsonUserInfo; st_JsonRoot["st_UserTable"] = st_JsonUserTable; @@ -257,21 +258,22 @@ int AuthClient_Login() { XCHAR tszMsgBuffer[2048]; XENGINE_PROTOCOLHDR st_ProtocolHdr; //协议头 - XENGINE_PROTOCOL_USERAUTH st_AuthUser; + AUTHORIZE_PROTOCOL_USERAUTHEX st_AuthUser; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_AuthUser, '\0', sizeof(XENGINE_PROTOCOL_USERAUTH)); + memset(&st_AuthUser, '\0', sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX)); st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_AUTH; st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQLOGIN; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_USERAUTH); + st_ProtocolHdr.unPacketSize = sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX); st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; st_AuthUser.enDeviceType = ENUM_PROTOCOL_FOR_DEVICE_TYPE_PC_WINDOWS; strcpy(st_AuthUser.tszUserName, lpszUser); strcpy(st_AuthUser.tszUserPass, lpszPass); + strcpy(st_AuthUser.tszHWCode, lpszHWCode); #ifdef _PASS_ENCRYPT int nPLen = _tcsxlen(st_AuthUser.tszUserPass); @@ -306,7 +308,7 @@ int AuthClient_Login() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_AuthUser, st_ProtocolHdr.unPacketSize); - nMsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_USERAUTH); + nMsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(AUTHORIZE_PROTOCOL_USERAUTHEX); } if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nMsgLen)) diff --git a/XEngine_Release/XEngine_Config/XEngine_SwitchConfig.json b/XEngine_Release/XEngine_Config/XEngine_SwitchConfig.json index fd16601..241776a 100644 --- a/XEngine_Release/XEngine_Config/XEngine_SwitchConfig.json +++ b/XEngine_Release/XEngine_Config/XEngine_SwitchConfig.json @@ -1,16 +1,17 @@ { - "bSwitchDelete":true, - "bSwitchRegister":true, - "bSwitchLogin":true, - "bSwitchPay":true, - "bSwitchPass":true, - "bSwitchTime":true, - "bSwitchCDKey":true, - "bSwitchNotice":true, - "bSwitchDCode":false, - "bSwitchMulti":true, - "bSwitchTry":true, - "bSwitchBanned":true, - "bSwitchTokenLogin":true, - "bSwitchHCLogin":true + "bSwitchDelete": true, + "bSwitchRegister": true, + "bSwitchLogin": true, + "bSwitchPay": true, + "bSwitchPass": true, + "bSwitchTime": true, + "bSwitchCDKey": true, + "bSwitchNotice": true, + "bSwitchDCode": false, + "bSwitchMulti": true, + "bSwitchTry": true, + "bSwitchBanned": true, + "bSwitchTokenLogin": true, + "bSwitchHCLogin": true, + "bSwitchHWBind": false } \ No newline at end of file diff --git a/XEngine_Release/XEngine_XLog/Storage/keepfile b/XEngine_Release/XEngine_XLog/Storage/keepfile new file mode 100644 index 0000000..e69de29 diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp index d88a85b..e0e957a 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.cpp @@ -130,17 +130,22 @@ bool CAuthClient_Connector::AuthClient_Connector_GetAuth(bool* pbAuth /* = NULL 类型:常量字符指针 可空:N 意思:输入密码 - 参数.三:nDYCode + 参数.三:lpszHWCode + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入硬件码,如果服务器开启了硬件绑定 + 参数.四:nDYCode In/Out:In 类型:整数型 可空:Y 意思:输入动态码 - 参数.四:xhToken + 参数.五:xhToken In/Out:In 类型:句柄型 可空:Y 意思:输入动态码绑定的句柄 - 参数.五:dwCryption + 参数.六:dwCryption In/Out:In 类型:整数型 可空:Y @@ -150,7 +155,7 @@ bool CAuthClient_Connector::AuthClient_Connector_GetAuth(bool* pbAuth /* = NULL 意思:是否成功 备注: *********************************************************************/ -bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, XSHOT nDYCode /* = 0 */, XNETHANDLE xhToken /* = 0 */, XLONG dwCryption /* = 0 */) +bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszHWCode /* = NULL */, XSHOT nDYCode /* = 0 */, XNETHANDLE xhToken /* = 0 */, XLONG dwCryption /* = 0 */) { AuthClient_IsErrorOccur = false; @@ -179,7 +184,11 @@ bool CAuthClient_Connector::AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR st_AuthUser.enDeviceType = ENUM_PROTOCOL_FOR_DEVICE_TYPE_PC_MACOS; #endif _tcsxcpy(st_AuthUser.tszUserName, lpszUser); - + if (NULL != lpszHWCode) + { + _tcsxcpy(st_AuthUser.tszHWCode, lpszHWCode); + } + if (dwCryption > 0) { int nPLen = _tcsxlen(lpszPass); diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h index a07ca39..b17f64f 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Connector/AuthClient_Connector.h @@ -26,7 +26,7 @@ public: bool AuthClient_Connector_Connect(LPCXSTR lpszClientAddr, int nPort, LPCXSTR lpszPass = NULL); bool AuthClient_Connector_Close(); bool AuthClient_Connector_GetAuth(bool* pbAuth = NULL); - bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, XSHOT nDYCode = 0, XNETHANDLE xhToken = 0, XLONG dwCryption = 0); + bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszHWCode = NULL, XSHOT nDYCode = 0, XNETHANDLE xhToken = 0, XLONG dwCryption = 0); bool AuthClient_Connector_Heart(bool bEnable = true); protected: static XHTHREAD XCALLBACK AuthClient_Connector_Thread(XPVOID lParam); diff --git a/XEngine_Source/AuthorizeModule_Client/AuthClient_Define.h b/XEngine_Source/AuthorizeModule_Client/AuthClient_Define.h index b8a3762..520d6e1 100644 --- a/XEngine_Source/AuthorizeModule_Client/AuthClient_Define.h +++ b/XEngine_Source/AuthorizeModule_Client/AuthClient_Define.h @@ -77,17 +77,22 @@ extern "C" bool AuthClient_Connector_GetAuth(bool* pbAuth = NULL); 类型:常量字符指针 可空:N 意思:输入密码 - 参数.三:nDYCode + 参数.三:lpszHWCode + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入硬件码,如果服务器开启了硬件绑定 + 参数.四:nDYCode In/Out:In 类型:整数型 可空:Y 意思:输入动态码 - 参数.四:xhToken + 参数.五:xhToken In/Out:In 类型:句柄型 可空:Y 意思:输入动态码绑定的句柄 - 参数.五:dwCryption + 参数.六:dwCryption In/Out:In 类型:整数型 可空:Y @@ -97,7 +102,7 @@ extern "C" bool AuthClient_Connector_GetAuth(bool* pbAuth = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, XSHOT nDYCode = 0, XNETHANDLE xhToken = 0, XLONG dwCryption = 0); +extern "C" bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszHWCode = NULL, XSHOT nDYCode = 0, XNETHANDLE xhToken = 0, XLONG dwCryption = 0); /******************************************************************** 函数名称:AuthClient_Connector_Heart 函数功能:启用禁用客户端心跳 diff --git a/XEngine_Source/AuthorizeModule_Client/pch.cpp b/XEngine_Source/AuthorizeModule_Client/pch.cpp index 69b56a9..743b2d8 100644 --- a/XEngine_Source/AuthorizeModule_Client/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Client/pch.cpp @@ -43,9 +43,9 @@ extern "C" bool AuthClient_Connector_GetAuth(bool* pbAuth) { return m_Connector.AuthClient_Connector_GetAuth(pbAuth); } -extern "C" bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, XSHOT nDYCode, XNETHANDLE xhToken, XLONG dwCryption) +extern "C" bool AuthClient_Connector_Login(LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszHWCode, XSHOT nDYCode, XNETHANDLE xhToken, XLONG dwCryption) { - return m_Connector.AuthClient_Connector_Login(lpszUser, lpszPass, nDYCode, xhToken, dwCryption); + return m_Connector.AuthClient_Connector_Login(lpszUser, lpszPass, lpszHWCode, nDYCode, xhToken, dwCryption); } extern "C" bool AuthClient_Connector_Heart(bool bEnable) { -- Gitee From 85bfee067b06066ebba7b9f05b59900d79b11490 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 18 Aug 2025 15:55:33 +0800 Subject: [PATCH 24/34] added:serial expired time support --- .../DBModule_MySQL/DBModule_MySQL.cpp | 14 +++++++++- .../DBModule_SQLite/DBModule_SQLite.cpp | 14 +++++++++- .../Protocol_Packet/Protocol_Packet.cpp | 1 + .../Protocol_Parse/Protocol_Parse.cpp | 4 +++ XEngine_Source/XAuth_Protocol.h | 6 +++-- .../Authorize_Dialog/Dialog_Serial.cpp | 20 ++++++++++----- .../Authorize_Dialog/Dialog_Serial.h | 1 + .../XEngineAuthorizeApp.rc | Bin 49618 -> 49846 bytes .../AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp | 24 ++++++++++++++++++ 9 files changed, 73 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index 15606e5..d03a980 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -809,6 +809,12 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialQuery(LPCXSTR lpszSerialNumber, LPAUT //超时时间 nFliedValue++; _tcsxcpy(pSt_SerialTable->tszCreateTime, ppszResult[nFliedValue]); + //过期时间 + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_SerialTable->tszExpiredTime, ppszResult[nFliedValue]); + } } DataBase_MySQL_FreeResult(xhData, xhTable); @@ -898,6 +904,12 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialQueryAll(AUTHREG_SERIALTABLE*** pppSt //创建时间 _tcsxcpy((*pppSt_SerialTable)[i]->tszCreateTime, ppszResult[nFliedValue]); nFliedValue++; + //过期时间 + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy((*pppSt_SerialTable)[i]->tszExpiredTime, ppszResult[nFliedValue]); + } + nFliedValue++; } DataBase_MySQL_FreeResult(xhData, xhTable); return true; @@ -928,7 +940,7 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialPush(AUTHREG_SERIALTABLE* pSt_SerialT SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_EXIST; return false; } - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'%s','%s','%s',%d,%d,'%s')"), pSt_SerialTable->tszUserName, pSt_SerialTable->tszSerialNumber, pSt_SerialTable->tszMaxTime, pSt_SerialTable->enSerialType, pSt_SerialTable->bIsUsed, pSt_SerialTable->tszCreateTime); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'%s','%s','%s',%d,%d,'%s','%s')"), pSt_SerialTable->tszUserName, pSt_SerialTable->tszSerialNumber, pSt_SerialTable->tszMaxTime, pSt_SerialTable->enSerialType, pSt_SerialTable->bIsUsed, pSt_SerialTable->tszCreateTime, pSt_SerialTable->tszExpiredTime); if (!DataBase_MySQL_Execute(xhData, tszSQLStatement)) { diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index 12ccd75..f63079f 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -755,6 +755,12 @@ bool CDBModule_SQLite::DBModule_SQLite_SerialQuery(LPCXSTR lpszSerialNumber, LPA //超时时间 nFliedValue++; _tcsxcpy(pSt_SerialTable->tszCreateTime, ppszResult[nFliedValue]); + //过期时间 + nFliedValue++; + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy(pSt_SerialTable->tszExpiredTime, ppszResult[nFliedValue]); + } } DataBase_SQLite_FreeTable(ppszResult); @@ -837,6 +843,12 @@ bool CDBModule_SQLite::DBModule_SQLite_SerialQueryAll(AUTHREG_SERIALTABLE*** ppp nFliedValue++; //创建时间 _tcsxcpy((*pppSt_SerialTable)[i]->tszCreateTime, ppszResult[nFliedValue]); + nFliedValue++; + //过期时间 + if (NULL != ppszResult[nFliedValue]) + { + _tcsxcpy((*pppSt_SerialTable)[i]->tszExpiredTime, ppszResult[nFliedValue]); + } nFliedValue++; } DataBase_SQLite_FreeTable(ppszResult); @@ -868,7 +880,7 @@ bool CDBModule_SQLite::DBModule_SQLite_SerialPush(AUTHREG_SERIALTABLE* pSt_Seria SQLPacket_dwErrorCode = ERROR_AUTHORIZE_MODULE_DATABASE_EXIST; return false; } - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'%s','%s','%s',%d,%d,'%s')"), pSt_SerialTable->tszUserName, pSt_SerialTable->tszSerialNumber, pSt_SerialTable->tszMaxTime, pSt_SerialTable->enSerialType, pSt_SerialTable->bIsUsed, pSt_SerialTable->tszCreateTime); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'%s','%s','%s',%d,%d,'%s','%s')"), pSt_SerialTable->tszUserName, pSt_SerialTable->tszSerialNumber, pSt_SerialTable->tszMaxTime, pSt_SerialTable->enSerialType, pSt_SerialTable->bIsUsed, pSt_SerialTable->tszCreateTime, pSt_SerialTable->tszExpiredTime); if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) { diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp index b5ad71c..af12123 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Packet/Protocol_Packet.cpp @@ -533,6 +533,7 @@ bool CProtocol_Packet::Protocol_Packet_HttpSerialList(XCHAR* ptszMsgBuffer, int* st_JsonObject["enSerialType"] = (*pppSt_SerialList)[i]->enSerialType; st_JsonObject["bIsUsed"] = (*pppSt_SerialList)[i]->bIsUsed; st_JsonObject["tszCreateTime"] = (*pppSt_SerialList)[i]->tszCreateTime; + st_JsonObject["tszExpiredTime"] = (*pppSt_SerialList)[i]->tszExpiredTime; st_JsonArray.append(st_JsonObject); } st_JsonRoot["msg"] = "success"; diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp index a0032ed..7a15923 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp @@ -582,6 +582,10 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseSerial(LPCXSTR lpszMsgBuffer, int { _tcsxcpy((*pppSt_SerialTable)[i]->tszCreateTime, st_JsonArray[i]["tszCreateTime"].asCString()); } + if (!st_JsonArray[i]["tszExpiredTime"].isNull()) + { + _tcsxcpy((*pppSt_SerialTable)[i]->tszExpiredTime, st_JsonArray[i]["tszExpiredTime"].asCString()); + } if (!st_JsonArray[i]["tszMaxTime"].isNull()) { _tcsxcpy((*pppSt_SerialTable)[i]->tszMaxTime, st_JsonArray[i]["tszMaxTime"].asCString()); diff --git a/XEngine_Source/XAuth_Protocol.h b/XEngine_Source/XAuth_Protocol.h index 8f7cbc0..eb47b6f 100644 --- a/XEngine_Source/XAuth_Protocol.h +++ b/XEngine_Source/XAuth_Protocol.h @@ -51,6 +51,7 @@ #define ERROR_AUTHORIZE_PROTOCOL_NOTMATCH 0x114 //数据不匹配 #define ERROR_AUTHORIZE_PROTOCOL_TIMEOUT 0x115 //超时 #define ERROR_AUTHORIZE_PROTOCOL_PERMISSION 0x116 //用户权限错误 +#define ERROR_AUTHORIZE_PROTOCOL_EXPIRED 0x117 //已经过期 #define ERROR_AUTHORIZE_PROTOCOL_SERVER 0x201 //服务端内部错误 #define ERROR_AUTHORIZE_PROTOCOL_LIMIT 0x202 //服务端内部限制,数据过大后者过小 @@ -194,9 +195,10 @@ typedef struct tag_AuthReg_SerialTable XCHAR tszUserName[XENGINE_AUTHREG_SERVICE_SQL_MAX_USERNAME]; //使用者是谁 XCHAR tszSerialNumber[128]; //序列号 XCHAR tszMaxTime[64]; //使用时间 - ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType; //充值卡类型 - int bIsUsed; //是否已经使用 + ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType; //充值卡类型 + int bIsUsed; //是否已经使用 XCHAR tszCreateTime[64]; //创建时间 + XCHAR tszExpiredTime[64]; //过期时间 }AUTHREG_SERIALTABLE, * LPAUTHREG_SERIALTABLE; //网络临时验证表 typedef struct diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp index d415116..e95fec3 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.cpp @@ -31,6 +31,7 @@ void CDialog_Serial::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_EDIT2, m_EditHasTime); DDX_Control(pDX, IDC_EDIT3, m_EditPosStart); DDX_Control(pDX, IDC_EDIT7, m_EditPosEnd); + DDX_Control(pDX, IDC_EDIT8, m_EditExpiredTime); } @@ -52,12 +53,13 @@ BOOL CDialog_Serial::OnInitDialog() CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 - m_ListSerial.InsertColumn(0, _T("使用者"), LVCFMT_LEFT, 80); + m_ListSerial.InsertColumn(0, _T("使用者"), LVCFMT_LEFT, 100); m_ListSerial.InsertColumn(1, _T("序列号"), LVCFMT_LEFT, 450); m_ListSerial.InsertColumn(2, _T("时间/次数"), LVCFMT_LEFT, 90); m_ListSerial.InsertColumn(3, _T("卡类型"), LVCFMT_LEFT, 80); m_ListSerial.InsertColumn(4, _T("是否使用"), LVCFMT_LEFT, 80); - m_ListSerial.InsertColumn(5, _T("创建日期"), LVCFMT_LEFT, 180); + m_ListSerial.InsertColumn(5, _T("创建日期"), LVCFMT_LEFT, 120); + m_ListSerial.InsertColumn(6, _T("过期日期"), LVCFMT_LEFT, 120); m_ListSerial.SetExtendedStyle(LVS_EX_FULLROWSELECT); for (int i = 0; i < 5; i++) @@ -175,6 +177,7 @@ void CDialog_Serial::OnBnClickedButton1() m_ListSerial.SetItemText(i, 4, _T("未使用")); } m_ListSerial.SetItemText(i, 5, A2W(st_JsonArray["tszCreateTime"].asCString())); + m_ListSerial.SetItemText(i, 6, A2W(st_JsonArray["tszExpiredTime"].asCString())); } BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } @@ -197,9 +200,11 @@ void CDialog_Serial::OnBnClickedButton2() CString m_StrHasTime; CString m_StrSerialCount; CString m_StrNumberCount; + CString m_StrExpiredTime; Json::Value st_JsonRoot; Json::Value st_JsonObject; + m_EditExpiredTime.GetWindowText(m_StrExpiredTime); m_EditHasTime.GetWindowText(m_StrHasTime); m_EditSerialCount.GetWindowText(m_StrSerialCount); m_ComboNumber.GetLBText(m_ComboNumber.GetCurSel(), m_StrNumberCount); @@ -209,6 +214,7 @@ void CDialog_Serial::OnBnClickedButton2() st_JsonObject["nNumberCount"] = _ttoi(m_StrNumberCount.GetBuffer()); st_JsonObject["nSerialCount"] = _ttoi(m_StrSerialCount.GetBuffer()); st_JsonObject["tszHasTime"] = W2A(m_StrHasTime.GetBuffer()); + st_JsonObject["tszExpiredTime"] = W2A(m_StrExpiredTime.GetBuffer()); st_JsonRoot["st_SerialInfo"] = st_JsonObject; st_JsonRoot["xhToken"] = _ttoll(m_StrToken.GetBuffer()); @@ -279,7 +285,7 @@ void CDialog_Serial::OnBnClickedButton4() int nSelect = m_ListSerial.GetNextSelectedItem(pSt_Sition); if (nSelect < 0) { - Authorize_Help_LogPrint(_T("你没有选择任何客户!")); + Authorize_Help_LogPrint(_T("你没有选择任何序列号!")); return; } CString m_StrSerial = m_ListSerial.GetItemText(nSelect, 1); @@ -425,8 +431,7 @@ void CDialog_Serial::OnBnClickedButton6() AUTHREG_SERIALTABLE st_SerialTable; memset(&st_SerialTable, '\0', sizeof(AUTHREG_SERIALTABLE)); - int nRet = _stxscanf(tszMsgBuffer, _X("%d %s %s %s %d %d %s %s"), &nID, st_SerialTable.tszUserName, st_SerialTable.tszSerialNumber, st_SerialTable.tszMaxTime, &st_SerialTable.enSerialType, &st_SerialTable.bIsUsed, st_SerialTable.tszCreateTime, (st_SerialTable.tszCreateTime + 11)); - st_SerialTable.tszCreateTime[10] = ' '; + int nRet = _stxscanf(tszMsgBuffer, _X("%d %s %s %s %d %d %19c %19c"), &nID, st_SerialTable.tszUserName, st_SerialTable.tszSerialNumber, st_SerialTable.tszMaxTime, &st_SerialTable.enSerialType, &st_SerialTable.bIsUsed, st_SerialTable.tszCreateTime, st_SerialTable.tszExpiredTime); stl_ListSerial.push_back(st_SerialTable); } fclose(pSt_File); @@ -458,6 +463,7 @@ void CDialog_Serial::OnBnClickedButton6() st_JsonObject["bIsUsed"] = stl_ListIterator->bIsUsed; st_JsonObject["enSerialType"] = stl_ListIterator->enSerialType; st_JsonObject["tszCreateTime"] = stl_ListIterator->tszCreateTime; + st_JsonObject["tszExpiredTime"] = stl_ListIterator->tszExpiredTime; st_JsonObject["tszMaxTime"] = stl_ListIterator->tszMaxTime; st_JsonObject["tszSerialNumber"] = stl_ListIterator->tszSerialNumber; st_JsonObject["tszUserName"] = stl_ListIterator->tszUserName; @@ -542,7 +548,7 @@ void CDialog_Serial::OnBnClickedButton7() XCHAR tszMsgBuffer[XPATH_MAX]; memset(tszMsgBuffer, '\0', XPATH_MAX); //写字段头 - int nRet = _xstprintf(tszMsgBuffer, _X("ID UserName SerialNumber MaxTime CardSerialType bIsUsed CreateTime\r\n")); + int nRet = _xstprintf(tszMsgBuffer, _X("ID UserName SerialNumber MaxTime CardSerialType bIsUsed CreateTime ExpiredTime\r\n")); fwrite(tszMsgBuffer, 1, nRet, pSt_File); for (int i = 0; i < m_ListSerial.GetItemCount(); i++) @@ -564,7 +570,7 @@ void CDialog_Serial::OnBnClickedButton7() { nUsedType = 0; } - nRet = _xstprintf(tszMsgBuffer, _X("%d %s %s %s %d %d %s %s\r\n"), i, W2A(m_ListSerial.GetItemText(i, 0).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 1).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 2).GetBuffer()), nSerialType, nUsedType, W2A(m_ListSerial.GetItemText(i, 5).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 6).GetBuffer())); + nRet = _xstprintf(tszMsgBuffer, _X("%d %s %s %s %d %d %s %s %s\r\n"), i, W2A(m_ListSerial.GetItemText(i, 0).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 1).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 2).GetBuffer()), nSerialType, nUsedType, W2A(m_ListSerial.GetItemText(i, 5).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 6).GetBuffer()), W2A(m_ListSerial.GetItemText(i, 7).GetBuffer())); fwrite(tszMsgBuffer, 1, nRet, pSt_File); } fclose(pSt_File); diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.h index d632363..e07e1be 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/Authorize_Dialog/Dialog_Serial.h @@ -36,4 +36,5 @@ public: afx_msg void OnBnClickedButton7(); CEdit m_EditPosStart; CEdit m_EditPosEnd; + CEdit m_EditExpiredTime; }; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngineAuthorizeApp.rc b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeApp/XEngineAuthorizeApp.rc index b44301a80451811595979af54478e4de9ab7c373..d13598135be86f0a8fda3f11ec8af72dcb4b0854 100644 GIT binary patch delta 75 zcmccA%)G6Yd4qsHqv2*j{p(zlKh$YW4(LkD?NHe)WwoOn04#|WVE_OC delta 25 hcmdni%6zGrd4qsHqtRwT{p(zl_voo?{$O>i9RPii3RnOD diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp index 7acaa31..ed41d86 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_User.cpp @@ -177,6 +177,30 @@ bool XEngine_AuthorizeHTTP_User(XNETHANDLE xhToken, LPCXSTR lpszClientAddr, LPCX return false; } Protocol_Parse_HttpParsePay(lpszMsgBuffer, nMsgLen, &st_UserPay); + //判断序列号是否过期 + AUTHREG_SERIALTABLE st_SerialTable = {}; + if (!DBModule_SQLite_SerialQuery(st_UserPay.tszSerialNumber, &st_SerialTable)) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_NOTFOUND, "serial number not found"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,充值失败,充值序列卡:%s 不存在!"), lpszClientAddr, st_SerialTable.tszSerialNumber); + return false; + } + if (_tcsxlen(st_SerialTable.tszExpiredTime) > 1) + { + __int64x nTimeValue = 0; + XCHAR tszTimeStr[128] = {}; + BaseLib_Time_TimeToStr(tszTimeStr); + BaseLib_TimeSpan_GetForStr(tszTimeStr, st_SerialTable.tszExpiredTime, &nTimeValue, 3); + if (nTimeValue < 0) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_EXPIRED, "serial was expired"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,充值失败,序列卡:%s 已经过期!"), lpszClientAddr, st_SerialTable.tszSerialNumber); + return false; + } + } + bool bSuccess = false; if (0 == st_AuthConfig.st_XSql.nDBType) { -- Gitee From 4ed5828a6d1866fbe554bc776acf2a195497d108 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 18 Aug 2025 16:47:05 +0800 Subject: [PATCH 25/34] added:http basic support --- .../XEngine_Config/XEngine_Config.json | 4 +++ .../AuthorizeModule_Configure/Config_Define.h | 5 +++ .../AuthorizeModule_Configure/Config_Error.h | 3 +- .../ModuleConfigure_Json.cpp | 10 ++++++ .../AuthorizeModule_Help/AuthHelp_Define.h | 7 ++++ .../AuthorizeModule_Help/AuthHelp_Error.h | 8 ++++- .../AuthorizeModule_Help.def | 3 ++ .../AuthorizeModule_Help.vcxproj | 2 ++ .../AuthorizeModule_Help.vcxproj.filters | 12 +++++++ XEngine_Source/AuthorizeModule_Help/pch.cpp | 13 +++++++ XEngine_Source/AuthorizeModule_Help/pch.h | 9 +++++ .../Authorize_HttpTask.cpp | 36 +++++++++++++++---- .../Authorize_HttpTask.h | 2 +- 13 files changed, 104 insertions(+), 10 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 7df9f80..8d957e4 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -54,6 +54,10 @@ "bEnable": false, "nPass": 123123 }, + "XApiVer": { + "bEnable": true, + "nVerType": 1 + }, "XSql": { "nSQLType": 0, "SQLAddr": "127.0.0.1", diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index 8814727..186ecb7 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -84,6 +84,11 @@ typedef struct bool bEnable; //是否启用加密传输 int nPassword; //密码 }st_XCrypto; + struct + { + bool bEnable; //是否启用HTTP接口权限验证 + int nVType; //验证方法,1 基本,2摘要 + }st_XApiVer; struct { int nDBType; diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Error.h b/XEngine_Source/AuthorizeModule_Configure/Config_Error.h index 49404fa..25f1a8a 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Error.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Error.h @@ -20,4 +20,5 @@ #define ERROR_AUTHORIZE_MODULE_CONFIGURE_XLOG 0x0010008 #define ERROR_AUTHORIZE_MODULE_CONFIGURE_MALLOC 0x0010009 #define ERROR_AUTHORIZE_MODULE_CONFIGURE_REPORT 0x0010010 -#define ERROR_AUTHORIZE_MODULE_CONFIGURE_XTIME 0x0010011 \ No newline at end of file +#define ERROR_AUTHORIZE_MODULE_CONFIGURE_XTIME 0x0010011 +#define ERROR_AUTHORIZE_MODULE_CONFIGURE_XAPIVER 0x0010012 \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 28f0e74..8d1e363 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -155,6 +155,16 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Json::Value st_JsonXCrypto = st_JsonRoot["XCrypto"]; pSt_ServerConfig->st_XCrypto.bEnable = st_JsonXCrypto["bEnable"].asBool(); pSt_ServerConfig->st_XCrypto.nPassword = st_JsonXCrypto["nPass"].asInt(); + //接口验证 + if (st_JsonRoot["XApiVer"].empty() || (2 != st_JsonRoot["XApiVer"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_AUTHORIZE_MODULE_CONFIGURE_XAPIVER; + return false; + } + Json::Value st_JsonXAPIVer = st_JsonRoot["XApiVer"]; + pSt_ServerConfig->st_XApiVer.bEnable = st_JsonXAPIVer["bEnable"].asBool(); + pSt_ServerConfig->st_XApiVer.nVType = st_JsonXAPIVer["nVerType"].asInt(); //数据库配置 if (st_JsonRoot["XSql"].empty() || (6 != st_JsonRoot["XSql"].size())) { diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h index 309a9d3..dc6d7c9 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h @@ -101,6 +101,13 @@ extern "C" bool AuthHelp_DynamicCode_Get(XNETHANDLE xhToken, int nDynamicCode); *********************************************************************/ extern "C" bool AuthHelp_MultiLogin_GetRange(int nClientDevice, int* pInt_IDType); /************************************************************************/ +/* API帮助函数导出定义 */ +/************************************************************************/ + +extern "C" bool AuthHelp_APIHelp_HttpAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount); + +extern "C" bool AuthHelp_APIHelp_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC = NULL); +/************************************************************************/ /* 剪贴板导出定义 */ /************************************************************************/ #ifdef _MSC_BUILD diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Error.h b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Error.h index 22a82b7..bfb3b87 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Error.h +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Error.h @@ -38,4 +38,10 @@ /************************************************************************/ /* 多端登录 */ /************************************************************************/ -#define ERROR_AUTHORIZE_MODULE_HELP_MULTI_NOTSUPPORT 0x0050030 //不支持 \ No newline at end of file +#define ERROR_AUTHORIZE_MODULE_HELP_MULTI_NOTSUPPORT 0x0050030 //不支持 +/************************************************************************/ +/* API帮助函数 */ +/************************************************************************/ +#define ERROR_AUTHORIZE_MODULE_HELP_APIHELP_NOTSUPPORT 0x0050040 //不支持 +#define ERROR_AUTHORIZE_MODULE_HELP_APIHELP_PARAMENT 0x0050041 //参数错误 +#define ERROR_AUTHORIZE_MODULE_HELP_APIHELP_FORMAT 0x0050042 //格式错误 \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def index 6e09250..85cef66 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def +++ b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def @@ -10,6 +10,9 @@ EXPORTS AuthHelp_MultiLogin_GetRange + AuthHelp_APIHelp_HttpAuth + AuthHelp_APIHelp_Digest + AuthHelp_ClipBoard_Set AuthHelp_ClipBoard_Get AuthHelp_ClipBoard_Clear diff --git a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj index a5d17b0..2d8e1b6 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj +++ b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj @@ -248,6 +248,7 @@ + @@ -258,6 +259,7 @@ + diff --git a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters index 3591ae8..cea5577 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters +++ b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters @@ -37,6 +37,12 @@ {92e4cc9f-02d7-4e6d-92a1-86e433e38fd2} + + {7dd61ed5-7869-47d3-98d7-e8bd46dbcc15} + + + {3d25ff0b-dc39-4507-b453-c2fd2084b370} + @@ -63,6 +69,9 @@ 头文件\AuthHelp_MultiLogin + + 头文件\AuthHelp_APIHelp + @@ -83,6 +92,9 @@ 源文件\AuthHelp_MultiLogin + + 源文件\AuthHelp_APIHelp + diff --git a/XEngine_Source/AuthorizeModule_Help/pch.cpp b/XEngine_Source/AuthorizeModule_Help/pch.cpp index 2707ec1..e34a2f4 100644 --- a/XEngine_Source/AuthorizeModule_Help/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Help/pch.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "AuthHelp_DynamicCode/AuthHelp_DynamicCode.h" #include "AuthHelp_MultiLogin/AuthHelp_MultiLogin.h" +#include "AuthHelp_APIHelp/AuthHelp_APIHelp.h" #ifdef _MSC_BUILD #include "AuthHelp_ClipBoard/AuthHelp_ClipBoard.h" #include "AuthHelp_Windows/AuthHelp_Windows.h" @@ -21,6 +22,7 @@ XLONG Help_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CAuthHelp_DynamicCode m_HelpDynamic; CAuthHelp_MultiLogin m_HelpLogin; +CAuthHelp_APIHelp m_APIHelp; #ifdef _MSC_BUILD CAuthHelp_ClipBoard m_HelpClipBoard; CAuthHelp_Windows m_HelpWindow; @@ -61,6 +63,17 @@ extern "C" bool AuthHelp_MultiLogin_GetRange(int nClientDevice, int* pInt_IDType return m_HelpLogin.AuthHelp_MultiLogin_GetRange(nClientDevice, pInt_IDType); } /************************************************************************/ +/* API帮助函数导出定义 */ +/************************************************************************/ +extern "C" bool AuthHelp_APIHelp_HttpAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount) +{ + return m_APIHelp.AuthHelp_APIHelp_HttpAuth(ptszUser, ptszPass, pptszListHdr, nHdrCount); +} +extern "C" bool AuthHelp_APIHelp_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC) +{ + return m_APIHelp.AuthHelp_APIHelp_Digest(ptszResponseStr, lpszUser, lpszPass, lpszRealm, lpszMethod, lpszUser, lpszNonce, lpszCNonce, lpszNC); +} +/************************************************************************/ /* 剪贴板导出定义 */ /************************************************************************/ #ifdef _MSC_BUILD diff --git a/XEngine_Source/AuthorizeModule_Help/pch.h b/XEngine_Source/AuthorizeModule_Help/pch.h index 15e6c8b..642d520 100644 --- a/XEngine_Source/AuthorizeModule_Help/pch.h +++ b/XEngine_Source/AuthorizeModule_Help/pch.h @@ -9,6 +9,7 @@ #ifdef _MSC_BUILD // 添加要在此处预编译的标头 +#define _CRT_SECURE_NO_WARNINGS #include "framework.h" #include #include @@ -21,9 +22,15 @@ #include using namespace std; #include +#include #include #include #include +#include +#include +#include +#include +#include #include "../XAuth_BuildSwitch.h" #include "AuthHelp_Define.h" #include "AuthHelp_Error.h" @@ -45,4 +52,6 @@ extern XLONG Help_dwErrorCode; #ifdef _MSC_BUILD #pragma comment(lib,"Comctl32.lib") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_Core/XEngine_Cryption") +#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpProtocol") #endif \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index bd79708..ee79bc4 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -17,12 +17,12 @@ XHTHREAD XCALLBACK XEngine_AuthService_HttpThread(XPVOID lParam) for (int i = 0; i < nListCount; i++) { int nMsgLen = 0; + int nHdrCount = 0; + XCHAR** ppszListHdr = NULL; XCHAR* ptszMsgBuffer = NULL; - RFCCOMPONENTS_HTTP_REQPARAM st_HTTPParament; + RFCCOMPONENTS_HTTP_REQPARAM st_HTTPParament = {}; - memset(&st_HTTPParament, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); - - if (HttpProtocol_Server_GetMemoryEx(xhHttpPacket, ppSt_ListClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParament)) + if (HttpProtocol_Server_GetMemoryEx(xhHttpPacket, ppSt_ListClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParament, &ppszListHdr, &nHdrCount)) { if (st_AuthConfig.st_XCrypto.bEnable) { @@ -34,21 +34,22 @@ XHTHREAD XCALLBACK XEngine_AuthService_HttpThread(XPVOID lParam) _xstprintf(tszPassword, _X("%d"), st_AuthConfig.st_XCrypto.nPassword); Cryption_XCrypto_Decoder(ptszMsgBuffer, &nMsgLen, tszDeBuffer, tszPassword); - XEngine_Client_HttpTask(ppSt_ListClient[i]->tszClientAddr, tszDeBuffer, nMsgLen, &st_HTTPParament); + XEngine_Client_HttpTask(ppSt_ListClient[i]->tszClientAddr, tszDeBuffer, nMsgLen, &st_HTTPParament, ppszListHdr, nHdrCount); } else { - XEngine_Client_HttpTask(ppSt_ListClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParament); + XEngine_Client_HttpTask(ppSt_ListClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParament, ppszListHdr, nHdrCount); } } BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + BaseLib_Memory_Free((XPPPMEM)&ppszListHdr, nHdrCount); } BaseLib_Memory_Free((XPPPMEM)&ppSt_ListClient, nListCount); } return 0; } -bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParament) +bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParament, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 4096; XCHAR tszSDBuffer[4096]; @@ -80,6 +81,27 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("客户端:%s,登录连接被阻止,用户名或IP地址被禁用!"), lpszClientAddr); return false; } + //HTTP验证 + if (st_AuthConfig.st_XApiVer.bEnable) + { + XCHAR tszUserName[64] = {}; + XCHAR tszUserPass[64] = {}; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; + + st_HDRParam.nHttpCode = 401; + st_HDRParam.bIsClose = true; + + if (!AuthHelp_APIHelp_HttpAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) + { + LPCXSTR lpszHTTPHdr = _X("WWW-Authenticate: Basic realm=\"XEngine Authorize\"\r\n"); + HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHTTPHdr); + NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, AuthHelp_GetLastError()); + return false; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); + } + if (0 == _tcsxnicmp(lpszMethodPost, pSt_HTTPParament->tszHttpMethod, _tcsxlen(lpszMethodPost))) { XCHAR tszAPIType[64]; diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h index a716388..1ab9d6f 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.h @@ -1,4 +1,4 @@ #pragma once XHTHREAD XCALLBACK XEngine_AuthService_HttpThread(XPVOID lParam); -bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParament); \ No newline at end of file +bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParament, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file -- Gitee From f6288cdb98635e20318d0eaedb0114433fdffd2c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 19 Aug 2025 15:16:01 +0800 Subject: [PATCH 26/34] modify:use depend lib of verification module imp to http verification --- .../Authorize_APPClient.cpp | 2 +- .../AuthHelp_APIHelp/AuthHelp_APIHelp.cpp | 22 +++++++++++++++ .../AuthHelp_APIHelp/AuthHelp_APIHelp.h | 21 ++++++++++++++ .../AuthorizeModule_Help/AuthHelp_Define.h | 7 ----- .../AuthorizeModule_Help.def | 3 -- .../AuthorizeModule_Help.vcxproj.filters | 4 +-- XEngine_Source/AuthorizeModule_Help/Makefile | 4 ++- XEngine_Source/AuthorizeModule_Help/pch.cpp | 11 -------- XEngine_Source/XEngine.sln | 17 +++++++++++ .../XEngine_AuthorizeService/Authorize_Hdr.h | 8 ++++++ .../Authorize_HttpTask.cpp | 28 ++++++++++++++++--- XEngine_Source/XEngine_DependLibrary | 2 +- 12 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.cpp create mode 100644 XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.h diff --git a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp index c8132b3..c161059 100644 --- a/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp +++ b/XEngine_Apps/Authorize_APPClient/Authorize_APPClient.cpp @@ -48,7 +48,7 @@ XSOCKET m_Socket = 0; LPCXSTR lpszUser = _X("123123aa"); LPCXSTR lpszPass = _X("123123"); LPCXSTR lpszHWCode = _X("2FDWAD02JD2091"); -LPCXSTR lpszSerial = _X("XAUTH-XYRYS-EWW60-UZO37-MHJAW-48386-Z806P"); +LPCXSTR lpszSerial = _X("XAUTH-XYRYS-JKG60-N510G-ZUFDH-54-V7I3H"); LPCXSTR lpszEmail = _X("486179@qq.com"); __int64x nPhoneNumber = 1366666666; __int64x nIDNumber = 511025111111111111; diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.cpp b/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.cpp new file mode 100644 index 0000000..60a1a4d --- /dev/null +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.cpp @@ -0,0 +1,22 @@ +#include "pch.h" +#include "AuthHelp_APIHelp.h" +/******************************************************************** +// Created: 2025/08/18 16:05:26 +// File Name: D:\XEngine_Authorize\XEngine_Source\AuthorizeModule_Help\AuthHelp_APIHelp\AuthHelp_APIHelp.cpp +// File Path: D:\XEngine_Authorize\XEngine_Source\AuthorizeModule_Help\AuthHelp_APIHelp +// File Base: AuthHelp_APIHelp +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: 帮助函数 +// History: +*********************************************************************/ +CAuthHelp_APIHelp::CAuthHelp_APIHelp() +{ +} +CAuthHelp_APIHelp::~CAuthHelp_APIHelp() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.h b/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.h new file mode 100644 index 0000000..b54be64 --- /dev/null +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_APIHelp/AuthHelp_APIHelp.h @@ -0,0 +1,21 @@ +#pragma once +/******************************************************************** +// Created: 2025/08/18 16:02:33 +// File Name: D:\XEngine_Authorize\XEngine_Source\AuthorizeModule_Help\AuthHelp_APIHelp\AuthHelp_APIHelp.h +// File Path: D:\XEngine_Authorize\XEngine_Source\AuthorizeModule_Help\AuthHelp_APIHelp +// File Base: AuthHelp_APIHelp +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 帮助函数 +// History: +*********************************************************************/ + +class CAuthHelp_APIHelp +{ +public: + CAuthHelp_APIHelp(); + ~CAuthHelp_APIHelp(); +public: +private: +}; \ No newline at end of file diff --git a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h index dc6d7c9..309a9d3 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h +++ b/XEngine_Source/AuthorizeModule_Help/AuthHelp_Define.h @@ -101,13 +101,6 @@ extern "C" bool AuthHelp_DynamicCode_Get(XNETHANDLE xhToken, int nDynamicCode); *********************************************************************/ extern "C" bool AuthHelp_MultiLogin_GetRange(int nClientDevice, int* pInt_IDType); /************************************************************************/ -/* API帮助函数导出定义 */ -/************************************************************************/ - -extern "C" bool AuthHelp_APIHelp_HttpAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount); - -extern "C" bool AuthHelp_APIHelp_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC = NULL); -/************************************************************************/ /* 剪贴板导出定义 */ /************************************************************************/ #ifdef _MSC_BUILD diff --git a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def index 85cef66..6e09250 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def +++ b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.def @@ -10,9 +10,6 @@ EXPORTS AuthHelp_MultiLogin_GetRange - AuthHelp_APIHelp_HttpAuth - AuthHelp_APIHelp_Digest - AuthHelp_ClipBoard_Set AuthHelp_ClipBoard_Get AuthHelp_ClipBoard_Clear diff --git a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters index cea5577..917464a 100644 --- a/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters +++ b/XEngine_Source/AuthorizeModule_Help/AuthorizeModule_Help.vcxproj.filters @@ -38,10 +38,10 @@ {92e4cc9f-02d7-4e6d-92a1-86e433e38fd2} - {7dd61ed5-7869-47d3-98d7-e8bd46dbcc15} + {4d216925-f70a-4d9a-835c-4ff390e10949} - {3d25ff0b-dc39-4507-b453-c2fd2084b370} + {f52e587f-431d-4520-a7ec-a79025363795} diff --git a/XEngine_Source/AuthorizeModule_Help/Makefile b/XEngine_Source/AuthorizeModule_Help/Makefile index 1649d07..99ad40a 100644 --- a/XEngine_Source/AuthorizeModule_Help/Makefile +++ b/XEngine_Source/AuthorizeModule_Help/Makefile @@ -6,7 +6,7 @@ LOADHDR = -I ./ LOADSO = -L LIB = -lXEngine_BaseLib LIBEX = -OBJECTS = AuthHelp_DynamicCode.o AuthHelp_MultiLogin.o pch.o +OBJECTS = AuthHelp_DynamicCode.o AuthHelp_MultiLogin.o AuthHelp_APIHelp.o pch.o ifeq ($(RELEASE),1) FLAGS = -c -D _RELEASE @@ -53,6 +53,8 @@ AuthHelp_DynamicCode.o:./AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthHelp_DynamicCode/AuthHelp_DynamicCode.cpp AuthHelp_MultiLogin.o:./AuthHelp_MultiLogin/AuthHelp_MultiLogin.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthHelp_MultiLogin/AuthHelp_MultiLogin.cpp +AuthHelp_APIHelp.o:./AuthHelp_APIHelp/AuthHelp_APIHelp.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./AuthHelp_APIHelp/AuthHelp_APIHelp.cpp pch.o:pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) pch.cpp diff --git a/XEngine_Source/AuthorizeModule_Help/pch.cpp b/XEngine_Source/AuthorizeModule_Help/pch.cpp index e34a2f4..03d4888 100644 --- a/XEngine_Source/AuthorizeModule_Help/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Help/pch.cpp @@ -63,17 +63,6 @@ extern "C" bool AuthHelp_MultiLogin_GetRange(int nClientDevice, int* pInt_IDType return m_HelpLogin.AuthHelp_MultiLogin_GetRange(nClientDevice, pInt_IDType); } /************************************************************************/ -/* API帮助函数导出定义 */ -/************************************************************************/ -extern "C" bool AuthHelp_APIHelp_HttpAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount) -{ - return m_APIHelp.AuthHelp_APIHelp_HttpAuth(ptszUser, ptszPass, pptszListHdr, nHdrCount); -} -extern "C" bool AuthHelp_APIHelp_Digest(XCHAR* ptszResponseStr, LPCXSTR lpszUser, LPCXSTR lpszPass, LPCXSTR lpszRealm, LPCXSTR lpszMethod, LPCXSTR lpszUrl, LPCXSTR lpszNonce, LPCXSTR lpszCNonce, LPCXSTR lpszNC) -{ - return m_APIHelp.AuthHelp_APIHelp_Digest(ptszResponseStr, lpszUser, lpszPass, lpszRealm, lpszMethod, lpszUser, lpszNonce, lpszCNonce, lpszNC); -} -/************************************************************************/ /* 剪贴板导出定义 */ /************************************************************************/ #ifdef _MSC_BUILD diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index b41abeb..8ad426b 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -36,8 +36,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_AuthorizeService", ProjectSection(ProjectDependencies) = postProject {02A75BD0-416E-4AEF-BF34-BD85BD86384F} = {02A75BD0-416E-4AEF-BF34-BD85BD86384F} {1391B739-713B-4A3A-9233-FEAB92E0566C} = {1391B739-713B-4A3A-9233-FEAB92E0566C} + {51DCBDC7-50CB-4A44-B10B-FCF90309914D} = {51DCBDC7-50CB-4A44-B10B-FCF90309914D} {5FA1874A-32F4-4176-9C23-4E22BE183660} = {5FA1874A-32F4-4176-9C23-4E22BE183660} {6B926D00-DCD2-49E3-86A9-3230C9872E65} = {6B926D00-DCD2-49E3-86A9-3230C9872E65} + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256} = {A8E43EC0-698A-4807-8A61-B2BE5FAB7256} {AB3DB24C-E1B3-41CF-B2F4-6C12E13C2894} = {AB3DB24C-E1B3-41CF-B2F4-6C12E13C2894} {CB9138DF-789D-459F-AD43-4095B22A487F} = {CB9138DF-789D-459F-AD43-4095B22A487F} {DD8CB5F1-980F-48C3-BA2F-3CF534903B14} = {DD8CB5F1-980F-48C3-BA2F-3CF534903B14} @@ -78,6 +80,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_InfoReport", "XEngi {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_Verification", "XEngine_DependLibrary\XEngine_Module\XEngine_Verification\XEngine_Verification.vcxproj", "{A8E43EC0-698A-4807-8A61-B2BE5FAB7256}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -220,6 +224,18 @@ Global {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x64.Build.0 = Release|x64 {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.ActiveCfg = Release|Win32 {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.Build.0 = Release|Win32 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|ARM64.Build.0 = Debug|ARM64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|x64.ActiveCfg = Debug|x64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|x64.Build.0 = Debug|x64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|x86.ActiveCfg = Debug|Win32 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Debug|x86.Build.0 = Debug|Win32 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|ARM64.ActiveCfg = Release|ARM64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|ARM64.Build.0 = Release|ARM64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|x64.ActiveCfg = Release|x64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|x64.Build.0 = Release|x64 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|x86.ActiveCfg = Release|Win32 + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -229,6 +245,7 @@ Global {51DCBDC7-50CB-4A44-B10B-FCF90309914D} = {2444CB54-6443-47F9-8D93-91237D0D05FB} {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {6444F125-63DE-4120-98B3-DF097A9758FA} {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {6444F125-63DE-4120-98B3-DF097A9758FA} + {A8E43EC0-698A-4807-8A61-B2BE5FAB7256} = {6444F125-63DE-4120-98B3-DF097A9758FA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E1F1DDE3-8949-41AF-84D6-03CB7CAA03AB} diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h index 3bb5043..c7a1964 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_Hdr.h @@ -60,6 +60,8 @@ using namespace std; #include "../../AuthorizeModule_CDKey/CDKey_Error.h" #include "../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" #include "../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" +#include "../../XEngine_DependLibrary/XEngine_Module/XEngine_Verification/Verification_Define.h" +#include "../../XEngine_DependLibrary/XEngine_Module/XEngine_Verification/Verification_Error.h" extern bool bIsRun; extern bool bIsTest; @@ -129,6 +131,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../x64/Debug/AuthorizeModule_Help.lib") #pragma comment(lib,"../../x64/Debug/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../x64/Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../../x64/Debug/XEngine_Verification.lib") #elif _M_ARM64 #pragma comment(lib,"../../ARM64/Debug/AuthorizeModule_Configure.lib") #pragma comment(lib,"../../ARM64/Debug/AuthorizeModule_Protocol.lib") @@ -137,6 +140,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../ARM64/Debug/AuthorizeModule_Help.lib") #pragma comment(lib,"../../ARM64/Debug/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../ARM64/Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../../ARM64/Debug/XEngine_Verification.lib") #elif _M_IX86 #pragma comment(lib,"../../Debug/AuthorizeModule_Configure.lib") #pragma comment(lib,"../../Debug/AuthorizeModule_Protocol.lib") @@ -145,6 +149,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../Debug/AuthorizeModule_Help.lib") #pragma comment(lib,"../../Debug/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../Debug/XEngine_InfoReport.lib") +#pragma comment(lib,"../../Debug/XEngine_Verification.lib") #endif #else #ifdef _M_X64 @@ -155,6 +160,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../x64/Release/AuthorizeModule_Help.lib") #pragma comment(lib,"../../x64/Release/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../x64/Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../../x64/Release/XEngine_Verification.lib") #elif _M_ARM64 #pragma comment(lib,"../../ARM64/Release/AuthorizeModule_Configure.lib") #pragma comment(lib,"../../ARM64/Release/AuthorizeModule_Protocol.lib") @@ -163,6 +169,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../ARM64/Release/AuthorizeModule_Help.lib") #pragma comment(lib,"../../ARM64/Release/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../ARM64/Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../../ARM64/Release/XEngine_Verification.lib") #elif _M_IX86 #pragma comment(lib,"../../Release/AuthorizeModule_Configure.lib") #pragma comment(lib,"../../Release/AuthorizeModule_Protocol.lib") @@ -171,6 +178,7 @@ extern XENGINE_FUNCTIONSWITCH st_FunSwitch; #pragma comment(lib,"../../Release/AuthorizeModule_Help.lib") #pragma comment(lib,"../../Release/AuthorizeModule_CDKey.lib") #pragma comment(lib,"../../Release/XEngine_InfoReport.lib") +#pragma comment(lib,"../../Release/XEngine_Verification.lib") #endif #endif #endif \ No newline at end of file diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index ee79bc4..ebfdd3e 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -84,6 +84,7 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int //HTTP验证 if (st_AuthConfig.st_XApiVer.bEnable) { + int nVType = 0; XCHAR tszUserName[64] = {}; XCHAR tszUserPass[64] = {}; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; @@ -91,14 +92,33 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int st_HDRParam.nHttpCode = 401; st_HDRParam.bIsClose = true; - if (!AuthHelp_APIHelp_HttpAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) + if (!Verification_HTTP_GetType(pptszListHdr, nHdrCount, &nVType)) { - LPCXSTR lpszHTTPHdr = _X("WWW-Authenticate: Basic realm=\"XEngine Authorize\"\r\n"); - HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHTTPHdr); + int nHDRLen = 0; + XCHAR tszHDRBuffer[XPATH_MAX] = {}; + if (1 == st_AuthConfig.st_XApiVer.nVType) + { + Verification_HTTP_BasicServerPacket(tszHDRBuffer, &nHDRLen); + } + else + { + XCHAR tszNonceStr[64] = {}; + XCHAR tszOpaqueStr[64] = {}; + Verification_HTTP_DigestServerPacket(tszHDRBuffer, &nHDRLen, tszNonceStr, tszOpaqueStr); + } + HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, AuthHelp_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_AuthConfig.st_XApiVer.nVType, AuthHelp_GetLastError()); return false; } + if (1 == nVType) + { + Verification_HTTP_Basic(tszUserName, tszUserPass, pptszListHdr, nHdrCount); + } + else if (2 == nVType) + { + Verification_HTTP_Digest("123123aa", "123123", pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 8d4fe15..702f3ce 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 8d4fe1580afe4c02f4a13a3fe21c6e77a22b18cd +Subproject commit 702f3ce5f11239d5a182fee6566e6f9037ff44d6 -- Gitee From 7a1eaffe889b0f05527505701e3585a9de34f2ec Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 19 Aug 2025 15:27:49 +0800 Subject: [PATCH 27/34] modify:http verification info --- .../XEngine_Config/XEngine_Config.json | 5 +- .../AuthorizeModule_Configure/Config_Define.h | 5 +- .../ModuleConfigure_Json.cpp | 5 +- .../Authorize_HttpTask.cpp | 51 ++++++++++++------- .../XEngine_AuthorizeService/Makefile | 4 +- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 8d957e4..e4ddb05 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -56,7 +56,10 @@ }, "XApiVer": { "bEnable": true, - "nVerType": 1 + "tszUser": "xengine", + "tszPass": "123123aa", + "tszAPIUrl": "", + "nVerType": 2 }, "XSql": { "nSQLType": 0, diff --git a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h index 186ecb7..2f2ba8b 100644 --- a/XEngine_Source/AuthorizeModule_Configure/Config_Define.h +++ b/XEngine_Source/AuthorizeModule_Configure/Config_Define.h @@ -86,8 +86,11 @@ typedef struct }st_XCrypto; struct { - bool bEnable; //是否启用HTTP接口权限验证 + XCHAR tszAPIUrl[XPATH_MID]; //验证API地址 + XCHAR tszUserName[128]; //验证用户名 + XCHAR tszUserPass[128]; //验证密码 int nVType; //验证方法,1 基本,2摘要 + bool bEnable; //是否启用HTTP接口权限验证 }st_XApiVer; struct { diff --git a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 8d1e363..49a8b12 100644 --- a/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/AuthorizeModule_Configure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -156,7 +156,7 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE pSt_ServerConfig->st_XCrypto.bEnable = st_JsonXCrypto["bEnable"].asBool(); pSt_ServerConfig->st_XCrypto.nPassword = st_JsonXCrypto["nPass"].asInt(); //接口验证 - if (st_JsonRoot["XApiVer"].empty() || (2 != st_JsonRoot["XApiVer"].size())) + if (st_JsonRoot["XApiVer"].empty() || (5 != st_JsonRoot["XApiVer"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_AUTHORIZE_MODULE_CONFIGURE_XAPIVER; @@ -165,6 +165,9 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Json::Value st_JsonXAPIVer = st_JsonRoot["XApiVer"]; pSt_ServerConfig->st_XApiVer.bEnable = st_JsonXAPIVer["bEnable"].asBool(); pSt_ServerConfig->st_XApiVer.nVType = st_JsonXAPIVer["nVerType"].asInt(); + _tcsxcpy(pSt_ServerConfig->st_XApiVer.tszUserName, st_JsonXAPIVer["tszUser"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XApiVer.tszUserPass, st_JsonXAPIVer["tszPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XApiVer.tszAPIUrl, st_JsonXAPIVer["tszAPIUrl"].asCString()); //数据库配置 if (st_JsonRoot["XSql"].empty() || (6 != st_JsonRoot["XSql"].size())) { diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index ebfdd3e..2ef68f3 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -85,41 +85,56 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int if (st_AuthConfig.st_XApiVer.bEnable) { int nVType = 0; - XCHAR tszUserName[64] = {}; - XCHAR tszUserPass[64] = {}; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; st_HDRParam.nHttpCode = 401; st_HDRParam.bIsClose = true; - + //打包验证信息 + int nHDRLen = 0; + XCHAR tszHDRBuffer[XPATH_MAX] = {}; + if (1 == st_AuthConfig.st_XApiVer.nVType) + { + Verification_HTTP_BasicServerPacket(tszHDRBuffer, &nHDRLen); + } + else + { + XCHAR tszNonceStr[64] = {}; + XCHAR tszOpaqueStr[64] = {}; + Verification_HTTP_DigestServerPacket(tszHDRBuffer, &nHDRLen, tszNonceStr, tszOpaqueStr); + } + //后去验证方法 if (!Verification_HTTP_GetType(pptszListHdr, nHdrCount, &nVType)) { - int nHDRLen = 0; - XCHAR tszHDRBuffer[XPATH_MAX] = {}; - if (1 == st_AuthConfig.st_XApiVer.nVType) - { - Verification_HTTP_BasicServerPacket(tszHDRBuffer, &nHDRLen); - } - else - { - XCHAR tszNonceStr[64] = {}; - XCHAR tszOpaqueStr[64] = {}; - Verification_HTTP_DigestServerPacket(tszHDRBuffer, &nHDRLen, tszNonceStr, tszOpaqueStr); - } HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_AuthConfig.st_XApiVer.nVType, AuthHelp_GetLastError()); return false; } + //验证方式是否一致 + if (st_AuthConfig.st_XApiVer.nVType != nVType) + { + HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); + NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式错误,请求:%d,需求:%d"), lpszClientAddr, nVType, st_AuthConfig.st_XApiVer.nVType); + return false; + } + bool bRet = false; if (1 == nVType) { - Verification_HTTP_Basic(tszUserName, tszUserPass, pptszListHdr, nHdrCount); + bRet = Verification_HTTP_Basic(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pptszListHdr, nHdrCount); } else if (2 == nVType) { - Verification_HTTP_Digest("123123aa", "123123", pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + bRet = Verification_HTTP_Digest(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + } + if (!bRet) + { + HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); + NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证处理错误,可能用户密码登信息不匹配,类型:%d"), lpszClientAddr, nVType); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,HTTP验证类型:%d 通过"), lpszClientAddr, nVType); } if (0 == _tcsxnicmp(lpszMethodPost, pSt_HTTPParament->tszHttpMethod, _tcsxlen(lpszMethodPost))) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile index f67f76f..9422394 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Makefile @@ -3,9 +3,9 @@ PLATVER = FILEEXT = LIBFLAG = LOADHDR = -I ./ -LOADSO = -L ../../XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport \ +LOADSO = -L ../../XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport -L ../../XEngine_DependLibrary/XEngine_Module/XEngine_Verification \ -L ../../AuthorizeModule_Session -L ../../AuthorizeModule_Database -L ../../AuthorizeModule_Protocol -L ../../AuthorizeModule_Configure -L ../../AuthorizeModule_Help -L ../../AuthorizeModule_CDKey -LIB = -lXEngine_InfoReport -ljsoncpp \ +LIB = -lXEngine_InfoReport -ljsoncpp -lXEngine_Verification \ -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_Cryption -lXClient_APIHelp -lNetHelp_APIAddr -lHelpComponents_Packets -lHelpComponents_DataBase -lHelpComponents_XLog -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lXEngine_ProcFile -lXEngine_SystemApi \ -lAuthorizeModule_Session -lAuthorizeModule_Database -lAuthorizeModule_Protocol -lAuthorizeModule_Configure -lAuthorizeModule_Help -lAuthorizeModule_CDKey LIBEX = -- Gitee From 78a716b7f863defc0f8aabc0b299d48a6cd519ce Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 19 Aug 2025 15:46:49 +0800 Subject: [PATCH 28/34] fixed:build failure --- XEngine_Source/Makefile | 9 ++++++++- .../XEngine_AuthorizeService/Authorize_HttpTask.cpp | 2 +- XEngine_Source/XEngine_DependLibrary | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 039598a..6844f24 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -5,6 +5,7 @@ FLAGS= DEPEND_JSONCPP_PATH = ./XEngine_DependLibrary/XEngine_Module/jsoncpp DEPEND_REPORT_PATH = ./XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport +DEPEND_VERIFICATION_PATH = ./XEngine_DependLibrary/XEngine_Module/XEngine_Verification AUTH_CDKEY_PATH = ./AuthorizeModule_CDKey AUTH_SESSION_PATH = ./AuthorizeModule_Session @@ -22,7 +23,7 @@ else ifeq ($(PLATFORM),mac) FILEEXT = dylib endif -XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so \ +XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so libXEngine_Verification.so \ libAuthorizeModule_CDKey.so libAuthorizeModule_Session.so libAuthorizeModule_Database.so libAuthorizeModule_Protocol.so libAuthorizeModule_Configure.so libAuthorizeModule_Help.so libAuthorizeModule_Client.so \ XEngine_AuthorizeApp.exe @@ -42,6 +43,12 @@ ifeq ($(FLAGS), InstallAll) else make -C $(DEPEND_REPORT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) endif +libXEngine_Verification.so: +ifeq ($(FLAGS), InstallAll) + cp $(DEPEND_VERIFICATION_PATH)/libXEngine_Verification.$(FILEEXT) ../XEngine_Release/ +else + make -C $(DEPEND_VERIFICATION_PATH) PLATFORM=$(PLATFORM) $(FLAGS) +endif libAuthorizeModule_CDKey.so: make -C $(AUTH_CDKEY_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) $(FLAGS) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index 2ef68f3..8798088 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -107,7 +107,7 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int { HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); NetCore_TCPXCore_SendEx(xhHttpSocket, lpszClientAddr, tszSDBuffer, nSDLen); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_AuthConfig.st_XApiVer.nVType, AuthHelp_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_AuthConfig.st_XApiVer.nVType, Verification_GetLastError()); return false; } //验证方式是否一致 diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 702f3ce..8970bcc 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 702f3ce5f11239d5a182fee6566e6f9037ff44d6 +Subproject commit 8970bcc172a44e943e01921ffd398594e58c8d6f -- Gitee From 953dbab0f957bbcc30ed37772188a4d4319c93f4 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 20 Aug 2025 10:10:06 +0800 Subject: [PATCH 29/34] fixed:serial insert not support expired time --- .../DBModule_MySQL/DBModule_MySQL.cpp | 17 +++++++++++------ .../DBModule_MySQL/DBModule_MySQL.h | 2 +- .../DBModule_SQLite/DBModule_SQLite.cpp | 17 +++++++++++------ .../DBModule_SQLite/DBModule_SQLite.h | 2 +- .../AuthorizeModule_Database/Database_Define.h | 15 ++++++++++++--- XEngine_Source/AuthorizeModule_Database/pch.cpp | 8 ++++---- .../AuthorizeModule_Protocol/Protocol_Define.h | 7 ++++++- .../Protocol_Parse/Protocol_Parse.cpp | 12 +++++++++++- .../Protocol_Parse/Protocol_Parse.h | 2 +- XEngine_Source/AuthorizeModule_Protocol/pch.cpp | 4 ++-- .../AuthorizeHTTP_Post/AuthorizeHTTP_Serial.cpp | 16 +++++++--------- 11 files changed, 67 insertions(+), 35 deletions(-) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp index d03a980..0992d0e 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.cpp @@ -654,12 +654,17 @@ bool CDBModule_MySQL::DBModule_MySQL_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lp 类型:常量字符指针 可空:N 意思:要插入的序列号 + 参数.二:lpszExpiredTime + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:过期日期 返回值 类型:逻辑型 意思:是否插入成功 备注: *********************************************************************/ -bool CDBModule_MySQL::DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber) +bool CDBModule_MySQL::DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime) { SQLPacket_IsErrorOccur = false; @@ -682,26 +687,26 @@ bool CDBModule_MySQL::DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber) } if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_SECOND == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW())"), lpszSerialNumber, st_AuthTimer.wSecond, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW(),'%s')"), lpszSerialNumber, st_AuthTimer.wSecond, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_DAY == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW())"), lpszSerialNumber, st_AuthTimer.wDay, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW(),'%s')"), lpszSerialNumber, st_AuthTimer.wDay, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_TIME == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW())"), lpszSerialNumber, st_AuthTimer.wFlags, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%d','%d',0,NOW(),'%s')"), lpszSerialNumber, st_AuthTimer.wFlags, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_CUSTOM == enAuthSerialType) { XCHAR tszLeftTime[XPATH_MAX]; memset(tszLeftTime, '\0', XPATH_MAX); _xstprintf(tszLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_AuthTimer.wYear, st_AuthTimer.wMonth, st_AuthTimer.wDay, st_AuthTimer.wHour, st_AuthTimer.wMinute, st_AuthTimer.wSecond); - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%s','%d',0,NOW())"), lpszSerialNumber, tszLeftTime, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s','%s','%d',0,NOW(),'%s')"), lpszSerialNumber, tszLeftTime, enAuthSerialType, lpszExpiredTime); } else { - _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s',0,'%d',0,NOW())"), lpszSerialNumber, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO `Authorize_Serial` values(NULL,'NOT','%s',0,'%d',0,NOW(),'%s')"), lpszSerialNumber, enAuthSerialType, lpszExpiredTime); } if (!DataBase_MySQL_Execute(xhData, tszSQLStatement)) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h index 1f0986b..faed785 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_MySQL/DBModule_MySQL.h @@ -33,7 +33,7 @@ public: bool DBModule_MySQL_UserLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); bool DBModule_MySQL_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); public: - bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber); //插入序列卡 + bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime); //插入序列卡 bool DBModule_MySQL_SerialDelete(LPCXSTR lpszSerialNumber); //删除一个序列号 bool DBModule_MySQL_SerialQuery(LPCXSTR lpszSerialNumber, LPAUTHREG_SERIALTABLE pSt_SerialTable = NULL); //按照卡号或者用户查询 bool DBModule_MySQL_SerialQueryAll(AUTHREG_SERIALTABLE*** pppSt_SerialTable, int* pInt_ListCount, int nPosStart, int nPosEnd);//查询所有序列卡 diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp index f63079f..81e7bd1 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.cpp @@ -605,12 +605,17 @@ bool CDBModule_SQLite::DBModule_SQLite_QueryLogin(LPCXSTR lpszUserName, LPCXSTR 类型:常量字符指针 可空:N 意思:要插入的序列号 + 参数.二:lpszExpiredTime + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:过期日期 返回值 类型:逻辑型 意思:是否插入成功 备注: *********************************************************************/ -bool CDBModule_SQLite::DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber) +bool CDBModule_SQLite::DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime) { SQLPacket_IsErrorOccur = false; @@ -633,26 +638,26 @@ bool CDBModule_SQLite::DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber) } if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_SECOND == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, st_AuthTimer.wSecond, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'),'%s')"), lpszSerialNumber, st_AuthTimer.wSecond, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_DAY == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, st_AuthTimer.wDay, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'),'%s')"), lpszSerialNumber, st_AuthTimer.wDay, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_TIME == enAuthSerialType) { - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, st_AuthTimer.wFlags, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%d','%d',0,datetime('now', 'localtime'),'%s')"), lpszSerialNumber, st_AuthTimer.wFlags, enAuthSerialType, lpszExpiredTime); } else if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_CUSTOM == enAuthSerialType) { XCHAR tszLeftTime[XPATH_MAX]; memset(tszLeftTime, '\0', XPATH_MAX); _xstprintf(tszLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_AuthTimer.wYear, st_AuthTimer.wMonth, st_AuthTimer.wDay, st_AuthTimer.wHour, st_AuthTimer.wMinute, st_AuthTimer.wSecond); - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%s','%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, tszLeftTime, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s','%s','%d',0,datetime('now', 'localtime'),'%s')"), lpszSerialNumber, tszLeftTime, enAuthSerialType, lpszExpiredTime); } else { - _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s',0,'%d',0,datetime('now', 'localtime'))"), lpszSerialNumber, enAuthSerialType); + _xstprintf(tszSQLStatement, _X("INSERT INTO Authorize_Serial values(NULL,'NOT','%s',0,'%d',0,datetime('now', 'localtime'),'%s')"), lpszSerialNumber, enAuthSerialType, lpszExpiredTime); } if (!DataBase_SQLite_Exec(xhData, tszSQLStatement)) diff --git a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h index bfc3ee7..edf0127 100644 --- a/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h +++ b/XEngine_Source/AuthorizeModule_Database/DBModule_SQLite/DBModule_SQLite.h @@ -33,7 +33,7 @@ public: bool DBModule_SQLite_UserLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); bool DBModule_SQLite_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUserAddr); public: - bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber); //插入序列卡 + bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime); //插入序列卡 bool DBModule_SQLite_SerialDelete(LPCXSTR lpszSerialNumber); //删除一个序列号 bool DBModule_SQLite_SerialQuery(LPCXSTR lpszSerialNumber,LPAUTHREG_SERIALTABLE pSt_SerialTable = NULL); //按照卡号或者用户查询 bool DBModule_SQLite_SerialQueryAll(AUTHREG_SERIALTABLE ***pppSt_SerialTable,int *pInt_ListCount, int nPosStart, int nPosEnd);//查询所有序列卡 diff --git a/XEngine_Source/AuthorizeModule_Database/Database_Define.h b/XEngine_Source/AuthorizeModule_Database/Database_Define.h index b4b8dd0..b5d951c 100644 --- a/XEngine_Source/AuthorizeModule_Database/Database_Define.h +++ b/XEngine_Source/AuthorizeModule_Database/Database_Define.h @@ -219,12 +219,17 @@ extern "C" bool DBModule_SQLite_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUse 类型:常量字符指针 可空:N 意思:要插入的序列号 + 参数.二:lpszExpiredTime + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:过期日期 返回值 类型:逻辑型 意思:是否插入成功 备注: *********************************************************************/ -extern "C" bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber); +extern "C" bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime); /******************************************************************** 函数名称:DBModule_SQLite_SerialDelete 函数功能:从数据库删除指定序列号 @@ -547,7 +552,6 @@ extern "C" bool DBModule_SQLite_AnnouncementDelete(AUTHREG_ANNOUNCEMENT* pSt_Ann 备注: *********************************************************************/ extern "C" bool DBModule_SQLite_AnnouncementList(AUTHREG_ANNOUNCEMENT*** ppppSt_Announcement, int* pInt_ListCount); - /************************************************************************/ /* MYSQL数据库服务导出函数 */ /************************************************************************/ @@ -713,12 +717,17 @@ extern "C" bool DBModule_MySQL_UserList(AUTHREG_USERTABLE*** pppSt_UserInfo, int 类型:常量字符指针 可空:N 意思:要插入的序列号 + 参数.二:lpszExpiredTime + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:过期日期 返回值 类型:逻辑型 意思:是否插入成功 备注: *********************************************************************/ -extern "C" bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber); +extern "C" bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime); /******************************************************************** 函数名称:DBModule_MySQL_SerialDelete 函数功能:从数据库删除指定序列号 diff --git a/XEngine_Source/AuthorizeModule_Database/pch.cpp b/XEngine_Source/AuthorizeModule_Database/pch.cpp index 7fe6db0..3467a41 100644 --- a/XEngine_Source/AuthorizeModule_Database/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Database/pch.cpp @@ -75,9 +75,9 @@ extern "C" bool DBModule_SQLite_QueryLogin(LPCXSTR lpszUserName, LPCXSTR lpszUse { return m_DBSQLite.DBModule_SQLite_QueryLogin(lpszUserName, lpszUserAddr); } -extern "C" bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber) +extern "C" bool DBModule_SQLite_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime) { - return m_DBSQLite.DBModule_SQLite_SerialInsert(lpszSerialNumber); + return m_DBSQLite.DBModule_SQLite_SerialInsert(lpszSerialNumber, lpszExpiredTime); } extern "C" bool DBModule_SQLite_SerialDelete(LPCXSTR lpszSerialNumber) { @@ -190,9 +190,9 @@ extern "C" bool DBModule_MySQL_UserList(AUTHREG_USERTABLE*** pppSt_UserInfo, int { return m_DBMySQL.DBModule_MySQL_UserList(pppSt_UserInfo, pInt_ListCount, nPosStart, nPosEnd); } -extern "C" bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber) +extern "C" bool DBModule_MySQL_SerialInsert(LPCXSTR lpszSerialNumber, LPCXSTR lpszExpiredTime) { - return m_DBMySQL.DBModule_MySQL_SerialInsert(lpszSerialNumber); + return m_DBMySQL.DBModule_MySQL_SerialInsert(lpszSerialNumber, lpszExpiredTime); } extern "C" bool DBModule_MySQL_SerialDelete(LPCXSTR lpszSerialNumber) { diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h index bae3758..dfb945b 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Define.h @@ -632,12 +632,17 @@ extern "C" bool Protocol_Parse_HttpParseSerial(LPCXSTR lpszMsgBuffer, int nMsgLe 类型:字符指针 可空:N 意思:导出拥有时间 + 参数.七:ptszExpiredTime + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出过期时间 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE * penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR * ptszHasTime); +extern "C" bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE * penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR * ptszHasTime, XCHAR* ptszExpiredTime); /******************************************************************** 函数名称:Protocol_Parse_HttpParseOnline 函数功能:解析在线列表 diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp index 7a15923..536774d 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.cpp @@ -634,12 +634,17 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseSerial(LPCXSTR lpszMsgBuffer, int 类型:字符指针 可空:N 意思:导出拥有时间 + 参数.七:ptszExpiredTime + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出过期时间 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocol_Parse::Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE* penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR* ptszHasTime) +bool CProtocol_Parse::Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE* penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR* ptszHasTime, XCHAR* ptszExpiredTime) { Protocol_IsErrorOccur = false; @@ -666,6 +671,11 @@ bool CProtocol_Parse::Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int *pInt_NumberCount = st_JsonObject["nNumberCount"].asInt(); *pInt_SerialCount = st_JsonObject["nSerialCount"].asInt(); _tcsxcpy(ptszHasTime, st_JsonObject["tszHasTime"].asCString()); + + if (!st_JsonObject["tszExpiredTime"].isNull()) + { + _tcsxcpy(ptszExpiredTime, st_JsonObject["tszExpiredTime"].asCString()); + } return true; } /******************************************************************** diff --git a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h index 19de9e3..b3ff682 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h +++ b/XEngine_Source/AuthorizeModule_Protocol/Protocol_Parse/Protocol_Parse.h @@ -26,7 +26,7 @@ public: bool Protocol_Parse_HttpParseTry(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_TEMPVER* pSt_NETTry); bool Protocol_Parse_HttpParseTable(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_USERTABLE* pSt_UserTable); bool Protocol_Parse_HttpParseSerial(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_SERIALTABLE*** pppSt_SerialTable, int* pInt_ListCount); - bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE* penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR* ptszHasTime); + bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE* penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR* ptszHasTime, XCHAR* ptszExpiredTime); bool Protocol_Parse_HttpParseOnline(LPCXSTR lpszMsgBuffer, int nMsgLen, bool* pbOnline); bool Protocol_Parse_HttpParseTime(LPCXSTR lpszMsgBuffer, int nMsgLen, AUTHREG_PROTOCOL_TIME* pSt_ProtocolTime); bool Protocol_Parse_HttpParseSwitch(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_FUNCTIONSWITCH* pSt_FunSwitch); diff --git a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp index 1005b4b..fe25099 100644 --- a/XEngine_Source/AuthorizeModule_Protocol/pch.cpp +++ b/XEngine_Source/AuthorizeModule_Protocol/pch.cpp @@ -118,9 +118,9 @@ extern "C" bool Protocol_Parse_HttpParseSerial(LPCXSTR lpszMsgBuffer, int nMsgLe { return m_ProtocolParse.Protocol_Parse_HttpParseSerial(lpszMsgBuffer, nMsgLen, pppSt_SerialTable, pInt_ListCount); } -extern "C" bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE * penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR * ptszHasTime) +extern "C" bool Protocol_Parse_HttpParseSerial2(LPCXSTR lpszMsgBuffer, int nMsgLen, ENUM_AUTHORIZE_MODULE_SERIAL_TYPE * penSerialType, int* pInt_NumberCount, int* pInt_SerialCount, XCHAR * ptszHasTime, XCHAR* ptszExpiredTime) { - return m_ProtocolParse.Protocol_Parse_HttpParseSerial2(lpszMsgBuffer, nMsgLen, penSerialType, pInt_NumberCount, pInt_SerialCount, ptszHasTime); + return m_ProtocolParse.Protocol_Parse_HttpParseSerial2(lpszMsgBuffer, nMsgLen, penSerialType, pInt_NumberCount, pInt_SerialCount, ptszHasTime, ptszExpiredTime); } extern "C" bool Protocol_Parse_HttpParseOnline(LPCXSTR lpszMsgBuffer, int nMsgLen, bool * pbOnline) { diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Serial.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Serial.cpp index 4510318..9bb881b 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Serial.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/AuthorizeHTTP_Post/AuthorizeHTTP_Serial.cpp @@ -49,14 +49,12 @@ bool XEngine_AuthorizeHTTP_Serial(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, L { int nNumberCount = 0; int nSerialCount = 0; - XCHAR tszHasTime[128]; - XENGINE_LIBTIME st_AuthTimer; - ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType; + XCHAR tszHasTime[128] = {}; + XCHAR tszExpiredTime[128] = {}; + XENGINE_LIBTIME st_AuthTimer = {}; + ENUM_AUTHORIZE_MODULE_SERIAL_TYPE enSerialType = {}; - memset(&st_AuthTimer, '\0', sizeof(st_AuthTimer)); - memset(tszHasTime, '\0', sizeof(tszHasTime)); - - Protocol_Parse_HttpParseSerial2(lpszMsgBuffer, nMsgLen, &enSerialType, &nNumberCount, &nSerialCount, tszHasTime); + Protocol_Parse_HttpParseSerial2(lpszMsgBuffer, nMsgLen, &enSerialType, &nNumberCount, &nSerialCount, tszHasTime, tszExpiredTime); //解析类型 if (ENUM_AUTHORIZE_MODULE_SERIAL_TYPE_SECOND == enSerialType) { @@ -102,14 +100,14 @@ bool XEngine_AuthorizeHTTP_Serial(LPCXSTR lpszClientAddr, LPCXSTR lpszAPIName, L { for (int i = 0; i < nSerialCount; i++) //导入序列卡 { - DBModule_SQLite_SerialInsert(pptszSerialNumber[i]); + DBModule_SQLite_SerialInsert(pptszSerialNumber[i], tszExpiredTime); } } else { for (int i = 0; i < nSerialCount; i++) { - DBModule_MySQL_SerialInsert(pptszSerialNumber[i]); + DBModule_MySQL_SerialInsert(pptszSerialNumber[i], tszExpiredTime); } } BaseLib_Memory_Free((XPPPMEM)&pptszSerialNumber, nSerialCount); -- Gitee From c90aae5b575981555807a0cf737c448a54af9d06 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 20 Aug 2025 11:18:20 +0800 Subject: [PATCH 30/34] update:sql file --- XEngine_SQL/mysql.sql | 15 ++++++++------- XEngine_SQL/sqlite.sql | 27 ++++++++++++++------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/XEngine_SQL/mysql.sql b/XEngine_SQL/mysql.sql index 492ed2b..4944cb6 100644 --- a/XEngine_SQL/mysql.sql +++ b/XEngine_SQL/mysql.sql @@ -1,17 +1,17 @@ /* Navicat Premium Dump SQL - Source Server : mysql + Source Server : QQCloud Source Server Type : MySQL - Source Server Version : 80041 (8.0.41-0ubuntu0.24.04.1) - Source Host : 10.0.2.6:3306 - Source Schema : XEngine_Authorize + Source Server Version : 80043 (8.0.43-0ubuntu0.24.04.1) + Source Host : 118.25.14.242:3306 + Source Schema : authorize Target Server Type : MySQL - Target Server Version : 80041 (8.0.41-0ubuntu0.24.04.1) + Target Server Version : 80043 (8.0.43-0ubuntu0.24.04.1) File Encoding : 65001 - Date: 26/02/2025 14:14:00 + Date: 20/08/2025 11:17:20 */ SET NAMES utf8mb4; @@ -74,7 +74,7 @@ CREATE TABLE `Authorize_Login` ( `UserName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `UserAddr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `UserTime` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of Authorize_Login @@ -92,6 +92,7 @@ CREATE TABLE `Authorize_Serial` ( `CardSerialType` int NULL DEFAULT NULL, `bIsUsed` tinyint(1) NULL DEFAULT NULL, `CreateTime` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `ExpiredTime` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL, PRIMARY KEY (`ID`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; diff --git a/XEngine_SQL/sqlite.sql b/XEngine_SQL/sqlite.sql index d0532cd..d100110 100644 --- a/XEngine_SQL/sqlite.sql +++ b/XEngine_SQL/sqlite.sql @@ -1,7 +1,7 @@ /* Navicat Premium Dump SQL - Source Server : Authorize + Source Server : auth Source Server Type : SQLite Source Server Version : 3045000 (3.45.0) Source Schema : main @@ -10,7 +10,7 @@ Target Server Version : 3045000 (3.45.0) File Encoding : 65001 - Date: 26/02/2025 14:13:16 + Date: 20/08/2025 11:10:20 */ PRAGMA foreign_keys = false; @@ -87,7 +87,8 @@ CREATE TABLE "Authorize_Serial" ( "MaxTime" TEXT, "CardSerialType" integer, "bIsUsed" boolean, - "CreateTime" TEXT NOT NULL + "CreateTime" TEXT NOT NULL, + "ExpiredTime" DATE ); -- ---------------------------- @@ -147,35 +148,35 @@ CREATE TABLE "sqlite_sequence" ( -- ---------------------------- -- Records of sqlite_sequence -- ---------------------------- -INSERT INTO "sqlite_sequence" VALUES ('Authorize_BannedUser', 7); -INSERT INTO "sqlite_sequence" VALUES ('Authorize_BannedAddr', 6); -INSERT INTO "sqlite_sequence" VALUES ('Authorize_TempVer', 4); -INSERT INTO "sqlite_sequence" VALUES ('Authorize_Serial', 22); -INSERT INTO "sqlite_sequence" VALUES ('Authorize_User', 20); +INSERT INTO "sqlite_sequence" VALUES ('Authorize_BannedUser', 0); +INSERT INTO "sqlite_sequence" VALUES ('Authorize_BannedAddr', 0); +INSERT INTO "sqlite_sequence" VALUES ('Authorize_TempVer', 0); +INSERT INTO "sqlite_sequence" VALUES ('Authorize_User', 1); +INSERT INTO "sqlite_sequence" VALUES ('Authorize_Serial', 0); -- ---------------------------- -- Auto increment value for Authorize_BannedAddr -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_BannedAddr'; +UPDATE "sqlite_sequence" SET seq = 0 WHERE name = 'Authorize_BannedAddr'; -- ---------------------------- -- Auto increment value for Authorize_BannedUser -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_BannedUser'; +UPDATE "sqlite_sequence" SET seq = 0 WHERE name = 'Authorize_BannedUser'; -- ---------------------------- -- Auto increment value for Authorize_Serial -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_Serial'; +UPDATE "sqlite_sequence" SET seq = 0 WHERE name = 'Authorize_Serial'; -- ---------------------------- -- Auto increment value for Authorize_TempVer -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_TempVer'; +UPDATE "sqlite_sequence" SET seq = 0 WHERE name = 'Authorize_TempVer'; -- ---------------------------- -- Auto increment value for Authorize_User -- ---------------------------- -UPDATE "sqlite_sequence" SET seq = 2 WHERE name = 'Authorize_User'; +UPDATE "sqlite_sequence" SET seq = 1 WHERE name = 'Authorize_User'; PRAGMA foreign_keys = true; -- Gitee From 3bfd0031e68a987dafc7e9da0c73622d09abd6f9 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 20 Aug 2025 11:19:03 +0800 Subject: [PATCH 31/34] added:get user and pass by restful api for http verification --- .../Authorize_HttpTask.cpp | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp index 8798088..0f47080 100644 --- a/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp +++ b/XEngine_Source/XEngine_APPService/XEngine_AuthorizeService/Authorize_HttpTask.cpp @@ -119,14 +119,59 @@ bool XEngine_Client_HttpTask(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int return false; } bool bRet = false; - if (1 == nVType) + //通过什么方法获得用户密码 + if (_tcsxlen(st_AuthConfig.st_XApiVer.tszAPIUrl) > 0) { - bRet = Verification_HTTP_Basic(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pptszListHdr, nHdrCount); + int nHTTPCode = 0; + int nMSGLen = 0; + XCLIENT_APIHTTP st_APIHttp = {}; + XCHAR* ptszMSGBuffer = NULL; + if (!APIClient_Http_Request(_X("GET"), st_AuthConfig.st_XApiVer.tszAPIUrl, NULL, &nHTTPCode, &ptszMSGBuffer, &nMSGLen, NULL, NULL, &st_APIHttp)) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_UNAUTHORIZE, "api server is down,cant verification"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误码:%lX"), lpszClientAddr, st_AuthConfig.st_XApiVer.tszAPIUrl, APIClient_GetLastError()); + return false; + } + if (200 != nHTTPCode) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_UNAUTHORIZE, "api server is down,cant verification"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误:%d"), lpszClientAddr, st_AuthConfig.st_XApiVer.tszAPIUrl, nHTTPCode); + return false; + } + AUTHORIZE_PROTOCOL_USERAUTHEX st_UserAuth = {}; + if (!Protocol_Parse_HttpParseAuth(ptszMSGBuffer, nMsgLen, &st_UserAuth)) + { + Protocol_Packet_HttpComm(tszSDBuffer, &nSDLen, ERROR_AUTHORIZE_PROTOCOL_UNAUTHORIZE, "api server reply failure,cant verification"); + XEngine_Client_TaskSend(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_AUTH_APP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,返回内容:%s 错误,无法继续"), lpszClientAddr, ptszMSGBuffer); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer); + return false; + } + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer); + + if (1 == nVType) + { + bRet = Verification_HTTP_Basic(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pptszListHdr, nHdrCount); + } + else if (2 == nVType) + { + bRet = Verification_HTTP_Digest(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + } } - else if (2 == nVType) + else { - bRet = Verification_HTTP_Digest(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + if (1 == nVType) + { + bRet = Verification_HTTP_Basic(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pptszListHdr, nHdrCount); + } + else if (2 == nVType) + { + bRet = Verification_HTTP_Digest(st_AuthConfig.st_XApiVer.tszUserName, st_AuthConfig.st_XApiVer.tszUserPass, pSt_HTTPParament->tszHttpMethod, pptszListHdr, nHdrCount); + } } + if (!bRet) { HttpProtocol_Server_SendMsgEx(xhHttpPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer); -- Gitee From e6fd66c19050d631e81d0eb22657413845a9ea87 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 21 Aug 2025 09:25:54 +0800 Subject: [PATCH 32/34] update:read me and document --- CHANGELOG | 32 ++++++++++++++++++++++++++++++++ README.en.md | 9 ++++----- README.md | 9 ++++----- XEngine_Docment/Docment_en.docx | Bin 149625 -> 151007 bytes XEngine_Docment/Docment_zh.docx | Bin 155751 -> 157216 bytes 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e4f183a..ab2bd72 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,35 @@ +XEngine_Authorize V3.19.0.1001 + +added:more system support +added:storage log support and use to user pay +added:set color for key log +added:hardware code bind with login and register +added:hardware bind switch app support +added:serial expired time support +added:http basic and digest support +update:depend library +update:match xengine last version +improved:parameter command +modify:adjust windows app list size +modify:depend library directory name +modify:start parameter are not case sensitive +fixed:sometime configure read memory leak + +增加:更新系统支持 +增加:强日志支持并且设置用户支付日志为强日志 +增加:设置关键日志输出颜色 +增加:支持登录注册硬件绑定 +增加:支持管理程序修改绑定登录注册 +增加:序列号过期支持 +增加:http接口基本和摘要验证 +更新:依赖库 +更新:匹配最新xengine版本 +优化:参数命令 +修改:调整管理程序窗口列表大小 +修改:依赖库目录名 +修改:启动参数不在区分大小写 +修正:某些时候配置读取内存溢出 +================================================================ XEngine_Authorize V3.18.0.1001 added:more system release support diff --git a/README.en.md b/README.en.md index ddca58a..91ffc1c 100644 --- a/README.en.md +++ b/README.en.md @@ -49,6 +49,7 @@ feature list: 17. announecement management 18. support dynamic verifaction code 19. support mulit login and merge time +20. user bind hardware code ## install @@ -74,12 +75,10 @@ Just Run it,use XEngine_AuthorizeService XEngine_AuthorizeApp is pc management tools #### Linux -use makefile compile,UBUNTU22.04 or above -Run it on the terminal,use XEngine_AuthorizeService +use makefile compile,Run it on the terminal,use XEngine_AuthorizeService #### Macos -use makefile compile,mac 13 and above -Run it on the terminal,use XEngine_AuthorizeService +use makefile compile,Run it on the terminal,use XEngine_AuthorizeService ##### compile command execute command in XEngine_Source path @@ -132,7 +131,7 @@ The V3 version is a new version, developed to meet the requirements of many envi ## update guide Database update Use Navicat and other database software to open the judgment table and the different fields for modification After modification, directly copy the database to the new version to overwrite, and modify your configuration file -3.11->3.12 A new time field has been added to the user table, please refer to the SQL file +new db field for serial table by V3.19 ## Follow us If you think this software is helpful to you, please give us a START diff --git a/README.md b/README.md index 407def2..cd904d7 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ c c++network Authorize service 17. 支持公告管理 18. 支持动态验证码登录 19. 支持多端登录和合并用时 +20. 用户绑定硬件码登录 ## 架构预览 XEngine_Authorize @@ -83,12 +84,10 @@ git submodule update XEngine_AuthorizeApp为PC端管理工具 #### Linux -Linux使用Makefile编译,UBUNTU22.04或者以上系统 -在控制台运行,使用XEngine_AuthorizeService +Linux使用Makefile编译,在控制台运行,使用XEngine_AuthorizeService #### Macos -使用makefile编译,控制台运行,需要mac 13以及以上版本 -在控制台运行,使用XEngine_AuthorizeService +使用makefile编译,在控制台运行,使用XEngine_AuthorizeService ##### 编译命令 在XEngine_Source目录下执行命令 @@ -143,7 +142,7 @@ V3版本为全新版本,为了适应过多环境要求开发 ## 更新指导 数据库更新使用Navicat等数据库软件打开判断表和字段不同的地方进行修改 修改完毕后直接把数据库拷贝到新的版本进行覆盖,修改你的配置文件即可 -3.11->3.12用户表增加了新的时间字段,请参考SQL文件 +3.19新增加了序列号过期字段 ## 视频教程 你也可以观看视频教程来了解我们的代码框架情况:https://www.bilibili.com/video/BV1iF4m177aG diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index ba57e4b09a3101cc1928d35eb729cac30fdd2b70..dc7d0543e19ec1ce7730625ca987bfbb1d3e48a8 100644 GIT binary patch delta 126818 zcmXtfWmFzrtS-^&98Vf!n#d=6d&17nHJ8CsNcj0Z z2Y3a}+R)xSYN-ohvn;3m^_**?16MdyHjEW_DJ z19Dw#w6@7G8ZTq{LU#kVBvLn5V{+L4dVt_+%maj7H{n8Y;g>I8I(5JMIw-9mIBGP( zD{G_oU!JH-SLjOf63AO?d~4B--vE($wUHI*N;i#LI<9snm}1=onoGCBIlY;Cy&0hv z=4gyndGw4C#mE}%hb_U^~rn^G~|{oKQ`*gZ1x!zMV> z*Lv^S7u{>OFnpZ1)zwr=b=FV>P64RlN~n6vrRqA(6vIT*_SB7fJ0YtTk)Eg00 zl&z(jYq7uXGD^QQY4iVq6Ipy9_6w`h7#%fxJlioGsN9@JxLzkhW(csEwTSpOg%e<) zo3BM(!&L3bvVJ9-h%HbtvsB!DD!z};FxAFBXFp@o&`wQ%qP}v9Yoh<<@ECwJO+xI1 z&#PFS@M(oh&fJSU9$P$gjE5<4_LFRXq-lqy0V9S1EyR(8;Ki%R7o8=A$FXId7Zz=5 zsPHL0N6IU*YdqNz;1w+0TC@Msojx};`~N&v;j@5L!=aNjqM z!vz#FvoJSH1rji)I22UBx3s?^g`aZsTsxMyYZ6drnjR*eoc?}cP_1SM< z^^-A-8R)5klc3m*{w*B=^$4-|3E;j|0Q4VEGYkZfXHV}^Vuj{swPXQSPtYO>>r$!f9+f5N+--nH9=RpO`Vx$$i6q05rf&}{Hn z$nn#Ba#QCRPoNEsEsHa?S@pg7|#5b&AnL3gl3mb{*#*;vC zL#_{fv#uEbo;hKTM3_pIu_+Hq$&@M~Ht%_|&PXWW8k!U0<16S0Bcu=qTh1@cr}S+bjhbqeJ6X&JkMj+Q?nxw!H+EK=2s+BgU2Yg z8f;0$0-eIlX;qHlqn>!rGu^f*jerY%h)ok$OGWazpYVq0F6JWipEkS3sAHYrl1+)a zpIG*r3PeITT#HsVs<0iA&lRpYx*NVK$juk!$P1hsfaH`$<9H(HZ#NBr(UT(=l|Zds zhCvsJ>{P{j??r>L`Jc6~?Aj2(TQ8$m*OBclecz%{D@pln=>Whm`Gq+Z)A}{(w!Aw7! zybTGL>MqgBLp1}u%@Urt{nK3B;OruhXWX&C8Aq3om{*;9+SY=dAH(Ewv^G^O{EW@lgEkN~<3Izd@`0+4`Fj5KFOmhowZc9G z{AFK7yDCK@=G$Sa3^RjR;Vsa`#X1+;&dDk1*$KJozKe6v{RH~7s4ey!E)!l9-s~5A zn%>8?AQxx&MdxzTmD`$yXt5NGZ=XAw!PNX&vSXS&2I7bZ;`PWMgfI9PwT?e6`^Zg8B9f&MBzGFEwaE~7_BBxLs_$DOu5cl_$Vc<-OpX%?czx%5}E2{)m zuRJ}Ft+ZLI^CKkq*9HDDDBqC0(j%XmFn|ut8m*EUS(6ZYq2(B20rC`ih^HYA=uy>& zXb*5TdLl5UInsXad8&R==bJ`nluJMnyXYI$gI*6OapTC4%BTdd)tro7MQ z+=NKZ7rM)Fu%Ro+L?o%H=aye=7FQPxr-}6KgA_OUG&yfs%a;2`@nf0H-wS>f?Vc?ySia-w9k9z_`_cN)spnVL5u z(>lLCD!gkp^$oS&cNRrtA&*+uIMy#Yqo}K5X={8+*FLh+a$%pF;ny#>7YM^H%GL{F zF~FK`DDUaBvOE4vYyS;N(En*TH(J=y+eeX80>br#Y0rwJt_=!sou8x28c|~)#w_8T z3sqZFPP2SuesM%Mi`8B}`cS;H;tJH1_ElzTan)0Er)aai(b(;P4Z~GC?^LMT3Vb%& zwdWOBr2x%_&AFY^}gM;hY%*SNYKX!8S5p;pXMt4~2zzlJUp;~2P-HUF#r1}16 z(x`MjTmm}RNff}~`Pl+CoHn;3s=#g)#>s)cC%z@SJVC?)8LcU6TA-r;juChfPo;Mt>eDyBOpXEPTQF@KdFTG$0IGt@HxzH@@5q+|FxOsX)bn zdRAD{l);;uju7lRJwylMU)Rl9IR&TI^w?b%*|e1c%~R=5zM9*W5InM5(Flh`9nhIg zz1*&%O1sb)*K_{VfA@QPfnbiXz#GMi5>K=< zK^^a37eMji1o zGIIY`^v-a=8(5`JNkq|_a=4Mns~0*+SH$=qD&_Da0OR)u>J4}h?TXTapYPs4LpACa~xW%qS9S>C(8x#VfuK6Q}OS zZZDn1OZvMirVOWrc?ct*;@+{d2CLEiPftMXhCzgQx`rRUYM1?HX@j>SI2i=d$q&)T6n)SS;da zq>h)LFNz^fxTuo&Bd0N~PYcw~sH(}wPZ?JD_;=I}iMz(8Ld~x#>ec~a=Gxh*3+0Ns z8u%tEYQ@@teH&>fqCaE@+?MUXO$v5DN;x3y%#ij!!l`QxF}M%9u9t0RE{9nE+fnKE zbk9VlXHXMI8i(cd&m8>Ejf5TaHm@)`#L#@$;R->-& zKwMQD8p0@-G;p!Pnyd4c_4b^x`H(@2u13$4*W;ofpEvAB3=n%!u!JUk6Hb~ES@|~$ zi-Fx{VOPRkftyH$&Wev{oqYglhbvQ9eRruE34WHe{|U}b+$j2zr&w2;)t@KGa4LS1 zg6ll1Mxee|HDk*u%602e$^)rZdCRk$4J(I4p~1@A>?l1r+*TN+m@pfeo_3z%bFvj4 z=9KUcuOL3c9)Lg!r_mR!ts&~%B}Dc|llNM~t@MqL1$`+;-e{GEAv}T?d+Q$R7M@t4 z|Bd=ZOZiHOS(wkQl~zH4SEqRx(buhZ-pNpmI4d+Y&y4YW)-BKftZhnI{C~L@O9mZ} z=QU&4P4f*EX$BVQJ#9b!rBT*(T+sSHYq&+@J--*d z%Y!a@3bJYBg#yJyoaR#Ti-2Mb@Ll&%r|wOE=kf?!tu+4ZH}yZwYMBgCPdq_uZ3yD2 z_61~Z%yX%r8=E5fQ6_3?#N3k3`}>nOC|7fwT(S@=so1~MMkma({q7UTIwa!9!CehHK*Ps#=EF#3tYoPwCb=lm z17mODECoVdnNez(O?#26ybiHc`rN(8t$b!`Zu5c*i*?)|$c6=~`i@W}?cGL5iFhq! zVq(uoHQg~EDLCjlB-{ipj6-5fB?$f{a(IdOEh~`e>Dk4(UU`r(rt6cpQpX{#qdsDF7;F(WQKwpv z?t{%b$=&=XokjAn(P1W{PS%}J_4IT!8vX}`{IufHHnNyv|9gp#8(AN?b_+Kx5OB`& z#~zp9UaVCD{k&Mtwm=gZulGC)_;3wt-%0n$bm$V;q^g?M+`FHpu8_(;O#K-y`DaQ0 z{nxBH;|qc5xO4xLddzlf(Qum^=Urt~T zMG@qh3X{hd)hMM^ zCk)K};hv97>oU(ZwJ4lo0xj?L-`$)MUV@jh4|dV+6JW8D2YB3E`Ub!%4l`|}zM6)# zl00I%60k0@bx?m-A#~@{tZ@E-+Z!QMQqeYfsCg?Ai@JdqZZWG_`5eoOZLzhg z@%V$+??OSql<|Xna5N3cFl8DNKd1uYmP2Tfzsx#pp;5}TF_^s%lGyscO%K!f|3`v~ zpI9Mu%OOSylBeIB*KsNIVkioRLQAa33Kyt|zdICs_5DAr$YeOd;K?4$I)EHWBdEjs z%dU9Q4koDL??in@)m=@XBYkU3sbP9Dur`gJ|GeIoW*A)Y;b$1SJaDo=PLpodNjJQ| z{Q{W9{yVZY;aPYGd-f2a5W_Y<-v*hXo0dMJhE#}$Ne4pp*)oMNaB^2ETrxEl`i$`W z$KeLLSa~qG?uB5?+u&7rjvG{8$qGsls?V1x{8{=$1Aj2uHowCr3wc8NiwA(yjzKvY zycWeLj^LZ9I^UAvpK_oI#@BiN^;F%fu3Nn8179M|rxKI~F((P-8rujpw<@H2Q&Xy4 zHVjoEq{~j1MTj!n3UPO#NT|L-lPhmB!$;&RD+TLFOVpuuHLzG}&s2kBf_^OKYBP22 z==w+*b^B4agF04q474VCN(I7@cGQWyaPwIS9bLx!?b$Oytm}ptdlL^LF2gs5s1NI!8;u~-+Y2r%ym%(^jh!BDW4UVbT@jD zit&Z%L0;RURAnSjdg^JA8dez1hs={c3%^w7YefJ1qAt%6k6vZ5ubZk*eryi$EY*#~ zq5|QKTWt)hGE^r<){JBBjyP42oT>m_?GF3=mqmpl-cY8x>eZd-S!x&wXLgsg?ZY#l z&E3!;Si44*9&;B1Rz2YE*H~YRs8R|F`M_C-1$^rdU%JH&C;RKLGXD(Y4l!Zwp@$-S zLN@IYF5AofBZe}~2Vop9+UwLY z@QYrK`80Qx^#Ed>B@R7ttzbR~W)AdszW&%MHQFZdfwloONE#C5I^1+tQjV>DZY5i7 z1pAY%l4v950A>HbWXyo~NblFV?GlJo@{V6U5}r88aO%X_J+1@~oh5X>!>MtznAhJI z4=~{Ta7zaE`}L#;N}s;yX>^0Umqg0Q2lyfGCk+VI?`gW_6Pp&0{qLp?@$0K3!(4q{ zG&SUAO}>Xeu2|89cp(|@g>3uZF=!I1Khspp7p*m@c0#QWN&H_jE_b4ps#zT5#*Wj6 zx2ag;!tv`O>sX-TOzp2O{k;WLbqs)XM&u1$-4rpHIxMEepQdL%-td($IpqxY?7xhC zDQ#z9_SP$nvip9z20y5(`(B+GJF=C7q~Vo6cH4NWzZ%O&(1uX`AI*{`z<=^dBVF3G->hv~J@1BwiPk0A) zkn!u>9NXUZsqQs9Y4n{ONlNzDnShlPI`+`?N`K|$&9{qPYh0^d@u~a=R&SvOg-J>I zI7x{3P&%QvT?2Gu92;#=_4=Z>6&r@4YOYi$UaD(13|jWgP<HzLya~6L zmHUQPLq**rUK7aWwgg{I{L7FtvF*?sll1Xl7rP%Q*E1&e;^cZZtF^3h+v}^uMO8j} zIReBw@2syTGjJJlp~@{C$i@3(M!W_q#>D4yT`B1fADs8En@Xo>RYY%1iTU!(2j6i% z-;A4V1ywouuM6DzFAo)OVI}euIR*s%ht_(pF4svnAephjnA*g5vpOARPKL6ichBcE z7X)sCX>pfQ9v13%>wmKQsE-g0t_(J2Bz=`t&eIy#aKLJr?bx|3l5)E>if$dU>jTc< zFw1;;YIRrZV(A23Q?ck}rH762dO&yr0gh_BlJcxYNr z5ihCJg)F(@>|tj#QBg6UPEp)(RVlR(+`%7iUD2pAbv@&4_uTQNtRS>{xZde3=j^-W zl@5BKvxY29_F1c=ngGXyQ;EHBBae33A@Pj(01aWZLyLsNDm#1H8N62+U4AMr!S)x1 z#xa|P)3PsKlK_}yRGV`Fqy3dxZ8k4pzn zeJSwDQLz$hRxzYCp%vHM;Hoscvw5d)N;?pugHrew&$tpatT25X#%%!LWheFsn89V^rWv?}dQt?PNW=#juWFu`a6qVEE(yF7>FMSHL% z*E33Hs2dJUPGr-&j7?L4&*-BE&+0zTVb$B_`(utatQ&9TT89e$*@Ea)j3Vk|`TN{t zN!4$J``=l6TgU2AX9ACxZrLxnZ65nTanH|<+}hGZ?%rb@bJMP;#rJkwrHtD53q?k- zG1sB~5>gzd8m)HY%LzfQGKqE7#RLSqeYRj*Y9&HC*h~IYUnvNI=};1%>`lW>8d;ov zhJI1}PowGIn!Lu(Cv65b&LU=n@|UclAzvTWt<0#_FfZ6_${f$-{axLTW~qCCAnc0O zup88`=dg?dF*}Mi>W|{_5`x!unY#?>ArTp}m@nK9t7-p~65}s?GOcWn7-|t+Hz8W6 zOq#sMTng%kBpvO0Zh130t*{#HwL5|$aMA@_`gTu3O3S~k=dTAO#Ry4e1S*}G#hs_I z1ZI1D=C2uWDcn@XXA1qtbM4&#G?YI#EG{K7s;yP>H6(bxg~*?%|MbNhGo-2AmlLee zvAJNm4^3hgM*FQeM(#ihtyY}Sw37T!DYNEoysaJitd)o51c8|2M&PfUEN*)YGn@N? zazeTuV*+`t%ay=er6*x4$kU1$&2?@=65ApD+=$A9fK(_h(6!6r4xQH+m>XJ3KIJ3` z&q5Vjvcr8YYa?{99!WSc=H+oLr69a8EW$y&Y)Xk-*E0H}Rc1(hqDe2a?iSUkRrMi4 zgKKG49J++;d_@&@(`*x}?HbRnL>mV_H}hy|^;_)juZy#MEBUz52(r<)Op?H1-L=bt z8LwZYxyqEV;oOOCt zucz74%Xtxtz8e;CXHUpZ4~>^-32vtj7eeU=UNlZfYJ7xr>0-`E$!S(ZCYFBmJj?p~ zT&W%*#K{7DVe7o+*-$=_K03neQ=U z{y|PjhMs(Nm2*u4N(fKpjmC$(ieDClX@+k2hpvzZz4axraAAM^<47yuK2lWdE;c;@ zc~cP?%iYPQ;8*YpcV3{mF)92qT7TGI@Pcje9wU+B*U>M>p?J7L-rqD1bb!_8O*ACQ z;N2SLIvdu2QL_taE|CU%e)Pu$!#@OOp#w_2X=3Xkv`C@}k4bgfNM%EjTf3g!qmwb?VY+jQCI zD3iC{zaOZU6*r;ugZ>U~IEWK+4{e)rDI^<~@lEwr5acfFdXCrOPjR+BGV(7aeHYzm zEO&w_6gLIhyS`()Y|nQjllP^y(ZU*^5YL`gI(gO6U2l$vCsNm$w0?X1HJX@$A?8?I zxXm}*mlhv78_AUp<7|pyHp`}kG1dX|(o!(-v{4uJ-B+8rx`an{?0*P#)0Vo+3vJ+KM2*C|EF<0O zdW{k@k3?36EFHvR$9Bp$NA%ImepHM1Qx*4uCqnqekYGspUaGj^86-7k2bhk2UXxyIztu_2LFPQTOxC2BwB$QnoAXL)jX5 z_bK`l-suPrmEn@H!%gq|l84Ev_JqUDh%EHvQ}%3dq=~CvUM9>>HeFyPw+Lm(S#^&2 z>y4DbV?UvzfQr26zG`BQexc!?Vc%O2Loc97ovtjM4HE!<56;OPQ(-wol+@0@M?>%HCeb zGKRXKZVK{#)lT{;V7Hw2GO5MjZiP#z?#bB4*ki=a*ve#zz31eZ;{7|;h_G$x6a$Fx z4x(8p!m`x(QI}s>j4pQXmm0W`UI?JqaoeqZ3>N1s#{B@*?ybevB>PNu42srLxnKSo<*M8zFyhhk9znB>(rEPgh!LkruAS zndGHm6h+I<0vx}KF=g;DL;(u{k4*8O1OtcVRBc;1S$a3WOqz##A5Bx`zMCf%x9?9? z<KFD%Gk&S0Y5RkjsOe5c(YMb-o-plWz|czW9;8J(rT*vW@@i_RVjP9w1Mw zOTtn>r%Y*TfddV+kjQXY8l1LnqeWPpyDI(WJBuMpyhc~YFhnsQwFFS?1;O)f7wo&L zh5O(#)qb zaZ%6N9~r*+`+(=$4`}MHt=&ugQ6N!&{E-q%nkftha~wly9M=zLZ@S1LYuc0zd8*IM zE?zwC;}-rY9atRFe@&`LuR?cH;q3B!{lz&tV5!OCobR)x6W>L%OmTqmCBhMn zS0Q1(v8|zPfo+k~MWNDE6b19Sk>>FDVL_`Vf`!@T0u$d{&2Pf`k}Z?++LM9@{h~p_ zF*e!N4RfB!cu7TD@!Ydd`9`BIKOe~v)B6C5%mU|5AImr^9_Rx>E_7=oBt-FMHaM}z zV@Uj>EZYh3L<#pSyX!<~(5NP5H8zfFI+Zas;x5?O)zclyHgdY`N4-IsE=pZl8yEas zXOf1A|M!5E8&&6@=028D{)=s`a0d`iHweA&j$kfJL1LP( z==a!rH^CTC8ECDIetrUbxz1U&>51Fs3$mejY0NojX)n(FB-;l~$VOY<++L04+>XiF zaVr0)yOz0-tHzY&Q7n3b$D$K+a_`1D$;3?42B)@heIJJmZdf&1o2kq@lf_k0S~cOF zR%E+)229ezL@Tw&U+MRv=~yImD>AGmT=&*7UF~ zyLk%NfgdV*RaLtaZj=w4qrBg)s9e9Mxc^z5mz15om33}grLi_?+n*Dtm^;3Y<9A(o zxwhulChUBQPW+pN>>e1*_To5@0l~R4101wOHpqB#Vnn1UvvsQ&{-Zq(8d)H=;YQbw zJN%BeV@mlD2zU2pcTS?fFeaWv|>rh;qvX3mP4+Sg%)GbfE(OZuDp=RAo2MWa&7AaLevw)hx`v=g#c~n!~X`s@P6d z$LLk=hjF}6QaH-&^GD4jqvtZ4X%gV(y3d=DzfFjZW6`mlv^#c0$D+bVg~!DR4lh^* zB`2$FSXL;$5Kh{)me>$*QgY^x_r4+!BhM&Z*SHiVjV`6B`VK4gnb-#S;AK}9&nkY6 z7XMC*-ov2#Q%Wg{O_9VOsFt6#RFwR#GJ8}1Y3lx7MG}KibtzodAeCZFj!Kt$HV)n~ zZi`S*?stPpONP9Hh9^AEE`Zag4mbHW>k-7&3 zv-MG|omcJ)qafq*G@5d@m2z*2s+wtOkWw}v)6Tc}iiHG^#;m9f1kQCnmdCUS_-U?> zjkK!r7|J~n?Ja=-1teZC3!}gWEJTi2x1l3p&~<&E$?Cz?mxQ9xRfDIuw`unl_d5`& z`)8g%k?haO?_&6ycg^JXYW2m($rPsrMztT`Y3TA5OSgHP?vhK`Hx}!2I;9;!HmKzl z&!w>vOeFhg4GQK|Hu1!MhIH;9Hp{6)oob{RdnE%O~TAbb4XRdh~qX?FW9uQ@A*yePg zVBN^3{Ud8j4Rf;Q^J6ucFe2gKpW^U_()3bX3|@ysFjvL-yjq&K>YOt9?jN|NO)^y3 z#rz-=OlocVfm^HMF!BaYY}uq+Xl#w;M2zr#Z9kps>m!>$^qN_b$9ND)9&^W|=I8uI zOgCWj6U^QfUjk%GBc<>QPtE!2E(xvDM#l6!UsZ>!dxZKDW7mcf41kukyF zyv5?L_R({?S)*~h0U*sA{Db^Y=E)mbA~bEwl_2dc3BR8sU5iTP%wcqz08v~a* z<9f`l(djI3KWutkx|vAaTaxb^{+JE)dwV|g6ZvMe#1?o9$U-X1;b#!#g$TW_-1 zzJfVGE{?~6IMt`AD5(0@N0aSb9676u9kriA3+5S>#_^nZU&<}RUT}F{pph8P3j%nzj7qwvzY?5jXvO&%Lg^JCJ@|37I5@-c=9)TtOh1M;c$rWzg4GHdn{5B-?jWW#e^RU9t zGu@$g61Dk4F=Zdsriim-*>f*`66$;IlF7EoKAg90cYU8CIy4)&qdoA-7YAmUiu+E6 z@@+aw*Y%}lCyOz}7r#lBhjG_kPqv}#y608#?kFU`H{SQR!>*elVx17p>{-C2&UFov z({qDua&6C$4>M!J$H%d^zM?DIU5xAO0%tKN?xA&V{FJbU1T*rxGEBGy2Mtc(YEJmJ zeCHLziyz#N0KTy!pPciKpH2jMlUIeSuP-Bv?{_)CyLs0`WY<&5g*L^}M28Pcrr$Pb zh~~Ut6d^9=dGq@u)`U(GQWucXuDF2LtdaQ1@PK_W+=ICTX@A$#T~*bgf|O*>f|4U9 z_Tlu$Al!7#xrhV*GeGdYTD|*3=RV|yP#0HTj`fgFZx(htgL-_-{bW88(_Wu|#?$BD z$$lH@aVzx(eutmyi%f^t+XVt?Lz)~HW3o{Qw;cPL^z|k@_1p5J<2#U%-;}U3su>)1 z#c|a>aW0>qXTA$@l;PRrS<`L&S!LApjAsY27I|!ap_R(SH&MiQ-Fx3T?X~B+q&%0( z!aR@DGH+t6iE$&!o8WNbwqJk{@HN>OX&Tc1EJYXeS*6hEu+iyJ%S|g)`U&dR z>46K>g5pwRUnH5pi@PH%H4`|=^ilb};nKD0sa)B>F-yr&PdP8>y@au+aoD3!%m&-w zWn6aQ=wmJRM|;Fif$h>_V<7e5(To37^{{*~RFJu;_3j+ETpKtaGwW=A{FNpDm!3%G zoK!B-=T=MIHQi}Uo;Q1A6D#bZc>_rQ9_p7(r==?h1gHB@MOp1;#7|EJo?M;%VljOw9AA%X#5vk}-gVSb z``ViI2=125_X9++GKyuDMYQ^taK}3N`VNUBD2Igp z-U^SiwNgurJ(c8$$V_8l#EPP~IbJr&Q-nGzWk!vDvhMAnX`@>R7h1N()qh@q@&37D zfxdL{M;CV35|y{8N$sRb8*=^7VboEgty=rU1NJ+_R z2`7!&_xB5o+k9bPghYFpMPdnCY22=x0)+}|!*Ne%<{zmvxxpBj6S=|c)L_Fk8Jd_A zy-f9Sq5yUYlK#ISxPp7Tmq@SwKM6B7T*oht&}2~Ie3FSeb0s%GY7S~g@Z*R~IZz{e_#QfEwD>i7Zz^EXQxqPQA!t--=Y`PWs^ zm-9wAqjQ~^X44mW(%phNCWVBqhb@GhY(oA8R^ERN5EEgjn5mJmky@E79|IW08R0{_ zs+5fKrDMx6jgDSVKaeiQI|w2`n0Ngcf-eon5hZ~5Ne1U|XRR)8qYH4smMQD-%m z_*fQN5~o3DE>1!$Wh4}NdrUh?!A$albA~zwChoB>%%^LM0&(KYPor~P*e|D5MyMdp$B3MCAi4#St%tlflHIAJ>ZR2&^^4$N< zQRWB8=ebxj@S9_Xx??tVxc+zmemC5Q$C`qSFaLHbwH!WWOrnPgVi^zKT%eUBl63&`cg?BgW6?$pwKNstWCccUhoGDYAL9!;$Ew3X>pGL8plwCN> zqG{z#Oyg<#jwUZ{`Tqhvm~L(16?z)sI%zs(_e}SL0lPyZgC9%CecnrQCRt5?pj4oY zwdcyyW=f>_k7-);bzy@Zt_W5F!`){Sco*d&9Z9hl=BT(Lac2j&be>j9wVLTOIJBWl zyis@mwM%Vq4dRo1Qi$2U8*A5m->x@@Y}w43p4m9x0REO!lA2$&&-?lBd8(ig}j+WxApcp{0@x2r?u{MM6p%=3_3qRX?{UVD90PJBg#QX({FMg z!$$b==7YU&I|2}j#YV(GV)(5Ex;;Dg5NTgq>cjaoW&hP+SlFI3RSP6$4|H~r@8~-X zaK5S)Jjr%d;2}+U=f2Rxcs+e2u0_Z`JZ=;7#wj4~bvB)UFpG>DuM-exa$<`!pj62! zf z;cLi|^AdNo(!bpFo3eEGn7O=*NSL1O|M73=;;&_12BqJbo(|bPX@TA43Vjkoj*j00 z+cI&?P;20hi<5rAw^X&S)^Vai9;A*kEnZ-LoWSZLY4Fu7iXYPHEB{iR9{4 zSB-aKbyW?N25zZP*7)U=USnMIszVFjy+yH4uJFLo&PzlyaC5K%SbkEDR^s+r8Hi=t%LuMjCN>fjtKoWJOG9r0PAKuoVBD~W< z>sbCg^xbSt8#=Kl^O@>+o6lG+1B5ly_}V*LPqYpH?fe^X)^L2O@wgP&I&p35K$brA za@ins>7tE z!&BDm9<04y$JaQVbYbzJ-<6k#VTF^tpRA8iuYk^EH*$V6`xE>Woq|i zFQ!HNjXG}k7Y@gpPn?v1HGXS?v;NjbM{~7mBeDR!d~1p`=sWITVW4zlh!aGk1fsPcwjGar?wFGM9l?GnBADR#06^u1M|L+3L!!C-x1 z4gEA7@;?}VcD}7<2T0`KWB;tLg_f^wW>1ZpJ7sd#u8wtaP>X6t)ana|vASbhPWh6g z_B986Z^6Xd3TCcz3BGKr<#nHB($NA{>!*LC=en$1jdc1`BSR))0i|?xyOoe$36FlY z$f6L1{w>hokP^=!{wW~}=tey$+zZ2bpePQf{ywO$g0|=KGDlw#(qexz5fn4XU7%61 zWK-)v5<%Yg@c#Fsyd(Qe@E6?byBm*!2vr1hvSt6bYMQH7+e6MP7~wJM6pBFSfXPBx zVzWB@I2y^}!?;T!Uche%c-Aa{rM=fC{T6YQc~JF_@1bemD@1&gm8W_Sf%kw;LoB}1 zQYz;47A##31dwG$$U>!xpGqNozIB64XXj=MLW`@(&$g4ZGkXxG&&!%@K;Iu`nyAdz zl0b^jZO~vnvKpama*MUzAQ7RaxvvmJE!udN5ef*jOUe>zRfNdCnXn{H-vRepSS)H zLEne+NF+gE=KwottTg%0Y-rSPotVL{F;`r0k8&5LpEBmUS`zj-DZ0ts_i-cMXpHjrpG32EN{dfq z{x6OM=UF|NF_4v6Ug;VN7b3nTnFQrdA}$<4%a$csZeBtwmJEGuDk?E*a_5P2^3wc1 zsZZaovG}Mr@QQx-Zf9{HqG&flq=$&trGhTz7J)*+^9r8M`m%H@pS;Ln?=i{Ap{v`v#tZ&7LQxqtnyo ziv^Ey7m?xpak*4Ccb2$hGb~mWR@jb}pR$RXh98&bUpEFyOcXU=yuyo~CiuK#+?la7 zd9s^1{4{=VrJj)8Db4a@8tj1-k)!8c86fk5x0FVa z-LZH2)^G@NWc-!V;s?&78VZYf@3r@E_&tXm#REb%WwX@qT)&LL+kEZ5-hA$b_uJk8 z@W+}|U?6|P)+-NcrJL<7$Q;u5l9z!_2MyoqZ6?!*ym`NOrL=CN zqR=w#4&*_o<&*UB4jxh%ya~}Irhz~q2@{3uSN_9_)`G`A9!|mn`_}|l&6}7!$(fdS z(5h;0xz%clrc=ME;=HVT(VDwaXN=hpP=7eN5C|&CUB3#4L6wMDj>_&yE^2HwNZ~I4@kEKE z`}gUMgL0Cg9d&-1v#2xvj-(kjJX$W_3j({|0tH|91s`)Z-`@oFU+&NJ=?9}MWtG3# zLqGDYiO8}Ra!oNukE06fK?Z-788L!g%V741e48U(>1v&urk?Je}L z26z2>jsENqYuU+9xh%1#o;tJ*_$iuWLrxOQHc58Yxba=IcTx4ukrsy(QA9SrFsSki zFiuL?{a97L`}h7f)%Ez6^H!q&QnmT~CivEN`TnB+0!Dt{v46YjVpK}{_~Di%gnQO8 zYY;-L>*%Zen8cB(+m_(Vq5jLhzR&wJ;6b>TD}hyRkpLACOY3F-veoJcAQ-2%K@{O` zc9?RN@cs_~GeFG07=v^Rmt5y=)8#hdtnAtlodIId*3ADjTi@Hg2|9*6BQRCb!u+ZT zj+?L-WAOcd{oTL*lYev%>~Ka5(>ij3DGWRFqSL*Qr>BDz=l4Ip|1ZD)H~;w0ta7>s zl0<5eDYLby1k*@9cXL)&8kxWTw|{^6{a^j7d)pSyHOYjC%cm>uCc@BH_76tIO8kHM z-~ROb-~DIz#vijxWJJcz3xr_VJ38<8ikIb0`98!fEq{V+Cd+O76gepq1oWYvKujTo zVEmsT1Bw_>fMi>Xw{L-V`tZ5iGi{*`;|ZuC;@j8V9?~}>%lg*X2LK8Ql`4Nn4y3IC z8ZfMpq|}|2^8v`G`;+J0 zka1XkV8dc65hMjxe6wR$HE4fBLN`F5NKG0y?GmFD%3096mkB`zKNljEk*9mbLg`iS zqT90$!CB{GSOmHBEH#v~2JaYGU~|+TdXp5G&A?b>SmbeMBu2!=nl{gCLE;T5hw(;Y z))4O?-;GGAl!(SX8#Tiy_$GpKPIwl(E+t4|A}Ldv(yisGpUAA+x>Vnp3b=&SG<8)hUQ<8$w{Mo+0KGVyU-w zM>YfPY@P!km+Tn-fUt?Ch)4?LR_~^6p`TAJjemlYo;Fg+QnFQra0__VObr)=+8qV6lI7Md6{H&#EGT&@(`vA)Y|657K?e!|v;hb^gWn(|8jkrqlmK zFv!z?@YA2}o%An*pr@1)lSkgyQ~~26bQOiQxjCQrgELac&%FN;QGy=GiMs0G>e;1SrzhBD88~zrGgr7jbL-dS0R#a z!$qWI6Ws|^L!2WPP07^0s&Iy5!Bxe$z1RO;^@IUV)J1<-jGMD&$g%LY!gqWwv2T#@ zERDB8V}ofDTxq+ZN-UWx)9A|m1fR(T&=mW>k3RW zVl-`LeT@xXbmW4_X0IR^mL${hR`;z1vwA`XK_bw0Q*r_2de!**dU&TZZTwDEVyvFnzAO|%#00lXZx9PMx zm~s4Zo+1ip=5Tu(G-4H*2e#i0H&-Z^?3wtN+Bze(4 z?Vf!KY($={lU}4<1y+QiXveuh73Y>yhP(MFqZts9Hvn$Z&8M!W0g@(bdDgi3m!9WB zP)V_}-d=x`1z{EZe82=xnTVV4k8cj4l++;6V9{Fqm_S%a8;xw&#}8Hd^(4lCN4`0V zgpNn4PFEPpGNiIr9#Oq8k3(q`X|TNSeyRO?-`rD?32AtP-hT*|_qpK*KthtWvZU@7 zLC3UJDgmfgsX=*zHZ|)jTi^A&|HBkZN7jGn#UvP%G_Q z(1kuAnO2b#y4B*XpbS#VFsBbBGZLQs1w4gFW=*CUf|9=+L82p9Dn(-QD#>4fr9e4s zXNZ4WIr+=1I#qe(#^Ly)%K$gRjY{97=msQzssG};$zLz^wXk>6P7_^R6r&<6`ActR zwBDtY4TX`GI$9{aK^5ml4u>ayt;t6O$tIOtwd5}$84)J(yw+*}uSx!%dY%hFg=%d> zw?=hDh2$?|GKaZr(3uJ}htzPv9#c;$GFX3W=pk(%N|m#U(7KDjz*bi5Od^d%aeRnC zXVQ9OxI%NazaM6uoS{P z&ve>kY0R>)bm;jkcu-OX1?P>{_*8!gN+FRtHSI6Z#gcPk+UYaZ3`!+dK(*9;syJGR zDw(PbwzFWY;%FgZ0D`K?V$QHDBd!UI*A==^!xbLFF-o-Jk*Ocp2!(UTv+XtiRv9fs zVV=@Fa(}{_G)|COW`?*qGC}nu7bKE_cvsI8NsFHsLC<(E4 zP;D31#RXO38H9-igwTB|!p4GN#tqsouTBtn(fQc~`aoEDmSf(?9Eg%LCUu8Tek|V} zfAQ?cU%&oZKYQ`|`47;uufNU(efIW8&wqIM3_}R%vsC=}OZn{ikG}rlkDo!r33>Lz z{6{$KSP0TA%jX?E!Xd=KPhx+#MKw*a1ioo}9@X(XQwAg49L(8~Kq}2(Hu;}QCdmBk z%7)UXjxQE{+329;_4_}FF8=yjGDNZ9GTvgtDiohe-M@Tw95l`YS^cUa7ZZzc()?{9-^M2T~XBM7ryTM_>@d08jh#yF@IU2@^S}M*ZCpK=u z@ZqG}II|7`(hon~##L%G&zc;tUTGPrqEbX&MjAieMs*G$YqF>*db$k|8$VOjPLzhD zccpd>uL5CILY1P{_N{-^=>P;$8k2$cb~X0Oa832Ed!x{?sy4jjdA#-8@o_4TX^c}? zjzaTX@p&(dWt;-)mjE}7lkepi-Xt>a47-_zkZMX1E8(c5NP{>UfGopeu9%Jhp_P#S z3Vj}q1(ceCaKlme1u}&1g3wWN|GjrjU7yzrTx;? zOh)$KA;L^ircmV6Y&Gbo4bTMovu<&5n)Lh|0a$RU4KrzzXE1GYCRhZ+PizdXc)S?0 z2K=|?W&gbMZIO)THQi#!aR!M<#hj8MS{nnfO9D8g1q zaik%_o9&wm$vQjbu^{X0$2!---bp*2^cRNamT#2If&=9Uq#Q+a;Wwz{s!frmf)clT zu|ZC)*kS0y+sOBB)c{_TTMq6pgpv>j)dSgjNfZ+bMeZyKEYOr7%XmAR(rRXmso@zy z@oK}@f?0oM*Br?KWRb@n)}9s?HfLPA#m$iyF|1E#m6jz+nN0we2*OmLcpD!>unZbg zATz*pt$!WhB`V8Ty^G%VA zocDhjqQA8kDvP(Qs&=sNpEbqXY|^l~@Y9R;OJPsEP~LYu6H z3<^o95LQ(+=q`8OuL`ecMgt}Lv$}6FNk^uz*si+0}nY zL3L>u1E6`djMPRw_V9clpaQU5wSC%m`f^jlhI#bYan8RH95sPENN0M(+kU*APGdy;tlby zk5kzFsf~nyQ4Q*pNP$qav=@YirAjuK=ZzH_h7}ZB-^|2YINS`j5r`Ed>4twPlv?Wt zo`Q@*%zNeRY$&9e0z0ORk@ADwFeKpvPk=@uX8nvI$0jwp$w})iBjbF+F^GtON&!S` z7x(#Ur;e~)p70qn5SRuC1RlU7b(g^jPoWc`6$6p4BE#H#l5(Wk_J&iA zOJ8Rot3~74G0QhNhYdbVrIzu=8n4B4lw?Xv-K0OTGC_Ye$7xIWNg;|w zgOy*a#$Hxg>L_z77`Vwhh9FJj}IExiP2AEO;t*UGRqX#Y~F^sf+Z#M)6N{Jsr!9kS{P^^ebWxNieF&IG; z0HEfswLb2n+a0b#q&3O?Y?STb+?sHeBwqDwiIP~?Bnas;*G$+a2 zOSSOha}#u+RqU&Z#OC@-C*h|Dtj?J)4?jsj_*wh02ftp7lB{#`P2w&eKK2Lm)6y0^ z%r~emQE-fBLdQ!c#G<2<&cn0hYK&u2^iBq!u14K{FX;}G(eYK`A9Q;kX1}!@2-!bNrfz-q zl2`UKgOA-|@iggLZFXh2D|gaFI6NV6vEuqux7=c(Yj$;;w{ zH3@+^L$idT03amKn;c$IA@0Y3Yegdu2dV~bkW)q=N4kH>y%b?_e}!5vCXf`!Cv%&Q zhk`OMPz!~dT#ebPYAdV&7PRS>+bGnySGg1iIHw9df{Mi$^-d(sjKZqHq(LiEJ(hzc z0`W#z-UE-It~p@O8RkvqzJuaLN_EQP)%tAIQw>k`03?|8m?GyM0*5_P!+_r2p13Mg zieYAX(qDhx#)GZaWW>1xAO8jFtM)Wx^mlcEBgJWsLC(N+gW&TaXuR8s3UK0_6GGgu(JzIt^6 zZ-_mm0%^cJSX%)$$QmK4^E5V0VRb$d3v6SNSdV|Moj9EvhDSg;9!avKW2r557s9DYB}5Oo-%Y&>!_r`WH{tg3)`EUQm|-b;;3-{)Z3l z-`#)S(@9ryGCCjhuRok8o#eXL{pod)bWh#aPbi%@*CP2uHp1&+1Kc4rK(|+$)tPbjwCtIQIm>9wg#L--j4aR>P zv{Ggq0-PCwl8Xl-VEGzbawpn*W=S(7_stF*BTMlfn}OHA10IcBgl zvcU$R)lu1(=C!kpfxBS2%rz1XX8G4U@L!fSW7dB^xw`J2?n8(W4)fx3q!GZaTrCmQ z83S<&M5DXGgTTaj3Q4?CT^lu9;c0&|Mn#%KzgRV9ycLuy;W@=T-tMNgdZP^$QIrx8 zarW_AoLf^7MTwGD4>uCnGi}3qvRTm$n2GP_6HkZg?oMn)WIsPPYaH3vpHENsNa9!h z%pK!`0J`?#vL(DY2~^iV+1H3IIY>b>gR)i{^2L(z*2UvCKDzAmIvv2{&p&-G5*M<4YxvAT0n*gjOIqx%~f&##Zx?rK{}o=zwqPpJ!WH;uA3XGeDOei zwbNQAJJufyj>=hw-SGK|K~4$giAQNc(p(1epi&@JeKCg>cA5tK)f-=TreE1 z9cE+BCaJn2fgqxB-ek&QoFn;l6SS)l8;Veq1LF@CrAV&2e}7UD`?=?-ztg$A`Zbp{ z`FwI+hMMeDIkKQQ@!faVTTds2xKDpeEc{yfr-S0G z80?#uZ(qDSdj0D7m3sADn=cQQd3XHvkqJN(373pCO|B1}q>p<2UdXZwX6U|_)p$55Ir))iDJ*sxJ@YQ3t+WQkjrktv{Pyz$^`LF^rOFN^;5 z=*d22Agta&GmP`dWu||tKpYLfb3j^;&k_>>gq{KM4ABJAeVFb;6hv5nImdbA^|}F2 zdzXC1yF)83V=#C+b9zf z$yrmb)jU*Z$47=T=w}w={cxmWNpANphj_x>}KODoMJ-bbz5vyVk*Q}*rZ&l z*xpW1lUEM8$s+fRPBoQO+DgN4CPA(vUpw9cGrvzJY!ZKOZkUPfiB2_RO#&thSZK%u zkO3L+UHtK23fjms6+8J6rZdqKhWjKidICDLs%K*dJrgX=14=3Z3W2mNuqi+%(UI%I zb05NpQV{?bOpVG+Y_gkaJp}-#9azu zg@H7%l}>;6*pt55@_pkzd#~c@#Ctw*L`eDr>vDHTz5qBmwZ30};46H~sM9K~y#Ri} zD8;E&>l@{lI5xZ5{6&U^grL!VL)9)!kj!$^WC!!XIxp9=U0f%ZW<=T;s|}Y3FTON-U}`K)WX7%S0I?f# zgS-i907%o=+16QR4=4cRONLg}UolAcXp&E6Bfa_99i5!dsj~%M#fte+&}hwd)?l<= zwZiK7ytthXHS`on?DrRgGy4^;@1@_n_>^>#(M>DW&8J=UhVMOcK8o+I>i7)zps+*> zG0uM&A(f`_MsU{lQs+7b$9zTVS20oF`{HJkO}J~AJnznVEDM>-mvSv87bk#l5-*S&XrD^oHrJ9--|GzjHdwzAsc@&=SVim^Fh8!P9P>N-z2bVI((@7z?5eZu`O(lo3NUY(5p~pLI7C3GbDPM9G_( zRAgwTd&L+qE-1HJqWyJ|v|?Q(fiBM)FM&`4=xWJGC^Z9llU{UKGIAJ{j6^oF##}V0 z)vF{UA<1Gx1#QrJI6!kEo6MP3NJfe@$Uk&!!kg?YU4hbY^sZE~e(`@m(2ymP zT23-)J8l0xk})97a*?;Q&T1O38VMOQNxt~1yGTGbLWTxcqV zZao`TO3q-OWu(#3ePKvdOVA*0a-dZ!Z_cK%s+gpKRts`W+8M4+p;a|e1E9{4X#a6l z&9|@=Y0R2*?ZWV?nl=GUXbgYi&5zxf(x{R-;ZOjcMqW(10i-G>Pnb|C#=Mnig=AGg zs!|T~=GG~$x@ZsEkwj?N zO3!*yGZ4Z&siH8AH_5dI^Mr^lP8sD{y#D6eMa%P3E5{k#`XdME9!q~pLy`oKh2*~D zYKfMn80RKyqnM4?GQ79{uY2VSj<4;TK^jnfQ#||M0{>4*C zN&OATmL2wBa@ezk38*h#F&>m)Hwj*Cw#+|*ezy&$NX-_66)l z)(W}&{v?tMIW8(wtunQ>>1qBLX5gxY=6loYyuX-lv!2i(!XWrNQSi;T2gUp-H3G=? zCNf6D?+%ar+S>gm6A#Az791|nEaSSxIgQype-1OMR7JN zrF{ePZ!v#vzrW0DKXH%p&Gtb{cnPuoUOTxqX!4%Gm}l`0tp@pn5;qd&lCt&>G;qFb zc;bd+(E3vGrjgYEIp{JwGuHTL?etG-G<$G_H5cvdV97Ew_=_q(mCo&gQ3jF+3BwR@Omm zB}x@zb|y2*vnF$f8;&k>0yJqieoLdv0Q>-j42j4Sd?J707j%7PptO!q+i%%`vYx() z*B`i1e!mSZ!X=PAOnkyHH6K8=m7nw9oPACa#d18pA zdAy4A+Huz6rFP^#dm7muPJVP<%q_rP7)-(C!4yVT3jp>Ilv}l_m_$lVVWV5Ls|8b> z0Rwd8{WE{n0A3SJUCdASTB70z6j(O8t)I07pdbpuR<7_~5K0ALM3u=! z#Qmf-2p@DAkV#209SzKucz-;1?ZA;oT?J+ZGH%_@$n$?!v8NmiI-klg@;3tDL%Ak7 zkK9MICKL>zo7JjBQxbVP>T0+={d$Mmigr-9jy8Xc;K-ful{fg#06znDEzxRujR2w2 z0GVw~oFY>8Ccm?cw*Q~KFYApX$=3TT2|aiLNOtUzNkg=A?bdBAY>{e7xEKhGY~pf zcC!_^{gepg7$| zxy!2ZdoT&tciF9aD*}>%>Z5mgv zzEek&gc20&FH<&f{)7y;5W5_fxOz`kAg3VUOzg0A?1P)wrEwGo#F@U_sL4pIQCcX> zP!R5NAeLn6>$imE|Ogj%Ae}hXq&o&w8FnBVzF*>FI{c-r4PFoL?`{uF{8ITHf3{Q&CmH7E1TZ zBz9)tHV!~6O*)qt7iH&_pI$M)TKD{GN^a%68!N`p{eFTM^%@oLteJml&C?9AnCyQz zL)Pp$$7sk!j9qimM*3ORi+j+Rq9o+5AK4ZMk)52Xtz75*v4i~Kpa0!|vY}Z(842A@ z!6>%=c`)p}9ky;tMlS}|Z-hzS40~m)2@`pQ)c^1?r-+!4Q@it1e)~=PZi=g#AOzDa zN|`g`Z3hIY5wRj%GERS-*GW|F_Cb5HYCaeSK^Ua2TPr!=%o;mUd9fzn#u+K$N5Qg`|+{_d~;#h?H1KeidLeAhcJKFcfvwj!kzaCvRmwiVVD#SulZh9Eq0 zHTOFISVPURD5HNebyvcH9LKq+hhsw+xF=iMz*7jdH@|B0b7iO#@-893j_WjmIwi7m~pxHLhBp za(hY$N+OQLS3n6J&0QqLNC$YWX@RoHCy~2Cyxq|v{c?ZP9o{YyBiFClQ-esJ(2zc2 z?^shK@1NzvZmV~GdjrIn>i~ z-}a9$2A#azxy8m=6f;i4M=boUyaC4JAV!hvhR$2|2L56+C`4Hehd{`TNaC(V>4vu6 zxCIL+J5YafhA^P)-i2?@zdL;Q?p^uU&S8i!@`Fe3IQ4-Ry3_+CfK?zwZ6-~z4|{y% zMo-cjx9;+R{&Q%@1uTx!D0H4l-w`cJ^G}yvBdq>-7$3tQJCG>Fu@pRh^dT~!L)ht* zQ8Ft=2m&AD%vmAD?ik_C%jeze?)c8R&}YI%fdqe<2$Y@hm755ZMl2Qd5pS~$7`{=j z)k%yc85TJG3L=KE@iH?uEF(e_^`c!K1Sv~cd<`)&phK)K)oOzg@T6^itku|_gp4A> zAF;t)5+k0B#)E61!{BDz9rW$M_EDTV>=(5Ik!P_>&SD-Wbnk5)yFt}yKyV=Uf5tpO zAc=oHJfEjNN!$e{ie>y|Y(_q-^YA+x;z|;wICESIeo_F4o)&<(*3He)m)qg((O~$| zMnna^ve7cf{a8*kp5`g%$R>P((&gAL4wEwZ& zx5+K@Ad52Oy02}qmLK!sQ*02E$m-!xtn`1m4BeK2DF!Kl22X8DB%ldEfZgRGi$&DB5%eAgOTKL@Vp5GIM^CM73jp!umCLo!LS z%yG+)lWCCu>0+Ou6(WlwKNNv$ewa_PJY8&7RJ{(Cq!9$%oUdaV0=If5EQUT1uKRz) zfXFKG3tE>TOkSo0zqH|07U3++HXuZ2NP?#X5q5~=A?DDG4~b)9bBI`&adl7EhiECS z|I~&^QrYJ+b=>|IR#K+ZZB{`@oN(8}rS&SNscf5N(8$js?s&?TUdAkoY_kqbsR$`? zE#I`NG1A4#SS2_O!e|30dX{E*YGQwA@frR0?cw*?%O8?MB$$s6Ut#+F>EY}2^xJO_ zg)*CMBq5Io#mMnEVx=CZnSiH(`p;q^B4Ubm?&@o1l$!UdR1cRHprf3nleERdPO9M}ote99Cx*_e-B%7HKch*6wvvD1+|X`KFNqHiikj?;H`=Sj#n+|a|ui~-l`u3^FpPH*_AsrRFD9WJ}= z79^l-jT3DQtq|@kU=e?H7g*gOo7WpLOJy8HICGtb-vbkbWl`)icXPdVX@V^AZi7qN z^*>S4JP2s=m~9xy_bTalza8@_UmV%D;^4>Fm#MpHkUKPEW^JO<_l2JC_AduEY(c^- zNcm$>^0bDMCxYt{caK2!t-#^D&c~Bs-_s0j%!DsWv0ml<(nx~MQ zKE^77#bJPg9d@}~4b^%%7WlKHlD^f0!sFFD}ORf+!ROyh+-+%e3ht$>@2B3_rICkyi z?}POy(m1Ak!#mqj0Bc}{twIcCF%nxTQQR&i3Y&1PQP|f)@|*76(_T$25pfo=Y&X=} zdVGsSVMb!|nB!Y^J@aTn*>=j2wrVH>RK3|O2^`>5@a=yTE^nPAqwxo09NEpHpeacO z-A)0=wrMe~W-wmFljA3)*;u?_!z(NlEZ9!xzirdUrbIw(A7ugCN`=>kq@-21bI$xw zxa;V@QFGQl8~`Xy61%HXZm?vlfjBhC2+j7=(`+!P07sNbWoz%{cI*cgFqvUOb~>8N zZcsr?5siO#-Z)>6&Z%(Yi)jE2Pdo9FyqDjZ-CE(SubJFOV@dqjdCTifNVl436D$)- z^?Enx((b}pM-lNO?rz@jBXHI!jWa*t|9?B{ox7)f)tMGa7NEzR*Q(*H3!Djw9yJol zsu8I&L4|NWy5liB>ooRB7^IIlTj|bOmr;~R|1p1OZtrWv^ej>AVL=I!M#^1tXJS7# zx144H6=FO6M|bF!V;09yxa@eFZVlJ_@@;iMdXoBS7&$J#-hiH>JQ7j3pB`>~hn;Ym z`WfBJxvn)Fb`dLII1u|jS&;aI$~f7qH)`XsFHIIK9rj|}U4z}jX{X-v?vn3X>8?)~ zSRsD|m<+Orx$dO133t67G7|}9$srAZ*`QPF)Ls8JwW;w72iDPehV9 zo*-{$vk{)9VTPSi)ZBWF;Svsqt=lKZe`$XsKSh8fa%{QW<7`?brc%nWPaSs|Sii10 zN7!yAN1Af(cowlB#c5NI`vv+8XH#gPpD;Z{ zfd7+)zy^Oe4x^yxHDAF8u7E zW*v{fA<7cwR&qBAAzC7Sq)%{6uv=kSGjMhKtc+PbJ5}p`ef~}Bru&aCCw+h2_4+9c z!TWoy>zjWxhD82TOenT$*2f4zsUPfeYt!(PUFRD_eLwb{mk4a;SlEZ3DE0+q)Uj`5 z6@Eg>4No0rtj(?0V=LaM-;E`273?8#%oBHgBko(FUS-}-@=wZNGUMm0>^{V4g2?u) z_+p)BbMqjrB2yUoG>D_EI^ut3lozN*O9P)UoW;^{k+anzU%iCj`jca7HD`s;z|Xep zQ7+EOE#_hQhlG2W9&>T5{Bz6Xx(KMYgtoeLIQ)=_QA?joz#uGqyBI_e`;xkwepqMO zW**NIqhDJstB^y8A{n^uGW{@+k`h!bW9}*}3vFXHrX})49EyjPwXJ`4|9FBCN%-zt z2Y`W6;a?OzDfRd2TNK1gZq+rr?WLAegN}u-p2BVt6($pk%$h&$!$bJnBa)G%bxBMIAd2uMS>`m!gd@C0=igADm z+ec(IGv>PmnV}fF~d;eJ9 z>#l!XjFr&et8cthoqs!n2Q(}?5iZcA(l6F7`Koik6B#-l0aa^Tt9cK0+JfGa{kCZ> z3H?=}!6G=q!@Q?1n0LI3Thqo{lf*`#281QVU2<-No?3s+3I`T4l)CG&*I>~#9k5uY zfpm*5tZDV%lXNsl`6g*c!Z_uLWAm(`@otxPBne~EA#iM?=fd7Zhibu)F}Iqi-jc0) zp@nfExnraYsQ}>0U7^%*bwd5+nk7DH zw>F$6I8T2Bk#0Sot?$+Wu{3B}F|<`enT3JKGIzcB9xv7AaNLS`MWWEo=S~vkbUXIB zA1w`sQ>-_T(aiS^4iWdTJVyR8^Q|g02vL0L4s5tPn%KB@P{Jz++5;tdVg)bf0imhf zWl{W$%gO0xE(-A#)*HVj>}sbE*zqgaJFlp)u4D%Rv zXRTVrSOkta#;&vJi@t&l1ig9=CvQ53bA4_ABkw%Fz8MT#!`lUT!UDxABQR^maZ1S* ziRfl$VcEp1sz-;3BEQstlYnAJ*s>?ZnrUHJW+~#CvzX_`JX6?iy^xKB>SO0n-#zFd z$ti!AiJ-2#2JEJXq~*lYD8`u|eT_{eW?{0beiGy1t!*<26iGxIihoNo zwbhf$hw$~Afg%jUrWr0QvH0-5wwny1m%bgBJMK00GE>>J6($F0~&GlY%HWz;*n^t2a;3>u74m-Bn^$$!!7I5bcr#57@ z*ay^EibBcta@~>N67xbBj{|qmXLDLZ2vf1D6$^cm_kVm*1QV~$i$IPzfiNsOl zhtzSKpC(%|b$)s?u}IEPfRK+7zZpl^+M?)k7=cQcr!q75{LX^l& zh%x=->V=kZ7P8QH9O7&oE)J6*rM`dT+Qx^4fN2)7L{D^aXniitDoP0pD^_2@*pZ|%j2?x-U#|v;`cw!?TsOqrgD@oy zd`SYl;V8ylg()Sb84_YQWhuK3Q(BL>!9mJGq%piMsq{4kDkaIVPq|wQ*nNMXk_sjR z-?>=ct3V}<0-mO>TTX3ei=**}AJf;6NVRK?LIN3b?C%gvcu(Vmg*_DiH$IuUGga@` zq*-NwCs^Kfog}V&?Eob^obmCnwho*JQ52AU$4792L(H@NuLjqqV2#*s5(kvH%jz~* zvmKZ^@OdovQe-r!RYZhf>ZgDEIij}4OxG;HK6h6=}NgHHEy@witzyV~7e@h}+*aOUrS??%{hEoYY`C=4?3m>OPK&vgw53!GQ@ z?6b3r1WJ+byT+S54rllJ?m4fflAt0WS?roIz9wgva~?%Wv`f%|mF0gE`C-EKbg}*S z1e-a#+^2|P^eBRnwVhp-(ir=W>pAZ4uW8ca4%!Hjs!NPd?AlDqD3b05#n)ebBR{|Y zEO|KDEW4VbjM9ucP7Q5=L>dm@f=X7Ic`h+c92#)jqLRiRY>i43i8RFS#s+SQN+saI z1)VDIuwqq>!4)`TJV}3c>Ggh1;Y-1zG>i7~Xj`E{)LsP&cX#O4CBkhsAY+Ll&RwU) zHsto(2R2cd1~J-Y8yq_rC6g(N*w+%+q{L@Y7VqaMZ~MR|v^`9OW0+_?=CKNF2Fh(> z{$>Z-PeX?0&Fa7=7_b$AO&tnowEbWI>VGZ}z#%J~Uv-C_!&-mUp0L4!3U{A^NR_9{ z*@oTMnxUr^o6m-WYiNZ$f`(flP9IFHMmCFk?Ob z(Z{ixe-0mh^&eO8<_g)M9^^TYOp^ZZ`*{5;Wgex4@Nid0uMm8ORF zT`Eb$WR!pIveioM7ORfogMHIdsgX2#*lLqcGmA9JD&%)e{&+^9hV_z`?0C zq_H^R>!vTpGR#u8OP5!xO=VUnOQ~=h%?J)KonU|PM&3EHc;1xDkf)9(HrLyTvi;Ns z)cQvUQ!8;;GH`3&rc?@ES(W-zVA2lrOZ664kCiD#fA#V}&oj~UOIk2}q?`8^t(_Gl zATmKLa@ORsx$3VT3M85j1rmzkOVzI|d<&jmGX)4?5@GHf4$wd}=$qZ8Q}gD~Vr5N7 zHI;wX^n@01$}&Z&N2B`*Pn5i;yIio1?yq{k-d)rIsH^8WQ#;1)fLaY!y+)-6N7!Ny zB93L6#I9o|4UTPfzcI0ieq(T;Yw7wmJ;qp^g(BN2ZujhVG|sQR&Oo`${lQpizoAl% z7r@b_rnKM$n)*S&{mtedtQ1{!w=~(jTbh43qDIjb^EWJ>_?n(+G@~IS)LEvW@sZKB zbrpotf#Rlws-x-fnvzW#pqNHthxwG+nvSE4vt1tKdo^9voAqu{oPfHjjwDIyhjN!8 zfV--0R8Q5hL{b#u%?dcHb6br*m(9`VaBk};G(62E-6a#pT%@Txi=e@F+$c1ZVH$rk zcir9^C*`!cU-7(~C*}V1zy8^SMZt<#SJ?T~>bI4Xo#m~u5)R8Ur;3}_ASCt2pqwmpVE#GO57M%I|;c6yB|l*_dQb5y>gCdef9+nZo?$Mrp!trWr?2 z0XKt@x?xLgah44<86x;>Rq_))JIob>_shi4a(1-a$&YNbiV#7N%Khrby5ex38NvXi zHzYo8h69MzRbGC4vXoiQzua_99?pW!JkBul{XI+WPX|i3dZRLRoqIyDpiX~OkGz)p z1EZ6>og(2l7=CVPke(HPJakRDMA zTD{vI42MdH^=^;6?+Vn!@Y<+S!;@-r*WG@rSB!zzm$`$s(61^5UEF_5ee|QgybX^M z?vqG3pZjjjqx#`=`^sV&!4|4^J<{j(0_bynp)Lj>l#e;&*=E*Ae{y}H_&{9&kW`~7 zaAlZxCSYePlWEY;y}YFkGkijWq14rFsYJqzMq+1FiWTP!uJvv^EwJJgyL;fT6{Y}~ zd&^ugQ~Y|zhE~e%>l%M|Px0O0`Wj-l8q_nm$+g70wjl?Vz7QDifv&60P|Kzn>UHsK zc|>7uX;-o3OU-Rd$G%Dru1R0hKp9#Lxu)SmO|4f(?~Tkxi(_Trg?fbPjru|R5)dp< ze@BCB5NLU?17fQ+o+1oqa!#3{M_zb60M=9tcHli(AfxxgM7e)1-SO=c#gkg9!gE?Y z)Wr=7rTj7P=Zdq{r5BbtIsn5@@qO$1rl%IkjCh4m1}x5;3NwJ!`|{<>q4^8{Xt zZ75i(JH@8GRxwmqtGZ6t*b$y-5T`$+yz;RY{T37zLXm$8IS1l42-{WzFl2K8hScen zGo|hn@y-<)E#&qZ2nGwo3?->+sLDgn_gNahdYKe#GBTS5#yMCmRL!T%s~X{>EQ3M6 zr*2bu#I@N}SYlIlo0+n374?)S`H~dYSRnPjKqaX7I&byo?pj>Z+*yBDpmJ?i#)u#B zh$7dS!iRr8kPr$5w3k`P!79_%0PE)|TiUn=kN;VRI|^Z8C{$D#d}?)j29O0`F3sJ} zU;+`sBQKkO1Yr5zOX@Y)BGPOr3kc4aADR*H9Ipgoh3H(j ztx#EqSYkx*Z10T0^Jg#8LZleC>K=)*$d#kzDuRDGXAFC~kj6M<`Y3?RQ39y+Wwr3R zYH45Ps_<$$19hqKRmqNU4|Plwn}RtCRVTp3eW->R!?nSdfr=Du#mo*+acA(7;ks}L zyM-17b*$YcxbEC*YVDtN0hL<(q~C+s>&$;t7Vj6MXRS^|hJyee)4rL9UGsF!15m%{ zSnGdi(lxM8IQrEB45Y^FDHhLoHDeSWz46Cw2!==`NDyz>^=@QOS1Cwf;fi=f7xJrG z_$ukD|pp_AI~CxnK5OtPV2T5&3B?e5H9M#nKVhj zQ9fScPx$f?1opKkTM(Yw5iBIRHU-RuDlXu);GZSSPw_kma9-Tvd>S)g<~zOoa;(3x zc(0nFIfgllqhR0c@wZTMsp}~hq^bs56egb5RYd>~p4iNY0}K3BAHv4Ue1r(foQ}F` zebTjmmigtSk{nu3>1WgGDd%}q2x;Ygms)k^Y_>)}6;9@$ul5fr^Gb(NHLpz5A>akv z=#o$i>Wc)^AaK|8sJTF?#xwd&@r?IG0*{zi#AKnFi>=66gLfn}Rg&4=R1rsP9KSg` zfAwNM1kpCzE_@b{IUo+!sKU88bVt!@8U~tw*LauRFN!ryBxtJmj=fv;-x66HXokwV z+VRQt^~NsUQKswF@%8obXgMaiM39nB1QEKi)!;?kp36%Umm{01kPyuNE{iO2|g3dPF#;CFl)ZaZLqlwF@Q`HCb(9BR?!odNB4OKtH=Cgxg z`I81$8Pzod%~gIu<7MW0Y?zxDwW61Qlc^J3x^yMBsq$jq=3{t$)}RAIBDwL$^O<-6 z2Xe04i?+ex`RPQQH!xw|%S#>SwRw!tHa3;}b{cfRqG0i^Zb>qYLZ@D@)&DqwhA4&J z1xj_{2c0mPr%n-dDlP=MOPvNYf!G_U;58wqFTOY&=EiWj$S(mhw&c>=kTPI@hzaMz z!)uaqDm51}Rk6A3oLF5Vx!sq52B(HhN_*zV+EWF1C`9KLV#-C%78tUZgUdNGQIRr# z-0lrVn#i9)IfE+h>hobmXq<9FqaDYL8WP$-)Jifarh`zKv62U1Hh|1B{Hj^C6d9#d z&@h^L1<(hpy4Slkp}JDi=^Y-wS9g;D^4`sFoN*s#Y|ql5LWUwqH;kUTUz?a}i!OX^ZpLXZtm~ZhWHlo4zmOm{W|~#jV%R$I!-EhvyVEdPm-W>-=MD*wNs(!R7S* zg-~<(;e}UC($m}sDkr_s)nL-=zzy?$dw6>@20+xys_PY>)aB(jy%xlG0c)pj)9&8r zU^n~+fy`qmijN2S62c5FNKZT9s;q z5yCj${d`wa-R#3}+U#RJpo}H3p_UMz*~uNE#=B@2(+sC7(ZhRFCG&If)7o z4x8N}9tzHX_p5|$d~ya|=>W_!Uzb-%(a%E|0nj%IIn8`iiFn|RfTxrwn-z~ti}MYK zD4Rkt$Mq=hebV*WiWw$j4^W>v)ujREGse;Igip|j!w%ZQL<%GG_U$Z}Fz+^WD<~8D z8o2R6Tbdt$TV9uhnosP{($)H`!x)c4Ls0`AE3ral`~#6{yX>1p8xRdJk@Fietq%&?1$%ug>+|&5=f*o z{OzlM0p#!DbJIyNCR=U8LnH_jEP~zFDUj+01Ag-s_=<<19QB9iij)>Sw5EfAM9h!n zzD;5}FkwNUEPZA+g;w}XJAU1&Q9G9owynF;{3!Br8aO{W9JK;6Z zBg?f@OfoGMR(zi7mE2*JphP`3VwAgotYX0>1#4EkMW+hjF5xjj0i)Wqb4mFAGVUR^id=+;LDSy#`bT1*ROQ@Le7C zMc3tv8A)jDu2!$Xo@PeQvso~I`1sw6))$Ls&4l#*#CL7nI65*)BC2f|RNB&WYCx!C zb*-}cFdj^nF1bRa1WAzc*fs9TDSdvJYm|#SDuLDNj81x3Yh4oISR^TN-dwPO$+8Rt!oqZ^T=n^Ca7NG^ z9tS24)rhzPomI!uDQ;W!)*6HcO_hr(+?9|w*mboLG>;2B_+ip*F9Fx4LzM~?+I+LL zGDYz*Uo1sl1V}74#=V_?9tY-FW`zgP-z#LC|CUi*8y8vtdjlPb;p;0+yxOp6b(@6scmX z@yU;d?Hur&kq7f4LQ~v=%$y*}sPkbAdq(CLgU*J?eCNv5WR_8X%%tzUG<`?sdsx{b zYkcB}%||_7*jT3j^l>j7)$4&VRa_TfFS-*dkE3UlATUOx$oT1S7_tdgbk2`$8%#6wbgWh%7UZOVu@P2r=G-IjT~O_xzXgp^j#&hphB;!=eJ&& zxjGiaW*H7rq+8_f7qP1)|1#zllLuh7mCgjFe>3cv2;ey|DG+;xkGG&8Nh679ynhsI zMiI@XnoEy=!)a^&`6-x1j`yZ@tKpEqXI9YI6bG1vuJbkxtcPl7Y|ykeZ3Wg4ObUKK z;1F24DgUOXMs`rkWLbyIr8K0>U8Cs+TdIz!#(J9v2LHV@oe&Bur^UkFc-ZQXuDc_c z<9lGHe|+vvOE1-3Z_6Hz!&dtzE2J$8GoJFmS-O3HcjtQ@7V2V&b*3x^=fCQ`h9-fc zzOf1{D9?oyQYK$>Xc6>}1L~G-G!K418I6nnnHB_AsvigOhC4P`$z*-AyE3`CYy|N; ztH`P)A=d!1A-kR?p)-zbu(1`;o3o!6`=C^>Uqm6}Y2f;S@8(3E{qP)yD;%SuWaAI*Y>~x05rhuiTe$1C-$_nY4r7}YCSAkqqJJ%3aLjy|;E2tM7 zv9H2#SKEf{Xh8r-ZGtehAOeb&^A`qRMZyEPKqa3^*$KU|gmLh+y8}s3C1@I zrAr~O5MM>$PwC4uB^tWz{G~cH#~>!u&z^0-gGfme_EiKt6eYsbXOO=hnxkQFJW(o@ zl)|&3>vEt*j=IAm@D# z-MLlY0eULF%G=95h8vLQcnZaT^4f64atJwK8!c!hMH)+@ore9S6;w^SDM1*w=WuHU zu}rmxEwP0Bf7D$|Z=)~}{wtjJP(_t7=B1TZ!X-#OSK6M*vq*tNg;eSO`t^9s%YiHj ztdywg0g+%c4|`_f`M$X?V&MBVtoOHxWK{!$jFT8479sBa)|auHavGU`wGT$#BrX`Q-TBOCML*Y5F%fm+^caiYB2#>D+0VGSzde| zk*{%P5Jky4Gk$D~pYjT0zSRtHM zKH%O#R@Z)h-{dgFQLL*9QxDFvgHdTmeM$!I&vm;0g7GA9c7>taq%?+(fqV~y^-@eZ zKo~2~zq0#2ULa3qQhb*P?WisV8xNmdC3)FwDFztpMwbriXfv39iI>cU$%AD{?&kIB zuoJq0oPGryp2)tiG17gu{zi!KG(IKiF|DYZ;gR)b{FFV(Sfe(t0WM1&9&%2!{DM#` zqM;`f+{$H@7k0R8`;K(kId_<4HeI$O!t7ZIRbz2$B`i!aW6fQYaKF9VjkE<^zIW@5 z_zJ^B0+tZr3wVvMGg!8bRll4O*8G^yA`?dzk$7-OerrE$G`^wDbPCO06ZM->;78;P z8b5TzU(ha!Yr@A@b+~Is_2~m;3_NfKWEGbcce0j12C|7WZBH|JzFm)a_aeh9c(_d zswO&-`d?Ia#gQJDu*mXs1XbqP7U3_jH9fwju=IDYx)R%0u{rLH_>e#X0FWk?r*+mT zy9e$S!7yQejtXR)fKr==+9^>Qg_cU@|6xPa5)n_GuU@vH^W^lB4P8*eLV@7z zc1QLFN#|LQ+imkRjYXU%%NZ4E+*X+F0MlSEuIF-h>elhL%7-9xvrZN`8#R8DIJ{?S zL@HIzjW>~PFF&p-r1#Uo{RIF3|Nq>WTW_N{6vw}R3gUUy0dq%_N(l+mYCEH-?d;Cm z$N?wumSAL@rkPK_$A&c5=}?xD(DFbWeE*&QIUJ+g4swm5H`29@X@`Qmh}(3ad-VlR zLtfJKexMu1Bu2JtygnL}IbLT%)>M~%{Sm6vZCd@rEEgrTU(y`f5nPI4NwNOn`s0V! zM&deuV)>jd)|_ZD%}Drdk}qgZzCUcJNS0OQ)juW6WhYT}Rrf-6FVwmV%&}az6T8vG z7@A$}rl{7KuUA!pX3rV)c*Yqtl>1P1x9RSgUGJ^#AQxGqsJ1$*HZ>+05#(q;t;mI6 zOTx8kG_4xC0VEf;?gehtb4d4OK}$h+SD1Ex$ja?IwSkZ%o*5pw$p>U|t)sL}XOvJI2;iEOom6AbS%oTu6|Fp|G`EtXn; z+0^44CmMR@q_ceHHwozr1ABKNrD`B8UgwFR>>ZKYLB47F_OS1%QpD0OIE}YCUeQGR zi*P!p30AP=*e%dmV}CpfeDpu^!OyTN8mfDp0=yrKVVcNuCOuVDD=d$E3maJ#jAOo) z5oxcT`HoNH&}2n6veB@o$v`VUBb?`dBn@Zkrv(znF)S+@_SBR1GGI?6?<&pSEQwgc zyG<~SA|C(xa7^>Bbuk-f99^etg^5ya6$%p!3kun&qTj}KDPzX z*I?r1-Y7Ge|BsvymBQ@<=2|AbGNCKrbf5}+cOsWPPK1^j)8@LbMT zE&Qs9Vk{?cMxCE-iwCgjjXL#c@&t-_OwmUwE|n3sS|s4 z1yX~HlR4oehr`bN@H275R;!zoUp4xm7ke>^;;s*eE#xZC?}z&HOrw5(KU{9F7I&^! z<(e%pXYlkMqzORNDPE8f9J`;?P`^?#YNBMfwUVct36`*|xthH(`!4EC&9z14 z%W4zODKEtxtP#8hDckLB-eTiFQTL8VQ-xcx6?+q->(4_i6z-oW)_F4?%WU?7zFUXH zU#Qq>qGG>&Jmxqr=Zvp^s?0}enaW~=S%aVJ*)Ye*xBbqH+ZEO~qO*K6l~+rR<=Ixd zyZ!R@+eHzVBoWi29IxJhtXvWdf$IKs0_YE;4)nCzl&*1wj^Cz=9k?cAqFD#C4!XtS z;RiI^fC0=vc~7{6vg=#52#UpLEY~MkpWzJI$fql7UCb{2?lwj9LSuY5-c!0%=tP(rO;*%Eztek%A%V zb{;7lk~Z^5gY86y8=P@W^=n7IOM504I{$_e$=MOtpWNwtc+}9dL~NX6;B`EB~D6 zdm~oUAX<+xe-hr$X_XMYgS&}mg{Bu=e`N8ofM5VvBRukFVHul-0Z^CShLepQyz_)$y`5EqjWL1=ZDn{n^4WUS(J8qTf}FuqX16v{SfYGN|75Ln`}N31tk z&QM#=3=>Za+NuR!NN)}K@oS0tQ?P<}wCroN=dNUzf9CWwfz>2@zX-{%iFrvO*Oi>0 z==n&QfUmh$q|?{Y8R%3iU|PMA&8_OBNO&N}{{#odTUQQWvg?5_2e^ zV#3uXlTQo3dXa0-Wn{*lwK04=?3Yh#ecUuw{f||~dfQyaRUb*?Ut8Dn9)ARfgL$zw z?QsH&HeB^a3|*L}of_=!L1oh|uUaefs$|5d%4kvjWnMnYuleuQFCW9heii!vRsB^J zpM6R1LGJ#Ofu|J&8cS$ylg6PeUrQT)_5ly)~f<9?IjWq9* zHq%JGcv$(*8hEoKPLL#fNWYs z<1s|S>pg2F3{G&n@qeVybb{*-Y(6z0=mA!Q4t!bEj7`Nrq^)ktNe7ly%_*~DIcXbM ze_#)ME2aa8@==IjUhA+I>)v7M$VACFT%99ieX+p_)=klr#CTvMsELaXu{>azAWc8B zOgb)T%LaI5ogB*J=L+?w61i+?>E~#VZOcB}kEao=s^Gg#NPmA$%u|9TbaF<*$0HXC zKWCr_%GZGkbczhv5e~Aw6jORB?DqUrlQ^@JD0gg2ba(AXpmPq*RRT~`i4`_NxnQ#8 zH1mu5BseZYyY>i1@30RJKNh}QSm70GtaV-etSfwwM!(=j@B5G7aPS(_p2j%OOlQT? zl^vR`(e4fvHYylpF;*(y6HEj*DbI^n%+p)(CH=Mb_5NY~&G(l7Rr|XtK6s9Hu6KU{ zlc2m51Q?Z%hm)$LAb;C141n(g_8$!2TltZusnMh;mUifETRUJoDzY4F)5DPDJpTPC zzmm;cVY~Cel43@BByjb|2u~?>2Y!V2(>XELdk^b^=^J%20Pr9B)iuRk!1?fo0Wl>RoXhb_#4bum}F>%o!jpM58T%W&;~ROPrk%>jdM9bp6aR>A0X>b-<%I+rwh}wnF`=Rau;9>}|BC zQ_J4FbAQtaR#WijO~|~>ndclA(8&c!p0-kHyy4&xl&=RB=v6!5?vTiCsHXH#$zA?5 zlZ?AbT6(S}`YSm96(E=;1=jcpYUet9SjX`_oFAPOex0_GHWx?}IAf+?mVOXCJVvv* zTUd+MG{Ysg?oEBw^iR4Pp6!u?d&v$%-r>2AoIUghX(by4O&w&Y)2MIF{8343U~SGM z7@*kLd&6*}&@8g6Zx3?IB=!F9wK*oAzrQ#`wl-ILS>566y!r)`pu7|WHBe|7vzn*a z0)KR_N@1!OB2}BVm!xp)g`kZNYh)s}P7~Az{kh5^wXg{F04!f+JB(&Y6xjsQjQl9M z&%?K*R)@z}5Sbga@fe!jG|^$g-0%nnGO6rCkc2u!Tp>i`gxGc?v>}x_IAvY}kZx!X z$+B*l9W~>o9-1zi)ACZdM60ioR_oCkBY&eZ99a|Y&R@Ez7sNi8MJeGePstqgf#i843{+rUT5MVqGkepF1+MZni%LcrU6(-3bY zEhw#4UBouQ1Hkgg{-T^r*V`QtuPtsq^s1c6EEoL7){UESlzR9m??2R4k_a8;v48G> zQdsvrC;W^p3=(ADJApJG(qCY$e+p|&IFX+st_r?#h;@Mz>qu=A=`HbWqru#@2eu7N z*e!W|vNr6m$o9zGf*_)nac`9pMWV+ObYm)eR%FhS3O-^uo~>3wJwU$spMU=Mzy9Ul zDwtAonUlPS#9Yr*62vh}5Ls_JC4cE&|9zl*AcyuVs1C~Ol`Q$m3|A%}txvs($0)3OAPOqD@mx*NmXKxX`8b6o>zxIY z!$|RbpG@M16;$*vd;>W!?x&IOS$LFm@ajR^Pbwt#4TmK>eio>aRnmBpmVe4A9_(fB z1&PA*5Ffj*oV0NMDs`9x8~FfQYdOJJ^WL)y8FF?G%#EK| zpE&kI7^mLf5PnFInNiAn2nQZITfPP0zsy|n-;Gq71~-k!x}XS2qB5+~*i=Xo*Hbt{ z2Mi&iXaCc!+}gX z951pso?nj`uSdcxK*s<{jYvDv#Qe~|H*J)IHYh@5JS*y#x%0Vd!sOm*!=z-55);TW zX_uG9ak#+WP|D2d+}1pTKo4!A$149%izdxRqS z+f-P(0(N1v{@a<-)PD_>5HbjU@qrDSbPRuS$*P+oPk*YTZh?*46xW zkO90a3J~3ImM7QuhM(@nZ(_TD$%UQXGrt3IAN&g7`h^(oI7W#ConYvVmyn0~bc!iO@avyu=wL z*;X%9E2EZjU)fLmy_n1UY1D;2dcH1WCpclm(yrIv}vh0Z|!cczlxpdZli728%y?1OB+~Q+G=;DPBNSf=Zk^> zj%PAuQ^yY3oE9kHT2Wzii5aWEeC{Mo$K z>YsQptDjK)cvX$jWWC=Ot+pHxz^ekcw72g~E`POA(aPM-(mO9*XQ$Uv#$!5Cd~zB( z*UQ$+uHI3F5tAn)ly{W&#I>xIp%19jR-T*$-@l}#4JXoRw;AcuP{3QYGi5h>n@}1TR9{n8`MpL;iTyp=i6Wpo359yjh z2gCYmoz&`U!<2fUH6BmpMZRr>{bK5~0<+V{(P6qWwxxzj+`A4=i|n+xw)%5<<$vrP z&jQoSVgU_%BQL^(0XJ?zDN$RBbOoqp1Gt0LE=UgJ{a)Yba|pO#an4UU0i>jOMg`7# z)AnN;OdVd$Hel5og22}1Q@hhxI+OX@=pAdvfp@5}$)ExErz{^29i0oAVm8Q!GvU

47rz_5wJiEBhUZwufKa`p`G}YW_C%+am&~^mYvz(}!9My~nSG z#v%Tl`bSkc6<1kxvsx$L&F1#Drx$1Mu=HvNx|hfOw6pV&>zA8C?=GyJuz!t0=DHx|`Tc)RD!;q1%^hwJj&9XbD-4D06 zGncj^CB~AtoL|L52G=#0yOz6rV5~fIFO;mjJ<;sU@CP#!Q93R@%)0n6Q((tnd3wL$ z=`Azo&EERDU64e(CVXAcN+_jou^=R zjts80gf8qJ*9TptYSd87&Az&CEn9~&mZzuWIPz*oZ8Dy2rqQWpi1uES7N)FS)Xt&3 zaD_Rq>$Q9l*5_O!UBxHv7_utmcVp(jPK$APUG&05c4)N;;8L}qfJH%g9p>_K zcapg6;!FTDs84mtaJ}0G1T|>dfTgi+Fvjt=yx=-!N>u<0~4&MpUolH0JT`U19NOE)^tzee#XpksKzZ7BW zsp)x3Jby7Vlzxbkz8t0=)&}S)lv7WCJ=nd`@VJW^zbR>^WF2u#e_i0eEXvmM5+l_N;CSJk^M6+( zoHLRo$^xHfa<5xK&p-cTMeWXeU1d5~`V2=?Ff z2oPE?&VUar^0r~}`M&{^pu7~b61SoS3Yu2fv$a_P04d#*zPu)Xj&R3;Dsl=}$B8eQ zNKR_<)+SqK$7DCF*|aQw`dQ#bR;(XVmTTe%o95yE{0V&C7@T+b=%-_V&%E|M1iQ z{lEVHo6q0eK0WDwpS}4+ueg8n`KxDNeEQ<)>GkKIefH+ri`!Q>Z~pG#_3gdDuOA*? z-8||4KK|~rS2vHpfBX6;&mLaAzInR)?cK|}r*A)V#-vX_yyoGHPv1V?fBxYWKY4Zc z?D65v!`DyykBk9f4}GU z!ymqWx&NT4|EW~kpB^4wee%ucuWuipX>j(aDqc0Bb!^@vP-h88d`m@Ko=l^#5 z_;mMw?B?Z{uWz2|uRi`$8`JxLdjIe*Z||Qyy?v**{`vOtUjOJF@a)CSfn1%zklJ2=Z{~$xOsg$-VgE3Pyhbm^Edl1K8*RzCx7_-_K%v1 z+vj&rG6k>ip1-=$wsj`H8~tbWif=yuS|5LZukZht$M63?jb?AvpV;@m{TF}z@qPdG z+1vZ)Klnd?@t*(sw;x~gUmkpKZ}y+wXnt^7npEWcK-YfB08vlaD`RjLojP{C<))`e$VS zr(Ord`*uK5Iw8dz-ezrHjQCl9IwR2s$4JWg@H=UoekafNK~Vkzv8H%_n{~l|Fjqf7 zF6SBXKF$NuOl2e{!*gI$_J`leE(b)Mb)A35xhwPAT!?|^O-ScCaLK#FGimk1?_@Xm zOTF!bf5!(?`FnhHf!EZhV0lf0F@v88&Ni0o;FA5oMSg&^en7%?khc(j=3==HX&oda z0SG(|xqo3eOp z*|fv=WYZ5iF>4F6TxT05k1czx9V4M6mV=zi#e3nBdf`!D)(@8J%a_CYT(KPF`pQ@2 zl`H17rbRQyb5KmN2gH_t#H(Fm96YunmB`YocV+&aYS;Y0@BR{z3FH~AIUV#t&7(5X zOq{IWnzx79X}%@a*DcJ0)ok&)4kL)g9^RHr`WPdCZ6l*M&c1n3Dp6~ zSK#ki)*rP0ijsu`(h|y>72T*fYAYigajvZi@x4?0Lqw+O@Jt-c?5vc$!5wV(;P88d zq>1ZetxpT}j* zQZ-EpJUg-&mcMlRa*)Is?BXw-Vdld#aYoi+%ZAR{WjTA0(d8>MNV~$cyth{_?APz~ zMMUi)ePkQ1wlhg?^#K{oh@CZc;68OWR%R&9<<9%Zd1G1Lgj_7WP6YDsJ>JE@-{V7` zJZkx;j^{0ZgjV=>LcSc&jwl7Qbs?QOl8e%OJO?TDg&Il7U>@)CcH9m~X(+ueJGnWG zc+XbTB&rT7$y+i?1o!>EURahBc@8%I6d$ZqhL&b=Q_Na7JpGY@-i z`tJC9W*UKKbeWKOc9w~r-?nT@td*Cf_wYOZ;7PcZ8}oQ?%*9ax84NRU6@)~NWO*w; zho7;3HW*w5Z=GS*>22x`CDDr#H(WXItY=o^oqXrRGtsi_c$dQA8E@z0XMCy?S3yW; z3+RK39F6e7_l0sGFE}S2K@`8`Igqp+Mjiddn$JhMdZ@*OMD}uoT#Z*-o>659Nx`z- z@kwqD&w=bI$I|?jTj#eGdx)(IaUACpG7r*!TjaL!2&%-FzqC5raR&?O9Ix_K{D4PL zLn^$3Ypk6A@iiU1DPMD$Ja5fb=GVUYi}{XkA=(p?*w*_N>jCMmGvo3-l*7txguk?l zSn>A^Ij=m|L#BjhXY2?MBfe$cbFvo)?J|SsjGABCB`iBjPCBxhAdiJtE^HqeM;*j} z_rwFn#`S7-IT|5FCC+mYCTf!Nr;N0rCKEb6J zc-~wpoaqX33pi4uS(~i+f_I&HV(`JR4Hj~UK?=z%*FuWpdGlc|o&za)mTSpwVYwD^ z@Xdlmkt5DQ3&i$E)~6I6wX_cBf3)R)2gfNwGLh|RNH!*ZTk?T9QpnClp6l$SE*VLN z8DzNZwO9@=?M7rz;fk5HvXFX0%Ki+PBU zbwFgzCckZHFYuR+Xt-)Z$mA?S7`a=PgOTS!lTQ~W?}ZuTLBGwIxppPYbf~M@kqyqz zh2;`Q>cf(@;(1#~IaslVc|dYwwh^7N9On}f*sm8dIeQshYRu!KHt^v~y%~+i zCI^)ne)KVNt;a?hOGpTf_m5mN%aKzdhb)39jo}EBEPZ1pq%lvzkXCLz0Li|Azr41JUjvPw1r$Q$0;Fx`3ZmG`+921IJz6`HIPMxiPOuS6uSb&hp zY&~AKv!4|&KR%YZ{{Hh6%w1x$ ziTwp3nPX`}7Bk4$wC8wsS}KR#C_j&5>p~ja`Y6lD_EbpWm_zK&9^|^m#a>Pvt`y$E z!;QoD$aCeYmN;TONc`A;8wimpbH;N$O?SNKru;S@!Ho8xm6sjN){`-dt(kbY<$69L zjq_${Yf_v8>AlEN>LhRX!u3hkd-fZJbhdNJhR7bjkj_<9a%BR?goH$9HOZOlgxJLr zpPZaplqw;9@|U_4*k=+Vj{y;HJZGenx2M_hZl0d;lYLq_dWZUd5FzdKwwO+%j+L!h z60>A)HwEk0;TeB1BTjPoS?{E{Hy0z$a3o7e$igl3~9wrCeG2r<`5o zxz70zsox0OEFqO+o#~35wM)A4^Q7xah}K5GB(hhKst6>1&rWr|o{)o|m1?SoIjCt4{?g_$*98cvoc$MasHaG~PL*Y}Y1i>8 zh*hx-PTieWp}TtVuJ7)^l~WIaJ!Bz~BhIO(d3q*i<}PVi$Ca3AID4=d!#U3B2?>W8 z9qw{0Rl_x|R7xY1gT)xz<7PxQ>+sB}0z$LqI767GJDfa!Nz-SJ$EO(_vrZv_`A(W~ zF^5evS^UBH6b2VL#HXOb*+Qj-TN7uRHCdXVYBgt6S zusPYul}b5D4ETFe%v>d!chZ-?RJ4XQMb5S!RxaB^6};%qA*+}*am-zWbk@o_i^=os zuHNx~xwgDH1{TJzn!O#9AU~cSGGTSZC9KTzu0TbE7;C5xD+7VI-MiJ-!rn~=+`w(Kgip(lUdC*U1IO>ntpMX^qQd@WOSy%y(X@I znH^UpUrT-ozfFD?dpSZ5H8R%<2ith9c!=&_D<5J3LK2_*C_BZCqZTq)A80cg*73!J z&iRsJqUXrZKEBP8ST=V+IVk&3B(ABDi&=EB&hefrHa0#lBV=*4N!jX+N8sFKPEnk< zd=6R2#iu)jG~NqE+mz3w2x+`aii_oc@TFe-jo&6V$~(Bo0=)($XR4Dx`3XxOC$WGTNo&dDQZdFP`fz%f#Qa9NCM{&v$d*a_&)^p8VSz&U_uI@G+I0r%&=h5pv zpNqdE;vJat2|08Y*?}L9^Hq1MITcd*OmTImEL;^k;7CbzA#fE{^(U=dy;hrN$H%}q zz3P)^E>?pr%#nn2W@$nO*TdG}7U!y^kPPpI8jWXWC**Ltutqz$lDS5IchFTrF826q z%$_STga7vJ+#hJ*N2ld^^$1w%E<=v>9us*ZfqGSgsnc#Q=>!a=%|(xme{(9VAf*>ro-&FmELtPPf-;FV=~* zy2$pl*5J7pNUiCR$*)Z=H-Blff1ayaYTKQd8S#e`&{7@JF(Bj`dZ#~_>Ag|~>vl5hn?^RaSIKOqPH)_l6yVzgi< z^WL_bp73f1mzle?5KfX9QsXn8ZI|eyTnh=@d!|Jwc-ueWC=N~PYH(OF0DuudC!$x4*Ec@1XrK6YF*|z zsHYAYLKesHo0to;Cn23HM_P@E^I1X)^Tbxu;naC+=Cp&Gt(;YCe=Q%nLo|8SoPlcH z20kOu4MTs)=`V z6sOG)IcnJCiE|(4HnTtM;F$;a4s6R-j(W5eGN0jSD^;#JZ7Uap8maI85V-66K3R>c z(07~O!`tHG3jJ=vxAF)o%WkwniK0U_z| zObVW3HFCoX+tV%%%`t~A&zUt}&%0gO0hyk^G$+eZ_nvcMe~r{HyI8;VD}Hwy$PbXn zRXY6=3t-u~@*#fEi**O-E%wlFP{=yygW@aaoqGv~ULd`sgBI)69BMs!^`0xHdkq(7 z<-6Pu?hD#mFdRn`;yAt|Byw-zz6l&7-3-o(2$|eTpi3oj>`6#sUe)_P!Ocht%oByQ z!(8`l51OLqe?vE)t`+4>WFM)r$1mih{ihsMo`dN;ca-SU501$683TJ@LMERG5wZ?5 zI<>cX&n-I+wq!ZS9*dB`nUual<@j}9=@3inD_5SKVO(HsDdfd%Pr_S<1Dr<5folm?CXEWQz;oQYJaUq>!e|E!#$UAtrc*so+X%Ln-AqP%A zWPaFR7~USb0T1sM+tcB9r8go{d~7jBI92wHAa~*LOgh|XF``XuHAf7YHB@(v4`QTAw77!e%(z5^499z?OO}1j>D}PUtLep_aA!@Q21l6o5jEZ= zLJp@TXNZSL)|6At{CdheWX3gPE}YMr$sKm%Owsesnkg67Z!?F*(W05-q2tud8$#rg zf2reDkax&&v3a@5d6{|n$dR9UojPC6D;ln065`p)2&rthr)=|K4vMj?`DSs4x|&(S zWG{4u!aV!)mt_e>mzcWO8-k2% zwaZ5j&$vU)&yp79$ifP7@j1#BQsnzsR>+C1nUKj@>=pMFGmO~5`)5UWxN~d8D5ZEn z21hVflC# z&T-ClUD2MJ)wP54RuOz&xf(h%AvqX_ z`#x69hwgYnF7A)Cnm^nLu$tC~B}6QMeZbX?KdeGGnLTkKhnref_nzZoe?l(id_u}$ zwRFUKPOcH!VP}odIg+(Tyg2$Lq;MAsA&2uN zYox$2p|xFP)^F1Uu0mYXX3qaCdHkGjTr(K%X(8m`W2~7H$2OKsEk`GXq{F-|H<wGxAh)#E<%V^)*6vs|=@4sECvHNZ>v`p4n&pj=yb1vfEf3|K$z9-U(0(6W8 zSRXU@RNB`!cGP0lm*CNsSl{;iAhMjnGY>ZS%;&1@E@r@}p$*r*c9M~B;T>W&l-=ta zkt+E`sS4F!SV?Agw`S~^W213=R?$X#;Qkxw7*n;;n~c5fcP~ah$+<78>@10L%=p%0 z8=H%GzGPoVxiI!*f0GY}=Q;&#e4OijmmNlnY)aw6E)+KPSP#E5L%~>pP0LQ!6uWa0 zX7YtZ?zUv}P6*%#vH*<8>|oWvnk*qX^Ipg~JJx);gn(H^n>T|*Ik;@(e51WKLBUb) z-WeD@wwHWBWL)+thHswP$E^!SXzf*9#u%5q+Tk3SjA@>De}AwoyFV*Re32j`AGI17 z*M{4&495?IIPQaPt26@kh?4oq3D2zBnk=6Kvo(9ZZNpYA9Yz{$?Kxq6qOCJejFi~A zVnGgTMS2}}C)%cwyIk9ryD*Y0GF97J?s!&F#wQl^kZt#l`!H=) zIj{o4_8Pfjf57%(3f8IGK2yXlZ$dIhJ#1h5f@enb2(I?yTxm|Z03BHHuk>f6p`f{MzY+#2N1i>y50Q@e5F(Hww zL^l$#e?ro^k~*HXa;}T1(he5lCdN>lo6_Vc2X1YtKOhD9wGf{%cI&*j9oji#U%XF4iWgS?x{&?Af0F<%T+t&xaQoIGmV@10jHP#VY#hZg(B#XY#He#b>e& z25-r7*+)KKzptM5m^TygH+++*%RMyoa>Rl{MjI?7b?g}Gt|s${@^+0J&_8v>YdhdG ze?^-ceNDMIZt)1DsQ7G>kbUD6BRL>Pa;3P2oX?ehxVzm|tq-zWA$hQb)SZRHxvtq< zETcju)*rYk#x?jEIZb%tTF6dc9*~YPAt(RGqL=dy!T5ozb0>rmIdw&I&3N_~v^X|0 z3uxYY=3;Vo3+8s+K9z~JE3Or}>Bx~DPU_X{gJB!GTZRB`-TxSkz30(^|EsMR{T}; z=rj4t94hp^Hg?C@pb%|He|}pC3t8tbs^Pq*zmny%FG4(b;1&`W?_jAtKBcgccKDuk z=nyD9bvUK%%Vj6>Hz8?ZJkeJhGe*OOWX=%!>Qlxn!bTSM#qm|@pXIGeVPo$=UoXd< zEBx+#hF+-GU-QlBzRtjBV}&G#RUp2(aFE0%^URiM6Cv!xzUhgfItRRv(H<@|jsInNiw?|7E zGoDhSvS+9h$IybKe^d?a67-CO#EQ9UKbG8j{GMs;VEs02I#?NbZ4)Chepcf!?k^-b zj9dEIeP@ql?k~l?FvTocc9sc|wem9YLciWGFXfN3BVY5vD1l#_B;j1I92$Daawq-4 zI{u{nf1u=ImenNXB|{A;BQy5?41D_U{!E16FHkkBY3~2;yZN zW>P||hI@R5eWN+{77lSZ?u@W6k>(DyVc+76^%Qd1f8=A}nkKo`Xy-x_8$?ecq-MFl zi;(EBPBo;F4aPcyq@ZI&MqZJv$U5~cj%$AQ9ZUu@ksGntjXvZggNkFzS9BPe3-SRI z)^q@xf38chd=em(=J@1EkWolj11Rbw&4(*jt-J8flThRCddNs>n4{cHJq&s*p_#~M zQsn=|inS}D4Lk81SZFI=7-b7Rn#uaQM{6UFy64^C1(D)1)`tkmT#Xuf4U5@R@3CX` zS?J4jjM)jX7wfma97iXGB+hS#p(#MFEF?7ae}iQ(e8P@KVeA`6aMYu@iBUtj?jd0X z_`YnHbK*iW-^m%q3K!;?gdA??+sMR7eV8V4kDD;_=9i4fX5d`UnJk{G4*M!B-V3Yj ziY-J&G#K{}Yl_2?c8R-g94&3!%oigV(bQb9nl75=xL3cBeK$8E!y4>A8pTtYlM9I% zf8}7`w##=^?bd|@cksRdiL14um3F}>s4Sx!s6%ArqDP(>r9~IYPV{;TnNSpm4H)@} zzW9PQ3;OvS@jO$MyX(-KieXpJkQR#?*oD?P1~2=ABaolRcfiIVuL*OMLL{cN=VHh? zAP?DR6u6(AkXSIQ7{l}ixtQqa;WlsiQJ`j^eiP!kmw`N-WHG)IV=)bD7NVHy#9Tp) z%Uaa_yVJPCtVm2TPV_?MdU%f>SWLU~C4Nt;zGCJsrtU9{&_=1mi)SZqm5oxBFUO|` zVlI=$;Ua&_2EKP$NUV6KI9_gFVScf59OIL?mv=-@dhBI{_; zWf*Nniylk06=Q?3h>Rf*5t0mRq_P6v9TjVL6;JR9NdY@F#X5HNJR!}bhOxoemi?-HN{AtPj1C=*$b1F;xZXnEhJvp10v4u62>5-XpqO;hmf3j zedh87li}hMe{0x?>`S3>)N8rM>$6rG%&XSQ1MQqFOyC|j$y|P6=SwNKRPg?vBsaWZ zCNf#)xPC_@AoHDDaxh%R7)r7=vIiz4bBD8JdoC!6o9yt}3L$d#NUD;v)}ZIQkHcF$ zc`qFnB5KRzvQ!+-j+l2x=}o)j6YmH~Zls8H#K~L3RdJHs!Gha~T9L}s_k;{*Ck zX_rwU<4Qh8?t_uU(F#^Tq#fSJcw!3PaW_*T(NFx+kUXEf7dfzpy%4gt5K4Twaz=ff zLOI-tCL|V&)uhlecYTw}<12r3<%ISprQ(^#r!;&;J^BtoowzR<;tW*E)-1eJL;5Hr z{+@iLh1@0OW-?ZRq&!{44kjtD|3}xEWJz+vF!V~HiIkQa?|-BQtG7Sx=Z*0yGg2W@ z0LMt}A*Ab8K<|q6QWNqW>lRJu5OIlG+`V18gztqub44$;jo2jkX~Ta$?pkM}wizRl zHm6ODvDiGN@%^LabgcUjQn*8giH1zRvsMhu#&^0}q}wABDQoy_tH-WqLtwt*bU)~gRAgtotrtK@`4c^@LF@U%hOwLXkv*p8XqXf1an4)PPM z#`PsaB-+p>ZtVm9w3B}ePrMS+e(aD_#8mP3h;DH=EFqq-n#fLT3*#8#qLt&ccE;D4 z)tr$wTi7EDk9iw*UgHkJc2k<@$r4f*W{%jcAIC9-q>NSCb|ZTeSLa5hAU^fI=|jJ= z5MA7O7T)KNS*NHi&-u3J;dfvp4Xg_lQn>2eUUX;WXFDxp{}6wB*E_QfAq$_)#p5g9 zS^j155L!1OKc-{_QZXVOB?=e&c?+qWW9Fadj2E=2r*ktI$}J2B=9aIbM8 zZDHoTf0FNbvOJ}lQB?=MXV09rVPn4IA|c%4)6=aB`_v0*+&99dOANi#LcC)IpGQ$X zY7Eb%T(rs_<& zJNH=gVvQ>~W1I!&hjrDfpnIgKYBdDDf8F&39}{V)gJt@#hjCn+(|$K}#l4H>=+ zZ#t-%Ty&88;R_KH!Z#=*MPgTxkT$dIECMM&e0dLr>TW3=4Il#RuEdraqvm_D8i0zUODdI)^mvz5cUcQ(Ck zd~>tuY~v1@y?mIR5lG_uXU_EF{7gLpYII+ELd1C#X z?_3+IDQ%qS;fTlzU+@p4^ZD62^L#T&>9Gp+qesK8!x1Fyn0FhO+(PE_jj}B*kMFY?uBE)&VjNcb+1_*gMJyeu32H)fR=Z*aFx=G78+QhDlabu=M zkC=Zn-b_8bo#+kkUl)I)Un(T?EXMxL_8~**;pIc#t8YmYeKkUIN8Z~d3J#w7o<=m7 zL}ccJ_jXT9_KJ3IPh0j4f2s7shZ%)kRL3AG zlPT&V5lu8wE(g7NBUR@NuOSxA^N^EV>M;SllaA_A8ItvA`D6c%kdpEK8KIc?mqx`X zpSd<0&rp;3>KplSb@s5gIb)e$CvSBVDtE4~aADGsv?#?(-gh^B-Mjk|jw9!_X@Q z7%(gu?|-C{YyGpAt(TRN1Q^L9#`uMpW2RDzVhB{#ZTGyvYvu9caikWepjxV3u}f zTNokK_V6DZ>1@4!2wc%4dyT#gA-Xitirp_d6CjepW+T#K1}Y+6Dt6@*(r~W4kP%@c zL~e2P1nZi0qZuKoMckQhjOQg$Kkw*G5%Y}^IrU*gT8QWv?H!jLFR17IlTAb`=AYOL z>PG*x4bX$((zF9DtVmUJj6nH!3(i0i^727V>**^6*Uh7UlNqkHr<^Y;7MB347xid z$IL5lF%=X~R{NEQ;xS1MvyR-8PwXJ*gaHMqh-~gMNS43(cryJaVXz zsp>kH{K4<(U*723@SaP@oD!FiN$B-(DX>LzY=ks_#|cqFMt(oON4FWD(>}uVATodC zV0agM!g@{b+ikQ^KTD_%1Hox1Lc*A%9o4Y@WlH~5u1AlNY!9QPLh?d?yiC=PY9b-BzWkY*d{*DiEp!i=Rt1~nWZ5|3Qu&#dguOC@dMh4{cAeg zv=5|ojTL2=MVuHr?Bc`=J+wj+`?!P@p0U%@w1K@qdRnDoU7M8Vx6n)7)6ECZT#x$# zZ}jL9zws^+(gxi6J^ zmRUcnZ0O~F6KzPB1sTZJd;KJKaYd^%AXaQ{_b;m*swOYvt$ZrM;_ta1cW)Qs3uA|Uzwh!skdk<)`1`4qC#VQ< z?nx%&A|8Sk>GZ^%p!$gkMEFk6%$+UL*|lSBY(KXedK&xvO6I%dhC3SHoJh^&C%7XI ztf%dF=ZrBhA!Va4txGQ?^iKAd+d$uKf2}QyzVtT=PXZAl1NRGAtR&ulE`vG6JLO`8 zy=zN-7%S-S*~1vi_)M23J;8sl9Ha8Om|{XKB9Z4nPd!qp2jf{I>gX}@FapB}?vO4y zSX(i&_#>W@Xmw;5#}KoP4!($#%JrHf*Kpe*BAth)apc>$SC|xFzqeX%|+Jm-pLr>#q*B0um(Ow>?D1{W~74k$NwBr^lc2CMV@v$ zTyGAu(}&L(gn@{t1A5tp-~3@W;6MzgMg-!>Ek{rGA*&Hm3o@=DBDVQ7O7c6~(P%Bq zb|;47{6v17)4sF>{A|m(6XEFR`>^tU^p_s5&S+_)2V)Fx8KYK1(qp2|8soHsRTn~} zDe?D=XWU(X%xK(yfZsD^LXh_gi4k6iL^KwE>Fn)et30K}F(+%xArgRZZjR{w!bqfg zBQmqLJR(>nkn623Paz-{dP6S4f@0{{gtlSbJnuaHT_{6XpeuC0ApPy3;&uq}~ zG3T{Dx}7m@HqL1s>jB3V^XI3&$sR__$F=g9aot`DMg+#yzQ!!KaaZ_W5ZU2}L`1&_ zGgxIP#3AwhJgWz55k?eHU<_DgE?-ZM`vnl3_$Ubg8=ijx1@X_L>7KReiOWAIib4v{UzkHL4y)IM!@{#y6TiXpM49uO=;=6I@ zx-d>VB_uNXgys&yg=@Y0w=e@@N;r4SPM;$F1-&@)#Bh7GAyN_-^GBm#r(hOUY@LjM zp1FB??pQ}T&yoyAJ9^H?xoq=XySxu>7DvIob7LGbz6EKF&X)X^AK6-x!TDmf%Df)= z;fQppU9>KD7*CNA(l%yi%sbn~T!MLZXQE=6cN=$XoA-W;8UB5#@Du#g5d1wavKDZU zz7ykJ09l{dAoiUUVvbs7eL8fw21~nty5r3xq&)NyFBy=FJW+_TDp=`D2|cGmVt^td zStpBj?}~Xf7&lv~<%eolrq>(pw?GbNXRNex#yEN)3wffDGWq=^-9DI|vC^prZPiLQ zE%b}6^yF7&aO=lRH&~j_+4UY=K!|ycI6#7G! zkG!!mb@?hkY*pAJm=+>K-%raCLfX59buGK7QmYuRa_1k6%$M zk9>6X*DA7_HU1m)G2%RdXpL?K`yVW+9G==L#4>u_g;e9!8L~-ik;eXiG3$Iy?RUOU zrwl22-Gwxs#kgj)V8v4(#Zi3fr`8jF#6o^_gej}gg* zs}us^xugypTF%xGVCgu@q+nI=Ytgj8n^dw1fQH0$MR7^_~9v4-(~lJ)Gn%mSp%GWwp@ zyB}9-2(g8p1tETskM1vfL0@Ookm#f$vMu2`-TE~NJs3K`&Cx@<(~v2rHP~r>6|Kt- z4Tk=zopzbXv2)VSqdly6+xZlp_O$ag=kGDMhxTn- zbkw6=wM&dd#_y4TENaN#b}{c*zb%!QI@+pTmJRf!?U*fw@$D^6-Z5`|SBV_nqt(;K zECb!-ie$tX+Rif7|VR1*C z(IKSqtjz7tCw3v5SYZ|J|?Gq;EJ=zEs$Vqe2OCBab7?KxyC_^<8C z{=~h$A9GekcS=Ps&R(Sy^gV5D>WSWCsXU*^Hn#ZNMGd$`DH6uFw@ig2AKiPljgg_f zBdMN|n-fNV;Y94jUGNEx+2q?yT#WryJ9rhw-uIcgpcizX6%A(@X`F|$&(0h(+UM1b zRU|?@v$ecmJy=_@W6UbDTanxR(8IKEOkCv8lydoQytNecc?oa6r`)Z{zcXHobx%F>`*u z6{EQkx%pv@z<$p^tin3q_i=Aw-HhKv_9VnFdZ~2-+eUB1`NXfWF6VsFQk>p`5TD3U z&bPmc-D1vn^Tl|{NlEgQ&gn_H@tlW~EE`6BPu$wbHck?Q#JUe5bt8{IQB8`Sq>s3= z;k|Hwk|Y>>^a%AN9b-8QZ{CRoZJiNG@iV4+4E;kZCF2d z?8{vLBcxsQi^;_60^-j!n|KEw8;!Fwj_oqg-+Syzecc}bdmwfVnj*r%XXf1VVHlB5Hs_X%ug({YYoxV@K zVnX;!wQ(wXG*9^BF<(sl{)f*_NU6xYPn-FnZ{xI8IW~17iq1R4V{innfm?JZMWhw( za&X-9!5FgGn?w%oDxZ}jDaUvEP}83N<%~5Pr{~xsjJTtxUT@k9`n*rqIc4k8Wyi38 zYF1pwCUXBXKL25nM%EKBGQ(6LvcHX$&_Z%TP9fySMoF7l(6^Skn6^js& zOWZrFSDwmt*7z<);eE0+E$}cxI50s6j$xN5&Q+k??|hblv)4CfQlf2ivL$ zAv1g0HF3Vb5UYG+?Die3jTKTFX7!&vD^EE+`?QW(6GxXltKD;&bB@^w!^2N-MylxB zIOi3^sIL$iF?6bJ$luD7b_ct z)XGo&W?gJy-;zM)XA?{0v;D-d`OUp!8P)rF_d7q<;FgUF?0(4~M&a(4>%dIE`&r!T zh!iOaIwkjOsiMxhU$=#GU+yQif!6YV+d4)s16dfkyV5@eBQ`gEG4cHe!ZToRDnBM6 z-c<8OzH?(93UXy3tz%U2CjCEudXI1PTf*w;8#x`AC3-{6paE$FX9!IFskS&5!dj7@wqE4wb65W zt>uI^QHXPIplfaeeRe`xK^1zXz$Whl)0sz=b1h2v@Xc8a(87ICO5z@WM7MP335B;r zwLGptm3BscAjEmbTR6<@$7lNYA$t;19jmaSCNra|zIFYWY%jz))8a-IJ@zfS?UUxm zb!*u-^4=@e#{SV8t^Ys#J^K2FzJMDIz0nVQy=3n06)hJtD*h{F^r0t9h*k%8Z|rxh z`v~NscD{bwL>_WwbRIu{K`*v3hv`Z)733~~JnU|KyL97^CkRQ2_O16aF*8AYB08%h za%;l=qqo1x^(FuAUhMUHN2@$j@D7g{10tg&R8w~>v1r^o!D zjpqp5S+emvouyUGnY%OA8lQT;k9!LXDII-JcST?b?ZIl9;|q6xx$(R8F>5zGg^HUvMoQ%7!cwQ70cbxSrLEFuHQn>!rd)8=OH3W!FTW$-(u#lk8!=T z5a&GNd&J-PG@ckfgX?z8xclclrEZ)Ae^1Tam+hVwl^2Ngm}B_^;jGFl$^W4ezvs1$ z>f`E~nWzec)QaAJ)_Y?h8QQnI5=ZW?mWOlZ?iDA-yw3YlRG%Q?B{8>rV))3`W%<3~ z?HmYK?7T0=k}2y|)GVI4C%M4>x5xm0+<4EuysV&}dr?1u=k%GC ziMcB;`nh84{h90zuUljmVYjk>1aXa#y?UP;Cim4rlT5F+LSS0=C(%D?hotUpX+a-4^oEjJ2>wz}x77JG_M*MOf33vqO+;E04I#2)o;D)aH|k)mvvKYJ z8%a_e?ZL>cplACHYwHKn%ETPaCw|Rc;@{|XV3pi|8$(v{2V#r&&KUmi)_h|%j)lIV zla18_Z~W65M!aB-%p1=fXDPgBrdN*TyeN+4+j)I4To{pT8&(f z6k`!GawpvwNOSVL2$`u+{71-5IJq`|iw7mNNP*N!`F#Hf&Tot?$Yy-%TPwdlc{r4)S_`Y2@m4GL*u zX}GJV*G3E_5dZi#o3m85u=8qX;J%{+ixT5);FU5Fsh%ej#EpY#fn)k|%Z05>oS` zoH-%a`Tj}zHxlhp0lMgDbwt*^psh-&e}&>qLPk4iN5dpvigXFtT5kSpJN@{jQKvvz zdpU^<9rBb2kpM%sp8mNq{!&Yh^A3fCuM?lZ+J~JH{*g{y1%>pqDcdBFY!ssuGP#St zkmHklPyfh9z9WP99psjO$(}8WZ|4-8oMLS;Gd9vHe;}A4DMa!IZ_U`D=q(bmBFhYs zSFxu>mN=}H>Li31=S~Jv4|OaMQY29Eo!07=I`aq_(yn;6tJFKq3=(qFVjEIl^jiIa z9GZotyC*`PxZj!#4|N|9BJw~nBO$u$`Tew)ojj-iNN4-z`mJbx<0JZm6^Vf~%+3&E z+{s3WwlCWq-RBb(<^N!8%IXh9`vA{^k36ZDLIMUCW^V{7&3}| z>V;@qQ`evz!~QB|XXF?ex9|>5U5b`GjX4H_;bfB>1GFk-#^o4Nm1*KgPQ#?%alegb ztj%Kd%p~8skp5wRwy=;L9Wxn;vmw7^_YhL_(xkC|g*_Z8(iM$HF;s3VkT!6pTR1!&@ex4{w?H zS12<({y$IjdStOTr`~k`$fW$LKn#1I33*~qbV{;+Wyc8vLMrzS7t*})-mw*xz>Jhm zRamhEU#04SK-!_$dyavNog&ggM6fAyBwm3O7(aoxg&ZlD5q+uT!VaiHM!V?I%x&t?@b|Ro*y&ry zYL%jY*f|;@Zpy0>@;;pNkhAOl!N^c{*%nlx*+u@5tp|eHGeSni3fRcQEQ76!->)H8 z&Rr}3{Rg?%!tvnTn_sFK65^#$ZC@bOFglidw-1>^Af0-w37IKTmRm%H!Z*i=Ez0AH z`Mjl4_W>cjTx6YjjBg<)&tqon9VlcwM~3o$c)rjll%*s#e@1!%d-?^U{f6&n>OMsu zah|Q=w820eyEX{%n2UzUOa;|$p7;CESCi)}#%C^y^^xJ{)oh~r$jjSBH6_F^#+@aP z)8@NztvdL|SX*WXf6scdqqs-cYnk`;jwnCAQz1C_B@iprnJ19eki$mspW`L}2>;T5 z?RBxG*rOEQZ~Gg=}3v zxS~4Tm1+dC1XJV89*Yh)xI={a#T(FUeUABJ7E>cIpTg`)G2rTycm~`%#f|fSo`h6G zyJKZav5*zBvRgqVp}*vXCKO5-X({`tmqCn9 z%-Fm3AGyc|%_FS@pV~|G7e=Iiam zCTCu><7FLY%W}ZCZ8I zOp$PEl=&Noekj_5*$dXO2pNvuKZPta-ih;+g>2ncxYzMBQO3{Kf9W=V;rnMj?KgaL z;-kz^Y>PYbif(-mD#}PKz39~yk|%n$1G(tGwk=JI9M-mTuNEOaAHJQVX({>>?W8iP zS7jirVeC+F{ZM z?{mxxkoqYJBl+bkqKWj>LVTgxEnkZc|A-7T^d3ha+=e+n;%$ye@zC)Ixq^O9eJzAnl8#B#ITG8+pk==}cdS(kb--kYw61`SY zAq(;G<1^PMKS8*4QAre8(Sx^HWTg#^FO=xRgx>IyW41A_XqG-kKShz?#>!zKuXSY6 z#ZtPM1s`?tecHJmyb)6u01@GX>(3}ju3EY-sNkWx%4!)e61 z)EGNS)}_dbPPB=CrDkmdd_T1%oRBMIbnm5;gt2(d^uXQXw^ zf-kPSo}b!_W5@RhGqr`>vUrTaz_abcD(?{gm0eq0Yk>ZL#L{)mASW+9xuZY6bP*Kl za3(}rlkHpIKYSadzs8w8W#oELYZfiR<9#iv@nLkijMftMSQFwwiV^8rI$Q%G6Mc3< zLP{Vq#n$=RHutI&BBe(aqe7ldjOmHMe$Myl6i>zak}_jV7Ou{G<)GiCEc+UA*s`>< z`S+|^f1Ip;6_ZKvWUW;vMq|r5=Exw6UZ_!T6A7j+S&N_9Qy<~agyq9ux^*|AMla_} ziQhtum!UaoLXzwy?y6(yqfQSIT>cEzhb;0}_&z<|AHSb-^2faD=DOL!-s}lu61p_M zfss2QZD0;YxzdxExmfPB%lFTnB8vPy;=Nc`Q0~@$wT&x!w=d?`_j*U~O1aM}dH{uZ zVh;O6iJ7gx?1R_(#XL$}gQt_#aYbLVk5Bz;jcXpt^Lo(}Twc!;BOK+8Y}EfP5c{wu zQsgQ6eYLLK1s|>wi54u60g^T}Go$!?5;WNR5;zM8?-~_X-j9r5#f9j^0U# zNP(dbQb@|~06sEn$)FU%aN)^o?(xrU1gEmE~74TR5Da_gA4Q6)?&^|urvT~9sz zgh*wfpS+5^;G`BIVh-q)3boykzeU4r*1zxf&G|$U}tqhw+lymTp?yRc+HuIpS;hch96 zE!7`?t)+=KZS4|g=rt7bLxtAf(?Bf~Mb*qY137$xL$UDvGh$dK?y3=H2Y=}hLqVUA z5W86ABXXS=<{H*Hvg5s7=aeeIb(J@t-3K`scQ^>T3IX^XjW>53FNwKhpNya)I%rdA;N)O{Qb=_aL^G=!b zgzC03`2GC%hs7t@vp&pf(V~5wE$n`YeULT!wo-?tKqT7m%$;5;`nZI&Niz-t@rRur z>RB-!l^XTi z=!2}U8uv^PQjE{f)2)p)0yQ#-FyFGiRWepS3aRWvsc%bIqvd-ieON`(WDN{&=cbkJ zn91BiN#Mz9(Hsx?ThtAIcxScm6uzC?cX@V44okI>5w{fO1B{q720nH2aETz&!^wn* z><+TD79CY_U$^L7#BU)-O)=enKP`*%p(<#(Btw613%@)1#aax9Mc+mXUV~oHmRn<8 z-||cuBc3f%G12E8${8nF2jX0Nsof?8M3%2vj{IXpW@0~5vy}`xf(a=VHJ}jhm{YGi zF1nW^aw}IYwdgc~(f?Mo*1QHK`efl-DC0XcokGY?+?Sx0-@^KZ zCJFY@3`-%kW>mW^hQDD=WE1Jj*m0}{;<+)e|+?sX{`uSR$#?NExxa)F zjyA=`(C00raVJ92)QS^~b6YWS1fNYmC-aI%Gzl{?+lq;PjP&xMhgL|tY+={<7VptD zQ{{cI*7vZxN{gr!`Z}BR+(Y#tlIR@!&axXCvctQAZ(%pue(VC{B9e{YoPScA zKmMAyGWu%#>!~2S6;dun5j=9n(H{6W^*v-={M(U=g2)xc#?R=QW52QxzZg68Br$>c zqv5_DSTp3Q=w;KJbJ5;~XU=1CIqpP{84y^*A<A}Ai(J_pLiYP~r1raF* zyMlcnHOVlNep%6nA4pb~d|pz`;W`ekG_LPR)l z-HIe7_NCStEeZR~c@cj^Z-msTH9lEo=Y^guFIQp)e`zh&fB6YQX=0YB$Irn`=ICX* zF>6nV$OFFZI?BSHeqLvkXd$w6i23)#jCkTzfppAn@|Ylr+Du5ruJ_raV;d@dkKv=} zDG^dT`r~y-rG)X>Br*nOg}LY;=Q+quMKLKM9?fTPb^P-`y3Qm!b{z+zTVe}PL$>>0 zk^>&!{8h6!fB7s?AbJEiH|XBl!z`%#moCn9x%|3}wYJ#)!=2_roY(*;rg>CpVG@LJ98w%e`qQi>Kk^f`J8pJ1)Qhy^o`F~ zKJ+?0X06!Lu9`E;=vwj+P%Ez+{S1WcR36p=h18235Wa(w3$@GED`Ag}@2U`ppTN?> z+`8|bFV12MDTRHceSXZn`@WgGn}nES1m;IB1xEZr%&`a1Pfvq=ietuEDL<=C%v1O| zb+UH3f4V~a)Hg_b@Xp;XEstMY(G>2Y7qV-{`4S=hV*bGIDa`Qf_tuLQ+*n94QrJCUQQStjwF8+a{+-Itc42cjw}>_G)HbnAqpEwzm0qge{QA=#`_-=up_9tFsC~7KeoX_%&?ji zh~v!A(3A20k`epfF@rH`ZtPc$8oSp>;zuwqWAriVwubUH>Zu($az~6YV$F5Lo)(-q z7%j=OL)mGmE}U!_EmnKs-)SLLc-AebFz|E~gz_A6^h-0l@n|bO?0^`GrI^KE&XaRC ze{ab5H@+qE{S#WiArHS}&2{u;6%1rdS4hBZl0D59=~QtfQS9Q3J#HM~GFH zH|w$K2a(vYhH?-+*4SY@Ox`W}V#8x)DgMSSXJl0$t~-Z47(=R$_dt!&dO=G&MsM7| zGxVd%H+alC`Ps(do!w=8t#;&;9bb3De~j7qJROWn#y2CFKqTg!@pQhI7Ir3#8PrmE zZc}bN&SDRF#1k{yWA-RyBO-%=73nco;yUe^r(N7zG3HgojdDGoZOkW*mF%G(qQIzR zWFHu-g;R`(wZwA0tUuOOE0*l=zxL&V-tAZ?9X{)I+T(w1r_Rj2V~_l>?`iC>e>z** zt#Ar^BZhqCjd_^m&*;c-&z; z^*8R<9>#M*`k`&Afyid?>3rUCe@bE8=?AL_YU_Lo}hy=NqLCLm(E!E{T$V1PhxLr88o z^B}}N>zLImfx(F9`8be}{arTN!!t zKE+c9yI#NY{osiD0yOkh)v9`e_fsfe}B{dxnu49>$fbd2Y;4=EQJwIXfZz19l`vY5Zmb8epVIh zp^RD(z~LE~-WB6*Awg(|$Sgc(Bt&rmKf#ta$ft8+trH^87giNNuTf-2M0OkPoZhA# zoCMGpEg54?AwSsUK0gZUQFeyBTkIV9MpSI@Hje5IH!gm10}Q!DD?d4^ye;7SdODb8 z6B0udhr8=6mfmmctK$27@*9vT^80RMmwY<`8GqJ1klX&7JtgGx7SbFm zgx{0_WZ9W+?2AR4-C&8A*-q;~=_tQ1ehGF&g2)y>hT5aP^SG3!bbrFTZ>6>cyN znJ=?;&J$sddk20zlgZ1_7U(946 zqBF%A!YQLrP`}Oo(&1auU-Z`eKo;uJY4V=XyA_hTZYHEvWbvO8wue6XwAOf1V_LU~ z9L7STSr(CzH?l_w=@+}trv3_VC76n3cph-t&3_4dL8p5@*y%T86Ft`Srq3UoWYeWX zFshz@yK9vLdwJZ==`2H^hc*m;DoI!0!zRQ$YInJNXsn{L+0;Y^v!6;|0QaFnv zq#B>~s?z271S@!L8R>;c;j6$^GHu%hsr!(-hAiIXAL_S=aH^L{tzMEu;*0B4|cD4 zcDdL~J!6&!=Nsoa{llF1Jh$^kzj>tjuvbcm@iwkl1C_BxId4{A#J>s4gr^gu<$qX# zns>@U;NPs0a7JyuS}(E>NQw2vKE;dch?4jeWwBJfmyEyMdojfU$V#a%%sIr8td73r zO090xVk@oQ@HVb=(#3dg<&-D({0Qkh1GREARnje4+3iDSs})O>G4r$XYYC^PS2Q>A zvjuxPX0}(b{$dVtmGQ&#UXiE98h_=IAI;NifjIiTtL&1|+gRoL!dPa-ybN;ju3CR= zC6Ht++XCRW$8VT>Wfd57idvduWnDn#KnzE6@#Vf?tU=jP7=KZ4*M+P_a?EuGGFh%aNiWtUgw%oC-`2O&!s)2>9Z%RB zvA&lcYvtKn;(u)pP$l-B}W!B2|AdBVFwPzNWB~dImaV^9rM!Rdx^kGG9 zDPs9phXgY=W+Q}H#jMBL@*Mcf$pA9zmL8xc%w()9H1xWfF2QDp-mNDtmS(XaV@|ycnD%S+V+tpY7FP(PE@kmh0E^V>wV*QZQR2q&4)(6^NJ4zRUY0 zJNyJ+dq3Vsekz~an}2;{WoW$}sZ&69^rd0FWT%)qrzhAc7-C8D?G&naw+wzZRyRv|EPj@Me z`}ub1eWC2^U`;?TV8@sQcHHd$>1BL2d5Vp{Pt3z(&TdP!IDbm~u08WUiCx_;dXT%0 z_R!7==>_u#yUy61j>u{q?dh(k8+HrtddtC1vK@SsIIX{<(8Utcyj<*u-LbU-vp7QR z<2UUo7(f|m13Tw;&p`@uki#|{6+Qo+p6?xP;Qb6xMrQWaSW>}Ck$ z!`|@Sj}$Ea#$r-E=qC!X5A)aCbnS7@NQhsIB(}wlHGETZ`Q&&@Ja^8nY>#m!JW*en z=jQ@>I7hktR*qQqXl^(SzK7+FI~#=P*5lt9`l=W&=wI@M{fYZa{_zuhrEJXR?avf% zF4-&9g_W+oT1hNb3i%sD`j5*@do;B=BKD{L7fIvnKG*%e$(YqoI+%_gq;az zt>8OC^?6MXj!+>up zWMTj4k-%}^;L(qM=(n4GE9ulJj=r3{xN%qxYMValPb5MhNBl zrs5Mj^lxhYp*6edOMkqfLr8Y~ruuI6pcj2}Z54G$AddO?o0~PPecWv2VT641*AwQ1 zVkYKblyh?|!{TStUqWjp#ChN0EvYulSKU&|zlp<8lm&kOZIbn|gV`c}7&8QNP%;(uMUily?#dwOO6F7}iN z=>`4K+x}NcBhvE4ISC;#7lVj3W-Gfbwi=@BG)2|eEqvQa#!oFLWMjTpN?DN>o{l0G z$6U0Kda#mz6|rz-==KP~@TvQ#t@E?(%-bmf8E8+1#N<07uNcPlH<*1#%M!ylv9)FA&^F7_~>y!2Mw}0ukZ`(uP z|IU&!&b8gyGjkZ<7?Z=k03knk4TadlIm$a{?buCs=SmN&*h0Kw7w?_hc(ci!w?2%( z?kY87w0l?WhH?E}y=K01s~hv7+!g!L@!Vv9JLZw@`lKuH+}2D#yqahfLcYPfyJzg# z4rF4U{C{psiKS{wU9tt-ij1(^M2PY3_Pc{`gP-6_y!q@ZZoJraB&3%g?{jS9#LhiA zbEJ1q`*os6rV0BKZzMgCH(bF~$SES9SB?tKY#a0BSMKA)TBt&^n%IZEIffz`39<=9 zYOQ<*_lv#>LY{&goR<;OKlTq^jny-V#FBVCH-E)|j`MR0LKUOq-F{vsTiUm3!;bcs z{=))9svl&wda0$1Sq~wV_kjs9o)CM%>W-S?CAWd6Bg894MlTJ|nDuz+I9I-3dW!A& z30|bx2+1k@TSS6-ne;&*3oFtu*EG>Xd5Sd?`c*H_$~!_{UX5qrUY6CwSo7sq3dUJN z{D1I?%Fr?!$bz9-{6F-!33*DqH8U!8Sf?OjO!FoPk)2Y&@QAsZ{w zuRa@?tBF$e!;b0T%em;OzE&%cYwUHt`K$NqDWvUKuYa?*ffEOBewPqS z0T+LFmU+WU{#%O8*b`b`cg*~}Eh#|X|LvR?cC5YKT4UdG%P?RM;M=-b>_zX94Rf7u zf0<{O-EW!^dtc?Q*Y|=~7r)$Fa=rQ4 zf|3&N>06$#68R+93u_YZMKy>2wd;#^Y0JpASR9K;FOA}DAqt&oLRpCCN9PtuLz^Y! zb3DCdwGhRP)ZZJ3UGgn!5GH>Z z^~eNbIKd~Rl|lWmHFzQ?)y;&M_l##=&@5<+h6WN8CwnYx8*>`Kejkz4f% zI%bcB=qHph6S5m}bI0~m!>Vrtv=yVAKpfdjg~UK2{~g5(EZ6Om!v%L+$Sj%sHz834 z!zbvvj+BEGqCkSYP9de^+*Ba;C|iFdWJrtQE$Oj3kpH!9mAD;4hX#)dBef9+cugk# zLUFK=T#(T$;m?zviqe?RR6uTiMkyFshilNg!ER)1_xp|2`$7j z?sE+!G6;;cOg*$hVud6>+p&-O#S|J!_fhASkd`;)Lxl9G&>`~4FUR*8(-wbi-W0Ne z6Q7W;v`c=KkmiH@HzC6=-{5a1WVsfyYoQ9E5J@l9_ydt-;}gtmmnJNQl-#LLH4y*E zNBT!5>(SZTV9PYEE%MTYjC!ahF62v>{173lUzVL2yVp=g|0#{|E3A?y>)vH$ux(sF z`o)BJMWzQK5>o0q3dD@EQbK=L#mu&lZHJ~vgk0%2JW(OoFILl*S3_CdKq_u>6H=rT z(L)i^`37&3ibv_)(aMb9M-j^=u9iT`p`2=sR+G!OaUV0Pz6iNKSSL!oHj0pIIyDvu z|3D7a0fksXjvFDvFdHsJ0XNMV3E34lG7CBVQI)i&D`%PV2SRdP#Or?{q|`z+%BbVC zkG1kO#S3_DLa=L3$Z)JX3)zMh8zCnM5D>XJQO3EZCmE#-Qw_T4LphY-C}|&6<%P%y z)4a2g)sZDc$ScT6R%L*7Rq38ehqaIDS%Elam}*d}f2ezPG<{GNTZnt1z5pS!VPB1q zBlS<`meb3PG7B~9Kiq%%B}Dg!@?t`~9E=xo9tF2o30V~<1p{$Ie@7l)Pt>;&oZ-PB zg-A<{xOjz_VJ<+(kefvJR7lW~AoBH1EJ#(_TDK9Oy4H?te>Iw36Z$(jrm)a=$#T0t zj3{#*QkZnNbCrWY9iKHT{u#s&C}b&q$6L}?{qa8SBuA^6W8Z%~RUT^YmK|-0kczpd z8p9=Q&E!-`$D>^L(~PQpLZZTrXWd`BRQawsSgz4(X4AdmJ7>BJ)M+7P=Z4lS+sTH$ zvXI`<=abJ_uwPlo>jkZIR>YDq^OF^QEXt`0nW=^gZ{&$lAD589n=^#W zplCuQ_)PIl<`LBKZ_0mXDS$@_ z+0it|zj?h;hrV2ZTsKR|Df&eC zP=QD>>LV+kbsj}bA&^(65n4;$!L>4|lN=_>>?-N9-_36^@)mZem~ zc|al2K0`OS#C{iyjO3CBvj!qM9n4af81|xGP$7R_Ss#>o3(n;Tc~WtRw8XQ^LL?(B zA+2THn-oYf^hZnkeptZLrYt)Do!J*=rAkvQh1rPG6@{YBDqZe1P3#D%^`m(iA>9hq zD22GO=2KMES@)K{8uIr>jYm-qKf#d}!&}m2NvMOh7Hf*p@t&H=bz#JFN8ewFRm@)( z+hu>C|0aZImxaWR5ImjOQjEEcKyZg;Ene-=)Sr;AZOo+=pC!{4j6hn#YLbv2^%6aD za*XR0I;V!&uP9Jn%&nKv>f|psTEqSWA(j$mrOFsNvnC&-%^y$wIMj6zYF2%;v?~WA=NajKX!Z@(q~mafEQobu6mVfg~#;Rg0c{^;;XLIDu6Ef?j?bkx?k35nBrsP;z4eD~-!~TyxV>|%sj$csRw9GyuKaj{)gDIGWycgfeuaNX zMo{mu5PA4C`%;6-=JHoKpMPvi&Ph0X8HgNDl((Qc;4gQcEtZ`dvm*EvZf=uU-h{|^ zVM}{^9T>I6FloZ9M+}B?O|RTt9!7^T+Hi;)C=h9R)D*AQi7`fb-Ve*$8+Gvweyefx zu18J}W9OPuZNxE9qeX!8@bAcbF=Fi&(qmx`BHkCqwBbYJ{%wCDIs?qV z$!aIun-oaK$zdV8UCj5^U|vSwzqah0Sx}f2-F}Ej5V4XkL??%D+MIchqw>)QvC;^U z-9}4W+p8Tjv^6-cG1pmpwuH6!+LtHv)@yW_VTG{D3mMdv9Q7JSm3U7r)s0pr3O1Z` z5E9b}h(t>;ep8DS9KNYZN>P9JR*Om(ejgk5L-U#9Nz4&f+02cdWYu(o`Oev8MsXo8 zE%dL2WX>xKu}AE=I)H2+Mmg2P@x&AL>c*DItsz&Kkm(n5kkxN8^tgf~absUi9ivQ) za_U$=Jcl}hhaA7pc;#U9Ugh4`j{n+cIiqJ+KSju_DZZ<)5#MxL!_9wzLQY;-fl^qM z*?W>o%!9Zcg|wQ8_e)3*l3Ye|#cFJgeUuo5Mhou`JGYiUnvN23D#z$`-F{ehcI%vJ ztTFJ$=eC2in-R~Icv~aOn79K%4s7tz6LMk{0kzA?_0e>c5Sd`wFH?gm<|B3$Au=

Vi^_k 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 Sr&D~$dk12^-Is#Mh5A1kGIntQ delta 125416 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%0AA(Z9`k7H)-k{tY=FDxhFm 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 OlX-~4VS*V!tp5SFtQ7(P delta 136353 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