From 75fdc82c8b747158136a884d8be409a9df0c0ffc Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Fri, 19 Dec 2025 10:19:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=AF=BC=E5=85=A5excel=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/application/admin/controller/Project.php | 120 ++++++++++++++---- .../admin/template/project/users_index.htm | 2 +- src/project_template.xlsx | Bin 10200 -> 6706 bytes src/public/project_template.xlsx | Bin 0 -> 6739 bytes src/原生应用数据模板.xlsx | Bin 0 -> 10200 bytes 5 files changed, 94 insertions(+), 28 deletions(-) create mode 100644 src/public/project_template.xlsx create mode 100644 src/原生应用数据模板.xlsx diff --git a/src/application/admin/controller/Project.php b/src/application/admin/controller/Project.php index 2a67b3e..77b1928 100644 --- a/src/application/admin/controller/Project.php +++ b/src/application/admin/controller/Project.php @@ -360,28 +360,30 @@ class Project extends Base { $file = request()->file('excel_file'); if (!$file) { $this->error('请选择要导入的文件'); + return; } // 验证文件类型 $ext = strtolower(pathinfo($file->getInfo('name'), PATHINFO_EXTENSION)); if (!in_array($ext, ['xls', 'xlsx'])) { $this->error('只支持Excel格式文件(.xls, .xlsx)'); + return; } // 移动文件到临时目录 $info = $file->move(ROOT_PATH . 'data' . DS . 'runtime', ''); if (!$info) { $this->error('文件上传失败: ' . $file->getError()); + return; } $filename = ROOT_PATH . 'data' . DS . 'runtime' . DS . $info->getSaveName(); - - // 解析Excel文件 - $data = []; + + + // 加载PHPExcel库 + $objReader = null; try { - // 引入PHPExcel库 vendor('phpoffice.phpexcel.Classes.PHPExcel'); - // 判断文件类型 if ($ext == 'xls') { $objReader = \PHPExcel_IOFactory::createReader('Excel5'); @@ -389,6 +391,17 @@ class Project extends Base { $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); } + // 设置只读模式以提高性能 + $objReader->setReadDataOnly(true); + } catch (\Exception $e) { + $this->error('加载PHPExcel库失败: ' . $e->getMessage()); + return; + } + + + // 解析Excel文件 + $data = []; + try { $objPHPExcel = $objReader->load($filename); $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); @@ -400,43 +413,96 @@ class Project extends Base { $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE)[0]; // 确保行数据完整 - if (count($rowData) >= 5) { + if (count($rowData) >= 5) { // 修改为5列,因为模板中已移除密码列 // 验证必要字段不为空 - if (empty(trim($rowData[0]))) { + if (empty(trim($rowData[0])) || empty(trim($rowData[4]))) { // 检查名称和有效期字段 continue; // 跳过必填字段为空的行 } $data[] = [ 'name' => trim($rowData[0]), - 'enterprise' => trim($rowData[1]), - 'filing' => trim($rowData[2]), - 'sid' => trim($rowData[3]), - 'limitationdate' => trim($rowData[4]), + 'enterprise' => trim($rowData[1]), // 个人/企业字段位置修正 + 'filing' => trim($rowData[2]), // 备案号字段位置修正 + 'sid' => trim($rowData[3]), // 证件号码字段位置修正 + 'limitationdate' => trim($rowData[4]), // 有效期字段位置修正 'createtime' => getTime() ]; } } - - // 删除临时文件 - unlink($filename); - - // 批量插入数据 - if (!empty($data)) { - $result = Db::name('project')->insertAll($data); - if ($result) { - $this->success('成功导入 ' . count($data) . ' 条记录'); - } else { - $this->error('导入失败'); - } - } else { - $this->error('文件中没有有效数据'); - } } catch (\Exception $e) { + $this->error('文件解析失败: ' . $e->getMessage()); + return; + } finally { // 删除临时文件 if (file_exists($filename)) { unlink($filename); } - $this->error('文件解析失败: ' . $e->getMessage()); + } + + // 验证数据 + if (empty($data)) { + $this->error('文件中没有有效数据'); + return; + } + + // 批量插入数据,避免重复数据 + try { + // 先检查是否已存在相同的数据,避免重复插入 + $insertData = []; + foreach ($data as $item) { + // 检查是否已存在相同的名称和证件号码 + $exists = Db::name('project') + ->where('name', $item['name']) + ->find(); + + if (!$exists) { + $insertData[] = $item; + } + } + + if (!empty($insertData)) { + // 记录插入前的信息 + trace('准备插入 ' . count($insertData) . ' 条记录', 'info'); + + $result = Db::name('project')->insertAll($insertData); + + // 记录插入后的信息 + trace('成功插入 ' . count($insertData) . ' 条记录,结果: ' . var_export($result, true), 'info'); + echo json_encode(['code' => 1, 'msg' => '成功导入 ' . count($insertData) . ' 条记录,已过滤 ' . (count($data) - count($insertData)) . ' 条重复数据']); + return; // 确保在success后立即返回 + } else { + $this->error('没有新的数据需要导入,所有数据都已存在'); + return; // 确保在error后立即返回 + } + } catch (\Exception $e) { + // 记录详细的错误信息到日志 + $errorMsg = '数据库插入失败: ' . $e->getMessage() . + ' Code: ' . $e->getCode() . + ' File: ' . $e->getFile() . + ' Line: ' . $e->getLine(); + + // 同时记录第一条数据作为参考 + if (!empty($data)) { + $errorMsg .= ' Sample Data: ' . json_encode($data[0], JSON_UNESCAPED_UNICODE); + } + + // 记录到系统日志 + trace($errorMsg, 'error'); + + $this->error($errorMsg); + return; + } catch (\Error $e) { + // 捕获Error类型的异常 + $errorMsg = '数据库插入出现错误: ' . $e->getMessage() . + ' Code: ' . $e->getCode() . + ' File: ' . $e->getFile() . + ' Line: ' . $e->getLine(); + + // 记录到系统日志 + trace($errorMsg, 'error'); + + $this->error($errorMsg); + return; } } diff --git a/src/application/admin/template/project/users_index.htm b/src/application/admin/template/project/users_index.htm index 02dc333..0a9a9a0 100644 --- a/src/application/admin/template/project/users_index.htm +++ b/src/application/admin/template/project/users_index.htm @@ -286,7 +286,7 @@ '
' + '' + '' + diff --git a/src/project_template.xlsx b/src/project_template.xlsx index 307fa1d970a84e48568c33a484a9fba1708d69ae..73fea9a65931329c05b54ee65926419aee1e7be0 100644 GIT binary patch literal 6706 zcmZ`;WmuH!+8ycc96%&gKpLckp+N?aZt2beh8QFz1QY~@5b18DySqa~xscV~f;)DOsQ8aU zkXG{YZQK<=76Aajyj%4hO>LlTtiSGs@Bynfb}XMgcZ_uR^zr}>sYJcrlq$|r)M1;| zK>C=H1{TjNx4;tQ+L5-8F_{X<{w`N;!0#^tCq8^DW(6y5hfK^>0QEMrza!?vc54AU zO5SlvPiVN-nLlJ)jhi?DHf5&my0^&Dqrux8s)U>J$%>( zK~crb641t8w5UqiEL+o=7~yVM^oy+u)~y{zaC^1QJROZ&1Ihs5rdwgKJjGV;XAGo+ zpGis~>hVm?*d3ph^EuGU1`oen*aGR3kNc0^)})zsh7AZV1^O?lnVh?{bYQC{|5Fiv z`V#eDiqzaG0=!#cHf+B|afLWq8$lq}zc%N;1Zuex2v1_~2BYLm+eI797y)H``D= z(Z9S>&PK+9*Y@U2jp8LGS}JOCd%?u#u9sT_XM8~la-*n4DNJCzb@}3kJt7b8=__-* z_9-19q%e#p^b@15TfCIqYgCS&^bzucjQ0Hpl3-38X?e+@^&@$TksSWM(Vm &2%}QS|-zL)I_A{`5)j`q_Yq0w&1Px+c`& ;_od`OS1!5R!SW{c zKLv7?++Hrd>s>G+0DyNVkO{ 3O0^hc z4k{DvW0tjCR~~EU@yhKDro}<(C^}S}mqHKBkv7LO_Q_$qQ#tJnbg77gRRBuMe;OhphA;c1P zy>5!g>UdHmwnk5@8WG-S>O AK77e8vDVcPNVnA6YO%84xjk ziUg_n{}?1m@eEJPvJ8D+py2C83bAd4%c4!Re=Y&mqlnwEO_Q>)>ONwd*Y+mHkihUg zGr{bm0uWy6UT%9m1_E z5_Z`Wo}c%sy@j1II8>eK*A3XNHrt?<#p>)8Kms4Z#!1W#3_?Ri!}P47#DlZFNdQCM zAaP}8%>CGo$rHa#bO)fqN}rT4TXO-&7IzrMKv~U%H#UD#$Vm0n_=tnA@HN5(>ObpS zm+3oHe^+1IyZYk)y}rf}N7G*g&Wz-MjItATxq>8Dh*!5W5KhuwGbydN%e)jq$}iC` z$_l2MWUZMNwP7YwrQvYO8AXpJ1LN!e*zN6Vc3`!9rOFК4_>h3a {Lo>m)@+J-2k00kJ`eHIMDjHn{m}H^mTZtgIATdH;K$$9T z-G^k{hLf6Nwt%+r9u-VFTAP`)1TUo%K&B*gq$V|B%#K;oCW}eLFN{ub?mg68(`zPw zM~M+WwqSv`NHONi+F$rUe ren};bRmxc6qe9 zP95%3cZLr#9&8~??7&yu?7=bw*n99D|L{uy1)RdVWNzcOys+a85->ocqnGqL`StbB zL)(j^w!^LOhXWUzOExDLpQxq$M%hu@${7mX-+f*t{j>+Hrf&LqeEBs*bdK=YxT2G? z35MSP(|w#IuV?}7NA$>y4ZZIZg7VLxHT}l;Syf9{zpNN!JTjb&jI zREdX`OUM>5Dm~iBXvE%eX!bFjE$;J~bs?)Hws@;ss}Nb(Hum5K!~N3u!}|>$OBEaO zEk71`(^>M~fl{N#s$Tyv4L y?+t0rOO>mwKuUu`W3&Wx{Q@r>;}q*ahXuqI?RDllLWdx3Y3HqqH{#{;x|(aBw+ z=xe<22FjTV5={@utf(*m8SF +^dE-}~f$hT@U2JGv& z36Gm7eLSg|oz;tXi !{}`#SIdZuTW<=*mY?a>cmSppRX?OLBlYdQBb1ERPz_=pL~VQf@Wftz{x{ zDb;XN1#gdoV~#fm$6pU_o_3vi^Ly ut$1{XrGb>-0!61BK#t~IatS%0*LjY9^4&s5(;XUQ$pO=CK~stODKCtDh2&w zTIvKfld&LSH50I-UKWqs{uw-sW5&2`Vr4WL_ELU82<2-hjZBc(Bruu4=uw@x y0 zDCz6NU@=#QO+zcEo}iD>pVyf}X;`5)IL-sSbyZ4XT!dFtj+)Y9Vg_bLGMWRS)JvaR zOO%W$xv1Qz^1CxuT3(+&50piYz(HTOz{6vd=jQFG&)R*C72QpCs>>6$^)hvR)W7~C z|9Hd;kEt;G1fX-4Oop*ATxBASY{$V=)pwkWo Iclsa!xjLGLDx9f;Xu5gm1@;2FQb9M&Es{$FAwWIwMX` zM;Xp3_3 1RCuVx9rl`lEQ{TA1VSrN#w9Yu@~D{8eVO#N>p#jc-NYxw zUo3iH73*t!Q17}RtteJ_7bEwiUBlWe C{MvY@x#W_TF)$@cTwrYy!nD0hdut9*|OD|dC_ zqoy~a6pz?@Pc6om#3U*66oE?K3@HxXrf>DoMrc*gOSY+8vYzo5Y^t}UGdLP%oLUAU z1%R_@MZ1%jc07=|vU8J*Fr`crwep^QTXL1dL8maCoF3e+QY_DTl1b+{(~~lpwG9kx zyR~0i=F!U*%0a3z-;jJ=xNa@o(ixv?-
{5PRGb_w?aZOS9`c?M^5AxMvUg`mX(q`saYp!-TsbME!-)Qt2_#b)Jh|(o&$ ;wwjnKa~qL=?$O> 9TpR8s|Wg z6An#m4>H(J^Or=>tO@$)*hmLW4V`%~s)B#QU0B3A)un-JxtW@560P31mdC7gqNUmw z&ssn|7 1=Q# zEE10w>H4W4{wA))d-q1W+ovO7A^_(nU3WpS*S%ws@J#>f$9D$;H532<`(GkDx!IWh zrQU#=EF^&)uklPnvyoS?((1dE$mkdUQStP=NpKC2O!Jx7Bln5Yi<1hDIv;q>MrIyc zzXzAck%3?auOEB`Z45n~EAF)|!vo#V+Uq>&!e<@RVNrZ5wLeBIy4TSu8+zt5a1;o3 zaR4s`+bXtTtA&ZksHbS$K2xU0J`=iJKk^V6cE8A>PU!%RiKUCCV)$=yigXQ>;kLZ- zxN;7umPwm>#28e$azz~J6upP#9B-s5xe?s7;dGxOKWKL26vBLvho!Zyw56_$M B6(Aq>=J5i^65* zk_BQ34ZiN-&K0g^n_Pj0E9*?*2S{m-wy|aAm}BFeP^tHqmgTdspP;GpeR-zP!kd)j z>8N2YBE5u=pU-@vTn(%D;-j~Q!}-GXxAr+?)~~gWuOrDU(+Dg+*+jUD)`gafA4NG* zZMu22*1bx?AY_vswR2bVW$C=C*grrjJ2hR2JsDCi*A~s_QSnmmY0*4b-)P&eNNI7D zY5O9ggq*`2B&FobzJTjT*+smh<*hZhBNY4fo$T7Dw=XnPsZX=;NSV3KEs~0a-BN$< z^qo8{$`QVx-ZK9t$BY7b?m`;nFBJZDS}{&xd8E9Qlpw&%Y(>yqh 5`x1aX$CZUkKC#kew mc<%`N_sZ+L*- z18Ks3n{&ER@z7kalY_ju_{G!DUyU%{4o`x=6h$lh6zck&X2AEluELVRqDqremgcGO zH4#VmV+%g$qSMk$?!v_bH#O)0>LWCja7N2qxNeA-B9W@A0Z}18Zp^bnOex8Ciy4oS zl(3xvU)PspwCsqbQgu18T5s*ED?5OvuV*QW9YhI4^1I 8%j@$wd{J0oQke>@wN$>b2_O;0!?Y2XTn0*)0=M4 zG1R0JS~caFdS2y&YCT8sTa(`J(^k)!&yQzXa3~6b8&_WWkzng(q?0MFnX&0MW16Rr zNITnWujQ(Ci`T#1 4>oMfaf$Kabd=+8u3tV=4e550;taMFBcbl$8#FL-o z-E{5gcC^-4bupBGF;0CHmJES>fe7D#t!uVYdg@vM7x*}Fq5U +h5CHhC5Mx+HRT;&vU*A@3=O{xh!(DShrkehB;jF1N|)M+eo*O zcm$Koq KTtoZ67r>0 z#IhB$6)Dj99D&KB>cZNY=uk@yARywKY4!4Buaqx>o6oS%>%unhmKnJuQ&Gwjt0%yP z9L9ixU@4_tx&Tl{vE1_yBYcfPR$?{gn!WRjc&0MYYJ4{x#PN?32y{SeWnx>^YOP7M z p4`TU@HWtxgDOX^MM^go9gGDJX?P`f$GK?=?nbZt~1Ux?v zYgNJ?eEXzM+92GTfw{tR{8f;7`ZX$zO<7+1L3&1qkeOfMNGUQZC}_FDz;%M8o@6<+ zJ*E%o>G>XDyg9b#0afFb)1{4k$l^uR#8@R3CR++U%Qvz$9FM}INkJ?R>)l1bcFQsS zL*v-!7IsC}*ivu5I7b}=d9P|Q%hYFrEUk|q(Ih7tsON{rn0`rZZrO7$Zs_*<-OasM zgwE!U2494F&$}-+ka}((f0~Q1PHKQtr1h9R?%)XDMdoSu;ORL;U=!j^X)w-jv*yIT zC=S;6+A<9LfV)Q0GqH3zLrbMIlb~Z_{9zjU;bOwby_EgAk&LeHM!s_ W_ z6yp879RIkjUSGyt0{-goBMNRWE=%goaPgr4GrGz-S;sELQeLDQPQpv3H|^LOTqc9; zEmLs{N|Yo*68yV9T;hR^MzFIHpLYDCnP(UYF2F1-94e0L5*XW|IYZ|p6U~*cOnyfU zCw8eH@D1K&@HUy;WTU;yV4y;6MAVi-=qzJPWAgM|jrc?P>>UkALifX;j~&A@QLw Dg}$4@69Dlgwt46`;m zuXokg7#L+K5G-3f%k?6doj5B^Ry+OXY*@vkr#M`S6daZOe(4lY-xLyQB%3+nm+c?X zsI0rl2^s*kt|w9S^R_Nm2Y+Z~;rFQb<9ev;gql29?E^Ch5%t$V$uKfy3ZdjO>gx%e zBgGFGT!fu?ZtqR_0a;~Q*j-zO-d%M6(Vo8(z&}m;SN crk093vWzMD~hi-hk3?`Nfdfbn;O?SChy z_j&F|ihp?O@1B_V1IGL4`+?OTbi!S>@o)71$5;2^_d}3B@IchRe#HGq &IyBWF}e3OtPXV0}cTT@-o8YSA|~o{~0jP2d4HWica ddLsy zgMxrKgMok`|DDXp!GYnet<8tTR{2gQ
{Njn6@DKe1zh)otuMF^OFV{a;LO0>vu zJTK$V(P&}DoV~~49mfSLtuzDnF)YPy_*|3Y0as^e3i|+gAfB1tNF$}w8Y4T zI%Ha&3ftui`-0Q?k=ePZ8E+3zIe9YO-JX~j@P(lo{CjsogRVAK75*YO^c07~X-Br@ z2Z+LN!c_v~+;xes^k(LNn$V0{Cpn; z8811gj12jpNFKOwi5pEwz)3Nk1#ywa^2TfHW8sS|x-603FbUyEevz_UIn`XP)@&0+ zp(0L3nivC0HqhaG^vOrXGU>l00aoW>Bp@DklLDoQy0NK}3C5TWd#gRUAjG-V(6NMA zEyFD$)=Pyc!$_$?GmW5$gC(VG+->e D_{V?e0ZOC6b%LWOB@-WY3DvsP1pxp zrn^npS&H7(ovi%``cSPp85gO~EY!6&q}BrKzdo7N-M=wBU3h=DcfaQPcxvo>WAu0! z7KSH9k`ktn4XW~#GMh^p0P~R+)71CY%FU;N{Tofdg)MV7c;AGkLwyGuEs}(7ZrSTf zd~!73+;ais11}E#a?}L?-H86TY$j-{9(&8~MbLLvpJpvap?o>XZl>=tDzeY=c2*B= zR_{CXKQ}bTAoT8dT`N@8D#aGlqI}KCI8x6mCTm RArp zr@5_6G=R@*fKH8l4ErijZBw`CKD*F`D>U#>2-{QDCpjH RFuk? KzII-Q>T-ApM+Zr1^)t6?=2nq|););o;p()G} z;JAsj PPEbuz5!H;oQ`858=ep)Jak#G~D^}4CIO+2qBgWPxdOpi_-r+em?sn$XlDA zk@MdP5PuQ4+dEl1TL1tqzeia^02tYO2oMm=XSc@wFWR3F<`*-*(_FM$<3RRd9P>jy z*Df_(O600+o|}WI6@sHnKR9HipR7feQl(jtzr7$pbT#4AwK1UE+aCG>kMst$=K5Ou z-SYdvTI7p~xWM;ECp=h >U=KyCv# Z#%W%MY&Mx2Q} z+F`H6SQSU}gR&^-PWVWnRUXM|a8|8*i-a<^=;wg`Koklc#$51pcar6> #MC!lI)>1H&`qPQP1U z?oxtLKCp40L)zpF?vz_zofChPC%9LS3!jmaFXL6xc4G!nDAn_6<1zUi(GN>3#9je! z!ssGVP(gfxO=#;d6RfO}pccE*ELfyr_*@-N&@xPAT|Ntj1B*_Vy*F1lT-nygNfIZx zUnjsk^@lNk;Lwfm_H?q7RpVH9`g0Sq8D~`0n~`&@ounrqMkCW=5BM8}vlIlGixQ_? ze ;FzOgvf1b>HtTnppa1iUAUV{7QB* z11X>Ygun<3xtZ0HA0ck}<}>q2L9hqN`#5%F3Qgs_1a*YU+zRVCi!atDQ3!BphStf( zqB5v9G0HX;B!Oj0k!9Jj8vK>x)ZL+8aP2eH-Lc=bWXDh_Z#?@AsDj+}6Du@G+mEn5 zwY*WlqnM~gyZ2?+J+V|FOD(x2l;3Iej 10u zxn}TN8(*OzGNOHYdp^6G!Al^pPuIFSZV+{J%1QX}>;CU2yWi3-v5cGqEd5MUTbU0S zJCc1x?xL9b3m@ckA1S}ILMPpRX^j|M34W$h&c5VyyvZ1QB$eHre55RYl(X Y1V5L&n4}Y{4_u(hsHJoOQt< zSW4i)eskAg&hlckapwWSNM>a}d8pC7&K(Wb&B!wea5?Ll^y&yX-oc$=KqY@=2nym- zdh^RC9fs+~$%|ln= zz^FbPvT79eSYxk0>fXa;zcxG!q5Cca>PxJ7ivXn2%5m{W@e;v!IArl2*L;BbzhmRe zzvXjmbg=-~0)G3q)DS;c^M?chNx=K{-TIU4C-KjKcc7(UzsP~!iZtg={QN1Ss>OqH zjhw5>D3inMvI`@$e4nDJk}EVJ<%74d<`3H0V3Z2lc)(=ydJL@5C7V(wtPK1X<5E(( z8hcP?0upa#I!uhz&--a*jm-68At*dYl$3nKaj`_N+%vpOfM}A-!plAMK?aX75w_Q4 z=&kI+a;D_b!pz-~UUvp9If`(lKuX5fgAi$ojCYaeM%aUcd?d_6a$mzM12s@od%%c5 zm%`O%il@yeI@m51qsfT9yjXGsghk~h76-zwu$y|McR{lw0x0D&F(7%fX4phV0I4u8 z;aZE}0w%s} Sywrp @ zjfX+(QFYU*L|b%mCz|5VU&*O1-Z8buqriDqWcfYq-l&}K-XyJsjm8o^y4-J%pL7z@ z)0_Wbhz(lpNL}&0+?plI6U_2GJ3YbLc&pX*blXYQdVlZ1jm%;}G9Ja4eSf*%A5|gn z@X**xacmp#M*KQnLM&Hj9h%@6+J!aLk%EfMu?3?OS;hPnVt^aWP8KY|_cCrXz*j`a z7 ?L C#~@MO{8ze~Vh4aY$6MJuV4 z?Q7S)7S~mvJ$4boe$&jHP;E183wn#0=?gB}OzV0_nDK@|nVN?_&jZa_U+nPMlCw)m zIh0_Gi_TauUIkhy`m&xj=*W>%^qlt^wD `XP5nDcb~mQCBdg-KUrr z w*z1zJ&=lkKpr2 z`6A1Ryq$Uv509@)T&WcVp+TgCfhdwGw4#5;mLOCB1dl*v_|aq$Dr0HQcm6n##esK= zZ~Qu}%PKDJ;JATsBo>bwhfK|I !k@}>_hxa yH94B z$=w5qq}oV$@VEPKBd1}%X{YbwIq*g$Megsuo&zj jvf)+fHPvF{F7fvy4b)iq3~z zElQoQG?Ml3n`Oj=+v>E9N{9EwY00g`YLQ0wf-2%iR1UAI1ZD`2f4FHH0$KA99CJhv z)u>^LR
CBER2-P(m7kEBW+u z5K3Z6@^S_C^dl}9P5?_SCugK|=od>FzfKO{WHHsI?9)986jq&W4gt2-SH*F8Ybs5w zd21)8zRxGoz=|gA6Pw_hv?OB)nw^aMIGiJTbEGj-(A$D9+`|1c(Xv09MDu%2v{s%I zt(OwX^9Re>!pI3=s^a2gX=m>I@{3-UC@0hTl7k1X M3B+jT|n7c6uOBA*5>4|SNjxQo(1s>ca2zJML z6Vw_OG^m=T;<|J<;N3 uvx&tuUd2{8wdK(JhvpfOO>xZfHQggeYm@ z+Yc-UrH&}5`Ej|h06j(J1a@gPY$3cHeE5h_f2B=?0=8LDiJ+T31Z`~Cxpx9?7_q#) zOKXeQ4y|5i+ae))X}de9MIXMnuNIzdUoh;t+}5T{)&uKMrxF%>AYs@#!ERMIL9s$V zrSK`z 50mSW3eGD6)wg1N7x{)X}XVF8vAQPV^!{T-{)h|8D)_a{N>$KNvJ+R!8@q-SGM zJ?B LtR@^%C?y>LoK$3pTdXE><%Vvf5Ot(oj_El#DSoU9mQ)E+Y6h zkZXMb;1lv~I04se1m5tOz#Spt WMK)&r!1!cVEG=6!oHj5* eU?kwgbbh6cz8c?l#UcxQ%k^-KdCZGS1OZfO8`Gyqvt+BCzw?Odu$TsnC< zl0D@;2 C;h>3;1y)X?c9*LD;REf*jyj4E-Q~0HnLZjgk4NZj9`y#C-r5~>uE!Wg zgZ#6BX+uDMBO|Avot>ZWebe2g+ttqA;c!^v;+6YR%iaivS@zB;o!*}RE|MdrcD@-s zdOSIG ?f7KF`oz3PUQ4TS6X>(Lz#vqJm2hL(-G2K5yik7cF04cYrxXB#>B z!q}$ PV^cLQ@jk0eA?nYlKlQuEs@~iov{C zAHNzhWuq(1n?E6W=RyetgjTlNKxgR>VSWzXzi~NPov??EGha6SmPs_awYC+t^Z6F` zUO}|#u%584;q2>U@0(VTe>%HE`fF67=X5?)5d;L`4`+ArumSw^@@d_@xJ6Bjr`WD1 z!}>s^a9QJCk74-&7ZwxC{8uD3l9K+#e3{W9Xyyck=|(lmIXaM-7%&*rrRv7>YBWUK zAaKSdfW-&%bhfhyzX0c>8lO?Qa ^j<2^Fskj;xf>iI=vK@-2~DF_U^<0%zMAoAJg6tD+dBd&X<9s3 zu(cKzEz7(r<>fe$ms?uFi@q~kA)>K$=R4lBqG aO-7UvYfvNrs16N*_J;7qn& zX>u!b(D8`De_{$7ZF$_ByD%86@;i^PUs9j)riMM6-nwDQee!usBQRu!tE-#}$=DYm zrHDL}hER5gb-p}-1H0OrO~tbuIx|pA@nl?Yap0_Ey?g{DkJAE_@R$;UDT&$){VMhl zxo};;zYCS`AI13QezW8m%VInAUUbz}IPolNuu6Y*D@yilUuVBcVzNpnOD>z=&XdeS zCA!H%(IcAXZV@ar)l`uCX?k!AX>!#UXJb-Dw`V>~3<4p(#}Jv@tDe*161HQajwF>1 z!mx=4q(JJEdL&(ZVat~`T99ICtumR9L#d#iIKH!%dT@=OrMW(DqC!-pNv8DR4p 0e9$VCN$nc_mgbsD3j>pJjoSG!tfY+7MkaU~R}p4r0X7Bp zb?QVN9rUbr03)kab7kM89m)AC+un#CSjC*VcMts7b=N7JOh0N-@mF{VL=*rZqI47M zr@>Aell&DP#XDaL$jPwlW0y#@&vC!LS@ c=)dHIkBz>Zt95Nf(Zd2c5%6N7rQ6kRHD(`SQkD}hOzSIw>U2CC+ZBlbE* }Q(>-cm1x86tHKG;zMCfkrgE+DQ&AVcXvI0Eq z1sdY`RuWd3UANBYb$f~-$w&1L*+$KsI hc$a=+I` Mg7|mzE>tsgE8KBt5n8lACDGUK#P*`&F25dL4e;X)_W4LO-ENYt95?3^nW$b;6o* z?cvMT5p1ugqWklCu*E0D2kweaOG$!6hIvu}4JFEJQQ+e}sFEk@crL#Z;Sjmzy&nuG zQb9vuM+=HpjgD0MgiX;r r6DsM%WD``eX zDrrHM`?WNNz#abe6$&91 5KhLbFs`ptGR2(X%Qf+3$? z+~TOj7L(ARKqB6b#G{VBw_a*u|Ef_5l2Z~^a3}WzLgiNQP+H ?E z95KtbJcNWe2SQ&_@}|RfW_sI)Q#12pYC+zQ7a`dz4*Sa=?TrGDJj?BCd>TXxKn6Ok z_`QN{GEWXTw07*lL%K1e6dKNoC*%+`MASa57*SUrsx}O7N^?zr i72rX+wA`H$SHIH}!baKXnvx%|ZyCLS4P?za1X*NL>$ac+env;dJf(pjtw>Wa z0(x|_QA%A|{ZNl8nT+2_0o9O1+yTR?UG8sAC&7@?i+@GvB&^ Hx8>L2hz= zzc-e~)pt*IRk096{9e&UzW4Y*K@rg%QL0|yTaa0Rs+8)twjvxg)M>;CqrOimpLF8| zIx)sj@6(m&9lJt6 R_Wpa4T)n#&Y&821VPxjRbO95^&NId{IYov)p z)${!=8UDr^s2|E w9t*b>)kfm=HSJ zKZn=(BP&K|WPe40a?}?W75T{-?AExyDO1DG8&ssgFD^J9v)yuA2lb2%4Y-H|D+rsP zK!{oh#5>xedG8q>dal8Ru+-fwbe4UGg=8S>_rR4b>WP#Y+8iRV71~clG&&;K`qt%f zx7pq7>>OC`?Ab8uqQ7}=;MdIM#fdH{O-JQF&)hc6*S)`EK-ucyetY+M=gtpqM{-=$ z1)clMWfEzGLEv6gQrLVMIb!PJGZj&Q(`2K9n5BzA^kfR~+He(J2-TW79U4Urx5giu z5FuPF+G3*emDsU`5P64aQV%_G;2UsK6r%m5j~-Yf`h1z+;>JKJ4J$g|Dr3?UbKkKg zl9GZ!y0avn3AXb1p(li=`6r|Vo8FEu?PL=w5Z>E4JuROHjgo4kU^TEQ!k@x@ad|rw z1aH8c(EqSCe}3pE>gZA$DG5wV=kq1xXA}`h6)`^T_c(6~ht!J _ISsGiKUG>|O{; zuA`tSJtn*;7hMI_IoGWys*P4U0Auf6IKly>b6aJF>kwyyW`zTX^M-U} )>k VPh*9L=hGBo zoGiZvJ-({5#5nDSRen&XZodUSK4E%IpuR;Df&dlK_9FjyG~*>olL)
7FHSxwO^7!Ny+v)!l@JDg*o9==#`}i+3EQO-YsbR!xQ-bT`zsEhk_V50c?I> zBJ$#LYkGRV_mX?U{Yk^{LRpqLD&6(G27eTIguK}z=Z=9g@4`sBFK6oGpCMv0cF zb Dc?N=2Dq$5{I(~Z4-@!rUH{`YyJqpYvjRTDnA+Qef-2YKhswIW}LLqc+oI=KoA z9=S`0m6n;&BZ%vUq^U%H+t6)wq
Sx=I1&T#>>=zSo3Dl?7ner4 z!Wm_!pejDnN+WN}RW=`?d$U!zD-eg*)OkV^V#rEXme||Z+H+Zqr1o7Th`F5r+n9UJ zY5KYF*)d3RM?Y`?m7G(Gl9V!n4qvpZRFDrfWu9ehj{$7<0U4KNrg}OeSg7T^MjhG; z&teplT(#^250@xJ)N0RWU?J-pJh>|A;r%ey;ykdZr%X3EYsg{U;owWgS7w~zBv4`v zKb;Q0LPF3-avHIwNy_aW%XGTmJKg%v4CvE|wzK(jxdY+Vull@>sJ)#Fz|O@$)x!bc ztoO6pkvu35#*7|%McL8`)L~U|Fp4%Z`~fH;Uj?7KY-2l5$qGEa%%U*_6Ap;Zkm5PG zX??nHhL?D49Z4ZJwLD#FaG?n*@0q_;YDScldYXli7Oc|o7K&X5yn6ij){03Bsx7dX zV5U@xhR-3k8uWGLDJcH1tj`zHai)>C$W9DqZT4QxybR4U-<98MBXHpJwX4#}(q?I# zd##ZN3aj(kVb+$WM<7S1kS3_Kxa|5X+reO{ZL-g8`*WHGo#X|(ZMwJB9>(NGXbUrA zGB?A@aC|*=!uJu94=rw0i=8{4EJ_i=g_A*19jh%BdKW-WLWv-l^<*kT^uy_zA+Pq< zcoi(EE|nDtH$`hx_Ikj 4p%sOF1=8OX;aAxwT@ zd6y#pE&Eny5Uov! dBj2~^MHYODca|?&5^7uNn$FtKOgQeJ z`#?a!(0`Vkes$&iZkgu^3<3&5{JbS21p)aNJN;tt?~Btf5$D% EzJ@CEk6DJ zpuY#Q7dgMQ^z?Vwe}%Q*`TSnn{EH9Ub5p{ }AtNlY!=G9MUMR{)jf_g4#Hj=&I{vWCM%(Vaj diff --git a/src/public/project_template.xlsx b/src/public/project_template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ff7c332454da6037b3b738f7b870323abe55f2f GIT binary patch literal 6739 zcmZ`;by!sG_8q!mq!~aYgrOt_R6<&Y9FXpA1{hL06p#)PK{_Nwx j9h8JPAVHWWwpuj;JUv70=<+Do%77YEr5P$v8K-+mahVM@=;DhXoUkl zyw@S(x!c4orj0hCaQ}q{f$7qioQdGLUkJuU*p@Mu-9)Ym&*LI8r+Me?J|dgDg*`Uh z;-#QO($qfJO$I* 0kC(*RJc1q zOgvF)x@*1}Gv{(zhNE*N78X+3V5Q>LzSmafcYfnKYV+oEqw2y+?P=u2j!&_q8`0P) zn#v!6pr{rUT1N&z9u)w xUbxv_*_AJOWKs=!GHQ6s zu?FpyLzoiFnmBzfJVVMb>WAB-5_6T)gWWDXL8DJX#>2mVdH_+`iWr}%0vT+47)8rZ z>e2>vl)d7U9oKYku)NE ymHSGm@WKf>$K zb8xpEhWQ*X@39WSyj4xcM#ZY`_%MIdd{9zNn11~rs;ANx$J865I?)_aqHG&nP8I@< zUe*xCxD#m^Gy{RjX@{RDl|oJo@?nF|<~BtQsSv?qH+5O&ozZ>53n9Vt>Sm{ItsMl< z)BjW?n5j(Tmm+mYML@{a!;b53QQTq9wk9x`?XTqgmq4vZfq+uGSGZ*-I&L};)>t@e zfS&FNT5x5xf}Na|p#9Z}I`uOe>`bimFU8~UzCPRRI}r+1Rv5u5&0vE7*AzcB?UH)) zPhD67zf9_iphx2}GmVe9Zwk`zuhKgEFvThgvpV+fOG9`GWfi4E*A5k_hw~qO8|lvP zGjIoMnx8R!pGMojQ!cB(9q!k-m(050*C;u4jA 6NPKcxky~}vx@CChMk>~_b$e98`5ug(;rYR@t;fgeJ!B! z++W 8-_bWbH!G001CTATyY$iZjd+&SmWA_)D8qwN?ib9$?cU8T%|Xj3HQM zsaAqDAB&CQKIdwIyMV1LqIzqcZN8r_ff0-FnFxv{`UWCrkIF-Ea{HBY+Xq2dT3WhD zwb0CSbJc93$z&?(Xw}3FsK9p%5!2NoP1yl$Vr&J>+=oJ@y7*gKqId9Mv@eD! p1Fr@->3L zqOhCdfrc){RgTBJUICekaE|czo+%?Z#K3_xF_0*Q0mKQ__fph-hbzj_p(-ABXvF~s zqv2jZ4OI(X=_k+diOI^dj(lCL9Oz2{vu}%~%Okt_;+ODQU+wMZx(%{~p(@jvpDW z6mH;&8D7XF{h0D{Et!-fc*!Rwl!);o{~OAgCA__#(O(vg7X;9#&8B@?&RpRa7vE}r z3=lPxin;BI&CdGP-*}vWooY@D8~W^*KigqdBOp1Vg+4p6EeQ`$oSs*XM9az&gQ=YoEy&r8{sDX>Mkn1RMqpSP7O-EtQsc4q9n0F zUk|!CvPm9K+>UFY{n9BBUI@X*f0pVWmPvZ_ZCd|~QmFraU)bxHL!K=+1HJ=F^?aNM za}TZBb1AcGDKY`*Zz96Gfg*IfFLlA(iP$pEtVW?0MuSSn_j1`XRonSE$*jJ$qAM{e zNQ?q$wTp-&2t)z{lhPQ2+3!O1ft!gh0?9JJnxWRxNfSAtByyYJd<@RCiL}Z!t5h!} zN%ca>rgR2B)e2fPh}hM_tLHw!^v;zepYA7}4j1T1OasjXnrk2T1jzn4Gxg?vQNOE8 zP?s+wjbhH4jWhbRcx2+>vi 47FRWQZELApnmi88AoRP~ z^<@xKC4**Eo0}$EG<8i!{0dbYi!owxTAXBsw})J_eGUv&4Ln2~V$CTxm-A)Ss- ej136QqzssZb3%I&&c10PFo zjc< -ioY&(7SH~#VIoBt0t%4#yJ0R4L9_>%T9lq+1XbJOtG z>jKtlc9NSxoN+BD>AU;TX76Q#-a-01aR)iJk0_|g8Nvq8l7sa($E-XuP3a39iH$l* zhO1VjbTq3)Ya;~JrAz|-g=14{ZKWZ(Db<`lNu37_%5tc-Bo9oAjldF5fT!5woxKhM zAp0ks{ADVErgJagyqTin*%7%_RYsyldvCz+6i*dsPV1yn8NOnwv0TK$CoEBEO~$I8 zDt(TYSxPGhwyU;EAZ(WCzRlFzafK!6NEQtd94gCc5~F{&P-1D@j~k?_r+({}c$tE6 zqdslKy+-u@ehZDi4;_cA#;2W6i$BSQAFAxv_B71yfgET{_hBV-f-joVYM|{kY>f?p zyZn I)DIA$FeLO)x!jZPeiq%QC|ZW6aX_!TDq)x-gUfhx+R7w z_|^3{7fB^$p2tuq`+4vG C`z<#=CtxkU)|hOxr(2t{e!`wVw^9a>8I+0A%( q@= z5Cq^Qx6G!LP8tI{qCZ1(%*X=mb<*&We3aejZ{W-TB>B_z?~J*Kgnm(gqV4IBBK#ZP zSKOtLfqyhFcY#~TS&=`mc g(X9X3d4!MbH;V=@u_OtDV{bEuPEE>vOylum4N zuR+qfue4!=Lhm3W4eR zi3>KhDsz`qI3Gnb*&c^F;+nkIlK{()WlFKWb!_-FcF kcP6y0L$X#k$D
lsDWC*@a(3d~ pCr8hX#R#BuoWJE+~Jxh5sN^ z!I71Q^8jNq9qRTs-Wgi7b|Xa1-HZ}tYK!G)Igc@f{R}o@qWO=u9@e+yv6jI3JG|T# zyWJk}*OuICc_B`HkGtpC3b7y|O;e}>g8G3ooVv^d46uh8)NsnSXx;MI9~EzCv}S{y zjdPBzL(yMCJ}`)PrLk>$WAJ?_NH4{cF;CSlWdFY4u0V)GZ9Xy8zg44Bna`Zd=sew> zF_E_g3TeM_TwN3}_#l#xUT3*3tyi*UE8E(cQsCH`U2R=myPkTUuQ;C^Sk48WetufK z0h9Hn%Zg5 +FpG*qwioR|8fPStv1R-FUU426wZKte}ppS+pCNv)x_( zSgolxGWLM?%xZanL$n#M+ }+nP=HhJaU @6Mc1RD@)j1o&l0@m+CD z3d!{llcmh2ANFtps*I#PZ6=J9K^!dp4E6{9ye>rmA`Hm=P0DueIi8?2h1x+2!#p0f zdIed^xCA~r)P8ju;}js)R}RvyE-8 )C@*^xx^M31o|% zbWBAj2rbpG3|n=r;m|a7&*l&+6YmfLo(Z>CZF(%1q+(zlWApn@n*a14*XLU)L<8@9 zRKS|l1(}k`mQE% <;kY*IjH1$Aydtd>ZudQ z_%=RVtBbJ2!yjW%R{KIn=E8I&p2_M>Y$x$lA{FQBJ`dF5x@54M-s|DlfO1L?GSRcu z`L7{|*4V6E_MWngF&}7U(Tng(W8`MiA19F*4eb)mlq`QRyAU0$ZZMDAN6&J$PpYuQ z8$)!$WnQ0KSN`z07M(oZQ)G)QxyneNN*LrLHFzI!&F-JzZd|*Y@@8`|MkvN`bB{-E z?Na;aWjv*I7O~Y^yI3#rhR90E!vtsA4Nu>;2BkDy5-!;h2QT$N&d!Ufy?ykGWAmk? zqXE@Q9r2uQHD8VHR;~TD_4ci*j8 3(K{`J-NJPARC}e};5#WK3iw7o$ zMD#ZVf96x{mu%5aWQ{H$bBgHieER2cGZLz(Oezj+x?q3o^Og!9_+yI$=N@E1)2IW! zt3aTZ*)lv@fj51H<@ob+YjFGv0gzu`mRQinjDA82yukNpzi=jH{`lRH32wmP1mt7s z8&&@j{h;HVxZST8(diIz=!A^5WoF#!Q)jQARzmQ3mxbwqxib_`b$B1vJ#4iYR_lT| z{Rm$b(&z3*q$Q7t64^`eWTaos=iEz!61W0}))wTn9mr%d^?C8zZX9c?J3z;JKd3)B zi4#99>Wa&kRCeaKgSPKW *}bpTJXF}vN2$Xk3-nxDubu6+n6^$PWL{E zQmkVjXwmcjp{}GV^pcVBCR?3UpeW6+< 5?b$QUz>H7POLzfE66<%RHgI}`mDT4+#g+x zH9NDx6m&H{M(+Ur4EaQX@bL@e5vv*p0HFLGa=4YbxeJ`@ujQ}#J5^)Kc}fW1XSQ^3 z&DF9bWjp8YRO-q?U%%OhRHh%I--*qfBx7~rs#AQg0x32v1}fv<1`B;g!S+XOygY5P zXhq4%3M_3iBMw2?(<4pT)tE=T?W02&XYkKs7zehqd83i}>fKZe X8XV_4FU~*DGm*Y+BrrW-HBLwqXFx<+Hvl4wHfIFubHu)lz;KJ}i_b`!I9bORLLp zpS~w<#gXN}hd}QM3o+$TQhcFRcH7ag%qasxz6=rJe9C}URcgyH>);>8n0GhLpQXO2 z5+&=1*Txe=dNmIc5bR9m3n5SG)zS*`1JkJQ(pZ)IU}Dz2YO5Dmp2Xd^N${f&HrIF~ zbj@nLA6nC@YF&qgB^tI^Vnn1xZWnHxZMyjlo#k{FQ1dyd4vqNw5V7uHYw~m8L%6+N zH}^g&q}&p;DC|Gr`uN?e0Iohp8h?>@$zLS#VdmWU33z#1vl)5Q%v$lg51=}0xXKmW zT_=$6^At4i7w3`UtL (PWcAs2umArd!;dq*XR%bd@ z*Gw|}0v^6TXaaZOvE^jwEmP!gO0t?{?3ZOdcGb*YI iGN!fl3sxk23Y;Rh*3; zg$T)2OkC}DcirUeGKO(kCg}HqH~C~m>Zri7+qJY{+0 u}N5S6W1DhsH^i zDoO^0f|XRwHDhCW)hsiW15d&Ojui)i9J72^D97yNaSIQs**(b4Uz&mxdYR-+XyWgW za%Jg1H8_S3IPg)pnJ!{raLUK59l)W}bpGyrLaYMM*?xFIDA%b+$*wts`k-xVQPjN@ zZHuQV8Q|&qj;~Ws7KfzW_tqndVro`=THotR7=rsob$XtbOUQ#DSEw1|*GoD#w~oqv z@~R9T$U2Qgei{FxUjMcTe^>2a2BBgE4 lbzuvW5zQi)_VKHJ3H8ipV)-# zAu|WL#O_g6RqazMbGA1gNtV`B7oS&LrB5W3ijpYHqOBmXUrA3aS{||90Dv|NgH} zb-=IXzj*Jr32wW@f5VY`S3nrDY5l`9z74!>rv3(|AUoavwpMTR-1Z!Q^E4v2(Ay5= zZS-wN>o@v6();)~`v3i{+wj{a$!~Zl)?W{C+cLRLaC-v(O<;!{9+4{i$2@+U;r6`w zo8dFz-wgkrK5s*Bj~2h7K%~2e{PBMd8n?l>o78VG8uGQxzrg>|vTn27E}h>j738;B a{%awr$YUS}?O$&w@Bl-|#Id9Jb@zXMG5SdW literal 0 HcmV?d00001 diff --git a/src/原生应用数据模板.xlsx b/src/原生应用数据模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..307fa1d970a84e48568c33a484a9fba1708d69ae GIT binary patch literal 10200 zcma)iWmq2D&Nf!u-QA13I}~?!dvMp{?k)ui6bd{*acP0#?(SBg#ob*$X!qIDv)^-l z>&IyBWF}e3OtPXV0}cTT@-o8YSA|~o{~0jP2d4HWica ddLsy zgMxrKgMok`|DDXp!GYnet<8tTR{2gQ
{Njn6@DKe1zh)otuMF^OFV{a;LO0>vu zJTK$V(P&}DoV~~49mfSLtuzDnF)YPy_*|3Y0as^e3i|+gAfB1tNF$}w8Y4T zI%Ha&3ftui`-0Q?k=ePZ8E+3zIe9YO-JX~j@P(lo{CjsogRVAK75*YO^c07~X-Br@ z2Z+LN!c_v~+;xes^k(LNn$V0{Cpn; z8811gj12jpNFKOwi5pEwz)3Nk1#ywa^2TfHW8sS|x-603FbUyEevz_UIn`XP)@&0+ zp(0L3nivC0HqhaG^vOrXGU>l00aoW>Bp@DklLDoQy0NK}3C5TWd#gRUAjG-V(6NMA zEyFD$)=Pyc!$_$?GmW5$gC(VG+->e D_{V?e0ZOC6b%LWOB@-WY3DvsP1pxp zrn^npS&H7(ovi%``cSPp85gO~EY!6&q}BrKzdo7N-M=wBU3h=DcfaQPcxvo>WAu0! z7KSH9k`ktn4XW~#GMh^p0P~R+)71CY%FU;N{Tofdg)MV7c;AGkLwyGuEs}(7ZrSTf zd~!73+;ais11}E#a?}L?-H86TY$j-{9(&8~MbLLvpJpvap?o>XZl>=tDzeY=c2*B= zR_{CXKQ}bTAoT8dT`N@8D#aGlqI}KCI8x6mCTm RArp zr@5_6G=R@*fKH8l4ErijZBw`CKD*F`D>U#>2-{QDCpjH RFuk? KzII-Q>T-ApM+Zr1^)t6?=2nq|););o;p()G} z;JAsj PPEbuz5!H;oQ`858=ep)Jak#G~D^}4CIO+2qBgWPxdOpi_-r+em?sn$XlDA zk@MdP5PuQ4+dEl1TL1tqzeia^02tYO2oMm=XSc@wFWR3F<`*-*(_FM$<3RRd9P>jy z*Df_(O600+o|}WI6@sHnKR9HipR7feQl(jtzr7$pbT#4AwK1UE+aCG>kMst$=K5Ou z-SYdvTI7p~xWM;ECp=h >U=KyCv# Z#%W%MY&Mx2Q} z+F`H6SQSU}gR&^-PWVWnRUXM|a8|8*i-a<^=;wg`Koklc#$51pcar6> #MC!lI)>1H&`qPQP1U z?oxtLKCp40L)zpF?vz_zofChPC%9LS3!jmaFXL6xc4G!nDAn_6<1zUi(GN>3#9je! z!ssGVP(gfxO=#;d6RfO}pccE*ELfyr_*@-N&@xPAT|Ntj1B*_Vy*F1lT-nygNfIZx zUnjsk^@lNk;Lwfm_H?q7RpVH9`g0Sq8D~`0n~`&@ounrqMkCW=5BM8}vlIlGixQ_? ze ;FzOgvf1b>HtTnppa1iUAUV{7QB* z11X>Ygun<3xtZ0HA0ck}<}>q2L9hqN`#5%F3Qgs_1a*YU+zRVCi!atDQ3!BphStf( zqB5v9G0HX;B!Oj0k!9Jj8vK>x)ZL+8aP2eH-Lc=bWXDh_Z#?@AsDj+}6Du@G+mEn5 zwY*WlqnM~gyZ2?+J+V|FOD(x2l;3Iej 10u zxn}TN8(*OzGNOHYdp^6G!Al^pPuIFSZV+{J%1QX}>;CU2yWi3-v5cGqEd5MUTbU0S zJCc1x?xL9b3m@ckA1S}ILMPpRX^j|M34W$h&c5VyyvZ1QB$eHre55RYl(X Y1V5L&n4}Y{4_u(hsHJoOQt< zSW4i)eskAg&hlckapwWSNM>a}d8pC7&K(Wb&B!wea5?Ll^y&yX-oc$=KqY@=2nym- zdh^RC9fs+~$%|ln= zz^FbPvT79eSYxk0>fXa;zcxG!q5Cca>PxJ7ivXn2%5m{W@e;v!IArl2*L;BbzhmRe zzvXjmbg=-~0)G3q)DS;c^M?chNx=K{-TIU4C-KjKcc7(UzsP~!iZtg={QN1Ss>OqH zjhw5>D3inMvI`@$e4nDJk}EVJ<%74d<`3H0V3Z2lc)(=ydJL@5C7V(wtPK1X<5E(( z8hcP?0upa#I!uhz&--a*jm-68At*dYl$3nKaj`_N+%vpOfM}A-!plAMK?aX75w_Q4 z=&kI+a;D_b!pz-~UUvp9If`(lKuX5fgAi$ojCYaeM%aUcd?d_6a$mzM12s@od%%c5 zm%`O%il@yeI@m51qsfT9yjXGsghk~h76-zwu$y|McR{lw0x0D&F(7%fX4phV0I4u8 z;aZE}0w%s} Sywrp @ zjfX+(QFYU*L|b%mCz|5VU&*O1-Z8buqriDqWcfYq-l&}K-XyJsjm8o^y4-J%pL7z@ z)0_Wbhz(lpNL}&0+?plI6U_2GJ3YbLc&pX*blXYQdVlZ1jm%;}G9Ja4eSf*%A5|gn z@X**xacmp#M*KQnLM&Hj9h%@6+J!aLk%EfMu?3?OS;hPnVt^aWP8KY|_cCrXz*j`a z7 ?L C#~@MO{8ze~Vh4aY$6MJuV4 z?Q7S)7S~mvJ$4boe$&jHP;E183wn#0=?gB}OzV0_nDK@|nVN?_&jZa_U+nPMlCw)m zIh0_Gi_TauUIkhy`m&xj=*W>%^qlt^wD `XP5nDcb~mQCBdg-KUrr z w*z1zJ&=lkKpr2 z`6A1Ryq$Uv509@)T&WcVp+TgCfhdwGw4#5;mLOCB1dl*v_|aq$Dr0HQcm6n##esK= zZ~Qu}%PKDJ;JATsBo>bwhfK|I !k@}>_hxa yH94B z$=w5qq}oV$@VEPKBd1}%X{YbwIq*g$Megsuo&zj jvf)+fHPvF{F7fvy4b)iq3~z zElQoQG?Ml3n`Oj=+v>E9N{9EwY00g`YLQ0wf-2%iR1UAI1ZD`2f4FHH0$KA99CJhv z)u>^LR
CBER2-P(m7kEBW+u z5K3Z6@^S_C^dl}9P5?_SCugK|=od>FzfKO{WHHsI?9)986jq&W4gt2-SH*F8Ybs5w zd21)8zRxGoz=|gA6Pw_hv?OB)nw^aMIGiJTbEGj-(A$D9+`|1c(Xv09MDu%2v{s%I zt(OwX^9Re>!pI3=s^a2gX=m>I@{3-UC@0hTl7k1X M3B+jT|n7c6uOBA*5>4|SNjxQo(1s>ca2zJML z6Vw_OG^m=T;<|J<;N3 uvx&tuUd2{8wdK(JhvpfOO>xZfHQggeYm@ z+Yc-UrH&}5`Ej|h06j(J1a@gPY$3cHeE5h_f2B=?0=8LDiJ+T31Z`~Cxpx9?7_q#) zOKXeQ4y|5i+ae))X}de9MIXMnuNIzdUoh;t+}5T{)&uKMrxF%>AYs@#!ERMIL9s$V zrSK`z 50mSW3eGD6)wg1N7x{)X}XVF8vAQPV^!{T-{)h|8D)_a{N>$KNvJ+R!8@q-SGM zJ?B LtR@^%C?y>LoK$3pTdXE><%Vvf5Ot(oj_El#DSoU9mQ)E+Y6h zkZXMb;1lv~I04se1m5tOz#Spt WMK)&r!1!cVEG=6!oHj5* eU?kwgbbh6cz8c?l#UcxQ%k^-KdCZGS1OZfO8`Gyqvt+BCzw?Odu$TsnC< zl0D@;2 C;h>3;1y)X?c9*LD;REf*jyj4E-Q~0HnLZjgk4NZj9`y#C-r5~>uE!Wg zgZ#6BX+uDMBO|Avot>ZWebe2g+ttqA;c!^v;+6YR%iaivS@zB;o!*}RE|MdrcD@-s zdOSIG ?f7KF`oz3PUQ4TS6X>(Lz#vqJm2hL(-G2K5yik7cF04cYrxXB#>B z!q}$ PV^cLQ@jk0eA?nYlKlQuEs@~iov{C zAHNzhWuq(1n?E6W=RyetgjTlNKxgR>VSWzXzi~NPov??EGha6SmPs_awYC+t^Z6F` zUO}|#u%584;q2>U@0(VTe>%HE`fF67=X5?)5d;L`4`+ArumSw^@@d_@xJ6Bjr`WD1 z!}>s^a9QJCk74-&7ZwxC{8uD3l9K+#e3{W9Xyyck=|(lmIXaM-7%&*rrRv7>YBWUK zAaKSdfW-&%bhfhyzX0c>8lO?Qa ^j<2^Fskj;xf>iI=vK@-2~DF_U^<0%zMAoAJg6tD+dBd&X<9s3 zu(cKzEz7(r<>fe$ms?uFi@q~kA)>K$=R4lBqG aO-7UvYfvNrs16N*_J;7qn& zX>u!b(D8`De_{$7ZF$_ByD%86@;i^PUs9j)riMM6-nwDQee!usBQRu!tE-#}$=DYm zrHDL}hER5gb-p}-1H0OrO~tbuIx|pA@nl?Yap0_Ey?g{DkJAE_@R$;UDT&$){VMhl zxo};;zYCS`AI13QezW8m%VInAUUbz}IPolNuu6Y*D@yilUuVBcVzNpnOD>z=&XdeS zCA!H%(IcAXZV@ar)l`uCX?k!AX>!#UXJb-Dw`V>~3<4p(#}Jv@tDe*161HQajwF>1 z!mx=4q(JJEdL&(ZVat~`T99ICtumR9L#d#iIKH!%dT@=OrMW(DqC!-pNv8DR4p 0e9$VCN$nc_mgbsD3j>pJjoSG!tfY+7MkaU~R}p4r0X7Bp zb?QVN9rUbr03)kab7kM89m)AC+un#CSjC*VcMts7b=N7JOh0N-@mF{VL=*rZqI47M zr@>Aell&DP#XDaL$jPwlW0y#@&vC!LS@ c=)dHIkBz>Zt95Nf(Zd2c5%6N7rQ6kRHD(`SQkD}hOzSIw>U2CC+ZBlbE* }Q(>-cm1x86tHKG;zMCfkrgE+DQ&AVcXvI0Eq z1sdY`RuWd3UANBYb$f~-$w&1L*+$KsI hc$a=+I` Mg7|mzE>tsgE8KBt5n8lACDGUK#P*`&F25dL4e;X)_W4LO-ENYt95?3^nW$b;6o* z?cvMT5p1ugqWklCu*E0D2kweaOG$!6hIvu}4JFEJQQ+e}sFEk@crL#Z;Sjmzy&nuG zQb9vuM+=HpjgD0MgiX;r r6DsM%WD``eX zDrrHM`?WNNz#abe6$&91 5KhLbFs`ptGR2(X%Qf+3$? z+~TOj7L(ARKqB6b#G{VBw_a*u|Ef_5l2Z~^a3}WzLgiNQP+H ?E z95KtbJcNWe2SQ&_@}|RfW_sI)Q#12pYC+zQ7a`dz4*Sa=?TrGDJj?BCd>TXxKn6Ok z_`QN{GEWXTw07*lL%K1e6dKNoC*%+`MASa57*SUrsx}O7N^?zr i72rX+wA`H$SHIH}!baKXnvx%|ZyCLS4P?za1X*NL>$ac+env;dJf(pjtw>Wa z0(x|_QA%A|{ZNl8nT+2_0o9O1+yTR?UG8sAC&7@?i+@GvB&^ Hx8>L2hz= zzc-e~)pt*IRk096{9e&UzW4Y*K@rg%QL0|yTaa0Rs+8)twjvxg)M>;CqrOimpLF8| zIx)sj@6(m&9lJt6 R_Wpa4T)n#&Y&821VPxjRbO95^&NId{IYov)p z)${!=8UDr^s2|E w9t*b>)kfm=HSJ zKZn=(BP&K|WPe40a?}?W75T{-?AExyDO1DG8&ssgFD^J9v)yuA2lb2%4Y-H|D+rsP zK!{oh#5>xedG8q>dal8Ru+-fwbe4UGg=8S>_rR4b>WP#Y+8iRV71~clG&&;K`qt%f zx7pq7>>OC`?Ab8uqQ7}=;MdIM#fdH{O-JQF&)hc6*S)`EK-ucyetY+M=gtpqM{-=$ z1)clMWfEzGLEv6gQrLVMIb!PJGZj&Q(`2K9n5BzA^kfR~+He(J2-TW79U4Urx5giu z5FuPF+G3*emDsU`5P64aQV%_G;2UsK6r%m5j~-Yf`h1z+;>JKJ4J$g|Dr3?UbKkKg zl9GZ!y0avn3AXb1p(li=`6r|Vo8FEu?PL=w5Z>E4JuROHjgo4kU^TEQ!k@x@ad|rw z1aH8c(EqSCe}3pE>gZA$DG5wV=kq1xXA}`h6)`^T_c(6~ht!J _ISsGiKUG>|O{; zuA`tSJtn*;7hMI_IoGWys*P4U0Auf6IKly>b6aJF>kwyyW`zTX^M-U} )>k VPh*9L=hGBo zoGiZvJ-({5#5nDSRen&XZodUSK4E%IpuR;Df&dlK_9FjyG~*>olL)
7FHSxwO^7!Ny+v)!l@JDg*o9==#`}i+3EQO-YsbR!xQ-bT`zsEhk_V50c?I> zBJ$#LYkGRV_mX?U{Yk^{LRpqLD&6(G27eTIguK}z=Z=9g@4`sBFK6oGpCMv0cF zb Dc?N=2Dq$5{I(~Z4-@!rUH{`YyJqpYvjRTDnA+Qef-2YKhswIW}LLqc+oI=KoA z9=S`0m6n;&BZ%vUq^U%H+t6)wq
Sx=I1&T#>>=zSo3Dl?7ner4 z!Wm_!pejDnN+WN}RW=`?d$U!zD-eg*)OkV^V#rEXme||Z+H+Zqr1o7Th`F5r+n9UJ zY5KYF*)d3RM?Y`?m7G(Gl9V!n4qvpZRFDrfWu9ehj{$7<0U4KNrg}OeSg7T^MjhG; z&teplT(#^250@xJ)N0RWU?J-pJh>|A;r%ey;ykdZr%X3EYsg{U;owWgS7w~zBv4`v zKb;Q0LPF3-avHIwNy_aW%XGTmJKg%v4CvE|wzK(jxdY+Vull@>sJ)#Fz|O@$)x!bc ztoO6pkvu35#*7|%McL8`)L~U|Fp4%Z`~fH;Uj?7KY-2l5$qGEa%%U*_6Ap;Zkm5PG zX??nHhL?D49Z4ZJwLD#FaG?n*@0q_;YDScldYXli7Oc|o7K&X5yn6ij){03Bsx7dX zV5U@xhR-3k8uWGLDJcH1tj`zHai)>C$W9DqZT4QxybR4U-<98MBXHpJwX4#}(q?I# zd##ZN3aj(kVb+$WM<7S1kS3_Kxa|5X+reO{ZL-g8`*WHGo#X|(ZMwJB9>(NGXbUrA zGB?A@aC|*=!uJu94=rw0i=8{4EJ_i=g_A*19jh%BdKW-WLWv-l^<*kT^uy_zA+Pq< zcoi(EE|nDtH$`hx_Ikj 4p%sOF1=8OX;aAxwT@ zd6y#pE&Eny5Uov! dBj2~^MHYODca|?&5^7uNn$FtKOgQeJ z`#?a!(0`Vkes$&iZkgu^3<3&5{JbS21p)aNJN;tt?~Btf5$D% EzJ@CEk6DJ zpuY#Q7dgMQ^z?Vwe}%Q*`TSnn{EH9Ub5p{ }AtNlY!=G9MUMR{)jf_g4#Hj=&I{vWCM%(Vaj literal 0 HcmV?d00001