
@@ -417,7 +417,7 @@ https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md
**不解决 文档/视频/常见问题 已明确说明、描述简陋 或 态度无礼 的问题!**
**如果你已经多次得到帮助,却仍然只索取不贡献,那就别指望大家再帮你!**
-如果你 [登记了自己使用 APIJSON 的公司](https://github.com/Tencent/APIJSON/issues/187),可以加专门的 **企业用户支持群**,作者亲自且优先答疑,
+如果你 [提 PR 登记了自己使用 APIJSON 的公司](https://github.com/Tencent/APIJSON/issues/187),可以加 **企业用户支持群**,作者亲自且优先答疑,
只有解答了这个群里的全部问题,才看情况解答其它群里的问题(其它群不保证解答、更不保证及时)。
如果你为 APIJSON 做出了以下任何一个贡献:
From 3f748f1abd61aa8b3f58b2247d5e81077c18d2f9 Mon Sep 17 00:00:00 2001
From: TommyLemon <1184482681@qq.com>
Date: Fri, 15 Jul 2022 22:45:36 +0800
Subject: [PATCH 020/547] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 2de4a80c3..d30d3a66e 100644
--- a/README.md
+++ b/README.md
@@ -423,7 +423,7 @@ https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md
如果你为 APIJSON 做出了以下任何一个贡献:
[提交了 PR 且被合并](https://github.com/Tencent/APIJSON/pull/92)、[提交了优质 Issue](https://github.com/Tencent/APIJSON/issues/189)、[发表了优质文章](https://blog.csdn.net/qq_41829492/article/details/88670940)、[开发了可用的生态项目](https://github.com/zhangchunlin/uliweb-apijson),
可以在群里发出贡献链接并附带说明,管理员将设置关注你一段时间,优先答疑解惑。
-一般解答顺序:贡献者 > 帮助他人的群友 > 带企业名昵称 > 带岗位名昵称 > 其他群友。
+其它群一般解答顺序:贡献者 > 帮助他人的群友 > 带企业名昵称 > 带岗位名昵称 > 其他群友。
### 相关推荐
From 4886ee923659826ff980cbd55ab36e5adf570d63 Mon Sep 17 00:00:00 2001
From: TommyLemon <1184482681@qq.com>
Date: Sat, 16 Jul 2022 04:49:58 +0800
Subject: [PATCH 021/547] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E7=89=A9=E8=81=94=E7=BD=91=E6=97=B6=E5=BA=8F=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E5=BA=93=20TDengine?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/apijson/orm/AbstractSQLConfig.java | 10 +++++++-
.../java/apijson/orm/AbstractSQLExecutor.java | 25 ++++++++++++++++---
.../src/main/java/apijson/orm/SQLConfig.java | 14 +++++++++--
3 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
index a7a7cdcac..0dfe0e34e 100755
--- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
+++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java
@@ -148,6 +148,7 @@ public abstract class AbstractSQLConfig implements SQLConfig {
DATABASE_LIST.add(DATABASE_DB2);
DATABASE_LIST.add(DATABASE_CLICKHOUSE);
DATABASE_LIST.add(DATABASE_HIVE);
+ DATABASE_LIST.add(DATABASE_TDENGINE);
RAW_MAP = new LinkedHashMap<>(); // 保证顺序,避免配置冲突等意外情况
@@ -726,6 +727,13 @@ public abstract class AbstractSQLConfig implements SQLConfig {
SQL_FUNCTION_MAP.put("bitAnd", ""); //bitAnd(a,b)
SQL_FUNCTION_MAP.put("bitOr", ""); //bitOr(a,b)
+ // PostgreSQL 表结构相关 SQL 函数
+ SQL_FUNCTION_MAP.put("obj_description", "");
+ SQL_FUNCTION_MAP.put("col_description", "");
+
+ // SQLServer 相关 SQL 函数
+ SQL_FUNCTION_MAP.put("datalength", "");
+
}
private int[] dbVersionNums = null;
@@ -991,7 +999,7 @@ public static boolean isHive(String db) {
@Override
public String getQuote() {
- return isMySQL()||isClickHouse() ? "`" : "\"";
+ return isMySQL() || isClickHouse() || isTDengine() ? "`" : "\"";
}
@Override
diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java
index 321b38b47..02cbad747 100755
--- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java
+++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java
@@ -1114,7 +1114,8 @@ public Connection getConnection(@NotNull SQLConfig config) throws Exception {
connectionMap.put(connectionKey, connection);
}
- int ti = getTransactionIsolation();
+ // TDengine 驱动内部事务处理方法都是空实现,手动 commit 无效
+ int ti = config.isTDengine() ? Connection.TRANSACTION_NONE : getTransactionIsolation();
if (ti != Connection.TRANSACTION_NONE) { //java.sql.SQLException: Transaction isolation level NONE not supported by MySQL
begin(ti);
}
@@ -1143,7 +1144,7 @@ public void begin(int transactionIsolation) throws SQLException {
// }
if (! isIsolationStatusSet) { //只设置一次Isolation等级 PG重复设置事务等级会报错
isIsolationStatusSet = true;
- connection.setTransactionIsolation(transactionIsolation);
+ connection.setTransactionIsolation(transactionIsolation); // 这句导致 TDengine 驱动报错
}
connection.setAutoCommit(false); //java.sql.SQLException: Can''t call commit when autocommit=true
}
@@ -1212,6 +1213,12 @@ public void close() {
@Override
public ResultSet executeQuery(@NotNull SQLConfig config, String sql) throws Exception {
+ if (config.isTDengine()) {
+ Connection conn = getConnection(config);
+ Statement stt = conn.createStatement();
+ return executeQuery(stt, StringUtil.isEmpty(sql) ? config.getSQL(false) : sql);
+ }
+
PreparedStatement stt = getStatement(config, sql);
ResultSet rs = stt.executeQuery(); //PreparedStatement 不用传 SQL
// if (config.isExplain() && (config.isSQLServer() || config.isOracle())) {
@@ -1221,10 +1228,20 @@ public ResultSet executeQuery(@NotNull SQLConfig config, String sql) throws Exce
return rs;
}
+
@Override
public int executeUpdate(@NotNull SQLConfig config, String sql) throws Exception {
- PreparedStatement stt = getStatement(config);
- int count = stt.executeUpdate(); // PreparedStatement 不用传 SQL
+ Statement stt;
+ int count;
+ if (config.isTDengine()) {
+ Connection conn = getConnection(config);
+ stt = conn.createStatement();
+ count = stt.executeUpdate(StringUtil.isEmpty(sql) ? config.getSQL(false) : sql);
+ }
+ else {
+ stt = getStatement(config);
+ count = ((PreparedStatement) stt).executeUpdate(); // PreparedStatement 不用传 SQL
+ }
if (count <= 0 && config.isHive()) {
count = 1;
diff --git a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
index e6c8712bd..2e5c322a8 100755
--- a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
+++ b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java
@@ -24,6 +24,7 @@ public interface SQLConfig {
String DATABASE_DB2 = "DB2";
String DATABASE_CLICKHOUSE = "CLICKHOUSE";
String DATABASE_HIVE = "HIVE";
+ String DATABASE_TDENGINE = "TDENGINE";
String SCHEMA_INFORMATION = "information_schema"; //MySQL, PostgreSQL, SQL Server 都有的系统模式
String SCHEMA_SYS = "sys"; //SQL Server 系统模式
@@ -41,7 +42,15 @@ public interface SQLConfig {
boolean isDb2();
boolean isClickHouse();
boolean isHive();
- //暂时只兼容以上 5 种
+ default boolean isTDengine() {
+ return isTDengine(getDatabase());
+ }
+
+ static boolean isTDengine(String db) {
+ return DATABASE_TDENGINE.equals(db);
+ }
+
+ //暂时只兼容以上几种
// boolean isSQL();
// boolean isTSQL();
// boolean isPLSQL();
@@ -177,7 +186,7 @@ default int[] getDBVersionNums() {
SQLConfig setTable(String table);
/**数据库里的真实Table名
- * 通过 {@link #TABLE_KEY_MAP} 映射
+ * 通过 {@link AbstractSQLConfig.TABLE_KEY_MAP} 映射
* @return
*/
String getSQLTable();
@@ -285,4 +294,5 @@ default int[] getDBVersionNums() {
SQLConfig setProcedure(String procedure);
+
}
From 89c561f4a43789f52528a361542cec3cf879ac6e Mon Sep 17 00:00:00 2001
From: TommyLemon <1184482681@qq.com>
Date: Sat, 16 Jul 2022 06:44:17 +0800
Subject: [PATCH 022/547] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E7=89=A9=E8=81=94=E7=BD=91=E6=97=B6=E5=BA=8F=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E5=BA=93=20TDengine?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/demo/DemoSQLConfig.java#L186-L190
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index d30d3a66e..2f07d0ba3 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,7 @@ This source code is licensed under the Apache License Version 2.0

+
From 7e0792a923411ce6baab2ee3629e615442b4b639 Mon Sep 17 00:00:00 2001
From: finkyky
Date: Mon, 18 Jul 2022 20:21:19 +0800
Subject: [PATCH 023/547] =?UTF-8?q?doc:=20=E4=BF=AE=E6=94=B9=E6=96=87?=
=?UTF-8?q?=E6=A1=A3=E9=94=99=E5=88=AB=E5=AD=97'=E5=80=9F=E5=8F=A3'?=
=?UTF-8?q?=E4=B8=BA'=E6=8E=A5=E5=8F=A3'=20issue=20#420?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\217\212\345\256\236\347\216\260.docx" | Bin 21457 -> 21525 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git "a/APIJSON\345\210\235\346\234\237\346\236\204\346\200\235\345\217\212\345\256\236\347\216\260.docx" "b/APIJSON\345\210\235\346\234\237\346\236\204\346\200\235\345\217\212\345\256\236\347\216\260.docx"
index 7522282a320ead9c67f9908c6abb98c548b5f8ad..14667653e03d8694e74f65f65c7266262991e2dc 100644
GIT binary patch
delta 16657
zcmZ|%1ymeO*EI~|?ykXuyIYXp?(Q1g2|fgO8{FO9o!|r~xVyVMd~jX&Bk!~RzxJA5
zYi7Eut7`h}eNLUKnJNNJCqilD1|DK^kf4u{sSx8P?vg(phg$R}Rc=$gO?+g)ZtS#yezP
zUZ0x*<#%Ra|M=HaGh__qs_7kDj)g#LddD)Z_Hx@Z6_(P9x-C)B_&oKCYs>Xz-LtXp
z>%yQ9#>Cb(hg(LVJYxzrLnf=;w{R&tLXn){Ji63voNXp;bT)R5hw_VJ+KoL4=^Rw%Y+eh4!NGQ(<%Em)V5$u
z&{Q1>f->wU3HNfCtX5oe<-`WBTh0c!+x~M%byM|eE01Ek%-g%yz5sXVpjCo9EfdF>
zi{B5y7-+2>mf3I!-HESnDDHC(^zMmP5(qNI*_E2F#O-H4%G^Rvok34f#(VOR)1Z(RQJ^k%D+
za8};sS`7>(yx_;OXb;Fw;to6%o8{B^wC=@6Yd?U7#6hflC{dIdTf`6(=?=pHue$m=
zNK^SrwPvNttj1HC86j?yt(Ki_rXOF$!rrdM_1)d&+r#4v-uAjjmVyiWyBNavtn>%x
z1(E!`kiQ)vydYLeI2r|G<~`*$PuJ1ajQ{WGj{$hR-#&f|z{f9u4gvyX2FC)7Sq3m+
zKyG;FoTJo6hvHhR=6;_|k;SHW=JAx=lKD*@C!$U5eQ%chcGA|KJ~G&nWV3z?gLT+m
zTj*yYOdJ!WoikeER~5`ZOmdOKnM+g=i>Xr(y!><*#Lvqsi5-7Kj5eTtLC~XObn>Wq
zv_{Fy!Hioz?H!WGYsiZbHZl&l(v(JLqS!&YUW6{2x*6#%Q)k%h%CCO;J5GdrjBz}7
zg0J75?T?1}a!}iN%o0b^N~;wgS1;6G*ep&?8NgA$ijCYR4^ue868QUuC-d#$3PY3m
zdUDhfL;R4mBfv3z&C8yh0yk16j*|S(mF)P1{=kKNVCtrH)A9b%$M69CrEq|{5ZJJ@
zR4n0?a3COWKyL^EfTColpE}ZdFLrYBas+l~Ai88su8L@Jj7eqbgC}FkkQam?$jd{o
zF&Z>73uC-o5isL^87Nqo6Q$z8nc>yO54e9Nr;>^lBb_Trm&-I^e%zcs2i!ZjtHjIK
z(1C$Sgy)f`%VC+O5Zc&aZVG?Rb*o}c>FI76M_24I^Jz)|guHYPuLbh_5h*dFQQMuK
zJG;B&~=?%paa6gTG`@G^~W@XB?vt_xPrsQ!g-v`S`W{Hlc{894#ers5xN-$9mGD
zMnQ8bn?i-HxnC6gYNItYnA~<;+g7-7#yx(QCteiPG_J4VGE~6=zOJqdY=-BIpUbwa
z^OYVPGU?nJu-z3!$h*uCUa>qji)e~k#Z*as+KRzAONZ^QJBk7_a7NDeb}xt*V1%#@aQ0TDaPi<&=>qTFr+hT0BD!fd@hkSIrPLEiAh+)bpb0
zDH4{;#}I$;g|F^;G{I2O6-1y+Lbman_lmG`>iQfxVBvMx0EQB#GL458L{{B`JLBYw
zpj3B@<6Dx`Xux6q;w8OqvBX<_%wdzTSd8~wAAU+PJf`Shll;~D(-D_SXQW4#46g@+
zpL$0ZdSaXuDEKPd+07y2U%scL3_&e*ai)hTcaVyFr@4)Y;0;6KKa&W&yizyzw&v^k
zQybIsgGs)+4t6Riku$jsWAtecKcr(5<++!n6CcTeiD1i~tM9&--Wrw}HMtcy>i*L6OIzU0Cep5A
zvC49`sw~GPff+*sRv(^8VorM68t#TKxvY&Q`0k;V=8+gG<=YSrp7XB|QsNDhAyZhy
zw@bSm*;JizQzTtHN3STkJ*L_|ngk&&3f3r%i9P@!QL_x$487Ps8wTIs1+&!R;Xn&7
z+9+#j2xrGgqKpEpU($V0)O`gsIA27e*dKKIYj(iihvUV6aDQLLbik#l3TYGYnIvKO
zev9dFJhbtH)OoX|-KJvSu{Ci2$~%M0y0hs*=RdDw@AuMLu6+1AwFKtx{Cnhcd#iw+
z2TS|BGbPa5HWH5c1dHX$ZAw&k@0DHhU{oemYvp}d|#|jb@h&3v<#FAs~&qmB%qTk^@}
z`jWt2ABB_I1A`a|njmbRZg#*a<|i;xl!C>yVsVq{63`Wdq(}g#BE=AfA8SG&D_Z}K
z)dzs>$RQy7D{;XYOM4w>?EBtkoandw%Yc9D@8LUR>EZ;7$&Z-a!|a$sF7CCKuHWXx
zB^@7!otX#98sE)WI)5}hv}z;w;udgMZ0358ig4%hYj@0R(L>4J-|BFP;QGu5%~F5;
zW+f$lACi$9{6sa+-y&qXnV2cLDAE!2qKG)K?hik(HvM=(h99&S3^N6lqO&4=FX1^r
zAS<F;<6tZ@z2f`-Wb|9pF#_Px`QM=w_ksnb}4
zjhg?({^C-(Z}yZR=egGvLF~Av3U38pHDC@;abU1rc8O!JHiDb`Ugv9To$TL#&C-G-
zqrAR3Or1_H4qj#6ers}4(5fBZJ!bUVst7!Nbgz%|NuJGTUZ&E?4=}yzQ@sz;6&G6?
zH^4q)&9ktc?w70#z1|`F3)#RZ;R2)({2uGqE!vjysel(gQ5u@cv*GxS_8r-`S)cUx
zMfBV`fe`ulhVS!ilgi0Ggp9lL>7$&=bV&T+XKU(##uJI+80}$SAN$&-z1@?VfOk
z!?2n(I;M)~hN*}q4ggH?F~4q}n0{5NssxwfbuV&Ps`&ve-uNHJQ-o6WHBU$sOBzAJ
zXg1}8;GrDodpYC`sy}weXl@i3k~r#h$U-J_q`zq8GCL1xx0fVS6y@VX&ve2=mK4*63f7iFexYl=HoB7!?%*j$WWlf!eX#nM#3PadOEB{x+{;4P7
zqeG!0K3lRBIU$@0BL#>Rg|44%j|)yLrd<;u1zdhb^1Q^bqX{qbRqIdtXkNy*kDDrf
zv~Bm_{{43~B_eBEvgB9jb~Lb}?Ik)4Hb2-KXg`J^iLYJ+TlaGu!Z{sOa*94%1X)kB
zrh=t@2wa2b1fX@7-mID)jA@-dq(I?BtMrtQ9gwUFh{WRSz9q+l_)yrwmmH&vLZ5(l6!mtidxcLlYkBIXly8G#EFTP!K
zs!KBi!1H(xczax~dgp*rQhU_z3VXjg(AzT;^=c=22KZz@h_`_Ud$=S%iJP}?cFq~L
zHQ)Hm8@g_Gn9Ur?{04g$XuNUN(S$ojV24`JWfVuti}rr;W;DISRJatbbASyO$7)tJ
zA!UOrtUg*X`bys_*t$8StbIq_=W^k
zzxZHf3g~RMY-;1(g(GL2?n^waGrqIL1|TKR
z+WrXlLiXP{B}K-LVaZ83K~Ukxt!qL9se~-c6hF(6#&jt@fSXU
zgMhTaf`FiYIIchK98DOVOr4!AY|Wh*+-$5H)U@rEIWT;Ps^1L`R%-wzBa$?I)aeVh
zN?bMy6w9olgxWf8s1n1a*T+Ap!W=j$g{BPUNhf}uab9k1|Llh5oeZMp4vzzJ;rZs5
znmF=?e<4!qz5Zc97fZ1z)kC-BANo!2?QK~!4YwL=aTG*V0tm|!PGfa!&Bjs>CNvsa
zDn#0>sD%=)-a!bPo0SUikVq&FHHF+BJrm#N`WETIZi&UNW!4dvW1vEt$1xXbVp(U1
z@gyHJDPTM=&46J8A+fAUV6k!FA6ID90K3#zW!Z~TmThvchr-(puAkO-?r^u+D3!#B
zCa|4}UfhstfPf`oPgF@P(^)L}mrRtg20~~J
zAePgMWZf0=WTGOV=Q>q^9CFUY;+lZG?TXY{0eM$9>1=)xb9n#+p?ARDC#uhD5k{>ZDkH
z{ltlKBaQl%ne&|^zgkVh_JCmYG}HKR{@5bxsOckaoo>A1Hu
z2oq(Lv~m~lKB%EyhiQIG*xNGQRNHs>P&FWCvp2H)g!Il|02^$_Ri1<3ke(j7zs;Hj
zKZq4``FLx|BL6J(2<_Dy?3eZ^A_JgL%JAuXvaZva0>dS8xgypm5x`e%&2JFYRl%^%Kqdf
zRZ!v9!2#^LBR{yrCsUp{8={ZYRxUUL%#>uHzX~Y
zP1IHrcrCvzH?MeI*k)`>EkQ3l){NrM7&mu3jJKH2;2zOSmg{ocISjSr*?kP+H)kVU
zPM6DK>$urweZN}&ay+w_{$w;#{~GTGyIkh7bbILBd%xUZJy*s#nz(7IrMBwAXTCNu
zlc6@3lGSu%*0|m5v?$Dw1%C!;&@Hm{$b9gW$Gd~=l@4Z{UwX2XTdwb4PyM-)xao;I
zs5{h%aQ|TBDctU{d{LoUX7NbbZ?!)>HNrK0C^}ym2+cMnK>SF{?jpD;dxL+L_|qY}
ztIX%R-ww=p0?b#kAunMKacBJ~`?bmBPC(niAt`o0!
z@n#AMGWi=2s2$}!IMIlbz77tkr6<010=bGfrfYl-o^JG6DS`)8$^43lUf
zhKzncn9!mnH;N4(AfUHg9Bvi=pk*f84Y}u(XcJZ?&ZJ&sHu_w+ypH0f%{ZH9SI00k
z>^%GPp!9sjd#T1-{$#S+8oPoROGbRF;FTSWM54fcDgMrF+v*BvTiWSBvr)*3
zcDwHe4PSP3+qe=TnBXMo{FCw;jP!QAiJb|M@u^_F(*Gs+xVO`W*Jtuv4XCvcBN7wx
z=DEL)6w?R3XyranAM$d(Pb?vym#JIfb+=$_tkzTN@udS+ZW9LjfDiD<_*tN
z1(D19ZA1Y56NXi=a0kJg30zU%{?^$1A)H15vPnrjL2@i2%ctlsobqSrqwPPw)o%#E
z-Tlra_HeT&j`J2=fM;rQJso&@@2GLTu8W+NPD{4mz7w~a?}Um0K@*G$K$x$jr{!|3
z@>zbq7+$K7Z?p56;(zuy_b+?b@aTvhUn`pT97zJ4m($sJxl8qzA7ihfJcmSfG$pk*
ztz#_rW8H?Y-rL%?-+SMm5X~U19AsQ-LLqEA)9C&{d;$JqW?&i1R>^kV|pbN1)eX^*zerj7U_MWTsX3)Dh
zt6<$!rcLTQwvG}8r*P*red(;y6nGAAe?JC}di4hbi48QX9HU0G?hV)Ny&YT{_Imt+
zZR$n5kDDgA`UuOUaTXpUS{d{Y;<^a7|Uz{Hf<^snV?}}c>
z$NKbTFoD0x6=OsI@JEf`t=ujjTd<29oe?QFaFh@V?aAQB)5}3aLlks;UCLm=0V03n
zucV*I1{!L+6B204U><`t-EW#}&yuqbl80~K>^tuDSxn0)9MJ@!4?tE0oA1K+I%@%U
zuaoCkgzr3jm0A*Bg9}-
zn>M@PibEY&9;JH>prnMTsR$)E`NT?o>~X)P?>>?!1%tSp1}B_77qu3>D<|vw(%KWs
zH^&vket^H2jy_(@HofFlEwNSq1wb63`3eOVo6)hu?RtMR+sQ2*U-^8`srE7a?$it0
z_anouF86cPAyB!v^0~NeCpO!|_Z@cnNwOgasax^r{f*gwaOJzX+~Ee0T&jBP4G@Fy
zL$64_HZ%v>&0)z1q@BJU8r|O%bzIMT0$zjzD|)nxxD@!?ujf+Qn%*8p0l&zekvi-j
zhB~p4`5WGcetF9ix}E)w1^3081Y3&rRZD!ftTL-BjU7ydKb=xRJW>+cmOj=4jIgBu5woS
za=$q$4f3oKDpgz6h*ai}tcs6|y|zoZ1rbod`!2FWgd$0@DN@ydKMt)-4xzhd@aU%`
zK9CoitNN4T5&3b#ZBM|sNLbuEeny*wTf&x&oH7ZbjD0N8*q=uM`bf;b)wQ=Ka4<)K
zPBxKtwuC_F>jwaP5_BgTgw;F|WwVASEUgBPz8wqJXgZ&WqH30@S3=YJL=<_w^@C4a
z;+QK>h77OrPp#;tqH7?o(EZ1?~W~ZlMwE`8I_b1M9!LEU`mbeIhLQKu(ICKg9
z??aG(J|G?kuVhAiOm>W~I42IotJzH+03@=NOyzTM$XceCf5LJy*={s!Gnz7@_?bQx
zB85>sIGsFD*ka+!>`DxOSpQWue<9rWJF0{r!b20=g;=@755eLVIFT5^bjja3BK@Xf
zw^t)KW`*xEqKA@oSk8Uk{Ha|Y(}(FYs}b(&&d>OMg}q5fp;dljebDP60GvuQpVQN&
zfm7surM-@>@;huU?C`Wawww<{idfX1+~qQg7uvl%_}q^%dSsPXuD&3>{1Uj}M0;UI
z_fC^Y#{90qyaQT^L)x(my&I>&1+M@YRCy(A3qoo@0iB}wz^+8Dv{YIQ{tgG;a(dkX
zvIMo=sz%qN&-oUd2>^Og$d!zw&0uTkdzZHJi}-BUbM4~V@O%fWoeQJBLeJi+w)vb-
zbBE8{-=_-vW7?wlhg`KF41CX`F6heNn9WfTl|nz?%i#Q;;|Z=)MXW*8e~H~jXmqIZ
z7bf^-A5pDraNF`~8j0jz@??aFk({cnQ*I9vHCWa@Fb#nFO?s5S4d5k4+ilmnF>!
zbQv~RI$SvjvkKQ;B8+9jAAq&GDZsxu%fA<8!&+SF@_XOULH+Uc<3mp_^ao7Unq-<}W0=*6F)-^k(IviZL%O*UqCssRd9qde7p2sck
z^Q5ij6aSS`%hzcA74BP~`>QOG{k;#}FV}Z7o?||Ew=lIhNP@*~!VYW;RW
zWd|5EvDW%(P@)dGW-6)ot$OdSpzr(QLP=cRMvDJ0Khi9iD#)W2c@?r^w+k%}?G+7=
zy5~KBO*#)_dH%u6*Zo^Tk>)em3FUMPNCTzs3Y0%;hT>gqXCU-u7oUFcv7(>#wzXnE(ZyCUBsWg!2S*82WNR-8V>;oHE8^g
zgu(mu1i{1UHT2#4GWt7uFTt5FvkUZ#$4Ysvfb>Ae-iQ(fkJrXJ;Q8j)`iZ~;!3F>#
z-Pb94wftcpgoJp-7{!)_0>LajNBvhmaPChxWCt_hX#vj+5tlD5sJfpHS|x&+Y)
zv7%{*qf3#j?;1R_7q71LX{P{Z9^Cbt7nxNH)8(lBZKrHG*356v8sKxj>|a#QXd~>!
zcNgSpXk_Z|fL_TpdrHy0xb_2Xjswk*cFWotvtB{npqcJs>w!Jh)D=sM!!+P
zqi*ozh!{h@s_Vh+-1%&+T8436~Ry8o#2l(Auc8=?^`;1lAgZ$^}Tav>S^#F2mY;lI-?JUY4z
zefe*R2-)$`jU^a}A))jtVM9;@wis5Y(joh+atm0qA3BQag7jhU;n!tijCM3CCe_se
zcp5a7N3oc)>Ux}%t(o_{r%&x*(%-hbd_gE_DUTPLlesjxKcKpuY*1e8M8_Nznyflz
zhDH>1ktAOP3+~r!md5ejU6h|353ae^(R6osIDs82&qccWsF40I<1OOq&+F+vbU7!v
zu<|roidRaR-s^kML}o(#rCBGTOisWv>r-pEsr%#>7(RiEb2lb3KnY*{-S_?_V`#1N
zY&ZP)T({$T^Jm8hATJKxzle)nMoR>|hNFtV`7y$0Lo_xkyx&t-;md;%G=0K+qKLHV
z{c~6OI$xW^Gd;IJ>;2(TM%9G#`}XKZ1iiM!k?udeq~Ne0IV)*TFKc!))`=p
zTKa2-j(wzZ+33vgD1^EL20r0Qgg3~>%hkxJP>Z3E5D%&Ii`IS?wlee4QKUKop6rg|
zZkG7YJCY8A+)o5Crnp!U2`XFy%@chRA{9@Nb)2g}!kKBt&Wf6Oh%wIjz4Jzrqs`}d
z;Ayxd^1R9!;05@OrLq3h`aE6`Im_5;H|$|`e=@(CAie5jK4<4O%kL?QVJO<6+Ud-J
zkH@-G7M?(Y@%Bgm6ZhW$6vBxF7!5hwECZ(L2MnraTlzmrHdftpwCJb4^Zwvk+u}^L
z_Ox|BT|%tk%UaPyIi0#Vs~Ob%3CoABW`(JS%oFDXpi)M(
zQ7gm&7+UkB<`z7#%0^}L8|V-x3nYZ&-ENH;tum*BbPh=lNM=K04o#RQZg-&IgR)?e
zaI%K7_@s5m+EOX7GNQA`m{Vep>XW;=yAR!bEV9-eSzOw6?BE2pLyps&_G7{{@%{D3efa6JH|`oeU{p#&DQaYvQp=K4ZsCh
z;o~Mr#|!^(^oW81WDnpS=XS2^kM-}lIsQ^79r8M~FF`jF1v+&WLxvGsk~oB7!BgTr
z2mLa3rX`+d9c#Sj2*Td4J@{y+NmcjXI@Yv1`Fv%kbZG6D5jPm_wOSL7yuI3*UW)oK
zH^;Tj`+yrb1peEx8ybJ9z7L=u19YYpq`#l~TNP(eo08hfi1dumL|{!hou{dyz>>}y
zT^k>~7R`xOL~7wTG;#&!%*~aQh>^D}=)1WzN6)_PVBW^S41W?IVH)l617?svJ4=76
zu5fcMpA3i`$hRNkV;>yN(D}bOI^;`}6E$Y|E=kodAAcXf^~Oz_4NrdxLWDSIbdLld
z+%mC3y<^!W!Yg-xcnR46H&;0fZB#mDFDO+E*$xc%88df~27+X*fFB)!f-76vX+{^r
z-gOxJ(0rFxr{{5WRjE0`JiDA2FX1xw+tY^Iq*r~7p<9>3iv8=h*6>ek*%~H~|90B&
zn*ahBjooX5fKwkIp%OaeeWIMjbZPJ;C|L%?D>P7ba0!qSRALG$%=e&l!Z>C@$YKyx
z)@&rd**j5IZ5TBdr+hdUNHkH4^)Vzz^bpTO*^=t4u4vH&V_Y!0B9ioT)16`i*|NyG9ft<(vEkUm||vK$;6?d%Y@jPc2PhRY01n1S#2f`tnDWoTf7
ztFh$*e=mklSqKN*m2|^iL&QV&pEO4B{PT|Mre5)iBR1JD^<|#LC;^5~uuRMd6Tl%V
zY$$9PDQuV+mRI;)L3s+jK?u2{2(5Lke)n>h;P*m
zQm$_XGAH0qprSsvp@6K!dC!KlAATe`%!b0)SB85zu(Qnh@c}VrzMqOsZ0jE`os?lv
z4G?&P21sjbwv)D3+DAvw89yxr054SW>Xu#@D1BCHjKSBz{+@uq68D}P`ixS3UX9>z
zoM4LQNxR@c$qApfA+q$C^(IbVND>QlXWLxy}^J
zq!cfvgwbi}sO;6tLoN9b^iOxfA}XXGf+U$FneLY}*)x3RW>~rjAOOb<&`8GkQT=FP
zY#0_dbboJbdYgm(X#CM|8P))<1&>v3_K?4QXVGHO8e>`FQizfb@}9rgnNh*56X1iN
zI2x&Awhmql0%tQe?CHVSe?(B8{*kOD)Bo3bfpXK5Bq{GFG+I!=Eyd;#g_qs2y^9h8
z&o4I;y%62@nYx-)Qw08I3-mLDg;jK7*0QYk#XDy6vMFK~9uZ{Pc32VcS_ZhQi
z;z=B~fQ9vn`|jDbtKDGu=xR7<`V-POL9RJLu5UqkegK7J1r4Br25h?$ERw1LkDDOn
z!3;!(gF}NMo>M4~>_5}^jnjuFUV{!xg&C-X-xkpm7ym%@&&%}Mv6rkXbmjQu>As3}
z*REswYWhLWKF?FfsUXJ9B)i!#x3LMecQZ|c)Wlf5=NH@}IY=hW@j{M#OhW*Fk6}Bt
ztbo`9Py;`)`$K#B;^j5d6oF#^+E8NEg2$FEMlM_YrTBQoVY=aYdG_mh!jJDc#7!ps
zPkO;RhtikIA9)J)Dw~XrN{!jGHG@-=HhzHpjgISrVmuR
z=3Z2)C()^0k(ZH|QFXV{c7qi!kZouIn$>tKZM0ngQ?fKtyt4+7aV5XU#o`2GmP4U!
z2GiuQH4AlzNzbN@9PH)2s1Qf)il&|R+G`dN$hmvVw9|?(IK)=hNN>^_|Js3}QqDNC
z2^{E#$|^Z4ZC2Yoj*;g_57DFdjrfNv_-cpo@`Us;+crg|W+#7V4mOJV+E4Hsc+Elp
z&_UimsF~chk1tO6fXjK_+z>j9c~6Rc;n#HBUo71jBu-!|zHkcc;Fdaciw)A%3JSgh
zzaTQZ>l)q8nj*1rsu|^#Phc0&oogt`dv|2Z{$Ro-dxFwI;u6BKpep2PV?GXyDBWV$
zrlb!iz=Y&zf*IL>Z{albVgpAKh8zGE0ePr$ZDP&jsFVnu{iLA`4y+D!oep&Y$5>~P
z9CAC?yTcgu@TbCUsnfPb6fH^=!4z=rn)z=LUovA;os_w?QO>e4ha#1ZMx_lOw)(8w#njRW{c
zMnNUAK=vf$K-6Oi^?AS$LDr<)q@2gJJhr)v%N1zXtUFVVQofU`H7pG!>Kkd%ps+N;y3yWk&BKfjwm9Z&j;iTaxuoC%00K
zl3GX1B}e)^X^8?Z{wWsLDI$JC
zB3l9guFL-hgP*aWLwciydBCoKXAcYSqESQKgejg+S&0wi0OYiR7O%{`ZV#v)C^a!;
z{?e}*4lOf3w}M|5q=IxiVY1YfxYJ>IlC)8Nrfr)Gk{f&BEjqR!&E<2$Ot7eqzS@ZP
zBR{ZlpA31yB6${~F#M&;6mcF&;r!(Qj>@Nw)6Y2gv1FPQADA6yEH+qF_mjr_dVvl*
zEs>{87U}n6x%4^QR!MQG1d29B1~L(JeN=yXx~NL57mDW=73RK
z=Clz&aGD*91qAID^Z~?;hI@(cXf9X;AK;9zdzjzD&n(S8%l&|5<=LHguQDcrY`{>!P-@_iLvs5cPMr#)
z8*vk1lfRNCVMoj~SCRkW1-kf6O*gE}*+g^W1teA^=pSE4C_XUDHzLawT;!i
z61Mj$kYkjfiVpC6s6LtunoI@ys8IEpoE9~E+-w*ZRzZ*uGb?-C?I
z6PCr(+9uqZp`)6kT885sOhu_o>mT0qiG3!LxaqiQ%f#t{97k*64<-o*29mNOfAm*P
zKQq#hca)bP8y6Y53lS2i!%WjpVQgQ9X}gR#CB&Y1mE;92Vff0L)|e$BAI(O`Nb$z1BwuRInldU
z#-&^Ou9Scq)RsVd+?6?WB2c^US6e&89t
z$6|AqsIN9G9Q{}t)5+ahF~5^kIU6TmkvRkj-%;IBJWd6NzaHK?aC~$V>Km28z*|5}^FY5}B1aTY|3(z&;ueqNe?O
zfTOR|vsr~oJ>?*hBZ8wG$U%_uMWqL?*EQLbOOREQ;RBVf$3MuKBR#od^u7FHUl^JH
zc=EiKpH=o|to8=#6vX@g<0U(7_4BXfG)p_EA8#?78Jc_)K%|MuN-tF(RUZ#^Uvuz(
ze0v+z=HO4?zCn%&y1R8`u@~sRqx*@m-PKM{HRB<*Px#{_)nwJAQk-AXy!;~KaHm7
zKSqO}@c+kXHXr{n8doU>h?M`=YHa>hUcmp7UjKikR~|Mi&h;C`e|gs7vk6Y%zfJ$B
zC0b*WK-1d)s0M?s(=|B=K80aBGT>E0ps5fu+zF>b;Q1rlFd}Of>c05S-tq9Zs-7S#UOc&1MvChY^C2
zh{Ox`NB;$lN~>I5ujFvA62XUqY@t{#X$jU@bUP^0vt_sXSb>r@eb{IPw}0`ez_J!`
zP4&xwnC`f4%b0E@)q>Jt1uVj#T8018;Bk^(OqQrG@cc;Pk|dwFl^~&z*_7czAD;dLPnSJABE0wn&vbk%QD-z4*kemmVUoW9!>aIg%kCXv;3Oi*vYrUKKzlp?DaBe}yh-P_qvP-|%h;T)7%Ku8&!}QMoLbTzxBW-Q
zXtR6*4Bg8lIBQx}I^%lLAdka-`=e;)p`@JQ2^-c^Mb=ZbT1&_s)=uS&e1-erfb<_$
zFb5=a1v?;Z6MSh1x<%j3)}6qn-y{%QBTU8#G{}!NzyR8X77RNzO^n2U2lORq01cy^k+u
zFfzaXhm*Nv)~pE`SUNC1e0WL9SnATj;vr5~JiwQ9Wo^p@uNH(c;kwE4MmGFB*JKwB
zzZ8O`52!oAEC1!;3v^0uPHEO$Z{}u!4Q8%u4dsx-fK#T(-%WP9Al(w3`4f%~^vW5p5*o+bIyK*HQ#DMxQ)^5qcMwg|)`gd_e+M1cJl1ng1!yXl+J0MMX8;OeyEH}Nb5O^-tgw#+8YGfa5_+J$Cvtvi6K%!FW
z19*>MqS*z(x(eO3j1c>@+$ILaSf#U3mdk3Z`p!VVzfk}Rjiago>zx85yj}@gN!#08
z-Sw+9NfDx0?XMw;xFZ71ETC{TYEzE2*E(7m#XH%A%70>a{W~Ts4;x4T6o6S`0AvUV
zD)AXJO0*48YHMwzfHlLMZ0{WX?a5Cp8C%yaSb&G^rr4Kl(NQxtiYk#-qkw(04oXR=FOcf+tttggW6WzD
z!g5JU`6AR@tRv+DLDcK5m%aSr5rs-r%p>xfOqr{(MY`RNL@9Q3PK1d_YojeOZgHS(
zkpQCBeMl~I){W#}mq9GK=}jiv?brxTtcIa23Vp%cR_Tbk7{6z~6V8Z|w1YihwPxPM
zGgPaPugi(d@%2WSH5I7hb(y`z?H%UUSJmWu7`sO1IyKiQp|d$}#%3R|MCn*v2HPTF
z@xw`jq}77&7^=B6VzE-P`;1};NZt@s`vS6z5*CZhDeA>{?(Z49e0;1xHo;*aKwhp&
zAyMy-1UFO}%3r?(Q>SdICY~EpaV)p=qVzfBR(RqFc0)4>m(Q9
zM964pBV@Rxi)`;WV*9^CI51<;N`}r**9oDc?gV!#`pYF6(#kS1Q^W}bQT4Fct@IC|
zhipA1%8Gc~JLjl9fczFmg(36Rj|K40+s+otqROgn>o3+uyqk}s8jpUB`HF{;Gg3&O
z)f&NJ7OJ*ehZ-=BR;)gTMuIUzyrNZ4>>L{CKqZ|_?bBs?ORyaQ77B$DdPpRbYmJ!e
z-5S8xl*QoBWSPQ1AJS;kXBAf=DW~kkg0?tw@muo^E0uvtv#_f5tCLXr&p4~A+=uf!
z-8LHbtHEY@@Knaw3?WRxgVwy11+HLhG;LPu3ob@=HGh52c!&JQ
z{1hcUAwi{pV{(F^oVlB1$Ou|95fv|5T*|
zv{NF-|A#(4w!QEngMgrYe)&=Uz10@5Qi%fp|89%^K9PX{SOM8wId3ISd35H})$^
z-A{Iz9#24twZ?_R7SlwTm6MHg0lruMUlCQT#wXblN3xg8r~#*f-5KcO(fbY_nx9olfUIFL9f;!)L6Fg%Cch4R)xnqY}T}`Crf(I>y7#%wKJaFo)^o
zI})#x5B!pEP7Ysylw%eW9$d_$o&3SSbc2}Tdc*DIJ5NMU5>7Qv%H0GpLlVcTq=O|5
zjWZ9%E&J!umW?qZr{`~7FI|7=`wBR`Y3&(^f?nmgu15?;o6YB!O@Mu@o}#WTVsOhX
zG%pPU!h$ZLE%N*T^wEGx&PCJc1v&Dd?eC2=$Kw<4s1D
zJ0uftj1*1y2tDS5rA~IPDY3(&277_dD0-&BF(L9ov`X=48${uC*zjtL5>WBU0?_$s_6V6SjXb8@*D77_3cHSMG%U+)k2}pNJk;k;ICjKU)ch~8{YnCesCRe12Ffxykc>GM(2+ak5X
zfjMnlPwrqnCmTg&)R0W$pmG0fIGdb^OSLDW)`!hga}h?TYZ+6oUU8E6sRR(8Db$6^
z)>0|H;f;MOlwMhm`QEjrtYojGOJmIWc_8&jzeQfn>T$`JzVkmuc9)7N7pMqL0Up#)
zb^^G|_NdK*BN79LsVvjnhwts^0wMZ(
ze0JKs)PooZ1KecuZC_o7q>?4J0!sb(9B33;5#W6n-be!LRuN9%x5demnYIV~HOcpu
zWrimQD0C=}no@Gmi$ti_AE2?T0X9IKQL2zDxVn)~EL5JmTMJA!Ak!qr=4Q{*T?@(e
z==Uw;!|!B%h+=Dv_G>t$m@5a$$y>$o*AW3k+bEVAz(3!_&b!FjPdJ0cy*abrZ=Z?v
zL^(`V`-W9};XdCF*lpyr;Px;eY7qw!xYj!>%$Ul~xQ0a+Hm%)xF7T--CPEPaLtyX`
zMY+V@J|ICr6afoi!~ls}oguntn|=7{>1(n0onhFBNrhT6W#6o7sOyIxu%gC4Lcnw<
zhzZlUUy|QQ9(f6_eCiTGv?4r~`|dk8(z15ryQvydh+|J}ku!Q^#Sk-so)-jaPe}ME
z(-v!u2_bGkOtbA(Pd|2Q=U9n=&xtwUpEH6Jlzk$MNkja{*ANgjd{KF7Tn1E1b||sX
zW^M6lX+fvuiOp515EiMR*q~t?_bxd2-nK6{b-m-i<=0Ncd>pd77Ix`c+)WuFs{
z$jg9PONZMI5f?SO)lQt$D9lf8=g-d}N*}#Oh#vOpL^Xe21CE#
zhn!b-TtCpa2HFCMKqt#}4QKVOKJ9Jo1nj#nBJ9*JuX;SlUTblWp&?OF#G
zcv5mA=clTo62dZq!YQ8W1J>qfHzysURSB0t7KUm}EB$c<)
z!k%o;*fenV-3z22h8mu;+qjrV(Y9=H%SRSV6AbMXZdw35h$>y21igqMCxbSy`A3W_
zrNDJ)Ifho9Nsvc;273-SUFUaX+>tyy&NrQ5g!7vm@a^=FVu5~Q~
zorHTw>c64)+Nu6%K%8+Lt1dw8KX(J3!hJwkW{lg@RPBxfqQWZzLY)y{O}FY2Q+LJU
z{}`l|vs$Z-(!u#9Lh<_qq$4QZDE<)++U{;j0R5b4T|Cu|JG`r&R5Q!+XXz%_XH#Zl
zn7%QqIj%JUd+UNPy8Gdjbh}yOBP)isiC2QoW{ei2|QpLjAgeJBY0LORCiaXs&WYIv4k@#$f
z5$Dv;cJJt7BP(P>4-*4t3)XHZMSMq`+mZ)_!7^*A0Gy$sS;>>gZHCzC=?`iQD1-Ll
z?v~V#4MvlVUsjZh5~`?Pc~ByE#`82h)PF}(?;bK1zO|6QC$JNaa*)Tt0I=IQ*#zJo
zyM$yIT1gNVsaSKaK!ura%u?ZK44G(1_7%Y0oEPMP@YGfCgKYeOSQPAdxK&2-Wzv@k
zDP=^HW#j(olWOB)%bcmobT$Q5Lby%?JA%gwi6QMIyebt*C>1ga$o3e1DqO{Gc2P^s
zZPm8uM+btLl?wcsm1De_6-K<7PmU?(Xxel(1SJ~Y(;sZK^u366jm0GVr|p0|NK}Bc
zz`+B*h)|Y$A!4TwW*gzd)S*oxPaficno?vN+#Tjr-;iDJ{IIUcyWdsKv-VRSX_(TJ
z9S-Ja+xh{`Y9Wxkop=e5woTa-&tk{~gW)u~!fZfiv&?%mU6t)je!^Dctwms6+Odl|
z9A6A%Z4R2-Stj=8q1eo$aYO1Pq6)zGr6(8qRYA5wfpAH!;m8c&iDaQd67awaEBYl$
zxffdRZOst2DGejf0kpmLxSW!|imq6^SxD9t3B_x0c`+DDr~4X
zc}%5-3Db#M*OT0-T1{M&5BnFRY!D$NDs}f!)qlHGs4J|xf*y?D$lmTs_z#ZlN!brZ9F~g2>>5Uy_
znrl2)#>5ss&8UunEV(_p4J}TrG{#232ZfGuBUWd-wx8h7c#KFX&f~gL&isMKpYTjr
z?pt+(v80cw4AB|LGQiV410JLB0TPEzJEAVEMFz4)cPjF=uS)7$9ZFTfSHZa|@%R+O
zmooexUx^*{+MlH$iRsFirbuLcT2K#X?U9p%h5t4G+bjQBF(*#2__6!us)q$$O&N|Mz2
zvqtx4!*w*<|7QTGLzEBO+b6TCSFS2i*vZPjYG=*KFFNI0meBVANN;U?-#%-8>bOL9
z5pq4}Vxr&9goiYI@oo8ByVSosyL?c+lf~3>R@Htg$OopFiKmS4DT;0pGqX1$rvq2k
zku22Ltck}`An5%duj}pE71@i;v%y)!Kt16YA7rPx1yem4^s4uj4{06G6aQi80x*D1ikKC_=;>wjN9feXPlL04lT%=Cm
zofywFFYA83fxO3HtLh>%nnIZ&n-%~B)qp^6*R{>>wu`9FDHrA#
z9mf0HP*5V=ipjwhbdwJ{P~A-v^EUxP+~st)J@vWd%g_ihaw0?=PO&cWcNHCMSfJ=*oz>>npFi0ncLp*WB~qanORGAs~hkAs{fp
zmfzRa!-~z*+RMw{#nzM6&)KO-$Ix??A17!t;|)D_6OlkE>9eFDMt*_Rs#1