From 241a6f95c648a3e5ee0f8ee9be22388063b12b33 Mon Sep 17 00:00:00 2001 From: Kenneth <2448698686@qq.com> Date: Thu, 24 Oct 2024 19:12:13 +0800 Subject: [PATCH] test --- TheBattleCar/.idea/.gitignore | 3 + TheBattleCar/.idea/TheBattleCar.iml | 8 ++ .../inspectionProfiles/profiles_settings.xml | 6 + TheBattleCar/.idea/misc.xml | 7 + TheBattleCar/.idea/modules.xml | 8 ++ TheBattleCar/app.py | 131 ++++++++++++++++++ TheBattleCar/templates/attacker.html | 10 ++ TheBattleCar/templates/commander.html | 14 ++ TheBattleCar/templates/login.html | 24 ++++ TheBattleCar/templates/scout.html | 13 ++ TheBattleCar/templates/send_message.html | 18 +++ ...2f45c49a8e4ff7a699661a__20241015171033.png | Bin 0 -> 21676 bytes 12 files changed, 242 insertions(+) create mode 100644 TheBattleCar/.idea/.gitignore create mode 100644 TheBattleCar/.idea/TheBattleCar.iml create mode 100644 TheBattleCar/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 TheBattleCar/.idea/misc.xml create mode 100644 TheBattleCar/.idea/modules.xml create mode 100644 TheBattleCar/app.py create mode 100644 TheBattleCar/templates/attacker.html create mode 100644 TheBattleCar/templates/commander.html create mode 100644 TheBattleCar/templates/login.html create mode 100644 TheBattleCar/templates/scout.html create mode 100644 TheBattleCar/templates/send_message.html create mode 100644 TheBattleCar/uploads/2d7d87c11e2f45c49a8e4ff7a699661a__20241015171033.png diff --git a/TheBattleCar/.idea/.gitignore b/TheBattleCar/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/TheBattleCar/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/TheBattleCar/.idea/TheBattleCar.iml b/TheBattleCar/.idea/TheBattleCar.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/TheBattleCar/.idea/TheBattleCar.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/TheBattleCar/.idea/inspectionProfiles/profiles_settings.xml b/TheBattleCar/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/TheBattleCar/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/TheBattleCar/.idea/misc.xml b/TheBattleCar/.idea/misc.xml new file mode 100644 index 0000000..db8786c --- /dev/null +++ b/TheBattleCar/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/TheBattleCar/.idea/modules.xml b/TheBattleCar/.idea/modules.xml new file mode 100644 index 0000000..7e19b66 --- /dev/null +++ b/TheBattleCar/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/TheBattleCar/app.py b/TheBattleCar/app.py new file mode 100644 index 0000000..e853682 --- /dev/null +++ b/TheBattleCar/app.py @@ -0,0 +1,131 @@ +from flask import Flask, render_template, request, redirect, url_for, session +from flask import Flask, request, jsonify, send_from_directory +import os + +app = Flask(__name__) +app.secret_key = 'your_secret_key' # 用于会话管理,请替换为更安全的密钥 +app.config['UPLOAD_FOLDER'] = 'uploads' # 设置上传文件存储目录 +os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # 确保目录存在 + +# EXTERNAL_SCOUT_URL = 'http://192.168.78.178:5000/' # 外部侦查者页面URL + +# 处理文件上传 +@app.route('/upload', methods=['POST']) +def upload_file(): + if 'file' not in request.files: + return jsonify({'message': 'No file part'}), 400 + file = request.files['file'] + if file.filename == '': + return jsonify({'message': 'No selected file'}), 400 + if file: + filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) + file.save(filepath) + return jsonify({'message': 'File uploaded successfully', 'filepath': filepath}), 201 + + # 提供上传文件的访问 + + +@app.route('/uploads/') +def uploaded_file(filename): + return send_from_directory(app.config['UPLOAD_FOLDER'], filename) + +# 登录页面 +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + # 在这里添加你的认证逻辑(例如,从数据库验证用户名和密码) + # 假设我们总是接受任何用户名和密码为'admin'的登录 + if username == 'admin' and password == 'admin': + role = request.form['role'] + session['username'] = username + session['role'] = role + if role == '侦查者': + return redirect(url_for('scout')) + elif role == '指挥者': + return redirect(url_for('commander')) + elif role == '攻击者': + return redirect(url_for('attacker')) + else: + return "Invalid credentials. Please try again." + return render_template('login.html') + + +# 侦查者页面 +@app.route('/scout') +def scout(): + if 'username' not in session or session['role'] != '侦查者': + return redirect(url_for('login')) + return render_template('scout.html') + + +# 指挥者页面 +@app.route('/commander') +def commander(): + if 'username' not in session or session['role'] != '指挥者': + return redirect(url_for('login')) + return render_template('commander.html') + + +# 攻击者页面 +@app.route('/attacker') +def attacker(): + if 'username' not in session or session['role'] != '攻击者': + return redirect(url_for('login')) + return render_template('attacker.html') + + +# 退出登录(清除会话) +@app.route('/logout') +def logout(): + session.pop('username', None) + session.pop('role', None) + return redirect(url_for('login')) + + +from werkzeug.utils import secure_filename +import uuid + +ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'} + + +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + + +@app.route('/send_message', methods=['GET', 'POST']) +def send_message(): + if request.method == 'POST': + # 处理照片上传 + if 'photo' in request.files: + file = request.files['photo'] + if file.filename == '': + return "No selected file", 400 + if file and allowed_file(file.filename): + filename = secure_filename(f"{uuid.uuid4().hex}_{file.filename}") + filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) + file.save(filepath) + photo_url = url_for('uploaded_file', filename=filename, _external=True) + else: + return "Allowed file types are png, jpg, jpeg, gif", 400 + else: + photo_url = None + + # 处理消息文本上传 + message = request.form.get('message') + if not message: + return "No message provided", 400 + + # 在这里处理消息和照片的存储或进一步处理 + # 例如,将消息和照片URL存储到数据库 + + # 返回成功响应或重定向 + return f"Message and photo (if uploaded) have been received. Message: {message}\nPhoto URL: {photo_url if photo_url else 'N/A'}" + + # 如果是GET请求,渲染发送消息的表单 + return render_template('send_message.html') + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=8000) \ No newline at end of file diff --git a/TheBattleCar/templates/attacker.html b/TheBattleCar/templates/attacker.html new file mode 100644 index 0000000..b0e05c2 --- /dev/null +++ b/TheBattleCar/templates/attacker.html @@ -0,0 +1,10 @@ + + + + 攻击者界面 + + +

攻击者界面

+

功能待实现

+ + \ No newline at end of file diff --git a/TheBattleCar/templates/commander.html b/TheBattleCar/templates/commander.html new file mode 100644 index 0000000..207b6a4 --- /dev/null +++ b/TheBattleCar/templates/commander.html @@ -0,0 +1,14 @@ + + + + 指挥者界面 + + +

指挥者查看照片

+ + + \ No newline at end of file diff --git a/TheBattleCar/templates/login.html b/TheBattleCar/templates/login.html new file mode 100644 index 0000000..719011d --- /dev/null +++ b/TheBattleCar/templates/login.html @@ -0,0 +1,24 @@ + + + + + + Login + + +

Login

+
+ +
+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/TheBattleCar/templates/scout.html b/TheBattleCar/templates/scout.html new file mode 100644 index 0000000..0bc330f --- /dev/null +++ b/TheBattleCar/templates/scout.html @@ -0,0 +1,13 @@ + + + + + + Scout Page + + +

Scout Page

+ + + + \ No newline at end of file diff --git a/TheBattleCar/templates/send_message.html b/TheBattleCar/templates/send_message.html new file mode 100644 index 0000000..7931699 --- /dev/null +++ b/TheBattleCar/templates/send_message.html @@ -0,0 +1,18 @@ + + + + + + Send Message + + +

Send Message

+
+ +

+ +

+ +
+ + \ No newline at end of file diff --git a/TheBattleCar/uploads/2d7d87c11e2f45c49a8e4ff7a699661a__20241015171033.png b/TheBattleCar/uploads/2d7d87c11e2f45c49a8e4ff7a699661a__20241015171033.png new file mode 100644 index 0000000000000000000000000000000000000000..c791c49fdfa94f8cc452cce42831885d01ea5d3b GIT binary patch literal 21676 zcmdsfdtB1@{y(<0TPthb%o}U1b+)qRoVQfiR?{^rw^Pkh!y2X;A~F*30<=qMB~WW+ zrODZx*(#+pKoiAEp^M7O5&@O;)1*QqLN0Zr-Dc)o%{p(d~RWcgoFsONa#U+POQfG2m}cK-nU=SKN!)JLeQ zcJF)O!}BR0uKEy#I?I_fx_Kh_{Bp)88z?B$tog`4w-tYV^8pIA_QMs+KU_=0>3U>) zlQtB0WjWuLV9)HEKN>yh>tKmTZr`yFHbvuR{1EvWbBAY6$HK3tzOZ@fI|ma!GH;!Q zPnhw8|9c*-B3e_=iOo3Htbm#;%C)zCB6Rp=1YWLtS$3eKqIXS2sU~vy7fB_#^Dr-B znj19TUgUsP1|ljij~>(~z0O-Y)4=Hb41f_F@Jrc<(jJ zdfUwY)1eEIS>L|cX1&SZU>go3wC|yTt*gyoLYJK(9ay-+x!qzjX+LIyg@cE?KM$u; zSIvFgYQx&aBk@cv$uGxr|JKIa$(rP9!YdmnUoXE8lN1lZ@CtW)(5l`p-cJPtVBB8)|1yQVR-5M54FEs)t4v#6|Ii!&I*sLk3rq8 zhI5?`=0pEYvbnwseFN$by@hQ3&PlW9-Z>C^l;&%_1I83T>ZxBAnbvK&!F$D0J#e}p zwl<^xU@4HJ&Ns&;Wz(MVrQY$js{z=doBd^ zL%uv(tB#M;`s5_kY#*h|I~O@bkSxM6T9b*|5jeiC#{zJdJaQpMkeFmYe7(JGQKf~D zpT;`|MlX1MY_eHwT14_%%@U$eMb3S{%I7^BWH*|LPq!J0!MR`OkeS}m8Z$n;%BQ$3 znAm`Z93eKNd?k?C`0=d?ixnl~6Z95+*?A6LQ%u*!zlC$#;rIJ!YG8vP?o?!EdkA+! z+$3T|ePv`=mJS?*GZS40E1_1w6|sf4x@!eLqZK)n%Uh);VMAK_q$it1Tkm9g>ljlu zXf09ysEa_x!=*z)-F?9ZPnZlF6nV$70%EK%{`DuuQfW9KKi;ORCraS*k+gI!wY^d0 zHbc?6)h->X-X_YK;m6|so zh4EW7LjQK&!N=`~#ugIcetpuX1ziy`(}lohf8c zjJBd9Jwy2xJyz06>)l(#!}O+mD#IBH-N!uI{HX&tlW>ZMO55a1E4f# zjO$a>nm?z}zfwXaYsQ9^?q{&wlB)+9G^b-IC||1bFdt~KB9-Gs=Yx?R zozu#3YU)vgQTFWtKb@JF-Yu;azv;Vh2pfNG_=1u-Ia>ZJH=s8vAj~%fi$Q&`WK8P_ zJ87&FdlS#Hm=*7zt1YBeezW~m>9S>mUHT8b(VPy>JAcD3#>`>E{$D`aIgqKV0K;D< zP65*Pcr4wkD|1E*&L8Gvu=p=2tTTc-tM5+2he-VMzq@_*!XY0tXL?`V_Q_{^s=_*J zoFQwNt*=TMOMnUf>$nh5MY}K$j=prkoSK|~e|~e=TNioGTYc;I;!ln^7y*9aHT;#C z4gSLIlgT)&M0)xga|xn@-Wpd^1wSYZp7N>tvsQjkdi58)--P!Y57qj}&GeI=hWc}i zDZreqKj1P8i@QDh0~dX)KGYqIQ!NlGl%c>c+qCLgS&DyUb80g3jxEVTdmn7) z_y?3)`hPpcvCPp341Jem^}I&MKsqKJFJ_rNqBYOUGa3nZIiz{OdYAPqKsD8EL43B1 zzBj(hd-&;e*>l_{q;xuO`1iF1*7Hx&1^=L@*uHx;n)+apTIUse42@`>*bq4bcfA9CODXv1(e^X z@*SpZ+u+Dhn<}dwIB`E~n{3t%lQKpSA(iJod~T)yI9}%8AI-}%nS$%x(TrZ!JVvb~ zM-lP6d8MOSSO2NuRj^+grULlj0sg>|md`Rfave!bi6cV-G& zWN|yL6(JkcdjNgnj9>puf%NgCXK7!w5x`FLHqb`i+4x+i=4n~dLMeVtzgv4s$bt1&2b z8d5q=-v|%cV+M9)KB$>>`@HMCMiros8ZHGe3Iuhu=e$YZ*`XaKkHj*C)?>Xpmf%(u zjU3*bpB>YS@2~OM6d{R8tB%Rsk!b)O$U4Sxw+cdU7P2P zo}O4cZdkV@5Yfx!I$N6fJFIMlC=G>Sr%W zEGN+X3}^cJvw0WNChv%GY5LQum-w;A{frT6p+cCrRN|Ra$zVlXV*NbJ`k2Bjtx$Z^O$${dk zQhlYxaKeOImouY%x4O;)%2Vm}3smjqq5)}LIgF2Fq6x3#iirL=_c@B}hH|`wKmK$9 zuBdWuNVR5dVAkEcvN`%PB{q53a)Apl3=J@uznz5m&L4XODqZcdHlOMq^Qr4-p}s3f zLdmgr%0ChmwW~9)A6VBt_eJO z(!p3tL%FG(|0@q&-GEHW^Ba8L>Mi(iK@Zz#9}KHX#3mK1fn$Lz(#ImlFZc7ag48lU z)}VEn**@X{nNM)hQPkGB0{IsC44xf?$h8soHPZb)HAru9P-d!_OPUw2=liE~Y$N0( z=>xC+nYZ&?78=WczZx&C!w(dh?bp#Y=NN-#q@Q?}oIWosr9{g&F$$$?wbFFb*R+j- za+;5nwh}9;b95a?!`=R>$BW%>it#aCs>f1OlcebC#5RsyF&a{h?|igviEX-o(tx29 zBXpUqm|!@cw#u-ym#u{vfi@@yQr2?YIP=1GJvmG8egT(Ygt|}obVzD@z2s6j%`vuW zRdaDtco|E>0xy}X0>ODv<$N6eoGy)?%2elh$R$WiB4e3oLW#@$vQ->n&@2SvuojLB zLMua(9sBBnn3pfNA6p?>Je^lJSdv!NhJLS_BL5T!L$oMab*uZvU5=K6O&WWSKpHNY z0@KuaSt2S}hVIXqE5$uw)W)pK{+hRdy!+vbO7ZYrjSWBL^JA33JpDd=Cn8&GG74pt zLAJUeZ2LN+qMJUDo9|6wjmrhllECN4Q2ZG#{VA5*ivCvWd_CL|)u&imBz4YUAlfIB zV$4DO?d_9!^L@V%nfn6|SGqm;1vw!zc^X>HLnNTZDW6s6?~4In`_^MZHC$+y%d>JIfES>5znmoYDxuTV@X^%(-vF>5f+rn z&-x09Lq8rf@@FKHycC3i1YY@6@Dir`#%fCAA&I<&&OLC8o62Nv2$3*anfEA5+VzRD z&7;cx!-Jkf^BNZzDE1O&V#%j@i4y%xR2?$E>AYLT604h0%QP&}cb-D;3t+s|!f*E4 zL0wgmx9qdsyt6s@A9gx_X_12+JZ8%zf2uGh<>?A#T8anS=*=sq6%Oi)2Xlu%J1Gxf zB10OKjW)`z(3!{G;lLJ{<3C6KLj=&QL-o$Eq=m^M5~}MY^5SVc$ZKaW8a8mdBRZ|e zUmxh_?h;PZ>KGrL{&-lj6|r!` z!2YoNoh}kVmrohJ&4R68+hh)o(^z9?!;XAXcZ^7}m2$RGzv`m(x%!9!T0%l@9#_d1 zX!nd9j?YEjuT9uuu;D<-AB6XaM23xr5lv5L{;}g=V;8>ifT%( zg7V%FsYJDaO_CptD5@dcMTZSQB_Y8B{eolD6W4T`6W1{FidEm#_L}JvHf`uEIe3aK zXEZVc{C(ACJN`@TK#e_}KxB@_+0b_m(hAKnXYs?NsS^H6koi(0bI_3k86;=HOe#i= zCz|OTQiAnnsKa|`VXmW)$8m(tNnDm@k*TRGoulmQ>^d1GNhEggXY|`_*Kx(LydyEI zm4z3{%H`HN$E!s+Su0FgpR<}RzlAN5*gY*pjmHh43T%ZPGVhjdb-tb=k_mbfmvu{^ z!g*Eo$DFxh8(fcfw5#FVti%r5s`$LcQj;Vzg@DR?2P93_NeQj2d2AmJ$qu{QyJT#l z#mh)!-fR1$oOzn;HzbZo?oL5a?RWyGM=hPp3B_eCu`i7wj>cKL-%gxeaVUZ*(X29y z*u41zaeqse4oiLQ-oUr2Z7e7dbc$D>l;4=k+gUDG&DC%}GHWi7fX(;;4qX(nK&m}i zdO$(ge2?JCJrFHF^K--y;@&dM*3F__gG-Cean^4WoqZddc6I4_%zLAOVREha?bi@% zsRY)tn1Jnu&e{{F6$T3p%T8b`8g^f1e8A@muna$_xL~DoJroCAHmt8^UkuL9`=v*= zRW#H)S3X)Uu)XzLi9~bbXcBLyA$zv$N5kRcOh*gVoL4WS{LJ(zBp7ICXIZ?ohBy*O zl^DZBZywETyM9BvB~|x>O{<}3a*&ha7`Z9ScLYvX87#Txl0lAERtfeZd$zPWuv=5- zp=pMaI0rW_^TsmVKk~Mx$REh`0;cU=BAq&P!?LZd8k>ds3ixn=6Zd6=A6NDELoQZt;(-Zw)S8~QU{Nl@Hcc4Bmbv@!VAXzUrt(cg$~hIbv_%cpKU z8_^pTo{UwJZ)Hm3>bZ1MXUyD2EG)mM>Cf%J7IprdQ#vfGcdTg-sfys>hk4SFx7ft8 z${tPVYnF8lhx#2~`bCE0Mx%}@36y*M8Af=krjU2mLx)kqB@lncqZu;?AY>JC#^PbWa#vzjfm zz4FQLE<=vbZn<@Cc2zK|=q&~cZ96^?-OT0FHd61)TYhQr640JI->EIuxzzi796^)k zm%Xt&W^_)AO!v-1BqiXz7|89dX2N>Amospw#{IUHG7Wf254_nSVX=QBUa3>J?vZcN zFu?D;Q?yw3|6#YfF5Hmf!yGWAa4VtA3w`Mz(8P)I4p#N?n=k!a;lN@XVrzRs(n%zJ z@771~h+_*iD=RH*NheerWD6!5p8I(W8%f@B&tcOR;QPDinlzK=q4rQ|V4+laU9I73 zo!-g<{f0b!rz7tKlCwG|e;32>B0F^=f}E)a-;wipco@T+bt_bphe=QdE;?2-02HE_ z<-oXE6F}I?1u=^uMRx#1UbDU5>0NFi-5>cu{+j#SxLkv0YbVOO7Kv@IZYz+(qQxOU z&^8W$pa+21hzn4yL^7net6ec12o;|hWSZ}gjL`P!(T%)-MK?3eA zMHTrW=ugBv!z=DFqKkrp*d1C|x}kJGZD;-h+~#;7HkmHOMfQp4;-%?41PZ!+-Zl7? zH*tM^yJHa;CZosYCI`I6d+?xnVcK5W#M*QuaMRA&9ZRDD@CYO&5`@6y_nQiv7lwxe z;0C0gtKwY{KxF?+-%{F6A_#Eg|G{wn)3wyj8F7Ls8lBlYi3Vr(|G*5M*@FIgNwSDC zfJW%R>8&6%r8W~5;Rp)PGng1|gxUpq-!&ZA?z7|C|EnVOhYdg|1%Gy?`7zQ*-{eAP zq-drxf^Hs#x&Z)0#fq5XT*Jd#0G6{%2cGq+7Q(5v7Q$jgvkY=34xD04=>-5O-QHv2 zwz`dlMDhR+rbq6Y$rT6TWk1nCYaVvWdX6FRXan1=HgD`47II(71})^yWp9XkP}*R} zx7~xme?dL^df55CqIet41NKTB`#Rj48U6A&bXK~;{-ZbPIF!#1zLgONW8d5pe2G!- z*2#n4`s;Ut067`G`fk%q7o9}*bHfqyaZlgXPEP`N0HvLI*7LeeB{tS)2>~2;dkp_i zxq%^@7G8Rg(a*nyOL6r?@ApJH$sFtCFPO>0FSrm4+jUJQrxFCXm=6UA9ZFNLyVQmJW%WN!2tga91ff$dO|%yuNWMo zSEx@f>Pck!kXL%w>q{zemu`esT?ov(7q}KAd(P+pbictEIE+AWdQvp)KO}7jIFQ7UB$L8ub2q6iL9mZz}*?-~1d;0u`Gyw4AyK?^L%rsTH@L>6V zA9srhMAkiRZQAXVQ8bzh(mUN6o5-xOKj;J5qFV~vFG=&l(zo9wuL7^qWh(5P-D4lwS)I9gYoOW8?pA2a;yj z3-Cj~(jtoRA3gXLFNIFRj6wor3sL$%)$Q^#k+qIq9)oE?(r;}hgC_+ph>3$r7>({d z>-QR=z-f@#Y#s`HjmM#tm)HH9( zUBdC5o9cZ`##?58f`Y+IjQ4~?ACybvuc0z9r- zyJfeW*3jI2*03~PuhI)S8?KpiZ^Z?=R{$EvrYhGV^KJ4d9!o}Zg0JR_HelYufwb`z zmVBjC+iWlVyvwX23WCznHHX^#h_Pip&pr9u4`vnn_XiEwVgTqAEF-HpW_0q^p(SjV zJgQa5l<{@whsogpY=!cIs-bF_+}I<~c@V{1wC46&kSuIlR8F=5t~h{rpiM`)6OCQ+YtP+RpTau!qJD ze=cYw6-qA^jc?S!TM~pHHs%8T;iS9hWdA$e57Yt7#Gxft=M`^D00{HV-w)OXNk#;R z+BjfNb%Cdq82$9Jc3l)!j_!z$tLLmyqbq)MDqcaUT(~9f z3~l;s(txdQu+7p~w=MT3r@XGU(e##5Y^yq3Omw<0|CcV5U^qGxyu~AA_O2^*%t9AZ;3u#I!!7x+OH3AW|kerZcozaJ2+%9 z0Bwk2D&ATte}o#=jy{FeAJ&0CEGiwfMAl4srQ|##CFja(qZLg0L>>S5X#~ZrV*nGj4FCc#Bonz zgE-=jD98qJ{MkWro=F;OBo0#|n4Dv=q9Np6WBISm{q~t^;r#<*b7XGnu+$_?HWKUO z2ttUe;#`-RYGF% zOdPZQM;oLv)55Cs9c(S>lz(YJseB-ZIBbV=iud}rOO3CWy5G|7?*MVdqpb~n6NfLP zzz!f6RDNfAQD;#kb2LO57q2HRbT?fgcnO8V7k7SIn3kJbm0CvRXdB4%ZW0AP!M?V3 zURY2Pfrw1nehyL+1%mh0f|~2>d+Urx=)9=a(V_`WW>+$A_VJvWZiK2vY`|8Dxeh@v z+fWPUR&`Hq)0M;2`0NujAC37Quf`KLz-JXi{bB!7;dV59R(IGzEzw&*!a|*HH!6uh zbf<)3!j7Nk-nWv^L6Hh0D}Nr)J-M!6V$yalz&BKE|MnESA`e&+h>8`yZ-XR88%#I0 z#XC;8<%s!A0sCoO3UgyY1=boydarzcP0Ay+Yq z$4jGfG=iRc*s6v!OfjLqu1_44hXJ-qfFwg`4WAiyh2~B#YPg<`FCi)8>U}i&`b4Dr zARFEeRgdt&%BN_dgeCE44LHbES2~p*;13Uon(Ph5@i(#<^l;(%N-+H7Zgp@Xylkp3 z8<;qqi!ZXI%es4$7fdZoYmiGq)SWgJ*@2-DF_B_y702#xs|(cf_+WLxUpOyC+?vW* zV_z2^Xe4qa8X~XqBIYJ&E&2e!yX%$I9`lh4>_}?rGNw-hA~{r7DdM@X5U+Q!D>nN> zzH*F6`=_$Z{*ZxlyWKci=(b}lsq0p|lp#SiEd`>tVWWrv+}?UJAk6eOT({oWlBj6R z=;*bC1N6I{t7khVl6_+as{D05+f15B|A>{BM~}gyQSKf~7pY&gCxw z9^(YmnJ-+vNrqmZgnHVOnV%T z0UGld3GHG_Mdh@r3m~}qoquONHy&@H&Mb9p3=sThM;m*@nED3_C#@Hp=N`bAy%C6N zU*K5G79RlAfy=HnNdq+T^)G^`=d5eiLH7`+hi-jfO!wBU>OhtgSUhp-5N5Y(j5Vc3 zSl;?jHNyfgsj07*vZS05!_xj*Dx0t#Gp-WYgjyG~4ljy%^ctKf^}f2t?J0G%k#?eP6F>@o9rcy!svsO2v;!^zs{eoqpKgxy_WI1ibo z8Og`U4R8Tom7Vbyu)=S}HlGwa`%KsnvBT%cWYsiG*%5J}=yGwFtOS zB`((L)q&lyz8|5#JF*A|)pcQhtn9tbndYS>Cv4RWb-YOO^83WHQAqnO8tB*6ZzJk; zi?Mm3dtakL*}hwoy$Jb;Zg0=YNv9N~# zm-_dunE1rUKTr6cIB;j?{;iSfpBKqbmz)T2h2GNAL6P?&5ye?yzD=DF) z@XJkOoS|Y(+iXqslKbY$U|p?4;0c97*~BV&q*%=pB2G{IwSl^DhvWH8E^B_U%{Z`^ zqL`g&?<}S!)VFmW8cQCd8owGeq!o#=Ziijq^cJINq(8y@@y7T>Pl%lF&GlK+ z6O#$NZ1NE>p(#(VP^jO|jqwCw83UuLNHz`a5ZpQSUuEn{J(e_?vOsrJz>X#(g=FS5$7tFv7>u z>2yFr$MgrWT}-tsgjb#04$1?Zh`UFI40wi!9a41+@;oGaxoWdY{u%hQO796`CJ+7e zN3WSpI%*3hqgtmiXG_&r6rQN0M=EK;>2HCCTL0g(Y*z;!6UkIRdE~dU4n@YJWgEuO z0U$ac)U^Bx?YPvUt}s}(30^=|xKQ-!Y`G^7_TVUl4Wx5W6ci^=M}pD zVXXQjNdFqdM-$V-(@U^PVQVVU0o4?{j$CNGMJ6uli49U3nvk$qGp>b-Mz0W5>1Ayk zEwLVeMRqpGc!P5Sig~EwLWkfy1FN_7%dNg;=B~L z8(XErnzcZ@8`bURua^MVbd2PFu&w?$hyj%+*uNm8uso(KxV;bJLk9DnfW=^Rw-4Be zw;4~4=rx|7NTR|EPJQm978DH}4N{tGdxy((9Id6UCpb9$ISXRYTpW7P{m(JDWs}ZO z!_qB{NsVK1rtU8Hn~@0kQ&u@ga*HRC(Q? z3f#LnPb{Spo6Xwa#sR=opu{9l4;(VrjHC@q3z3N`!9?vK3K}bQxjL}%uOhZv(2zxW zqVwd42Qdr;bvX)KV;v(*g-vc$53Mskz3{K`*6r8=?Zexyql<__*aJ@BvC@bD_-q&~ z2?9(xzzb|5KVFyr*d zJs|ASZX>~HyDQ+?VqENpvjF0aLzLFo#v%~Iyl$N(=B~)>{$=26kfC%7DH`)}>d!GX znJduS71T@>0hGuIrFB3&I3NIz*p8_=_d@uhr(Ud`OVJ64!u@Tgvc$xtz;;n@b}ESj zjfAF4h&SMZbinR@DjM?A9WICLe1nx-NtCXS)5}lRU2Vhz#3nq$7dawho}h@}xWiZL zg*7mlA@Y%{%z*DG#tOv|5_-Ga>L{S<7LP5kM!w6L20$9!jkq8QK34(upH7Kpht3L# zcw&I%QUbPmgdrCDXjD`$MUGgV9u;l$ujU_TG3@*Nd)*(LdA!#Dv5@>LEe^i>JFmYw z`*BeNDuipT4*^_=PSooz^s+j;f9571Ff!?w;`kZVtR!2I;uZ3_;8jSPpr^Oj@m{_C z&2;E+(4!crL6ZmKdf=uH`3C!92c+5pNEuqSd8FjFr+^L$8LIkhu8KGV#_iE-499kh+PyRmwEdFEs0j$bD#r7B91a5{HNz7g824Uw|N*2Uf z3ydI29m}%KzK>Lsbt;@+4IpbkQ4*QrN(>f^=lz51xe zGo!D+qw^*C?buxa1sX4ZOUP4>l{0`x#}H+Rr2YN}a-#*YLHdCK(-5c-zvt=wMk&@1 zezmi6@TnRe%0_`L{DpA>2@*_#P-^klw27Pcj+vGx19(=v=oj%=)zgY@i9c}^Br~MJ zj_7};E#9>w#Rqs$Q+i)q8stLb?Rn^nbjPBTl!Qy!Jfx@=sE~2MENDq@t%>wz-+II7 zZq4TcLGrW!Om?~AzR_cx0t0l}!6ox?b>G-F0D#Aq?s}Y$}W&owA}n#R329^Z&-AnN+KK%A|wWYXUF} z+!g9z8?*#efH8GVGzCra?9@7vsBBzNm8Jd%zygAGhw6Erh%3?G}~75rPGTe4>5d zb*>DQWEcU1lQTy#QnVac_!VO^OxkPk1dzT>RnAWBsQ zf?!n525BNzS_4Q5&j2y`rm3)Jlk30uyV~Qga`AV zGF!HzZM2Qemj^7NW)YsF=TmAxdXAKSZhPwu<&XWc_Z?{fbnE(Q+}FBEoB5l@RkC`e zvsqhlXvnzlU9B`ktw;Zat?*RjVC4dL1$KL5PqI>36wX6rY1}|B_J8=saa-^Sg9&&7 zjJz5zEr9Svb`bwzd=Kn)l_y~!jM54!VC#c#`ZMnqL$l~)T#33pl{1F`g}Rq-T;>H^ zwvGB0s)f{av$yU0%ZGJ00qNf8&7GZJ=&)X$D?Qe)y@#$)_X@@DA7Wn_svt@!_YsE2Ek+$`^$P`@$JxqBnvu28$9 zPPgzZ0&RhPYhsi*qVzzIS`F)+`Lae5nb95Nt;)}+=TW<9dDvh^W&CT2(e_@(?sENw zxuDi2wMsq3pqb4~*2zRZ(*fE9eC}L0FX$xRUBMf$!;G+IOHiW#?ArzOe2u%h$KaJ>v5CA+M5Gx3=W$ZN#-o3-s&EyFxGC{*~qFWMb$N7E%mn02@==rqPce*)tw z(cQl+q#&79*??X5D|Sf^M1~pS9vR=i-C~FH3I!2W9HZhgJ5|+ombqGCoPiQ78p9G- zo8F>NKKWTeupW|kF?;-ypf$2tsbz;rUwdlIA5Nv{rni*`OBJS;P;%aBe%*QwPqAb({2G9@95>ARwWJ&JH};+wBn)c$gC+#^^RdTg zllDRK6ex(TXC4e0I)xk*LBt-4^g;YlyV_x4ny>IiB=VX5uSwY&J}>v)WP0lsORz(k z;WX{U?C38U)M~}twj2D@8_lNfSbNPJjr$zA5kT8^(n_qzKz{@}({}?JMTGO~9aW7tdQ{px1|GGQ5)vM2r zk(_;FpCqQN-!s0eG%hc~KvPgY5ji5wCEob7bEJqu={cA#YXb#!)s*VGB}ep8nJZ5? zzHY)uMagcPCXGkiH^C(P_wg3?qNEky!wXo_JO&a%fFf5d+c8; zM2|~YGYV*qX5(Mt<7+^&Lhri9XxO>}Tx0Yvoi4>wF=V>oxC0QfiWEHy$X?QO2IN*E zwROocBj9g2->a|B?WT<$M)T&e37Xnnzfmp@x_H~*B8d~u9Kh_3%~KB<=`UGEYLGg3 zO~WpSHArHAemrlg5YeDc@&51dEye|bNj`|UNb z3WC2NXZF9dh;Fx0Pu(lwg9^d95~rvafwPp66xj?gF!aODhOkFGmEMg9pOY}|7} z%uOkdyBued#Z?0neBZDuBJ71K7N8V#xFq-Mm}W0yfxOEBctQF?X%pbOJ?`?lbzs!R zBLdW&-qV-3zkh}D2KV%gzW|ki0y*0X*L49Cn%sc3FZtu}{^<|?Md}Yo(f>Z7)|4{p zT+~Ow&3-)UIiwr^FMa;E9JfEO(SsvT-6A$cepx#Kwc2%U%tQ>dYH42k6QB14{{}Ls z^<)H~$Cj~*XxtB`_aRTNlD4#&8#+h7H6YO&T zn^O8G*T)>bz2={9*q=AoKlXI-YI8`^V#-}|->-Q0h^o*5>tI(J;^xxj?@4{#QB7o* z);)apiLmt{dGVyr{t#

6kWII3Xy5*0_2WKjECq6GO+Z_6 zLD|OnNnH-~2cYEjuq&Q_tFA7)!4A$R_6VWuQMGTnMUmAF(qGgBK|>4{fb%P{>U60N z-|71$CW(0ng&K4n$cxWMi_?{Fq^7RbthFBjbh>paf2E_AQ7~wI?Bt;nkHz~;R}sZT z3&meDGAI|jp}NK{5_-8mb`{idKFx1$SsGw?ozwv`;&I@0wR^uOfjDC>mp$4iClTW9 z0GGXtk2mBkoQhGe)8L0G#6~syI?qB-jGkaI0KYZ#prH$R!hoO^NnM$l7Z~e&Dg*0M zoGbqd&)#PL?7pxFkOXTH4j9@5Rw>_8Hpk+A3{A>~yF;o?0^lRvwb)ICPUX9gWcl3{ zCiKWX{4Z);oYsXmpB#vS$;4by#7)|0EqEdJB>tq%5d<5DN(nbZuEsb)d5fT%J?pibelBAOtu# z{}dm4j8y#dMp05Na_8k&w!eWk87H=017eIk8#%>{pl<@tLe`$!0*c_uAQL*mx!~S& z$aR`O{^VCPaN664ccB7dS#`_La?kI|ZPB*15!@z$@2~%UJtnaq-%H!%oVEb8d*^!L zb+*)TGDE)?LB3G!$b~|GcONHmn;>e_Zw}Lt^Tmf=ugqu;Dfk66MXmUF_42BZHhuHI E04T{i-v9sr literal 0 HcmV?d00001