From 5f341134a5e0f0d68b2274a7bf556e7609a48d77 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 27 Jan 2023 16:17:42 +0100 Subject: [PATCH] puslh --- ...f494febe-4726-4087-ba50-2195c151fcaa.vsidx | Bin 0 -> 88474 bytes .../FileContentIndex/read.lock | 0 .vs/League-of-Legends_Project/v17/.wsuo | Bin 0 -> 11264 bytes ...c8c53384-c55a-45d7-b9ef-7a4ca5002899.vsidx | Bin 0 -> 423 bytes ...ebd68385-dbc2-44cc-bc2c-440425fdb7bc.vsidx | Bin 0 -> 88147 bytes .../FileContentIndex/read.lock | 0 .vs/League-of-Legends_Project2/v17/.wsuo | Bin 0 -> 12800 bytes .vs/VSWorkspaceState.json | 7 + .vs/slnx.sqlite | Bin 0 -> 520192 bytes EntityFramework_LoL/.gitignore | 428 ++++++++++++++++++ EntityFramework_LoL/README.md | 168 +++++++ .../API_LoL_Project/API_LoL_Project.csproj | 13 + .../Controllers/WeatherForecastController.cs | 33 ++ .../Sources/API_LoL_Project/Program.cs | 25 + .../Properties/launchSettings.json | 31 ++ .../API_LoL_Project/WeatherForecast.cs | 13 + .../appsettings.Development.json | 8 + .../Sources/API_LoL_Project/appsettings.json | 9 + .../Sources/LeagueOfLegends.sln | 57 +++ EntityFramework_LoL/Sources/Model/Champion.cs | 151 ++++++ .../Sources/Model/IDataManager.cs | 53 +++ .../Sources/Model/LargeImage.cs | 28 ++ .../Sources/Model/Model.csproj | 18 + EntityFramework_LoL/Sources/Model/Rune.cs | 69 +++ .../Sources/Model/RunePage.Category.cs | 17 + EntityFramework_LoL/Sources/Model/RunePage.cs | 95 ++++ EntityFramework_LoL/Sources/Model/Skill.cs | 63 +++ EntityFramework_LoL/Sources/Model/Skin.cs | 83 ++++ .../Sources/Model/enums/ChampionClass.cs | 15 + .../Sources/Model/enums/RuneFamily.cs | 11 + .../Sources/Model/enums/SkillType.cs | 12 + .../Sources/Shared/IGenericDataManager.cs | 11 + .../Sources/Shared/Shared.csproj | 9 + .../Sources/StubLib/Extensions.cs | 65 +++ .../Sources/StubLib/StubData.Champions.cs | 100 ++++ .../Sources/StubLib/StubData.RunePages.cs | 83 ++++ .../Sources/StubLib/StubData.Runes.cs | 69 +++ .../Sources/StubLib/StubData.Skins.cs | 80 ++++ .../Sources/StubLib/StubData.cs | 35 ++ .../Sources/StubLib/StubLib.csproj | 12 + .../Tests/ConsoleTests/ConsoleTests.csproj | 20 + .../Sources/Tests/ConsoleTests/Program.cs | 338 ++++++++++++++ README.md | 2 + 43 files changed, 2231 insertions(+) create mode 100644 .vs/League-of-Legends_Project/FileContentIndex/f494febe-4726-4087-ba50-2195c151fcaa.vsidx create mode 100644 .vs/League-of-Legends_Project/FileContentIndex/read.lock create mode 100644 .vs/League-of-Legends_Project/v17/.wsuo create mode 100644 .vs/League-of-Legends_Project2/FileContentIndex/c8c53384-c55a-45d7-b9ef-7a4ca5002899.vsidx create mode 100644 .vs/League-of-Legends_Project2/FileContentIndex/ebd68385-dbc2-44cc-bc2c-440425fdb7bc.vsidx create mode 100644 .vs/League-of-Legends_Project2/FileContentIndex/read.lock create mode 100644 .vs/League-of-Legends_Project2/v17/.wsuo create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite create mode 100644 EntityFramework_LoL/.gitignore create mode 100644 EntityFramework_LoL/README.md create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Controllers/WeatherForecastController.cs create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Program.cs create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Properties/launchSettings.json create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/WeatherForecast.cs create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/appsettings.Development.json create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/appsettings.json create mode 100644 EntityFramework_LoL/Sources/LeagueOfLegends.sln create mode 100644 EntityFramework_LoL/Sources/Model/Champion.cs create mode 100644 EntityFramework_LoL/Sources/Model/IDataManager.cs create mode 100644 EntityFramework_LoL/Sources/Model/LargeImage.cs create mode 100644 EntityFramework_LoL/Sources/Model/Model.csproj create mode 100644 EntityFramework_LoL/Sources/Model/Rune.cs create mode 100644 EntityFramework_LoL/Sources/Model/RunePage.Category.cs create mode 100644 EntityFramework_LoL/Sources/Model/RunePage.cs create mode 100644 EntityFramework_LoL/Sources/Model/Skill.cs create mode 100644 EntityFramework_LoL/Sources/Model/Skin.cs create mode 100644 EntityFramework_LoL/Sources/Model/enums/ChampionClass.cs create mode 100644 EntityFramework_LoL/Sources/Model/enums/RuneFamily.cs create mode 100644 EntityFramework_LoL/Sources/Model/enums/SkillType.cs create mode 100644 EntityFramework_LoL/Sources/Shared/IGenericDataManager.cs create mode 100644 EntityFramework_LoL/Sources/Shared/Shared.csproj create mode 100644 EntityFramework_LoL/Sources/StubLib/Extensions.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubData.Champions.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubData.RunePages.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubData.Runes.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubData.Skins.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubData.cs create mode 100644 EntityFramework_LoL/Sources/StubLib/StubLib.csproj create mode 100644 EntityFramework_LoL/Sources/Tests/ConsoleTests/ConsoleTests.csproj create mode 100644 EntityFramework_LoL/Sources/Tests/ConsoleTests/Program.cs create mode 100644 README.md diff --git a/.vs/League-of-Legends_Project/FileContentIndex/f494febe-4726-4087-ba50-2195c151fcaa.vsidx b/.vs/League-of-Legends_Project/FileContentIndex/f494febe-4726-4087-ba50-2195c151fcaa.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..312583726ff1d4d1fcc921b800a832da9a082843 GIT binary patch literal 88474 zcmcfI36$(a-8cSWS3p2TkyR&vq=)JBGJR*cGt9M;RCi}O8>yscnz_w@cm-s?mwlKK zH&g^f5Es-3+yPN=2U!#Z0R;D|s2n<@K!4f``gF{1ujv91YgHAl? zbO%=r4SMZCFB#PFU^5&H;=wc-H2Gkj40e@el`L!6vL>w(K1Sb%BY&FW(in29Yw#M*rtnsonF<~iXskWs$mI^IbSuTF}EKgZpVtJY6^(?<< z>Cn=#)l95bVg<1^Q&^$0LTyFLitszIqQpu=D=RFcEz`D4Y?<83wUxK6JhO_}nr&OX z#9EzOi#2PpZY_>ji>|fkS&L0;G2V4>XxAZUS2x);FuTsq?q;RCS@~`j{^;#yt=`RA z+%0eJp*(vKA8ijd?ZLnvH1=TEwk+EkvaPahDcf>w%d;)twzO?EZL4Klfo;v$R%lz1 zZKbxA*_N@b+_q+It7luQZEMlq&9X}+yEJT<9J@4WSBGs^*=}Ha%J$l}m)Krr``Y#c zThG}|Ww*55&g~$wgV+voyVJEpWru+sX*ONdWwltg-Wvf&ka?k<;IF~W3=2DD>o*}D@Mwrwer|Rd3>}y zK2{!AcGsfv?Csa=8J7MC4#)*^@`A(#rsOdz36GcvBoLD)r=fu7fYbVZ~xNzdG zlekXeJ4xy!nUmyBs+`nwQr}6NPTF$Pz)3?V&79OYY2looDD95;t z@f_njMmr{OOvf>yV`9goj>#Q^b-GTjoLoD3;N+o`M^2tNdFJHC$>*HB=M=G1q)uU+ zu5!Ar)AgKg;B*tGYn<7(Gn+YckuztUdC!?oo%u`-(dx)qZJdQ6=cH-roWr(RY`Rv%_?b8$#liw6I60l$=j7~P?=Me`LtScs?uL4&_$|Ft&09p^{TacwYH*K z8>`m*YOPtV*Qz7cYQw2E>ea?bwV|txW_7Gu9UH5Tk5ngAb*fTTe$}0*dSz@~_3BkU zQf&@bn-kT3soEc|_9v@LxPF&vrO8@Z)f`=Onzd@FRvku>wQ99iZPaRht?tz7F7{pu zUs12En5d18)JC;bWPH3f;ndVfO-0B`lXTnWTQ0MDAyY0M#HH$ z9NlnCqgroNCmOXCjoPSOLh6l1T{T9=8Y9g{W1_KQMPszl81)-tBaN{}V|=7BQAKiN zVze>gHzt}5x7=`5!>ctszu}h~eyyRsMsuvuFEvoylGRvpRyb93vK3XmqF!E6N97tT zMw%;D)K`r9D^S9Ow?d7r=$BUXCvou_b*iJ)vC(RCwAMsZjn>CUaU~l;ElQ(}@@T^u zZB$Uv(Z@>zdP-xg>W)>H#_H9v`smn5ZLCoqYb=e8`eS1g zV-q7|6OFM6J*FncTzAZCjCrGDx;fVL$IBDrwaM|3UB^fK@zKio`hv&Dn&aaW;}gws zH8!p$#LDr*u5kOr`>VD$r9wG!?{CK|U3#sW_R6 zi>aiTO4U@FO=ZQD=}eh?Dj%N8r>F8&Q@NVT^;BL=o#gCg;WM_ErT4O;y~?#|d$(!3 zG;Mp+wm)qL({?;_AEU9T*sa&bPa+Pwm zazo{2$~DUKl&6)~R$idIj`9-aWy;HyKdOACd|&xm`JwV74lED(t8* zRAHjROodpQtFTaEPen>ao{F@J0u@CnN>r4p$f(#-@g6EJsd!k$O2wXveHCjJ2P*EU z7%Su|?y1yQX{u7AGD~GjWxmR^%33N5RMt^htg=*PnaZ$2uCksoN*S$8TbV$ajxvcd zsWL{HT$!#iJ(b%kcT`?ed0iSZ_f)P`-c)&@@=)c8%2SnRst8pPtHP)vSH+y_YSj(Y ztWtA{>RGC1tDaIlPxT_zOVmDv>d(8@uv@OW<#E?huH(5*?p9iEC334Zw>IjI)!i}W zu0OAEd3Gn3Tvc{e%~hVOI<5*`mAT5`v~%6Q>n*wdsOzsk!rF6n=<3+jnTsn*5V}F+ z2C*9?ZjigdKJLt*J5zFJhTR#*ovFApS~^AOyCMDv+%Rz?-;I@|!$*h}Z(q%I3 zW`S#RH;>#rb&Hl;1a1+#g>j4Aor~O_?e;vk=es@a_L^=lc6*uIGwy2RqWAR!w_mtR zmb>J5gN|nnd$#A<#@lmGuiWs;D?F#v?5>LXsm z^G3_wXw@4V^(L0Qm6kWeBnbb46XXZRJ@8x@Vx$Wg8FL%7W;^os`zRJrzFV|ikczNXIiI--7S!ue>G8w}yQ?@a@>QGv7A8o%`i6zdYfWwONo|$1 zHH_y#ZSSV-lD1vxbhg%ZpzRQkYI^-c8Xm^9ZSdTs?XE7BbZJKO zyLfESB^9mv%PS@(XHm~a?c@C&+JyO;qBYK6>qYXW-^!SoqY3ZqooECBy4E0o|rws0G zxS#21TTf5xX{}dTdR0lU8rG|(^{QpuPUH~Dy#ZJJ5La+qopJHS$q-vdN zy|>nV-K^`T(oI)4wQdHwX>?2Jme#FAx0Mb&9kg^1=^&RWgs`N;VI4X;oRl6EY8?hT z40RakFwtSEL!-mhI_&FcP)D|oN;(?Wk)xxUj_Nv^)X|iVl#W~-X&tq6l;|kckhzFGlh$~&a}>&Itz3b>MYV(tg}RCsm?N;8J*=iLsng#&FXAH zXNx*p*2dDt)~2M*u*Somsc18$jl#7}8?8-Sn~pY-Hi)g?K zMdzbBpVax3&XvwxoqIahI&bQ{t@A+VvCb2nr#jDcZgigOywG`9=d-%2bXV(cpl5A8 ztMx4YNc3!`=PW%}(sM(4ZcjZotmiyEr}bQ<=TbeF>t0FsjP5Pzd87MtdLhya3;HCb zmn^+h(#xJ+&h)a;%Q@y^nzq-pTTMG?+F{d9ns(N-P1DArt~_m&8_jYkBlmi_iRYV! z+Z>x{PPk1~ZmQ9y!XKXWAk}HAu&JV^Dw^&XhLBCy!zi`sqqCNqdK``3)JDcZ&7>K4 z&7jo`!e$URgRB`Q&BSRYelrQ1N!Co}nwe^5x|t>DkImd^=25eVF(1^jOD((Fvb~la zv~1HVm0G3YR%sG*A}wdA8zzqOXn>;*V2ovmTtAORy%36^HvbIg1i;#R+zLR-HMY|610-A zm1M0nX{GpWT4~YB92w1Jx|Jm@Q)-#v7G?!ZrDdjDg>Dr=tB6`f)|&6PPExHUt8ERp z?VxSPZM%yJowhTCDTB5%({|?C%4(~it)jMy+bY8VtF7|3>bAXh+e_pjSSz`O>SkMq zZ5_3B+}0U7Vp}h?n*mm8w>#~2D)-pHZwI;^gzX@12c{k5?MSubpq=0ow-eJ&X4`4j z&VqK9w2jv`x}96?yxh+5N7T+uJI~vBuU)w9B5D_LyU5#fUVAQYFAN3NaNyvkT?teR zqf(3}F|Z3SAm|63 zJ%Z2=LLG!b5O#tv3_=rxc@TDkuqQJyk&>%g6b4ZgL}?HeL9~FGQJEBsOF=v=Q#ElV zh*t*jbP%tSQF-jiEiu;8XVD|#Ac$vzI1J(_h~pqmf;bIg6U2EC7eU+&;>92-$$U?; zGDs$62${q|(hZWOAhm;)J9OPDzmoY@bRT;-K$b%qHf;`Epc@4Hnu)xbB%3kGOkq0KaL1bN>|r{k;Z8Y`@t4!=I5V9ow=?B+ zrh?8?h9|eqRNmRk>P+MLp@pZBj;lL<($RKDS2|kbg4oe{NB3}1=rqGlE5I@61aT)w zJ3-!wlTKE2Fz;pjj%jyH)G=u%PdY`~>871!x3e5{mh*716b?>?Rw=ZG!#z}Jd!cQ@ zQYkDAho#A|jEO4D(_u&wht6DBsfCq#IBkckO5v(u8I@y@sIpKQJZazoBUHW6!>9$* zY?aVga{Ka|816_n@lA+Phzu--Lrlf#N!+tTJ&oINs683);MCXcP)E3DgxZ8U4|O-x zbD>_wc@+khjQuenl|I@GgBJQk7??1~*LS_aFtozZ4#QFy4u@em44p8ngyG6CoD9S1 zFkB@Mb0LOQxR;`<#$lL*p$Wr040~bN55vVUQeo_b@%m@J1kV{5{Niea6_YSY!z2rn z*)ZvaX(h}i!>kC69hwrR5<^o7%}Ti~n|5fD(Bz>h!hA5y?JzHe`B0cUVZJiVCqq1@ z<0hZCL~0d(O@aEJvelzkhG#Qjv95Q4qMS56fRrSh9Pe$643xJLy9Y;FBPyn~^NavBBjr3B~%%WBn z1zr^RQP7Hl5GQ#Q)}zpq=~&sUh@yU!cv0dHRZt4i^zVa%JvtCsQn8Y>TT6LQT%zf%#O{9|QemB+5a z!*J{_#okoxxiU}RoWVm*i# zEU_-ddRQj2buHHQSWjXKC)TTC?ZtSoz|c=OV;#pj#Sksl*b0NB*;voTdNI~Zv0jdw zTCT*+1S5mERf=1~am$HYQ*moLZmo)2DsH)P%fqcbZiR6xjaymVGI0wdiTSv-6t|Xf zzrhns95iv~h=T|haa?fYAdhEs+$qJK;kXmWVG@Tubdfk#s7)Lvaomp+Ure$%F>#W| z$!we~#Az6(S)3N}-bHMz*x0ct#ikr%^4_eHSr+5V{lP@BNn(@7Wz8}a9Rt^}>NF1LeiPI$B8*QD$ zc@lS%crl5WlEhDvj$AkslO%bP^pn(*S15RUfXRbYCuy3bS(2J0&6Bi9GAqeSNj98h zl_aYrSv|={l5Ay?DS710@LYmHYmj6exeVhPkeMXQlWaE0dP&w#j804-MH!QrJjp9b z?j^ZS@^+Gk(s%MS$xTwYNf9SSniN@5x-w(@mY(v@(=d+G%AjRUT#@Q`JsYCsiS4@i0%9dhOH; zWzJ7#6M|IRsUA-CWU8lAty1mbxiQtTw1+$(Ev9-YZRTlnE^T>f%THTb+P2cbPlF`w zw9-(?V_AqlFsQ*j34Kwa_0g1RlBJ2kPRitBs?#)-29|$wY1)^^xGY%T-j&p>OpPZ` zbtabwyBvd~G|f$#cjf(6;ig5H7J1su(>XVtE7G2q_VTo^(teRH45bU{-i5-m;NC@$ zS;LvVTV|Isc>x?`w!wSZtTc@GtXXL?8>(bwgI9o==J+yrm)BZFRvF4Ft*jE^ z1yWWqS#3D0t;D;QtUjF8S7!BoHZq)ztjtFG*_4Ng>}<+pQ#t0NvsI2v^~qeYFV6ug zz~pSEqD;k@GtHFAWUf=@^)j!S`4(ngGC$0GlW9xdDr>y0S}7B*n5NRcJg4FT2oDn& z8|n}@jZDYVRC@1BV-q|mcC#jCXYt%(GCWrVmQ2&i=-HR2+n|#Lv9xPoFfPmjtkBIm z(^<#OI)2t^W}P7G7#RSY zEqK{7K3TSGvgO=ZC1VX6dpBd3jP1${pB>0h2v=e|F?MR~%-F`*xha)QY1ot|P1!SL zysE^@V0qVT*1yV?Vfgy@vUnFO7jGxQ3sl)B$Kb7}S^u)r;H73|$W&Z|Zd=LBO3SRQ zm?_Up8N8V=)0iP>VQOBk`s=6EF)eQJuGP&j=W8&xE3>PfOd;TrOXe#xc?aven2a-i z6EkiyG{$!^WO}P4?=bbK(UX`(k{NgH$-J7(wqWW6QzSTJ(B7DOz}!LC=#%6d9Bs$6 zD>66V_GF4ep8ZnO#)E{5hbt4b@Hix+4|!t2^$F>Cc<7p7PTl~^_#V$6#&mMiSvDbV zSxRO&BHTVZxZ#<&z`eoX>0GYkk=)IauDmgp%L-;eLY(b#*i&QDIkR_YjD^GI1jHz-1Eu3S(xC=^L|X%#yr_&hfGcFBW{6T)~qNhD$lF zrs!G5({GyvWfoGifLfHyG6v42d~h=d^K3_GRD_dULEBxW&y;Lr*lsb4zl&eUF74rTD&6(%!B;IP|ZkBrvrr_ni zVR`4TSIQe3nPK#E-IB*mJR;~wh9ojshNCf;H!FEF$(vc;G?=8w+n&s6 zwVU!_id$Se%Q0mj^8$FJ$6Qx44_bK;$%rOM7M_suUX=IZyqD(tr1^Z7Bb&a?`%C$P&KH{bqMI*z`J%~}=kw*oe0jOB zONH$fwqH1^z&B3h)g4N+3fC#zO5ys28%i&B=L%03c)Q^1!Vd~PSZKS@r9uxEx?E_d z(36-E#>A*xL1n^msc1Pxt5URd(P|Z~ppZGKlZwDEf)MvZ%nQhSwon&gDCY+r@FJ&( zriy5~h}iYg&1x4DyO>m+ZL8U~o^1!SnEwjG*&v<`@>zV% zEgqgt5)9pD)8=dz;3hYl6|-h|b~c-pfBo71{G3&qvxet}ytzGVbB;GR+L#+3om0`A zTdbdjotkR~b5S^#crq88W^=}$%O^1@D+3m*)U$?rcByB3J-gYngPz^#*%5~7Jv-^y zS$E-(C;}>&q;dt2G5k&n+keUc()q$TrDp}y|z4pdr1%Pw0zz3 zgPtDjHC3;rd#!N&oipxXN+{Iw`V?;(qofzB9v;<_qL->(s?l?MSm@zlKM&HMhm*7HFyAH?&anh(SID4LJs`6QW7)A=l$&k9^_=W+SY^ZD7? z`F?4&<;hosykvEhtTye{2B(y_TF%eatMkQvsnjnyeS9rtw1M|*eRrm>-M+kXFnvAW zZ>xR~_mdXhm-dUGKbQ8Ux|jfq`tvcy3;iW)VaQof@q)Z=#84Wu{BsM|S1kOT) zr#NpRbr#ajLYgh4-G#Kbkm&`JFXVawW6arfVWG0HknR`h{q~FY+i$|=(QKUaM4Q^b-dVAi|E|sjM(#j>rUvjeL-G-LkWZ6^8UVAyv%R#&xs^zR$miuwOjO)mJ|J|>6@vEmN z18?Q(V%?gx>sFhCk348%wK?LLwFj(Oovk_Yh;^&OHTxfU%$o8MZ!L#w4qS8iTh=Y4 zYma!_ngfnrtq(u?;G<7yuHFBzHOC#X_K=0}h;X%Y;K4^9eBj|ntX=bB?*H@e9Zub& zyHLMtga3EsV+4#hi_T$h`JW5s(kCzde_j5IP4}Ozmb{g1=BzvP@c*VpFJ1Z35pP*@ z=xXnv{SQ0x;3E!q4p{f!ls+)(>2KRqjsg|HsGw zKimKREI&Ku@HNf-4?FnK6aJ}iw8+1wd~?XbhaQ@raO9f*yZC`ej(utOKk)ZIdjDwu z!}mXM&D#G`IQIXgKK|kUYY$u#9ERfmyV6mC4PM&)U*8K*^pUt?{kJE;OI*J6ynnIh zFIMN@P<|?{@9lr|ngfqm`+uJRH`_05`^)~XFaKX$e_rbH*PnU+!vXj=l>aZUz0v_* zy6cZQX#cfq-m*GqtvP(n+Jg`H7uSK8?)t;>U*un&fzN&FrRsm?=wsd-9{lFj`uL;Q z9KH^>z<<8+@M7@NmoN2@#&`bnR{T%(_&1jS-=2Y+U;k3K|Nq|q|GX6Z)BgXP%m1gc zr3?HU%g3eYzxKg@Px&|x{>2%%<0CKC@z2++I~pTDoOeeYy5_$Itk1u-d_1-sh-a1m z^L9{rb?N`d`1AkUvj#6Y|HL^@JowbUc>Wna>c!-jajE>*!2kT&5P!>m8Qhdup81rrXe0(pS+}({1T%pp?Ho-I)$Tsf&#t$-hM9e>6(GCmn|J z-y188tF%Vzbc8nO3OY*1=s2CAE9oSiqI=P4C~f#A>O!fXM}4ZHtk+`PrU9Ly9U9Vz z#x$WR-J53A&>U`ppC03V=saCb`*dHr0HrCU51kX$@r1|e-D17KBv(4LRtQP z#;4K`(9`JY^bGnzdM5o4lyl~z_>uNH7eA8kC-EcYeTx1EJ&&FbWxdZZ{w)0*{XG2w z{UW`9UPv#ZU!oV&FGI=y68uR0zKI{H&$sBe;mh#zUB=&|*U)RBY=0eoUXGtz@FU0P zR{Tglx6#|_&!Fu89r%&$?!u3>`)}|g>)(SPS^hixNVyN=N9y$$eq{OM_>tv*Vf+;R zE0p}6X8a6&7E1mv(2bFa!t}!#A3={~`Z~r((_`qd^f-DvJ%OG`7wJiKi7wN()062t=sW4V z=)38A=qdEQ^nLXG^i=u*dKx{Qo! z@6apgmGmllHT^FA9=(QMOTSOAqu0|P&>QHD^d|a4`XhQXy@mdm{)GON-b!zyx6_}| zpVME^JLsMCF8WJ)H~kg;HT?~}hu%wn3#Fgk$M}Bw2Pnt;LBD`3~a)9Q@R)`DbGRdv z^>%@Bz1@||ccZ&Qshkk7?hB>-{h{p7TbX_!J&5UtL0RuerXNMu(sf*ZEaT(o@$>|GB9wfV7%$Ve z(~}`S1Mg(~F8XdL?Rq-nGw27Q)ceDX&w=<1e3bFWpp^Fs#-F60g7^%aM?VcEpD#c; zPG6)K&NV*@z0>-b0@@S;FnCloBoRa8sal>4}Qt|zi0Y=^nUsW`T&%A zKEn7>DCIuJ_;LCKeUko#J_Tj{rx`y(pQX>yztiXGKj;e(pMedKiMSDzC)=$7;qbSt_w-G;uBzKXt@ZcAT7UrV=x(ylu~d`|X;+N3SorU9Ly9U9Vz z#x$WR-J53A(3}=f+N;NSA39H0(>~poF3|nx{!seU0gT^5*U-1p1EH*UFypt;L+GLO zFnTyWf*whaqHF0odNe(T9!rm-$I}z&iFA>kM3?9?eLFpwzJtD#zKgz_zK5Pd-%H;| z-%n4aAE2kv)9D%XgY-=LA$k@)n|_#{Lq9@4NDTDj={M*%>9^>&>1FhC`W<=&y^>x< zucqIn-=o*iYw7ptb@Y1r19}6!k={gqNPk3crnk@^)1T0v(p%|m^mh6)`g8gVdI!Ce z-bH^&@20<^zox&T_t1OkZ|U#o@9BN?e)s=?>7VGI>0|V9`UHKF z{)Ik8|4RQxpQg{yXX$fLu758umO$=@8_*5uMs#Dk3Eh-#Mqfr>PB*7p&@JgJ=vH)V zx($6LeHDE*-Il(FzLsuBUq`p6JJ22JPIPCw3w=F(10AFm-IeY}cc*WpdqBBvlo$`u zJ?StlQ-@Y)mDXsTj?e~OK}YEr9j6m?C7q;GbT2whSJ5|7MP2GqpK98KvcGM{0pkwi zkVZ772~FwVG^2**w4hx&OXp}0N-iYWcopj52Z&k{V2K?%DmI@ zj8A|v9$IGnc6u^>2b6iF_d$FHPQx#G9ytf%6dU*$l=JK3Q0n~&h|j=zOh2D~n(3dX z7ecAWC0u?f{VJ4vzRvg?5TAj|7++4mL$82RkE*)`mtbY^ZAJQMu zo9Qi3>hTkLE7Nad{4EGzn^cngreUAQ}K2QHaU!c-S)?Y{IhIAvkF_iY&6v{iD?U}v<-I4AD zUxVc}D953}^c9T98BfraQ2L)@>{1WPygkM3Ji8I*iynLY<4-#0^i1`fh6sn6S( zel(Q)j-kgwIUn8+rM%OaemXsaevqCCCBL)ihoKz5&vN z^g4Pyl=5$6d=r#%e#H1@dJB~Oy^Znh^k?+vP`0~+@tyQ8`b&B@{T2N+{SCc`-b;T= ze+Q+W_cQ(jeSkhlAEFP_Khj6&qx4Vo&-5|+IDLXXN&iBhg0i1~gVJA~WBT9e^YkC| z1t{04P4P>P|7K9Oe>vTP>02`1it*NT8~RH6Dk$yn8Yt)ME=+$teFK!^v^yPwQcs7= zD-cy0SiyLdjzQ^I!8@$pd3o0A#8gT52W z{=5fDJ>SptQ|SljY4mg``F;?}ew@SfkI;`o$?sf<&%megOWNZLQ1ZVB%JvsSIUZl8 zU!j-KOX*kX*XY-wZ2wIt)-U(&D?`HffD97PU%63mN{jc3E3<2DVT+z<9)JWp3cIS=+@yg!t34`liwP}=cGDC4M;ptRExU8Zk`a{YN9 zE3hCzSf$&GcV0 z{Wnm``yJ!o)BEWCQ1W?z@q_dsDBC^C_)k#QdyMhp^a=VT{R@4H{+0fXK24v2Qs2Kb zexCk=zCh*R%KmLYH>4ZUjp-(IQ@RhVtf`on|>Hd{vV^Cg!l}69>1jCU!)h(FG1PguS41H z+w=-3nC!R2?*JLz5Ymr%C*HRIpVd+5DT z>USUG`{^H`)ayaU57CF2{s`ko>7VGI>0?l~e}eIo^e^-&F8>>S21-4iXZ!-=jc_rS zd^Uk{es2M#{kCNMD#ovdvi)|9Uk7Eo9T@LOcY>0S1*IL!P}-*or9D?bIc|F~{Y_Aw zKO!jQ#x$WR-J53A&>Tv6`!Jq|QqKj(`!RkC<26v~eIVn5=)v@D^bmR|J&YbskDy1= zqv%??jvh^qp~uqWpw#08#wXH6dJ%W|C0j1onxO{864VS-)@vEWK_jQc7r#nEL zx&ym1-i>jYu|q4g3Z=XeDEmFe^l>`D^u3^z=R#?}87TD*X$)n56Dav*Q0g(y<$Z`I z8aNQjdI!;i>D%Zb^iX;jlzJV-cr9HAWn6S3l=J&!dJ2^FPlZyC)9IN|?l@o{xS#%k%m2vu5h&X|2IV+C z&GcvJv-COocPQ<@2`Vewy&Ot;TR}F_irGW}HDOcONMA*bmBfZ|3p?7_Z^-LzsRjJ&Ybs zkDy1=qv%??4odmQGCqzTPfwsH(nToiFVlBG+3!=h{Jr#j^!-rU;Y=v&ox}8xK-sU4 zG5$C`mwtkNl75Q*2R)CTPd`mRLqAJD2c`WlV0)UONZ>K+_Kc~Nd(hhe+X_wzI{rB`fDD{1i@k8`sDDCwKmp{hz$D!o+ zSH^$i^5+=;oy#}C&Pu=E5X$031pyabNm+wMf&-C3G z?@r%H_ny2+rG6Qmg|dDh%60f4 zDES=$<^9pSp|sC?=qdEQ^nLXGQ1U&4@dxRd^h5M4dN!1D&Sm@w`bjAJcRu4!Lpkp+ zWPB0*61^D8eq91(f4>T4`)_jjx9GR&W%P0=>s`h8YAD-(kLlMj{sEWYKyRcs(I3(u z(VL;<^JB(8p+BX!(%b0m^k?+vP|lZo7~c!!I6nlXeg6a{|Hl|V1?BksmGN_o|4yHW z(mpb%k@Ys98`6#F#t^5(z$>BT|7xah3#Huc8Sg-Mq&v}_=`Qs3^bK?n;xkaiFUfBO z(?{tT9j6me>M_Z9ita_Hq2%K+_MxobWZa@{D91Tu9MPC2G^Kmfj2fELf_CXFoufUv z50rNAL+QV3pw#1FDD^x9%JDdq@!|AHrXNMuGW}@A$3V&F1St8R#PlV)Oy3TroOdvO zCzSQy17-X7LutP=7@q~DK4;SpbNR=ioTukQxlVim%Jvs=`6W=cyA;ZPUdH%x`W<=& zlzx02lyYx^lFuz%{$nWH|AO%y^iC-I@k=P{{|3tTzo!pEDgPlT>-~}OBlJ-y+dU3t z|Np}HX)b>TO1(DR=EZzAg0i14XS_M%Z5Y3j@pg<~N4JMk{*F-U_Xeg9Qj6}&ASiC(=bI z`M;g<$xycY07MfFoXhl2Kw0lR#^*yR_p^*YM?X)$K)(oO{QDioSI{e=Z2w)x-=o*i zYoYYNo1m0?3zYV~4a#x4ll}(Ee%%9Q|9=Z*{rjP;|1kYC)1QR0{$J=*Q1(|Q`DObJ zq10;=DC=!XH={3ulK+-ap7(cwQlH(pe0TarDEZlR2+DR2l>BQ@@~=ZFe=jaqOn0eA zeX41bwrCql{vqRt#t^rHfz^!rbYHpvWxE3yzXeLY-^%zvEG@ki;$=*Q`~P}cht zlyc8w`uX(JaQ!%geih34-{A6ZLg`1}fwKLTOuvd=O}`6eyK5PLpI%3=r$3-K&>QJZ z^oLN|?Wc@yg_7^j82_C90?K;7qQ7JM@1eBg1B@Spvi%>S)c;YY|B3#YK1Ls>PtYf! zZ1)tD@}6V-JmZaU65!8)ZK169S}4bBJI32H-huH>jCZEHKxyAy8Sh4ShjLuXQ1Y!X zy-I7e4rTi>DC#t_qr~A?cx*wG5?AsV0LJy^f(ZlHx zQ0^G04(mubWcSC94d!cN1AAOL^AEFP_Khj6&qx4TuwtoUj zeg4Aqr|4hl-{{ly87SrdgYgSgZYomG4d{k+BPi{;1(bH*3QBp~aQQ3gtDxN91{qs) zS19Z6&iIXV4=DBDlgrCYcW8xHX$?yG4Jh@WVERg?@5Oi;O1>^_(itfI$Uxc8oEEf8 zXQ6CA52d_)8NZp!4`BLR86OB`{|=^yF#S+^7(JXG0VUtHjMvelq2zNcl>J+zCo}z> z^xaVE{~me@lzw&^F3ao(2sKY#~GhXKS4i9KSlq8o=4B8pQfLI zQr_nnf1Z8;%K7(YDEogYl=^*x%fAWbJp3NhuY=MKH*xt7>5u5m^cMPK`V;z7dMmw+ z-VP<-JE7F)9w`0$0Vvm{$D#C-XQ8z7b5PbF*!IQxZVV-T6S^ss_TQ56E1+!uT8K>t zN=zSuvcC?L{6?7GfKrc1>N4GXVlOfO1pRI9MgMrA1K$)qquw>(~qXd z&|{&LcM{_zD97t$DD{6g)89i+fzobgLfNl#nEny^QTj0``FsM({(gq(pM}z17c>4c z{R+K=UJ51uZ!-QC{WiS}O8u^c(hgTM{k!yg^cs3C{XUfSuZL2<8<~C+{UMb0_$lLC zq159SjPHQ5{auWI31$6z8UGeazW31wpw#n^T>c2t|4g4?`jhl8P|AA-N;%Il{qOX7 z`Vaa7l}RV*ryI}>=|*&8x(SqgH-l2o&6&OhlzMK>cpE6kc?ZTjLaEmqAU*>t7_Wp< z?j)4_rWvn-a-7?Y11Q_aj1wsN_n_2gp79#S2SUmBASn4B!uU{n7(E=yb>sxbC(=bI z<-Z$B{-;1WPN#AC=}_`Llktb3tamn){(3Hy`kn`6z0Yv@=b+T<^Yjb!i%{0P2ueAZ zGX6T3e*;SX--43w6^yTfQr>k?+W$r<^}ZF#dcS~jpS>SSxqqM!& ztF%Vzbc8nO3OWj9f5sV4Kq=2$vdj*=#Kl2chiOhoO{v zE|l#*$>pD7d>)kJ^jRqDUjSwQzY3+EUxTv!WsEO}vi?<2>UBMod~aa<6DZsL6v}!( zgLpMIa4(ege#hm%r}r`a4~!q657LL|!}O2z5s0Dbz(1h$_gCQNCFO2Kw}w*ws~K-g zUqfFDr9Q7?yglO`8Sg}Qrn}JB(>KsTYSCSx9EUeD-hU@h+Q8@7^ie^no$EK|AKLs&O)irzKj>>esq8OW_kd93zYuwHpYk0L!q?yk&KUm zlK=5g%0Cgxb|*7_CzO8n0mi38IeuqA$>%J_XLI>Ej6Xs@NJ7L9^>&>19xk_cc)Jbv=}FZh%t1o1yf}JE8Q4yXY_J z-B8xMm+^1u@96L8ee{0%2l@b%{e776AEA{0DC0lTKSNpX3C2%CS??+OH>N*LpP|pv z=jh)dh7tp>#ALbj*X^O~*A8??x)YRkd?S={OH3bvQtmL6c3Z*pQ91^tJ*J?nH_h}_ zj1^-SO1_$L6H5EfFz!I<-#y0r(0RI=_UXQKf$m55r*DR`KZi0t3`+S&!u9=_>BmE< z{}SV6`gVFUeFv2Ndly{apP}S;DwltNp2qYKGCq^>*^EC-&!HcIQvN5P^t&%YOw|v3 zo69ewm(%aiE9jND{>OgEvM(#`10=*#Km zbPKvAeFfc$ZcVp=QvX*o-j=?G>91qFJ>7xnJ2T#ezMj5;4pIwB|Jsf5?oisH1m(P| zL%C0mbNK{aNhj$Pl>Y5O=~r#02XqF?engC8DEa1$3n=xNg>wGv&-6Fb1L#|zTwd3{NKst?}D;Fr$H&_3@H0~7MGt5WxI2s+-JWCWxWfz{30m%T?(b2 zUB>jwq2zNFlzQL5^c$IeGviyJw99Q!%DD?le)n+sz4W(G&cnx{toJmOdT+4fi~GGX zTt8lba(~xA3)zi*U-1p1L;BZU?}xGg7J~`D7qHP zejda4Sb7{io}NHYgmU~(V!Q<9IGh5dpPj|@v!Sea4wU0@K9^t2>fwJDEQ1?dR@-tSJ11t{Aw=0hUwpD`gM$d!1xBnH!=Pp{Sm#H-a>y&e?ossZ>6`<+o9C^ z=Zt>=<@o)E@jZ+mpnrz4KTmM^lTeP!GmM{wa@_v`r9C&>>Bav1GAQe9#dvGRuVMUJ zx*e4MwhP^z4s&@KO8zw{^&Vk*gRY>XbPP&;S3=ot8p?KWqAt^$Q0f;#IsYOW(}bpU zZ<NPc@r7Le zCB_#s{tCSmO1;0$<(JXR>38TA^hzkl@meVLxq<07(wpcHq15|k`eXW2F29xDMsJ50 z@(%nF%KkqIW&5YN{I86kX8a74{ro$W`fs%Ji`SK{q4ck9=qu@~=&PaRza!(Fpd5!c zFdn29l>M}!)ME%rIW@*3P|6>LvfdPwa`&Rs5L3qk8Dm3pT0q%up7Cnhr~A?cDD^vl z9!L-2@Sl&CgkaAwjm9l^#u+l=HXzBts-V+C#cs;x=IP z5hYQRhtWje+`&;h#1~p{A?8I|T!JHs;}S`X0{YxyOdu}7r^dkrl_-loM?ir|{r{(a zx4!xOMlr8{zphj3sZ-~iI(4dU-TP$-eZN=I&n@Zam-O#vh@Aegq+eLzi!!9$AD8m3 zq|YhkFD-C)fiElYa+YDK+KT^^k z%aC>8QziYG4B_i%OZu7&k>9?Oe{F`0@4AxydWOj5`jY;S0>4$@w=<;u_ey$yf!{Ci zmI80hkmvMA+&AzYl_B&VUEp+qYYSXg;ISFf|IcR#-S;f;UIpH}!21+<-vWQ3z^1_U z1#T$teg$qUa8rTD75IwEFu``ktR5{r*9L zXBYT~86xi&mh>N$^dA@a;sRe%;QuUeXMtUY%%4}3^iqcC>2ikjdqIZu`hG6c_+8G`pi88Y6Fmhz94{C_OzPZao11%9%? ze=hJ}G6dhJGX&2y89Glh1pk*a%tv;5}z8TVfV@Yqy5IkElr2Q{th`)StDIb*lQ%d^L8A8`-8Pe{lCI4v!KE1#l8N&Bx z6!@$R+1LC*DgPfC;(xs)L+IRD^1A|e6?jg8FD-C)fiKGt{7WVMCk39HA$Tt+=~ox{ zngU;2;Oh#!u)ser@bv}$MTXGzmnHp%4B_L&CHvG|89ni=X<662N^==&onXqpUsf|j?NHz?^fV+fon3P{V^rIuE3cL z;ln*k`d$UzJ45toV}|tq;0(e0kOH?9ctU|E7WmKtPb%=23jE~^>HlFR{qO>RrNBoN z_{ahuRp74{_-h5W18`R^V@Dh#mQ@40%rSybKxF3p1qtiwgXs z459DE8KO^JNuQG;^F+N~`V9qMRNzX6)W5i- z-&Ek63w%p~Z!Pez3cRGiw-vZ2L-1UhA$07`kpACU;JXTZcY*K85P#)kCH?UX;oql9 z`qKq|rohi;2>xp_#O_>|A^5*u;5Q2VW`Wmdcz8+>#-3eprT- z|4PY!M26Vw(=w#~6H5LQ3w%<6zm*~Fo>J0JE%0e2e@985Uf>x8KBK_jF7TNJJ}X1U z^V|%f{{rDMRQvx4>7H{PQxL$ob0!zA8h;{pT4{|1S#s z%K|UTa3bfgl=Q_V{iY0&-`h%hPl0bQ@X`YRy1>6F@Ery2E%2QMzN^4@7x<@M7R~2}5hUoR@OZp2L((c-l{&Gow zy`;ZU;5Q4rK11mGR!M)mz#9s@vA~-Oyt%;d6!_f?k=Oo`{(gbC6nJZaw-xw<0)Lnx z{GZqm@|i5~umV>VxH`khT<>Q}daA%93Oq7H#(TGto-S}rhLbt}m;z@?{;>t#y})~v z@_Ux_y$ZZ{f%hrpzfjUmf$Iz0P~iPCoXq`gD(T}2{Kb-g{{kOS@*h~>g9?0bfe$Hg zOMxd8cw&a|>tPvUFCJO)A64M57Wiu!PUiC2lHQsj@|i37zftnHWeA>AOa5a^{^JUq zFK~N-rxo~{88WY*QqoV&a5AT#UeY@XRF@Xrc7ufXL3Usd4w8G`?{88ZGqFYtdCcu|2D7xHn<- z{#AjO6!^9R_Z0Z{0x!*QGPnDil72^ldkcJLf$u8t-37j7z<(|I zpDOUv1%9T$&ldP^1zuC&=L-D41%AH3FBJI20{^|hFBQ12z-tTqa)Dnd@T&!Wt-$LF z{Ca`kDDayFUSHsU6!@(Izg^%B1>RWTO$FXu;CBlAZh`+V!^zCI{U!bV0&gks)&g%U z@COC{u)y03yraN73p`L@x?jj;qQJ=l4=Zq0fvXEVyuhC+aH_x~3Oq8y$xQE2CH->+ z9$nzwO8J_SUYjBF_wFTqj{<+bz4H0v}M|0}Fgmfe$Y5Aq8$J@Pqp1RWNLo5E=VpLt?! z4lo{RmY~DGu->al{uaUXVL6zjS=(coBzBbeC~fn$V!nF98Emb0q7H9Q& zo2fUT-hjL{eX~`#m(x_{o9O9Ykh_X1>&QEm$-7958vtn<8_k`X#09V*a;mSw!})X! z!G#1@5;(wy*aXcS))dLZ;l{KqA((|jt$97KTJw4=*P~!lGt{%ddVNgN#IlOK>AsY! zv}vATHF=gggzXGwVw!-#D5Ginpi6G{M&$|eI@?MM$t9D<$ZJ8b@EqX%$U7N!%8gq^ zYGs112Gl#tf+`Q1O(6hPrOlB>v*}yT$l|7Yv`PpFa0IKG)t-Dl|F?x3qcyA39zWe zA0p3bdaanDw9EfVQQU4lkgm3XAt=yAs9%K0MdYyvrF=;uI$uSL1t?JPtK<;$H56!( zR%ys+=Ae~=HiGv*f@{1XnpW9mj-+Y2oTtlK+ODJRTBo(RGhsXPaQ7BV(ax{emBLC+UC{duKy0^*sc zl&{vL0sZpbj_A^LAw&VbXM)elCqb1{D5eXgt*j$3Hiy8rE_U836vT4DyX&& z1uh~4v`bfl+sJN>$*>?AK{8C|}NK0cWL{mfP| z3Q|SAIf$$#LmQ!TH90@EJtNjRUh=p^o?2pzDsgu+t%Y@(zDeq>fK+qsban>7>$FVe za5+ix-c6b(b{fG1>e*sJMlHHygWT2h>Dn`CmpPRt;Y4GXBpa$sBacOr(=^kdIM3~4 zHKm$=?LD7IiZ%X9Q0Xkrz#)gQ2!aKWJ}v(z$I%kg!kIjuBm)mav5lB=b1~GxuwF-j zEE%!X0}5n>Uibi!xiVGrzlOXCMFuU~^MCZABJm4NvCMXqn%Ct>ko$OIVL(BkmdK5U zf|fug?s2FjMZo7hheUA>!sC^;B0)G_HOC=1>6|_K?cpZpYKb=)f|f}rl{r^aAah#S z-jbAw24^TEy6h-Dl74kW6lgex3{_ON=yGak*zx-SG}r>!&1(V8O1C} zEul)|Om4{wr;V6G)c=&6G;eC4J0- zr9L?>rlPw!n}HTp*~LLq+VyQkCHg7m`79Qs$^YrpzKZD0ld6u=)_^LVF#=2Z9B|p2 z*1UsJ+4<%^ud=;C)7>SgyDbP@lWPlUF}S2hVA63!J(^YTu$Jzjpt8LR*|rtI9>|zg zstB*8Be6sa^OPzDHnX6{>?oS$8qsCflUwVFbhGHG*BbQoY75a<3T$DXK_Czdgez`` zUlDX*p0Wx-L$YdErC!x*twJCpl!tkToIOJX^_WF^iCEy(ppVT`C6eU14X<5F^AZIH zd$bJJ69GZ=mLo9)lTo>^XI|7Jua;JZ85;@?R@)$mKAOJYp~`)peOSdl!@#g_`%5~Ov~XtK_aM_1AQ&cb<;M2mb@toz$fMd6nI#J z#KQ6~_G`)_bJBHY&A3IxwSt0JHR^&f&g8N#%n=(){7+Xx#*z^R|7`tMb^!Lmj@1 z8)KV-f;jy^TCbK;2wx;-Fb8H2d54xZcy*NPmdx&}#8I|XkvB_h^lX^6GWJxu^fdlP zH$pCfVZIHc6(5wvvKq89u%U}`}+;Hrq*(gnKo zENvBjo?i2;q@iXDJQ8;+6DKh!jf3Gc4&f3zIXy|3adPJT#E<8OZhVz`;gC{r0JgWp z_&!Kl1ubIUPK$l?`+fwll>gH{@GX*5a}F?$ImY1zix)K0dsVm`Nqh%rXmh&`^uZyp z%;x`eCM_OEOa#|e+m4=U8Fca;(Q3HsJlAlCxM{l{EHntJCY2FX$>&8F>q*CI*l9<5 z>1e@eMO%-{w?pn?{*T8iaZX5=9)!Au(%hUy6;(bQVR*nRY>7xYCnU;nW3$W;2ggz3 zfV`VAb8a#nmY6l>e26}bxzp5rvauD3glnpWdwXThr@hJ{3}Tdm*!1UA6sU<7@Lh*s zNz|i?8$fM)7-Xj!67;-SW6o!=gD)NvoC`~2PPN&d>OMc`Cw`M8Eim49gJqt!b9Co8 zc;htP0D|y+h_(4Y@so0i@6Cq$dnYXv1>f#Uh%N1=bi0$p`O!}teoiGGv}j&6`ms3l zv*%m#&vEp#$5m2u(u8}MzB8xN6utQ{M?>cPm_y?{Tk;Tffj%}dj%%cz z&b6^GwsXcY(_@xlK2C}QSQw^CsooyMN6aC}KQPB4EI#{CV`U=Brdqh^SEbsVl^#pw z>xp@kEhnExGmqLQY38Eo;|7nPc-uMo08cMt#c|M^NYy&${`#Diwzy*f%aAHF7-#4n zwUc@_yMhAx4x=znDZd@~Bj$zzH$<_wr;5gsA9@O9cr$w1K`9>#isjgGgvcOw!OBeW zIE?ERbD3tYQL7-!{a~nonw_)K3IU(r8hzF=sPdr7dMMQ^P$L}CA_b?=#}Nelm`L=| zGIRyNhl7Tsr3a;{^7L(YE=+%fa;Z|6lC;#vNopN$$S1{f0gO0)9HmT>)o}cj{GZNX z_|8VHsN_yC7p9q3dNQ{#VYP5CSGjU3ZI!#KEq%z{{dB&G(#CpVp6G3?OI92|(fOGO z&xfa9Wcq0ZTKaY7$&G(Jm>cuzvnt>yDb>=r4(jK;oC5tEpBO8_4bWn2g)YOENE(cA zB6>_356vVTc?|NuA9hLu1~}+vs6x>y^YbsUFzW%_1jBqDst3T2eI$NCGl4Vhgo!Qm z@pZqn2I{qS>a$kGHTgQ^#(&zZX`z{Ra)!2d_N89|fg3w72>8fUuC+NoZ6FAD1_YAJ zuav|gjL$=@yqkLOfj}J$y$8*WH1qxWI4-iq9aQ%C?iFxDXHix5QJG5-l1&}Kln~th-+XD$B=^iBN@K6G<0Oq9VZay!N)}kfjHY=X& z_V!4EXTKLG+)g>OA zSOw>8qDh62JB z*Wi#pW87Hd~!F<$vTwvzP)W)!3y}aYC%pi7_Hvf zITGuFNIjc#E@+1N^naSCBR!9KhVZLeOeyWL=uEV^FfK4SA6UWcnTfk2v>vN?m=(bNo|C#P)k8|=)JU}VVp-pBy#T;WLB8MjpOU-NOayJyHqOxQi;_+e(G=02bKA3BbSIgQ$GS8W-a?kYcrS1w)9xi^Ho>O+m8{a{Oyx^a%~ z(`$Y*EBv)@P|y-UcWSB@!;`QApg(|-KBU8J=MT&^!VBt%g|ujU1xe8(=%K0Bl3a^L ziibH)PW;5t=QGsXO=-20OzwCB-4eSAKI?C6Cb>dVAuC#EfV*RF9F4d~UN+L58S5S~ za z#pAdfNxwqy7y>=57W#Dfw38a1d&2|0r8x8?DH+OAnb#+5^(wMp+p8fTVnRwUQ6jFFp#;UvH-Pd{Al;s6Kv+Q<7rD91gIxQ+p8^)%u0 z)LZD8t%B$$wmCmN8!|ivivvmWF0wabp16+MKMEQGk3^kda*|d_gQuzQ5R{u%*R44A zLbhu@)=P=6`>vJB=C&N>{@$Cta5#Q8_$m zSUhBNL$! zEj&=B6+abJ)=(`H!;ghjvy@ZmLaap?9%wlk)_IIJy3FSMq(507kpwE5-A=!?MKzZ0 ziq56&1bmV3IG-f1AumoBoadmrR9h_Jm0T)6;NU)D@$WUlsd2pcz!F#ZEUal50(sDfx)*b}1~VTP^w$^SrkEbQciCf6f}I`#OM%PXIW+5Nb}a$F zJQG`h(;2?^fsckNpXIA6>mX^+Fxy<4F#=$t0bAiuMdRzCxh;p^Z>?cT+EXQ8+oG zbyK#Win}MR?E+Nsf$&h8RT$*hTjfYv3l`n;x?y`4E!zB_ejUboZDEeQkHI0nVzdbHlnkAH4N8M8}l_9((xt0rqpd~w3MaQ96 zZ5ck=6H@4iDb=%NC-~?#ZLWtBC`_D3z;?Jf-i@ck2hy$v%Njg-n}w4D?6`iI)cb_j z-IJb?Yv@}T^c3>_I2~P0Y&|g@FTIx7AAu@dKdQKu_KAs8qwa*`VM(qLFA{}|NL!`V zQm_ny*U|6sjvOg#izR4=Qs)sh(h9+&34FzH8a@YAQYv>LcZELq#mYFQS7RNoE{@}M z-MY>yRMv2hD^;`IF3GFvZ>-RfD~?Zj!hIu8&Gyh(lU5ad7JGzDXZQt1QX2m ziQe4!yeCe7;fq-GrCch-GRXPqd}OZP?;)w(cm+!6M$wB79u>FLTO-3D^7HvWUYBy6 z-X+7xI|G)~M@(wsR@ypLJ=%CW;;Mml+nN8v6>=swh(fo~ZNbpB6vshnI7)|{B;b2) zohi0(YCu}}*;L^d_u`I?8`M1#$=Hseqe^7B#I$uQBiDBJBZ`+7p+ziRj-(5iI4!X& zG#N}kXXpW^uIL$l-8b%pPdY$roVCa@+z*utdARn(Avq)RAf-N(_mRfgRJJ32wS4Fe zvi%^{=+CmqdD5!~rBLdwsLh3`A^3gzP#)6`=HPMgW6fcLnj9(5bO_PoIUnqCR2%Wf;TPW0VKZ__ZKtp~W{c z+8jymsj{?%l+wqjlXbAZ98eSr9tnor_fm|aNP6z6(6gI&>w}LM3cZaMd|EGqj;iiV4Bn!n<^%g0e zh1sA>`@wuF!6uSjRR&bWM=miX;f8u2XOXZ(eB(y+O7N}E|M8NUn{?2n3-J%!Py6)C zcR^zvgz)3lVkpq)$B~MLg2oGK6EmPLsdG>@bbE}U%ICT#c5P2SU7iaQ z+WepX1N1V-%PrrBu})6aXIduG%qcD-dlDGi|6C)z8*y72$9HInrSUqPj=w`i zxjwl?;??=t(eKbN$d>DTS_|Wp!iMgD z@VOaPJ9XK8J?Hf~KbZ3tVkl0EBUWaVrzxQp&=+JdjyP+f51)~a`Y*jn8kL04TL2h{P)Qg1~MT!fZ)amkn zdMBlwL#5QVZH`2#+SHMGyroo*j~2jZS+a&v&JpMhJBd$*P3qs#cIo;{+uO$pR9VtO zPueTFzHdLen*hreuq@MJof87|&O8@GC$Zj~3#rCUkJfWC;GB^MFNZ^Gp!r<-@F|6NVyc^>d40al4uctczpm#? z?2kYtkp`9K8r$4!qI;K7Cc32RgUG~;E|g{k%pJ+~1Z&YG6|nw+c_}HQNh>o~ww; zgEBY$?klt)PVsHbZnr%8dNWY!e&&fe5)UUQdsWr}@foe%CJn_UFe{u?3N{h= zzVnpJJA)ZIw{WUqd}l%LU^GVhgmG-c*c_JE8@y-}$7qN`GkjxTWiDr>Q&5XIM1U5l za;T1I8ZwlJ7S3xf@ya#@9$4Ad=Wh$-=`5}T)gd?9L)#4JuRLI=t6d=FE|ONw;_(!V zu;Nv(5i$2hHqK-EgDr7GQzWtEeZDw>XbL@7_lwK$`7i_QdeidNoC-Z? zh{1v+f=+v-08o&h?jm!qH1R?JSbgH|Lxz3y@jG$nQAWPHMgye)9Y?`61;YOA53G!zL`PN9>K%m#&r zwC2<`#xZmg=3oRTLim{=*iPGhGz%5Tk>I_4-ENf7vwxo=OZc%gbE_&(yPQf5!4n}X zjtM}&;DQ1A%@RZ(C~<0f4vm};#FazpRJU}cFVb>leIqgli7Rge{u zP#f0Ksq1m{6vZ246Q%qzSvt>Q=@R$D>L{I}z;jl|_FM*2PY0h)m7il+dTEO!-4Mz9 z4kF{sL!$*_ZSfP{d;v>Gztwfwi#$AMPztkFF@Sm>2UpiL6xb1Y5Wr9yDr=VFITOu% zRI81Mmn&)EZdMftQ-B0)p+h=DGh4u_^gLQ<;ik}%GqjVcckc@6Hj3UO70p-ND*%Cq z7eiNH$ou%gp294BXqDqm8&y_hr`(07UTpIbnDWI*OCO?2oYgaJ<&cs-04IHY&Fx$` zUXZ)rj;gx=86LrTo6mdjal+zBOfF0Z7CjL_@e!br&|3wql+kW!l43- zJoWPw+CQ~eJ9!vv-+@(*Sqm0lWRoxZG@EqvT@{$hyBN$2l!|n3&#+lEQ)Tt)RXjm( zQ%J%vRL09E2d7P@tN=6P%I*;JJ zM(}&^#e#;8JY!UNn(jVd2L5 z5y&!J2&&A$W9xkvZF-T~1Yfip+jAs+6Go`Em8uSPZz0e*xC1P%TP-n)L5JIQ}6%;I(NYw<%U`W z7Kn_u)KK2Io`inj6g)xG-I{j|fHaNZ zvl)ZqP}j8CUCxRtEgOibvG*g^>B$iLqC-WIw)V4@5yaaAp{$U$K%VCtqmLkH8}@)I zcJ5)dy=l>RXgguT9OUZVcnWdoFF&B@zO|sD-ve1{JbZNSnW{$udKAv-q4(dapsIK@ zco|9Jr6s5`pk8<@)S;jDeWcZMrWYlN2sUD z_u#I_XdTIp7I6d&s!@|cWm$5#4D0RWh*Y z6{Gra+$Zi;rF>YT_fSp705VhtpX}+W9-)dt+PpEU%tN>zp9#BB)iLMC#&avQc;Ypr zgzAP>2%J%eF@&*B8?57Z&tvX8B5kqG-MsH}QcC++agKwumgEY7_r3ihi&}g%oewAo zONd3;L-I=m`)I4uFezeNKb9&=JA#J5_p)eOzJ38Q^_$RsmRT0Z(-F8POWcchIhEW& zK2tp)xn6x?<{k1m*lUqOeGca9dSjo1flssPWcT=Kg}ed1=}PX_{-HU#DXX1`^Fnb53S|sJ6W8)K;ar=D_Ief`N4z1*->BaOhZo4!pRi^#O7I_=o^)~oj z`5;KH8!~b>D(NY-SWn+aoPKb_$LX;eFrA%IuC;pH&Y6LBgU)paHGS@^cOWg#uLdYr zoB#clnOI?U7gW9V*sFNZ=Mqi5={ zb=!{Scm*`B7t)7rqey*1B+}D!eoOp@U zGCHzFJmjjjP7On2wIy|-iUSv<-@5wIV(6k09eKW?w<$rYo_o{!ikHt#$K6p1rz0a7 z`gZitofF655TMToH}zL0wjwC6oyRjdRZp!$ZEt6?uR%ln(CVR2%6tFx&1_{9{Mfq- zmcod*-DYp-MjVPEy!reeny6wrg%-%W9D-C8wS60T9n5asJ*jY%)Gw5beTxn(VaQ-f z}eTrD%L=3ACab^U*^c2%n|O#dOpVi?s*c z@KK&KFQngBshFMdj?&vt8u*9z#?odX#yS_oOcl50GQttLa()UiI>lWaoXJjuPDb=P z2T8zCb|(YELkHZV)`xJjf;#*lmU%gY<-N z^zONpQ4mddyzzgi6|BwGl7ZWiIVgyu(|(kX1=ZM(oFPU%X)p54uyD!ev7a`Bf;e`C zO|eG7(|X^+^>Xx4Uak?hEVM7xzmk&;r0IB#++!U3MH@unk{V8QKf#<^b9D3*u4sYa z`rh&SGpJ`Q={XdvFnq5?xxw<&-X3btz|+lCd5Ue3;9~xdPZXi6>2C=9m7SqW?$D<; zVOY}+5V)1D8?lf+`r=AgZzal8ElryXaD9W;)kNbr-D!J+-RK`&rV0DmO5~dToxR zj-+n)28_oFfqm#xFHou@ce?Aj9Z}`{9*h2lr+K?`e!}Rb&V`xS65Q76NtFh9&bEx` zRI0oMs^VP*nF#vP7Z#j;)Engg6z^e>Z2K11fbT)DZWbm^_Vg|0R2)aUZPA5L1x`nO z;%W)#J+knZUVaEtoiX|62VUbRZ%!vbd2U{1Eio`)S$^>4rQ2sf&^->Pfy7JdFak8Eyt%4XTrnxoY9Ur-nTfF^=6p zV~aJ-mmaLyF1Rithe2BP|J)2bpN=-6gk$gKF$9qwdoa?taAjMN)~OcLC1(xYZERil zkrsnYSHRAOwqjmSCdMKHJt(J@{*d(!P}zpo31Lu)j)%vt*HR!{^g{n6Z+>rmvM#mVzX$;lx zjl_A5J|?{_QtB6gtB*OdL5Pha^;SSXc}SX-5%n7NwCCP1iJ>N=n^> zxhGc59FfW;+rOG?grHtW+wZU@>o&GIl1`xCSgk;{e#Gig#f_Z{sl(S_>nM09bAL`o z(DruP>V3IClH9lnlk?Lur4#msjypMh4lB7a5gjGdMfHwd*1;NEr-5&?jni1w5$jbJ zX1fIG0ybhN1)5DgP^aW-3f9q4th%sCbE88geG6a-e@#WFN<$E$PzpIU{)@8|G*B?= zM$x5<$N-ka;R;CO%~%=BK!R6L;5`rKVM0IRbG#R*#UvYoH$uxRh$%PS4{sV@M!^LX zyx!deQ^RwCdY0xqdWOd_5=0Bn;5{V&Z*&|_J?L@c*h;!eb_rXVT%{O22BNT-!ovOAty;OnvcZr>s{G zLR)z3ClMAr( zow?qmouVi}T6dK*aLtRFgB(debXw_xAru$&u$^?|IY^r$N%~GBrsgd7bMW^55y|K_ zoQfl#ZaNVJ+IF$XI?2$|_}SU;L7+;tb-Y0kqHrH|GWzF}Ru3PSq&{b*6Dja<^^8<0 z00bxX@j#lW9M|bx?G!>09J$juJYVX$u()^jiIbA?I)W#&&gpoQ8U!xPD=@nnt&Zd@ zgby9l=Tv%;q!II4N=vLGkQ*JHJDJ?)eZW~EK`J`+E~m>Or6z9$JESSlF^ml~Vw})s zL(8L_>@J@e-%mlBy!YutETnWKV=tz1>^>bJsGRI>3KibhA;@iuuI>z!I!!%cSq4>o z$t>0~370C!oy-5}YP4wq`n*#a;s&#eq4F5WNeK56pzcx3L04yWm%;3yp8Ey)r}@&g z(*3=LD()a%XT-eUu|es$U6#t)AbAlet=PLDK`FRBN8*TI+Z1a&WNe~f#d^f9BPO#g za5`^;pr6XiSb@?OR6Yp*>l{gBrMHr|0j{-j68VOUsI^c9a#nh{CP)Od^Tw*&h*cbJ z=tS3*Nuz%=1>qkcyjWawBouhaVp<9X_hf`_74FLCJVE7p?nKlnkJTP6Ih)ds0PNwg zxa7~1WGrc!0s8Tekvpkl-&&=`3*gnL2LRznJCJJhRRNdsmfoEtO9vm9FWG`T$LnGL z@iL4&S1VnnbJaES;ur%_Y>?x`)Ck|fuRGE>Nr0-ZuOcl@I_J4^b6L?)M8PQqM2@-T*g7H(j(i2P>dPtk02n3eO;| z4lpDqu}{P_&C4+MNa*u!z-*2L50rK?}h!wsr3?{Z;yrRIfC4PTt>R*@T!<-kIL3x-xjRG+8W zMgnix4?S~GeKhq9+I6}N=zo|p|rGcM1BrS&DJ3hfkzv088250My$9zkzB^;&I&fg%{}-M7ahRYA#)iaOLY9@kff==cBClQ(vi>YEsaw(urQYN0_5gbRemZf zddk6iA3J|}g?1`w$>?$_7-8~EnrU7e7OJ1_Spuj|gJG93k(^AM$$NX15ku0_#F~OI zw^Jp&Ic8p*N6;dkLr|(ZxQg8LK5Y+3B=mb-rn zCjxOH3iJMloHj;+iwMrU(B7G)x)!Qn7PuOU^1v zO-X!esqSVm00Z%%EAD6HJy0)H;-hHCjK zcnL0GxF4zUN^@8)6u-;=acftzDR;e9 zG7l|!P~K;S+7#a#W>&aqJ&U}tr^#SGzPdQfOXr6UK_kZ*+b*gcx=T0x@{~clUvT&C z?Ae*KVufYk=>@P!?y5e%zrTUJq3@w!rS8htIdZk+6SkNEsxsvI398YbvH|Hbyjq8% zh9<(H+5BH#0;W{69-D9Z2S3$=ArGDwKAHCwo9G<$&QR_6Hrg&w4-Usy0Gy4Z-~6Fe zmG7h;>Fx5jyM{-joD4!Y7XnS2brJxAinvNj^tec0YYi|0r>%zl6|4)7Wgfvc0vAmR zRG!joh@Bv9pi~*@)vMHQ zF8oraWL!*@^Wc!{)+|`O4eqH`+~clOSL)Fwx7@eTb{pQI0(}fakOHlvYG&sfske~- zf6SF!`jt&yPJ0=ZeTt$R`Wa0h%n_;I&)H3$ThL2203^@P{~-VdH1y$qPohO{fI6qE z2^851BeK9V6t^;p@zIFKt<3cdVLei?)Qf1UsAk0H3-b)$)BU)01=liI*N;7$J;*XUIw~@iMjNha(*D`cHDo3dv zEYmC;DoSk@YrOJ+K3#)`jzWECp_}ZbB*!a#ejh~AHX;g__hZlvZx^*Wk_;N8wUGk* z-Po&bc&c_ul@8wP%ytZ>&Hw52o@=XNQ*13^yN-|I2Q$8|4=}g~;57(YXTaOa0 zr}1?h%EPg#FRDNX0_{e~1Nt20)r@i%s9sH;>^w{*B=3m6UXxR4vM167S0WqbL1{;@ zkwAhB#Ai$a7|0FHwI;H~bj25Z=<-GoXjMEU56O_%5%>iLb=+ZXBJblp;aHIb!_yYj zcJzuH)F1M8+l2?)CY8$-d-Tu~^z@jXtQ)}Ke*C+tnq~vkFW$Fzp&ETB4*5E)qYtLV zt16y`&N>A3020myU)Tds`|hw?K@aESD^+OS8WiV^c;AWXMy@d6Ha?qak#5cTx??5VH`5zZ~WC&|)M(3gr zFEXdnR)Py5W0BaB_>hz=@l9{1Mm&20i*09-LRUN2Y?9|gA3s{4i|uyP4bcFl@j1I| znY>aXd@l48&bVbK=;ve@Lv=ItfgDMGuxXQ;&72v!C_<^T(T&MnK1rn`{nK%WsGqYB zdb6XULsWY6DB?0=-fMB277t@VIMG!r=?R@!Qeop%WJ8Dg-$jgQq!_ZlbaRaB?1Uk0{$m_J|Mf=iulb z5u{qta}lO*qU)`z8|UP#cBYqXj2Sqw;iOXVrPDU2$`4c$y8|=g4G5jFc{)1e zPy5AVa+-~P7?nKDYv_>5K%PQY`kGf)u#P@Hj2K5f8CtXi(Sn#eVGU@t*<*!_c*e>X zo{p8O)*B9ajHb*z-kE`Qx<{&+Gg-5)Mp$aS1*mjdxh`n5B+|Lnuzt9&RomN~N<+Vp zg7U|r1UFQ)#k;Cn3+nl8J_|a?P$(S*H^WKwH1q&U2P2eH z?^VzjCs|BgO>X@pqH|E|qi*P^&x6YE`;2l!RJkzr_Fe&~9))cG3BQ#Lebqicm?5lY zV%IA{K}*gm;wH8QeQ^`)Owo-}uUZsFr8xprLkD?sBWJ~3Nre)ZjLB0m8)CZ&V)Y}o z6J=NuDP6{uFZG!MA98toC!YrtD37?F1atI<o%5iZfbK~X>1 zvroeN!NkG>JD(2q;et`cWzqLt{K*?=OwUGb-9zZFjhwhDGS9RWS$*SSXug4^B{=-Y zI`n?(Fzy;q`Mr=f_QHXKai(b2VTlSix{|1v3Y329NzoSf`>_44eq(S8vMCWikIqgBwa+Hipus*rGb_U zD7c)q`U3HrVPO7-YKCayTTOJS61qc+Z#CttbUmG`7V{)m4&HM*nbdag{>IaK1mF(i zC7@rT*_8y6=4>=iwP-0g4uawof@DYFwUkroZ2({H%4;_?bC+Nrnvo;Gtg^a>+NIO< zLYQN{o1CTyKF)I(uaq`967R5?+)Hx61hbi6D6aQ?7<0UP;}eNi?n3xo_V9W>yPE26 z)G5AGBTXNEu(N9H=-H+#jsgJR&?zSfBwWjXH~11)WRwws%xMUj6zOdQvd;I$VmFH- zwNyEWQd^j`#pUD$he&G_Mz2*+rA60VY}CnfK(i#npnj}>N|inNKm1s|s(J^~vn7w! zeY$y9o;bmwaqCC@NPmmaXuAal4K37mT@o*3 zPg0`V8qCn*r3CMGrYIwV4Fr22Xy_<5r;1Qq$gNf%eiaGx@O z8+D(eK^bsV5)a3jTmFEiCt2~474-@w*MoANe_#GFgo~NtL*HCM*EFE6l0!?X6A=dP zM@Dyb^TVPM+Yv`Jk9+BBRrU9YohhNkE-?q|)%mc=1-Jev-`gSl9T4P=6!#Ue`-C|o z=fJDHhm!MS*Rcy`zY3&2URGb`=vVj1HxxWATScC)F}e!fz|?S`qHbt1+MHFs(oC!& zaAjXXf+p2J)qCjEooWsN)e`iCqv=IMU8}f21IJX>|LS`VU>+bcZKpb<1FpDLc`tSx zaHtGWBjcg5FN$dsPlZwgs)a1itJBmugUHl-CyBkCRDA{nrFZD#$D!*NNK4b=j<3n7 z@_r~WuW^p}#d^(hEnX9>E6E`rO3_DXF-SfAkiK0=xkZk$cn9o=>xy-33~T7xrS2g3 z>h(SEZplf54XF3%BT4Y-5Zu)(cxUDY@nH!`8?xvWxakVB4)sGv2QWtFtmMd#T-!$v z1{C+z6;s?;V-ke&^bV4tlh}gYtQB&j(E)-RZT^pgibtl5JT`1-Vw{-LYpX$lryhJXXt2xE=t)A(Pq*RwFri`y zF3j<%CAmvMM*trp0C6l-H& z^Xbm1t6p_Em6jQ*e2%9wG^?*!%1%pP0h{#ymr3}zBedXb~vPWUgk39^;I|*^a9tup>3j(`AaCb&2Cq?CbV5=;Hz%|Ny4<71_ zK0ILfJHWESSe*;I8P8XV;WoNHPwvNnS}ZPO%+e-&Un*$csLRxnyn2k@RFl=;MJ{yvUm;h}lT2 zu3H_+;|Of)U^-L(II6SVu)yKLfWsBR?Ir8H&tnjKQ$jv=Vb4;O@=^ z$lz4!Eoo>O+f+5Vw6IEibBa=BDVFv6$`CX}1}zjytbQ!kL+6P-KD%6@Upgxq0V-!j qSPPP|j1lv^)8wpO614f>KNc|@R{ri4AiehZh-`RRz{kHW;C}-C%6T{d literal 0 HcmV?d00001 diff --git a/.vs/League-of-Legends_Project/FileContentIndex/read.lock b/.vs/League-of-Legends_Project/FileContentIndex/read.lock new file mode 100644 index 0000000..e69de29 diff --git a/.vs/League-of-Legends_Project/v17/.wsuo b/.vs/League-of-Legends_Project/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..234447d436a8d7eb38f613dc53ba00d2c7d970fc GIT binary patch literal 11264 zcmeHNOK%%h6h2NVrBEKF5Zcm3gd)@hw$e0llOU?lv<0N533bx2s8snec{K4uGY$oQ z0Ah#4KVZiW@iSP34GVT<$C51z8ouw&T+j7*W;~v0OVapQ6zN4Ry9X-rwJ67t1IP;Sh1)jx_OU%b47d2Hv)OO;IL> zQ90g``SCup{{G?T@9t0jk$VN>=1;hTmw~Y<59BjoUq|VNeAQ=_?(R_;>EI{ZyL-cH z7tjp#RiN<`Z%cNt16wRSCGet*$MVKSy~brEXNo&&oZ0?5Dt~zmOR@_rJF*4(`D_@N zucO5_Cx(=X{{^&<;7LmVS&Y?o&At3<5`gk)Z!I>HPcM1(Q+U6M=Pf+6dCHsbH}O7+ zhvQiv!r|e-v$X$5+rItF|7id3LRW|O4<-P#rqUnK572(kpiJAQO|wq>=UdzV%c!H; z0~Bdb4P=x-6&Y!5eME=Hn`+?AQ0xxt3_fS>WC z_DRA1usZ!4<0ZlZs4oK-v26kK!=7EZH zmRsPy1F4rlIb-m)RFzit;{oH}V^~X{J#lz--zW<7Z3M>s)HoYDSB5U!#6ETu@Ab{V z!cN+eS}~V`|K0L$DoX3XNv&T4{)W`RgNL$=ZwK`@9@=IYFD5`g&t=M!?u#__gSRnY z+8Y$qKhjV9CENq+&`f%VICwuZ{oVS%2tL$-mG@AS7h$w>U+_Nz+aGmh#Um<6|21H? zpb6W!4K@`o=!wjocoV(X6!=el)<;KoZ+MNdme#)@eisuh!M%xojD57=A1Qxo0$WWe z0zYw6rhJ=yQDw$)vdJbS@(J)ZQE$m@jG(r<61fWe=dccK zDk*;Y3+gN(DgG5;r!LYKT81US{&M8!c|1w+6R*Z!g7sBlX{7E;tX%_TwiKZM-REKf z9;yk-YswSsf=_KOBcQ({`=t2EFD?H;@bjE%!(;PQZeZ7&SZ6*3e)3A+|4T~SZM7P; zj2P~qt%`>mVX@nyNdEQd_@_aP@hnoQ3Gc-l@@~kIo>BpJ3;R&?#=T`pTBYV*HjeHkR@n5 zr9nOfVKN2%jD7U|m$vvM;B4Xd6YHnOX9r!YUUu4+z4vR{`9E#_^Zk``>E{o+-{);S z?I4Q|WSvhv%z~eG#QFXjt$9=vL)QH#Miep7-*?1-1kL&`V-C&IX0G$J%Q-`GX>jQ{ zCe2*VA^#hA7GzHD$trw0Pdf+Y68wA%9(Y!j8T;^*v{2*u$mo!xZlTPGiKk>9ZR_}E z8)GQO(T?2rqKgM;;Z5Qm(RLuK{F#sG*wDAAa6vwEgYT?>JBI_xGEQIhcJS#0Zu#aX z->Joy%sDJSOxygZe! zPEXF}r!HH?eC1NDlD|@!sae(9^i;8k!x5|{cYXL`kC}_~Fy3>6cVrB?4D#&~;#hvi zL0rC$F>0_sYyOYx4dLK$V3_|o+WDVFoMx-=7{UAQn2`yK^B-yQKfEvL`&ZoBN&8G| zN;>CBjyufwgZZcM{8u!$F5>>n{}Ax3ARnSf`aP8WH(oV}pZQouSuLEw(OFM_E$H9C z|G(hx1v>u{hTr`Kf|;P2$`8lwhxs@D{&faVQu=w~N8$JLuYSad;gLZ5(=lLD{LIzs z{6mm_AAjQfui`)dQ!~XynirT;c literal 0 HcmV?d00001 diff --git a/.vs/League-of-Legends_Project2/FileContentIndex/c8c53384-c55a-45d7-b9ef-7a4ca5002899.vsidx b/.vs/League-of-Legends_Project2/FileContentIndex/c8c53384-c55a-45d7-b9ef-7a4ca5002899.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..ebfbfd81b3c1f87520c7dfbb7849a167ee6b8c40 GIT binary patch literal 423 zcmbu4K~BRk5JjC*T3SE|b%WFu2S^s(!7fThMv+O$b-=P|AG)C S-oaQce<9Y)FXrR$oDe@y!zrf# literal 0 HcmV?d00001 diff --git a/.vs/League-of-Legends_Project2/FileContentIndex/ebd68385-dbc2-44cc-bc2c-440425fdb7bc.vsidx b/.vs/League-of-Legends_Project2/FileContentIndex/ebd68385-dbc2-44cc-bc2c-440425fdb7bc.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..6f6471e9f63154d993e3294cdfd36665aacdd71a GIT binary patch literal 88147 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
  • U`$e%vv{5zo;xV`pYi9;5n*{wggX+ zrhMY_V^?7B&%%?Qfz355Bha-KjDQh@-st12?=*h@{?d1Gd)X>BTh)eBOxm8h#QO#& zk_7+fiv0cKPICOX^Yz!aPnJ3GlHRaq369|WqZL?_c@+<-Ax&QGrVP%1o+Y&Dqv~H1 zuVGJN_|vdJ=yAG`l6N6@l)}1vfDzJL@lNDx`ut-|DJnjtjeH|T#a{$EZ4r7Sb&bvT zjK2`q5X+*F!H=VVUCg|q{DZsTN=w0D{wluCI6KD>1)H&=;PapMpSS9?#HTRZI`%4~ zPxJ(78QDbplk(4)R#bd`tL8UrQUMr@JksMJ3XvC3M!S=9{17~+PNHwrY)1*bw!G(o z&v;&(^|$T6F#g{HY7IZi{SA!4mOC>76aR~Y&$%1^hv6@&nYUmo7GVjS2q{}surljP z3K4%vF`g0!pXa5qzx(?CbnE{<|4%pn{r+di|L)j)M%Q(F(*HhU|G%yKqMkpt{`b#6 ziT}@U;wRPrk7IuX#Q#&YJ>uA32OR(J`+w%}$FtiW4J)G^(u?=iYkPjT?FFB94BL15 zs81prnR*?6WT1eGopA?Lh)~Qk+)urf`TIJ|e9Gcn5**`4Bx%bwT>m<*@Cb+<4QB*{ z-v^RLKr)D%bf{PUGnUUiqsd_2#yF2Jv$ zH`r31zWE1)$W{Dbf?mtpd&a@D+2HTh67Ov2?EFWXDT+C!fDO?yP3AmDT*^ zbiSA!Q;VYhuEKscCYir}sjxUPn#oV3C%zmV9j|0ES29j@ELU-|qveWIOy_b=wNxw@ u%h__iT+V(?jlr>aWLDhd<32ySM-C>Z;XVK0Xvz@2C6Z~Qh_CS;M*jh!9i!m@ literal 0 HcmV?d00001 diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..bc1ab2f --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\EntityFramework_LoL", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..84fc366b943582b275f211d3afea825b46ee7e17 GIT binary patch literal 520192 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

    `fS)c?Xk)&lU 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

    ?Kwm%+jEFk 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%0Ac+ zEgEG`bIJZc8hck=+bi3mtv>}B_3mhXL;OGDQ}9yo6G$MCKp=rY0)Yeq2?P=dBoIh| zvjkS!H~Oe5U&R4?^(P*sWi&>qL1to{c>K+v&p8`cO13y;ujTrfb24zl2C3Ku+l{1$ z+a0TrhrR7EIag+9RsJBAwaoPK_KxVLjUGy|towl5y0mjK&S-+7Lp`GW_9X3(VjVC? zme*`_Q=$j=QkE&Tu)IA-@~IMf*KH&zy(+A9JC|d1^ne;f5SI|Vaifb8?Au%UJ0ooIoUIpoI7K`(Q&vX)($@% zM;4`pMF@L=v#sSN;gIvXVpcL85*6b8=)9p>KFdStj?_>(?Ot50iht<>90coW<}hbi zFIYx#Fd0G_;aoc1PbvX+r_*rHbQ;25;O|P8kjNZWgTm6wiL5NAJGc`nLP2gIMJ=C+ z;d$NAgbeWp)qP1YrK;zlf~8Nnfv1EYd)1Ge&J4rI^N+MtO}d1}e?L;1RN=7JCkqC# zKdA~V8Bpg3deCQbW7zp(&@+5!y&=D`A`Y#Pi^gxXh<~V0I4KI0^uy<&{~nI?Y3Q%z z0h~7c(R12z!5}GZ3X98$afpW0pe&gWsht#;M@3Cq^3l_W6ubw0*q{U7he}}yL0^ow z5>Aebwm-()s3a^Xst%eyJh*+Q<+JSk(VL98PKbhRET$Gk*b4fiGkqbV6EK?S;f|y% zcr6#$|DT85)DE`Tgcc#>zd>#>^G)v&F_{XW52a;54mUs2G75gB1^zU)vTAzd`D3gZ zATySne^~j4iQg246Qt9QiGoqo{Bqugl)zc6D8uQ4Z+dP*U0B$IC*TgBe$Z=dEP&44m?We;>7o#Z^azl8p-|cL4pAroLyxs+WOn!(O^PwhytP0ZD z#exixn?5<(Bcw2p)E6s~$;Kzo5WZ5aj|H?c2+0pX78_ z5-<2`KTz#p+6MtqDpuw-U-TJll)zG}V`^M~9*C7P^q1Jc&<#6ZQbWNXb8t$$ph<>L zJWQ-@f&UKZEM~qKOy=n-Ik*5{SAUEnlM^J0@*5vwrG>Q`a}oNf`%XeJ7Y(wH`DX`X z_Mt`0kHSLNX_AmMad%P5_-d$GVsj`?lafq+IaHkX(^F>}%6tg&l$F-aA0y4?^H4{_m8GbA^(e|F3?>kM_Y_l2;))67?sANb4~k}Me>dN~vKd6LDgT5GzQsDNMp zj9rBNf8MTOMv8m*Xa~bs>MUlb#JtMYrJv>G$_(Ta1-&9aD14RWdP-f98L^;4u58FD z!gJ46ksi<4>C8;mSQ}H8Bu!QF;2nNe&?FLY!*kD5QFP?-!@TK3NscQLM~#`04N1}B zq#5I^M^xkmKD3iG#?X&ao7ExpznIbZZZIkekFV8&q2;7^A6H1GRdVv?zsFZOmcCd) zSRY!K%c>7$=s)jTW*qv!$icFKhZXGPmLN?RScCl6m*ipU@WX&7o$oPqMd6L*=f!MR z%=+UY;TGKF;<64=xI7KWC32(58Au(UdA<%n3@^)t+JDo)V&;oS0XjGSL4|^ z?Ee)J0`JZ26rRN4Gvmmng>}1pvPp4yZ1``4yXg61a9N(Wev}pU33hLvd?hrXMymJu z<5_6+9j1(V+tzWEc4mzPDOPFJ`P0$h#+>Kd8$^kA}v8RBEUY^Q&*bZ z@bGBb)=J?XN$KfMct2ft#$!rckif&qvw*1TSmdF=k_O||t65oHtB{_}nj4iHu4WGE z7X*EAzL+@=I<%k{;J)y6#00#&0O{RGQaIOy#GG)`%r#6RIe3{|Q)yQ2p3Q=&?1T{1 zyxBWWMOd^d%Lw-WDwXYKIn9n&VpUrzzv>2znWGeZCqPLu#EVAdVY7$Lj}&uIn%J|0 zikiN9N|j|R2NK92Q`9urg>VrAOJ!e|ZgUi{?T_d4MT6M5xl7`-s$h94@7yeRJU*ri zVn!nItlpin*T}_8Pev z^goJ%OT&z>0?`0TdSpI&80+BS=|OpIV}g-~!-&%%tGQk}JoJRuN8~#e4zcf_1)Uw- zn8uZy%4OYV1p`hR8Hg<5&I3XKGUxGRo;#Hp*v{QUf+{uSGXbX{qQdDB%XSs1@4>&L z_P}~l^<;wmf58y*371r0>GjYPrD`sO2bU+0CS2h4eMiluc(I znt23V?{p=}WgHL}EGI=&N{~e*D{wjsa&zG^E8Gk?Yo+67h12*?c1wx3+1O~xyk^s{O!x^Ie;SR<-?}J*0D8q-pL`EU&y2wp6 zhe5$egY$FNP39iK$SiVFgMrC7_@zN<`z-Oz1ba8HxkF<*PYH#Bm?b^snL^H3w6>1O zHCIm%$)r>eWe7y{j6rNU|Xm{lMq6b5CMj*e-_3nK8@9Y9>_!(65Y zHVo+{&E!aYh9r`h6f^-$lb-p~)if!P!QDlu!IySwU-38ZQRRP*qTL8T*-Jjh_WaK9$qiF%5p9j#)f}0JWM;KSnSs=>>Ag!EbIbWH`%W3_?b@3`#}> z$YFc}y%_mvQKf_?ps2WUK_tjsKo{+tOPq&`*EKk5dcZS1#98BHm=O0o&UPrW6Dn$O zzz@$%2&Uv(7mjwB>@KLaB(t;&NhG zUQprKb z?Em%6N&j|62}LA=s}8?42Y3AR;pW0) z=DHbhK6r4E(TNF@%OFJ>+;$|`IwZp>%7Vt*!EI&{JPWgA#Y!y-iXw7~2Xkm}nIg6j zNKJbgU2*x0OPk1ypr6;VUUN=XFZhBC-=3iY;k|s7^bc3hP-o82-*^ual#Q1;Cu@7q zI$Z-+ke%3qc5erQNLH}5U`2@?>Z7~VMO_3ikusM-aaNFv;!Lr?DGrL4Rzcb&9<#Kt z8XsS%UG0W;Ir?}VUy^pYg(;B6sWF_R?U#^nAGh;(SQ8fKM%4`1W;i*9B7?kKJqOtT z*O3F>d^?6-ZBYoIriYQq!|D=Fk0WF;DHw}f9s*A5oW_K?6q1Zzr2@#3{O^aH)U^2b z5UCv%5i8-~xb?_E=SEtikUT+8*Wb7RhFEW%b2$}-lSkqLEp;t6=N1>@g z(QsPNija^bFDa0XM9MJ2kOgG{wm~GJ%uuo`(dAqLZZ`7rB~i;@wYI9hujy(Bfo#(w zMM=(%WhHP7h45e~_m&Xx4|=zXt!$a?QqP`Grw0;UiDXw25*cUDmpbtz;I(wxA`b7) z6Bg+-ZPa{6mvmWN66Lx6xvZEIin8INmhRY0ZfN(k$mxfRTE<15J*+n6zDcRHzSq98 zIkl8Y4Eu@^R)bRDp`(-T-Vbi+G@X0UV~K>T6CD>aa`1>;V0b0WTDRc0?@M~S=T(4g zORn)-@qsB=W9JC1x^pC>A2Fj#oO8Kp^fRpNsB7J1>yf{S6g#O31yI~_Bs(xHAKgqR zGQ6DLEV*)*y|{P8$f!FeUEFLm+YgCBws?72=}mNzK6PZroZ49BPRyPy6C+R^&#D&w z#FTJJg&f(gxk_C%I~Pa>E`bCoux_7BFOy{suTL=aOVnz=aHTva;K5xilgWT9OV=t$ zdHP9+uu73;vey#}+g+V7S7As1ao9`}c*hc1@P>6=%+Jfq!v@$Z=ZnP1&d{!g zh;;|dY{Fc7gwa3`4V|7%_ILGlw8Yxm?>|hi!_gi@5{me^x>+ee3$<<#UX*-!>QKS~lP&YhW>J3ciwJTo?R8<{R=;P=VN zp1CCRhCQK=EJBzLXquW@SY8sCT@x7#Wb-%#g;HF5NZ85If$pKI0{3*bn9g&Sd3p`Q z^nh4#DEHvmIV5}cQr)QvLPc0DffP9Okmz-v)Y4&!3+uk-+jA2aYFz2vFG`0hK2D7OrJ?N11#UNwY`Hc^8 z|KD^{#Am=WQX+m~-kpQ*ZqPHdJhT<=mJ@j2n5JX@Jsj!N&|k}gcj*Oo*>kK5JVubg z0hd1>I4-zpab8BN?{2>Uo7<{oGPDA@mcfPRO(L``ad)a1mOf_5`C|rvPoO`R zbCi$Y6b2-946G?dNcHO@IYF`;@C5M@Bg=N`n?X&YB{V7Pr(V}n@+@F z|9^qH=xiGRu=@@~N}h(I@1E0)uy8_@3*gb@p8<7N5-<2`KTzFZ+LwVusaQ#^d@u1pPC{W34GK;9X9rV4%ui$85*7x%li0n)-9@P3>u-u4 zmxkEwsMAT5pHD;vVU~hCMe3bMlMBrNzh}qudk^ap6!iq?WvYcFfZTEbkdU z1vSf>i^0>(SCb$3&_op;dO25&`GbvjIfr#KDw5w|hW-CV#vbOg9ZVT!-qvE=!Q+GF z#767*#Z+C9-w5Q1{}|c0LjQQ{5fyoX5A7txd_uSSQEIa~Df^OviZ;HS4ScN@ zOrMU5kcS&=^O@ywg=A&%Q9#-@EPb(pus*admsOvf(Xlf0pLZ?8&Id*gmJO_Gu#;N? zhaRv7`L8d@s_XE>7#^MPF?B`ZjpgUXY*x(r<00V|+~ndiR1o4Cp;96@n*4<%Hh?Jo z1%JrQa-sI$G_aWY;!%LUo4#OT``XoXb`JahWmr}qod?ZDRHhQ(?)Jzwt!YR#E1s1N@ze$SN*bKvU(D8w)o>wV^Q)|r;RPa*$Oc8 zmxz!RP4eR}Vqk;Jh<+kQi=ca%jeU2|!84dM3GyJaXU2>k=!?N`k@Sy~EF&R{oG&Eh zec7d14a!1f0y^M!w>BNe!jb5rjALc0p_vj?9FDlujoT-HD!bT9zPrtpX>F2AD1cE!&;wViPHnN_WEr zJX>~hXKix7to z84oCW1lgv&OG#E8i@csuH5jj6sSMS%%FK<*4OcS<^$UW&IA6@12OV0_3vgffI${D| zUV!v&B!8`ILSowSY33ScWrdf?HH1&OS-E>QkX3ajgdiL2-f=3zqE$&ou>Zeg$#%1x zX2&bB+KWkR=0Ju_1fV1tBGj)xHR*T^LgK@TuIX}Qfk zh^gBRojuyY?1mDbS>);@JU$@xK(fR7vf`Pm@NT5SOEa@qT$g}mmJ1>*yb#t8$#yuc zHcSR+UJSfEuB>rzc;{zaQ^RDvfUT03p4YXvPe@FQ26N`YW6eNOaA}zFRUjH5iT3BC zhp`SGo*tCfHYON(IE*+QvYP9q!$VJaeMG)v;Sl@2ncN?f@$(+M;G_X*{rL}F2m#2P z$CG(34-$5)kis^!J|Oa$fKw1se}q3Tl|*gu9x!`gJ*jds!T$e|W$251!qr=_^m^!t zQY9D4gG*m%!UbO6chqc~vm!jYtO#(}o$xrYzNW6H2|mE}PFIp#<|M5xW2J~n2{L%e z3Y^Y@++29f3O57JTIu*1qMjGPg$N@yM7dgHb(8Q&j5^W%%%y$S7o87rCkCFen&laDL9Z$=o9t8K|Mg zYtW9vL62aFS>l^nrf%Nenybwf3j{)AI!_6Of|w;e<(WdxShTjzZ|!iIlnSB@fry@Q zsCD8J0-yr~9+I}bjBu#=i(}(n z=G52`1Fol4qz_IB5}&C@8b1vcMj?NkDnoi=?{ekT+z~*9)Hx+uq?Y$Ib5+e$CV8C| zk?!EEzY+>l;=@Hq)Wzp{Le<`F=$f=L;1Qk6Kl=b#kS%y|zZ-D?&C z_#CHXiI;;CkpM8DUcQcx&K^E1w|-6n7qI(WOEc9Vv{GCJ#pQWub`tM-Y|=OZ(R&_R9BP|1 zCI>TU(jKlnyQP$iIevK`yI9i*=s^)wh->8ZbT)fzLglyin-or48x5YL1%@ofpm5YA zO>wxHFr|Y0BOY$&*w*B6%ZRsHSGMCkOp#dAQf!|n@;AKNR8q1a<@v004hLo_vErgv;*Q+{f{Z0wUoy348TVsaes} zvWqnhST`3QGuO?4^TC6Qj806LTm~u9;I<>d)*%^AQ5H1b4sJ7x;8~a@D^_YzP!y3< zJeWg+%M`JNKx*2{=!(l{T-rot1pT~@^_p|CdchZD`1TAH2=C>qq<^@2hB|YG{>FQd zplrO%Ia%9-*6A9sg4Avc^1==Tk*r{AF;f_EnJz2=Or*?ZP@EOyqBv75aPn8?rB#r2 ziO()Atj5O|Y8ShqUGIc=9bb}mxrHf^#;Gx!qwSZFaG!7USbYeKbE9eoY%`o3Ly%4SHWbU9AjUjdZp>%pmgiCbM zsdqU%IX*X`PRzkTBh{t|73WTxn5%pxya^uG>GYO&Fa!;<_6~^`8QK>FO#u#?rfQu| zTSX&x6dEfO4d=D22&umEk^&h?qzvvBx)H< zHXZIDoNaofD9PEetOV|%5G0(F77`-e=(@^gse!0K1Zq&NzF%^fWI4 zucgx#b$EB4ut=wAqvkuhq|4%xD9`oJWyPFOlnocPbjN0LL%XL%&Olt$GA{D$k+muL zO-G&9_u5xBrFQ+$4uH0oW?j12Q>W)blH=EA(Lt>h$%gah{qKovYBRl5o#wvPZ_H3C*f$Dfx zweTmVgi9)9%683F>af|lK=N=2BvgTQ{$zTYEOU5$f}vlcT>FJ9i+`vF8h{I;Oz&n=6qBpGTVt!s;9yY*oIbS5^c7}R& zWUPB&mJ{acBa9|`Xz288vcIdZqb1hfe*a;D9i~nU3$O^ezQM1&W2pT;^F0tHXop3Z zouGum>m8>Z`sSWw|Bxn0ezzhn3~jh}YHE&)&55N4M1-l*9eKnXdkx%wT7i z*q!X`?av(T6uSH7J9~S@`J+Aay?wciKte`kS<)eGg7^p?YLG%I5LXKx3F5G}fCmQT zbvW)gqNvp3WSEnInb3n4A6aee4;zqjla_uoV(@V z00I(@EILO|(4=l;q5L6Z+(W~lCK7Y!P(g#xY{npnP4zo>1WOovkD-~V;ndh|Q)3fj z!_#B8!BGzX?=HFq3dm>HWgKU4CG`SIkYkJ@h}%U{u5 V>5A^TidS@(zg5p%7Yu9T{{!Js5o!Pc literal 0 HcmV?d00001 diff --git a/EntityFramework_LoL/.gitignore b/EntityFramework_LoL/.gitignore new file mode 100644 index 0000000..68c9468 --- /dev/null +++ b/EntityFramework_LoL/.gitignore @@ -0,0 +1,428 @@ +# ---> macOS +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# ---> VisualStudio +## 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 + diff --git a/EntityFramework_LoL/README.md b/EntityFramework_LoL/README.md new file mode 100644 index 0000000..3228583 --- /dev/null +++ b/EntityFramework_LoL/README.md @@ -0,0 +1,168 @@ +# prepaLoL + +## Diagramme de classes du modèle +```mermaid +classDiagram +class LargeImage{ + +/Base64 : string +} +class Champion{ + +/Name : string + +/Bio : string + +/Icon : string + +/Characteristics : Dictionary~string, int~ + ~ AddSkin(skin : Skin) bool + ~ RemoveSkin(skin: Skin) bool + + AddSkill(skill: Skill) bool + + RemoveSkill(skill: Skill) bool + + AddCharacteristics(someCharacteristics : params Tuple~string, int~[]) + + RemoveCharacteristics(label : string) bool + + this~label : string~ : int? +} +Champion --> "1" LargeImage : Image +class ChampionClass{ + <> + Unknown, + Assassin, + Fighter, + Mage, + Marksman, + Support, + Tank, +} +Champion --> "1" ChampionClass : Class +class Skin{ + +/Name : string + +/Description : string + +/Icon : string + +/Price : float +} +Skin --> "1" LargeImage : Image +Champion "1" -- "*" Skin +class Skill{ + +/Name : string + +/Description : string +} +class SkillType{ + <> + Unknown, + Basic, + Passive, + Ultimate, +} +Skill --> "1" SkillType : Type +Champion --> "*" Skill +class Rune{ + +/Name : string + +/Description : string +} +Rune --> "1" LargeImage : Image +class RuneFamily{ + <> + Unknown, + Precision, + Domination +} +Rune --> "1" RuneFamily : Family +class Category{ + <> + Major, + Minor1, + Minor2, + Minor3, + OtherMinor1, + OtherMinor2 +} +class RunePage{ + +/Name : string + +/this[category : Category] : Rune? + - CheckRunes(newRuneCategory : Category) + - CheckFamilies(cat1 : Category, cat2 : Category) bool? + - UpdateMajorFamily(minor : Category, expectedValue : bool) +} +RunePage --> "*" Rune : Dictionary~Category,Rune~ +``` + +## Diagramme de classes des interfaces de gestion de l'accès aux données +```mermaid +classDiagram +direction LR; +class IGenericDataManager~T~{ + <> + GetNbItems() Task~int~ + GetItems(index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~ + GetNbItemsByName(substring : string) + GetItemsByName(substring : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~ + UpdateItem(oldItem : T, newItem : T) Task~T~~ + AddItem(item : T) Task~T~ + DeleteItem(item : T) Task~bool~ +} +class IChampionsManager{ + <> + GetNbItemsByCharacteristic(charName : string) + GetItemsByCharacteristic(charName : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ + GetNbItemsByClass(championClass : ChampionClass) + GetItemsByClass(championClass : ChampionClass, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ + GetNbItemsBySkill(skill : Skill?) + GetItemsBySkill(skill : Skill?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ + GetNbItemsBySkill(skill : string) + GetItemsBySkill(skill : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ + GetNbItemsByRunePage(runePage : RunePage?) + GetItemsByRunePage(runePage : RunePage?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ +} +class ISkinsManager{ + <> + GetNbItemsByChampion(champion : Champion?) + GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Skin?~~ +} +class IRunesManager{ + <> + GetNbItemsByFamily(family : RuneFamily) + GetItemsByFamily(family : RuneFamily, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Rune?~~ +} +class IRunePagesManager{ + <> + GetNbItemsByRune(rune : Rune?) + GetItemsByRune(rune : Rune?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~ + GetNbItemsByChampion(champion : Champion?) + GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~ +} + +IGenericDataManager~Champion?~ <|.. IChampionsManager : T--Champion? +IGenericDataManager~Skin?~ <|.. ISkinsManager : T--Skin? +IGenericDataManager~Rune?~ <|.. IRunesManager : T--Rune? +IGenericDataManager~RunePage?~ <|.. IRunePagesManager : T--RunePage? +class IDataManager{ + <> +} +IChampionsManager <-- IDataManager : ChampionsMgr +ISkinsManager <-- IDataManager : SkinsMgr +IRunesManager <-- IDataManager : RunesMgr +IRunePagesManager <-- IDataManager : RunePagesMgr +``` + +## Diagramme de classes simplifié du Stub +```mermaid +classDiagram +direction TB; + +IDataManager <|.. StubData + +ChampionsManager ..|> IChampionsManager +StubData --> ChampionsManager + +RunesManager ..|> IRunesManager +StubData --> RunesManager + +RunePagesManager ..|> IRunePagesManager +StubData --> RunePagesManager + +SkinsManager ..|> ISkinsManager +StubData --> SkinsManager + +StubData --> RunesManager +StubData --> "*" Champion +StubData --> "*" Rune +StubData --> "*" RunePages +StubData --> "*" Skins +``` \ No newline at end of file diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj b/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj new file mode 100644 index 0000000..60bf9ea --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/WeatherForecastController.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000..c27a8af --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/WeatherForecastController.cs @@ -0,0 +1,33 @@ +using Microsoft.AspNetCore.Mvc; + +namespace API_LoL_Project.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Program.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Program.cs new file mode 100644 index 0000000..48863a6 --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Program.cs @@ -0,0 +1,25 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Properties/launchSettings.json b/EntityFramework_LoL/Sources/API_LoL_Project/Properties/launchSettings.json new file mode 100644 index 0000000..646c440 --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:45539", + "sslPort": 44382 + } + }, + "profiles": { + "API_LoL_Project": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7041;http://localhost:5233", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/WeatherForecast.cs b/EntityFramework_LoL/Sources/API_LoL_Project/WeatherForecast.cs new file mode 100644 index 0000000..350bb53 --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace API_LoL_Project +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} \ No newline at end of file diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.Development.json b/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.json b/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/EntityFramework_LoL/Sources/LeagueOfLegends.sln b/EntityFramework_LoL/Sources/LeagueOfLegends.sln new file mode 100644 index 0000000..fba0e58 --- /dev/null +++ b/EntityFramework_LoL/Sources/LeagueOfLegends.sln @@ -0,0 +1,57 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33205.214 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Model", "Model\Model.csproj", "{2960F9BA-49DE-494D-92E3-CE5A794BA1A9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C76D0C23-1FFA-4963-93CD-E12BD643F030}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleTests", "Tests\ConsoleTests\ConsoleTests.csproj", "{1889FA6E-B7C6-416E-8628-9449FB9070B9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{3B720C0C-53FE-4642-A2DB-87FD8634CD74}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Stub", "Stub", "{2C607793-B163-4731-A4D1-AFE8A7C4C170}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StubLib", "StubLib\StubLib.csproj", "{B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "API_LoL_Project", "API_LoL_Project\API_LoL_Project.csproj", "{4EDC93E0-35B8-4EF1-9318-24F7A606BA97}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2960F9BA-49DE-494D-92E3-CE5A794BA1A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2960F9BA-49DE-494D-92E3-CE5A794BA1A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2960F9BA-49DE-494D-92E3-CE5A794BA1A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2960F9BA-49DE-494D-92E3-CE5A794BA1A9}.Release|Any CPU.Build.0 = Release|Any CPU + {1889FA6E-B7C6-416E-8628-9449FB9070B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1889FA6E-B7C6-416E-8628-9449FB9070B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1889FA6E-B7C6-416E-8628-9449FB9070B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1889FA6E-B7C6-416E-8628-9449FB9070B9}.Release|Any CPU.Build.0 = Release|Any CPU + {3B720C0C-53FE-4642-A2DB-87FD8634CD74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B720C0C-53FE-4642-A2DB-87FD8634CD74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B720C0C-53FE-4642-A2DB-87FD8634CD74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B720C0C-53FE-4642-A2DB-87FD8634CD74}.Release|Any CPU.Build.0 = Release|Any CPU + {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB}.Release|Any CPU.Build.0 = Release|Any CPU + {4EDC93E0-35B8-4EF1-9318-24F7A606BA97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EDC93E0-35B8-4EF1-9318-24F7A606BA97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EDC93E0-35B8-4EF1-9318-24F7A606BA97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EDC93E0-35B8-4EF1-9318-24F7A606BA97}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1889FA6E-B7C6-416E-8628-9449FB9070B9} = {C76D0C23-1FFA-4963-93CD-E12BD643F030} + {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB} = {2C607793-B163-4731-A4D1-AFE8A7C4C170} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {92F3083D-793F-4552-8A9A-0AD6534159C9} + EndGlobalSection +EndGlobal diff --git a/EntityFramework_LoL/Sources/Model/Champion.cs b/EntityFramework_LoL/Sources/Model/Champion.cs new file mode 100644 index 0000000..fd4a5ca --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/Champion.cs @@ -0,0 +1,151 @@ +using System.Collections.Immutable; +using System.Collections.ObjectModel; +using System.Numerics; +using System.Text; + +namespace Model; +public class Champion : IEquatable +{ + public string Name + { + get => name; + private init + { + if(string.IsNullOrWhiteSpace(value)) + { + name = "Unknown"; + return; + } + name = value; + } + } + private readonly string name = null!; + + public string Bio + { + get => bio; + set + { + if(value == null) + { + bio = ""; + return; + } + bio = value; + } + } + private string bio = ""; + + public ChampionClass Class { get; set; } + + public string Icon { get; set; } + + public LargeImage Image { get; set; } + + public Champion(string name, ChampionClass champClass = ChampionClass.Unknown, string icon = "", string image = "", string bio = "") + { + Name = name; + Class = champClass; + Icon = icon; + Image = new LargeImage(image); + Bio = bio; + Characteristics = new ReadOnlyDictionary(characteristics); + Skins = new ReadOnlyCollection(skins); + } + + public ReadOnlyCollection Skins { get; private set; } + private List skins = new (); + + public ReadOnlyDictionary Characteristics { get; private set; } + private readonly Dictionary characteristics = new Dictionary(); + + public ImmutableHashSet Skills => skills.ToImmutableHashSet(); + private HashSet skills = new HashSet(); + + internal bool AddSkin(Skin skin) + { + if (skins.Contains(skin)) + return false; + skins.Add(skin); + return true; + } + + internal bool RemoveSkin(Skin skin) + => skins.Remove(skin); + + public bool AddSkill(Skill skill) + => skills.Add(skill); + + public bool RemoveSkill(Skill skill) + => skills.Remove(skill); + + public void AddCharacteristics(params Tuple[] someCharacteristics) + { + foreach(var c in someCharacteristics) + { + characteristics[c.Item1] = c.Item2; + } + } + + public bool RemoveCharacteristics(string label) + => characteristics.Remove(label); + + public int? this[string label] + { + get + { + if(!characteristics.TryGetValue(label, out int value)) return null; + else return value; + } + set + { + if(!value.HasValue) + { + RemoveCharacteristics(label); + return; + } + characteristics[label] = value.Value; + } + } + + public override bool Equals(object? obj) + { + if(ReferenceEquals(obj, null)) return false; + if(ReferenceEquals(obj, this)) return true; + if(GetType() != obj.GetType()) return false; + return Equals(obj as Champion); + } + + public override int GetHashCode() + => Name.GetHashCode() % 997; + + public bool Equals(Champion? other) + => Name.Equals(other?.Name); + + public override string ToString() + { + StringBuilder sb = new StringBuilder($"{Name} ({Class})"); + if(!string.IsNullOrWhiteSpace(bio)) + { + sb.AppendLine($"\t{bio}"); + } + if(characteristics.Any()) + { + sb.AppendLine("\tCharacteristics:"); + foreach(var characteristic in characteristics) + { + sb.AppendLine($"\t\t{characteristic.Key} - {characteristic.Value}"); + } + } + if(skills.Any()) + { + sb.AppendLine("\tSkills:"); + foreach(var skill in Skills) + { + sb.AppendLine($"\t\t{skill.Name} - {skill.Description}"); + } + } + return sb.ToString(); + } +} + diff --git a/EntityFramework_LoL/Sources/Model/IDataManager.cs b/EntityFramework_LoL/Sources/Model/IDataManager.cs new file mode 100644 index 0000000..a185e15 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/IDataManager.cs @@ -0,0 +1,53 @@ +using System; +using Shared; + +namespace Model +{ + public interface IDataManager + { + IChampionsManager ChampionsMgr { get; } + ISkinsManager SkinsMgr { get; } + IRunesManager RunesMgr { get; } + IRunePagesManager RunePagesMgr { get; } + } + + public interface IChampionsManager : IGenericDataManager + { + Task GetNbItemsByCharacteristic(string charName); + Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false); + + Task GetNbItemsByClass(ChampionClass championClass); + Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false); + + Task GetNbItemsBySkill(Skill? skill); + Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false); + + Task GetNbItemsByRunePage(RunePage? runePage); + Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false); + + Task GetNbItemsBySkill(string skill); + Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false); + } + + public interface ISkinsManager : IGenericDataManager + { + Task GetNbItemsByChampion(Champion? champion); + Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false); + } + + public interface IRunesManager : IGenericDataManager + { + Task GetNbItemsByFamily(RuneFamily family); + Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false); + } + + public interface IRunePagesManager : IGenericDataManager + { + Task GetNbItemsByRune(Rune? rune); + Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false); + + Task GetNbItemsByChampion(Champion? champion); + Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false); + } +} + diff --git a/EntityFramework_LoL/Sources/Model/LargeImage.cs b/EntityFramework_LoL/Sources/Model/LargeImage.cs new file mode 100644 index 0000000..56d6696 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/LargeImage.cs @@ -0,0 +1,28 @@ +using System; +namespace Model +{ + public class LargeImage : IEquatable + { + public string Base64 { get; set; } + + public LargeImage(string base64) + { + Base64 = base64; + } + + public bool Equals(LargeImage? other) + => other != null && other.Base64.Equals(Base64); + + public override bool Equals(object? obj) + { + if(ReferenceEquals(obj, null)) return false; + if(ReferenceEquals(obj!, this)) return true; + if(GetType() != obj!.GetType()) return false; + return Equals(obj! as LargeImage); + } + + public override int GetHashCode() + => Base64.Substring(0, 10).GetHashCode(); + } +} + diff --git a/EntityFramework_LoL/Sources/Model/Model.csproj b/EntityFramework_LoL/Sources/Model/Model.csproj new file mode 100644 index 0000000..89f6363 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/Model.csproj @@ -0,0 +1,18 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + diff --git a/EntityFramework_LoL/Sources/Model/Rune.cs b/EntityFramework_LoL/Sources/Model/Rune.cs new file mode 100644 index 0000000..7b5047b --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/Rune.cs @@ -0,0 +1,69 @@ +using System; + +namespace Model +{ + public class Rune : IEquatable + { + public string Name + { + get => name; + private init + { + if(string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("a Rune must have a name"); + } + name = value; + } + } + private readonly string name = null!; + + public string Description + { + get => description; + set + { + if(string.IsNullOrWhiteSpace(value)) + { + description = ""; + return; + } + description = value; + } + } + private string description = ""; + + public RuneFamily Family { get; set; } + + public string Icon { get; set; } + + public LargeImage Image { get; set; } + + public Rune(string name, RuneFamily family, string icon = "", string image = "", string description = "") + { + Name = name; + Family = family; + Icon = icon; + Image = new LargeImage(image); + Description = description; + } + + public override bool Equals(object? obj) + { + if(ReferenceEquals(obj, null)) return false; + if(ReferenceEquals(obj, this)) return true; + if(GetType() != obj.GetType()) return false; + return Equals(obj as Rune); + } + + public bool Equals(Rune? other) + => Name.Equals(other?.Name); + + public override int GetHashCode() + => Name.GetHashCode() % 281; + + public override string ToString() + => $"{Name} ({Family})"; + } +} + diff --git a/EntityFramework_LoL/Sources/Model/RunePage.Category.cs b/EntityFramework_LoL/Sources/Model/RunePage.Category.cs new file mode 100644 index 0000000..1047c0e --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/RunePage.Category.cs @@ -0,0 +1,17 @@ +using System; +namespace Model +{ + public partial class RunePage + { + public enum Category + { + Major, + Minor1, + Minor2, + Minor3, + OtherMinor1, + OtherMinor2 + } + } +} + diff --git a/EntityFramework_LoL/Sources/Model/RunePage.cs b/EntityFramework_LoL/Sources/Model/RunePage.cs new file mode 100644 index 0000000..cf56628 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/RunePage.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.ObjectModel; + +namespace Model +{ + public partial class RunePage + { + public string Name + { + get => name; + private init + { + if(string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("a Rune Page must have a name"); + } + name = value; + } + } + private readonly string name = null!; + + public ReadOnlyDictionary Runes { get; private set; } + private Dictionary runes = new Dictionary(); + + public RunePage(string name) + { + Name = name; + Runes = new ReadOnlyDictionary(runes); + } + + public Rune? this[Category category] + { + get + { + if(runes.TryGetValue(category, out Rune? rune)) + { + return rune; + } + return null; + } + set + { + if(value == null) + { + runes.Remove(category); + } + runes[category] = value!; + CheckRunes(category); + } + } + + private void CheckRunes(Category newRuneCategory) + { + switch(newRuneCategory) + { + case Category.Major: + UpdateMajorFamily(Category.Minor1, true); + UpdateMajorFamily(Category.Minor2, true); + UpdateMajorFamily(Category.Minor3, true); + UpdateMajorFamily(Category.OtherMinor1, false); + UpdateMajorFamily(Category.OtherMinor2, false); + break; + case Category.Minor1: + case Category.Minor2: + case Category.Minor3: + UpdateMajorFamily(newRuneCategory, true); + break; + case Category.OtherMinor1: + case Category.OtherMinor2: + UpdateMajorFamily(newRuneCategory, false); + break; + } + } + + private bool? CheckFamilies(Category cat1, Category cat2) + { + runes.TryGetValue(cat1, out Rune? rune1); + runes.TryGetValue(cat2, out Rune? rune2); + if(rune1 == null || rune2 == null) + { + return null; + } + return rune1.Family == rune2.Family; + } + + private void UpdateMajorFamily(Category minor, bool expectedValue) + { + if(CheckFamilies(Category.Major, minor).GetValueOrDefault(expectedValue) == expectedValue) + { + runes.Remove(minor); + } + } + } +} + diff --git a/EntityFramework_LoL/Sources/Model/Skill.cs b/EntityFramework_LoL/Sources/Model/Skill.cs new file mode 100644 index 0000000..0679ea6 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/Skill.cs @@ -0,0 +1,63 @@ +using System; + +namespace Model +{ + public class Skill : IEquatable + { + public SkillType Type { get; private set; } + + public string Name + { + get => name; + private init + { + if (string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("a Skill needs a name"); + } + name = value; + } + } + private readonly string name = null!; + + public string Description + { + get => description; + set + { + if(string.IsNullOrWhiteSpace(value)) + { + description = ""; + return; + } + description = value; + } + } + private string description = ""; + + public Skill(string name, SkillType type, string description = "") + { + Name = name; + Type = type; + Description = description ?? ""; + } + + public override bool Equals(object? obj) + { + if(ReferenceEquals(obj, null)) return false; + if(ReferenceEquals(obj, this)) return true; + if(GetType() != obj.GetType()) return false; + return Equals(obj as Skill); + } + + public bool Equals(Skill? other) + => Name.Equals(other?.Name) && Type == other.Type; + + public override int GetHashCode() + => Name.GetHashCode() % 281; + + public override string ToString() + => $"{Name} ({Type})"; + } +} + diff --git a/EntityFramework_LoL/Sources/Model/Skin.cs b/EntityFramework_LoL/Sources/Model/Skin.cs new file mode 100644 index 0000000..2d8fb78 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/Skin.cs @@ -0,0 +1,83 @@ +using System; +using System.Diagnostics.CodeAnalysis; + +namespace Model +{ + public class Skin : IEquatable + { + public string Name + { + get => name; + private init + { + if(string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("A skin must have a name"); + } + name = value; + } + } + private readonly string name = null!; + + public string Description + { + get => description; + set + { + if (string.IsNullOrWhiteSpace(value)) + { + description = ""; + return; + } + description = value; + } + } + private string description = ""; + + public string Icon { get; set; } + public LargeImage Image { get; set; } + + public float Price { get; set; } + + public Champion Champion + { + get => champion; + private init + { + if (value == null) + throw new ArgumentNullException("A skill can't have a null champion"); + champion = value; + } + } + private readonly Champion champion = null!; + + public Skin(string name, Champion champion, float price = 0.0f, string icon = "", string image = "", string description = "") + { + Name = name; + Champion = champion; + Champion.AddSkin(this); + Price = price; + Icon = icon; + Image = new LargeImage(image); + Description = description; + } + + public override bool Equals(object? obj) + { + if(ReferenceEquals(obj, null)) return false; + if(ReferenceEquals(obj, this)) return true; + if(GetType() != obj.GetType()) return false; + return Equals(obj as Skin); + } + + public bool Equals(Skin? other) + => Name.Equals(other?.Name); + + public override int GetHashCode() + => Name.GetHashCode() % 997; + + public override string ToString() + => $"{Name}"; + } +} + diff --git a/EntityFramework_LoL/Sources/Model/enums/ChampionClass.cs b/EntityFramework_LoL/Sources/Model/enums/ChampionClass.cs new file mode 100644 index 0000000..d169512 --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/enums/ChampionClass.cs @@ -0,0 +1,15 @@ +using System; +namespace Model +{ + public enum ChampionClass + { + Unknown, + Assassin, + Fighter, + Mage, + Marksman, + Support, + Tank, + } +} + diff --git a/EntityFramework_LoL/Sources/Model/enums/RuneFamily.cs b/EntityFramework_LoL/Sources/Model/enums/RuneFamily.cs new file mode 100644 index 0000000..07a232c --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/enums/RuneFamily.cs @@ -0,0 +1,11 @@ +using System; +namespace Model +{ + public enum RuneFamily + { + Unknown, + Precision, + Domination + } +} + diff --git a/EntityFramework_LoL/Sources/Model/enums/SkillType.cs b/EntityFramework_LoL/Sources/Model/enums/SkillType.cs new file mode 100644 index 0000000..d7fc8da --- /dev/null +++ b/EntityFramework_LoL/Sources/Model/enums/SkillType.cs @@ -0,0 +1,12 @@ +using System; +namespace Model +{ + public enum SkillType + { + Unknown, + Basic, + Passive, + Ultimate + } +} + diff --git a/EntityFramework_LoL/Sources/Shared/IGenericDataManager.cs b/EntityFramework_LoL/Sources/Shared/IGenericDataManager.cs new file mode 100644 index 0000000..7dfbe88 --- /dev/null +++ b/EntityFramework_LoL/Sources/Shared/IGenericDataManager.cs @@ -0,0 +1,11 @@ +namespace Shared; +public interface IGenericDataManager +{ + Task GetNbItems(); + Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false); + Task GetNbItemsByName(string substring); + Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false); + Task UpdateItem(T oldItem, T newItem); + Task AddItem(T item); + Task DeleteItem(T item); +} diff --git a/EntityFramework_LoL/Sources/Shared/Shared.csproj b/EntityFramework_LoL/Sources/Shared/Shared.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/EntityFramework_LoL/Sources/Shared/Shared.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/EntityFramework_LoL/Sources/StubLib/Extensions.cs b/EntityFramework_LoL/Sources/StubLib/Extensions.cs new file mode 100644 index 0000000..ef2e82b --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/Extensions.cs @@ -0,0 +1,65 @@ +using System; +using Model; + +namespace StubLib +{ + static class Extensions + { + internal static Task> GetItemsWithFilterAndOrdering(this IEnumerable collection, + Func filter, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + IEnumerable temp = collection; + temp = temp.Where(item => filter(item)); + if(orderingPropertyName != null) + { + var prop = typeof(T).GetProperty(orderingPropertyName!); + if (prop != null) + { + temp = descending ? temp.OrderByDescending(item => prop.GetValue(item)) + : temp.OrderBy(item => prop.GetValue(item)); + } + } + return Task.FromResult>(temp.Skip(index*count).Take(count)); + } + + internal static Task GetNbItemsWithFilter(this IEnumerable collection, Func filter) + { + return Task.FromResult(collection.Count(item => filter(item))); + } + + internal static Task AddItem(this IList collection, T? item) + { + if(item == null || collection.Contains(item)) + { + return Task.FromResult(default(T)); + } + collection.Add(item); + return Task.FromResult(item); + } + + internal static Task DeleteItem(this IList collection, T? item) + { + if(item == null) + { + return Task.FromResult(false); + } + bool result = collection.Remove(item!); + return Task.FromResult(result); + } + + internal static Task UpdateItem(this IList collection, T? oldItem, T? newItem) + { + if(oldItem == null || newItem == null) return Task.FromResult(default(T)); + + if(!collection.Contains(oldItem)) + { + return Task.FromResult(default(T)); + } + + collection.Remove(oldItem!); + collection.Add(newItem!); + return Task.FromResult(newItem); + } + } +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubData.Champions.cs b/EntityFramework_LoL/Sources/StubLib/StubData.Champions.cs new file mode 100644 index 0000000..ad19275 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubData.Champions.cs @@ -0,0 +1,100 @@ +using System; +using Model; + +namespace StubLib +{ + public partial class StubData + { + private List champions = new() + { + new Champion("Akali", ChampionClass.Assassin), + new Champion("Aatrox", ChampionClass.Fighter), + new Champion("Ahri", ChampionClass.Mage), + new Champion("Akshan", ChampionClass.Marksman), + new Champion("Bard", ChampionClass.Support), + new Champion("Alistar", ChampionClass.Tank), + }; + + public class ChampionsManager : IChampionsManager + { + private readonly StubData parent; + + public ChampionsManager(StubData parent) + => this.parent = parent; + + public Task AddItem(Champion? item) + => parent.champions.AddItem(item); + + public Task DeleteItem(Champion? item) + => parent.champions.DeleteItem(item); + + public Task GetNbItems() + => Task.FromResult(parent.champions.Count); + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering( + c => true, + index, count, + orderingPropertyName, descending); + + private Func filterByCharacteristic = (champ, charName) => champ.Characteristics.Keys.Any(k => k.Contains(charName, StringComparison.InvariantCultureIgnoreCase)); + + public Task GetNbItemsByCharacteristic(string charName) + => parent.champions.GetNbItemsWithFilter(champ => filterByCharacteristic(champ, charName)); + + public Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering( + champ => filterByCharacteristic(champ, charName), + index, count, orderingPropertyName, descending); + + private Func filterByClass = (champ, championClass) => champ.Class == championClass; + + public Task GetNbItemsByClass(ChampionClass championClass) + => parent.champions.GetNbItemsWithFilter( + champ => filterByClass(champ, championClass)); + + public Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering( + champ => filterByClass(champ, championClass), + index, count, orderingPropertyName, descending); + + private Func filterBySkill = (champ, skill) => skill != null && champ.Skills.Contains(skill!); + + public Task GetNbItemsBySkill(Skill? skill) + => parent.champions.GetNbItemsWithFilter(champ => filterBySkill(champ, skill)); + + public Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering(champ => filterBySkill(champ, skill), index, count, orderingPropertyName, descending); + + private static Func filterBySkillSubstring = (champ, skill) => champ.Skills.Any(s => s.Name.Contains(skill, StringComparison.InvariantCultureIgnoreCase)); + + public Task GetNbItemsBySkill(string skillSubstring) + => parent.champions.GetNbItemsWithFilter(champ => filterBySkillSubstring(champ, skillSubstring)); + + public Task> GetItemsBySkill(string skillSubstring, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering(champ => filterBySkillSubstring(champ, skillSubstring), index, count, orderingPropertyName, descending); + + public Task GetNbItemsByRunePage(RunePage? runePage) + => Task.FromResult(parent.championsAndRunePages.Count(tuple => tuple.Item2.Equals(runePage))); + + public Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) + => Task.FromResult> + (parent.championsAndRunePages + .Where(tuple => tuple.Item2.Equals(runePage)) + .Select(tuple => tuple.Item1) + .Skip(index*count).Take(count)); + + private Func filterByName = (champ, substring) => champ.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public Task GetNbItemsByName(string substring) + => parent.champions.GetNbItemsWithFilter(champ => filterByName(champ, substring)); + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName, bool descending = false) + => parent.champions.GetItemsWithFilterAndOrdering(champ => filterByName(champ, substring), index, count, orderingPropertyName, descending); + + public Task UpdateItem(Champion? oldItem, Champion? newItem) + => parent.champions.UpdateItem(oldItem, newItem); + } + } +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubData.RunePages.cs b/EntityFramework_LoL/Sources/StubLib/StubData.RunePages.cs new file mode 100644 index 0000000..a08a947 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubData.RunePages.cs @@ -0,0 +1,83 @@ +using System; +using Model; + +namespace StubLib +{ + public partial class StubData + { + private readonly List runePages = new(); + + private void InitRunePages() + { + var runePage1 = new RunePage("rune page 1"); + runePage1[RunePage.Category.Major] = runes[0]; + runePage1[RunePage.Category.Minor1] = runes[1]; + runePage1[RunePage.Category.Minor2] = runes[2]; + runePage1[RunePage.Category.Minor3] = runes[3]; + runePage1[RunePage.Category.OtherMinor1] = runes[4]; + runePage1[RunePage.Category.OtherMinor2] = runes[5]; + runePages.Add(runePage1); + } + + public class RunePagesManager : IRunePagesManager + { + private readonly StubData parent; + + public RunePagesManager(StubData parent) + => this.parent = parent; + + private static Func filterByName + = (rp, substring) => rp.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + private static Func filterByRune + = (rp, rune) => rune != null && rp.Runes.Values.Contains(rune!); + + public Task AddItem(RunePage? item) + => parent.runePages.AddItem(item); + + public Task DeleteItem(RunePage? item) + => parent.runePages.DeleteItem(item); + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runePages.GetItemsWithFilterAndOrdering( + rp => true, + index, count, orderingPropertyName, descending); + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + => Task.FromResult>( + parent.championsAndRunePages + .Where(tuple => tuple.Item1.Equals(champion)) + .Select(tuple => tuple.Item2) + .Skip(index*count).Take(count)); + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runePages.GetItemsWithFilterAndOrdering( + rp => filterByName(rp, substring), + index, count, orderingPropertyName, descending); + + public Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runePages.GetItemsWithFilterAndOrdering( + rp => filterByRune(rp, rune), + index, count, orderingPropertyName, descending); + + public Task GetNbItems() + => parent.runePages.GetNbItemsWithFilter( + rp => true); + + public Task GetNbItemsByChampion(Champion? champion) + => Task.FromResult(parent.championsAndRunePages.Count(tuple => tuple.Item1.Equals(champion))); + + public Task GetNbItemsByName(string substring) + => parent.runePages.GetNbItemsWithFilter( + rp => filterByName(rp, substring)); + + public Task GetNbItemsByRune(Rune? rune) + => parent.runePages.GetNbItemsWithFilter( + rp => filterByRune(rp, rune)); + + public Task UpdateItem(RunePage? oldItem, RunePage? newItem) + => parent.runePages.UpdateItem(oldItem, newItem); + } + } +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubData.Runes.cs b/EntityFramework_LoL/Sources/StubLib/StubData.Runes.cs new file mode 100644 index 0000000..f0e8802 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubData.Runes.cs @@ -0,0 +1,69 @@ +using System; +using Model; + +namespace StubLib +{ + public partial class StubData + { + private readonly List runes = new() + { + new Rune("Conqueror", RuneFamily.Precision), + new Rune("Triumph", RuneFamily.Precision), + new Rune("Legend: Alacrity", RuneFamily.Precision), + new Rune("Legend: Tenacity", RuneFamily.Precision), + new Rune("last stand", RuneFamily.Domination), + new Rune("last stand 2", RuneFamily.Domination), + }; + + public class RunesManager : IRunesManager + { + private readonly StubData parent; + + public RunesManager(StubData parent) + => this.parent = parent; + + public Task AddItem(Rune? item) + => parent.runes.AddItem(item); + + public Task DeleteItem(Rune? item) + => parent.runes.DeleteItem(item); + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runes.GetItemsWithFilterAndOrdering( + r => true, + index, count, orderingPropertyName, descending); + + private static Func filterByRuneFamily + = (rune, family) => rune.Family == family; + + private static Func filterByName + = (rune, substring) => rune.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runes.GetItemsWithFilterAndOrdering( + rune => filterByRuneFamily(rune, family), + index, count, orderingPropertyName, descending); + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.runes.GetItemsWithFilterAndOrdering( + rune => filterByName(rune, substring), + index, count, orderingPropertyName, descending); + + public Task GetNbItems() + => parent.runes.GetNbItemsWithFilter( + rune => true); + + public Task GetNbItemsByFamily(RuneFamily family) + => parent.runes.GetNbItemsWithFilter( + rune => filterByRuneFamily(rune, family)); + + public Task GetNbItemsByName(string substring) + => parent.runes.GetNbItemsWithFilter( + rune => filterByName(rune, substring)); + + public Task UpdateItem(Rune? oldItem, Rune? newItem) + => parent.runes.UpdateItem(oldItem, newItem); + } + } +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubData.Skins.cs b/EntityFramework_LoL/Sources/StubLib/StubData.Skins.cs new file mode 100644 index 0000000..ff5fc08 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubData.Skins.cs @@ -0,0 +1,80 @@ +using System; +using Model; + +namespace StubLib +{ + public partial class StubData + { + private readonly List skins = new(); + + private void InitSkins() + { + skins.Add(new Skin("Stinger", champions[0])); + skins.Add(new Skin("Infernal", champions[0])); + skins.Add(new Skin("All-Star", champions[0])); + skins.Add(new Skin("Justicar", champions[1])); + skins.Add(new Skin("Mecha", champions[1])); + skins.Add(new Skin("Sea Hunter", champions[1])); + skins.Add(new Skin("Dynasty", champions[2])); + skins.Add(new Skin("Midnight", champions[2])); + skins.Add(new Skin("Foxfire", champions[2])); + skins.Add(new Skin("Cyber Pop", champions[3])); + skins.Add(new Skin("Crystal Rose", champions[3])); + skins.Add(new Skin("Elderwood", champions[4])); + skins.Add(new Skin("Snow Day", champions[4])); + skins.Add(new Skin("Bard", champions[4])); + skins.Add(new Skin("Black", champions[5])); + skins.Add(new Skin("Golden", champions[5])); + skins.Add(new Skin("Matador", champions[5])); + } + + public class SkinsManager : ISkinsManager + { + private readonly StubData parent; + + public SkinsManager(StubData parent) + => this.parent = parent; + + public Task AddItem(Skin? item) + => parent.skins.AddItem(item); + + public Task DeleteItem(Skin? item) + => parent.skins.DeleteItem(item); + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.skins.GetItemsWithFilterAndOrdering( + skin => true, + index, count, orderingPropertyName, descending); + + private static Func filterByChampion = (skin, champion) => champion != null && skin.Champion.Equals(champion!); + + private static Func filterByName = (skin, substring) => skin.Name.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.skins.GetItemsWithFilterAndOrdering( + skin => filterByChampion(skin, champion), + index, count, orderingPropertyName, descending); + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + => parent.skins.GetItemsWithFilterAndOrdering( + skin => filterByName(skin, substring), + index, count, orderingPropertyName, descending); + + public Task GetNbItems() + => parent.skins.GetNbItemsWithFilter( + c => true); + + public Task GetNbItemsByChampion(Champion? champion) + => parent.skins.GetNbItemsWithFilter( + skin => filterByChampion(skin, champion)); + + public Task GetNbItemsByName(string substring) + => parent.skins.GetNbItemsWithFilter( + skin => filterByName(skin, substring)); + + public Task UpdateItem(Skin? oldItem, Skin? newItem) + => parent.skins.UpdateItem(oldItem, newItem); + } + } +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubData.cs b/EntityFramework_LoL/Sources/StubLib/StubData.cs new file mode 100644 index 0000000..8e34486 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubData.cs @@ -0,0 +1,35 @@ +using Model; + +namespace StubLib; +public partial class StubData : IDataManager +{ + public StubData() + { + ChampionsMgr = new ChampionsManager(this); + SkinsMgr = new SkinsManager(this); + RunesMgr = new RunesManager(this); + RunePagesMgr = new RunePagesManager(this); + + InitSkins(); + InitRunePages(); + } + + public IChampionsManager ChampionsMgr { get; } + + public ISkinsManager SkinsMgr { get; } + + public IRunesManager RunesMgr { get; } + + public IRunePagesManager RunePagesMgr { get; } + + private List> championsAndRunePages = new(); + + private void InitChampionsAndRunePages() + { + championsAndRunePages.Add(Tuple.Create(champions[0], runePages[0])); + } + + + +} + diff --git a/EntityFramework_LoL/Sources/StubLib/StubLib.csproj b/EntityFramework_LoL/Sources/StubLib/StubLib.csproj new file mode 100644 index 0000000..1b714b9 --- /dev/null +++ b/EntityFramework_LoL/Sources/StubLib/StubLib.csproj @@ -0,0 +1,12 @@ + + + + net6.0 + enable + enable + + + + + + diff --git a/EntityFramework_LoL/Sources/Tests/ConsoleTests/ConsoleTests.csproj b/EntityFramework_LoL/Sources/Tests/ConsoleTests/ConsoleTests.csproj new file mode 100644 index 0000000..c52655b --- /dev/null +++ b/EntityFramework_LoL/Sources/Tests/ConsoleTests/ConsoleTests.csproj @@ -0,0 +1,20 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + diff --git a/EntityFramework_LoL/Sources/Tests/ConsoleTests/Program.cs b/EntityFramework_LoL/Sources/Tests/ConsoleTests/Program.cs new file mode 100644 index 0000000..93e266f --- /dev/null +++ b/EntityFramework_LoL/Sources/Tests/ConsoleTests/Program.cs @@ -0,0 +1,338 @@ +using System.Collections.Immutable; +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Model; +using StubLib; +using static System.Console; + +namespace ConsoleTests +{ + static class Program + { + static IDataManager dataManager = null!; + + static async Task Main(string[] args) + { + try + { + using var servicesProvider = new ServiceCollection() + .AddSingleton() + .BuildServiceProvider(); + + dataManager = servicesProvider.GetRequiredService(); + + await DisplayMainMenu(); + + Console.ReadLine(); + } + catch (Exception ex) + { + Debug.WriteLine(ex, "Stopped program because of exception"); + throw; + } + } + + public static async Task DisplayMainMenu() + { + Dictionary choices = new Dictionary() + { + [1] = "1- Manage Champions", + [2] = "2- Manage Skins", + [3] = "3- Manage Runes", + [4] = "4- Manage Rune Pages", + [99] = "99- Quit" + }; + + while(true) + { + int input = DisplayAMenu(choices); + + switch(input) + { + case 1: + await DisplayChampionsMenu(); + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 99: + WriteLine("Bye bye!"); + return; + default: + break; + } + } + } + + private static int DisplayAMenu(Dictionary choices) + { + int input=-1; + while(true) + { + WriteLine("What is your choice?"); + WriteLine("--------------------"); + foreach(var choice in choices.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value)) + { + WriteLine(choice); + } + if(!int.TryParse(ReadLine(), out input) || input == -1) + { + WriteLine("I do not understand what your choice is. Please try again."); + continue; + } + break; + } + WriteLine($"You have chosen: {choices[input]}"); + WriteLine(); + return input; + } + + public static async Task DisplayChampionsMenu() + { + Dictionary choices = new Dictionary() + { + [0] = "0- Get number of champions", + [1] = "1- Get champions", + [2] = "2- Find champions by name", + [3] = "3- Find champions by characteristic", + [4] = "4- Find champions by class", + [5] = "5- Find champions by skill", + [6] = "6- Add new champion", + [7] = "7- Delete a champion", + [8] = "8- Update a champion", + }; + + int input = DisplayAMenu(choices); + + switch(input) + { + case 0: + int nb = await dataManager.ChampionsMgr.GetNbItems(); + WriteLine($"There are {nb} champions"); + WriteLine("**********************"); + break; + case 1: + { + int index = ReadAnInt("Please enter the page index"); + int count = ReadAnInt("Please enter the number of elements to display"); + WriteLine($"{count} champions of page {index+1}"); + var champions = await dataManager.ChampionsMgr.GetItems(index, count, nameof(Champion.Name)); + foreach(var champion in champions) + { + WriteLine($"\t{champion}"); + } + WriteLine("**********************"); + } + break; + case 2: + { + string substring = ReadAString("Please enter the substring to look for in the name of a champion"); + int index = ReadAnInt("Please enter the page index"); + int count = ReadAnInt("Please enter the number of elements to display"); + var champions = await dataManager.ChampionsMgr.GetItemsByName(substring, index, count, nameof(Champion.Name)); + foreach(var champion in champions) + { + WriteLine($"\t{champion}"); + } + WriteLine("**********************"); + } + break; + case 3: + { + string substring = ReadAString("Please enter the substring to look for in the characteristics of champions"); + int index = ReadAnInt("Please enter the page index"); + int count = ReadAnInt("Please enter the number of elements to display"); + var champions = await dataManager.ChampionsMgr.GetItemsByCharacteristic(substring, index, count, nameof(Champion.Name)); + foreach(var champion in champions) + { + WriteLine($"\t{champion}"); + } + WriteLine("**********************"); + } + break; + case 4: + { + ChampionClass championClass = ReadAnEnum($"Please enter the champion class (possible values are: {Enum.GetNames().Aggregate("", (name, chaine) => $"{chaine} {name}")}):"); + int index = ReadAnInt("Please enter the page index"); + int count = ReadAnInt("Please enter the number of elements to display"); + var champions = await dataManager.ChampionsMgr.GetItemsByClass(championClass, index, count, nameof(Champion.Name)); + foreach(var champion in champions) + { + WriteLine($"\t{champion}"); + } + WriteLine("**********************"); + } + break; + case 5: + { + string substring = ReadAString("Please enter the substring to look for in the skills of champions"); + int index = ReadAnInt("Please enter the page index"); + int count = ReadAnInt("Please enter the number of elements to display"); + var champions = await dataManager.ChampionsMgr.GetItemsBySkill(substring, index, count, nameof(Champion.Name)); + foreach(var champion in champions) + { + WriteLine($"\t{champion}"); + } + WriteLine("**********************"); + } + break; + case 6: + { + WriteLine("You are going to create a new champion."); + string name = ReadAString("Please enter the champion name:"); + ChampionClass championClass = ReadAnEnum($"Please enter the champion class (possible values are: {Enum.GetNames().Aggregate("", (name, chaine) => $"{chaine} {name}")}):"); + string bio = ReadAString("Please enter the champion bio:"); + Champion champion = new Champion(name, championClass, bio: bio); + DisplayCreationChampionMenu(champion); + _ = await dataManager.ChampionsMgr.AddItem(champion); + } + break; + case 7: + { + WriteLine("You are going to delete a champion."); + string name = ReadAString("Please enter the champion name:"); + var somechampions = await dataManager.ChampionsMgr.GetItemsByName(name, 0, 10, nameof(Champion.Name)); + var someChampionNames = somechampions.Select(c => c!.Name); + var someChampionNamesAsOneString = someChampionNames.Aggregate("", (name, chaine) => $"{chaine} {name}"); + string champName = ReadAStringAmongPossibleValues($"Who do you want to delete among these champions? (type \"Cancel\" to ... cancel) {someChampionNamesAsOneString}", + someChampionNames.ToArray()); + if(champName != "Cancel") + { + await dataManager.ChampionsMgr.DeleteItem(somechampions.Single(c => c!.Name == champName)); + } + } + break; + case 8: + { + WriteLine("You are going to update a champion."); + string name = ReadAString("Please enter the champion name:"); + var somechampions = await dataManager.ChampionsMgr.GetItemsByName(name, 0, 10, nameof(Champion.Name)); + var someChampionNames = somechampions.Select(c => c!.Name); + var someChampionNamesAsOneString = someChampionNames.Aggregate("", (name, chaine) => $"{chaine} {name}"); + string champName = ReadAStringAmongPossibleValues($"Who do you want to update among these champions? (type \"Cancel\" to ... cancel) {someChampionNamesAsOneString}", + someChampionNames.ToArray()); + if(champName == "Cancel") break; + ChampionClass championClass = ReadAnEnum($"Please enter the champion class (possible values are: {Enum.GetNames().Aggregate("", (name, chaine) => $"{chaine} {name}")}):"); + string bio = ReadAString("Please enter the champion bio:"); + Champion champion = new Champion(champName, championClass, bio: bio); + DisplayCreationChampionMenu(champion); + await dataManager.ChampionsMgr.UpdateItem(somechampions.Single(c => c!.Name == champName), champion); + } + break; + default: + break; + } + + } + + public static void DisplayCreationChampionMenu(Champion champion) + { + Dictionary choices = new Dictionary() + { + [1] = "1- Add a skill", + [2] = "2- Add a skin", + [3] = "3- Add a characteristic", + [99] = "99- Finish" + }; + + while(true) + { + int input = DisplayAMenu(choices); + + switch(input) + { + case 1: + string skillName = ReadAString("Please enter the skill name:"); + SkillType skillType = ReadAnEnum($"Please enter the skill type (possible values are: {Enum.GetNames().Aggregate("", (name, chaine) => $"{chaine} {name}")}):"); + string skillDescription = ReadAString("Please enter the skill description:"); + Skill skill = new Skill(skillName, skillType, skillDescription); + champion.AddSkill(skill); + break; + case 2: + string skinName = ReadAString("Please enter the skin name:"); + string skinDescription = ReadAString("Please enter the skin description:"); + float skinPrice = ReadAFloat("Please enter the price of this skin:"); + Skin skin = new Skin(skinName, champion, skinPrice, description: skinDescription); + break; + case 3: + string characteristic = ReadAString("Please enter the characteristic:"); + int value = ReadAnInt("Please enter the value associated to this characteristic:"); + champion.AddCharacteristics(Tuple.Create(characteristic, value)); + break; + case 99: + return; + default: + break; + } + } + } + + private static int ReadAnInt(string message) + { + while(true) + { + WriteLine(message); + if(!int.TryParse(ReadLine(), out int result)) + { + continue; + } + return result; + } + } + + private static float ReadAFloat(string message) + { + while(true) + { + WriteLine(message); + if(!float.TryParse(ReadLine(), out float result)) + { + continue; + } + return result; + } + } + + private static string ReadAString(string message) + { + while(true) + { + WriteLine(message); + string? line = ReadLine(); + if(line == null) + { + continue; + } + return line!; + } + } + + private static TEnum ReadAnEnum(string message) where TEnum :struct + { + while(true) + { + WriteLine(message); + if(!Enum.TryParse(ReadLine(), out TEnum result)) + { + continue; + } + return result; + } + } + + private static string ReadAStringAmongPossibleValues(string message, params string[] possibleValues) + { + while(true) + { + WriteLine(message); + string? result = ReadLine(); + if(result == null) continue; + if(result != "Cancel" && !possibleValues.Contains(result!)) continue; + return result!; + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d814e0f --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# League of Legends - Project +