diff --git a/doc/java 接口说明.docx b/doc/java 接口说明.docx
index 126cd06..350d071 100644
Binary files a/doc/java 接口说明.docx and b/doc/java 接口说明.docx differ
diff --git a/pom.xml b/pom.xml
index a92f2b6..7da5dd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -37,7 +37,7 @@
com.sunyard
sydapi4j
- 1.12.20220915
+ 1.15.20250627
org.apache.logging.log4j
diff --git a/src/main/java/com/sunyard/sge/database/ISM4Mac.java b/src/main/java/com/sunyard/sge/database/ISM4Mac.java
index 0f061e8..f227d0c 100644
--- a/src/main/java/com/sunyard/sge/database/ISM4Mac.java
+++ b/src/main/java/com/sunyard/sge/database/ISM4Mac.java
@@ -2,5 +2,6 @@ package com.sunyard.sge.database;
public interface ISM4Mac {
public void update(byte[] pcData);
- public String disget();
+ public String digest();
+ public boolean checkDigest(String mac);
}
diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java
index e7a65c5..1c026db 100644
--- a/src/main/java/com/sunyard/sge/database/SydApi.java
+++ b/src/main/java/com/sunyard/sge/database/SydApi.java
@@ -296,12 +296,14 @@ public interface SydApi {
* @param mac 输入。密文的 MAC。
* @return 明文
*/
- byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(
+ DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(
int iEncKeyIndex,
int iMacKeyIndex,
byte[] pcData,
String mac
);
+
+
List SYD_SM4_EncryptAndMac_BatchData(
int[] iEncKeyIndex,
int[] iMacKeyIndex,
diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
index 06f8ee9..0969e42 100644
--- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
+++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java
@@ -798,14 +798,18 @@ public class SydApiBaseFunction implements SydApi {
return new DataAndMac(enData, mac);
}
- @Override
- public byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
- boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, mac);
- if (!ret) {
- throw new SydApiException("MAC 验证不通过", 90);
- }
- return SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_DEC);
+
+ @Override
+ public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
+ boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, mac);
+ byte[] data = null;
+ try {
+ data = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_DEC);
+ }catch (Exception e){
+ return new DataAndMacCheck(null, ret);
+ }
+ return new DataAndMacCheck(data, ret);
}
@Override
diff --git a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java
index 5d83f40..82f8abf 100644
--- a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java
+++ b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java
@@ -170,10 +170,10 @@ public class SydApiLongLinkWrap implements SydApi {
}
@Override
- public byte[] SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
- FutureTask task = builder.getLongLinkWorks().fTask(new Callable() {
+ public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
+ FutureTask task = builder.getLongLinkWorks().fTask(new Callable() {
@Override
- public byte[] call() throws Exception {
+ public DataAndMacCheck call() throws Exception {
return builder.get().SYD_SM4_CheckMacAndDecrypt_ShortData(iEncKeyIndex, iMacKeyIndex, pcData, mac);
}
});
diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java
index fa4333c..99eb0ea 100644
--- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java
+++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java
@@ -20,6 +20,7 @@ public class SydSM4Mac implements ISM4Mac {
this.pcProcData = null;
}
+ @Override
public void update(byte[] pcData) {
if (null == pcData || 0 == pcData.length) {
return;
@@ -70,7 +71,14 @@ public class SydSM4Mac implements ISM4Mac {
}
}
- public String disget() {
+
+ @Override
+ public boolean checkDigest(String mac) {
+ return mac != null && this.pcMac.equals(mac);
+ }
+
+ @Override
+ public String digest() {
if (is_finished) {
throw new SydApiException(0x8007);
diff --git a/src/test/java/test/CalcRes.java b/src/test/java/test/CalcRes.java
new file mode 100644
index 0000000..748872c
--- /dev/null
+++ b/src/test/java/test/CalcRes.java
@@ -0,0 +1,68 @@
+package test;
+
+import com.sunyard.proto.Util;
+import com.sunyard.sge.database.DataAndMac;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CalcRes {
+ public static final String SM3_SHORT_RESULT1 = "62EDD1C6C4542572F68A2A687AF44E5CD809A5A72CACAA00B07B38581F23E515";
+ public static final String SM3_SHORT_RESULT2 = "1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B";
+ public static final String SM3_LONG_RESULT1 = "418EE7D57FB9944DD2EC3B1BA9656BD63B8D374F8BE9CEE4DA5D7FE057200B47";
+ public static final String SM3_LONG_RESULT2 = "1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B";
+ public static final String SM4_SHORT_RESULT1 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64";
+ public static final String SM4_SHORT_RESULT2 = "4C72CDD5012CA05BC095A4A4F5B66F64";
+// public static final String SM4_LONG_RESULT1 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64";
+ public static final String SM4_LONG_RESULT2 = "9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64";
+ public static final String SM4MAC_SHORT_RESULT1 = "CD9A5C8CD83FE0D750CF853D17281D52";
+ public static final String SM4MAC_SHORT_RESULT2 = "2A268D5A440F8E9E50AA6FDC453E8593";
+ public static final String SM4MAC_LONG_RESULT1 = "96CE0C05DB2DB6496E78EEE49B4C82AE";
+ public static final String SM4MAC_LONG_RESULT2 = "C699B51638B56C3E5D490B9026ED2DD7";
+
+ public static final List SM4_BATCH_RESULT = new ArrayList(){
+ {
+ this.add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ add("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64");
+ }
+ };
+
+ public static final String[] SM4MAC_BATCH_RESULT = new String[]{"8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320",
+ "8747BCB522816BFEE8753D6FD61AD320"};
+
+ public static final DataAndMac SM4ANDMAC_SHORT_RESULT1 = new DataAndMac(Util.hexString2Bytes("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"),
+ "C8DECD5C3BB3C0C282639A7535952588");
+
+ public static final DataAndMac SM4ANDMAC_SHORT_RESULT2 = new DataAndMac(Util.hexString2Bytes("4C72CDD5012CA05BC095A4A4F5B66F64"),
+ "287FD202E5692067FAD98E0FB73CC0B0");
+
+ public static final List SM4ANDMAC_BATCH_RESULT = new ArrayList(){
+ {
+ this.add(new DataAndMac(Util.hexString2Bytes("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"),
+ "53E6C24F300F47206E0DF3FB4569FFC2"));
+ add(new DataAndMac(Util.hexString2Bytes("82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A2A268D5A440F8E9E50AA6FDC453E8593"),
+ "13573E2C145A51998F8E872E146E576A"));
+ add(new DataAndMac(Util.hexString2Bytes("9602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF79602336689EBE51437A3B12B0915CFF74C72CDD5012CA05BC095A4A4F5B66F64"),
+ "53E6C24F300F47206E0DF3FB4569FFC2"));
+ add(new DataAndMac(Util.hexString2Bytes("82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A2A268D5A440F8E9E50AA6FDC453E8593"),
+ "13573E2C145A51998F8E872E146E576A"));
+ add(new DataAndMac(Util.hexString2Bytes("82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A2A268D5A440F8E9E50AA6FDC453E8593"),
+ "13573E2C145A51998F8E872E146E576A"));
+ add(new DataAndMac(Util.hexString2Bytes("82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A2A268D5A440F8E9E50AA6FDC453E8593"),
+ "13573E2C145A51998F8E872E146E576A"));
+ add(new DataAndMac(Util.hexString2Bytes("82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A82F1B998DEBBB05E06369243FF44347A2A268D5A440F8E9E50AA6FDC453E8593"),
+ "13573E2C145A51998F8E872E146E576A"));
+ }
+ };
+
+}
diff --git a/src/test/java/test/Choise.java b/src/test/java/test/Choise.java
new file mode 100644
index 0000000..1a47b9d
--- /dev/null
+++ b/src/test/java/test/Choise.java
@@ -0,0 +1,25 @@
+package test;
+
+import java.util.Scanner;
+
+public class Choise {
+ private String[] args;
+ private int argIndex = 0;
+ private Scanner scanner = new Scanner(System.in);
+
+ public Choise(String[] args) {
+ this.args = args;
+ }
+
+ public String get(){
+ if(argIndex < args.length){
+ return args[argIndex++];
+ }else{
+ return scanner.nextLine();
+ }
+ }
+
+ public int getAsInt(){
+ return Integer.parseInt(get());
+ }
+}
diff --git a/src/test/java/test/EncryptAndMac.java b/src/test/java/test/EncryptAndMac.java
index 022fe29..ee2df03 100644
--- a/src/test/java/test/EncryptAndMac.java
+++ b/src/test/java/test/EncryptAndMac.java
@@ -29,9 +29,9 @@ public class EncryptAndMac {
// 短数据
DataAndMac ret = api.SYD_SM4_EncryptAndMac_ShortData(keyEncIdx, keyMacIdx, data);
- byte[] deData = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEncIdx, keyMacIdx, ret.getData(), ret.getMac());
+ DataAndMacCheck deData = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEncIdx, keyMacIdx, ret.getData(), ret.getMac());
- if (Arrays.equals( data, deData ) ) {
+ if (Arrays.equals( data, deData.getData() ) ) {
System.out.println("短数据加密并计算 MAC - 测试通过");
} else {
System.out.println("短数据加密并计算 MAC - 测试失败");
diff --git a/src/test/java/test/LongDataTest.java b/src/test/java/test/LongDataTest.java
index cd616e2..bf28f62 100644
--- a/src/test/java/test/LongDataTest.java
+++ b/src/test/java/test/LongDataTest.java
@@ -78,14 +78,14 @@ public class LongDataTest {
public void sm4mac_case1() {
ISM4Mac sydApiMac = api.initSM4Mac(1);
sydApiMac.update(null);
- String mac = sydApiMac.disget();
+ String mac = sydApiMac.digest();
Assert.assertEquals("FF49F76AD3A71651FE1A8A9F0D2A689E", mac);
}
@Test
public void sm4mac_case2() {
ISM4Mac sydApiMac = api.initSM4Mac(1);
- String mac = sydApiMac.disget();
+ String mac = sydApiMac.digest();
Assert.assertEquals("FF49F76AD3A71651FE1A8A9F0D2A689E", mac);
}
@@ -99,7 +99,7 @@ public class LongDataTest {
sydApiMac.update(data);
}
- String mac = (String) sydApiMac.disget();
+ String mac = (String) sydApiMac.digest();
}
diff --git a/src/test/java/test/Test.java b/src/test/java/test/Test.java
index 8b833d0..180c3b8 100644
--- a/src/test/java/test/Test.java
+++ b/src/test/java/test/Test.java
@@ -32,7 +32,7 @@ package test;
// * int i = random.nextInt(4065);
// * SydSM4Mac sydApiMac = api.initSydSM4Mac(api, 1, 1,1);
// * sydApiMac.update(new byte[i]);
-// * System.out.println(sydApiMac.disget().getData());
+// * System.out.println(sydApiMac.digest().getData());
// *
// * SM4 updata传0-4064随机长度
// * Random random = new Random();
@@ -67,10 +67,10 @@ package test;
// String s = Util.bytes2HexString(finish);
// System.out.print( s);
//
-// SM4Mac直接调用disget
+// SM4Mac直接调用digest
// SydSM4Mac sydSM4Mac = api.initSydSM4Mac(api, 1, 1,1);
-// LongDataReturn disget = sydSM4Mac.disget();
-// System.out.println(disget.getData());
+// LongDataReturn digest = sydSM4Mac.digest();
+// System.out.println(digest.getData());
// **/
//
//// SydApiSM4 sydApiSM4 = api.initSydApiSM4(api, 1,1, 1);
diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java
new file mode 100644
index 0000000..e7e9882
--- /dev/null
+++ b/src/test/java/test/TestAll.java
@@ -0,0 +1,1284 @@
+package test;
+
+import com.sunyard.SydApiException;
+import com.sunyard.proto.Util;
+import com.sunyard.sge.database.*;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+public class TestAll {
+ private static final String[] ipListElec = new String[]{"127.0.0.1", "172.1.41.129"};
+ private static final String[] ipListLight = new String[]{"192.168.110.240", "192.168.100.45"};
+
+ private static final String[] ipList = ipListElec;
+ private static final String[] ipListErr = new String[]{"172.2.41.216", "172.2.41.129"};
+
+ public static final int ECB_DEC = 0;
+ public static final int ECB_ENC = 1;
+
+ public static void showmenu() {
+ System.out.println("请选择测试项:");
+ System.out.println("1.SM4短数据加解密");
+ System.out.println("2.SM4批量数据加解密");
+ System.out.println("3.SM4-MAC短数据");
+ System.out.println("4.SM4-MAC批量数据");
+ System.out.println("5.SM3短数据");
+ System.out.println("6.SM4短数据加密后生成MAC,解密验证MAC");
+ System.out.println("7.SM4批量数据加密后生成MAC,解密验证MAC");
+ System.out.println("8.SM4长数据加解密");
+ System.out.println("9.SM4长数据MAC");
+ System.out.println("10.SM3长数据");
+ System.out.println("11.功能全量测试");
+ System.out.println("12.性能全量测试");
+ System.out.println("13. 短数据 SM4+MAC性能测试");
+ System.out.println("14. 批量数据 SM4+MAC性能测试");
+ System.out.println("-1.退出");
+ }
+
+ public void sm4ShortEndes() throws InterruptedException {
+ System.out.println("-------- SM4短数据加解密性能测试开始 --------");
+ sm4ShortEnde(1, 10000, 1024);
+ sm4ShortEnde(40, 10000, 1024);
+ System.out.println("-------- SM4短数据加解密性能测试结束 --------\n");
+ }
+
+ public void sm4ShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ byte[] data = new byte[plainLen];
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_ShortData(0, data, ECB_ENC);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+
+ SydApi apiTest = Api.get();
+ byte[] res = apiTest.SYD_SM4_ShortData(0, data, ECB_ENC);
+
+ ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads);
+ start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolDec.submit(() -> {
+ SydApi api = Api.get();
+ byte[] plain = api.SYD_SM4_ShortData(0, res, ECB_DEC);
+ });
+ }
+ poolDec.shutdown();
+ poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ end = System.currentTimeMillis();
+ duration = end - start;
+ tps = totalRequest * 1000.0 / duration;
+ throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + tps);
+ System.out.println("吞吐量: " + throughput + " MB\n");
+ }
+
+ public void sm4BatchEndes() throws InterruptedException {
+ System.out.println("-------- SM4批量数据加解密性能测试开始 --------");
+ sm4BatchEnde(1, 100000, 1024);
+ sm4BatchEnde(40, 100000, 1024);
+ System.out.println("-------- SM4批量数据加解密性能测试结束 --------\n");
+ }
+
+ public void sm4BatchEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ int[] keyIdx = new int[]{0, 0, 1, 1};
+ List data = new ArrayList<>();
+ data.add(new byte[1000]);
+ data.add(new byte[1000]);
+ data.add(new byte[1000]);
+ data.add(new byte[1000]);
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_BatchData(keyIdx, data, ECB_ENC);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+
+ SydApi apiTest = Api.get();
+ List res = apiTest.SYD_SM4_BatchData(keyIdx, data, ECB_ENC);
+
+ ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads);
+ start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolDec.submit(() -> {
+ SydApi api = Api.get();
+ List plain = api.SYD_SM4_BatchData(keyIdx, res, ECB_DEC);
+ });
+ }
+ poolDec.shutdown();
+ poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ end = System.currentTimeMillis();
+ duration = end - start;
+ tps = totalRequest * 1000.0 / duration;
+ throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + tps);
+ System.out.println("吞吐量: " + throughput + " MB\n");
+ }
+
+ public void sm4macShortEndes() throws InterruptedException {
+ System.out.println("-------- SM4MAC短数据性能测试开始 --------");
+ sm4macShortEnde(1, 100000, 1024);
+ sm4macShortEnde(40, 100000, 1024);
+ System.out.println("-------- SM4MAC短数据性能测试结束 --------\n");
+ }
+
+ public void sm4macShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ byte[] data = new byte[plainLen];
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4Mac_ShortData(0, data);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+ }
+
+ public void sm4macBatchEndes() throws InterruptedException {
+ System.out.println("-------- SM4MAC批量数据性能测试开始 --------");
+ sm4macBatchEnde(1, 100, 1024);
+// sm4macBatchEnde(40, 100000, 1024);
+ System.out.println("-------- SM4MAC批量数据性能测试结束 --------\n");
+ }
+
+ public void sm4macBatchEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ int[] keyIdx = new int[]{0, 1, 0, 1};
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+ List data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ String[] s = api.SYD_SM4Mac_BatchData(keyIdx, data);
+ System.out.println(s);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+ }
+
+ public void sm3ShortEndes() throws InterruptedException {
+ System.out.println("-------- SM3短数据性能测试开始 --------");
+ sm3ShortEnde(1, 100000, 1024);
+ sm3ShortEnde(40, 100000, 1024);
+ System.out.println("-------- SM3短数据性能测试结束 --------\n");
+ }
+
+ public void sm3ShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ byte[] data = new byte[plainLen];
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM3_Hash_ShortData(data);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+ }
+
+ public void sm4ShortMacEndes() throws InterruptedException {
+ System.out.println("-------- SM4短数据加密生成MAC,解密验证MAC性能测试开始 --------");
+ System.out.println("单线程");
+ sm4ShortMacEnde(1, 10000, 1024);
+
+ System.out.println("40 线程");
+ sm4ShortMacEnde(40, 100000, 1024);
+ System.out.println("-------- SM4短数据加密生成MAC,解密验证MAC性能测试结束 --------\n");
+ }
+
+ public void sm4ShortMacEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ byte[] data = new byte[plainLen];
+ int keyEnc = 0;
+ int keyMac = 0;
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+
+ SydApi apiTest = Api.get();
+ DataAndMac ret = apiTest.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
+
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+
+
+
+ ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads);
+ start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolDec.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, ret.getData(), ret.getMac());
+ });
+ }
+ poolDec.shutdown();
+ poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ end = System.currentTimeMillis();
+ duration = end - start;
+ tps = totalRequest * 1000.0 / duration;
+ throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + tps);
+ System.out.println("吞吐量: " + throughput + " MB\n");
+ }
+
+ public void sm4BatchMacEndes() throws InterruptedException {
+ System.out.println("-------- SM4批量数据加密生成MAC,解密验证MAC性能测试开始 --------");
+ System.out.println("单线程");
+ sm4BatchMacEnde(1, 10000, 1024);
+ System.out.println("40 线程");
+ sm4BatchMacEnde(40, 100000, 1024);
+ System.out.println("-------- SM4批量数据加密生成MAC,解密验证MAC性能测试结束 --------\n");
+ }
+
+ public void sm4BatchMacEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException {
+ int[] keyEnc = new int[]{0, 0, 0, 0};
+ int[] keyMac = new int[]{0, 0, 0, 0};
+ List data = new ArrayList<>();
+ data.add(new byte[plainLen]);
+ data.add(new byte[plainLen]);
+ data.add(new byte[plainLen]);
+ data.add(new byte[plainLen]);
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+
+ ThreadLocal Api = new ThreadLocal() {
+ @Override
+ protected SydApi initialValue() {
+ return builder.build();
+ }
+ };
+ SydApi apiTest = Api.get();
+ List ret = apiTest.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
+
+
+ ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads);
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolEnc.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
+ });
+ }
+ poolEnc.shutdown();
+ poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double tps = totalRequest * 1000.0 / duration;
+ double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + String.format("%.2f", tps));
+ System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB\n");
+
+ ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads);
+ start = System.currentTimeMillis();
+ for (int i = 0; i < totalRequest; i++) {
+ poolDec.submit(() -> {
+ SydApi api = Api.get();
+ api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, ret);
+ });
+ }
+ poolDec.shutdown();
+ poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+
+ end = System.currentTimeMillis();
+ duration = end - start;
+ tps = totalRequest * 1000.0 / duration;
+ throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024;
+
+ System.out.println("并发数: " + numberOfThreads);
+ System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("TPS: " + tps);
+ System.out.println("吞吐量: " + throughput + " MB\n");
+ }
+
+ public void sm4LongEnde() {
+ System.out.println("-------- SM4长数据加解密性能测试开始 --------");
+
+ byte[] data = new byte[1024];
+ int key = 0;
+ ByteBuffer enDataBuff = ByteBuffer.allocate(100 * 1024 * 1024 + 16);
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ long start = System.currentTimeMillis();
+ SydApi api = builder.build();
+
+ ISM4 sm4 = api.initSM4(key, ECB_ENC);
+ for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) {
+ sm4.update(data);
+ }
+ byte[] res = sm4.finish();
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double throughput = 100.0 * 1000 / duration;
+
+ System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("吞吐量: " + throughput + " MB\n");
+
+ start = System.currentTimeMillis();
+
+ sm4 = api.initSM4(key, ECB_DEC);
+ for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) {
+ sm4.update(Arrays.copyOfRange(res, i * 1024, (i + 1) * 1024));
+ }
+ sm4.update(Arrays.copyOfRange(res, 100 * 1024 * 1024, 100 * 1024 * 1024 + 16));
+ sm4.finish();
+
+ end = System.currentTimeMillis();
+ duration = end - start;
+ throughput = 100.0 * 1000 / duration;
+
+ System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("吞吐量: " + throughput + " MB\n");
+
+ System.out.println("-------- SM4长数据加解密性能测试结束 --------\\n");
+
+ }
+
+ public void sm4MacLongEnde() {
+ System.out.println("-------- SM4MAC长数据性能测试开始 --------");
+
+ byte[] data = new byte[1024];
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ long start = System.currentTimeMillis();
+ SydApi api = builder.build();
+
+ ISM4Mac sm4mac = api.initSM4Mac(0);
+ for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) {
+ sm4mac.update(data);
+ }
+ sm4mac.digest();
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double throughput = 100.0 * 1000 / duration;
+
+ System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("吞吐量: " + throughput + " MB\n");
+
+ System.out.println("-------- SM4MAC长数据性能测试结束 --------");
+ }
+
+ public void sm3LongEnde() {
+ System.out.println("-------- SM3长数据性能测试开始 --------");
+
+ byte[] data = new byte[1024];
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+
+ long start = System.currentTimeMillis();
+ SydApi api = builder.build();
+
+ ISM3 sm3 = api.initSM3();
+ for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) {
+ sm3.update(data);
+ }
+ sm3.digest();
+
+ long end = System.currentTimeMillis();
+ long duration = end - start;
+ double throughput = 100.0 * 1000 / duration;
+
+ System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒");
+ System.out.println("吞吐量: " + throughput + " MB\n");
+
+ System.out.println("-------- SM3长数据性能测试结束 --------");
+ }
+
+ public void loggerFunc() {
+ System.out.println("-------- 设置日志配置功能测试开始 --------");
+ SydApi.SYD_SetLogConfig("./logs", 3);
+ System.out.println("日志配置成功,存储路径./logs,级别3");
+ System.out.println("-------- 设置日志配置功能测试结束 --------\n");
+ }
+
+ public void connectFunc() {
+ System.out.println("-------- 短连接建立与关闭功能测试开始 --------");
+
+ System.out.println("-------- 短连接建立与关闭功能测试结束 --------\n");
+ }
+
+ public void longConnectFunc() {
+ System.out.println("-------- 设置长连接参数与获取长连接功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+ System.out.println("设置长连接参数与获取长连接成功");
+
+ try {
+ builder = new SydApiBuilder(
+ ipListErr,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ api = builder.build();
+ System.out.println("设置长连接IP错误检测失败");
+ } catch (SydApiException e) {
+ System.out.println("设置长连接IP错误检测成功");
+ }
+
+ System.out.println("-------- 设置长连接参数与获取长连接功能测试结束 --------\n");
+ }
+
+ public void sm3ShortFunc() {
+ System.out.println("-------- SM3短数据功能测试开始 --------");
+
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ String res1 = api.SYD_SM3_Hash_ShortData(new byte[1024]);
+ String res2 = api.SYD_SM3_Hash_ShortData(new byte[0]);
+
+ if (res1.equals(CalcRes.SM3_SHORT_RESULT1) && res2.equals(CalcRes.SM3_SHORT_RESULT2)) {
+ System.out.println("SM3短数据测试成功");
+ } else {
+ System.out.println("SM3短数据测试失败");
+ System.out.println("计算结果:" + res1);
+ System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT1);
+ System.out.println("计算结果:" + res2);
+ System.out.println("预期结果:" + CalcRes.SM3_SHORT_RESULT2);
+ }
+
+ try {
+ api.SYD_SM3_Hash_ShortData(new byte[1025]);
+ System.out.println("SM3短数据超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM3短数据超出错误检测成功");
+ }
+
+
+ System.out.println("-------- SM3短数据功能测试结束 --------\n");
+ }
+
+ public void sm3LongFunc() {
+ System.out.println("-------- SM3长数据功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ ISM3 sm3 = api.initSM3();
+ byte[] data = new byte[4064];
+ for (int i = 0; i < 10; i++) {
+ sm3.update(data);
+ }
+ String res1 = sm3.digest();
+
+ data = new byte[0];
+ sm3 = api.initSM3();
+ for (int i = 0; i < 10; i++) {
+ sm3.update(data);
+ }
+
+ String res2 = sm3.digest();
+
+ if (res1.equals(CalcRes.SM3_LONG_RESULT1) && res2.equals(CalcRes.SM3_LONG_RESULT2)) {
+ System.out.println("SM3长数据测试成功");
+ } else {
+ System.out.println("SM3长数据测试失败");
+ System.out.println("计算结果:" + res1);
+ System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT1);
+ System.out.println("计算结果:" + res2);
+ System.out.println("预期结果:" + CalcRes.SM3_LONG_RESULT2);
+ }
+
+ try {
+ sm3 = api.initSM3();
+ data = new byte[0];
+ for (int i = 0; i < 10; i++) {
+ sm3.update(data);
+ }
+ sm3.digest();
+ System.out.println("SM3长数据长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM3长数据长度超出测试成功");
+ }
+
+ System.out.println("-------- SM3长数据功能测试结束 --------\n");
+ }
+
+ public void sm4ShortFunc() {
+ System.out.println("-------- SM4短数据加解密功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+ int key = 0;
+
+ byte[] enc1 = api.SYD_SM4_ShortData(key, new byte[1024], ECB_ENC);
+ byte[] dec1 = api.SYD_SM4_ShortData(key, new byte[1024], ECB_DEC);
+
+ byte[] enc2 = api.SYD_SM4_ShortData(key, new byte[0], ECB_ENC);
+ byte[] dec2 = api.SYD_SM4_ShortData(key, new byte[0], ECB_DEC);
+
+ String res1 = Util.bytes2HexString(enc1);
+ String res2 = Util.bytes2HexString(enc2);
+
+ if (res1.equals(CalcRes.SM4_SHORT_RESULT1) && res2.equals(CalcRes.SM4_SHORT_RESULT2)
+ && Arrays.equals(dec1, new byte[1024]) && Arrays.equals(dec2, new byte[0])) {
+ System.out.println("SM4短数据测试成功");
+ } else {
+ System.out.println("SM4短数据测试失败");
+ System.out.println("加密计算结果:" + res1);
+ System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT1);
+ System.out.println("解密计算结果:" + Util.bytes2HexString(dec1));
+ System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[1024]));
+ System.out.println("加密计算结果:" + res2);
+ System.out.println("加密预期结果:" + CalcRes.SM4_SHORT_RESULT2);
+ System.out.println("解密计算结果:" + Util.bytes2HexString(dec2));
+ System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[0]));
+ }
+
+ try {
+ enc1 = api.SYD_SM4_ShortData(key, new byte[1025], ECB_ENC);
+ dec1 = api.SYD_SM4_ShortData(key, enc1, ECB_DEC);
+ System.out.println("SM4短数据长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM4短数据长度超出测试成功");
+ }
+
+ System.out.println("-------- SM4短数据加解密功能测试结束 --------\n");
+ }
+
+ public void sm4LongFunc() {
+ System.out.println("-------- SM4长数据加解密功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ int key = 0;
+ byte[] data1 = new byte[4064];
+ byte[] data2 = new byte[16];
+
+ ISM4 sm4 = api.initSM4(key, ECB_ENC);
+ for (int i = 0; i < 10; i++) {
+ sm4.update(data1);
+ }
+ byte[] enc1 = sm4.finish();
+ String res1 = Util.bytes2HexString(enc1);
+
+ sm4 = api.initSM4(key, ECB_ENC);
+ for (int i = 0; i < 10; i++) {
+ sm4.update(data2);
+ }
+ byte[] enc2 = sm4.finish();
+ String res2 = Util.bytes2HexString(enc2);
+
+ sm4 = api.initSM4(key, ECB_DEC);
+ for (int i = 0; i < 10; i++) {
+ sm4.update(Arrays.copyOfRange(enc1, i * 4064, (i + 1) * 4064));
+ }
+ sm4.update(Arrays.copyOfRange(enc1, 10 * 4064, 10 * 4064 + 16));
+ byte[] dec1 = sm4.finish();
+
+ sm4 = api.initSM4(key, ECB_DEC);
+ for (int i = 0; i < 10; i++) {
+ sm4.update(Arrays.copyOfRange(enc1, i * 16, (i + 1) * 16));
+ }
+ sm4.update(Arrays.copyOfRange(enc1, 10 * 16, 10 * 16 + 16));
+ byte[] dec2 = sm4.finish();
+
+ if (res2.equals(CalcRes.SM4_LONG_RESULT2)
+ && Arrays.equals(dec1, new byte[40640]) && Arrays.equals(dec2, new byte[160])) {
+ System.out.println("SM4长数据加解密测试成功");
+ } else {
+ System.out.println("SM4长数据加解密测试失败");
+ System.out.println("加密计算结果:" + res1);
+// System.out.println("加密预期结果:" + CalcRes.SM4_LONG_RESULT1);
+ System.out.println("解密计算结果:" + Util.bytes2HexString(dec1));
+ System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[40640]));
+ System.out.println("加密计算结果:" + res2);
+ System.out.println("加密预期结果:" + CalcRes.SM4_LONG_RESULT2);
+ System.out.println("解密计算结果:" + Util.bytes2HexString(dec2));
+ System.out.println("解密预期结果:" + Util.bytes2HexString(new byte[160]));
+ }
+
+
+ try {
+ sm4 = api.initSM4(key, ECB_ENC);
+ data1 = new byte[4080];
+ for (int i = 0; i < 10; i++) {
+ sm4.update(data1);
+ }
+ sm4.finish();
+ System.out.println("SM4长数据超长度检测失败");
+ } catch (SydApiException e) {
+ System.out.println("SM4长数据超长度检测成功");
+ }
+
+ try {
+ sm4 = api.initSM4(key, ECB_ENC);
+ data1 = new byte[17];
+ for (int i = 0; i < 10; i++) {
+ sm4.update(data1);
+ }
+ sm4.finish();
+ System.out.println("SM4长数据16字节未对齐检测失败");
+ } catch (SydApiException e) {
+ System.out.println("'SM4长数据16字节未对齐检测成功'");
+ }
+
+ System.out.println("-------- SM4长数据加解密功能测试结束 --------\n");
+ }
+
+ public void sm4macShortFunc() {
+ System.out.println("-------- SM4MAC短数据功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ int key = 0;
+ byte[] data1 = new byte[1024];
+ byte[] data2 = new byte[0];
+
+ String res1 = api.SYD_SM4Mac_ShortData(key, data1);
+ boolean check1 = api.SYD_SM4Mac_ShortData(key, data1, res1);
+
+ String res2 = api.SYD_SM4Mac_ShortData(key, data2);
+ boolean check2 = api.SYD_SM4Mac_ShortData(key, data2, res2);
+
+ if (res1.equals(CalcRes.SM4MAC_SHORT_RESULT1) && res2.equals(CalcRes.SM4MAC_SHORT_RESULT2)
+ && check1 && check2) {
+ System.out.println("SM4MAC短数据测试成功");
+ } else {
+ System.out.println("SM4MAC短数据测试失败");
+ System.out.println("计算结果:" + res1);
+ System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT1);
+ System.out.println("计算结果:" + res2);
+ System.out.println("预期结果:" + CalcRes.SM4MAC_SHORT_RESULT2);
+ }
+
+ try {
+ res1 = api.SYD_SM4Mac_ShortData(key, new byte[1025]);
+ check1 = api.SYD_SM4Mac_ShortData(key, new byte[1025], res1);
+ System.out.println("SM4MAC短数据长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM4MAC短数据长度超出测试成功");
+ }
+
+ System.out.println("-------- SM4MAC短数据功能测试结束 --------\n");
+ }
+
+ public void sm4macLongFunc() {
+ System.out.println("-------- SM4MAC长数据功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ byte[] data1 = new byte[4064];
+ int key = 0;
+ ISM4Mac sm4mac = api.initSM4Mac(key);
+ for (int i = 0; i < 10; i++) {
+ sm4mac.update(data1);
+ }
+ String res1 = sm4mac.digest();
+
+ byte[] data2 = new byte[16];
+ sm4mac = api.initSM4Mac(key);
+ for (int i = 0; i < 10; i++) {
+ sm4mac.update(data2);
+ }
+ String res2 = sm4mac.digest();
+
+// c = opt.check(hexStringTobytes(SM4MAC_LONG_RESULT1))
+// s = opt.hexcheck(SM4MAC_LONG_RESULT1)
+//
+// c2 = opt2.check(hexStringTobytes(SM4MAC_LONG_RESULT2))
+// s2 = opt2.hexcheck(SM4MAC_LONG_RESULT2)
+
+ if (res1.equals(CalcRes.SM4MAC_LONG_RESULT1) && res2.equals(CalcRes.SM4MAC_LONG_RESULT2)) {
+ System.out.println("SM4MAC长数据测试成功");
+ } else {
+ System.out.println("SM4MAC长数据测试失败");
+ System.out.println("计算结果:" + res1);
+ System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT1);
+ System.out.println("计算结果:" + res2);
+ System.out.println("预期结果:" + CalcRes.SM4MAC_LONG_RESULT2);
+ }
+
+
+// try:
+// input = bytes(4080)
+// opt2 = conn.sm4_mac_init(0)
+// for _ in range(10):
+// opt2.update(input)
+// res2 = opt2.digest()
+// System.out.println('SM4MAC长数据长度超出测试失败')
+// except SmxApiException as e:
+// System.out.println('SM4MAC长数据长度超出测试成功')
+//
+// try:
+// input = bytes(17)
+// opt2 = conn.sm4_mac_init(0)
+// for _ in range(10):
+// opt2.update(input)
+// res2 = opt2.digest()
+// System.out.println('SM4MAC长数据16字节未对齐测试失败')
+// except SmxApiException as e:
+// System.out.println('SM4MAC长数据16字节未对齐测试成功')
+//
+// System.out.println('-------- SM4MAC长数据功能测试结束 --------\n')
+ }
+
+ public void sm4BatchFunc() {
+ System.out.println("-------- SM4批量数据加解密功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ List data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ int[] key = new int[]{0, 0, 0, 0, 0, 0, 0};
+
+
+ List en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC);
+
+ List de_data = api.SYD_SM4_BatchData(key, en_data, ECB_DEC);
+
+ if (en_data.equals(CalcRes.SM4_BATCH_RESULT) && data.equals(de_data)) {
+ System.out.println("SM4批量数据加解密测试成功");
+ } else {
+ System.out.println("SM4批量数据加解密测试失败");
+ System.out.println("加密计算结果:" + en_data);
+ System.out.println("加密预期结果:" + CalcRes.SM4_BATCH_RESULT);
+ System.out.println("解密计算结果:" + de_data);
+ System.out.println("解密预期结果:" + data);
+ }
+
+ try {
+ data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ key = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
+ en_data = api.SYD_SM4_BatchData(key, data, ECB_ENC);
+ System.out.println("SM4批量数据长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM4批量数据长度超出测试成功");
+ }
+
+
+ System.out.println("-------- SM4批量数据加解密功能测试结束 --------\n");
+ }
+
+ public void sm4macBatchFunc() {
+ System.out.println("-------- SM4MAC批量数据功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ List data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ int[] keyIdx = new int[]{0, 0, 0, 0, 0, 0, 0};
+
+ String[] s = api.SYD_SM4Mac_BatchData(keyIdx, data);
+
+ boolean[] check = api.SYD_SM4Mac_BatchData(keyIdx, data, s);
+
+ boolean flag = true;
+ if (Arrays.equals(s, CalcRes.SM4MAC_BATCH_RESULT)) {
+ for (int i = 0; i < check.length; i++) {
+ if (!check[i]) {
+ flag = false;
+ break;
+ }
+ }
+ if (flag) {
+ System.out.println("SM4MAC批量数据测试成功");
+ } else {
+ System.out.println("SM4MAC批量数据测试失败");
+ System.out.println("计算结果:" + check);
+ System.out.println("预期结果:" + new boolean[]{true, true, true, true, true, true, true});
+ }
+ } else {
+ System.out.println("SM4MAC批量数据测试失败");
+ System.out.println("计算结果:" + s);
+ System.out.println("预期结果:" + CalcRes.SM4MAC_BATCH_RESULT);
+ }
+
+ try {
+ data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ keyIdx = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
+
+ api.SYD_SM4Mac_BatchData(keyIdx, data);
+ System.out.println("SM4MAC批量数据长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("SM4MAC批量数据长度超出测试成功");
+ }
+
+ System.out.println("-------- SM4MAC批量数据功能测试结束 --------\n");
+ }
+
+ public void sm4ShortMacFunc() {
+ System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ int keyEnc = 0;
+ int keyMac = 0;
+ byte[] data1 = new byte[1024];
+ byte[] data2 = new byte[0];
+ DataAndMac en_data1 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1);
+ DataAndMacCheck de_data1 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data1.getData(), en_data1.getMac());
+
+ DataAndMac en_data2 = api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data2);
+ DataAndMacCheck de_data2 = api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, en_data2.getData(), en_data2.getMac());
+
+ if (data1.equals(de_data1.getData()) && data2.equals(de_data2.getData()) &&
+ de_data1.getMacCheck() && de_data2.getMacCheck() && en_data1.equals(CalcRes.SM4ANDMAC_SHORT_RESULT1) && en_data2.equals(CalcRes.SM4ANDMAC_SHORT_RESULT2)) {
+ System.out.println("短数据加密计算MAC,校验MAC解密测试成功");
+ } else {
+ System.out.println("短数据加密计算MAC,校验MAC解密测试失败");
+ System.out.println("加密计算结果:" + en_data1);
+ System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_SHORT_RESULT1);
+ System.out.println("解密计算结果:" + de_data1);
+ System.out.println("解密预期结果:" + data1);
+ System.out.println("加密计算结果:" + en_data2);
+ System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_SHORT_RESULT2);
+ System.out.println("解密计算结果:" + de_data2);
+ System.out.println("解密预期结果:" + data2);
+ }
+
+ try {
+ data1 = new byte[1025];
+ api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data1);
+ System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("短数据加密计算MAC,校验MAC解密长度超出测试成功");
+ }
+
+ System.out.println("-------- 短数据加密计算MAC,校验MAC解密功能测试结束 --------\n");
+ }
+
+ public void sm4BatchMacFunc() {
+ System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试开始 --------");
+ SydApiBuilder builder = new SydApiBuilder(
+ ipList,
+ new int[]{8889, 8889},
+ 1000,
+ 2000
+ );
+ SydApi api = builder.build();
+
+ List data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ int[] keyEnc = new int[]{0, 1, 0, 1, 1, 1, 1};
+ int[] keyMac = new int[]{1, 0, 1, 0, 0, 0, 0};
+
+ List en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
+ List de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
+
+ boolean flag = true;
+ if (en_data.equals(CalcRes.SM4ANDMAC_BATCH_RESULT)) {
+ for (int i = 0; i < de_data.size(); i++) {
+ if (!de_data.get(i).getMacCheck() || !de_data.get(i).getData().equals(new byte[1024])) {
+ flag = false;
+ break;
+ }
+ }
+ } else {
+ flag = false;
+ }
+ if (flag) {
+ System.out.println("批量数据加密计算MAC,校验MAC解密测试成功");
+ } else {
+ System.out.println("批量数据加密计算MAC,校验MAC解密测试失败");
+ System.out.println("加密计算结果:" + en_data);
+ System.out.println("加密预期结果:" + CalcRes.SM4ANDMAC_BATCH_RESULT);
+ }
+
+
+ try {
+ data = new ArrayList<>();
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ data.add(new byte[1024]);
+ keyEnc = new int[]{0, 1, 0, 1, 1, 1, 1, 0};
+ keyMac = new int[]{1, 0, 1, 0, 0, 0, 0, 0};
+
+ en_data = api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data);
+ de_data = api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, en_data);
+ System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试失败");
+ } catch (SydApiException e) {
+ System.out.println("批量数据加密计算MAC,校验MAC解密长度超出测试成功");
+ }
+
+ System.out.println("-------- 批量数据加密计算MAC,校验MAC解密功能测试结束 --------\n");
+ }
+
+ public void funcAll() {
+ this.loggerFunc();
+ this.connectFunc();
+ this.longConnectFunc();
+ this.sm3ShortFunc();
+ this.sm3LongFunc();
+ this.sm4ShortFunc();
+ this.sm4LongFunc();
+ this.sm4macShortFunc();
+ this.sm4macLongFunc();
+ this.sm4BatchFunc();
+ this.sm4macBatchFunc();
+ this.sm4ShortMacFunc();
+ this.sm4BatchMacFunc();
+ }
+
+ public void perfAll() throws InterruptedException {
+ this.sm4ShortEndes();
+ this.sm4BatchEndes();
+ this.sm4macShortEndes();
+ this.sm4macBatchEndes();
+ this.sm3ShortEndes();
+ this.sm4ShortMacEndes();
+ this.sm4BatchMacEndes();
+ this.sm4LongEnde();
+ this.sm4MacLongEnde();
+ this.sm3LongEnde();
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+ System.setProperty("com.sunyard.sydapi4j.debug", "false");
+
+ TestAll test = new TestAll();
+ Choise choise = new Choise(args);
+ boolean flag = true;
+
+ while (flag) {
+ showmenu();
+ switch (choise.getAsInt()) {
+ case 1:
+ test.sm4ShortEndes();
+ break;
+ case 2:
+ test.sm4BatchEndes();
+ break;
+ case 3:
+ test.sm4macShortEndes();
+ break;
+ case 4:
+ test.sm4macBatchEndes();
+ break;
+ case 5:
+ test.sm3ShortEndes();
+ break;
+ case 6:
+ test.sm4ShortMacEndes();
+ break;
+ case 7:
+ test.sm4BatchMacEndes();
+ break;
+ case 8:
+ test.sm4LongEnde();
+ break;
+ case 9:
+ test.sm4MacLongEnde();
+ break;
+ case 10:
+ test.sm3LongEnde();
+ break;
+ case 11:
+ test.funcAll();
+ break;
+ case 12:
+ test.perfAll();
+ break;
+ case 13: {
+ test.sm4ShortMacEndes();
+ }
+ case 14: {
+ test.sm4BatchMacEndes();
+ }
+ break;
+ case -1:
+ flag = false;
+ break;
+ }
+ }
+ }
+}
diff --git a/sydapi-database.iml b/sydapi-database.iml
deleted file mode 100644
index 4b38be7..0000000
--- a/sydapi-database.iml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/test/start.sh b/test/start.sh
new file mode 100644
index 0000000..7113c47
--- /dev/null
+++ b/test/start.sh
@@ -0,0 +1 @@
+java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dcom.sunyard.sydapi4j.debug=false -cp sydapi-database-1.15.jar:./lib/*:./ test.TestAll
diff --git a/test/sydapi-database-1.15.jar b/test/sydapi-database-1.15.jar
new file mode 100644
index 0000000..f478ab6
Binary files /dev/null and b/test/sydapi-database-1.15.jar differ