From 09665e7b1a4e92da0e9ec0af0cf1a6f6b8a8e8d1 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Tue, 19 Jul 2022 15:53:36 +0800 Subject: [PATCH 01/24] docs: write readme --- .gitattributes | 45 +++++++++++++++++++ .gitignore | 3 ++ CONTRIBUTING.md | 18 ++++---- README.md | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bc49c71 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,45 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# behavior for image files +# image files are treated as binary by default. +############################################################################### +*.jpg binary +*.png binary +*.gif binary +*.bmp binary +*.ico binary +*.jpeg binary +*.jfif binary + +############################################################################### +# diff behavior for common document formats +# Convert binary document formats to text before diffing them. +############################################################################### +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain + +############################################################################### +# Force Windows cmd and batch scripts to always use crlf line endings so that if +# a repo is accessed in Windows via a file share from Unix, the scripts will +# work. +############################################################################### +*.cmd text eol=crlf +*.bat text eol=crlf + +############################################################################### +# Force bash scripts to always use lf line endings so that if a repo is accessed +# in Unix via a file share from Windows, the scripts will work. +############################################################################### +*.sh text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d497d0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# .vs, .vscode must be ignored +.vs/ +.vscode/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9f9297..3b96099 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,19 +7,21 @@ ## 向 THUAI6 贡献代码 -+ 将 `eesast/THUAI6` fork 到自己的仓库中 -+ 基于 `dev` 分支建立一个新的功能分支 -+ 在新的分支上进行修改与开发 -+ 向 `eesast/THUAI6` 的 `dev` 分支提出 pull request -+ 等待社区人员进行 review 与 merge +请遵循一下贡献流程,向 THUAI6 贡献代码 + +1. 将 `eesast/THUAI6` fork 到自己的仓库中 +2. 基于 `dev` 分支建立一个新的功能分支 +3. 在新的分支上进行修改与开发 +4. 向 `eesast/THUAI6` 的 `dev` 分支提出 pull request +5. 等待社区人员进行 review 与 merge ## 向 THUAI6 贡献问题与思路 -任何对 THUAI6 的建设有新思路的开发者、发现了 THUAI6 的 BUG 的人员,均可以在本仓库提出 issue。推荐使用本仓库设置的 issue 模板。 +任何对 THUAI6 的建设有新思路的开发者、发现了 THUAI6 的 BUG 的人员,均可以向本仓库提出 issue。推荐使用本仓库设置的 issue 模板。 -### 不要发布 “+1” 评论 +### 关于评论 -类似于“+1”、“👍”、“\xxgg/”这类简短的无意义的评论不要出现在本仓库的评论中,推荐发表有意义的评论。 +欢迎发表有建设意义的评论;请不要发表类似于 “+1”、“👍”、“\xxgg/” 无意义的评论。 ## 开发者交流 diff --git a/README.md b/README.md index e875610..fb34ce9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,117 @@ # THUAI6 清华大学第六届人工智能挑战赛电子系赛道(原电子系第 24 届队式程序设计大赛 teamstyle24) + +## 赛题背景 + +待定 + +## 比赛规则 + +待定 + +## 软件架构 + +待定 + +## 仓库说明 + +### 配置说明 + +本仓库使用 git 进行版本控制,为所有开发工作共用仓库,请勿上传不必要的文件。主目录文件结构非必要请勿修改,且主目录中已配置的`.gitignore`、`.gitattributes`文件非必要请勿修改;各子目录已预先包含使用`Visual Studio`开发的`.gitignore`模板,可以根据自身需要增加忽略规则;如有必要,可在子目录下自定义`.gitattributes`文件。 + +### 目录分配 + +待定。 + +### 分支管理 + +- main:代码较稳定版本或阶段性成果,需要 2 reviewers,但由总负责人(端茶倒水)维护 +- dev:各开发者开发工作的最新进展,需要 1 reviewer + +## 开发规则 + +### 关于社区开发者 + +- 社区开发者开发工作请遵循 [THUAI6社区开发者贡献指南](./CONTRIBUTING.md) +- 社区开发者贡献的代码请遵循 [Contributor Covenant Code of Conduct](./CODE_OF_CONDUCT.md) + +### 开发流程 + +THUAI6 开发组成员与其他贡献者应当遵循以下流程: + +1. 将 `eesast/THUAI6` fork 到自己的仓库中 +2. 基于 `dev` 分支建立一个新的功能分支 +3. 在新的分支上进行修改与开发 +4. 向 `eesast/THUAI6` 的 `dev` 分支提出 pull request +5. 等待其他开发组成员 review 与 merge + +### 使用 Git 与 Github 时的注意事项 + +- 非必要请勿上传大文件到 Github + +- commit 提交信息请遵循 Semantic Commit 规范,即:`type: content `格式 + + 常用的 commit message type 包括: + + | Type | Explanation | + | -------- | ---------------------------------------------- | + | chore | 日常代码开发;改变构建流程;增加依赖库、工具等 | + | fix | 修复bug | + | refactor | 改变代码结构,但没有增加新功能 | + | docs | 修改文档,如 README、CONTRIBUTE 等 | + | revert | 版本回退 | + | ... | ... | + +- 鼓励开发组成员之间互相 review 并 merge 代码到 dev 分支上。merge 前建议简单检查其 pull request 是否符合上述规范 +- 一般情况下,不要向 main 分支提出 pull request,更不要 merge 到 main 分支上 +- 一般情况下,不允许 merge 无法通过 CI 的 pull request + +### 开发约定 + ++ 统一使用空格缩进而非制表符缩进 ++ 统一使用 4 个空格进行缩进而非 2 个 ++ 统一使用 UTF-8 字符编码 + +## 其他注意事项 + ++ 文件的字符编码格式须统一使用 UTF-8 编码,并用 4 空格缩进,尤其是 C/C++:Visual Studio 创建 cpp 文件时默认使用 GB2312 编码、TAB 缩进,因此每创建一个文件都需要注意手动设置字符编码(当代码文件中出现中文时)和缩进方式 + ++ 使用等宽字体进行编程,例如 Source Code Pro、Consolas 等,便于对齐 + ++ 注意代码的整洁性与可读性 + + + 代码风格尽量统一。书写不要过于紧凑,善于使用空格、缩进与换行来让代码看起来更整洁 + + + 命名风格尽量统一。相同类别的命名规则要相同,例如类名统一使用大驼峰命名法或其他常用的命名法,但是不要混用(非必要不使用匈牙利命名法) + + + 命名应当通俗易懂,让阅读代码者能够通过命名理解变量、函数等的意义。除循环变量等可以使用 `i`、`j`、`k` 等单字母外,其他的命名应当明白如话,且谨慎使用缩写。尽量使用众人皆知的缩写,不要自创缩写。如果连自己都不知道的缩写或根本没有众人皆知的缩写,则应当坚持使用全称,命名可以适当加长。 + + 常用的缩写有: + + + + > address-addr、answer-ans、application-app、arguments-args、array-arr、assemble-asm、(a)synchronize-(a)sync、attribute-attr、begin-beg、bitmap-bmp、buffer-buf、button-btn、clock-clk、command-cmd、coordinates-coord、copy-cpy、count-cnt、current-cur、database-db、decrease-dec、default/define-def、delete-del、dependency-dep、destination-dest、device-dev、dialog-dlg、dictionary-dict、display-disp、divide-div、document-doc、educate-edu、equal-eq、error-err、extend-ext、format-fmt、frequency-freq、function-func、horizon-horz、image-img、implement-impl、increment-inc、index-idx、information-info、initialize-init、instance-inst、iterator-itr、length-len、list-lst、memory-mem、message-msg、middle-mid、number-num、object-obj、package-pkg、parameter-param、password-pwd、pointer-ptr、position-pos、previous-prev、receive-recv、reference-ref、resource/result-res、return-ret、second-sec、select-sel、semaphore-sem、signal-sig、source-src、stack-stk、standard-std、statistic/state-stat、string-str、system-sys、temporary-temp/tmp、text-txt、user-usr、value-val、variable-var、version-ver、vertical-vert、window-win + > + > + +- 命名允许较长,但不应过于啰嗦冗余,能完整表明意图即可。 +- 代码应保证良好的可读性;**禁止**中学 OI 竞赛的各种“卡常”奇技淫巧!!!效率并非总是最重要的,良好的可读性与可维护性往往更加重要。 +- 熟练运用面向对象编程的思想,设计架构时尽可能降低模块与模块的耦合性,保证代码的可维护性 + - 慎用全局变量、全局函数等 + - 尽可能将各功能模块化,便于日后复用;尽可能降低类与类的耦合,善用继承与多态 + - 适当设计单元测试,保证代码的正确运行 + +- 注意跨平台问题,代码需保证同时支持 Windows 与 Linux,避免直接的系统调用带来的跨平台问题 +- 注意维护开发文档,便于后来者快速了解本仓库代码结构 +- 小组内合理分工,避免个人任务量过重或过轻 +- 做好部会记录,及时完成工作任务,避免拖延到ddl +- 各组间多交流,相互了解各自的开发进度,加强协作,遇到困难互相帮助。 +- 加油,奥里给 + +## 开发组成员 + +- 逻辑组: +- 通信组: +- 界面组: +- 赛事组: +- 端茶倒水:唐昌礼 From 5cd0b66c919e46eaf4b1f9f806a882c99807babb Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 14:05:02 +0800 Subject: [PATCH 02/24] docs: add structure --- README.md | 2 +- resource/structure.png | Bin 0 -> 66930 bytes resource/structure.vsdx | Bin 0 -> 65739 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 resource/structure.png create mode 100644 resource/structure.vsdx diff --git a/README.md b/README.md index fb34ce9..5b5c1d8 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## 软件架构 -待定 +![structure](resource/structure.png) ## 仓库说明 diff --git a/resource/structure.png b/resource/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffe9b095653c1386c8f455977c972a3a899527c GIT binary patch literal 66930 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 vy9+`ld8y(iWrg-~AUYF4$8Aa^e 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 literal 0 HcmV?d00001 diff --git a/resource/structure.vsdx b/resource/structure.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..4a070e8d61d58464553f52f55bf0ea8c2536d806 GIT binary patch literal 65739 zcmeFY1G6Yi+AO+k+qUh!Y}>YN+qP}(W!tvRy=?pLcjnxQ@5Y_;3(o0?R#Y`AtFyAY zo=SNsU=S1lFaQVu002S&N@Wj=W>tEg?HwXA@gzJ!KDj6DJ)ycN=Sh zLJ%N|d;p-o`Ty_oe=q`FsgtsU3miw8MheBMOGQoU3@8%!7A=E$cYd$eJp}G+-paDpqt$#YFV8FK?vd*=CWAs?_CU z+#F1JxOgymyRdCA%M&Wb=iTk4OUp{}Q>YvM0~w-P<2*eZkgV0dCdm1tLH(RH&G-4< z*FrE%SUZA)rZuzIXs;e;AjU!sS;rmzmErLMy<>wg+vW9h9ju7VrKqeAZQNXH-qRX8 zomBGcH4aJ!TZo#wf)LDnIzHf!9b!DP)EvfgQ}5tp^V~VmTWH4}xe{CMcV5~0${k&c zC|eEe(xQYJ@_92Y$hVKb$daCCG34nZOp@=S)rTBBha^0QEIfxaJcm3yheSMwOgx8F zJcT*efQ{f^I=2Qv>0j&zCrQ+{^w*u#`5dAp+{o9y%Dy7;QcejradDv0SM3y9yvDEB z@U&p_w_nju__PwW*<;ELRN^`rdKn##la@yeE)4hKEz}2no-qY-uwg(}pw(Tlvd-Tk z!*NA<>}~uIu&Cj9QgvptSMPUUP10fQH(U~m;QxN8KR>_#^8X*Um#Ggllm2D9E-(N9 z^k25?Iht5I(bN62{l6^#KbYG8qv+L1|6zI1vCm;KPq2KFErOyOL6dvm(ShJ@c@)M_~5CI@i5Wx*8C61rD3%xfxrN_fY8UmsmZ)yb zE6DAgrSnL6J=0_d=#Jq>Q+(?y4c8xh%IAXzY1Uw?~ za(t#2JLboFhXcuMh?$fM#l-8GQr!RYu>1I$5D;zLDv*HRpN0B{jcd~*I{yn<M%=+>vhWHOLj4AKJ-#QTeP<@< zBx=#~u;rP|XHmDwWtx&8pZ!qvaLz>wcx98d%DA9rV5>8A47nci5nU)Am8+k?QzAN%h6v?3Non_N8dz6QsGZV|nG z0qVajHgE{Oh6uWcZBBo~_W7v}j`kwSXS$3xx-DU<%*thX)0mKIw`MC4Ma; z*oI-k;RrI#@n;d(2}QqIC8?ljlpMF$Fq`v;cwqDC~#u$8hn z>Wk2831tCymID|T#yG}a)y0EjZ z1BPPQIoSDQC7-Xj{O^GnG5R0k`7>F%?fHD@jUu~aT*7U{Q&O3~h2=ZP`ln8wuF(FT ztvYD(haQNCqkAq@CS5|EJ>#lpQ)U$q7hgPwUJ;hS{Jm`6e(hWlxg|@=jiJt3lCe{; z!*#pDt-|1MZnlmV;3$7y0G+>e7Rallxr(}A6MHN47h0S4*Mh$lE>mUVRzV8kD{aQV zZP6zy@DJ#mbQBz*<0V!uVRanmIkkhYWwbF^-GuFZOSFW$1&esg6`b;|!Tw&U+x6xB zwOWD$LA<`=zQN&MGN17ngopEeS8NzLK~v#){bwgrSwT;}>0gbZyLtFmF+p$cux7O< zQ2=l*-zBYWPy1WXYqqQ%1g2HGUfQkMrNEL)j+U<7U=0ptx-h9+eVWs*=-;d7E1J`_ z+cqo?^u4!e^H4L=F`C`FR;!nqLf-krMRT1YnbTld0wS)pKzj|Ye|l?lM4jUHpfxX> zxN>6mphXKcE-I}VW3NOT*DHV7w&q7pDFeG(u4wkDLBCqAu;juqmGWy}%CqOb&1tLfK&r5qLj68Nw`Fp;4?3=g@y zta2I#TP10~vwl}4t85AnX_!h8jKCFg1Ca}Ltgs;l!U2IOB4rYF14PT)-KzdPO4)e< zI;dhAa>4i<-Z0yVMOt$|2;r4JA&JD4!~~t!=F@&K6frJz=ZV@mx5<8GAFn_Uk~}v_ z;|P%s*)wNCeJTQ3fm1qz=92|Fm8XZXjj#x5+{stY;G68kBUj);eeR#JXg+_E#eJ?Y z?JSUHEoOxm!<2)P`cl`^;fkFLP*O zYdZDZKRRaa*uXG0OhmWUZ}XaC6?0%Qi%E5G0o~Ef!^USp1;g0c0ze*`h$K!*RHp#| zitR&UDl%7)JaT7z+MR!*|1yCnMbvp6hywm2wh}d4_;8{3>j6#4zFDy(DvCorUn_&k zIjOFgDr@U2T>tgW@oz_jZnOp$Rl*KAyN7r;PuDAH)sxV(;0*Mm1ihyx{0o~8ER2tk zB%Mdi!QSh_EXvHrxe2@!!E%J_@hAf}se%fHM5+<^gLa3e4sWa}P7Qc&#i1#dl5Dmx zX)h+PqdTG>NasP2fnE0NHTCpR14N0igD?z z?zd>!yfZOywtY{mHGwD83oYQYFY&&aZ(Hy$mUM<<8Xk7dodChol`3t=gYCDw3cg-h z7Zo}$mv*=>cYkzh$kvFg3EkJ_P)FS#9IR4lK;2E{cc|ZHN2PBSY^?6RRJ0~8qxSV8 zROD4wG$t-G()E?417$njGtF`eQs`*=7J3;Qdf70o)4Z(Y$&(wS99Bi!S}hC)%JIiUL}>Z>JvsZr2;xgYLfV(Ow){&jK6eW2a@I+bpv_Qs1g z`wF)+c^w%LPxny_o?419qdmcTVVRy0)g>pVM8Nraq|-u_xhvn+zw{Ph!~vXuF(Dbe zAvvW;0Q8fYpAAsJ)|tr8oFx4t48&~~t@B4F;~S738bF@-)ATEc$iK1qmZa#vP%jTuXmW-59oiz3}H=xgmo7a5ygNqA5{xdN(+{WfiB zf1o;GeGTeKp3G9!QXjlCLBRZ&f&k*G?_F&kb1GN4^|{7&)VAqd=hjR^=CN=bS_)3i zB4zM{Fn#KDWGo!I0Z!Y}b>XAi`qxY!<{6Vc{3S4iR=l{7wcwz|ahX`g6;94PozR2q z!H=1>T0G(E@T(ihn?&w1W^BJlRD}1|9|>s{Yt^McPn* zC+v}bH&xr?s~%{i*e4ao`(CWkWZRFG7-5!a54fQ z?Mwd^O6ub?h?*_OgNpx=X36bloSIT)jrBrrJ>M4t8*A8eNSO>p5u$14TQ~RIP#f#QmW6 z^E<;STkBnw+z)%I8BQ&FCxA*7v=ai>VoLl>glt747y_5r-tFGhlp%eWN3}rCL1v;^$1n_O;htRqo)4Iszq5mo>@rTfYraC zt?c6~gU=`}oSU0U+7>B>91hd8!67+Il}H6-a6Dr?iFJcjaMY?h)PdOzlk~z?$v?d@ z{(;m6-#c#G9Mj)tTHiu0MSf4Q_W)(HUpQufX;(;EblCGvUI@T=mcjb` z$XzycGVsK{1TCzNvY41+o-a%pvBMZf416up^iK0PYxv6EGE%s?5BH(~d3R0%7@R&OaK3-e#Z%%P(u@7`$KiX=!9E`S$2Y8SrF@DfdwDlT zf06j128!P_9g#)?QSdic@P%tP)DNy`I_mf)H+{iyZW^X>Y!=oj=i%ZKOBBZ>ClzKQ z^^IpqG#CXNrz?fD14$vdn`$&7`kS??aftxTJN03HV*pmN!UFyqP5C1=JY|xFpE4W# zn&yb$MblUZi!~e!49@Px8&J@)bb(9n&vvi(PwTGtkK0eNAcJ#l=;6?Y0j4%Z>?d|2 z+OA`Oy$~ifmf$G|fJF*Wy6J!qnO;ze!!8v>oJO`%3v2%logB^)BYuNpHV%fVXy7Vi z+!XWR9$PO)X&ARzKsQehU5*zBS&^}5oos1KbVgAZZM`guq)6&43$p@k-z1f!Nb6k|2aiC8ez zZDENJ9Lbif|`HJTx>rfFq(?g-V=?G7N+^&Vxoiib|9U z30DM5ztbcv%|jqj=1fW)_IJoJG1{<5E84j^QiQxc^MPpA~lGQc5(W0VHuP}KbJUb>>1e9SUQ9@{-S?}($&66WFNZ}35byR^miep#Iz}enw&52z@&!Zk61$^1udgg<( zx8?EP=)m!|;!RlnCLuW;Vyi*Pz6Z79Eu*$QTZ5Y5DKIG&Q)2o>01IwN9Wye@_jCAh z)1x#Q^$fn1bg)-uOa2-fn*91~PGI{G`BBRyScT0C_I?)z{u1*9E}%T=KaIHrpaMi0T^JKvR`d z&}G)rr!eitt1#g~V0|ZdfxL}5flzp>0CQaUvEHSIoOOpL3aZeluRT_kW-ByS(ovDG zow*B)Ot_gEVQeBOZEfq<|5OQP=R1h+WfYG8-KE41F zDVs^=AFWN8p{U@D+Se^i>d%v*2&gcgOlBLY5ksa;*gOpa46Gv4zyjF($PEO+*oe9& z^?(IEp2ou2REszk+x2HLMObm7m6{xqpI7(D1`mHt(6Kaw0Qpd!!~%(5R9<$4W_U~@ z3nX5ACs}^MBwdTOaLzjIPb?uT0(PELSAPXf2&Uwv$%izatvE`d6cv0j=}q!bN>a0) z+QV{qxKLq);1OW}!d-|}<9P-#B4nVaFcF|3(60S@wJ1d@Y%WSD#q~YaL5TkucXz{+ zd)6e^tz}7?OEmp*D?umz_etl^>mc8!DlPpxo;}kE9P=yL8{U!p27cC!09Im^+2G=S z)Xw-xWRa4KuyWw!sv9T$<3o_G#Q7u| z?VXRh@2NIu0U~_iW=pDTkomdtimJraT4*JyZ6Yjd1w;d^3L8jb3b%~;1_yhiIysYP zL~STnvI;R!9h=%lA#H}po1#OJ>X@{xN`2vB$n|k41yzS?sx`Ik1lu!RRl-Ecgku-k8Y&&&Ot&%t|w5B$V-axUQEs$axl9Z zB^fMo$JB#UtLC~pDrG?%5pf%sl*EYEQlOGUs-AW|8r|mR(!?NmaKSj(&Zji2wf;j9 zd!OgLAa}8GN0-L0;-Fwcw~%~Dq_D5wfr~=yQ@>UYS;tBz)n2+TmI53mwHn3kNKVTVuI zj=6d~{wUy)0Wb69rKl(I78gl)bRqM=N19)oUHULZ$7VxIaTZW1BXhsw-$W%oYPO8D zPPlEAcdZKu8#~!HCX~gY4s=Mqm)5IX+fFKu9IJttdn-5bk)W+5e}!MN7b6sSjrHK{ zJHxM!qQjfwy?c%MUidcd_UvAAzhr&Qe3|xo@vZ;V!Amn-Cya<(5!>2y=4fmx@)kb2 zaX*wLf7_aUCok+?P30-RzxbNbN#O&Mi(~cn=Thl%53a(e9R2G4`S`1NSL`>vZ&~-^ zu^&nA#qR|*KJF(@`}9&Y0(J@ZuHLEKb$njNSL~NjRf*wo;AhaeE=ZT&-|NKgDlaE7 zBSkF_^vU4+Y2BsS@bBE?*uY+@yro|)j7S)OqVzvjT{M$3Pt%YKan z^YO=CsqkFAyFb3&rTgG}f8Qpo4dIo3$bKml&HFCZX~HjegIAmY+Q5HiWp%*6m9F!u zhqyL=lp7HHtgR&bz*?wnt`^HP{`v9UTiZd=btHQ2v!9$To>b|{S-H3pb18d+_^xWv zMnY9v!yq|JB-a75jSZsqFVR&gfZe9Q#dr%T2ZJakJEj+9)gQTsR)kF-h*E?tzmx%+q}po4oPq=RtS=bp zH|k^ID)J6iObkJu?@WzYMH*UN&cJR~;mxpi?d$kW|e@yUl&J-r*KOziu z&%q~zI%xJKp;FR1e)0ubxXt7PqU_a8pcuL3KW2>rDaAj87EE5HMWR^yRlG`v1b_%F z23PxzC0fX}*}t^Ps8}BN$hO#TzvSiX$m-3=)2aBtux2I6cZV&rE~_gpMN(1=B-Mh1 znqEeksO)wYS*)&KTOekZR$IQ#lt-qM@SMJn)HQFET9(xS8;c(b1-3CNWm{e4m%*&S zHT4}WG!t3WK)F&4L;sn9&oX8``ND?KiH9M(@PTa(@Q|I1AuOexrOxS<2P{y0s|$`) zzYJ_4QFU?hrN1G&UkmcA6MmvfFL;!!)<*p{X!mpV<@Z$uMQPf7eJ#n~zFs-QlKuO$ zCeRC<+`s3ZyV49?VA)%;vlD5Zv7wWC{2A2^( zRsoj2YNdc2A5#A>YFWi%W+bs5OZ`E|162lkQl~laJ;rd?-nU2Z%@6%StfG>oTi|)P zx={jJmmrGv8J3KiDCG!=A_9*PG*C~AkZpY^K)BD+o~T{@j!a2CCkkT)3ed;1;LBx$tVBg7}K=y!u8tx4?(9;l`Vg792T z(68RoTp!7rans_<6`F{Op3}2|#R+lY)kS&_2-UOH@1Hp^7NZ>=lJ-?_>UCrO{+;H) za;H|MWEVp3Jq!9X0KM9kAmv_9H8&gv0z7+IC8Ysz%bWI=h!1;v^7)3^70_7TD$6fR z0})eP%fqKt8tRMql&zrM0GB`7?kadlAE<(0!pHl@_g{lt-pft{*{A>jt=<3tnEwfK z*%&xEn>aer|F8YOV_jNKo2rSvYAN5qyKP!TG6$kSl#@yT;+k9ahQpE#5<3`?#iu3W zup$~pb~Y*GSvf-vY`No}i4xh;2e@){Swjw{*;%-we5S&Ro*TV&dM|+d03^bSD}M}; zsSv?qczxb+{7>Pxec1T7<+ckta(!D3fZ&f_x^ z7ZbBLD3-Gv6kh6|<*!yuOCZ~qRlSOq*11+JS8)*ARXx0l7B2b4xsoi^uu9+_w={p- z+159Wwy;SZPZ)YP>a15b&8i%b%X_WHr)i35xnRo$qGnVvE1a(j!po@{-0`&sLL{`!8RckA^yzCqUm z@M~YzuF>;H+GE9j(o7<8I-D$#_1Na3k7cYIdSCjZSwWnhXSw3ntV1aB!&-Ae^+mpT z)+CL8R-CK0NMW+jp(DSLN&2J3W17+e(wjXGC8|13_Rx_mTNzm$z^5fX5n63!DLStb z^QtC^tKDc?pisG=C=gWgzM%=aiYemoE03plyd#&RN3l{xb(K0r_ENc9L*pvjZV%)Y z>Pghd{?Yh&75CfD;kya=BJsVzc*ZUl~t?KN||BSCijs}be52uloU-}v{Y67f`w_zGr2zMzufwA zjJQU4B=DiBiM|o4)!FEOF@B0)wqKmPjRO0s{5X#NL&3IsF}uoLHNEi1-sOCvLiJ5= zMwt!!)s+Lr8M1n@OzsWak<)22E5;M^+q`krne;Vb%DG??K^etJds>^SIY|nUvYDALY(WxAEWfnxPG3vB(_!Fz_;&Xl&f?Ja z!O6B_>b+fTMppnnl#Q66|JU>r_<{C)6VjGvmze`R37{d^6YvJ^T$Dc?AY>0SSZ%c* z$+l7$o|s%G1*Dba>u>MA98ITp?w~+^I{|9pOn=~n__@VzUnUI#Oobc) zbwexWQt3s)H!+(5QZ9soduQ=rjkQi0`O3JOBVGbpiMtfU(b3R*cz61|LLSgMVr`Yr zL@95#8wAoS2vHZL@RKaH?LM?S(wgxpE7%i(DI1e}7Rf z&7^_%azGQdgeFTJn)hH^BS=zinbk(xLNmACbm);ZIW@0PM#!!P#^p*~w+eE0VrRQY z*qhMr_?<@93RFp*#35ovJ^YS@`|Eb(pgc^;`XpTK5DKGI*)oS$ndv@QL92l$y0W=#MufEeW?1ny4X^xL!;)n+zsu}tS3a(e9M8<@{y6RRo*M~$dP*q z#zvuBG(wOy1F&*k)Y_cZHFN;>Fka^60={F{=d}@tJ%i@WbP5uOg;Rtv1_wyQv?rfT zg_4-uh1!VJgu2F*$)e4ZiP`>8G{Y1wQ*2(~0btMcB}?k7vlaOR{r9EMs}}e<&jALw z>vZEHZZ->06YmB#z=^h?+cnyl%6MQX%pFk+Xoo&iftYqO z(UqGFhvIqnDxs~*W(@)v!3|C|X&vat#db93GsUMu_V1pH3rmtAjY_xUpfAlz`$^(Q zoNFEh^{u^Yd2vA8pG%>DNSL~{VZ;9Rz(XwFN^SrG>Pj6MO0M=@wAYr30+2^b{WQ(| zxFrA>S_TAda-twYAT9uEAOwX6?mw7IhWnUJbtLidLkdp8+5zs0tPWnH1~@a;7^u<{ zo)~7$J@xD5(L(Iqt+v;C-d>u$GGi8tKhv}vHXXlvH~cQ}puXgIZ+dU9uD5$Hw||sw zntLC0eGkE(uEaq_d6QmUVT6*PT>B-@EyiUlQ)@_LqElqBN=wH5f8M%kW%oDdNr|JP ziRo4JQ#qL@voR58-rG%PaPRPp(( zH1b7_DZXs82WcM$DQ{ETJ@$Bd{2Y|*9LN276{76>?G57jGJ@{U^J8!OfbUT2b?oGy zw{1uF%-g-w>59!*y;Bm^?M4?NuKII@9s>P&DyZ3z+g#FQoG@sHv}UxCX*_lYvk^z-j$IYwdo=6q+xf^b60P@SB5u`B@ zJf$$3ugH=SfX5i=mays#*#OvLwsFhA`^U%Q5AqS*@1~1sIGw@8E3Q9Sw^uM)SjzMr2E_0#vUC7~QqA|>I`DFotxalazq=CSxY&s-p$`pW{~ z1(yX65o&~*z``$tV}zREb}|TIajs%dCHF)jwTZFAON8M*swC z(l)Xfq2aq6c#E!U*yEGJ-w@Nu7;8=-8jE=zAA>wYj8(|pjinJ#CO0^n<6D!9br`0L zsV1qId})X)EJBSlD|4rf7y0mbGG$7+?C~<9+&=v&7&^yH2=ZAyLl>->P`lyY7#1OT zoL-~zy3xPG(F=kTVqI>$<4^TEW5CCSpdCZ^VK8HEFBk-Y9y##u? zAiKjp*jnJs$xrhPz?u$>oFmOiNdjcupF%iVHw;MHTrBVtUYSM1{Db-Nd9L7S`x9u- zy$-t2x*cvQD5SZdXlxB3QNXZe{Y3L8WpJU))o@Ukn4|jUlWb|=zD7iwg*_cpETLE7 z!Z;`kOB9tSB78;gxg+?*A2OOk!^=EAsY3dMRU0#r&!(md1of#ztlN}`P1Q|`_+x`D zCS!}tiM$^kfZ3T2v1C6mnU%C>*D|Fkc_TwSG%8icj7r-|4QAR14e}-}IyiyZ8=e1X za6K3-WB~8|ArxgjPB1qZyN-8>5KnTr%Gi~M#6Bv^zpT1x_2HZ)dVd?0z_=~!(aUx- zq=M9?rD{7UO<;g>$w94PujOckUE7^Ew@sHsWA>&M$60@4(2)mc3bqrHM~}2UG|Rc5 zjRzWPL&OQYmOCeezFIm2!NqxCGhcTis%di*sB0Xk+5bB+DQ$b;^;eXWJZv*9QdmZv zQ@D|{E6Jxs#1fvUsCIRM`Z6sE^c})2=;0?`qvS6gNy7awg&3;D4i~)iAcYvb2+Qm? zv_P~bGU)q^$@J>wa{czG^0&k7EWh)eA2$xWK$?Klw7e7X)CPgX7#qzdSD6lmfR|x$ z^aV_*#6-?&w4@=DD#3*blgDCHGuCzjgD-4OW>9{GrJ@+wlDKgNLj2u(Rz&R}dqrUw zC@a9|I01>#Wb2i=BN`k<3z?+4>UsGRd`^(RQ>ptpS+?(40|>F7+Xxhe8_Vi8zrLBS z#v%@AzyQ^zsnD7RB-NXq7b+IsB(d4QGFD`(UtvnD;Z-#XTM1&-p1$p?Uh>#OFg*L( zpxM`JLK_cas~xtsf7M5FthK01kmpm<107W-qS#|Opu}uK#mk&VxU{<~kopZa@y|0X zYt2y*92y&Gi9^W0!T#3Z8&z~Hk)?EP(Am)bo%S_t|C4K-mf2HV%%G^gKZ-f9uE}?J zb%BB-Fv%-2JYUU+=`d@<(~77%pP2{z)D9cF2_u_JqM5EWC#W3uzzI&(p5x-7!xiP~ z0bHZ8rP#(A26Yvf+3pBlsVE^IlufrhOW6e7dVG>zId#C}J>GXJz^m~)Yz}eolD`>?O3}#KoqW^ ze|3g|ch|oNn9tVry$6r4F^CkBXsgu2nk@m~Zj>!2IzypOwE{mu;ei<;mTYNbE~+?d z*^<22EKQb_1+j6qnm!(?bYpfvMK!X;q@iA zBloE5)$Mfx#b<}{z-KLmVmQ+J`hcAj(Ai(q@P;7(K4?&G%*(SLmb{;Ii@Y$?tY3Qp zniJ%jyZ2tYq3-Xj$u6ka zOjR;U;H?F78{!j2sOHO^H=o-hj44NFjX8CC4MyV_bn+wRQ$~GZwo7Za-)rIz0*-N( zC`ZK=#&vaanrX?=DQwA~G}C5mFJB6}%$RzAcDVHneU9S1T5HLke;Xj?VcRXTXX7Em zlWwJ77VtqlOHbU~t_!teT7AlL@v(>ZAyDHj63Oq6x1u1D<%7FV=dj5nfZJ7ZAu{&i zu8we?453&Ur-HDtRR%!7%2pA5BOm4DF{3c0p{|lZb3&~+V5VE-U0S5#2csF_W}A2g za`E%f;LXN7Hw!Z|w)6>1_Xz;A1Nat3Vt^OIjU<*JJtPuuVsaC;Z*IVyUuNURa?rK6 z_tBl)?f?r7mca?#^~dxv+y)5bp(V55g)h4V@>|hK7EQ}*RA(1W`nxikIZ)9|%z;jjZ+eVvO>E2}v zh%}ZA$_6Ajw~Ks|jRF=<{>S|iNEPJCF<-QfwjK>Z7~}#Per&Fi8H9hJ25)aE=c%uLd5V`UHE;JIdHyWg{z@zmY+WP1ZQ9~h*uil z@Sz1&_I**XOH*~On6Ov^8N@|;OEr}SX%M~}!|7@n3{7e_b#YQdaYaXPyON@5suIsb zG0#M9@^uXSFgxG=^^PATwJ5;&){ftYW#LO}+_Ro1>HOEV;SH5(u%BD~$Nurq&h*X4 zi*3gwm7AWg)6KgWB+0ci-(XioC;d#F%-WV1R?)cZ)Q}9DY*8Ctcl|>hYynFBH$FY3 zxY(i%uiZ9hWkyb|XFB!)OlduXn@z4bx%83a_=0}-k#<$PkN=Ix=j-4sz#_#fDiuw_ zAYmaRU8ePj>U2{`382$!KNV{c@Zu>~s@RN~^fZMz=HP;91y!SmV%#kcrT5ia8B0!H z#rvhDAPkPY$b1POImt@O>0HU%t<0EO_8}t9>OKzjFqx!Eeywws~|J?N+0w=LukYAB?G&InpARDCTl3a&|qnOKogiJg~@ zq*@+fcwXlf9{vPrIGe2!{#_!bX~{CGp;k-an4R3ryHo7DFmbxuX(7#k8qEDh2kUh8 z{$+;auT*4KDY(($Pv@_r__4L8P?pd&9=J)`73Xsf=PY4~E3V^;l$HsU+^8kQ4bdfg z))*ts-m4EeiA=IsyF%?Jv{ZW-?8ptpl`SFK&4gq`I%$2VU=Cri!GTm$4Ko@lS>|Cb zB1+*Bqy=E@fR5G;O{Gcc`nYLL!58VLL-1XHFp}*2d{)A+!Q3Pyp&wnZ3{XJh{H6~n z4+6chljiVXz;*~AzQ%@swpZO4Auk>FVh0M)LFeaQHeeEQ_%%+Vg$i51g4E5bDe&Z= z+tlF84vUm1pe`E5pU_*BIS2IFdAvBDM|BaR2NL2mkf1Nx+X!TL56$$ev@z2XYOcBr zFoJ^!?DOu$?~k`>CN1UdVxp|PcE%pG`7qvlxWm1x9pL}WpXE4kxhJHR?$m7owfA#` zYqMjC0Ixz90a{wYTM(V$M&A5%)W6iNsm=koMx2jaY0;2q)$m(>pZI5r%ZU(@v^c`8 zkFRL5*bvrK$9t7MxnB+>pIoL^1TR|RYc$%^E$E%dqn59(@T>VUW#zazZE47^sPrpV z<~DZc?(F$*Hw0E(@s?hz^-kmrNt4?_KW}2`KB&|Oor+6pVZ6_pSH?pS58GzarZ|;% zT6^grFTQ1~#_N;Duz1~s9ti)2ProPK!j8A!g1u8p6{yT@%2ex`^vkl|x-|HRq| zsTcyS4E=?LUaH#GwpiA%g8^jfXi@8?*^?25==ku$eD$JCM_01Q<6(6bEDMk-u zJN3FdBTjYi*PV_PR$#VLkptPe^f>(nN2&b7uR%@2DNw5K{QR^G+Q*SnU6xR;-FX-MRf&Mpnng%K-iL=LP>Y z+v5I*k^gq-{ZBv9zZ`qTiT##;{g}cxA>To3UbNh_CCOv$$^5mXUjT%^Z4{)aNk}ce zd!)`2+uGWXNL+(YuH2inecA;s8Ofw{1yqs==CCcRZ&19gSK;Xi6jyrYfjyM%hd`>{ zzir=QgJwPz&TYg4b-WelPH=Qfq)Wxhlmq~O?KYw0%SY8SOjb+nLD}kJ!-0aCEfe1jtf7UQ))ZwmXeq6CQ9jTHe$KDVLfrTfzyX%29UVdN~`Vo`t@myPL*+E?tadC$3_=VSWMZm5B74vrl7~F zt-QJ0WCuTvpFH3-q(_=fA7?DvHX+L1EnK`CizFT?o(FN5B^?xm@)kY|m90IwGtxiS zxjNe488U=N=PK4&@JkyjX(A;0dIA_|_NaK=8jW`!m6Hyh4NmlC< z5vXN_GZM!#v?5ZqWQ8|E;`Dy0+y4;_+_FCq5ah8ZicB8LOSQaXUDo@rUt`>0#%0^z z6zIR868s0yf9u1);rx$E{0mI&*;%N8zhK^W?r|q?>9E5SHMp`HsLg{@=v+o#;AaxO zKaXTRUWwP5(;Kr-~aMx4snpWH*7lN-C*H3?65IRVN(}hX1Mw4YHy2a+AkdT{)AmIfYngkB1g~8jC zbZv7MiU7ReW*XIu`^dvvmK~YdO-~5m#sY~6PeXkvLbUnO9XMKzP1m@p9XLie_s_}t z`jQNDX0&_qJcSgZb(A9ZhXz_+rRDh>i?b4`vF?CU&jd*~ z+P>qB#lpt45mvx1s+=IZ6l!iYHM-HYjUWWHthk(v`JSo$){>cnraQNc(P|M}EOO?8 zvDDq$`hc5Jrs~hBskIUG-#;<1ssmKfR+_@7OGbZG;36qBkWTV2-^t9fhekwLAeP3v zY>^iXTBq#L?f{YK0uwmtZHB%VaBR6U^^|D7i4m@PuuR5FH;mo-u&LkGH9edJp{8(N z#bxkexGSs4HDA?Ct6-U;&P8PxLzfq(VQ;iAnMuece5YB$R)H*HVrgu2v3Hpisp;bF z-BX~tun{H}o%t?Z-d-NHUtj3+T=~NW0onkI?vA7#y)f$9g_6%{Rp|%!UYQLy&J*~S zaX<%2wD!iIoEV@}ABy0?Mqk`{Q`zI)PHxQH9;95Ir2?0?=^i0>i6wbxc{;-ngD3Pd zRd#2ESK*^^62M*$!LnUy6enz%D_dg3xkEgZ9F+vlfLoMorR9YuK}1}1r)}ZDsygMb zbSJ0V*9{SZ;q@=n1UcM&`qDwy_62yp5j8dKJKvXBcGR-$h zK!btRO>uMrORa&_SUT2>KO+NiXdi^(Hm8yCMvk|g)hhs|1-zTkcrzDJa<#WTJ{#VP zrDK10fc5-A zHytOob*aIe1@El{hbS6~KEZ9W^4Wj*opX_Zt#%RSH6D$g&e4V%s_?^W1i&bg+}A~ zwnP2%-0<=Fa}HWa*kSv7&lf2P?x@Sf{J5`NMHRi2PV*=Y(I4;TagHV4pXBAeuS zyeQj?Z|nY|h?$SK$)s)=(^ASD(=oCvHb&HVg-zMHQyAB_XNo@BCb98!obFRau?yD^ zIW6rxDTFKHrJ8T&0$BRoE_BOUt@h^85NjSob%Tx!&X-_(6B$~-QmyOQKBJ`VE@t}_ z82Rpsq5$CAB8|p(fn_38GRU-dZMH;_y zC5jLP5P4HtHarKO28dNFx-;MD<@9KF@qU6YN+qP|EdY}1c=4PL{%Byv?o+l$R--t-*tG5rF_g2Ha_?Gg8i=%EWoiAVT#IpK?%Zof*|THaV;qB5cH}hTiS;=KSqeNI zpq82f{gG1q#{+SEkX~X5(x(;hoE(&kVq=grx3KO8g`bvcX8^hz75*6T_gQc6@_YRCV-C5S>S+DC`snQltqW zr&^eLqTrTj(*qs$j6T&`3NJBM?Yo1fKv*`-hqpd>2I?4#IR1V9yv*DCkX%KS04vH) zv@4N|2J|0qdw%G7(=RScS$Fd10XhwWCYwW_NzTO+m*EdfGTArIJvB)L3FOUXSPTe7 zLD&ttXYB7C+y-Cpl?Cp*mf@SfnCU`VS@-?m;I3{xzTWe`Mr; zlU1?)PlwU`e>;r6a&Dq`o_kNB8i-gtK4|j3MmQ-yIGwDPC^du7eDs#yDdS_EIbmQi zBRve*=}GIDne%UkAstKdI#>VgPZBFPSJ&f77YVPJniB!HBk{VhKn_M|l9{%Epy|%t z{3$((lMad*e&5G4N-t1exy{muz(M%<)F30F&0{l36anidL$l-QD~(hyxnM)*Y$$~E zmf5$qlh!I)#MBmJ#rS{nFWA@5%K`HrvQEMaP4I z@P4O{?3xU6troFZWG)iesXOTrQF-{fPB=>8v3_`e93^6_( zq>S`Zjd0@dP>WKy{giD@mVw21YRUY{(|Wq{(8+w?b5G2MLXJ0NM~wK0K-0hJ6iF#) z^Y$M$0;oo?=D)@65842A!JhO6PtEJvgrz07z{Y)`gvG$g`Kd%(icqHhmE zOlZHI3Pv%}g2-MQ62;S%>DYdX3ss3)9EdhCnQg7dUkN1S5UfkC$0cDD@+4Wms1%~4 z*)L6`7`oi#muZU15R-{y0;}1z3kw?00H_!yZkB@?6(^1ba8xWIZ0}1FnT*?ng5|Y} zs~hH7>ssM0Z}cqRWSw+~EpSbFE{n2)SgeX+X4$6mA66*2P{nux=MFUE{w8* zeJ&u7+6r9xnryX~cVYo+Vlh4!JKx|eyb?DV1}i?Wn1NJZUa=YR1@|!Ub4cu-ye;=~ z_M>Cbw1NDFEgBJbiau?7m14}8sNxDIOlVh}pHXf#7Pj2jyx6+5+`yv#PZw5tI$N^D zjQp_b4f*UA;HrHiiGJO1Dd^GGW@%X0-7x3tCf1(dP1!4-70GlHz1^;8C9$JmDQ zp&--c>+yatS`D;{I^OaupFt~`ZVYFMhZ*nBBrdujQ40-%%9z+vkehQZ-YKtD3!HN( zgGD#q&1dMl`@q2&n_m`lmR3HGi>Z$JUb;9sr*^16Wwo6qH%WDGR-1l$EQ<3$?0kG4 zjYnTE_ug0o=D>D;0i2D*=GqNj)cb83H$Hk-YYC?DD1E4!fN=e%B(t`P=5K}7oU1A1{dWWmMf-{hcx^U{=*G7(Q&(BfJ z&332X!-Ga_4M}lq zJfW!nJ@@tb1Hs+;7N+Od@pZR>a<7_3IhtXe={-EFO?oO*Kb&!bKxx63QiZwk%X8ap zFILcgZc{cNS29(>&d7B-4>#lfGLdKFfyA3VjZhz*m0TUuj*tCJpWbDz{n-~!6u~_;o6?7eBc*%vb@{NDG&(e)SOn4j#r4W$v@C~K6 zY<&*$G}(&DZ_~?FU(N>7jR0f{*N*a>DE-bvGhZPknR`Y^G;!335{!pHkWCXzf_&%8 zT5YvZsw~*rWeL{D^frQ3Vk>@J`$v+G{LMiGwqNSkSVt^%nPJmjN7gJ?ZxJK~Hf}jl zr7hu$n}BmWjcrj(FP_`+@CN=sjwJ7;N<%#XXJR&`OPHzTic+#fR5{DYc3tM8wx-$i zA_a23`!IoNVJo!qdY!USM+*?KTOux8iFArJI67mUdZf+Y8c;7y#?lF1*Ii^R?Y}ne9 zF@Nv)E0$y^$ibRbdQXh{{Ng3}^$%F#yrD>lEZ_`_GNd~mB8VQ>GUt+k+Y-a=NBIDF z7Q_LK$fBs{4mW>h1`|4)L{daCMGdpmr@GPBq`F4M*cgH)h>0&Wc!Ce6^VKpBb*BVNTK}@~%EOc3>wnAj5r7;zK&*}Yc4-)^PNss#ryVn7heXU+ zQeArbaFJx}_U`$U^uaVmQh!+%T3jL3ni+Rt?y;eKbDz;%LZjFHd7-Bp8AOM;0IYeu z$1;Pq+C1rb&Nq{Ak|oEH5f(wTfH6l$j@>ragstg3Iwi{n%lm@Nbd%a{;EEyCs1ngN zv(U6f2A$IT5?UBRG{Y9Z?T8`5(xK(Ap`YK8#TFTaw>WjI7|(1w(?FIQ!p|-_Kqqq} z@^ln2#`n8F@<%l~lz&Mv=}ZJfC5*aFTIGlf5Ss8w9EvWjijdERA-{0zqs!mr%?x#* z!F^U{Hg~V2%21l+z2f9N(L%rBD7&DR#L4f%r^btNmn37o7QMr66Wc8Q$YvtnS z=Ybn0qlw?Z|EHj^_IRBoC8TU-fbN|GFW~}5ZsFxkd0O3?(YV<~R%3hFXXClf=M|V5 zT@8VY%|4f@wywVIui%+2gRhI1(@%1Ebvx8@h8Omq3w(IS+8T>QM2WCiE&iv|+$BNm z=GBXytz*4L9emv@%o&I85QF)XE}v#g_e)@03zXqKx*9h@*~1nRQfJwfswBjRy|u(L z79W0`7>4(eD*2&d`Io+e=QU@<3GalEN)^1~J{Pd1urMb6>Aj5aw_2B3!R*LFdc7^N z20M+t+)hX`3X8a+b~MJo$mA>tV}+^eu?~n}NQE5SSjDShp=|LR!D?O9_PHteR!S>j zDRygN2`hGG+n^(cKsG}gf8@4RhXSwL<=dM(A_%+MmD#0Us}i$^0p}U z2uT!)&SFE;ngOn~c(Qb6aZJVMr?t1EB#sP5fw##e*`5AD(0IN=Rh#PU#AR#wJa`4{ z6nG`HsMRQ$(HKG5E=m4eDl7WX7ltb3DCO!d=AkvsFuyUjA9`!X7jq{Kd# z&Ty&3D)n2k?p_}Zq~aHjH0^QaOoi~SFFxq%UMfsAKIM6MZxqsxv~+ZCJax1U>6;}ab#9qjINw~nXV zTSIeC2wn#&83}6}yAKmWmw#^Lf4*-AW(a-XQ)<793pFuJf={LzO9D3?Wx3l64JhUt zNAs$>dEmxKCKn(@Iud7;2P@S~2;>p)1`ThL8r`sp_`Do?`)Fc7IsxpE&^*sKj*eK# z9zl6rorqv$&21gMJ&6|=XH znjGa==e_TyLs~EeWe~?yE$OENSuzIo-`|dyVE`$pEky%>O96W`oJoi;mJU)UI z+?87d(h}U7E+&8&f-Bdhys_kPi~FkF#|DgLt_P^8o!3?WoN6tIhr@4IhMctm9(RiX z7f0$l>lh}$TpQyoomFdN9ZeNg<(gKKPby0?JIo!?t?T=jG^9|Grq*GcR{t{MS__Yn zdqH}&iVUt?uIgIbDRc&7mYetn9zLtBTsl+?I;$#ye``e;FkJo>Ff;bd)-*uaiVy#L z3H{5a*zP@bjCOjE!)9kmXW>P5z}XwRL!Uld@vuzQAC(KInU<3-oA7dYWu!jzGO8@? zKCI6{b8b2uP3;Y=*nd7UXya{4z}|YG9*Ha2+dulMTHPqzKO^K%NA)(Ull)F-K z7p?zD_nHM$n(5bKc(Ybv_D2tv%$AN9>@Ss?{{*(iChMZRG2?IN7;3Gv&}TgGZukidkADYlWm1yf#Z&fD`!6Fh-;kaSlUFHxjB8XSo;+T~ zkY4IYTT5;@;RLX@l56wUp*=9c-*c`~69SfrAs}VTc;K%% znFKl64ZrB%{a^CvD)>2RdJK0ZuvHpP4C|XcJ81Oe9pnGh-Gnyk2i^2lL_B>mJ&T6_ zArK4M>zIlTPQwk^!<~o@*8Ep_N27z+{#Dw6=wNQ#5CiK@QiE%81FW;_-x_WOOmK^? zWRn|Ia7Oj`&<~t24~iCRaZDn532IuVQqJE$g8FMPZ%lHi?Dj|Ne`!^Mm@VMF>4-0z zFYs>mD}$2grLW_1)vnAzFq<4x-{Wo&u`+=*wr>H}0<`NAf=5|R^kri_7sGYnU%)$cJ6;t4`? z;e?h*az~KV*;b&CFOd)d^l-YIKRfAWh829@j3vlD{Nnn9*I3PSP5KxHeZer-Rr?jJ zbk8#|$cnzamo)G@X>~oftVK`YZ!c<$e&GL&k*LQtwuk*=B(KE(J0oHLpA`XM%I;to zy$AF3r&7>x535KxD~g!(8X1*>4w&P1=i8K5&kHl@m7jNqeGx8NFv9bCeQ{}h zFdwcS&vqrfo`m{QF`bY1?SMKw3kgAh4gV2qLTCPWH~&< zr~+QhZLE4Wdu>i1mN}b7Z=Tf~l9eQJo43h3ih5_E%f)g|tMWM(obq*Zj`I4)PI|#X8)&5AoXm_6 z5MTvU{qUY8!h{oQuk3!OILK!>?gkH0bWqS$U9L^aRo!bHRm=3{#YX2hV~{mI@K-2f z_bY3jjW;F!IMa#haJSC12r3MbxpF{N(TbIL)tY7FpMrJAk;_PDUruu0lFxq7l{=%D zs_y8o-W~yoya!&k!4zwUBtl-t8st30prM$~+RYU+;C5kPFa%soZv+G;P%{n@;0N5T z{)w?(K0yJV^Bl}~&fd#0pk#DD5UqFSh18BSsdgos@=!IKrKR?5%QL_}<#e6OC$N;` z{@}DVrc{$!P0M4lDb^G~+0OWs!Z{*@QxvuYo9aHDG;dfdHBv{kO}9@j zMXy>A;!3VC*Ek<{hnHWyuZJ`TJ#c#DuCSky5FOp(JP61C9Qw+awI(<-w+t^ zV8tPRE(ULW2#MCRJs`lSF_9%tH~S@wbVPmmy?$Ty2z)?3^mj1&`u%LB+3@m_7_N-P=BIC#$b2XYp!=%h%8ZlhTONqpTSm+y;>+>;bX^oCrKYxEUe;VAp z=I8tNGWw3HD0AXvXJ<2ImYD9jZwd-B4tgn502JBwf>OP3$u$&5*~p=5R-+YS_p0{- zbxiG_J8R=f3Zdai)I(UT>Cy5{K26Kf<8f~^(8>>ydw>({dIs4EVjY?JX1F*vSIi1z_jK;H#Zet-YK3=RbhvrB(1=4m>33zv=?2R!Z1Ha;gDe!?ficA?^KJ#anGu9 z;fGA-qSlm_VwMoqiZ#{;3LIyWpp0NSf&F?QP4(iUCCs+p@V$~(O4Icd*;v|6#y#RG zb@Hunt4_j>2xC~>kOY~Y*IVzIMlsrJCfT~DK7ES*H9kDDzbimr5cDLr+73)BO#uyY zP5RCl@nbG%26jLzZYsorY{Np2xP!MvqLk36Ap8c77!iK2$I1bte(wkIqojS7yvUj} zq)ERI=V$uYRPXs@ma|NIF+|^fphKZk?0cvNcIEySj?)EhIYpj-xr<{XGKGWp?4r@n zoY@03T}T>5JyEwTv2+lf5cz7;N+OFb(fNs6 z5*(e*QkEoP73B$u^CU6b%{(3GVQF&RN2L}Y-A$VKvHJA}X|AitKy9g=y>*NsJ1QU! zLI2=Tg`H*GukHWD?%#Hz4xHmI(%Ww;;Z4?ZvTt=68nc`X*Kn8DpvuPSro~Aaa1ENE}VgeY>6MWH)Wz~f!B4E+w@hYGDy=~5c zC5ITcA!=0a8IK%+2(0x&qgs!>U5y?bM2WYg2?Ofx0d96X6^7zpi?a+aQuh8T>fXDGK$;{Im$bWWlYY?BBmsmY%1O`TO;v@oHzcmP979tDH%(-P*~}i zOK7_9y1SR)1?v!l=of+zff>e_R$+UFteSM9%tpr=JX80owX3?i`pV1;`q%qJ46H;O zxv##LEon&wK#sWjNY=(}d9pVx(uULc9uoTmi7vy;4@y13iajwgDrdgP7L zCNGh>PGP!OeNmgpbTsTR#@ps)a!geAY(5~9N4;m3$)48vc%c4Viyt3s@ubuZZ7(`K^l8b+&;$==+Z0o0e zr8AEPwbn6Ey$m34M(8D)jw8A-kECR43?G`ij=Bgx%svYbt9(L=;Z2CD?1I*DG0|{>kaz0&I^g~cheDf4 zLQWr3Ymddw_?}R~_s_{zX&I{z(=OyE$>8_C=hkS&I* zEMMcna?Rpkbjwz%-bfHhZ?9{GfNprWMg1j>;~)u)RMbzU-c+uLY0(ml%FyCj7rBJo zeZT4=TisZG!LG9sskFq@cps-Y{E-9^6y#J|Zn*$|Rc9h>C|%#aFb8tsi=N&gAY(r&0WTwS}*-`kH=wHrxuPE)f_v6h>PdA&HyVKlXOqj(D`^dNX zYSsAoKKc^2IoX-f3Ko54oHzgj=gsk$_AEXcmXFP-R|d1e79!V4Y-+ri_AP_tzf}nj zwxJ#$;F{Q7zpM;Z&UWpDg`3*LhM!-^F}WYQhT>0rTz{>Fp&~}nCufo`S*O#WcZ~co zn@e^@@BEfOK7^xdUAdd$1!AV-iZG1rUV~bZu+9$ta0Tz3oid=DnFrmth|qkMQU<2O zm`z3PF2BNbW_wie0!?V$RUu!RZwC`@$Yf`yNvG3-l+^#Fr zL-*NlGP2xTd>{Kp7MYVo2!(9HN6ahvyGhj5 zGuAek&CtJ|+?I){J9Zv5*C~HPUz5Dbu6EgziK(#Qs>H38w!osOi7>QrnnI?Ni2@Lc zR$PGBs)+Ij;T@?&zIFmN>+9(Yd%9-}&%PWpa-@k= zTtJe^KX1mC#tx(~@!1)uSz`YuRYOWs{MIQGW^gk3(35!xOn8HbpWh&S;dK`uwyB8I zUy>Y=rRLgRR#|T1PF2Yj`HPQYJ1|(_SHqL|=xjj?%9yAk=c9SCG%n%H!Eq&9j_ZB% zIYsZ`?8g-hPhD?;J*7rB>UvGuuMq+sKhzkjNN%CUc4W>V=RY;v*Z&eEQNiXxp#!iy z#X(wpIC3$^7xosKX^5@wBdc7?FpG?5?Jfc)Z~><@wxUVIdX(@OuG@OBgx2SfY%vid z&5>oK6%|dEs*D#B7kU)0_ouc?Ix5#EgSv&GkMg1*z6^St9Wh`2(q|xyD|j&l z`LcRnHEXcmY+liz4@dHD`WiV{MrLFCcckEYpM5a{?P18Heed^|d$edeG5T0D1cP<` z)JpR>$c^8^ptVam+9bZ?o+xuC5#t0G0=<}I&+G;Dm_DP41mxmatTd*LuV*8N>QJW= zSn!raVsjVzf}zv)w%AS+Megch+=f!rpCY5~bg28Itfs!RGvP*m)?bf% z{;P7N-!Tud=%3U%0PBAzR-FGKR)d=VuY;qOK><)E6Zfue`EM&^gxln6$sFwrgXKw% zoYx8_$?Zy*XFjK_mrLbIovu75;?EZyCm?RtR@h2gjRhgApl3~QX4>=iVM;|P*rv5H zPk-+X%WI>ltfDC#{nw7pY%Q6yZ@-jUT3$}z=hEH$75Kh=6*?C66{VEhS4$T>;Gi) zl6Zq+Qc;PG2UntW<}F{#E$an^hS)qnd12A9NSC2vNnF$T9Zz#YHCF2rB}415T*<1e zDLq*mMI;5nhCBEU%2-39l;??DD{Fs!>4r-hH$-1``LefJ8)s_K!5Nd*C&c^0i*1k- zMEYIlR`0Xm{BfF8Rgy$cRcpyIB1-;{D9*4iAOsIu2Bh+e>ST;^F1mV0btY#A>(n-U zm(MR*NF&qSy_RyNa3z~utb(Q-u=WN$z&DqNx>4`DP54~Hn-T{3cV7rOP&exooWpg; zhVH>+wN$h=!sc?WTA}Te%&>6E=?}2j=B_$77-Vl4_aIbz9H2++e6^|5kaktiYkhUH7G5WV>rEFurmdi4n5hs6s07Y1 zsN}if%#iMB0Er|%(WAm#N`9I{0TP-r6m2Ai@Uy%@VlUA@oZ5!kWl0 z+OJbIdis;e0bEY+;kk?6?vae#j(Tfgge{HeNcN^t({E=~uvP3{ITRdYLfJY@?+B{y zLYm+)vX101$@P4kV7(c3iio*Kl~Is<%O>%rGPOp_ieb6Rg}VjC8>UP-iS++0g*;aA zc~Oo278e^7H)gMB(`q-Rm@#37UuxIVgeFB2RG*z0_^xoKHHCp> zTv)E&ub*;exe@>Qqh1DfB%9NmlflodIjp7}yXI!ko204$0Y_|i3`?184T@#2Fw}AN zER6FizEfFN;4IHEt*o)+VcOaUk+unK4F~a53-#ktCNLH%I-5^uN{aMoVX+994u3-i@Zfi_vL{UNfp| zU5A_C0rTJ@;7$ZvYf@-@3qm1%u*p$Zx&29*16Ew*)O5yhC*2Rf=#bV(wNSIv+hzjQ zIomavJy{w@Kn2?x;rM!Oh}{eN9=HSDk&0L}(^@U5n&~}HzcDyQmb`kciXz6zVM(;m z2(vmDDc5E&f=)fpPCn21G+iGTbmO*CwVv)DLTiPrI(Y6Kkl z1fdE8v=|&4KhQ2OR`fS}bGUMf@^mC>KJ^3sFx>+y(5r8aQDs~qQ2uUxDlIk4_+aL0 zmct=7IJ=Y6t|9EU$$mMEy~!-Dj#aRBtQa^USXpvlq3L^vpKZwmb3#YK6~&{i-Q5!S zX??Qf_7hva^^W_$INf?;|KuhthhagRG)y=O4 z$Jd=m@eWM#TiyRH;fqf4my;wg?8<=3tC|kLS+f4=R??$H&|+OuxB$G8mAj`TdigP1 z6YPr87{FI*!QPa_$HTOYkqt`(!+8h!(Rkui;&bTnF)s2?xN11DB!YAy%aQW2Y%k9Dh)!imT+XlcZw3WbLQ zRg;2QC`yRVOmoN?t;Nk-IMY2ZQSRV4aSMVaG#LhQT|?c0rB2rxXk$=&=ML|(n?uTh zRZHI{`!V%%=2`N9N`&#iUv0N-cs<0GDbhF?g@MP@0EXkF;Jh>A;Z^V9?rQUc72(to z9nSDdgNneH6}Y^0Nw;FG$OVT1S|4T%^57#+Ta7D`hZyLq^lEmiNq4{T_pgpA`Ji*v z)A79K)XXmq?UCOBJ zK1F_6i0q+~?PTOez~lg?-kz}%I#5s1RCMZS8F~jS;&X8iIM{T zX&Y?Ne@{;n+>tt$(Dwt>2>hH{=Ep-d!!swaLpuM#Ie3)}(g*?syMlPw2~LZdt(5sd zQuv5KvL}1AeX5OrIHx0gx;CgWZZ+H%4`3#)jh~N?_W_)fTqXeS@$^bS5AR^&SMqTV z4^^d0V{*E%o?fH?{6LVDTMc9Wd|_Z{>EdBS4`_SrQu$h?beCU2+J2RVo=ZLmzogU@ z$}}=*(K}iVw|mHs+?M11`k8l0kvm;zP|^hliY+(9I~kgGlPP~-3{gp_@>6m>F@l2$ zMBnlh*4?he^z?k}b*P9$TxJaDqU+mfwM$tt(GLSMNUb0~M2xsPcVg^c>9BY)&G&f( zXnYhsC_kiu*c9gL;d2enF=lgZap`ms%f(Nqc|MKJ63wO zzCK5`HgdLoeoAK9(|g&A)H&L-*$%0UUF7yqg5|+Y=7>03p)et;nFa-A8SK#j{oj3U zzx01TrfS@3cDB3TiUPZmoE9lG!4up6P%3q&n}VrDO3I&D%-cC(mP!*LxY{(B<>Ec+ zW`5|Bo!*a{Gw0+*)k8Rt?R3f9Qlr$uiQsB>VH=zUXW}#Xln7fvVr=l~N*ANE&d4$p zQ9V(+P^md#Zf^cyV>w_|WsW+GaWlr`Pt~Ty67cP?EYdwoq@_ICkvqYncM_d6c-tr` zj*Z!i$7IWxPiN+f|GLKN_w3M>3~22{eHxWfRccv)Xgt4bH!-T)LE) z7JFhw>?7_LR+h0@M-XI)5v5D48CkSRUMe?~L=oJQ&XZJOyGTu&@erzPNUDhgCj{Vb zTLt8A(5OVQoH#ERHdfJm%D+>6`FjK~(RSjgf#%?epvJI)ZH?0ZT1d0Eo|Za*GIlLKX2-z`pBn@O-SLR1P|Rn>h6$wKhfOKXRBA z1RUC*Sb288g)&UyRA-qs3ASmvY|->kn4rJ^etXnf ztozb}`cT?0C%fb}qdZ(R%!yQ0ZfQ-sJRzI(xhjS8x4#ZT)HZA3mbb*8MO*nYbaG|G{!?RZrStf+!NRXBM<|u^;Z49t! zW?yK8Ut)ucaFsf&=HiFCgHW~80RdXTa_Z#dG7)4a7N9x>S*=p>{3kf$^BBsHkVzER zSo*gj?Z9{RoXI`}=^pwy*nRz{#{VyNAZ!K?x|DxneLjN!edOZ)pI!FCM_u&~PKz9_<_xI6JJXvy7&i9BZ~$b~SZzA3qswRsZ<)*0PfcKN*{w z`@96AyaJNNX`z0imXdi$4 z%nSwWf`q}R-g(RU{a-q4M1jh42=}vz`H-tTXb<~cNyTKI=7Y*^>{C+7o~#`9xP#vV z?R@oJxSH+d6Xp39?6S&FhGHvAN~(-w^Cmh3aEF1l?_b{)HCNP{gA?kt))x& zr_aA{p1$Diu5(YBCef-~Q^Ibznh8Hlz8vTh{P@K4zM$c6*@OFIO!%TVF(LecCP(;9TJzvcR@g-H1daAzuvJL2kuyV{8X0u1!Hqrmt<+o!dUgdY+ zK!^DQA8f_-%qM_V({mShDVgL;IRet*n=kz9#OU~NVPxdfiQc0oacDIBklbOKJRD78 zin0=5V8u?s>YGE# zHFE|ld$J=F3)(zBJ^f|BpVkeG4L(#9wX+tuZ0vud=w!gV07U+l@Bm(QXK%^&QY=%H z(r!}DDlin?Vdqq&q+3zy(N*|Yw4mcfdMaV)5wu6?cWYn>SJd#Y3!bg5z?Ws27(- z?4!F9Dx?5{24nGWB~VYYX6D3w4(oD-UFcWTcJ_6_IikRA>qx;_y9#r|x?0Q3Y8fcJ zVp@1s3*jz!7em8H4>96F9l>zW_g0`%YPQDADqGm8$s!SPF0eF7*p_~^7jUh!w(xiQ zKWvZ+=hPKRBOroq)b!&P!akH~hQZ60m_!Z2!Ww~_l)o~N7TO~gUQ=+;!$WY{#WwIn zr?>}Erc|Uy_sW+mBf?(y0HuFG(m>1=gm>=X>VUlJb>`AbobST*z;9ygD6~bIiWie7$_7L>r?%*^ME-m=%trt6gbK z1I#!eVau#=5t#_42vp+5(A4ca4iTq6l(3(~y7DfoYcgeuxI;WN#27#jo;h@Nf((1r z%P=zE6jbRsrf3BWE%>dJVYwvy@xvjO-fr7G3%LNZ?Ta0W_sh-HP5!~Zzeu;std{bt zSHg>=%CyTedx=ch&wh($L&5KF{LnSDjZBLc_eN9EmX0%+EEtKeU*iKh3A>3J^C^;b z-$JXdy51|exm6#uwBFPaxaslvjlkxgH+yH0{2{$4iouGk^JBkVumy-@P}4T$p6nF+&p!LE`^{ny~A?(+mv{r42}W zElM;9vsqY?U|nJWtybhZGmlpRe+W0M(q5olDp#Y%3<;vNDDYH5XOT#+biI@vs_7k)tobUbCMk_lc#_U{^NL0 zQkS4lhLvIiU5!Gh4J~fT2pmjIDMp?(ZWld+n)n+vFXpd5V(%YzdA2|Q#^mp9gK>NCpdGRkKwC6#{S)MTB zDL6Oq8dg$?NG_^@lNKQ_ovH^IQ6ZM2_&KlB$4f~;EfU}BzAXTw7=$t zoE_?r4?uMNGn^WXv4{>2g4TYB9EJ;PoA9*30CvOB^K)&uKM0)?1_j+{?&ZtDM1TtdU5V%lGrTZ%=)FS5b~^Nc$46etW>^=yAj;9Ngn&I(#X> zKRCR_^xJLVs_Sd){a7=%j7feTn0hQsjAgYWc++^4lXH#w9Hl^Z^~eX07M#3JrX6|; zR2OVySLQt01^)Z|*c&i_%H^=*uVStr4~q;36$Nz^s0eh*O7ifR842K_GC$~aSR5}U znJtxxl4Efi?JWbjIs=)-e@ufUYehCMe{)kZkN}z`*R1!7_^+heRhaI&7|P7*E|RJ|#HTm5L1e52zxHMB=kO!7El=I!{-a;<~7B$5gI z_x;BSqu+O&ngaHpORZk-NVn8HMxquE#CvA@2ALL(ke$<}NVy7yhRDEEgUZ`&d{~y0 z6fiA(91$6-$1(ATHxzNmfW*el9g0JkrC&4#gXG-g`jgsz7rfva)E}0)rAGU#3Q$x= zCYtBF>i5?h!9%4?qUtzcNz@Gx(KXDkcBse=fxjQNxybA$#^a`hYP;v29kG)TXMeDB zJXh}U&RZ|VDP>MpO^z=crz#cZrm8>Bj?63?sm19adnm^OUU>iFNRP4{T^Nd9>p!L9(=g625McHiS$_fddcQu zoR0V?KxQmEUqXQ+Ky{LNOIo+=9B9hhFZs;R3tV;R>xCc@zY@e9JDT;cIb&NLAEd;A znrP6!BUf$tYA#|dgYrsyIqJ6Rw4Cd!J$51Tf%9byvJm8$t-4;WDYm|1r&8x42EH^s zJ|!tkcPk3?KSf=i|5erkak2jk9S#U+pZ))*dHhdI$fA~(9qtJBzi5D;-eN>&7&Gpa zEG>O*1?M_=jdDxs=tnfB$8i!V2k3am%kTH>wWCR2R0KvLT9La5A;**Y6W)J^Yfgs{ zb8aZRQjTy`a09$QdY0`ZTYm=8hmVMPcmmSqS;nMG(l8ia9xp6E?`+#VGqtAEVgXQUIEtneep)g6)0zgA)Yvf*K*_Eb zT?;|J4N-oz!gH7wVJ$a-Ie5z9ZV~f)SKYpX-}dhgO6(aX&g%0?~fgp z%-`}ZYJQ`WhxBhwkkGVP2|XVxm-qWHt^%ieT>{*^9)7RSYn)rXcG(TWiJ0m;^XxxQ zOaxyYc>#X6rP+%Q7*4|vF&-#a4_KMzF(aS(W&=mwpB^veAAD|(URqJf5k3U`LkKS( z)4VDT+(N+IZ(w@--!6`9z`nEtUb{aY4vxMqjy_Kh84qUAvr!Vd(-a5jC1=Jp6=Rp> z*-;WxqBkQEdJNk-J7@(RA3a|>teSxLTSfj4mY8m2!Kdt~?yEPTMP69oayOM3v!_mI zGO-#rC`da92G0tt`@CFKLiLt`u(5l~*NdZniO@HVbLdE53;}GyiHJB*X$#M&{qr5~ zE!(R1IyX~KLOFXSNXBXcickls3PtP)aiG8fJb+te+sGGDEr3O2F|Mr+)LkcfjTBQ6$DX_WaL8~{LF_ODGzfgrzU16RgdRcE5Ca}U7#OaWnFu2WSNvCJp) zq>%+4B|0xdiTVYY%b9tk>;Hw*kXutC@<~IP)IW=WXk=>`-;*s`jHHyqn5&0tq;@F_ zHd$8~=}_c6 zdSwf$p)us3f(}!bIepJorfS+7h-rBM76j=~X2>oa@ox$;X|)Gv4X_GDphxEk@8O}b z$M16e%`U<)przKxrU1}{CC`)ZvZz5p>J{E#f6i(~xDPfRL&;(bii!>6VT~6$ zEJFh`l7j0vi!y1XfPk0&FjDLN`;I3lnXwsN7$p-PnP+)3Q42~G>K;l%={MSXA)Xz6 z9QtOGT=H~E?=o}B3C7B8@4Um50^29_EQ^(S9Y_dheAZ%TBNPvdUlx9I3L?#I5 z|Haog25Ay>T~2%2wr$(CIo;E?ZQHhO+qP}vY1`B8?eE>)*dP1t{;0^Ps>rImSs9sG z_uP9Z5oFfRq$evUmi;>zZ0jn08ze>G;`XBnUUt-l=ZpRY0_ClhrEDztI=-eb_w5{?|d zvd}wNuqv?L_+Pu$XC9ujk&aH>n(>=pCQ>nRR>WXKm!!%0Ik`40&rkdTT^vZ$T;VZs ztmhu1C)DS1KB!|yDA|5AOqvF%D`f~;Bs#_rM_%S){;+JQ4AA2E1o@PO^>PNj>Z!!1 zi}lr_pB+8O;y)x6K~O@iIPF0Ov2fdyIeIPLB%aq<85_#i=Ce;FD8&pLrKofhz(!DV zeX99B#d{*2LNxv~C|y}_(QOA91e8(%yoeZorCUNIqmWiaNzAVXqw`DH#y++(hy0ij%n~Kp9Tyxvrer;Pt;6cV#}SWeQIordX@8E@QIT!Jn4c zT&hFu31ty~nqwwYF8bF}XmwGx2%V z@u>X_Z%N6>k|&mlU1vYhtnz-c?1fJ_Mr?5zIC*!WO6#j;~{D>2Ce0(q>=IpOD5*fs$!Uk&*im} zv3BDg7#tN_GWLG4qV-%iSXDlHf`A$BFtv?bMALSddZqf^fL{1!urc8h={TicHHMtL zM16vGD~cx3{%W6x_O(EG@j>}3nY%=$$_JF*1IbbuPkp=G3u;{mozUzSr4Eo~8j~ar zkYx-rj)#`~s2KKp=dUCJ-RxD)=AyaN4>MEIRy-Z-P;U(jN3%|nI1*Nm; z-LmVaBReF9ApL|otpX6AegSAOupuTu;tU0`;!?!&BsFPzQOV}qy$etusw7Vw#TR(W zix#2E^#ql3U^1)0R75$XX8d4xRqfXT1(?lR3@k)i2RQNi-~(OPEM#14e{n^XncZBk z?u&T*9z-~$&;R*B50+!VVi6wft&xfSWHy=D135{0cZRYHFbtw*k6IkM$l`Vj8YMGV zESP{XOOwzSAwWs}T7oV{nG;}9;cdG^C}_(QCZ4sU*$cfc(UALGSCa(oJsxJQKuFL# zxNb>8+TP1_vI}dXxH^-av7!WmpG+BdJ0g)ev6sAIyb@(L%RG)ZYjL!YYK;04Hcv_R zM#7}OXi+#ig z+XUmV*CdyG>W_d*?F=7DZS#aNZc|&>YtJ!bFs@^Pfn^KC+YVnQ^-9` zvIqIZa5fQ$xqmjTVe%6X$aWAuNiM4-$(GFfHSxHkiQ4sFHf=;~ZWio0|Cdev##CR^ zgC)Z3sZ=C{G5b_AVw_Y41)qX=(TgqG}&WSAQXFs7Yt zDWYRU<=>#Yfkv4M#YdPasMv#gMd`z=#nCM9zLcrjv0P?fF2MWbAN`92pTgCt-~Vlf z-`}cHf%PA_8w30Q^E2@up0OnjP1_$&gb#k*cb+r6MW`&c`5Q}F z3=VXntYE^TNv}_6hZ5`6tF?w7Tb&FZo)6cqD;?+C(*@O2&Ow*NqsJxS*Q-uf&PAxv zC&x4U(E<9IXD{AQM$bG6)dUCs@&%JlYB0p+%J7nqtHAMYruk^)^@Js-A29gQ^Oe{|r7hvZ+UpMt{8?=$#^7 zsUqYx+9U}zm8ESYO~$Ap|0IBDCfDHm<jbm({@njm&$18wi8qX(LEfU{RAqG8uez!jX~CsG73q| zhYv4zZ?1P&mk;l+4ueDM6f#+v&5@l^bGAhdrdpV7(&602%y;>IulBcn@tEJZLFeT& zIS(<|+vGP-AJL|uW0_6BN7?5*i|#*y9w*tq`YWS@SIx$R^?sC==nG{3&J@hH7SEh> zUl}2V_0bZ*A{mQ-kT`1l0&8^4>vpa0rMtTGKO=fAN61t%@CrjP%`G}11koB};WAbJ zWrMqpKZKjfCUx)JMXI|#f_rgqpnU4YQ2Cf?v!=~G_DEi)uPaz@ex?%`XE!%ei{3lt zu8nQ2i3JW<#bBb8kcd~LPL;72S^+~J%1MA?2&O`MxH=u^$NRLM!y@rZg@oS?8TB7| zenLc9LlMCpBNsIPEs})lsNLj;#JG~|(UP7D8M+oioR`lagavF}cSdy?*>VURuZYA< zBbbZZ9{{XZb}03m43$s{Cd$do9<*YHk_G+vJ2f`NDG$tDF1W8^j)W-y0^NE(;D$s5 zOk9fKIw%rE3@1Q}@mFr>#7I|Qq=s?-w_rpP2pt_t3Bi;)fmrB2tN8$}ScI}9(4KO^ z0E=L32NM4T!b9Mt^mw3S+`qSLRN%T~pSLdAu&~v65=er1*ZC;rg3)URpodJXi11*c zU@N?uVZSeiBMcbhKJbV7RXk7oU9TKuj8#mxsrJZC*FY zWC7Ni&Xos`-yl(`SgZMsf&DAmyqt|`uIR;?SR@GK)Jm7nX8aO22Hg>pAM3jV-+wb9 z2VE|ltEa2_o<3a4dpUAz3rixKy}MSH#{e)oO10qAJr@f>>4`_1daK1(W;b9&k1+D)2PGJyP4Roz?L4^S2j%)V};!v3`};2yfucWAYVpGGT4Ug3tynhZ-Wp>S~-i(|^F zPX^s7)7lg|9>DA}#gkuCS79)KJ2yvm8H;Te6q=L?cB#*Y zrj$DLaUR*c*MfibXn@f*$ON~yyFnTEmMq+TACIWwD~_!QXO8y&pxrlz;413>Uqj9I7Z`{8wMTQf^rX7|ga^TlUX~l=cH9sSY zA@xlh;Wg0h=&uX>V}E%m?6%L*U7ng%{=&~rd5u|i@EI-;2P zKAtXOzdxRtV~ZP+)o$6@@4nX<8wUBP&RLtTfUO^WMQ>wuF#>#jUe0ddds8{i6Sgl{ z;F%YsOXNYH9vJP|04nZ+E19%|4O*M5*(Qs2R!?tKplnUAIVu8o-F*6bJgdb+!jb7@H)%(P9>&FjoAjLTNR658cCR!ShvPmV~1E`j5Xn?%D6*J zcWJg~6SpgM(Ijm*T2@H2yYO37Fm~MMa71-~g};@Nrq&Yy7L-~( zCcV#XS87zq7vp%-74_-K5lY(3Wb@va%ZG_db?nM+9Zx;#YBQ6@#%8fitEgpZ;A}RP zYDLo-mpMi#AqR%0_Dl5j`(-&wiV(E0g z(u^Ly=^xL(=|aDM1OWc;X>pGZKXu_}S`_$E>-c{nmj59qyHwZw;Uh-*q@UxJS%jww zo-Tcf)8|wmc?D9Bu$XUnM6G+2_`w{0|6mR@1<vMHk}emhy8FN0@e;m9~ol5u+k z;fP^i_J7pLCEbW5>pMrV$JZX zhJa4B6U+c4^%4cDH3kA(SKw0tNb7M#m)wwT*tOjZa?RO8`GA8O1Tl`0c@VT2xl&8= zA^We$8gOkv^texyftp8pAZ<^e95Q*nDl=fNe_p*_4R?kOo?P5lhP&c`8iu=oc0Uu8 z(ir`-h80EQZKb9d%Dl}Q1}sRVR(Jc`W9}P1jgwAPX+uNi^ILE z)uC;7x=0W473X3WrBm?}Z9-=N`r06PLbz!?OQfmK)#Sf`W3{XHn_$e0)0qF95$m>VDO=GMB&1ZX(Nv zdb9KJzbu+oHv^d%jnW^v!O62wy`Mz>f+e#OPj46@7yV+<)xMt?YFw!*m{Z&z--CMbis zn8U({ohPT?y~7zZgb!XhY4ACF4r$I{ZGlqn?WkytqE{mYJnPwxeguEU86FDMk1XnM zK+(TiLUhOw*MrtMeZK&+v$J!TtZ^1{urt)IIh|C%Sz-WL&lFy+rv&-FbLX+{`3%Lp@1$INUSnm6Ns zJe=_0L^{??@`4hodGt&6%7jJrLLg%AY?YPB6ZdF5+x_}RCt#vR5WHhS!3af61=av& zH5h`TmqFXR$>M+Vp4te*_|(Xk{B@j{arMs<7_NR$Q~0SVCvKpB`RT&Mx73M(Mc-aIOy)uph8>TNH1~`uQoE#lFQ=wH)-m756HZzzPWgvUbgCJ z#Rc1cR^#Q(%+{5q|JSlhOUFms+WK|);QKYp=gHSzg+Egg>Cw@)J|MoB*?qMdIlQ^M z)9dT_+~LFA4!NV1J#EU~7%6JU=IQ9`VsG!P_7m|0CA=FuNYV3c;=sC{vis#?E?OySla3)`(fjGadv2;Xo$+FEpxd z-QNAQyyJqZazHLWP(=lx+U~LKdWv?VhHm%~SgH#H(99-K0BpUzoqODVQjP-KWEOa2 zD_N!zD#BhYb(j96)}l{)iiQ9!GRfa_MBE4U{xfn}siA`^V4+Ijkc(uPsbt#S;o8{r z;qkWiB|ygllT=jE$Rbn34Ay{D=iqD0Skb*$4idy5qih-RX=&B@B~e;a8(Z^pm^{2W zc+jyuTts%vR7iDsybbR!4vN!1$HKehT{~M1ig@}!fS>t)sWP~Q0Z)}wZ$Y1Z5 zaz8wb14{rGfyrTvjvRAk%a;gBY838M+Nc zSJc@$xZ|vU>3EbLwYv17ErF#jjtKrMs7LiEm0h#3?F>$eZoWtBV*hKi?-Pg$?!i-G zYI{EXQF?`jh=t=Gu<6T{7;C-fF}vi4fgdU?eLcrL(-AsUdMJSFwT7kiZ+MvLMXU*G zcPxNvB7p|%iEgnV494Nt8*OS5xN+K%zUq;E3YzNQ+sT?&F*K4Pwg#H&0xC$uKuAn4 zV!FwqsR$O}z%!YNS23JJ&id#AiAJhfB6e(qC^16Uq!LBcRMFpZ$|g2qjT$|Qx#%a5 zem|m1FCissQMw4z$9a}#)rSJebqjUZF)a5Hn)gujXqZiYcSM3VRyz8H9EC$T_Kgz=7M!)GQbFZ;g*v#zP=-oc_f*n}Z5_lqccWDC*thI9 z^A1#Nf$$Fc+U|8fgl|7K3W3FSW@IL{?i&vDb1V$&vTJ3?m>w2?XhP}D-QN^o0$ z6snk62}UIGLQ@WiL+pWr0tI)r2upC>B)p{Hmij}h36Js`7!+Y!51mNw(-vn_CPoBP zQjJxO^wCr`axfe^OB%FOj9^B}tWZ>pF_T|>6@-a)yp-gOI~$UcJb6{vg7m3iD^UV` zAkWxp`y2=;U3=H6B=ACpMeXNNi>#GrkeQ78yY9{7-N76&QqGM~rr52A?uZfvky09A zuorR7$Z8w$NxL65cm_Km5^>g3qiE-UED31c0V%bOD9R{ke^7$Y{j)f*=?HsMkHr8W z$r_Zlng1DGqd%idAvq7rZVO9^ZMBb(C$p-HEBY3mm9`+;fxv`)If4JGA$2 zbh*SlFL{jO!2Q6P=cG!600pTr2C8CKa6O@=WeE}(qZf?1R+4$bk$KWXKZY`7Ad6H2 zQ*1;6S#^X?4HCG!mMY_mTvRHc&dDI}P#6jxzyQGvISEBZ=|;sis*16|)UaqN-(tP^ zwT&S$Np{M}vDRlIGAOcza3Du7)3vx^G~F9|-L=Bm$m&6UjPBgm?=gD7uAuX_%vO)$ z_SWKn;?A2cKeOlPZ=Xf8sO>t8$P+iv;p*{J(zEWN_Fd=9Dl0a_MCD`)jYQxdL@J*dTt`| zpdHIHxm7#>8A?Cv{gjc%GMW;w&)wzO<1FK{TK)Oz^&Hq>-u12fef0VLik-&l^R>O( z{e98<$KkQ?^>SMi_dTr-5IIejA`67SX z4(pKVMPW!Qy(mYz^A?Se3(*Aji3`1UN%2a$6V|CS$bg`cN^HwmO)aD|F=iCTC`u?z z^%368%@zl678~gjn;Rf1eGp3_Z%B48zfZh+ zuU=LV71>TPqa!;rR7o>1!gi7w&n8XGJXkSfEP{yrG*e)$!cv6FGA?lp9R$Me0xBYQ zJv*CWxG*29D_gU>3{1s951cw!Bn8#REd}a;B$3N^gpeF0zN^iK>J&Zf^*K*3q#JXo{*#C zb1R2vWHrJlHjNN5dBV8_sC_nRB0apijvRQb2Su`j7G`Io9(gztwDr@2u-Yk%^<;5S zAmBAWzy9MqkJvKI>2_1O>18-Q`VtJ}h_}M-J)gfXC2ZTBAR)Id>fHx4Vk+G)qdRQ6 z3eqYN^RKFBXA?t9WD$2obUJqcWxF#G)D=-5AZ%X5r_K^bHeyXyqVLqggrG8l4xAaf zhIh;1D8Cf=Ua$KjMt&gp?qd7pW2}NrR@6$}TpANw(LLY6&#J(cdlK0Gvy%*AyN=#t z1g#`($KP_mt2hD36|A9qEPB&~P-1keI0apw2+ME648Rjetb8s#Z%)tNnTUP#!AMjc z4!p>YPtiipkgF*#(+U8XDyCoDSByXp zvJa7EXsudkjC!Ys|2|x(^gQ5-JGEbGl1H#b3AKhMNkCRzSS_e;qCc?PUC;dyz(wHj zno4zsSoc6ECTUc- zhv}h;ZMYPN^}ZxGXhrx&y&YLIXIY2*)RM(|D%1UXGYBu3lHAL%z)aO!#W7f-hXv+3 zPqk)*FGh-fD_&grgecP$iy^oX;8n5TIq1JF8$h{%e&;mSCHgf~tuP`OTr`1_tQVJq zOj>@I0%sNuY#vpLLkwz?iMTa&3_BhNH3{?E3{p|bFN;em&0Q)xnk3SP=5}V%+KnDtJlz&~ zJDhgOB=S+t3j5Wj9-6MZsxgu=B9sc+p1Cv{ovrc-=i!Ybq8yvD(;eM4V3W@>^WiH)f; zUv=PPASBhr5n=%=)q}Iyx=UD_%p95Yn{1_oY&)D2RT;(jO55(9g^AkXOu}dpG%eVm zIy>qJF$ZSrI4ThT0n4pBYm~)p`s8pePr>q4088zHf!a;j+GLq$X$lHHgt?MPz#24Y zYgiO-aaZhkX{-u7WgUl=np)iHcQ6Z`Q>shsRK&t1TPj{X)}%IHJ(+RTrR_lM7*i^$gT&eOM;W4x;1RCKf~dU#~Yl-=@C$$D$ZJ zq9~Cj^*VbZ33+86)?AIz=8aM|R7ij08<=byUyHBH zN2CtS6j~BGQMS5x*?9aukEge7!&QSf`hxE6k4`Q&DDGfe5MFrS6(^3;oAl?`*Az=4C|{KK=lS~7 z$|+aVt*^j4+v`F+V6q=V+VJFuVolf~Kz=BEk^Df+RZ-G!h(*|?hi>Z`*I~obim}$U z2Av_x1XozWY~!>7fPZ5SqG9)TLOI;X*lAHDyi}|P2-YfeMtuQJ{djWO25aq6-F@mbHhG1>{kRk$hsU4syV~+T}cG{$s6uwXpE!DBnX-ERe-*&A-nv z0qkQ_O-KPq55rSz;cNh`>{X_}wX413tOndLC5_k#DQ*7P_RibHk+UqL%xx+dWn4@ag`O6xCgl%-eWbLo+$(mPdzFa z8>hc8gBGl+r~cq@nakOm$&=3s0t|Z-Q4arVjagz}6izWQZj;RR_1F6@G)_>$8O}=Q z`k;wzafwn(pB!piQeO;8RI4U@o=s*-!@uuO{+{pI@3-&I>0aM&+wag-osroV)D1)v z0>^rUixdLX$ufimsEdh;l)PEl9MpQnabf5)dx8lz#S37?uZ^NM7lnsD zm{kA~o{os~b%_sBGpA#IJ0?51rQaU5)Ur6P+A8{Ap{`9}QlxiqYoUlyq;17{(BWE8 zl)~Rf1Pb7j&CtSnErK_5uD8MeP_}Zbya>`vo|x-NSN?!~g++VH@>Ttk5;C4nRrm3; zeObhP1~h)GsnCS*(NP8EsZpV(hT@}l9rUNt=ipw3asTcToR+DGRl?(0hjop8&dtKP z=G*pN|M;8pX*<-}EBJVB^RD~v&=(8JO4uXwi@ffAqLNCG+%y>ksUyNO_f7+!f7AT< zVu~a;qMQZx2DKu7YaIbuLs8eJLs?RnHd$(bfL(oK>Ii9`px%89?ca-8XvGXDM6E)! z5#PIhE0BU=Kqusw71}m31JunG->?pe-!!_*v@iIs#Af4Ga>=>YvsPt*R_0#DZJ_Hw zUrE)aoTZ&`(7=XjG8VN$b8sn5lQP!fXlr*YuXNn|x)m85mK5dDDHx&sbiK8BUMQ`g z=jfRP+x5kAR<*sJ*Hw!GZ`fC*qxHme+8>Ygtd=Zqa<}nTbLkx$tkW*2Thqx3u1f30 zl<_}Af|k?flMmF>sN02(B#1T>KG2GLq>=8b|{WlLwF_?+GhO0xIW1ptdrkP;;n$y=D;tvc~j9EFAS%^9qN4bf+R@ywv4nG39}Q|5^ix5Ir(VqjXyfeu9mOmSoXu#jv3J1fTIL~9}U0rbvJEhSCBFw?fJT23vJq=sP?2-<#kajlE z$_iiRpcU;d@b{GK7${#Q*nOaMJI?zTm@sLw5In!+ADpymjC{hAul+TMje>GQe)m!( zqr^YpbhSwXh&90{2h@9|1M&3W|#FT-3O2Cck1Me`~EMurD*m6pTQP%)B?t z{5dg@L#2<#@e-lLLC(u5CV?*BV5ziM4m+ll^ra0`8W@%bNoWz_MJIu#Qw5FEJGOQyt|CH_VO<5CifQEUjNiI*8c^3D zj9_j>n(;|S(;D|*!Y!O?7%q{`>URoNfXamgj&y3HGe-cR#7G{C{MN*pbsxi><=LeP z_kcLe+{1k`!u=t4%(Fj!M>9pR$d{|ZMAW<=4^#FjqyqDxHfd6^RIZ+8uMQ^-P?Un_ zB1VV1xOi1v`-n21BQ$}G#Q`sTXy0_P83Kn2SAtGO*+3Rp)u7K2Zs!&GrPhi}ucNS= z-!8HFLV=Lf38+gw0D~m+@@An}1XI2l6)qxs@D8VW1PdQ;Nof}&{3`?2`NJ4PFY7(M zu+Jci%w*H&A^iy=qw*NAIez@Bheeo9QRkpYAE}H z3dlh|wNgaT9QZCs=E3*oUs!+z?D=30&RIE!c{g-obp`X3_)JOmMoaMLfZO$Cop5E$G#s` zsyf{8<)cn*w7}qS+x!(&0C0yRIi`m{RzV6_w1kUoxgCgv%y}sIHA@Te#GL>BzV+

QGD40m&EGUa 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 AFaQ7m literal 0 HcmV?d00001 From 817b33e13361c5cc4400babbdde8b02ebbac5315 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 14:12:05 +0800 Subject: [PATCH 03/24] docs: add gitee and gitlink website in readme --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5b5c1d8..49d0a34 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # THUAI6 清华大学第六届人工智能挑战赛电子系赛道(原电子系第 24 届队式程序设计大赛 teamstyle24) +Gitee 镜像地址:[THUAI6: Gitee Image](https://gitee.com/eesast/THUAI6) + +GitLink 镜像地址:[THUAI6: GitLink Image](https://www.gitlink.org.cn/EESAST/THUAI6) + ## 赛题背景 待定 @@ -17,11 +21,11 @@ ### 配置说明 -本仓库使用 git 进行版本控制,为所有开发工作共用仓库,请勿上传不必要的文件。主目录文件结构非必要请勿修改,且主目录中已配置的`.gitignore`、`.gitattributes`文件非必要请勿修改;各子目录已预先包含使用`Visual Studio`开发的`.gitignore`模板,可以根据自身需要增加忽略规则;如有必要,可在子目录下自定义`.gitattributes`文件。 +本仓库使用 git 进行版本控制,为所有开发工作共用仓库,请勿上传不必要的文件。主目录文件结构非必要请勿修改,且主目录中已配置的`.gitignore`、`.gitattributes`文件非必要请勿修改;各子目录已预先包含使用`Visual Studio`开发的`.gitignore`模板,可以根据自身需要增加忽略规则;如有必要,可在子目录下自定义`.gitattributes`文件 ### 目录分配 -待定。 +待定 ### 分支管理 @@ -88,14 +92,11 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: 常用的缩写有: - - > address-addr、answer-ans、application-app、arguments-args、array-arr、assemble-asm、(a)synchronize-(a)sync、attribute-attr、begin-beg、bitmap-bmp、buffer-buf、button-btn、clock-clk、command-cmd、coordinates-coord、copy-cpy、count-cnt、current-cur、database-db、decrease-dec、default/define-def、delete-del、dependency-dep、destination-dest、device-dev、dialog-dlg、dictionary-dict、display-disp、divide-div、document-doc、educate-edu、equal-eq、error-err、extend-ext、format-fmt、frequency-freq、function-func、horizon-horz、image-img、implement-impl、increment-inc、index-idx、information-info、initialize-init、instance-inst、iterator-itr、length-len、list-lst、memory-mem、message-msg、middle-mid、number-num、object-obj、package-pkg、parameter-param、password-pwd、pointer-ptr、position-pos、previous-prev、receive-recv、reference-ref、resource/result-res、return-ret、second-sec、select-sel、semaphore-sem、signal-sig、source-src、stack-stk、standard-std、statistic/state-stat、string-str、system-sys、temporary-temp/tmp、text-txt、user-usr、value-val、variable-var、version-ver、vertical-vert、window-win - > - > +> - 命名允许较长,但不应过于啰嗦冗余,能完整表明意图即可。 -- 代码应保证良好的可读性;**禁止**中学 OI 竞赛的各种“卡常”奇技淫巧!!!效率并非总是最重要的,良好的可读性与可维护性往往更加重要。 +- 代码应保证良好的可读性;**禁止**中学 OI 竞赛的各种“卡常”奇技淫巧!!!效率并非总是最重要的,良好的可读性与可维护性往往更加重要 - 熟练运用面向对象编程的思想,设计架构时尽可能降低模块与模块的耦合性,保证代码的可维护性 - 慎用全局变量、全局函数等 - 尽可能将各功能模块化,便于日后复用;尽可能降低类与类的耦合,善用继承与多态 @@ -105,7 +106,7 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: - 注意维护开发文档,便于后来者快速了解本仓库代码结构 - 小组内合理分工,避免个人任务量过重或过轻 - 做好部会记录,及时完成工作任务,避免拖延到ddl -- 各组间多交流,相互了解各自的开发进度,加强协作,遇到困难互相帮助。 +- 各组间多交流,相互了解各自的开发进度,加强协作,遇到困难互相帮助 - 加油,奥里给 ## 开发组成员 From 94080e13ed7c04a9da91607927a3556cecdebe40 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 14:33:43 +0800 Subject: [PATCH 04/24] chore: add logic --- logic/.gitignore | 401 +++++++++++++++++++++++++++++++++++++ logic/Server/Program.cs | 2 + logic/Server/Server.csproj | 10 + logic/logic.sln | 25 +++ 4 files changed, 438 insertions(+) create mode 100644 logic/.gitignore create mode 100644 logic/Server/Program.cs create mode 100644 logic/Server/Server.csproj create mode 100644 logic/logic.sln diff --git a/logic/.gitignore b/logic/.gitignore new file mode 100644 index 0000000..ec116cb --- /dev/null +++ b/logic/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb diff --git a/logic/Server/Program.cs b/logic/Server/Program.cs new file mode 100644 index 0000000..3751555 --- /dev/null +++ b/logic/Server/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/logic/Server/Server.csproj b/logic/Server/Server.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/logic/Server/Server.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/logic/logic.sln b/logic/logic.sln new file mode 100644 index 0000000..51f61b6 --- /dev/null +++ b/logic/logic.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "Server\Server.csproj", "{D033B809-2FB7-4340-B8B4-DDA30D6CA6FF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D033B809-2FB7-4340-B8B4-DDA30D6CA6FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D033B809-2FB7-4340-B8B4-DDA30D6CA6FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D033B809-2FB7-4340-B8B4-DDA30D6CA6FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D033B809-2FB7-4340-B8B4-DDA30D6CA6FF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F8195A94-4DCA-4F27-BCB8-9E6310A1127E} + EndGlobalSection +EndGlobal From 6a370d62b03867cc89a4b2ea6bd985e881d8e363 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 15:22:00 +0800 Subject: [PATCH 05/24] chore: add dependency playback --- dependency/.gitignore | 363 +++++++++++++++++++++++++++ dependency/Dockerfile/README.md | 4 + dependency/README.md | 10 + dependency/dll/README.md | 4 + dependency/lib/README.md | 4 + dependency/proto/README.md | 3 + dependency/shell/README.md | 4 + logic/README.md | 50 ++++ playback/.gitignore | 401 ++++++++++++++++++++++++++++++ playback/Playback/Playback.cs | 7 + playback/Playback/Playback.csproj | 9 + playback/README.md | 22 ++ playback/playback.sln | 25 ++ resource/README.md | 3 + 14 files changed, 909 insertions(+) create mode 100644 dependency/.gitignore create mode 100644 dependency/Dockerfile/README.md create mode 100644 dependency/README.md create mode 100644 dependency/dll/README.md create mode 100644 dependency/lib/README.md create mode 100644 dependency/proto/README.md create mode 100644 dependency/shell/README.md create mode 100644 logic/README.md create mode 100644 playback/.gitignore create mode 100644 playback/Playback/Playback.cs create mode 100644 playback/Playback/Playback.csproj create mode 100644 playback/README.md create mode 100644 playback/playback.sln create mode 100644 resource/README.md diff --git a/dependency/.gitignore b/dependency/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/dependency/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/dependency/Dockerfile/README.md b/dependency/Dockerfile/README.md new file mode 100644 index 0000000..94a32a9 --- /dev/null +++ b/dependency/Dockerfile/README.md @@ -0,0 +1,4 @@ +# Dockerfile + +用于存放Docker配置文件Dockerfile + diff --git a/dependency/README.md b/dependency/README.md new file mode 100644 index 0000000..0fd060b --- /dev/null +++ b/dependency/README.md @@ -0,0 +1,10 @@ +# Dependency + +## 简介 + +该目录用于存放程序所需的所有依赖文件,例如程序编译必须的 .lib 与 .a、程序运行所需的 .dll 与 .so、Docker 配置文件 Dockerfile、protobuf 源代码文件 .proto、shell 脚本 .sh,等等。 + +## 统一约定 + +- 将对应后缀名的文件放入同名的子文件夹时,需要在子文件夹内再建立一个子文件夹,并在新建的文件夹内新建 README 介绍每个文件的用途。 + diff --git a/dependency/dll/README.md b/dependency/dll/README.md new file mode 100644 index 0000000..77b9fe5 --- /dev/null +++ b/dependency/dll/README.md @@ -0,0 +1,4 @@ +# dll + +动态链接库 .dll 与 .so + diff --git a/dependency/lib/README.md b/dependency/lib/README.md new file mode 100644 index 0000000..eb79320 --- /dev/null +++ b/dependency/lib/README.md @@ -0,0 +1,4 @@ +# lib + +静态链接库 .lib 与 .a + diff --git a/dependency/proto/README.md b/dependency/proto/README.md new file mode 100644 index 0000000..f8ba2c9 --- /dev/null +++ b/dependency/proto/README.md @@ -0,0 +1,3 @@ +# Proto + +该目录用于存放需要用到的`.proto`文件 \ No newline at end of file diff --git a/dependency/shell/README.md b/dependency/shell/README.md new file mode 100644 index 0000000..03496ee --- /dev/null +++ b/dependency/shell/README.md @@ -0,0 +1,4 @@ +# Shell + +本目录用于存放程序所需的shell脚本 + diff --git a/logic/README.md b/logic/README.md new file mode 100644 index 0000000..16d928e --- /dev/null +++ b/logic/README.md @@ -0,0 +1,50 @@ +# Logic + +## 简介 + +游戏逻辑与选手简易调试GUI客户端 + +## 目标 + +### 基本目标 + +- 实现底层游戏逻辑,生成 .NET 类库 +- 使用`gRPC`实现`Server`,使`Server`能够持续收发信息、处理信息,并生成 .NET 控制台应用程序`Server`。`Server`至少应实现: + - 游戏的组队与正常运行 + - 生成回放文件,保存游戏结果 +- 制作用于简易调试的`Client`,并实现基本GUI功能。可使用`WPF`、`WinForm`或其他技术。用于简易调试的客户端应至少实现: + - 游戏直播与观战 + - 播放回放文件 + +### 重要目标 + +- 完全分离游戏引擎、游戏逻辑与通信逻辑,使得游戏引擎和通信逻辑可以供日后复用 +- 简易调试客户端支持玩家手动对战 +- 简易调试客户端应尽量清晰整洁,运行流畅 +- 编写`MSTest`测试程序,设计测试样例,测试游戏逻辑 + +### 提高目标 + +- 使用`MAUI`制作简易调试客户端,实现跨平台的功能 +- 使用`MVVM`或其他模式开发简易调试客户端 + +## 统一约定 + +- 目标平台规定使用 .NET 6,建议使用 VS 2022 进行开发。 + +## 注意事项 + +- 注意程序的鲁棒性与异常安全性,保证程序在任何极端情况下都不会崩溃。因此要求开发者对各种极端操作进检查,避免因异常导致`Server`崩溃、游戏中断。常见的错误包括:浮点数的`NaN`与`Inf`、枚举类型值非法、运算溢出、死锁、`foreach`中修改被迭代对象等。 +- 注意游戏引擎、游戏逻辑、通信逻辑的相互分离,便于代码维护与复用 +- 提前规划好代码架构与分工,分工应尽量均匀合理 +- 设计良好的调试接口,在开发中做好测试工作,避免BUG的积累 +- 考虑程序的通用性与可拓展性,降低各模块的耦合性 +- 小组成员间应多多交流,了解各自的工作进度,协调好各自的开发工作 + +## 特别说明 + +- 历年的经验表明,并发问题是最容易被忽略的问题。今年在编写多线程的程序时,必须非常关注并发问题,尽量保证程序在高并发下安全运行 + +## 开发人员 + +- ......(自己加) \ No newline at end of file diff --git a/playback/.gitignore b/playback/.gitignore new file mode 100644 index 0000000..ec116cb --- /dev/null +++ b/playback/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb diff --git a/playback/Playback/Playback.cs b/playback/Playback/Playback.cs new file mode 100644 index 0000000..44be649 --- /dev/null +++ b/playback/Playback/Playback.cs @@ -0,0 +1,7 @@ +namespace Playback +{ + public class Playback + { + + } +} \ No newline at end of file diff --git a/playback/Playback/Playback.csproj b/playback/Playback/Playback.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/playback/Playback/Playback.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/playback/README.md b/playback/README.md new file mode 100644 index 0000000..a5280d3 --- /dev/null +++ b/playback/README.md @@ -0,0 +1,22 @@ +# Playback + +## 简介 + +回放组件 + +## 目标 + +用于生成回放文件、读取回放文件的基本组件,生成为 .NET 类库。 + +## 统一约定 + +- 生成两份回放组件,目标平台分别为 .NET 6 与 .NET Standard。具体 .NET Standard 版本需与 Unity 版本对应 +- .NET 6 版本供服务器与一般客户端使用,.NET Standard 版本供Unity使用 + +## 特别说明 + +- 本项目可直接复用 THUAI5 版本,注意更改版本号 + +## 开发人员 + +- .......(自己加) \ No newline at end of file diff --git a/playback/playback.sln b/playback/playback.sln new file mode 100644 index 0000000..8f72207 --- /dev/null +++ b/playback/playback.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Playback", "Playback\Playback.csproj", "{A5D4F29B-1D67-45D5-BDD8-5BF9839EC374}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A5D4F29B-1D67-45D5-BDD8-5BF9839EC374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5D4F29B-1D67-45D5-BDD8-5BF9839EC374}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5D4F29B-1D67-45D5-BDD8-5BF9839EC374}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5D4F29B-1D67-45D5-BDD8-5BF9839EC374}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FBBF6C99-33A2-4B07-8759-BBDBA39A29C7} + EndGlobalSection +EndGlobal diff --git a/resource/README.md b/resource/README.md new file mode 100644 index 0000000..eb723ac --- /dev/null +++ b/resource/README.md @@ -0,0 +1,3 @@ +# Resource + +本目录用于存放主目录 README 的所有资源,**目录名称及目录内文件禁止更改**。 \ No newline at end of file From d6d786a5a968deffc6d5ff3db86943306926449f Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 16:35:45 +0800 Subject: [PATCH 06/24] chore: add CAPI interface --- CAPI/.gitignore | 499 +++++++++++++++++++++++++++++++++++ CAPI/API/API.vcxproj | 150 +++++++++++ CAPI/API/API.vcxproj.filters | 17 ++ CAPI/CAPI.sln | 31 +++ CAPI/README.md | 50 ++++ interface/.gitignore | 401 ++++++++++++++++++++++++++++ interface/README.md | 33 +++ 7 files changed, 1181 insertions(+) create mode 100644 CAPI/.gitignore create mode 100644 CAPI/API/API.vcxproj create mode 100644 CAPI/API/API.vcxproj.filters create mode 100644 CAPI/CAPI.sln create mode 100644 CAPI/README.md create mode 100644 interface/.gitignore create mode 100644 interface/README.md diff --git a/CAPI/.gitignore b/CAPI/.gitignore new file mode 100644 index 0000000..698ed27 --- /dev/null +++ b/CAPI/.gitignore @@ -0,0 +1,499 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb + +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps diff --git a/CAPI/API/API.vcxproj b/CAPI/API/API.vcxproj new file mode 100644 index 0000000..548e394 --- /dev/null +++ b/CAPI/API/API.vcxproj @@ -0,0 +1,150 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + 16.0 + Win32Proj + {b9ac3133-177d-453c-8066-ed4702d3f36a} + API + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + diff --git a/CAPI/API/API.vcxproj.filters b/CAPI/API/API.vcxproj.filters new file mode 100644 index 0000000..afef69e --- /dev/null +++ b/CAPI/API/API.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + \ No newline at end of file diff --git a/CAPI/CAPI.sln b/CAPI/CAPI.sln new file mode 100644 index 0000000..76cf3d8 --- /dev/null +++ b/CAPI/CAPI.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "API", "API\API.vcxproj", "{B9AC3133-177D-453C-8066-ED4702D3F36A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Debug|x64.ActiveCfg = Debug|x64 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Debug|x64.Build.0 = Debug|x64 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Debug|x86.ActiveCfg = Debug|Win32 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Debug|x86.Build.0 = Debug|Win32 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Release|x64.ActiveCfg = Release|x64 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Release|x64.Build.0 = Release|x64 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Release|x86.ActiveCfg = Release|Win32 + {B9AC3133-177D-453C-8066-ED4702D3F36A}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {372B1478-522C-4EEB-A527-983D310A3F50} + EndGlobalSection +EndGlobal diff --git a/CAPI/README.md b/CAPI/README.md new file mode 100644 index 0000000..bb61d52 --- /dev/null +++ b/CAPI/README.md @@ -0,0 +1,50 @@ +# CAPI + +## 简介 + +C++ 通信组件与选手接口 + +## 目标 + +### 基本目标 + +- 基于 Protobuf 与 gRPC,为客户端提供 C++ 通信组件 +- 为选手提供游戏接口 + +### 重要目标 + +- 理解 RPC 的工作原理,使用 gRPC 完善通信逻辑 +- 将通信逻辑与游戏逻辑分离开,便于日后复用 +- 客户端不对游戏人数、观战人数做出任何限制,这些方面全都由服务器决定 +- 改进选手接口,思考如何强制禁止选手一直占用 CPU 而导致 CPU 占用过大的问题。 + +### 提高目标 + +- 提供其他语言的接口:Python、Java、Rust ...... + +## 统一约定 + +- 主要使用现代 C++ 进行编程 +- 代码应当能够同时运行在 Windows 10 平台和 Linux 平台上。Windows 平台下采用 MSVC 作为编译工具,Linux 平台采用 GCC 作为编译工具 +- Windows 下的开发工具使用 Visual Studio 2019 或 Visual Studio 2022,语言标准采用 C++17 和 C17 (MSVC 编译选项 `/std:c++17; /std:c17`),并且应同时在 x64 平台的 Debug 与 Release 模式下正确编译并运行 +- Linux 下 C 语言编译工具使用 gcc,语言标准为 `-std=c17`;C++ 编译工具使用 g++,语言标准为 `-std=c++17`。优化选项为 `-O2`,生成 64 位程序 `-m64`,并编写相应的 Makefile + +## 注意事项 + +- 与逻辑组共同商议通信协议 +- Visual Studio 新建的 C++ 代码文件默认字符编码是 GB2312、默认缩进方式是 TAB,应该注意手动改成 UTF-8 和 空格缩进 +- 了解 Visual Studio 的项目属性配置,例如第三方库的链接、预定义宏等 +- 使用现代 C++ 进行编程,尽量避免裸指针,多使用引用和智能指针 +- 了解 C、C++ 预处理、编译、链接的基本概念 +- 注意模块化、单元化,降低各个类、各个模块之间的耦合。特别注意避免相互依赖、环形依赖的问题 +- 遵循头文件(`.h`、`.hpp`)的编写规范 + + 杜绝头文件相互包含与环形包含 + + 头文件中最好同时写 `#pragma once` 以及保护宏,而 `cpp` 中不要写这两个东西 + + 头文件中**禁止** `using namespace std`!!!也不允许在任何自定义的名字空间中 `using namespace std`!!! + + 头文件和 `cpp` 文件各司其职,代码写在改写的位置 + + 禁止 include .cpp 或 .c 文件 +- 避免忙等待,注意线程安全,做好线程同步 + +## 开发人员 + +- ......(自己加) \ No newline at end of file diff --git a/interface/.gitignore b/interface/.gitignore new file mode 100644 index 0000000..ec116cb --- /dev/null +++ b/interface/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb diff --git a/interface/README.md b/interface/README.md new file mode 100644 index 0000000..4d5ae8a --- /dev/null +++ b/interface/README.md @@ -0,0 +1,33 @@ +# Interface + +## 简介 + +Unity 客户端 + +## 目标 + +### 基本目标 + +生成 Windows 平台的 Unity 客户端,至少实现以下功能: + +- 游戏回放:读取回放文件并回放 + +### 重要目标 + +- 直播观战:实时播放当前游戏画面 +- 玩家对战:玩家可以自主操控角色,加入游戏 + +### 提高目标 + +- 生成适合 Web 的 Unity,在网站上直播赛况(需与网站组配合) +- 生成手机 APP,支持手机客户端直播观战以及实时进行游戏 +- 上架 steam +- ......(未完待画) + +## 注意事项 + +编写好适合 Unity 的 .gitignore 文件,将必要的文件上传,既不要上传多余文件,也不要落下必需的文件 + +## 开发人员 + +- .......(自己加) \ No newline at end of file From 399a0f2030c129be41046bb5051b0d5bff6fd2e5 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 16:53:10 +0800 Subject: [PATCH 07/24] chore: add installer --- installer/.gitignore | 401 +++++++++++++++++++++++++ installer/Installer/App.xaml | 9 + installer/Installer/App.xaml.cs | 17 ++ installer/Installer/AssemblyInfo.cs | 10 + installer/Installer/Installer.csproj | 10 + installer/Installer/MainWindow.xaml | 12 + installer/Installer/MainWindow.xaml.cs | 28 ++ installer/README.md | 28 ++ installer/installer.sln | 25 ++ 9 files changed, 540 insertions(+) create mode 100644 installer/.gitignore create mode 100644 installer/Installer/App.xaml create mode 100644 installer/Installer/App.xaml.cs create mode 100644 installer/Installer/AssemblyInfo.cs create mode 100644 installer/Installer/Installer.csproj create mode 100644 installer/Installer/MainWindow.xaml create mode 100644 installer/Installer/MainWindow.xaml.cs create mode 100644 installer/README.md create mode 100644 installer/installer.sln diff --git a/installer/.gitignore b/installer/.gitignore new file mode 100644 index 0000000..ec116cb --- /dev/null +++ b/installer/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb diff --git a/installer/Installer/App.xaml b/installer/Installer/App.xaml new file mode 100644 index 0000000..cd117d1 --- /dev/null +++ b/installer/Installer/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/installer/Installer/App.xaml.cs b/installer/Installer/App.xaml.cs new file mode 100644 index 0000000..34a52c5 --- /dev/null +++ b/installer/Installer/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace Installer +{ + ///

+ /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/installer/Installer/AssemblyInfo.cs b/installer/Installer/AssemblyInfo.cs new file mode 100644 index 0000000..2211234 --- /dev/null +++ b/installer/Installer/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/installer/Installer/Installer.csproj b/installer/Installer/Installer.csproj new file mode 100644 index 0000000..4106cb0 --- /dev/null +++ b/installer/Installer/Installer.csproj @@ -0,0 +1,10 @@ + + + + WinExe + net6.0-windows + enable + true + + + diff --git a/installer/Installer/MainWindow.xaml b/installer/Installer/MainWindow.xaml new file mode 100644 index 0000000..c27f362 --- /dev/null +++ b/installer/Installer/MainWindow.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/installer/Installer/MainWindow.xaml.cs b/installer/Installer/MainWindow.xaml.cs new file mode 100644 index 0000000..a4cc502 --- /dev/null +++ b/installer/Installer/MainWindow.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Installer +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + } + } +} diff --git a/installer/README.md b/installer/README.md new file mode 100644 index 0000000..7207d14 --- /dev/null +++ b/installer/README.md @@ -0,0 +1,28 @@ +# Installer + +## 简介 + +THUAI6 选手包下载器 + +## 目标 + +### 基本目标 + +- 为 Windows 编写桌面应用程序,推荐使用WPF,目标平台 .NET 6,需要实现以下功能: + - 选手包下载 + - 检查选手包更新情况 + +## 重要目标 + +- 设计美观的UI,便于选手操作 +- 使用 MVVM 或其他设计模式 +- 为下载器添加 "暂停与断点续传" 的功能 + +## 提高目标 + +- 与网站组对接,支持账号密码登录 +- 通过该应用程序提交比赛代码,查看天梯积分,下载回放文件,进行实时对战等 + +## 开发人员 + +- ......(自己加) \ No newline at end of file diff --git a/installer/installer.sln b/installer/installer.sln new file mode 100644 index 0000000..5ad8dd7 --- /dev/null +++ b/installer/installer.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Installer", "Installer\Installer.csproj", "{C10AF177-0883-4D9D-B2DC-3516BE04DF81}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C10AF177-0883-4D9D-B2DC-3516BE04DF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C10AF177-0883-4D9D-B2DC-3516BE04DF81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C10AF177-0883-4D9D-B2DC-3516BE04DF81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C10AF177-0883-4D9D-B2DC-3516BE04DF81}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FC5375BC-9F2B-45AA-B0E2-E35A0C26E3C0} + EndGlobalSection +EndGlobal From 142cea8367539058bc9c5b45119c29ee8af91a11 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 17:16:00 +0800 Subject: [PATCH 08/24] chore: add launcher --- installer/README.md | 1 - launcher/.gitignore | 401 +++++++++++++++++++++++++++ launcher/Launcher/App.xaml | 9 + launcher/Launcher/App.xaml.cs | 17 ++ launcher/Launcher/AssemblyInfo.cs | 10 + launcher/Launcher/Launcher.csproj | 10 + launcher/Launcher/MainWindow.xaml | 12 + launcher/Launcher/MainWindow.xaml.cs | 28 ++ launcher/README.md | 21 ++ launcher/launcher.sln | 25 ++ 10 files changed, 533 insertions(+), 1 deletion(-) create mode 100644 launcher/.gitignore create mode 100644 launcher/Launcher/App.xaml create mode 100644 launcher/Launcher/App.xaml.cs create mode 100644 launcher/Launcher/AssemblyInfo.cs create mode 100644 launcher/Launcher/Launcher.csproj create mode 100644 launcher/Launcher/MainWindow.xaml create mode 100644 launcher/Launcher/MainWindow.xaml.cs create mode 100644 launcher/README.md create mode 100644 launcher/launcher.sln diff --git a/installer/README.md b/installer/README.md index 7207d14..577688e 100644 --- a/installer/README.md +++ b/installer/README.md @@ -21,7 +21,6 @@ THUAI6 选手包下载器 ## 提高目标 - 与网站组对接,支持账号密码登录 -- 通过该应用程序提交比赛代码,查看天梯积分,下载回放文件,进行实时对战等 ## 开发人员 diff --git a/launcher/.gitignore b/launcher/.gitignore new file mode 100644 index 0000000..ec116cb --- /dev/null +++ b/launcher/.gitignore @@ -0,0 +1,401 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +#THUAI playback file +*.thuaipb diff --git a/launcher/Launcher/App.xaml b/launcher/Launcher/App.xaml new file mode 100644 index 0000000..0c915a4 --- /dev/null +++ b/launcher/Launcher/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/launcher/Launcher/App.xaml.cs b/launcher/Launcher/App.xaml.cs new file mode 100644 index 0000000..66dccf6 --- /dev/null +++ b/launcher/Launcher/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace Launcher +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/launcher/Launcher/AssemblyInfo.cs b/launcher/Launcher/AssemblyInfo.cs new file mode 100644 index 0000000..2211234 --- /dev/null +++ b/launcher/Launcher/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/launcher/Launcher/Launcher.csproj b/launcher/Launcher/Launcher.csproj new file mode 100644 index 0000000..4106cb0 --- /dev/null +++ b/launcher/Launcher/Launcher.csproj @@ -0,0 +1,10 @@ + + + + WinExe + net6.0-windows + enable + true + + + diff --git a/launcher/Launcher/MainWindow.xaml b/launcher/Launcher/MainWindow.xaml new file mode 100644 index 0000000..31ed4a8 --- /dev/null +++ b/launcher/Launcher/MainWindow.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/launcher/Launcher/MainWindow.xaml.cs b/launcher/Launcher/MainWindow.xaml.cs new file mode 100644 index 0000000..ef9b7ee --- /dev/null +++ b/launcher/Launcher/MainWindow.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Launcher +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + } + } +} diff --git a/launcher/README.md b/launcher/README.md new file mode 100644 index 0000000..2d82b22 --- /dev/null +++ b/launcher/README.md @@ -0,0 +1,21 @@ +# Launcher + +## 简介 + +THUAI6 游戏启动器 + +## 目标 + +### 重要目标 + +- 设计游戏启动器,UI界面推荐使用 WPF 编写,目标平台 .NET 6。 +- 实现游戏启动的功能:选手可选队伍数、每队人数等游戏设置,可选启动客户端类型(Unity 界面、简易调试界面、选手 C++ 代码等)等启动设置 + +### 提高目标 + +- 使用 .NET 6,将 WPF 改用 MAUI,适合多种平台, 并能够根据平台自动选择启动的客户端 +- 与网站组、界面组等配合,编写一个可以实时创建房间,加入房间进行游戏的界面(饼中之大饼) + +## 开发人员 + +- ......(自己加) \ No newline at end of file diff --git a/launcher/launcher.sln b/launcher/launcher.sln new file mode 100644 index 0000000..9812237 --- /dev/null +++ b/launcher/launcher.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Launcher", "Launcher\Launcher.csproj", "{7045F91B-EA80-4E4E-A5F2-501227D78E2F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7045F91B-EA80-4E4E-A5F2-501227D78E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7045F91B-EA80-4E4E-A5F2-501227D78E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7045F91B-EA80-4E4E-A5F2-501227D78E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7045F91B-EA80-4E4E-A5F2-501227D78E2F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5E15B2BF-F385-4F55-8905-87FBC37854CC} + EndGlobalSection +EndGlobal From 14b2ce91d3dfcc9bbf143e45e0628f7f64849e69 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 22:39:03 +0800 Subject: [PATCH 09/24] chore: add clang-format --- .clang-format | 285 +++++++++++++++++++++++++++++ .github/workflows/clang-format.yml | 13 ++ 2 files changed, 298 insertions(+) create mode 100644 .clang-format create mode 100644 .github/workflows/clang-format.yml diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..5f2c1f3 --- /dev/null +++ b/.clang-format @@ -0,0 +1,285 @@ +--- +BasedOnStyle: Microsoft +Language: CSharp +AccessModifierOffset: -2 +AlignAfterOpenBracket: BlockIndent +AlignArrayOfStructures: None +AlignConsecutiveMacros: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom +BreakInheritanceList: AfterColon +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 0 +CommentPragmas: '^ THU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: Always +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: CurrentLine +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Merge +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IndentAccessModifiers: false +IndentCaseLabels: true +IndentCaseBlocks: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequires: false +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertBraces: false +InsertTrailingCommas: None +LambdaBodyIndentation: Signature +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +PointerAlignment: Left +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +SeparateDefinitionBlocks: Leave +SortIncludes: Never +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpacesInSquareBrackets: false +SpaceInEmptyBlock: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: Never +SpacesInCStyleCastParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpacesInLineCommentPrefix: + Minimum: 1 +SpacesInParentheses: false +SpaceBeforeSquareBrackets: false +Standard: Latest +TabWidth: 4 +UseTab: Never +--- +BasedOnStyle: Google +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: BlockIndent +AlignArrayOfStructures: None +AlignConsecutiveMacros: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortEnumsOnASingleLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: Always + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Custom +BreakInheritanceList: AfterColon +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 0 +CommentPragmas: '^ THU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: Always +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: CurrentLine +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Merge +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IndentAccessModifiers: false +IndentCaseLabels: true +IndentCaseBlocks: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequires: false +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertBraces: false +InsertTrailingCommas: None +LambdaBodyIndentation: Signature +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +PointerAlignment: Left +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +SeparateDefinitionBlocks: Leave +SortIncludes: Never +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpacesInSquareBrackets: false +SpaceInEmptyBlock: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: Never +SpacesInCStyleCastParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpacesInLineCommentPrefix: + Minimum: 1 +SpacesInParentheses: false +SpaceBeforeSquareBrackets: false +Standard: Latest +TabWidth: 4 +UseTab: Never + diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 0000000..3371822 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,13 @@ +name: clang-format +on: [push, pull_request] +jobs: + clang-format-checking: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: DoozyX/clang-format-lint-action@v0.13 + with: + source: '.' + extensions: 'cs,c,h,C,H,cpp,hpp,cc,hh,c++,h++,cxx,hxx,i,ixx,ipp,i++' + clangFormatVersion: 12 + inplace: False From 3bce0f03ef58e64ca4371fda17ccd53017baab46 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 22:56:35 +0800 Subject: [PATCH 10/24] chore: update clangformat version to 14 --- .clang-format | 4 ++-- .github/workflows/clang-format.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.clang-format b/.clang-format index 5f2c1f3..517a4dd 100644 --- a/.clang-format +++ b/.clang-format @@ -1,7 +1,7 @@ --- BasedOnStyle: Microsoft Language: CSharp -AccessModifierOffset: -2 +AccessModifierOffset: -4 AlignAfterOpenBracket: BlockIndent AlignArrayOfStructures: None AlignConsecutiveMacros: None @@ -143,7 +143,7 @@ UseTab: Never --- BasedOnStyle: Google Language: Cpp -AccessModifierOffset: -2 +AccessModifierOffset: -4 AlignAfterOpenBracket: BlockIndent AlignArrayOfStructures: None AlignConsecutiveMacros: None diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 3371822..244cde6 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -9,5 +9,5 @@ jobs: with: source: '.' extensions: 'cs,c,h,C,H,cpp,hpp,cc,hh,c++,h++,cxx,hxx,i,ixx,ipp,i++' - clangFormatVersion: 12 + clangFormatVersion: 14 inplace: False From 903643771a45c2d1046dae7c3c8e5b6c49848d44 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:00:55 +0800 Subject: [PATCH 11/24] chore: update clangformat version to 14 again --- .github/workflows/clang-format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 244cde6..581afcb 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -5,7 +5,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: DoozyX/clang-format-lint-action@v0.13 + - uses: DoozyX/clang-format-lint-action@v0.14 with: source: '.' extensions: 'cs,c,h,C,H,cpp,hpp,cc,hh,c++,h++,cxx,hxx,i,ixx,ipp,i++' From f7b087a324d160241e66d58b9f80a354e39a7346 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:03:00 +0800 Subject: [PATCH 12/24] chore: delete InsertBraces: false in clangformat --- .clang-format | 2 -- 1 file changed, 2 deletions(-) diff --git a/.clang-format b/.clang-format index 517a4dd..f49f85d 100644 --- a/.clang-format +++ b/.clang-format @@ -99,7 +99,6 @@ IndentPPDirectives: None IndentRequires: false IndentWidth: 4 IndentWrappedFunctionNames: true -InsertBraces: false InsertTrailingCommas: None LambdaBodyIndentation: Signature MaxEmptyLinesToKeep: 1 @@ -241,7 +240,6 @@ IndentPPDirectives: None IndentRequires: false IndentWidth: 4 IndentWrappedFunctionNames: true -InsertBraces: false InsertTrailingCommas: None LambdaBodyIndentation: Signature MaxEmptyLinesToKeep: 1 From ab7e650bc22a01add573afbe42f186f3f949cb75 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:25:47 +0800 Subject: [PATCH 13/24] style: use clangformat --- README.md | 1 + installer/Installer/AssemblyInfo.cs | 12 ++++++------ launcher/Launcher/AssemblyInfo.cs | 12 ++++++------ playback/Playback/Playback.cs | 1 - 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 49d0a34..013cc71 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: | refactor | 改变代码结构,但没有增加新功能 | | docs | 修改文档,如 README、CONTRIBUTE 等 | | revert | 版本回退 | + | style | 仅仅修改了空格、格式缩进、逗号等等 | | ... | ... | - 鼓励开发组成员之间互相 review 并 merge 代码到 dev 分支上。merge 前建议简单检查其 pull request 是否符合上述规范 diff --git a/installer/Installer/AssemblyInfo.cs b/installer/Installer/AssemblyInfo.cs index 2211234..b89be78 100644 --- a/installer/Installer/AssemblyInfo.cs +++ b/installer/Installer/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Windows; [assembly:ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) + ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly // where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) )] diff --git a/launcher/Launcher/AssemblyInfo.cs b/launcher/Launcher/AssemblyInfo.cs index 2211234..b89be78 100644 --- a/launcher/Launcher/AssemblyInfo.cs +++ b/launcher/Launcher/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Windows; [assembly:ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) + ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly // where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) )] diff --git a/playback/Playback/Playback.cs b/playback/Playback/Playback.cs index 44be649..658e5d6 100644 --- a/playback/Playback/Playback.cs +++ b/playback/Playback/Playback.cs @@ -2,6 +2,5 @@ { public class Playback { - } } \ No newline at end of file From 67849e66dc6e6bc047a8bf9186be42d73fc47038 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:43:32 +0800 Subject: [PATCH 14/24] chore: add format.sh --- dependency/shell/format.sh | 21 +++++++++++++++++++++ installer/Installer/AssemblyInfo.cs | 6 +++--- launcher/Launcher/AssemblyInfo.cs | 6 +++--- 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 dependency/shell/format.sh diff --git a/dependency/shell/format.sh b/dependency/shell/format.sh new file mode 100644 index 0000000..dba6115 --- /dev/null +++ b/dependency/shell/format.sh @@ -0,0 +1,21 @@ +for i in {1..10} +do +find . -iname "*.cs" \ + -or -iname "*.c" \ + -or -iname "*.h" \ + -or -iname "*.C" \ + -or -iname "*.H" \ + -or -iname "*.cpp" \ + -or -iname "*.hpp" \ + -or -iname "*.cc" \ + -or -iname "*.hh" \ + -or -iname "*.c++" \ + -or -iname "*.h++" \ + -or -iname "*.cxx" \ + -or -iname "*.hxx" \ + -or -iname "*.i" \ + -or -iname "*.ixx" \ + -or -iname "*.ipp" \ + -or -iname "*.i++" \ + | xargs clang-format -i +done diff --git a/installer/Installer/AssemblyInfo.cs b/installer/Installer/AssemblyInfo.cs index b89be78..87c30a8 100644 --- a/installer/Installer/AssemblyInfo.cs +++ b/installer/Installer/AssemblyInfo.cs @@ -1,9 +1,9 @@ using System.Windows; [assembly:ThemeInfo( - ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) + ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) ResourceDictionaryLocation.SourceAssembly // where the generic resource dictionary is located //(used if a resource is not found in the page, // app, or any theme specific resource dictionaries) diff --git a/launcher/Launcher/AssemblyInfo.cs b/launcher/Launcher/AssemblyInfo.cs index b89be78..87c30a8 100644 --- a/launcher/Launcher/AssemblyInfo.cs +++ b/launcher/Launcher/AssemblyInfo.cs @@ -1,9 +1,9 @@ using System.Windows; [assembly:ThemeInfo( - ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) + ResourceDictionaryLocation.None, // where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) ResourceDictionaryLocation.SourceAssembly // where the generic resource dictionary is located //(used if a resource is not found in the page, // app, or any theme specific resource dictionaries) From d6c64c28829623528db2d090a38b099082053155 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:55:52 +0800 Subject: [PATCH 15/24] docs: add contents instructions in readme --- README.md | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 013cc71..7879b27 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,17 @@ GitLink 镜像地址:[THUAI6: GitLink Image](https://www.gitlink.org.cn/EESAST ### 目录分配 -待定 +| 子目录 | 说明 | 主要开发组 | +| :--------: | :--------------------------------------------------------: | :----------------------------: | +| .github | CI,用于选手包同步到服务器上供选手下载 | 运维组 | +| CAPI | C++ 选手接口,生成可执行文件 | 通信组、运维组 | +| dependency | 项目依赖文件,如 proto、dll、lib、dockerfile、shell 脚本等 | 逻辑组、通信组、运维组、界面组 | +| installer | 下载器,用于选手包的下载与更新,生成可执行文件 | 运维组 | +| interface | Unity 界面 | 界面组 | +| launcher | 游戏启动器,用于快速启动游戏,生成可执行文件 | 运维组 | +| logic | 游戏逻辑,生成可执行文件 | 逻辑组 | +| playback | 游戏回放组件,生成类库 | 逻辑组 | +| resource | 资源文件目录,用于存储主目录下 README 所用图片 | 端茶倒水 | ### 分支管理 @@ -57,15 +67,15 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: 常用的 commit message type 包括: - | Type | Explanation | - | -------- | ---------------------------------------------- | - | chore | 日常代码开发;改变构建流程;增加依赖库、工具等 | - | fix | 修复bug | - | refactor | 改变代码结构,但没有增加新功能 | - | docs | 修改文档,如 README、CONTRIBUTE 等 | - | revert | 版本回退 | - | style | 仅仅修改了空格、格式缩进、逗号等等 | - | ... | ... | + | Type | Explanation | + | :------: | :--------------------------------------------: | + | chore | 日常代码开发;改变构建流程;增加依赖库、工具等 | + | fix | 修复bug | + | refactor | 改变代码结构,但没有增加新功能 | + | docs | 修改文档,如 README、CONTRIBUTE 等 | + | revert | 版本回退 | + | style | 仅仅修改了空格、格式缩进、逗号等等 | + | ... | ... | - 鼓励开发组成员之间互相 review 并 merge 代码到 dev 分支上。merge 前建议简单检查其 pull request 是否符合上述规范 - 一般情况下,不要向 main 分支提出 pull request,更不要 merge 到 main 分支上 From 50a1e80f85eed0152a6f391dde68443fa29c2662 Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Thu, 21 Jul 2022 23:57:22 +0800 Subject: [PATCH 16/24] docs: capi is mainly for communication group --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7879b27..bd89185 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ GitLink 镜像地址:[THUAI6: GitLink Image](https://www.gitlink.org.cn/EESAST | 子目录 | 说明 | 主要开发组 | | :--------: | :--------------------------------------------------------: | :----------------------------: | | .github | CI,用于选手包同步到服务器上供选手下载 | 运维组 | -| CAPI | C++ 选手接口,生成可执行文件 | 通信组、运维组 | +| CAPI | C++ 选手接口,生成可执行文件 | 通信组 | | dependency | 项目依赖文件,如 proto、dll、lib、dockerfile、shell 脚本等 | 逻辑组、通信组、运维组、界面组 | | installer | 下载器,用于选手包的下载与更新,生成可执行文件 | 运维组 | | interface | Unity 界面 | 界面组 | From 0ff0d32428c35ed88f91a75c93efed45cc7da2cd Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Fri, 22 Jul 2022 00:45:19 +0800 Subject: [PATCH 17/24] docs: add format info in readme --- README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/README.md b/README.md index bd89185..c638552 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,56 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: + 统一使用 4 个空格进行缩进而非 2 个 + 统一使用 UTF-8 字符编码 +## 代码风格 + +本仓库严格规定了`C++`与`CSharp`代码风格,具体配置请参见 [.clang-format](.clang-format) + +### 风格说明 + +几项重要规定如下: + +- 需严格按照要求缩进 + + ~~~csharp + namespace Exp + { + public class Program + { + public static void Main() + { + } + } + } + ~~~ + +- `if`、`while`等关键字后须加空格 + + ~~~csharp + while (1) + { + // code + } + ~~~ + +- 大括号须换行书写 + + ~~~csharp + // Allowed + if (...) + { + // ... + } + + // Forbidden !!! + if (...) { + // ... + } + ~~~ + +### 规范风格 + +- 请按照配置文件 [.clang-format](.clang-format) 对代码进行规范;可以使用脚本 [dependency/shell/format.sh](./dependency/shell/format.sh) 规范代码风格 + ## 其他注意事项 + 文件的字符编码格式须统一使用 UTF-8 编码,并用 4 空格缩进,尤其是 C/C++:Visual Studio 创建 cpp 文件时默认使用 GB2312 编码、TAB 缩进,因此每创建一个文件都需要注意手动设置字符编码(当代码文件中出现中文时)和缩进方式 From a9efc88ef098928cee6bbd04395cd853bdd27249 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Jul 2022 21:27:44 +0000 Subject: [PATCH 18/24] chore(deps): update actions/checkout action to v3 --- .github/workflows/clang-format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 581afcb..a21aed8 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -4,7 +4,7 @@ jobs: clang-format-checking: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: DoozyX/clang-format-lint-action@v0.14 with: source: '.' From 7b7d127e6085f550d87b65cd83527348ccc837bb Mon Sep 17 00:00:00 2001 From: TCL <1620508360@qq.com> Date: Wed, 3 Aug 2022 11:39:18 +0800 Subject: [PATCH 19/24] docs: update members --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c638552..86e09a1 100644 --- a/README.md +++ b/README.md @@ -172,8 +172,8 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: ## 开发组成员 -- 逻辑组: -- 通信组: -- 界面组: -- 赛事组: +- 逻辑组:黄淞、游笑权、高思研 +- 通信组:王溢寒、李羿璇 +- 界面组:杨思琪、刘腾旋 +- 赛事组:庄继敏、王诗凯 - 端茶倒水:唐昌礼 From 8b6f24da8b3ad3d63113cb57050f6bb763b4f71d Mon Sep 17 00:00:00 2001 From: Timothy Liu Date: Thu, 11 Aug 2022 16:09:37 +0800 Subject: [PATCH 20/24] fix: change c++ standard of clang-format to c++17 --- .clang-format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index f49f85d..f10f5bd 100644 --- a/.clang-format +++ b/.clang-format @@ -277,7 +277,7 @@ SpacesInLineCommentPrefix: Minimum: 1 SpacesInParentheses: false SpaceBeforeSquareBrackets: false -Standard: Latest +Standard: c++17 TabWidth: 4 UseTab: Never From 15043307eb3d430cc4cc79c083e37c9f6844085b Mon Sep 17 00:00:00 2001 From: Timothy Liu Date: Thu, 11 Aug 2022 16:14:06 +0800 Subject: [PATCH 21/24] fix: change c++ standard to c++17 --- CAPI/API/API.vcxproj | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/CAPI/API/API.vcxproj b/CAPI/API/API.vcxproj index 548e394..33f7ab9 100644 --- a/CAPI/API/API.vcxproj +++ b/CAPI/API/API.vcxproj @@ -17,7 +17,6 @@ Release x64 - 16.0 @@ -53,25 +52,23 @@ true Unicode - - + + + + + + + + + + + + + - - - - - - - - - - - - - true @@ -85,13 +82,14 @@ false - Level3 true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 + stdc17 Console @@ -106,6 +104,8 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 + stdc17 Console @@ -120,6 +120,8 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 + stdc17 Console @@ -134,6 +136,8 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp17 + stdc17 Console @@ -142,9 +146,9 @@ true - - + + - + \ No newline at end of file From fa7afd1ab0c47c62b72d70038ba62015b55fce42 Mon Sep 17 00:00:00 2001 From: TCL <84725343+TCL606@users.noreply.github.com> Date: Fri, 23 Sep 2022 16:55:23 +0800 Subject: [PATCH 22/24] docs: change competition group to operation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86e09a1..9da7051 100644 --- a/README.md +++ b/README.md @@ -175,5 +175,5 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: - 逻辑组:黄淞、游笑权、高思研 - 通信组:王溢寒、李羿璇 - 界面组:杨思琪、刘腾旋 -- 赛事组:庄继敏、王诗凯 +- 运维组:庄继敏、王诗凯 - 端茶倒水:唐昌礼 From 0f90f6a04137cf4f71e30ba28f2aa4b2c02655f8 Mon Sep 17 00:00:00 2001 From: TCL <84725343+TCL606@users.noreply.github.com> Date: Tue, 27 Sep 2022 20:26:14 +0800 Subject: [PATCH 23/24] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e9714a7..05d5938 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,11 +3,11 @@ - [ ] 您的代码是否能够编译通过? -- [ ] 您是否检查了目前在 [pull requests](https://github.com/eesast/THUAI5/pulls) 中是否有与你的贡献功能相同的更改? -- [ ] 您的贡献是否符合[贡献者代码协议](https://github.com/eesast/THUAI5/blob/dev/CODE_OF_CONDUCT.md)? +- [ ] 您是否检查了目前在 [pull requests](https://github.com/eesast/THUAI6/pulls) 中是否有与你的贡献功能相同的更改? +- [ ] 您的贡献是否符合[贡献者代码协议](https://github.com/eesast/THUAI6/blob/dev/CODE_OF_CONDUCT.md)? - [ ] 您的贡献是否符合[开发规则](https://github.com/eesast/THUAI5#%E5%BC%80%E5%8F%91%E8%A7%84%E5%88%99)? -Discriptions of this pull request: +Descriptions of this pull request: From a8b293458e6fbe05fe6487a40d00decad5b4c228 Mon Sep 17 00:00:00 2001 From: TCL <84725343+TCL606@users.noreply.github.com> Date: Tue, 27 Sep 2022 20:26:42 +0800 Subject: [PATCH 24/24] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 05d5938..c5b18c1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,7 +5,7 @@ - [ ] 您的代码是否能够编译通过? - [ ] 您是否检查了目前在 [pull requests](https://github.com/eesast/THUAI6/pulls) 中是否有与你的贡献功能相同的更改? - [ ] 您的贡献是否符合[贡献者代码协议](https://github.com/eesast/THUAI6/blob/dev/CODE_OF_CONDUCT.md)? -- [ ] 您的贡献是否符合[开发规则](https://github.com/eesast/THUAI5#%E5%BC%80%E5%8F%91%E8%A7%84%E5%88%99)? +- [ ] 您的贡献是否符合[开发规则](https://github.com/eesast/THUAI6#%E5%BC%80%E5%8F%91%E8%A7%84%E5%88%99)? Descriptions of this pull request: