From 6af6e34b7ae1385340dc5432f10ddae07fde5574 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:38:23 -0800 Subject: [PATCH 01/28] udpate git ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 9f58d51..2961d67 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ /.pnp .pnp.js pnpm-lock.yaml +*.lockb +bun.lockb # testing /coverage From a701ce070c913510ee512aa11b4d40adc63a2a7b Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:43:08 -0800 Subject: [PATCH 02/28] Update git ignore more --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 2961d67..988dea7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +#IDE related +.idea +*.idea/ + # dependencies /node_modules /.pnp From 0f8291501cd06861968fbba2af67b63d863b5c9e Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:44:11 -0800 Subject: [PATCH 03/28] add bun compiler to project --- package-lock.json | 135 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 136 insertions(+) diff --git a/package-lock.json b/package-lock.json index f7baa23..3b4e5a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@uidotdev/usehooks": "^2.4.1", "@uiw/react-codemirror": "^4.23.5", "axios": "^1.7.7", + "bun": "^1.1.38", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "codemirror": "^6.0.1", @@ -1360,6 +1361,110 @@ "node": ">= 8" } }, + "node_modules/@oven/bun-darwin-aarch64": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.38.tgz", + "integrity": "sha512-6r+PgOE1s56h16wHs4Tg32ZOB9JQEgLi3V+FyIag/lIKS5FV9rUjfSZSwwI8UGfNqj7RrD5cB+1PT3IFpV6gmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.38.tgz", + "integrity": "sha512-eda41VCgQcYkrvRnob1xep8zlOm0Io3q1uiBGMaNL8aSrhpYaz3NhMH1NVlZEFahfIHhCfkin/gSLhJK0qK1fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-darwin-x64-baseline": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.38.tgz", + "integrity": "sha512-hqaAsJGdGXiwwN6Y7dvYWjYwgAB8r3fXFIecjmxeijbOIw8zfru+zKFCBQtHa5AglAUAw1fOSOsWGlu8rtGp7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oven/bun-linux-aarch64": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.38.tgz", + "integrity": "sha512-YIyJ2cBEgvQAYUh1udxe6yximei2QUh6gpdGWmhHiWWRX0VhVxPpZ2E8n6NIlpM2TBy4h/hOndoImiD/XnSq5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.38.tgz", + "integrity": "sha512-foVXWa2/zRPMudxVpr+/COmcF1F849g4JJHTDDzpxIp30Xp7422nSk/c0NESveklrqhCvINq4CNcKnBh3WPFAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-linux-x64-baseline": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.38.tgz", + "integrity": "sha512-7Sv4RHpWBVjmkGjER90e99bYYkPiiNPGVP02CTBo49JwHfogVl8md8oWKr9A6K3ZZ05HS5atOg7wrKolkbR0bA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oven/bun-windows-x64": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.38.tgz", + "integrity": "sha512-bMo3o7lyfC8HlyaunUXBFZVbVrYCQHHQRPXsCtgtBKzKbe/r51piwtMl4wpcvd5VZUhBDXMPrm7/OR89XXteyA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oven/bun-windows-x64-baseline": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.38.tgz", + "integrity": "sha512-iwvzUC59J/aMwEsCkKyPLVc2oNep2OhWL6VRp2d9Sx0g9hycBgxOfBfAhii0bDOBI/aQAVevcTRoQJ1V79PT9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4790,6 +4895,36 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bun": { + "version": "1.1.38", + "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.38.tgz", + "integrity": "sha512-cr+UDFiEasyw0kKEbbD7kDewrI2vTo17JssVVjzBv/eNskeL2wikJ+4RNgUfoRqgthCjDZux7r6ELGgIGq6aWw==", + "cpu": [ + "arm64", + "x64" + ], + "hasInstallScript": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "bin": { + "bun": "bin/bun.exe", + "bunx": "bin/bun.exe" + }, + "optionalDependencies": { + "@oven/bun-darwin-aarch64": "1.1.38", + "@oven/bun-darwin-x64": "1.1.38", + "@oven/bun-darwin-x64-baseline": "1.1.38", + "@oven/bun-linux-aarch64": "1.1.38", + "@oven/bun-linux-x64": "1.1.38", + "@oven/bun-linux-x64-baseline": "1.1.38", + "@oven/bun-windows-x64": "1.1.38", + "@oven/bun-windows-x64-baseline": "1.1.38" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", diff --git a/package.json b/package.json index 0cc5a56..1b6ad81 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@uidotdev/usehooks": "^2.4.1", "@uiw/react-codemirror": "^4.23.5", "axios": "^1.7.7", + "bun": "^1.1.38", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "codemirror": "^6.0.1", From 074c3faff7d6133fd627d97ebe5cd26b6c9168a5 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:52:48 -0800 Subject: [PATCH 04/28] add updated favicons --- assets/favicons/favicon_144x144.png | Bin 0 -> 2992 bytes assets/favicons/favicon_16x16.png | Bin 0 -> 438 bytes assets/favicons/favicon_180x180.png | Bin 0 -> 3734 bytes assets/favicons/favicon_192x192.png | Bin 0 -> 4020 bytes assets/favicons/favicon_194x194.png | Bin 0 -> 4000 bytes assets/favicons/favicon_256x256.png | Bin 0 -> 5271 bytes assets/favicons/favicon_32x32.png | Bin 0 -> 796 bytes assets/favicons/favicon_ico.ico | Bin 0 -> 186008 bytes assets/favicons/favicon_svg.svg | 12 ++++++++++++ index.html | 26 ++++++++++++++++++++++++-- 10 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 assets/favicons/favicon_144x144.png create mode 100644 assets/favicons/favicon_16x16.png create mode 100644 assets/favicons/favicon_180x180.png create mode 100644 assets/favicons/favicon_192x192.png create mode 100644 assets/favicons/favicon_194x194.png create mode 100644 assets/favicons/favicon_256x256.png create mode 100644 assets/favicons/favicon_32x32.png create mode 100644 assets/favicons/favicon_ico.ico create mode 100644 assets/favicons/favicon_svg.svg diff --git a/assets/favicons/favicon_144x144.png b/assets/favicons/favicon_144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..96a559648583abb6811341fd2f70e4f100f5ac9c GIT binary patch literal 2992 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 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_16x16.png b/assets/favicons/favicon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dbf159c7bb834ff18ebe4961c836123a50ec9b GIT binary patch literal 438 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 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_192x192.png b/assets/favicons/favicon_192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..eea452f8180d4c6f5d5632b6da0597e9f2fc53e2 GIT binary patch literal 4020 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 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_194x194.png b/assets/favicons/favicon_194x194.png new file mode 100644 index 0000000000000000000000000000000000000000..d635c6c0523e0352710ea0eb47980589c12434b4 GIT binary patch literal 4000 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 D@PQd9 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_256x256.png b/assets/favicons/favicon_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..276e9b7f517ad8db76ea9510363923902647c661 GIT binary patch literal 5271 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 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_32x32.png b/assets/favicons/favicon_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5787bde0ff5b985a90e80f2e9e5cc3a1ce2fdb GIT binary patch literal 796 zcmV+%1LOROP)DQd0+&x0ZdR+5~+{r1i%DMCIBWNnILomUMn>PcY@Lh$_AxUrBICRe#aPd z0Yd`8N2Y_=j1s*@3Xt?N5;FU%mXOJ?);+cVF z;Np7oGGzr^8}`)1J*_S#GN_b75L>P0R`c8TCEh+thC*k~gpuc?a&!+!tlb%U6j0(B zQpm@=gOS`#FENHc=c6JmE219_|Ejo}R`HuB;JHn>??!j`3))dV;CmQmOgNsx_uRv( z0u=g*pPINn>*HoYKS>$>y+q0KF_5g6xaT$38%PNk3Sl>2F zazlYx6}3qCXuWSg7ZN(wcRcaJw>&hGcvlpVS?-I=ULc&ErN(L3!@_e~b7>6w zwr6l?^jH57g{A0a(awL_shF*GH;2L-y9|jHFx}8)MV@Z{0nUORtssS#7Q{N*hX0oW#w=uT!X>5w{!wG*cKD97YQG7iKuK7z6}yW zKUl6^L{Y++#490qw?P%F6>d1yp5yXF3} literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_ico.ico b/assets/favicons/favicon_ico.ico new file mode 100644 index 0000000000000000000000000000000000000000..28ad03f0a4045420297449ab8de84134db92dccd GIT binary patch literal 186008 zcmeF42b>$l^~d+z!GKN26x&oo=p9!{E8U$tozM~-AcYo42m}bh2T33h2m}(+=p}*t zNeC?op&1Aedhf+YCxF5Iw36)me}A(((n^+2(w**nXWxGO^Q`uEr@Z&(&71bdaq65^ zoS{Pf>yg#VU+2N!*N0-ufzwS5(oz}o{QiJf>( zzlZYt|A=!F%CEF1fptRPFXi_qK;=BhY1H@RJ-U!`@_oa?K0H4K+z8eJJ`McxU%+qW z{|KNmehMZ#^`sqL6(k3pO|HAL=Z~uFrmP$L38piiG@!fZvab8{7?-h^uaNe;%Qk>Q%$LN_2xECR$ zf6Rr>TUO5`S2Z-4^0CSwdie0a$p7E}8#3apPW@cXNwoBH;;N@DjuZ0+_|LsH_}f5J zfAzJmfBsE)9-yuy`G#~{axYm8U%pIC;P1D9o5{-_CO>XUb^lBto%AQt*$wz###8fn z)*3*%fO_R^PTqXFinjJLvhArZXF!rTraO&LF7Bb*QY}F7T!~z)P8h`R-4Hz2-#!CM zLwfBH^cA|9`1fljEzx*o_lVzK`W;WL2L1?MBL90B{Ux2}w*l0x^k&=_ zi$BeC#s55TofDozj*tnpO=FF z0;Tabi2CJ+_G%+^iB6MV;Csnq>MKC;KSVi35c2l`dN)V^9Dft0jeeDPmBv$ix1*Dw z47)wAFZ`=s?Gb6J?Tx39>C_G6e^WyHh952)|8!qBc>D2gGf=s1qOPr*M0 zbWc+UGkx>g5xr9^e#!6TMYNN&Bd)hM?@ZylVdhMwcl>2K*HeN20) zJduv>O&)?U9Cs!6e*RT|WjA;xzcx;Vv3AC5)Ar-vp198hXAu7=LgjfCLgbG!L_@M; zzpFI#;?4YlFyFt457$9A)Hsf8e6i6Rk(XROQk;@Ztj zL~n}-ktpxwF5hlaxpLncdWxocCY>Gr8~19%!|kl=#h}Nj;4rW$vIUKJ$8USv&Vk~I zd(?Sve=q}}qm!HSj5MSl77(I?{J$OHhsj+DbMg9eD|G~k~+Ja})d1Nar+YRK^#BXRY zk9^0Bz2thUq3ieIo2P)vA^U$@XBX;4>GVaj`+#(!$}RAHdc3hGC6k4hY_ocAE#A8g zWJv$#POOD~4D?oe=NcPXw2%xv#q$WEAIq}kw`tn&9?G_Zv+sMzsrnnici}w9Za00Y zl?1ZX}Qk! z@Jwl1dt9NtmQ7#s|4nQX^}pT-<>4Wo(*~2q6wAFDIoQ!I7=nZEVy{WXxa(eQ3yp1ulyS*rXd4rtxjf{kMO*w>PWYvJRs ziEkIf&u~12_qM+wT_Ig%`^<&!wUz!@WKDIresLelyNZFv+Tx}UTo}``za^7lEc-?= z`499jG@OVG9Pyh`d)cRq+QZ~3w%cT4{}C-QD?@8I)fLc z->J4e=qJ}x|0dG5C(;@V&=^cJd6?=P$lpbWT3)KB5z6blPPk}QCo+$Aiuxx#a-n1} zEqg?5(p&IiG$GG;E`3{zOX=5B*WKh^l<_*!IF>X5nIo;eKa)&+3#d)Ghre%b+6d*L z7MIeW(28AY`j~3>l+H!uWkW}NP+zODMfKupptj&@+Vvsm;##Ec>q(>6mdchJ2mVbO zNg(?tLAys=B$}rZg!6rPM>&&gRDPAh#1GG9%fu^{gmIzmuT<; z<=?3`1PEf$cwaqz9;0^|yH2E}3uV(OJ+;HKuXQhIEbIK5rf(w?Erbc!PVtoNhl_y5 zB5c|=#4zoo%gi^T50sBcYd=Db;rt%F4^lvRpwe{mB^lSaOjPy2%r`Nf;hh971P69< z>VEXH1ty{QEMG!l-BJb|gb83c7y$Yh3?a;-iRZI;ry0xzNss}pOQG&kX9O4m2DY|l z`nI;t0!?NdA{Wl$cQZ(W3}_XaG%u}6Fau=gi?%2-PQl-MujNRAXv;|C^%`(1a&!rO z;AqWr6ZiI^&1lL)sdS>PL-XFtewRF{Xue!C-fH!ZAG*~41nDWRT3j*Fr$EOkU&Ssn zcU^W=dJ$yFu!k1j<2 z7NNWBv$o{GZJANxyKw&P{UvS2Rf>~O2lCiP2ZHbAd{ucXIdDb|aVDpb0 zLXT2)uf6$?ryj^l!=_hC<_ptFq-QSkeS+~?U4}N|kvBWSS9opBH)X!^lxcPU4v(ioNDU z)6u-LRw7SD^B+ztd{4Qm&AZKLm>$YkDcUOjLYXb4&lPv2`EM%@o5ymYX^XS;Xj=wz z<)vPE=_i$gnCzc^>XKC!O7Isf()4VYLWy;VFd$BOi zuKt~0hSK8*U7fFL(p#ns9qbcVlXfNVYHX&Qe7ot3bA2bqg}Te7F=Ll84%N|edL}$B zSd0E-M`>XCSp=MP?l=NO94E449RSqs`$8;37Xx$!bXZ^N4h3d-h>u}F@( z+vV5Q;`z;!A3MI>&3ItxS(Fzx&v{|{#&c{sof)cLxXaA<__7n`MQ7%r7IFJBbqRH# zpl%pGbpASo)<&V#dNHkoj4q^U2zo0B7&h7itO8iX@vn&-(# zt9dU&e0qQB5I>$);+-{P-NAUYgKR@K|>>!_&hOI5cuTs4qgzpAna}ds* z>Hj?$@x#mr6K0nBVRGgW^LuV&p#OZxPfWOUpdYr@oo#-%&SG1c(rJb)3RxXzLRO}k zu+@gMg5NyQdn%9CX+=R3$gb1k!7}^$`TI(JX&rKS-Md+9$NE?88M5ds0_CMknr;!; zJlH)v^S$1+XC(Xv)Be63}a8mK*Ni0x?{=5u3%hiAKu>tY#;j0eouVKZ2)VR zOO!w6?M2!%!CgMscVhOJC0+V}!&z^(7V9nsI4ZW;^CQ_P5mz{WmE7mb&z?Zm)~POG?|z1|<4?u)*ehecR~$AT)^sO-0Jbh!emC_mc&;`7 zS_8fi%mcyR4E#_eyfgW|6YIs;rw;SuS4HEz?txU zw9`1huUQ{&{4@kQ!se^mFjxMgD4+Jk6y{+*&m{+vXX-lZ#Rcsbb6fBqlst%U9tGNK zSop2>j^D+16L^1c8|4?B?E31$IKsc1;r}0bcVEKIjeZahv{qVmu|0YrSN-yFOAyCQdgp7Pk8rdzR_OP!uZ0!Mc1%=N*10+FHk4gD^kB`sNX&y zXO*@O)$rf66>0WIrj7^5V9~sy!@a+Om@^H(E-H6?N!xXE5_%+o{|vtk2$xs)(hF|` z;!Ir*w69rw&(#;#v>CS($2TbVNaye;{JLQGp0~Ast+Mi846jEy6BqXig zaDKH{=1JcDD*A41vkzMP&xN+G`jqyZMfmnlpil-Fw_|^M0zX1`W3H}bF-@n0RJ87{ZIf0@6DkCa_{ zxrDweq{V)pv)7CI8~45jKIGeQTlg_)AIbRZdiXs-j^ryyZAl87gME5#`YPTR4U`AT zit6Ow_+~o32i7oUpU|Q5V~?QY6R95q(L79VTkfU&?Ne|Wx@d&a$7T;th2=MUho!rd zBcSh(NJF~K#!dNC-=v)E6NRS6=M?2>{DS)>=%F-roACkkG~Y-+=)1W*W6z#<9D7_-EbWvpXyTp4-^K#$Z)jY2 zl`p?7XR%Or>VHV%bm%?G*^jnS?VR$~R(n^N2mRK5D}N6;{w~rph*vsBWsrY|kHE?7 z2j76-lsn*M6#F}-w4lQ{?N>|J^Y>eU>X7)RJby~LF9cudgz~c=(K{XtHF4W=S6g;l ze)-x=WTXp+K-2G$_ve6goAkjw;H!ZBn$j)sQsr0K6(0Hw&(Z_=8~wF(6X6>`G7kKNx(Z#WU2YC4&i-O8(Wc@_$DB{|3-Iy`3`|SCYz$ zm4p10D*L5AzOeWEl*bzlZY2KCfiKH(kG?T`mKzoi;%}mp55*p)-vs=|ObC1+wAl_iiKIFM_ncppCc; z?CwO=76#?F`{TntN5c0u{=%?4|Fs8r7I~2E^;b~5{d1*fg7(jh2}p*E=-a~d3xC`4 z%a6;R==p}l`0iXBA$|3;#0%*I(c+h+w-d{YFNX%Pbl~Hr9qE-X{}+_qw|^U3 zv48Q4O=~$3`4f}f3NPDp zS-qvSNN)wsCf%pNEZTxm&hE6Clh7H} zUe%U=FVYbv)Bi}wcd>UG<(y4E#EU|x@AfPBwxu&}9%BKr@jGz&_Oaj2C(_%a4~{0y zs-}|r*f3YK>!MV`jA@cAFkbd&v%3p^Wx1C0~7N|CN%f4@E zFbW<-mkz+*S{*PR$M5!B)t29;q4r6bgkSB6%#XzJ`|En&2PcMb68G>YeIT|M`n!nz zY2&LjwB=V^J5y$jElx0Dr7`5c*OBt8zD-4@CoR_4#cGsw%_2ZHGmJyXw^;zaJV~oc2L&L?PO;zpKe>XS~~y@^?mlx;oC@^3#?xrx;_5v6A_p zuI5i?r`OAW%YVjLy=Q2<3vHN1JlDLo=JxZsVQgWZg~R+ey8o{n{|}^m>fftx@pgb_ z!e@B?V;~>rx$>xQt>2oDkIR3d$M_?^?RZ4)&F+2YmtQilI_24j@@^Kw=G>3uIrH4+ z%#d7JRDPfDn%f-*Htyl&5BRBa6(HQ6TMEc`;W*Z$#5k`>Gv+L@|8>1?}t!+v;V`6&9+efN0|F{@#i@>+vi_#%dferDEz+`XuX!&&iUxd zJJF~0&R(DQHN02(S2P;ferRqy@VYDwT*iak)HTpx0=``bINRROoCtccy?yj@ve;RF zw|p}pKCMlC4%UAu%^VFhXXjFW$$>vV;Bsz=%UO0YZ&&=FGd9aOsQT$W>8iZ^qJ_qV z$Aj?vz~|85uZ+)+a&}^zq9^fRzKFHPPh+Z)#e*5cTo;|T2IcYX1Ur_MlL3uQVhg1w z0NDd-6QvJWJ0Ksnj1?BMBf6VB*zpvtU2zw$%32fV&68iFO*<7?mS66ToH5K%TN}yd zUv$toM~pdW*ZA^(ASl1)pjkWN9YY-JnlT_d9%8@kPN6M-Lh}}k+qy~CHh3>mZq?^U zf$SZ|;5k=8G*BI}>#Vfq#n{BDK7>C4?*%kqK7ct9bJj`*AH&oI(LmpJx677a>nU8x zvRQ9t+jo!O>L2|AYzLMtzs?7eo@;2~+yvvhS!Gu}(Ap%{r(`Ape=fc|mw!BC%35=z zb4LBMl(Ys&W@G)L3|^xglEpDU9>K0ZHS7M;o6;Uo z56oGN`eq5`f0J)mE1zV{9Qmo`m~gG>q5L(>6Sg;=9QP4o^+`lws@ykOUrw@?8 z*3mpnf^%r5H}ehkpq@2XiPZi)*BqJ3FR-plb0s>r1sUt^<(EuLS55q!ylS13&K_c3 zPqOTnCqpRxfSfZ$&U#4jSpfmz4*#5jyuN+R8j| zI!?J{BR&Xb18XxBr$rAgem3jUkFtBW1zMv!X)$fT7vcWrfO>A$j>~4E{Wt4!MHA`A z*RpZ+db6i>TK+czz>5T>ZF(r_-#XHCI?dT+Zhpr0~JPa+z^C)gU~sP=QF_s zJP*KxY&cxb9hw|Yt;vQ1gWm&NX9drjov8VHvorE6eQ(30pYF_zA4WLBW+`#=pC7h1 z1>vk9Y>t@xx7sktZ^}n`b^492(&5JD1-{2?h2G1C9FwCfSr>#*O;<7-MuOiX6lVJQ zDcO(}lqSOFI$Tz8HLHNd!#qC^TDhe6RA7Z7nhA*@FH8o%dC@%Q#r&{2_-)SfF@KVu zh>1Xs!m@rM_U-i(0XeF>G@j(o$rtDtm{NcUYZy3F)Y2#% zkG+qwj??v~ksoX}?-FnxZPfA5CxZN_{f0JOPM?vaJBfT94UPlH1~{JZ8;re8fHs_Y zU4%Zq{Ak{Vas1S{(6=@Y8)`gm2H2rZ`na62>!xmiCa(h7a0;<)y_*Ry;%_HFp9bV- zW9LBjqv;G-Lod}oP|GVT_hxUSZ0x)JyqG;A|Ka{Ia3^_VzX0VjXEFzQuri=H;+a*j z%_i`!`YVqF(DxSqB@XtICeH<<%h2aFzLQN~te>N?&ku;}Py8KTrWrTz)=HSZNuUyk!n zkqzVL#n(f{coS5a6FCxdrD~ zs=o#O)7lT~>+tsK?|k~)M!f2~hSS%*R#TL-YLvSTfa3p7-J?<(1wnm3PU()8L!*p;mE5S1^AbPkx_r{#Kc#>WKfKr@?= zp2qv(1(vVsT(wu#^pV_>-nm%AvD8<%zn=6zE>RZgoL6aQjscrt1JpT_*&`==psg$3 zGLASkCa*CV#ZinNZ9SXAH}|8PegMS6= zQYx>_l=HXHW;gXBo6$?qXM)-lpbK{-kf+i{<-|^4uD<8K75z`&@SiI#*-J3=1V+l0eW9_oDZHL z&nH8pZTLGp>NNW7X=sz+JaLV;=Xe#)yY8h2?gvL0+C&$j1FE2p*2*L@%#)@LCyrwF z!bg zSI?#Vf2W-Lp=YrfzF==4@7pn0`OdldLw={}52vuXQWpT}B|AT(c&LBOU%TGEU=!fW zd0}2ElbYRkkqlv<2Us3#5a-1d=0_;}hZ#jmBiZ?;QHfBL1TQ z`zk4q=wWG7m|ms7MIW_y4V1TjsoLcop#9~9?*wHNoz%8}53CD({%7eUI|4bHhR zdpc7aLgRx0cD%6-R0m$5o}P)k??{Lq0)Q|VL`d)fhZBtz9z>J=gU86c8ziHT6=#d0=R>R^t z{*KIura+gabBx~+_R>UCBf&a+%R7>rfHv)?k7QYGlkz0nM!yU7knC2q>p!Ng9c9+{ zh(_(z&wk1L{}snR^fSjoqk7u(1U^=M8cB|%OVBBd2PLpYMI*^iG5UxWyYaV3sy{w` z`tn^MTOFp4X!9btn|$0)Xn9wRMz4{#%gkEtttpR{^Kf~qy;mH@mxP&BQM-??U(<(u zl)TtHd`RBt3#Rb4^?8s&3lO>Z4^ZQeON0679q%#}HK33YF0@|Zg46Fv7e4jwJ&)A;yE2EDc z|Dk_@&$5L49GEpgqFb@LX8RX2pwCcjTz`x~axb*!vh-0{Jc!>90om3zZ{bjN@D}tbK3`kb zF=N#o@iAm+lx=S$8|WIdMnnAwWBXZoeh<2Q2Mq60`dB;Fm)Z46`wa5+G{}H3ZS4IV z=yMf3PcRnS-?rMn4Ct_r+)=e$FxPL>G*3BIwqR(kClNMt&qil4;p~`*HtQp!)S7^x2iw z0lvSY_V_GPI_;&;XwsebvGymRkG%1e|JUGs@@3_wFnktX|B$}YX3p5Tz7L~X>|3z5 zpC7VrUVbF$m&tE*oIOUOoz?A@uGNI?rH^cqiPDp#KaF!4>XW-eAM~X6CV7%9d%w+G zndTEUClrF#K&EG4&u^2p>5G-QJeQcVdlk}fL(>IjOTmq&q-9~@M z#@U{*kS_Ljd*ZU+tVr~+WvXRZ3;NVDKiw^^Ui!4nkzV@r(x+_-wEfq7`MDjtuGrYu zvg?1svD)#2!Z7?!PrdJ@PurZ!(Pt}c{)3U9)42&G{ zeXRV*zrUNB2wndJuH)Vx|FyJHxH4WjeLM=eQN7eS@W;T8|1$Q>IH=ZeYRqS4yUdzw z=^px`iPUeQ%jZDjKA$2(mw>Tm%y8HbIzDFD6KR_pQ?T^Wn2+d_hBnRU@|jMp#|(QC zopSVHPBX2sdW~&<63}QVGkfa*r;o-qMWe!bv4y@Iv34QK9FJ&Z zFLe?eXIppn)iAIqG_`pkW5J%*3& zP{#J;L4Mb)@3nO~VQpPJ%b`R$s_ zoRIdJ1>Y0)#LLphm!E#f&$`IZX2{J*+9cM{AWNm_(~$P-nwvfZTHF!PNbMT!oAxEK zcgxyNqEk=1q!;9OR%>Qm*5o#$X`#mBtKg7r_k3gb`8l@{MHUZN8SBehCbpn4!i=iX4}ezLe(FQc_<7&FT9t|r*3Ap?MWmlnOEr}t?4uS_ZDK~ z$fuR@aV8xkIgyQ1NP}{}??MlKw`7_<=?|t24|MN0KGFGjgP;dGIK@7d)E~fmUTJPV5HoG@MNz4jz?VDbuh89RVF7h}Dh_POWw zfu2d3Rp&kiDu20pr%e_s-eu{der7%G+@8=VmRSXQY>aN=Jc85@xL2R;BT!17q}$ne zxB_2lqQ`5nzK>ZZ8_pbrz@sE`l$Y?-t7U6+_dT)V@Jln*k*)V z@Ox9jb?CpWvXW3IznF#f&gd)I2Nuvz_wDhqlAqEF|I7EI$p0#7M7|qOk~2)XvMhd& zr^RL`>c4{<$Yx$O@8{k34Lz5yOW$#(@AuN)J2P|7ogun6d2sUX2lBjc@Vt)ufra-? zL~5T0_apR9_UR8o9DJkguI$VC;zUBw7aJvxs?spk5c|Qe_fG0*&*=u*F^c zi~4Jii^Usy#u_A-GfQ30^04)wF#hoG$YT7_;6EqM`X%Gf%R7hgENIWzI%B4ZB(ho~`>mmOGoxNu>e#`u;X(Ql`os%t0qqBbJbnph`Pix~(1-}8;2VfnuC+N5O z))zznZy6q_9;hu4>}Ba?*SyHTmYZQ-hw~L&d^af$KQ0@u4gL6C?+?)Y9Du(Ce6-m3 zZ2ZMSm+?tg=R6rdh;svP}(pgC&gU(oLl!Q+Mpu7^)GZ$p550()6{sb8z-{#ig8 z>%Iv57bp(JW#hG>o@wk-Yen&0lB5nMi62@BZCx(Ds$BDJ;hc;e5B5Wsadyoi`@W$s z;QnyNC`MBr)#Wv*2h8)3=d8V?dG`|fwXOVA^S2!RwQuBf%6=dDlkDW@J@=bAa3jOg zN7C6oo$Y$T7C1YjA(Uqvas3>i6N>um4X3l1cjOcAN6>scSgRuX`|B7)`=uZp zU$J}5=WE@}>(KuZa1D8sPxUd38!5lbi~d_e|I;Y@z2r?}oyGF5XYB7cx~Mq)?OH`Q zsWx#8@BWZ)9tIkdZ)=`s0e@G$y9^qzZv%OZwaBh1FaQ3Wt?1fT{L7ZduMgBe?^g8B z8H5eQL0!N%zU-xmpV#qQb-45Fq@4VV{y&6X_mH0CW7+)r&)(x5>1?%|Ir%qh(xBCE zX>-SYhU^<(+~1>2ca(`w=}2zh23LSX05+D7NAOCd_<-UC&c0@5P>rZ=Zmt zzzyJ3=#Nj?#rVm^r=!hBXW6N>qQ6Phk;%Bja`x%=p6Jcb`n!U zY8%4+&uVmiv3F}l{{(BjCw@dfM*fdl&>zX4k@q)2xQxZ_zu=uGzy;8MXJd~X_L5)U zC3BTr@gzFV`y+9@Q$c#g@}Os`gQ`E`;alL}KxJS(PG&fEbYExs2R`kkk80H}*M$D$ zXZjnOYwUxswVlyR=YuE7`#eypyn3DiFMxB9Ul;nX>+FX=R{4X~e4J3p<+e;hCQpS2 z&k&dB*jAc_f7AQLzER#E0heJT$xfm!uy#)ELgSbC3Zfnu9w-Fuy=p;!V{3BOy34up zE@zOs-Yg)U(pGyYy{r0;zeV~64fvUC#Gj(wKTyqhK>gxvpuwTg=WeioIK|gOIv4w$ z<~`*@(0%wFtGhR6Z{iA2%ZP( zkBEo4I^ohjxhd)vea{4YyA!OlO|%Tn_7_A0*&h?=M{DhNHS4$AC;!(%x37VX7|Cb8 zRcAP*&;iJ@pMS|yxXj^u@kQl(l<%>3Wuszi8a`5wwT@P(<~ndL`$$+HmoPqp)ert( z8|jPo5A*IX2@e3H(R)$odm#Cd4!aJ#1XO=*zQv3A;2nTJeb#LH{e?CBd@mRJABMe( zK7{rO>~;Tad)e=jubk}U%3#YPy^1X1pEK@7Xsd^?N5}7X%C2Y+{q;>Ey*7x0bBX&E zVACrMoB7)n(EqFCS?3Ko&YBt@#J98CvK#Vn1o^rQ+!Mr8Xut8B^Mi8z1?)A(EypeB z>l}|PYHg`dY5QEg{4-8q{0JXM{&t}pqshxz+}{hz*?-c@(ht%Thky-V)ChQqF?NP>-}v#Iys_LB(|7E6@wy!pXhhJ@O0BwNEeV^=FUL5b~k1s@=iCv}fwK ziw~+ZmXB%fRln3dEJ~>R^IC*1=Emd+7lFPCpW#{bqk6`&*2C zo7XO=ont(P_C$Nt;>oGZi41od*dHp|cMkm}@(gR*lJO6M1r)Baw}-=Kr1x_X46 zeLS;<^Kg_k_|*Gq?EF&n*K_$66b}5d5B>#L#U5%PJ=tPkfUrG^%%-n_ri`DYH+A;< zypOXVdOL#cB4p=FvB6X)#%I`T%iKlGoKJia+2kIPfqTuu`^4RLC>c^dtofJ;uhKozL861| zxOCHO@Gt01{qiOP@nCt;U$noQ^v{O&^?=&!RL_nA!@=;!-=%}MZ= zcHY#lF9{W|>il!)H}q6`I@kaZFDP|&9{t}S-3vg1JP##b?{w^q0N}`XTVh_13~3>YHsh&G-UssI8y!BcZ$-dJ?z%5Bv2?_MiHEs$&X& z#XB?T$L|IxH@p){U7bgN+Nd<+>FE;yGME|({a1AkebgVvmHrWI`AX%l+UHsN2Xg18 zbq3X@q<;iFcmT*2lfITNQa@btZRdbESlg#Rb)X#m8#2@{`h4;9j@0i106bP*<6M_G z?X{u(lK#t){u;}bo$wgYyaxWD(_6C^rLS|q>ptB(gZ`FZmcK_lto8cHb!sPQe;#<0 zd$mor9?aqXUT8m)zl}C?kaiweeZxZiZTYLZthz9Pb7~^Y5kyk!JL6LQh%2Zgf!x<# z{?*oKY(#dQ`sQ;%Tm3HSMA-_Awc)2AhV382{=7a)n^r^n)6(6B)~=mQyZJTFCrhAT z>gn?)%oqbjEPnnu8Yhp?}Kx4=r(ca1Qx>0jM1i z50rQ5rMtm#H-4y9HXE1nrTfRD|-OJIy$icwptJSg10-0saUM0mCRG zbyYm5G5swctzD|~fV9r7f%)kM=BE?M$)tNdcn7Ghvibd(`P5MFARAnEpKS8dc3-W^XX)Pv{TrdbLp_-I z8MX^Pf#T_-z>VbNBVg&D;$A%XN5F&pdeD97j}F1Mo=JJ?v2zn?)`V764^-b}d$(=( z)r$T$9_t%JbOtIF4V~4uo5=rl(B5DFW9%)J zDZLiZ{D<`FQ$XWxR<~N&3WusEVY`p{Jgu3dpBV>sJ)NarM?*`0(O$NFTsEnAVD^xn zOkQpW8cVc!wDsUlo*fO{w*|c4E%Z;0{&U) zfpIpCbsGPD*qpif3R|ASP0Bx-q`&J? z4~!2!=JC>JaeohxT-ba*N8XM!XF)dNL#-och!x9I``X_k^bh1oW1JdiHa_9JSH+;Y@9&I5PB&}k#(#ky$4;WZr9n<_N_Pr&{&*(&c^F7PYOLaZ=s(Sw!Z`K5 z^ZR7aGP3b>G^`c!}9z4=R#NY_n~i_JdmutO`C%MwUz`J#(ZjDXSBwt zX$yo}Ut#*|zTS-Is13tMMY@Un+yR~j*JCSzIQoCym9AHS5jvo1THlM7W3>cNT7{ucnfNPRYQ z%katCv$e`kt>|z2o7w(8b=B|h)3$jR0CbUA^YlKU@LmA>yBWRpDp23&V0f?@SQRi2 zSi|y1W^AW3_SzP+r>G#Nh~Pn#(oe04r+qv1ilnPXia8V?7|1s4T>W6m_5 z-VnO41qO5({ViRs9xWBx_i7c^n*KIlwjN9l_)t%u(~hyV8Pdj?eo-LzT_yiE-=*ko zpWF9p7537L1z%a`Z9^zWtr@})Y*mB=JRY$Gv_) z^QM6LYpvl3qa%4=5x&jQe--E@eX>0?)_mxM64;Y>*k^5gi47#om;W&R^|!dU2G}lu z&ZpJ091m6m8g`@%Ir{tZYG@`JwE;`>aA@-o;X7f^Or0}6&7MMYZpBf=$Cz@krcCRZ z!gWCRE9+Hj`dj(;*9D`WQu{*pTLJrWQpbb*^-PuzD=YnLU2a<^V(1;$)B3$rq5bPX z^Vzf=W?f&vgEad*8Kc%2ft|J9q}Ju@?(v!RP3ZRod*c%x^C;f0p?fn}3bek-uIs~3 zN@@*5d-1H7{b^*$3=liW-H+VD0<|8=2%17MGU=|{{V^w;(Ie(&T5 z;AiOn2D9F0>^#n9!cV%^x@o;nwSHV`llz_@OOF0p$DuvAc0E(!y1seTftTQc_Cb$l zz13i6EPiAx-EG+ODblqi$kE@fr?KmzXBMdkOX0z@;B zh|ZdK?OLjIU228&&#mjT`vdNU57I@pJ^ljvKL*Y>Jcv*a#=`^CkC0uewz(75eRLf~ zYLk-H2iZ_M+OCmhZ%Lv3SjdOm{(xfjU=j3x6r2hV@XM20%bE5TYckm%Y1cK@rW8Fl zmMq#1J)*)&wdl09_?7+%) zh3T)cf(h&qir}{^x@ZG*&TuEXfW6=FK(yE2ExjzA3hCdFVJ#ecmE!3L^gSQCKLWl4 zwmqP)?EMKaX2*D}oxic;8aCb)J+$qfd_rlA&RyIu@Q=0yw2pxT!Pmib{?2%`#uC`C zTsUrO>16p}_l>)(F?Q3e2TfnhHyR(Z^w)k3_AY4;lg>+E9eWI(>pStbtJlNX{C9O2 zroZuxC*O3&KOnln`yG&PpNF6cb7A--a^?4yJ>#Okp_6C@>{UqrDEr0a-%Dqd`~Kvt zUkr^CY46@s#QzfzXJ5?PCeD?S{tcWBu`BJLnd{Y=2#lw>-t$2FB|M<91oTDfyFl|c z>jCDx#0Tn)`m$lar1D!~d{^){Q&-G+IX{61h5qt1UaI|(+LN`1*{hgf&!W+9#9{3L z%ik3(wDRwt-!cH2F^84we*I1R9Wp$z>sPN#QD`^(e5F!dAe zL-!ny-q{%*Fs2RdrHfV;`j2D%d!&_l#`IRu;%h+T$&Z1;{mS!r_9)Q&@l-Gpy|KD8 zR{LP6KW5J@ZHe`(WBuhFl;Sg6$ zeq18h;%;UzwAmQMz-d6V(!M%NrzPCWj(HLM8JvXfkYCcl&R0IJW9}Wf#Xhq1xBl`J zza##nwqvYFd$%>mAMPJZ&oNFE_{)=@({b{bM_j^+dgasKuk%J<2YY2jU*Esun}m{m zwVUFF2eh~APU!!AY$F%iZ-rl@;^*7s{N)XU{s)5J^X+V4`I>?D@|Q~Le;HziRWhUEijzle*3Ya(!WrqYmu&a zk234FnxRXM5B@m6=yoe}VP_CF@b}H(g@3-y1^YrnwZkBhT!nYG=I^w%#t(d${<^pQ zf0ylur z`8J{R0A2j)yY%bg%*o{U$1ERgzkoJgdvoQx1bb*@p}*ya^&_J8R6a5HZq`}rw9oQ6 zV8#so2>l)hqPb{q>8Eyqx?s+?!A@nbV_a>62OVj9<6Z*&emddb`7Pfs_PfH+w}*@m zZ_cliExIyYmj0rBg7Ihhg+1s6^{G~YcAEfb%6y8y=126F?zS{ky^ziH2Ec~J??&9a zhWpFFwLp9m?ZbSt-`Y_2(97VLU|Z5%nW&#Dt8Je(KCkg%(>|C!)e!E-0O@hsUZZ!4 z(G-2+%?Ikcy$ap|VZCMPT^KHb?&1OVRk{%!G$fa)mFTV%{as@p;Tx9y+zIM}&g$^b zSb2{y1;X@H-H@!SZPl1hxUPiXD|SzNlEwzkL{}oJmoBQckLqR1fMegUbEeYws;3X; z_Z4m=R2y8_E)=6}CC}c5{=Wk!m(J8m^cPEiv;GR(e0Oxxe$3<6Yu$NjQy|;(3~(zb zY!@n_ci}t#BOc8q-?$P{xqMOWzV|7#%^Kse<7{!}2mE&7I6}3#kAT;K+GCBi71Fod z?*)AG7I?0FrdFaiO4DEc<~70Q=#0^{o%qK$^I!My>c<1%^4N4`8DRy3^ewpzCt0rOaCsJc<&#eV_=(Nr|VwlZSDIW zyEM)H@jls8bOd{^vJ|lPs(cuk{zAZyZ+%c_ zeB0HVv7ZB==S=WtpmFF|!23XL1bqc#tBU5bRn@0>4*aKV+PyCz@6cVa^tbwGH=fB( zYQR5`{6VWexcJhIrw`%&Y;YZYG};K}JmVf?51#B-wY&e~{-@wOz2t2N1#CN=^$%qF z&iGfuUz6GgH?sjWo&dfMjeiI(0*q0x_tn=^8pp%mE@z+iUe!~e6#Z@c5L+?;IJ#t%Vi^i7qn{Yp&$ivF8({=(x|z#df#)EXAyOwk z=%s%r61Q`sZVg?|Kz^`|<}}BdnRoAu$UV=y=L6oKq4)Jc_8!mr+;j0f?|xwDdHBB0 ze_n?{;e_vc|K6@JK_5}^L&JP9=>*UN5S)=_jRqU+2`Ch z^SXUMe2)=7!#*##-@wn?h*q9w@5y3Nb`xapNi4WG3Fq#c?Q;qczE6gphwqn$o`>&S zn?{JvGen5I`)2d}H1j-s@5=)(`xoDKC}mD=E}cET7txq+*Wk&*m(3oP{^hd z_syZ_;d_%<@NM|s$a3&J?_M9<=iz(Eo_!v^*T?q#yn9m1J`dmXQucY?eQWF1q(O90 zNB>6Zj;qdDd$42R|L*;NrKf<_>zO?gVOuVIZ^vqQW^Fq&&x?&$>3QbemB@MaYpBe2 zUqL0IS#uDgg{6tYVwbh)!u|djcC}qQR!N$9@1PLuIqijEvGfa{_42=F;k0^qeywSUa9r%y}~lID=wI zuHKmWUFpxXKc1=eCt*F;T_qyN|2oRY*pkP1tH+u<%If=3lW+D?ke@ZiqLQ37*TR~D zmH~u)vTb51{jafJi|x4|&078_=R(I)gM)NSrC0b|>4T&|ev_;}PO={?)E-nq_wfrj zN4-VgZ%f%HfkVLza0ECU-X91ibI(~s$x)ouxE^PuvbRrTK|!0@^ZDP8vaAI*1NcGW z3`duBIxc6l`_MYTF!Wq|u*Sgu?cw=I=)&19Mh4opi?p`i!r^`w@qa02iljyo=Uzd2 z+G7_^uZ?@go0ShYxdo66XDg22g zs5c4e!puNt-`D-K#0?#gMWY)O2B<_PyXu{sowq79*bW>7MC(hzjo_95e<8H^Kkoku zZldg$`t(2sqzBX%m_0p|RiVAYb<)`R^r>Q;3FT%~hp6}I3DELb@S7mLzlGAX>Dthy zukb2x0et5ian^~uN%rrOu7yp%tx$W2+|)JTZg{LUpPIw{3}`Qz<`tP=H0wY$@2j

a1nOdZggY0l=+y6Z__FsE%%5guKz(J&MySth>D1L>j{oeF z_t-!0H9^nYD3^G<09ZO$8YmP^T0s)L#``w`wFR`pvd046E42Psj1L54UtwfHowFC~ zD_pY%a#!Lw23!Hed(}A`e>lzXz4)NtbHNkDa~XV}0d@y#0c0;gCG^z!-~L)Nts7H$ zRkli?e0~mI0RIGkgl;pzQSg2e{N5SE89<^8Xz8cPC|dD=1rA{FnSwW>4*~YzEorCHRlbiyyuoz-NT)ZG3gay`K}u zgFx$+rCTeZzjXAQ;2!{+Ek(M?^^q^h6?>kltpEQ04)L*C{x3@#*R&0^Bi?=BQrd-M zK#aIq-|FFekTC|0AJjAEVAh*aSG1l$_OSXy>KAwAxIw=Dcd7qp!^1n^zvx?T--~qc zo4hZ(tOWn5^YTeB;d95CqVmn{M?D<@kEZj@PoT*i#L*0_&R>?M`8r7Nsjl4%egO^! zTcBV25c;&Nmj4NCyhL^_pJbq19?Jb)x=Hql+OwO%dEi@=mGzvAF(ep2s9(T3Pv~LB z4^~wEQ!b6I8~)=TVXya)`FZjeLpyEOj;a2>4OE}Y(bWE3GWjx4o55PZ^bTN6C$=Eh z=2XxBXW+l$l%2mA*tFUcN`I+dNSDn6l5NSspW*dc@c#hXgI&Rf+|%!6>_hc_g{=SR z;V68GV*5rH^~W#S5bVJ%;lK3$)zCzBM6{}e&U#P0QQcQR?IdjM?V%e!w_5wNZXJ74 zb4Ws!`agmGN~G>0&gX#I@=Eek={vG3)Q5Z?Fos~(OCC=+h2J}Z4aqaU9g%}Z`or2s zs(wM?oJu8jOnctxO#NRE?-TI8fxd7w#rR&!)?i=w^Ha+IFlAo^Dy5@%{|>kZNbgU9 zZtFTfxy*5<(zdAGw5XO2@#K%m&o6;&c=4*zJXP|Z^nrBN93WlrEVvUeZjky8V2m|A z0$X69GoAJSk^#ei^%c}l2vBXADt*7x_>b<_*lr`dIe@d*WBB}yd6UumzW}t|p6b4I zWF<7zJL;o}_v&Zw2evWwW-|0@q|Ru()uPg}+xOg-gOEwp$!myTGFEAxioGX(7lXBL zq{k#^q1^X(8mK2iM{MT!;?el4 z*bn|+2-KHXUqHN7`o(zM(Pt{R`nrz;ovVH>I2yRoY@Y2W&ftGri`x<+I~eP^i_NO3Vit+_#Qmp)oH-j(G=!fCMBsOwD&?s_}{R2 zbNsF0kDNYC+{&tWn`Ei5ocgWzJ_qkWlc#{jyU&9EQ_%UE zV`Q&9{#>p8w{>4(Ew9d~|CaypbYIHHoIvV0a2Dekt1OJ zH{!RYhiD>NT3w>{?oaUlWS}vlP5C{@Ip}@HQ&OxiXsPQ)_1}*FYMp@Uzs`4B52!t* zz4oN{WxL7VYm1iQze!I%2W|ogBsR<>5xQbAkf)7)VcI2qSFIUcY+i1WqNMmNy+9Vgq@TZi$EuYh{^e+=*Z65PT!=r!}LbYh`C zknKP}QF|)QdX%s7drvTe`n85LenCISIfXr$$iIAN#<8=qc0!eHLC5v~Z1Q+J{5h9U z`J@h|#sbx&Yxpf2S9Mu!Wg-2F{Z{+%HuxJj155^+I9JfWGj@gAKs(nObg%7^M?sl4lN=n3^{lN#61_y)R~JgVNyk2!sugO-qQ_$^=b%a8x) zGLJlZe;|K9gy%D$A$7sb<*N>>4vDAX@|C(z@%?AuKfM1_^k^e?&t~XR)+R89WY>*Y z-YcxdCHt{a@H$pdW!#ZKzm@uj5Iehg|tQy z|2pt~6{i8)aMHp$=YWs={HqM%`PXvv=~(?&KB?QD>VW2P{s`}A2h(alCD$7NF2!s6 zT;-I!F909#{gdEo;y4_>Z^oG3AZHBgY0Ovx?XegQlJ z?g!$%>W$>XmZMatvdV^j1N;m6Ukr|h|GPOZKJ*TIjqzRP&NWA3(OLXAKGL9L13J7R zIf5|(7nztzzSM?=d1A{V{$r!2;a~ay+K_F*8ip6@uW5a7mj8@VHloAivp>3&InWI2 z6w=ID<3B!@p2Rn-Uy`2p)b7jvQQS5ir7am~<{k76eQDSGF8m%(-(WZx?0oCR72bzzHfnnHZeQ8I?FFe=$ruye)G?2KzF z`q{!EjUB)w{Fx_G^kY&#A)ohwX3zp``6LUUfXCp;72rsCunqRvD$e%rsE%PJ$HinCB-N1gB z1iDDJNFx19^7{Y~zb*e&Cl|xFkHI70T=?%|19J8gYyP5~50o9FE8u?=-tPz|q>&NE zNn>gDpk&}(W+UoAgm}*YvZ-DL(x2 z&r89PU{`p*7SH-q_P+4E&e=4eS69`4>vuW!5%>C;PQ2`<%@W45kbymC#nzEh<&&_wytEr?}JJP7+Wx7$!`&= zJqWiyx_<-QMA|<9E@13QHfMnDS^w3RGG>53Y#0BhZfXPgkNu)NLmTmY4-nS-<;u~~ zzZc`bbWgn*7t(pPJCi@gb-f!1X|s%-W9y{!f$FHnbkN7CuY>KuKxBY26~OXdVFccr zegf}k?Z?+2=6!5Kf6w6_golzgV=JaTP(M(1mDNA8y`Khu!2b9S7z5S@&@wEJKqUt^jJfaQhwqB{Cda2}Wf zhM6{C=TC!vKp+R1HbA&s#qO66|Ed4!zXNEQnNGMZ<&gfTzM%gj=zrN@;regsq_DHEF#mIF zO8de0O#yuMptqURP+!OLKf}HB^XuR?a4Pja3b5@x`je6&jRSyk{I_*iI=mj6AdzNn zGA()fKDZpHO;B4TnLsD$Z<$^2IZwO67^daD!gAO0;s2N9`x){r**%~8W5HCgExKTc zbH?e|UiA4iwka7Xl!J0*>geC|_#f!em~1r0A>H&y@;MC|fDazFnWuh?+F{uN3Z)ZX z0XM>X`h=e5L^fg^fOfsY`k&=L?>A)nasJQh&`JFR*3CjESL48`C}~jN8FPxKX+JYV z1K#)T0sL3HIS)vOAqQq`Q|;!V(05DtJR~&YXJ*^c&fTRAILtoy0NWL-$@Q;feYaO zKJW!Zu(cbC08t1D&Or@FoC_*IWrC!z#Nir)1%O z;A#GL4frVO{J<~qKj6K>@D=92)dh|4cO3nR3HV45_SBwp#Um^?{!8ac z|EW*>Hc(x79;gkR11vq-3T+(Cynin=`4u=C8Q2Z}4{;7){8xLY?AWiuuDophA5FTG zkwf{aXkaeBF}WUN#5*Gc--MU6W1hw{B=_RI$|Oi8p5kwp!+*xKlkAblH)}Lghb#pB zzCZ@TWeW2@SO0mRHY5t)g$Va!f^W^*pyg8k)!s?hsl9s$+(ub%0(Wx%GEm)ai}&_# zibwB$2=BEP?ke=a;pl+P(Eo$bxt%-z6Q+IPz2(1jY9n=4;X!ljoUhJfjF!O|)fH*^vRp>14CJtPyhY z(;Q1NPDee?mMJ6);WAaid%e@%t7H6EIinW`5tkCwQEuT6o z4D-JcU8FrHQ_uyI-@~`V9M%o7hCJ>aOkUCRX8p=Xgke3P`**=T;9_`vIFJmi3;&sC zU|c}@EX@1v&;K-KvFkriA^#H?>tHSQ(*BHFu>Lb01>fbJ>j1W}(Sw!r3-pfc=V!px z;3(qWmAKb)qF#SPtHN=V&f>d`w;2ETp$*s*OnsAig5;Xm;k$#Qfn-4Xei5)TF1eR( zlWuqnNCu<_v@eErt;_@Uy!vnX{}=e9_20}tu>SiXXfhGMP6@^(5{&Ok1`=kSlW3y4 zZD~>}6s;7u=2;#i&db0zfc6bTXX=TmE1|J8%crgg?OC4+ZT~DzUp2mDW9-9mJUfPb zYo6dWpgw`h5-zJ`;2!v`w%`!3BW0po$^M{Eo(|~j@^oDPtNx4sr-1}mpRz$0kU*xj zo-&bU9Svq3 zcJ>wKzgaUT-Ax}QzI3oJ1L+CmS?v}!v6(9>lzHg^wFR@lufU;{OERz?7zij+fX*&U z=kj0U*R+ip>?7I&e+}#1getrGdtv)1TtCA1(xCyZyo=~>9|Zq*!0uiL{xiS2ocW)t z|LAY@p3wu0)%xpvzfUMVp#HIVZp$UPSJ^d2@&Gs!em8*4z-n3EcmMW3L*AFI|F(a& zFZ39BH+C{@f%dt_jeo^U2_NG3dqCrcmL{b_(MtOBW4^lw{{IyI9|)Ke;cTb|^o-W+ zb!Ghz*GY{BWD(32#F_6g{$7~d_V)wbO85qt2Sl@QSv5v@Hsw+ulD;HmGCGAaDeUa4 zGwQ$PzikIhzb!e4a_$7Mk2DryY@kBD7^X|%eTr}1;@dmGIkc0kpI*Fyv*!nWozs!C z7`C{P0j;%Cdk~6hib&!=1g6<3TF=XV_XsYIe?A7v%=2gzx06WrKy{&rP4b7=u+0WF^_5H(7gu;)eaQ1 zkqh~6e@hNt#}>SlJrL9JD>DkL=|r&yH7;`i3+!#(SJ+ionE!VCUgfW6KHHzapHA3B z-qBx14`@sfS!Vr4!rLGIuj?F#Ps9TmTMn;9?Ckt^Hvh*^FNGb!B<69pH}hv3!}n?6 zCxAL(_FJoNTOOAS=ORN7AOjb$7v>PKJ^WvTF~YvAy=IIkSaYqgtFB`F*O?;q>?=#8 zY17l20$&Ca=^H8QgWzF+J;ZovLvmGT0(E5^Yfo1s{@Z!moyC9F^hypA@{7uzR)2qm z<_rD-SQBLQVkLco7Wn@@cnDlb+cJeZzcGIN2eIxpwC1)8>wj3zZ2ivg@V&=TEezcB1M7;Z%4ujrGxu#s}IYcz-^)2fPdo z)E;Q;Ph%tsi{T^q{w{b1$fw8=$N;{;So<8K|C}pRXH&0u{P}#B9UwiRv5>WZ){~FJ zR-6tF08!?+HeyZ~e+ke=SP}Ujoljjh&iah5q7D<}^0|n*i2{ zXYh@Nd|3Z=DCt{aqoxl78jBo7+*aJknXi+}a+P#s}mGb{x zd;hOCr(v14_Duur!9MJ@o5p^r#unC8C7BPyZ?=C1fn?#p5;%zGU-jR^7hF6&6`n`H zR)Fy{^~D3&^p{r{=D+n-B!6Xxyyc&JvM2WNUhrP~9W1&sugi`9)PY9$e>nXe$-u-G z>?57s!Fp-e+XA4=O{n`~2>zbh9R6<#zc&JF0_IS<5&tbOtsPWJXus)-u&ekVE=yP! z_~*>CrcS=xnEP@yPGt5?^{XJ%m=a@cX@LC{rwtABUiaPQs)Xoj(gEfAy{QVgkzbkgxwe6LJ#lG)-Ryzvh z^B*6!-nsDb-|+waGQ78P!8#n)aJl%zaXH_xm;bfnO;^N}@F7S8od*0XHzXO2g?^)YYg#Y1v>`GJb zjMaP%J~rd*?KS=%Sr=&L0GZPyAt=t6sACq|M;gj>*q#6`#qq$3vVX_)~Ok= zURQpvve0wZUGSdv=K6E=>kHhe&kq?w8 zGIkoc1f0Zgd>E%TMmARE?~;LhJkY)6ftMy^e{77l-c3coO!)p3P+#Lk@CTmZ&)(>P4G9Oa zmb;HLo%NC0Pa|aa`E|iw|K&`!6(;#`pDs=x!QTsf82r{Am{)=Nn392K!1Vy%&_)K3 z6ZTK-{8+$$?1oOK3T z)L&$eTrdB7Apg<*c7IbMg@3RV=UU?TB4K=*&klHR#}vQh_oMLrH{dARik;y3>dp@L z*EwIg8UC|&+{l1J>4PrVC)e{R-o0|18s1a;r)02@}2o!(cvm;(9yXPnpg#i%Eg4R8Zc|4(~;tsT$`@1+M`XFN&s zi)SJSlL2~QL4Ri|{egP+%1ak$pTFgOZ(GpCjIA)aeE!QP0)D|bE6>*hClX!-@1Fo) z0BZ+mj%hwJ&5QM>55D71q=*ivFiX9!bs+`v`Hv02KG+2Pdfz`F z{({pd!s~0n^FT77c}KMc(gRDu2Y~S*{H@2BpNJ(l|FR3dg!kA3_)>Gd z6VL%WqyN{Y9T;fl3QWI1{@;)Vi{)746*lQ&ZLWDH+A}6w3}Ipvmj%gy^nlue@51Zr zz;i&p<8$lKT>R&`oHOEbzP#TSjAcxD7-vLqP7>!QHgLxBX!vgtPPg~IHWcU#{>wj( z-xkPUu=N>z4ZMFmkO8X))Fyle|DOdn0onrmZbw>IbtZj+|F`FIel+AyqxY%}1#~{C zMT~nv{+y!t-2k;e=9*Lhp=9QMf3Gc9ruVn=p+J)bt1=13FjTKL#bHUzV6d0W4x#hjW-m7C2uzXi&>whEnkrvJ|YT;ZueDOvXjil~xPTl8> zx&=d#1=bT)UH@sr=@&L21JVQW|7Y(#z^Y2JcHwhCkeq`A38Ews38Ip75|ErkvVfvQ z$vFs!WI-fImM99S=gMeftN=9-z=hnt%+Ue<@?)m4x^UZxed7hWOYwtQc)Vpfc zs#R-O9f*MX>;#Ylxa|Re#t2XNhvHGkz*r)PMFern;(Ip%C;-4X(JwfWfq(Dq|M&j- z#Ew2*hYT8j2YoCtpzFoJ+DBqLgrI)Y16%=+0JsTcLj^zv>_f4jAQl+-dBmVOFv0JB zFOKM>WPfZ2PUdbC1#%z;^ne(c-$@Kw@GWy!(Ii_V@V*+;4-}j2*C+8JN3IY}Xc)c`yKo-Pn5p z@C3jJlszxNSs*iD&bxns|C2fOr9k^FdIoWx z{uBKVZI9b=kRMtXL3|Iyr0@9wlz?lD1N`b2_}(X&0LLo8eZ#<36W9)nFbOc|{P>%p^T0mGgK>XF zfyn_*Ag-Y`{eHWypFC(EAl%%9!x%umo14Hl0OG+Uj@JhL0Imhy6S~Jqp8&ciG;Yua z>U$CZ6i?0#ILCp(2w^bJSm~8OGv}}MA6mx&`1*h?CUywE3p&6DWlReo z2mt0^KIXO-Y#}@Bq%J~R$VP+sfp~)Ayg|L(_W|`^5!8PMQ2%j2{XYe}@dx!EnjaK` z3h*V0fOrqpHE5o6df*$l4G;^i)c`OD@T1;=+MhYVdouu7Cj_iDA+k$#ygq=?f5G|y z|1U|>-}4VR0Cn)Ve+Kvx2jAz2gIGRs(9aV;{*D8x-;fLd{d?RVK>Ghg79crT1sDW) z4|wqgGN25&0pAV+9|AP@uOyfQSZWIeoCo>+kV@Y?mMN z56J)q03`r7umx2CoB@&nz_`ucA~^nIy@Ysy>;%Yf583JQfCnf)w5H!Rz&{mC3XC88 z9{c5EMPPh<^h3m|+0=mggXw!+?B(6#_MJzl33 zdTs!ye*ydgKmY!?1b&bIU+X`pLq|}10IkUj);Zb+;O#UC7Ij%du)PD&`KZCO5 z17#`u6%8h}4q|(^fiBoJ0c9NxPzE@F`Uj94{Ma5qab0`h7-%c@DghvVtU+21fCKD< z@t++cm?W_I6-Pij1M2^;z5r;wY)X(81bJNm8UY}#Pk2AsLONg*;Fo*sdw_j@&>tiQ z+@pgnXls7*{|7Ap@!`MYAF4-y8&SZ&+DAA{dKHY@Y?Fawmq1y|1K5N841f->zW@N~ zf#322>gaK-$9u4i1h579!CG0s$0)f)29x@R29Ev0Kh$pTfIjFhGk^-n2l<4dYyTeq z(0w4C1L>b(fE1wf^#SKVzK%%27RbO){{NWhzi{ScEo3R+ABF)LkopD(K6?-YfCTF> z9fI+neIdXRBm?Q7{DDny?4N=90|x+*EI@S>0>lv{2fy?Y_PjtH*8+gr1mJH1V@cxs zcmUA+BIg13vS9m*Y=M}tzqkKRC{`~;wKyD7105E^@{}(v^XIW18hqlLd zI`HL6uYtAz_=*L9-}Tt{zb6X#gZhY&59lpG7r;EgZ|f}79()Dp1t9K|ZN^ANvVV+#MePwC?M#wgPBt_s;=H1AzJrzVkoU$H%%GvJ0R#;YV3G;ST7C zy)}SY07%b6v0(iGzqKV!^8e8mk}YU#3hH-&Z%M!$1L9!4I0?{B{rvm)OW>dK583XJ zegJ-dap1cXKkm1IKL4>UhzDt?E`I@lWZ?JsgSdlydO!~LmjG4({=P5q`@j3~S||De z(iKqq1C0+!0y~iP-+%d^SNL1JJtPOeU;lw!2(8lu+5<@tpCh$P4Ypjs&!-EHMF9XE z55;mF>wbuDh&zZg2v8c*4Ui6pYz7D?d4A;hukMe6x}N}W7s!ChPxk&VmcXz2AJ_(v z9sunv8;}w0WmK3f_>K>f0r7o3fX4ukJ=X*P$pO@^Lwx^LPXCpBbKttbo;Y{{;Pij- z?SEeSNB&R7@}V`Zkq*$f4m#i;*oOOz03ra!06_rx0G|Lh0R9zT|7u>S{b&Jr1(5iY zr2jw({C3ShIjElqe7hRpdmYI=IN$*f0P-2B19$@D0zkGNu=|eN`%SQg+U|cx@1MvA zBv&H<%>Xt3fw%v8i{IxT_zZq&6Ta&SBESbE12+K70RjP10ZIYDSi611V|oE@V%b@>Q8|D2apZ846yh= z`T9Ta{Ywe_=s$$MH4uXM2UYV#CkTM_ommu^{1!Hl0T5>b%@w|X8^9Uh8Nh3R8h{Rf zAppp>`w9U0456__NG>3sA=F+#Z3oo1fby6A>L@1Iph}Vbb7R z5Q)7rfIB9Dt3XD8ANN2T?ArlAIw2FF6pR-Ddl4El*aQBaJ*cijIs)=7H2@@mV_pEZ z{{?UV^AY~21b*9ZkO4jesa-Hv1c(h2-v{4#9)UOm@QshyAvKVJ>)_ZgaPLob2T3sIEO-1}8al8M zDFC;Z0Ym}6N&tEQ_W>LLTmhWGIV%7iun*>++_?b8tEv7A-ty-o{80(~8UIqikErn( zvK66keK7&I1OQ}!Un&4v00sciPC)So&~_ih67AD~eGsR(1HKL1#{8pO|2+O*S^_`X z3Xq)$*^5xD!QaKDLw?2I1Juui0M4C!U+`c0nm-@w4@%%C|9?<0|4R=4Rv2J?iD0Otc71hT?GJYKYoILnuh-- z|DUD74Su;E{_*wyA&vi=^M96xdH!-e&+pg!(=`6~{NO>qv;5mM{QG%OGT+btaoX!R z!>{N6r8Fq$zsnEOfOPQp>-GLD4Lzv!5BdK}8t+Ur@SBpQP77wSgq(FBl%ETAnAT!Q1`Q^!EaSMCtqAUr2+? z|M~zR|NkFp*bnzVzTh9Fe^E4l%l{AQUmob>_a`;{57Ut10Dpfw|EKBiH~2OGZ`0o| z@ay?MO&?$2hx~t*KEB`&`TrpeUEs&_f0l;I@W=drng*Ezm2OJoVo_p&Tj9#eNPu`y zIM{{5Fwnu~wr!Rvl(MqDsRr*%b&P|-bPr`EMAe*zmMfiuO%5CecC=krAKq-&72K)Z z8QnPbHq6rx;-Ys8|Ng&>Lp}wRH6tl0x!HI2&6+f zr9_8CGiDqdV(~y2f6&UKYG+$b_u;45?XioVx#L6C<3jd1W#wf#ugc6l(?{p}zUFW* zAL&%{xD7ap2H>6LvzzZq5eGYO2&YrWMFQ|NDfR=65ozcoI^HO8qL;P_JmQ5q0+9vc&&U;t?#B;|=|*We=wqR$oJWk9G02v%+Y(=gvL$$_oDwA^uc{cXp1!Dj>!@ z_h}lsdB|QPxLgH}UL#CK>oE0-Yo7o3Yi?%l!COA~!V-2O%4Q_2nJHeAh~-{Knec zuVGAT$NLGRN!7sfPcNYc#Befu=Wv5xR9MPv!Wz*=4i0LHBVSz!^5mhuSi_b7h{9*{ z%p;v^r%DC6?FWyT>Km$YANU!QbE6O^FF~a+hoRj3>I{V%%2C7-Io(IGMn|Q)jmc!u zB>i4gH7+H(^prl5ZD-nCFx-hyMXV3J>5De39*x_F8Pah`@uLD7e2KMPyIu}2a7I-U zY#7@h>K*Rhnl&r!j3|Am1Dd~%_ z6Sda`(cs>lT}6U#Ri0R-ipb(+t^)nfFdmAR&( zQ6|d$9K{HY>-`0OB{%sy9LYUJMk;%`k}hvPn5~NRi7ReWuBxG{Xgsxn$C@$)x0_#k zOOQ_udtxwCk-HQ*dgvwQhk|KSdDZfW&l-CM&pQ4thQQ}Jbc2ZcbS8G&N#;c>8f=af z`a&{Kd~TS@^%sPLoN)fz!tzzFh$)l^7Fr^=XJ_mkj)>GjB?Nj086K(OXB=KEjOKB9WR0jEK_UPTJ<+wt%wW5fCE zoNSoaVjU-@^zS}3530|tyktAcXwF|zp>=kg*gf&Jup;$3Gan>xB9tgH7;y6f{{$Pj z=eM0&{li5Pl1+6j9R5ST*^cqrF9-ZJqt>p(2MKl&owj?ul!ykmS)eM2L$Tok{p5an ze$(bSRc)5sY_qEu4cD=+eIi37SdXYr3R%-~qZH?lde(H8cwCM2)Zj!4%(q$icEIdP zxMGGgsNyW??sdL4j<-Z5o+shye{s3vcCttdCzgfkz<|u>E!}b48o>z~Q&>OeK=rka z8|RVV+Rz$;IR{^zQ`39zVd zFh2a`I-Ul%6!+CO9mf9oft12`ne}I_y0;o%MAf=d^hcK;j8R`C6yQ*rkamuD~_qFHo-^Hn%sXAfGv@x1EG z)haAY_jG5G+BcWI`kd#7HMzRUG{=Zt9V4e`qCZ!YBdkJXh7*`3_R6LXBRTHF@bXQQ zSs=N1MyKxjY4pH;YRN2qZO()6D9q!`S6Vt}SwfdhSEHaoM~}{>Ony&u9LoS?wLB+c zBl&$HT$kvr>jSwvQ6%-j9&r^L!3c{X&gzZrfyZZE zty+g)M5uD`{Aea8QPv1|As_*>_mn&Om#e;ILQ)jJXc*iv1LPt`b zXMa{8O-)q{d@w!o)S~qa2eG{zuKu1yK0-(vq5REH_et&@(I`^oe$HaVYilRB>YKNB z?}d2`WgKMG@WO~El;r8`_^HLc?|~NOHpQI_chq~+F2_YwAAOvT^NZF^zno9Px3L1- zQ657d`|#AQI50@qqHjIdBW{A<(rCvf>|@*VV$A~-Yy3gN$kW2ffEsq<*_>}KSg$g= z8?zT=R=4!Cy~V=III!}bv=|2VWE#=c!ic=_X5Q2c53a0Ic;u}geA)3&ARfQEkzJHc zACoY)Q5Nh~j?9J+qF?1i=d)X%7VIf` zCzZSEirN`eMMXYjU1rg`*LnB;W+i*u&C^349FS&OLeNva!SlJH7*^6tWuaM0Z%vGe zDHL+(o{I3uX`Q-Mc6sxygy!%kC#sCIHtPpR4-a-H``c4nJY)A)2@GlF5Ek%wqaDyn zOyV{K6Q3>8nOo;iX(BH**)RP3)$D7pDlCw1cW9_=cB>9UPf-iSp~v z43MsK!b00LN6C%c9g}&78oQz6UhR^*h$M8&b59wxB{S#>!{@p*sa`~I?aeAX_i72J zf9o*a>3yk3IehTt+icwX4;iI-vuL|Mjy>J11q@bVx$GtMG0(O=v|swSM0%9hmmz7Q zPhVFvxvriO)DT~1x?qi~6ew#WiV;JKXzmP1LQAZ|cJ!oduZpOM&M+GIInM5WHEFcl+<9e-)e zmJ2Z)17GW&P(@BaRWG~yL7+LhXrhk?6Gf4AT&@s%E4=su*TIYOq@48(ex%LXoy5y) zzSc|d14_^Bm9jpJUG~-W>grDW35Rfka(atsdI{20O;OUZ4VqfUR#orJ7{WnRe@aFa z*)@Bhj3;{x^ssd)Xw#CV^6d7J-zqM!U_2XoA7{-(&6ziJY(4wjudKE~?PBzZ&Gs(&>d;Fl<4D8gBa(sx*ZR@uhu|hDu^Z zxX7jZlMDwk^mlkkh@QH$vOR7e(!qU1V>P`#ilniY3uXLlI%Q7(cB{f+wMEcz&oNMe zyW@qcKZTD%p|t`2b)`uq!-|T|J8!8IwZw1fGhZyUH9B{7NOeBwl81g&h>erz%kg9; zgg;`8w5aY4GMJ!9CK+K~PW>5}!_QH%@^QwuS3k@l$+fbY%~PJU1hMA&XY((fau*7m zsdTN;1^?{`nq*~p!k$;&tde#e*fHkkt$0}!X0271Pb76eUOw~w_RH6Vl~}4KL&S{> zqfWIVZP(Ma_xe-aM4g;%Z`?j)85j?Veuu#GDu{7k0GjI~8vIP%lu{K7+0+#s$E6syFNbi zlh-Dcn;(UbY3zn;Ew1REOBi_OT$!=bQssPkq0&!03iXjip&x=|P$W(Zna$dHzQ0qI zzFj5QSU*sSoToL@d)3JDRzY)fZC#ZCQ;pX93%y5gF>BOj=0v8xjGt$BQ&d}d;!LYx z`*s7g8rR7xbQz^{f*(}KRB2r$b|gO)UAKn2I2=%XO6bv9#{ykpg>SqOjTH7Qk(bk( z_d`oVzTr%A((AmT?>_zD@tXXz1Ok4=^X8!_h7;kbv9)WiOIx9A88|IN^5WOTo+P&) z^)4f5b}}uIjP%l?Z0a;mI0P`918LQFrvg);GJf7TQsw?wj_rNLT{4Xj>dM-WFXXwn z3b#iSnUCbPM6_{UAb5g5J3e<9uNpYeJl|@Y`J@7IQ=oe;y%e(>ZM=?ak803or=eO@ ze$#?}Nxhb%ckZ%MEHR4A)EBLrN+}}p!BKlhr!V_NEqW#wOwX;3k0RXt3~{G!rDc8a z6xa}gWIUCQb@NJ>v#&}gYd&jj8MpN~vCk6YH?PMzCBISt8T%A56NL=PIb97cDJ`7FiI52bWGmF+CjHkKx!XD@t=oNw76tA2h|B#R@m`$DHC zacD;=52M&gWwXsGgS_D-%u`R&Y& zo!hy_4m;H$mtJTac0_e7Vpd-n+tKnQ=7!-%PDRvaupZ=SP?4uZ1yiQ5uB4^udzn+A z>s#fJjc-MGM1vNj^8P<7UDX!gY*K8QQ=v0xKICI)k zjxB)$l9kw;ewu@bL^yGzI_7>_-7~-U(|He*mFDR;1No6lI6|wl8wc#2m2Gb7dY3o$ zY8{`CJ04jWwXLRCN)O&FO>ec-eW(>JFBPD+gSfu6X(g%)=Fk7;>TrcLgks)?Bn`LO z($8_5O371DTTk`w8tgo#y_!z#`OXd4i^A*ioom5JcI)KU{2Yqs&$bvy_6`>$o?N?E zD;w}J%x>M)vmD!Kq~2lM(JKr_i&n)-O$#40sT%gAj`Jq3R~a;JYe#aep-nuT-2P}@ zj$|aG#eWso;<~Clc0jqXZ{@48%#;-JOm&{KX&fnc#dLlEf%*~gilR!A?W?2ev*8>C z+uny%G-K2|wyF~Zuaq7I1F)C@#J|{CitAh)7mIDv!8aUSkUgotK z&}S-I%qXrp(;q07Amp?7^5~7JCyw&EcF6G6IcZ^p&Ga=7QuiH4@gt8-6w|H3Ft;vq#8jpD+vjFlN*WW<84pRP z_9XNuMR!+2+m(VvcD2ucS`1Us9c!3ttNJ|V9^hDAI$;ut) z_|8)1&f)SYK_5AO3HO&uaIN>}2jWPn|jMEy?g~Je7=Z8Q6lRJj{PMRFWYa2ojsuWHbavnqzPDX=xjANfA*fp zB*#`l%JoUrSONMa!H`h)CW6HxYnU!_Fx8ird@aExP912yG64atmPG%#1*;+r- z8s$i`;>S_*(PJZAgJ-BmZ`}#2K(%|+Gj}=l)56X7F<)8TuR5zFJ&Lc-*JXBH#Dw zbncUx>q3vdu`3tMv!Cj9a&!3*qMIfubB9w%#p&q+$z!efw`XQFF+(&J4mVNApw3AL zj(!QQqrX>8=SU{v^>7H>y0T30eZ;~ojCRg;j1}u6e^FuC)v8Mi3hx6qEGFfa#u!%i z$I68TJ3HgvT!N!t@XKO>83!GSYh`a-8tQ%Q(xzzX5~*0Xt~n#STM;Jq)k^$AG~yH^ z1}WtYj~)+|=LjK8NQg{Jgt1sG{KA&S&Ta}9UV2wa73Yj@e%4lqUb;Y~-zZf>5Z806 z_C?~fE6#)D*LPyFSFkRKjoJ-&icB{+G|r_&H%r}$q3fjyxcP=a7ko zG`&Y}IH!HiJ-G0q6-*~}>D*Ef$NmWX)2Ps))#?Y@1Loc1vUJ-B>0eYhih zl*o(UL5U5&p?Zl7t-bk`4_Xw}xs><<_mTSB$f+w>qrI}yPOctxf?ir1#oc;Sx3YyQ z?kcWH3mZjWjo;8F7qzHUp*N{Q>O2vcpS;*lZqF{*HHF9Pp9=RoStq zjj*`Aq(ZT7lW|CGqvJsnKc_AZgE${qDgMF?k(AMS2C4y9h?cR zDZ(lj&9q|X{G2&gHBWq3Sm}kII@<@wurnLw247`4tFP@|DMK5|;LbDwp4RoI$#ZCC z(O)1}E4R4Zfug~uFE)8Iug(h|q$;$POOLP|P@)NOEAUO$Z?59ipAwLYEnL@N@6T2> zvW}<-&}@v_CSoUetKqtOw&zij?df}`b0^Yq65|v%4Qck=i}!VWfMLq1R(fhrsANeK@r;c~p1P%m@ys z9_hT#BST#t`{@h37M!;-u8z z*Y+(5+oC*dx_>$LhxAQlFtQ2jJJ98#8-1l zwv}j}E_theWA`(9B9s~eZAl*SA8|nn*zI(GF1+^s!UcE9EXj$lNsr1= zhc;e!;EUu%yc3NbG*PrJ3miA34pMo9VeWK5U(nH&n&oOT|>sXfXyZ9W}b zy~eru8RpT%Ako1qvkK$`4}LD>Bdz`6gB`0`(kx6jr`lDO+1{6JROn)>M}{3d3*ijDKDY&JV&AyvR5yMlb^X4F7@%?s&X@L zm+-zZ^)oy{V>{r}DE;DmG;bF8ym=R!?wriiH60(Rh5;rLiaN#k7|(>PdH!+-BmL^D zPiO8?Z5Y45xAHm1Q1Mv=YdS_@oP!VE(-%mmdsQy;+R$sfIV+aknMu~Zau_lk_H5tH z;{)Ha&DaJ9Zh6_Y?JJnVg-)L0hSHPCZzyiw$f$do^IUw)H{N?|&Lq5dd$$^=j9Mh% zet^=PFw5jlk$L30BC&^1t1C?o!Op6YiIC#1yYjQk#L|&xnS<}AySK?Edib>&j}2kmKF}Z|vBjL=wHBP>K{!QULQR z@dzUM9!FfXycNQk6_G3W;SQ5CV-uS8v94K=Dc`p=3L1%bbz2w42y-?Li*yTRm$Nt} zh{wU%8&GqQ6B5&8JaJEni-sl2M6x~UgBl*YcGoE2K$C(7#if%+)7YhD34ZfH*W7L&vIME7BFkCpJbVnP)#v#W8OG3{H@Inbe&?-Tu? zy`_tX#*Thn@CTRcmIPF;ro0Sqp4SNiS1pXPv#o5y9nQOOm|ay1r6baiX;>rBcx*%2hD(dwYALF z27ll1Ok0+ZT+x9zq`t(urf9d*&{<^z1=h2|oQI+xU2BOl^2Q}K-V5X)Gb!Uu*)Pf~ zR5sD~urh6`elRQym5X54QyP3-6V#o!MQ%7Enf1%LkPJij#lgey@0!5DPmr2+z*FVq6maM8i!9OK+ zE=n*fv!$zpA2p_9{UZB0&{2ebxnO|UUSJi}s}{y+qBq5H3*>7k#;TqR5$t@-Ssk`$ zN#v>3Vikw^Y00SiLHUuuvDo=H9qBbbytk6hVKh>{(c^-|82;RQ7D?E+?l^#?uvriD z=Hix2>W>-&t=jw=pH0PS0~Ot(`O`*QNWn+qZQRzCqkM-QjLVX%Hr1;L{>h!jmhs96 zs4>5Y8fyi+B0t3WOfMzu6e@wZx8e1u>u(or?k=tSB{d!$#E53AS=`aq*6FlioqG0l zrWhvyUgCeob50K7eLi;SA+t%PjK15G4~o<~5)Wx#i=%d)VmP3N1!0sk^JDO92_zZP zi`>{;AN6Dqr~+Qeq)~Eoa>^&Mt5T;lI;?{SoR7yMu9BqVT@b>IGB8YvnRb1m>@6*U zIw32px?Xsrh9>d4TE_E&4A0{l_{qD&SwdNvmE?-C&lSCztFt|M1|IF~WSv%q#^rIh zgs+xeY&_JwvknCW+;+d4wfWpAt+|rln%ofeJ^^ci!z30r4h@O`s)KI_GUn=Q2cx*rkFzR(kyN*1X9iy}#;jJ>;J$?2T=!7^pedSa zTn0R#FGC&KhjSTm@5EmC&ec+6i(2Qw^u}N>`$p5A=gyw(s#4b0$pm0p@MMwV^o$~}+#|;<3MJLRO8nZz>GucdIjrIveXb=w(8~o-c}cdxcHh6~ zBgpNh33sMM4aa)mlsSsNY%@GoIwv*z;Kj%#^ zEV$V>y5uGm+O}x}ZW8B3glZ$Xi8^op z#k)?yRUUl`Us_L#@m{LH4k#Ld5*nu9yA4?r;sN)Ap*n3H(hVAdvu`*787Xx z*+8oM51wVL`TWGD>#VTe0H=2vN~91Q^%rBt(2wuzSl?@&YPxV3>PI)Zbd8sH$hfV; zRV1)uM3FSM^M==!L`4Mp#PvRH4w%vSE#=xfFcWx^EB4WB5eUT>-YpK^wSC=$t`}}myoZ5rGO zoKc;3yn-ED#9n=dM|BYR+oEoyS^A#Jz|IBpt(O8^&bA#1$z39D4ZyU2*IIA1k2eHo{Q z)YmjzVY!OA5A7T&uRZsklh<3iR-#r`GP<$)#*{oGhL7$>>)DNgr(c#MmuhMK2C{11 zJB97gCrW~mY;SQEC?mG-E{ZiYD&BuQSBt#pfFd>Mwok95SvrGl)Ogp!)Oj6QI&U@O zGIhOm=Y41_kMg{rPePs_6%yt|Ra8Z#?IguW>eq+ELGH=Bw0WQTzHJ|j&0wJC9tu^;8d)7rCTG=7qZ4eH7DD@>>BMO589W4vEjG4j5$GemCZL zEzXW%ycZKe)0p%P`+)0(Z%~HfYr&PxqC}=_2`g5z47}`O0v!GKF+SGNshxs#k#oXi zYa@!_Sr=Bm9ZarcnoEiLadHrH6BJgVGgzD8h=}+%JTUDRjAh78W<$lM)O{`Z$ZYVr z0Fg-q&cbUMWsm33(TLpjE9)6D}Pd@YrI{c-QFE=tjlIRBE9`H(ZSnB8v3- zmP+IGay50YxN!s_zI5xXKQazQTp76-DOZ#2h~#aq1b>IPa*PR z{$)38eoO`fO+);<t`IaUU6;6zDBxUPaZ%3suG#Z0} z;L8X&+12gG&S||Rv-Y-&<({FJ5LZ@&l?J7GF@zN(ROhJl&S*BmvU-}xcClt_N6}UY zjQDsM@`K&K8ZVs+^R{3UU`BW4(0$Sw`zfQM+Rb1>vS`gm-(eqt!#2f`Ic5f6bi||I2tdpCJyo90}g%SD$tXz1O&jl8_ z>Va6zGLbufM_!^Z@W6ep8grx(r$%rnv4*I7E2p5L8V5&>+5cM0en4MU5Q&bGP|3Vi zdL1G4J2nS$L+3ll%6BNM59qM``W5uzn)1{}JJ&>!YpEbWP?{qFX?+##HQd_>N89g?m>zZz z#(i_ys$s)9PpaW9_s9}a*BxPYm|JWON8KCc%R9^P_!?Ee%o@g4yl4VyR(W%iTNj^+ zT+*h?Nnl{Fgv+E@VsqEvcySkN1X?0>YIJfca7UO{5FcX-vN&E<1!*5h`oYC$)15YL zT2Fh1#W95=YvhHB>t<>=ZM4OwyF`*yPo*>E=UVG5xj12$gngqMsrJ>S4WeHWzPFx) z{^SxucOtNsVQCjO6H&`;p#O}pRpQy(H`$V1IBFex3$AHH-lN1>a;N6A-#$vH;O~0T zRb2PQlV8B$@?o{kp8C1=hlB-0DYYWW)rY}fzOFJ19~w$5u;V(hbjN$T&BCK75_RyisUUFeA}L-7U1qYhs;?goclGc0`X%NO00pXEJDO7c6ki4l{d z^8A9mZe=1_q1-CGtqgfiX+WW^+Glyqk#li{Y>XUXVe~C8EMbIm_9?HhftQ)vGY=t? zxA`GYROCjtF!gRsKcs!8h`?Iw4DR1Bb6|eo1moYimVbZRVxn$xn@s9JH$!2YSFTSh zxcXH-+%0*HDyITpK;49D0|&3+O$)2)LcCSV=W*{zrjE(8?Gs`+BF^$}t@_`oirjyR z999M+o!j98nWxzTuY5)f4;od6H5`5otq!FK^!WC^YW|@9(A(aN#XWm|rf5k{c|oIG zDL~GfHO*bBmZEk4&Ns|gTLZNse(D%^Xv-N7`AVC*AB{gKLaI*&dE(1m6;=&8qP-~a z=9yUz*+I~mJtkt-<+Qr96Xgb_{>lif)d@7~YymHAdRJ|brjIv{2Gs`NJgdCHt7dXe?3tMw7x4z|>>O>HJ}W8*KGr!g zcIxbnaZKznV`OnY@zR}8Nj5%#m51?!N@N7l`EIqT%*OR^^Sx7@-z>+Ry%`XVO4oI8 zoo`Qb+E961q(rt2SCB4xPs2N%ym>nbou_CGzo5iZZjy8D6gIrbOILmS{*1K>Cyi!Q zX|lHWo4E=H$BiB)_=Rr=ul=b;dBb*&O2QJR?Nf)7&LZEpZ?UcZzjS#0>06ih|+evmlz5V0V zX#_ij`$h@Ayy3Fa=v93(CRLVil<07qkXIdaD~K&=Wj1j}mxUMGI~|ek4>CP{u3V^= z&H+6H0=x@R2UWAxDTq!arS<8=L-Rv&xK-*G+ZQ_E53{uehT3(NYD?xTU=4Z*pAmJp54!`$+C%cJ~E?n2i-w%WG?F< zNsr15j4*Qycrw)=DtbwqH>p0l^vK;?nNeO^JZC>o#2&U!s?|En^r4e#ZUw&Nx!T>- zICwSQ!_^mS#gvm`1Cx1Su+U!I?Cnw4ja_F8PmT?hd-#r$w-5Qdq71g{jEz&TKW2JZ zHscW(9`(p1h2usEtFt;Mfg!1hu0>=?h%S}m<9OdWzneqUdL-|j>b;qL7s7dT72~r< z8^PcT{%H(j!q(wy-S;SxIP!JE4AxcW4ifaVFgO+$^6_(@(%&)P{%~oZ&!Tvo!sA{7 z^5vtXjl6(C*`bCPA<~Z`8S>9Ip9zoEQt3 z%Hvy&`cq%3SsX&x2wQ~ACinLJzXW-b4`Ku%2ptY$ME2AT$x5 zxd1Orrz*CQC}Hv4sEXW#fKt%c5!m&2osNj9n>poX9d#c52~kZorzahJ=Lx9^$_vU& zYl4~x8Ey~X)P@C#wwoo0Y<(giyTP{StQF(1o8Wh_idpUcz;XP1$x(g%IPrwG)?vTr zxu`vq`Ikp`Tts!+{U~6HV-vAO@KiAx9IvKBz1DT7l}ln$&x_QB0~=3e;H`jH4+;X7bo|#!C%k4%fmjoY>D(YA5?pU|9D_f zs`+p@JP>WvY^}I=|*o5i0^*~b0SI1XXH_HpJ337hDdqMwjxW2xP*wpCV z8uEZy{E@6inzq)iHtr{0Rn9!lO-UMZQ32kfd=ZUk1=&HCs(ZALnfwQM%Nvp`+3uYy zP1z;Nd&SiDeh-VP zOGx>ss-dWb&3K=~YouQDic75($7=fZTR~e|;}{e}ONWZG-0xatHnULVig)#?Ohbwl zTeG>n{mPqby;5`H8WZg%UGL7TSy$gwNkqP?y5_j&Zr#Mb+_1WZXqqgrh(e9BNl^Xd z-6dwqO8Xp>oESxIEg+G;dLOlU*!Uq<-@8(xTh}J59z9BGoDF&Z%8KT;e!F7$>LI@O zjw}&(4PJjRCrWF@%QpwzBaYt4`=YJ6GG^22%%ozMP?l8sTF+f6JL)*?96yLy4)Q!3 zinHnTX=k1i@n*KXy}JR4p~x6Nw5es@YO1v?>Dk*fF@jrDf$vcq)<>$X8#!|$BD=xP z9GCK1WUgn<;9IFXHfIA^OjAMvNv96em{@X96i%_qQhHuqY$=m^JSWz&7*|#M*1UIr znU`MwFgw2q%jV6v_EK?nX!XZt*9$Fqoa0BuO53EwJ5I!p(mTgt=L4@K1zu@xX1$=P zdjG2#rMi1xJ!LO@HUE2-sxj=Vi)c;{W-+U!=_ltnJ%_?4r<0^SE0=hB>u;?V*Oi`I zu9c&nq5DE{@3UOaCI2Kx&x|4b;>SVA+>HGWB6o*Cy>u!srgH+gYU8?o5x1^uze;9Z zzFPOuK_Q_PMtv>TPBzH+e94uyO;@(VrKcxt+Kv$BjS; zW-tvndMLI%=qhTX*|0JWLc(IM^iCdOnstOSZ+d>2pL;>Qv8PXZq?pjTp{KH&s>sC4 zd-@I`)wEu~{w|mD{HG~|_SLMWBeT-%(#2KT>Puf%R;6>#u^d$Tyu}+())vz!N>cLr z5T?JWNo$kA5}3-xsQAXg(+0a}wXTO)%L#o7iPFcoL56}&k$b20lJZI*&jW$*<~1Fr z_m)JYI&J|3LxqD0*0#5zV`H8vkRv$`M@_gJ2Qa^e>Oa2ndQ8q*qJHYlt?MyG?wOdv zOul<<0q?|y20Uf#j(TsX$e$m!SJxx<7T9W4Vn#U{gI)2@ zT$~ndLMBR~T0dvrS+PWF>wR3=&n)nCaTh#)23Bz2>b#hC`<0+dO!Cj4=U_b~F1V`* z>TjjOe%p-A?fU2IW^?zLXLV{&`_Q?Y*Cmp)uU8{sQ|rPEWk<9IO!I;DPuqkzh+@p8 zS1Z|Mw$6|hoU*3qQ1rgEbZ<9-XXp;CB333pQrmvVnWE<{VyGS=b)J~!iLO42tKHLB zW@T(EF`lpTxL%4}YjMcuLg+h*baKeP5kVG~w>c5t9C*fy>lxowh?kdlPL(<{^*bU3 zLzo&Jj{>|y3R7yMnahosY*{sK_1v6WtexcE$1>{Gq(CreYHk%Y45}_-uKROzZu8?F z=CV{><#dZG zqog4bKO0hh_m$NFSw3s`R?-flhcVc~fMIQqHoM8xC|#()Wyw&3dv8K_p#imItLTlmz($Q5OwiL+dp0?XjR}qZdbPe6Z6Bxr@RkCF+ zrqhuKpG66)e$C9oV`cnYZP(R1gMQ(9;WPu&GLcDyVxTsD&BGZ%Hh~v+`;3+dv#a&y z^rs&cVKtlX;XZ7A1AUD*CBLW87u}n>!k)%-5xP%6w@{LXpKNj4Fr-}6*A1=P%x%F9N zQp8X8QyNhr$IC(AmXPLk!He3fE$Gu9GnRVFefx;NJ>ZG6RMmbC4+*H#F_RkBLa%(j_L0H)lpCGtDIo$A;z43uY9eNJ zrM4z*>KjZz3F5h4MDBgp>qAKo9l1bF>fZI#t7c8yJTk_ z*>*2s!IwWh;yxc&islgK=mTM=8y{XQFDv5Ku(v8j1)APnNKiA2J?!0$Wg@oYpi@m^ zB5>G(gwjvec)Cak|%uG5-UM>z__$naAErTQA-1-{xoo zh9~`YG>9#VGL`E5Pl*TV3qJzYf7|pkc;iYsfi_B(OEa9*yUKjg`^C2vKIabBPMS;n zF3J~tYaQmpYy3kjiI;ZpZ4$nFjmBUXW0&rWou?_Fc^!58WZo;hp}RkvHVLRR22f#X z&}96bwbhdJA}ad0+duoYr9>Z(%beq%_Fiv<-s^o}qH6JSwRk@L{5pHq70N%=5~WN< zD$>t<7xQ=)@H{{?0DIVlw;@NrlUievYVzDS*x`BbO~t)Q-$;C?-xAwQd@h71`)oEu z2KRmn9{(=WvOFx{?tzv6-t@%}GX`LusORh+6a)^WcLUvi3hSSS>XQ_;vV^jtZOt}c z6dwDZMC9;TZB}q`gXClZ+al~$6^BL9D92J&ATtaCyoQC@v4S;jj7is4K+yJD#>!pTC=;8C9*YL{gh}pK@U0_>cXt}BO z^S;8UhO$<)AS9(SkZ*wdPwkm*rJ7VTXGcDD(I55Y@mvp}&e|FOI)kEwdWU>%KvsQ{ zLQTzgRc#7OD&>6_VXhW|KPb_;CU=qIfA#fnDpDX)QG0o0=UI)h;TIYWrP89-(O0%)MQtvcwp3S*@fQuiCSkw=Q1P|Uu<2d_ z=`<0K^)(!00L~-;2mO?-xvNWu}kf^ zDo2Wx@#ftD8G%_!(q?oWF2Zw$Q;nUku?Q@y8R;cp5n&-K8Iw^StLSq@1F`2CfMRNs zOdQi5(jSvc9N_6$@Ojf&oD4IdZBU)_U4@mr3)u7@l)B>V<^mM$; zYN<5j0R+heDHM5dNG6Ir*dx;=dbO7{h1(irs4*(@ePU>nE_~lr+|YSiQj(v&t8o;L zvBt6FX(NnsaWf;Y5>f-;1U2JrME=ECt#Ry-9@FX&U0j5!Y{cWVd8R97ky{2}9>@Pz zzZE|AFYJR$39>*&=o6TD<_t_TymmcV*I~)1=rbuxDp6{wsrfwm zrQcdQS}YT;t)0=`{&_aj zTYQHIyP?mzmGKuN#T)>ms%A1RnbwL9dLVP&XZ{kFSq>oo0IlC5Bex4gt%Gk-O^$kn z!0aO$H)~^#2F^9i8Bj2Bk*cScmHKzB4Vv9&}!Ru znYwK(DSH46GiA(}`u%T(n};SOvpR;t{kkjA&H3CApg%J?`_tqq^d*jJ zx`j3&fbWbxkNvnf*cZkDR@dJMoqaCqv5ka*oyw%DD1Yfo)c^b;`bT~jlJ{c?(DBm2 z@+uOt?0x}QLQ`z?l*XndlP+s37o|J@aYimBHZ>lO+9IEKY!lgNO}^ut&ii$O>j^A} zpNkN_4wR-_)eOEFVdt9|HC-snJb00E^knjGpSw_XBm2~BJxJki+4ut7pa4PKD<1dNC->Q!$9 zdL0P8op{r3Gk8QS8Ms2s3%Ey@0hJ0<`jj8}4E4YME$GS^K7Sv6=NDn|4HW>HMcV+( zx!j~CTYg5So8(zdU+U(|x&hooo7%T$#GUyD$Gfj-GAy0A@=U}Ac&IWIVJc9)^`Rin ztngJIhSC1f@BX-RA;7e>vE)=B1G4B ztjf%WnrhMezy}IX5H|7HUpWwAh+3PlSdLOd6VVmhbB;it^E1pBT740C2;lC%mtPl% z6@jJX7+{x51x!_#);V={pX}fG!1@9{w1ujmRgPve)v-4bMcVIQ&3FKHhDc48Y53xl zC4qHO?x5V!$nskwy2USYvSu59_OND+JCXrJ3)S*UCOwGgqP%rOHQCd+RmIl z@1V^Baku|Pt+N||slr%HXYEj9JM09Qicl8?^|VZ$SlfPaqZ_5LK7nt42s`Q18v9q>0r`Xq;k?}x1YC}+S~#gSn>$tHEb&Es&J^n zP=(3L=O`y1f!;Je@wB)SUgkWcMl(Gs+NDs4i8|lCUzHu{BsRY<5?O+p2(#E`VJy&X zPfCk&C`!$*LH(^p8&|=ufH&}DwG9Amv#a*aU*?D3~H-UkgAg8d`Mr1r~qoqA!tiL6ZZ}XhdBl$rHh&K;j&TFi~waQF&PKDx<+> zuR%BXUMfsw>!$wx6!sBDbxxhFGUB&{(O_bm*=&e9`mUodyzmoT8Wi3ImzPNW1X=7M zs^ry#fxxN?H$|J>^Cpo6w<^!C_n(B6i8VkNp!7xPY1HS?yl(+PjqU!w`~be;AyVhb zNi!81u2{T9kd@Xn*{AH* zHN(1Qf>H_S;A^SN-++7z-umy7Z{zx)Ndgn;;QJU0Z%YU&&-Oe0@H-y=yZi6?8L!N| z$~TzGj{6J(zpktBUUt+fRR?NS0;zIxl#!UXGA(D`#GBv_6#hoVnxl(aP0~BaTCWS- zQETzvvxa z0xN2&ysHutei}3W>ERU&A2EI0drb$D`l9zN|2C1-(*cc0YsuIHSzf#*O{VTkxHqr&kv&1kYhP)briVPqX{Y z90G+E@!sz^W6nL8=MjsW`2^}oK55itpQ3Ci4SjhZ7>c#{P6$IT^9+6P0DkfB!Z-h3 zD1*M-HAju5bxLiMr}h-rOH_(lM_lbDZn~epF*Gm<0 z7{l7y)yuRerO8}hVicl~mr(Y|MH_}(n)Gvye=2kJs)Cj70r(9H_DV~(N=%|SrajQc3>)sVYCWmQQ@G@C~Iy0CRKJ>5v$W$d~YP4J94yh&*Q}7 z5=QArEyvxCo!lh$AoZ(X)BpLH)z>e(#Nymp>h_dopJ;-}90bYCj8jX*mb7y~0! zhM}-qqb(Y*8*bmQ+`#+qoRul{=Ue2cV2fWL`w9oagVAxxsH#m%yU5VNC(+42Y7^`x z-#h=s`v2(lpM-*c0{tJLP@#v3e53}zn|*E&YvgA!q1COcF}#!tN!%`NCJOIhade3^ z6o9^lGL7dCBoH=;om$gXmn8Du1W!nLS!zq;STf)J8#!r&J%z)?LnhM&+PZR= z-2J-*nC%IO4y2ROHm6 z>}jIti=9)~q;PQ-_YRck>7B)9HOo9~3;=LQoE$8{P#Nz-8qf05qR2<|sV$Duu&V;A zs!iGKhO`@E&LXNwJpliL7m1mCpOfc9GgEE7)Clx}zO;!Op5*fc-}4NXD-wHa@+QLL zP|G)s0%?rFHc7INDBpFdPx2*(%sGtTA>^S+N1uL#^7ebw`Lyv62>B|LqmPW#)Bv1S zDB#y>$`x<};56nD=BY^YsVomv{=!dCe#5uLC%bHA!a_<067~Jlh8ef4s~QJ-o>h{? zJ%BXP;&Ij*k#ys6m%ClF%q=$rMRKGRUf%&`-LP3v(pfq3hrs*5LzPCn!+Q4vZ(S^N zT_V)EqN5^_isI5Ie=j3ujX(xu8Svn66D+PL(xK17;4LS$F|C zN2%ed0cd&`#ILJB4*G^~W2!ZEi?4WzNMD6iETRn5di_lpK^q>lAHJ)m(`sG?>52BQ zWi}z?8P{1+4FB7-KRoTxpVu^~v=e;OhH9 zM2fjz6H{#`GDjkeM40rynaS|y?3p%x4(|VM(-%yiIjb&4RJ5RGDJc9dqAUesP1H<} zi{BG0=i$Mm2EoU&%@c=6Pe{7MKkvCc#!pL4ZoQq-yF;8t^pH4(cv~&jKdeLBYG0|+ zV(?{h>8=Rkb*89`)e4aBfhc1Y4v761zWCk1dk(;W19297=%c!e5YBdhsvub-Y!#+$rW6 zfft3B^<1oDkGSZ)k!PDW!|xekYOKPr7REJ9-&>^mnuFKy4Rn|f0ja4FM%cLP$RhFd>KT~DE0u&!4ZA-G5sn6$Uo zf(9SJkyi3y$wP^wUW{ojSj_nhKgbT~Z{ z4TwOV(jX$U7s|sWHY(nAc?MXCco|p_ITE_QsuA!U)*>PCqw1BT+^DDAoK>S)hi!_|` z15zHRw+(L-8=9;~z=&)UfwHL3dS>!tmD|+q*Ns9fi`ox6zqiGv_4CV2W;`xW;5h_$ z`**O#|1>$C0FOm@g0dktBmO{4nYXM>`ble{R-rCU`%U}Rd~%<1WqbE87lOZ^)s%ri zX6n5r&r(f*_QNl=^0Ki|A$U2bweCcO=Z(tiSvYy!{xTwaJ1@ zp1fuhVtw&FY}a3>J@n!%xz(q^i|p{}?03IS<)*yFG~M~ri98zuTbZ&eHA6;B`6=qZ z|DV9uZNNvjp;tjaoJN&7+5Qf%6IYf(;NBLO0%JFaSE|=Tt`O$l@oGd7h{=24IJvGbc8HWR$^Ff<_;f z>?2!*ceaUHz5?XOq57o#=x1nhnbV@z0SmM;u{#G)L0!YNwjnc!$$3?wgt&mo+1-*T zW_#9qZdw|25|T3zN5m@Bwh9MYQ2pt@g-}!RZ=sr9jDuNV7BN*oNtIVGL&WPzK4}lEfNXnOz*bPW&1B0BW#`**s1#MC6u7G zQr1DsFB6+~p9y`50ymr3_3mA$KEZk(h5TjVEY>`^_0r%jVfvI9t$b8xs0cZE=pzuS z(#o3+l=D{=E-<$!c429YK6%kPH7Sj^QHvpJ$9e1S7VTJnQ-y7{T)@5xhiX0BBHMZn#VGO?6 z$vZxM#|BK8(HJXC%8c^uU9=p;7w8uMn+ZQ>f~D7=*67U|wntP;Il4B0!meSL^nNDF z8p1*_99}M7BifO(Xma!0R87c7&+lmvI1R?hd&x=_Cg|%=0u&+MZ@x>~?U)y50PLGE zci*h0>+)H0Pl83)hRW-G`l*gUbBHx-*qHIb%u8KJ`lZ8Jz!_jm0((>R8-6FqU#5EW zdti_=5vS&w`@bCKM52L2CQ*;#taD!Jq#+l%ImD9Jo?CYBc2t|FNR{>nypE)R_s~0L z#Tm{U=|`Mp^_6&^zDYzk$vtem_EX@g80lk6l^uzbg>A7*APOn9fcAicJIL}Fo%G@x zxM(-0!^@$jO~$H$I~lBf6YzP^Pr{G>E2=;AjZ8z%=Kzy-TOcZ7Yfu<=4$NsLTs;q- zSBss4u|()h)ggosRhi}z*F=^os$-N80yzA`5Yi~UBvlsa%U!vJk{{3%; zx~7zNBUm3BKPS@e81$-_Hxgwt@8z^e4ZtdG(OX~q``EOhkqGs;V!S`09^|mlYer(6 z8wz4UC3XMLb5nGO+rNZ#M6?|?WFZ|Cv4ygUw5INCDr{lIkNv$q!y6;C7c6FGcD8fu zUmo)$y5=3Pg7kTWGx9uZ7ug6~%)-}GkAKy)9yMgB5Ye-Uu*UrS|b*63Tvx-<}iXx=Nq8g91wAIg^2&7^0OEYfE7xnhc;g9>6 zEl=9tNT2_A(E7e%Tj<6}(7yw)B zYOSBd?0yMUS&jbEefZeZ^Zcr=4Q6vR9)V6%qn*7)o;17JA z5rh<~Ol(wJh^q^U6NP3Q-_Eieo*EP%H8v%74mRV^!}n22?hc&xLjdAL7ZZlG}9Rjwkn0-u^QcHbkQmZ>H>rsVh^poxZM(#aAn+iY51c z^Tzx(-7c~B!k86i^+c>EWBu@CSt`5zyoHC0;jF`=USvL zfcJ>5j!#-yCCYNo(t^`3;P~C5-J9=6%HiKd*+H6CU7xVK8Fv3|f!$0QGGW3$r}~9I z3~%qi$~dHQlS`!Q(LWQUBfE`xX)U&kYN9dT)i$B6!T-EPktUX-Y*uKDAxf_~f5We% zSHAH3IZb>RZmSGN8WYSeelsugpMF+10M9GTJx{>a%iA{arakg5El0i<9!>##fp$N$ zYpwgq@R3WiH05;Rr;FUP`e}AQz3;8N2iROSXYYB!&l`94GZ->q{Qhm~mG6hIc^XJ)CP^sCo~0{9}9{2K&O(0!u&?+p`a7~nk%wX_$% zyY>efOL%E%?@)yU(bh<<^mV4m?KEU=Yk3#hUO;aREojQ>uF`i-NY#~`pyC(4F9r(- z^vKAymo)&E2a=X}%Wio7kvg06jAP%%S{V*h>DpBF`;$_GF%cmQh>wblKCIE1+t-@i1E7iU#@_JTS~tm~Uj+EBEiM5b0g z4J#B&_Gwq7LxOp8BJ?@0m>PiQ zH8h5Pdtumz58Cv__(~{d-c>>sslv5h*I^UV7;;E>?J-dt=d>Zf?6=;^nQ2?UGF=z1 z#Sj#=vMpBoABdIN(l+@ic7kRTfoamO8HGd~m)tCVjZ{aQlmbJ|nB*>$JoD|$qIolE zZg#0XhYw7&^Ss9>T?3?IE6xvzIf0m@@|@6V4M0gG!5jhyVezK~n2MKN0Q36f=Z)LK zMt9cOB%dl1>Yykjfgj*GfeDra^K1XKRRI4EnE87*2C0YT{Ve4xyw(e&sA~>I$R%Tn zP$!Gu%Qfj#;8`o?u1w1agb#9{As3*+P~ou37_IFxEf?o}vd*W!Xv}&58L<`H7yqnQ zMEbWUL1un8tu%~gkHGaPMb97!IPV!0WrVT?+(21`EC&@bRdS?J`5n^c2)szb^EBUk zANf}Jp}zqLKG$y=e#1SV zecF97FB0yY^s2Le+sdiYmbgDv81%9za?>WOg*e+hX`y_cFvvVYP^+FQp&vg7U7jF& z3+VFLl6D;~75uzGH0J4IPm~hRBw+JJr(%hDyRXMidpaGCyUyN$U;1BxZ?sRQW&}L$ zcH{TDL~-VArYEu?&kBVIwRo?Wp`7!fPx=y$J4ubuj@WN0*p!{gG2I0nZTG_A7of+$ zDbBMq^hF*!9gcg~X%-_hN_j{EUPwKD&gXtDMXhuxzV;XIaA|SAi}Lc~+O2_$*8T6$ zp~D5DGXNbrTw`t<8 literal 0 HcmV?d00001 diff --git a/assets/favicons/favicon_svg.svg b/assets/favicons/favicon_svg.svg new file mode 100644 index 0000000..c83a936 --- /dev/null +++ b/assets/favicons/favicon_svg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/index.html b/index.html index 32fcb36..02d8cb3 100644 --- a/index.html +++ b/index.html @@ -19,8 +19,30 @@ - - + + + + + + + + + + + + + + + + + + + + From 3509ba22f4ea6c7bfb6336cc106ba18da54dcdb2 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:54:29 -0800 Subject: [PATCH 05/28] remove old manifest and favicons --- assets/favicon.ico | Bin 15406 -> 0 bytes assets/logo192.png | Bin 13279 -> 0 bytes assets/manifest.json | 25 ------------------------- index.html | 2 -- 4 files changed, 27 deletions(-) delete mode 100644 assets/favicon.ico delete mode 100644 assets/logo192.png delete mode 100644 assets/manifest.json diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index c0faa8e7dc868265ee68b59a35ac79bc5f074ecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeI0d(2mJ9LEn`To#@pm-Kk@q}C=@A?BVDrG@oJ+8Aby>hYBMgW(Sixjl1xBrGy9 z*P6uE#@tmbQ*xWjC`2wPxu)=X>38fn&hPg-=lsrd*?4cS=lst1`uTpppYP}UJx>s9 z6Lbmc>H?nqg7dou!SEmm`t{rTKB#99+(X)sA*K9*L9n=Y5DcOWRj9Ewokuw>C1V}T z1zO20>%I+_xJHn08XO5d;+e5`ZSGY{+lJ>w zupa&>;qPf+UXrx=f>MU%!g}$i?Us|vs?BrY#1iN7TmZj=ZD~iPv5X`C6o_jg31J&Y z#4{uB=A9aOkN$j&7j3YQa?-XN%4D8Fy7oK9L&}sfxfw<$HUmlm+yaQ$3s*SwM(i@sxhZH}vzgrV`oGVl7bJ{`4LpV#-(%DUQYzt(lnx%aYa z2o>Dx-+_C-CK+e?!LeX`s-Owvt%e_A30wyC&|X?YNAdmm6KQut|8_89W2FCI`Msiq z>EFYZursukUZr8jZ{Np*dqMQ8@$f9X10$d<41#wv2OQ zova!`h38?rNJYnDd+~m%y*r=Q%_{3nj#Sd7G~CZ#drZBJCvnvH`?+a*#q6H?abA+vKJ3f2Sq{di#xSv=<#_O0$Npc1wvyj$`sVkr5muB4`?i16+gknUKwtBl z);^=G;k~_7Pe-n|F~V>C)i446)AFzw0%t>&|C8)Vk?G*PIe#nRCKwHUp&N8&X=~CQ z*|F#oSHN)S4xLe-VN`VQ#D8xh-?eE4eZ8~ESQEF|_1FO4mY$Ab3w#8Vpf@DNaFW|y zZ_s1Zer>)BPKT3A&r5hd2&+K9dJ^0pox!JOVn=AdcT?YcfoGEP>HWoX;{Y&LdWNlq z7I6P}q{h&>bLtrM8Dn>7J3s#=^ZJ0ce*%kO7<5#eGDf}z+OO~EGil_S91eHFVweg& zp}n;o9bN;~;EBivtSQM>z@?Oq=}R^78xVc_Tl~+2v>t=x#yg*APLvkGL~(GqR)@swD|1x?dWhSX_T9QSf^8Kg*R%z^>l^|} ze&n3lul|tM)^g=+<8~-=9lR4PgxL^}MUHO@)H3h!vDlV==w2#H2hq^W5I>LIcgrDe zL#^-bA>%+%@;=i9&p~~uQGLnS@e>$FJ^{IL^&bZH=50&yXUe-JVD1!@1!3pj~O^ z$uh>40WbrsTWJig!5L7r2Gii>umIM;VUSf}Y<4Xw`P6;ncg@;(mGaJ`=l%;|{|%5w zo+l^4dr)p2o+fX5C|br*_v%X6sfNZK!&oo|B#prs&;yE=ZLWZ~!F^qe^rfr7`+9r~ z&Qbi#A*p7$rmpRWuy4(+ZM|PDqn)_@`l!B|CO%{_!#y<@+`orssaU40XYKXy8$`$O zIPb;^zk!O@nKbwVOok%nXFTm}fY5&9k}=x5uej-fAPm22l7wT&CWHsf-PenWi(Ef60cNx9{{%zj;mm*E8H36SRI1i5B`D#lUul=8){-b~RO?ENpYx;j4*_P*~ zXSDmFJG7VFgM+~}m;?JjR@ufSunF7?!=b(9z2Gib0%Kuk(C^a7a^qnGc;~wY((WIM z7AE~?8Z3r8z_{exrjh6Ix9|tN27RF;4J456(_&(Fy3jMAr!?^l5LJpC$e hzcKVC=*%)s86!u7wyp%n;@V6H_y7O;e+F{Tz@H04#~J_t diff --git a/assets/logo192.png b/assets/logo192.png deleted file mode 100644 index 4e0c778d569d5fab27c8d581ee62ac9f5ed6bc8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13279 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 diff --git a/assets/manifest.json b/assets/manifest.json deleted file mode 100644 index 372be28..0000000 --- a/assets/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "K-Scale", - "name": "K-Scale Store", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/index.html b/index.html index 02d8cb3..2040c55 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,6 @@ - @@ -43,7 +42,6 @@ - From c90ed5d018878c31ee3ec305d029712fa066fb33 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:56:10 -0800 Subject: [PATCH 06/28] add typeface files to fonts --- assets/fonts/CoFoSansMono-Regular.woff | Bin 0 -> 45924 bytes assets/fonts/CoFoSansMono-Regular.woff2 | Bin 0 -> 34772 bytes assets/fonts/GT-Planar-Regular.woff | Bin 0 -> 65768 bytes assets/fonts/GT-Planar-Regular.woff2 | Bin 0 -> 58680 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/fonts/CoFoSansMono-Regular.woff create mode 100644 assets/fonts/CoFoSansMono-Regular.woff2 create mode 100644 assets/fonts/GT-Planar-Regular.woff create mode 100644 assets/fonts/GT-Planar-Regular.woff2 diff --git a/assets/fonts/CoFoSansMono-Regular.woff b/assets/fonts/CoFoSansMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..1be2d0d103d116191309438c4c08c381e6f7331d GIT binary patch literal 45924 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 aP}lV_*7X7F`apl6M>Pf?|1UcD+5JCr-=wer literal 0 HcmV?d00001 diff --git a/assets/fonts/CoFoSansMono-Regular.woff2 b/assets/fonts/CoFoSansMono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7fb628215ba2d76db7bc3c0059af3448dae0c12f GIT binary patch literal 34772 zcmV(}K+wN;Pew8T0RR910Eg575dZ)H0cQ{Z0Ech@0U4P900000000000000000000 z0000QgBlyDL>#b424Db=N(g}@37iZO2nvJcFoUa00X7081C~$=i$(whAO(j`2d{bz zfmT~OLvaJuTRRsb+%^E3D{-#mi+un+wz-tlo!s8`UxdH~a?@$K9VpyxccQZY|Nq>i zB4efzM!N4`+0dV4W8ZPucjlDko4?r4ws#yvybN*HY_+1JAs>z)If9(iOwNp{ zpT`H2w|#|%|Ld;R)WKG|vrQ@CGgMS$Y;7*MZZ@m!+kp4aGP8 zK1|rfU%ggRy$3jsd%XJqH%n<}O9&eJ@-LU2g75g3f#vA#*Z+%#= z?;Ef1IcQg@aNv+Yd|>$;qj0}#Wh>H7Oe;y;j1y}58|Kw{`WJp&qcJoPACv6 z2{MsR6kDB;pc4s2HBwDVH2eSDm&^RBZYfYDt#5%Nl6M0L-Cde#dt^t>>H~l#dmFuf zTV_*$L16ea0ldsDw1Vj8f8swxb)kDrYGKj@^X+dN{0A6d7!BJdJ}`|t@2a~V22!>k zb$&h>0#XP}v1JIdA)t>O__@0R(6Y44*kNH>ySM!f#{b(`nGcB|43_QgT}o-s#P8LW zTvQ1wFv^7e>;N4&G=@#sw;@eXy7g^QZ&9nOzI2$;Ig?8@R^mc;h(;A?P&UioFZU6% z%!J&RY*Vp_$p16{cB}{od~(HcjLzHnt}TD`8mRi%w#YtAPRR zB*9izRH--ajTBc9{~lv&Jku1%GUO`Mcc zN-6!l&a(aT1za6_MjN2YNkv6_WjdW-UGra$Q6)mAN;ig zwvW&bb45%|l`>_zma!-cqQ5uQD*dmUJp`mR;BXDsYpPCLTCX`5Qxr9~XN-+*qr0&C zz1R5N{m}r~4N@dP$^hiZPzEIBIi|Y-XaSI_;ZQSMlxA+d)fvyB)>$8&^U2cekL7CKb5 zRNP>hk|9%u{Np%HJ)t&$W>UV7oEt!9!~e^T_ny7f4nD*aB|%%z);!_>{O%L$xBi#T z&g|?a0aS>PD1+5k+ESZ>=ZkO%qtG7dkS8PL$&aNR7Zfj_*?6d5I(wJw3pJ$)i!g?t zr7m=t@k|`03F8sc;P)+Sc4w>WQfg9EZh9T=uXDWXT52D&|56$S8iY)tn=B8MLRjG6 z6KU^<2HVc2D$a>sRs6Q^>+Mr@nYlN~z${H88<9ptjEG2KipDH5X@>sFbJ@@8HzWbE zG)}Q0(#EfQwH*GY-$S(GsmIX>P-vIQ*Pi_OTUF5mBfg?Nf(3#EA}?Z1Qu}{(_crZ) zK2cZyQPC=Xz1ra9!B1sBFh75=-_aSoRK@=*5C|3zl ztsbILBg7L=AX>FUu(2UHI1s&hA^P=0jGBX3@EYQ+Ul4!d10*^U2T9U2kQkCcQj!Id zu1b)sG=a3&YLNVG1S!-7ARV?HtfO{&N&3qC9i=LVFXA~MuQY<97yrTgOqGC zNOw&GDbsr(6

VnPnhVS_x8(^&mCd4ANs;L29=Hq!=Qt;K~tC=H5t_2H`2?n zIab&fShXdr*)rB`1sk>so3K^|M{g5E(D%XR<(=;Xu4 z5Rg#dgF&%iHBZ27%E~gQsmG8l;{B%8iK?yAZ-DVG@1s5D*y`N zMLX+*`>Hs}5iwjucwxsS?Z0hhCnRzlp27>EHfGQHs>*FtU>+dwV(Y;49c+ zC!G}TiU@I%jH=tV0SyFELhgcUZW>kwQ0x3(W~F+ z=*FAXdImjTd)X^q^%@AgS?xVb_O7X>nQ4~yEVRr@n|U$+dzQHawJ7a*>! z5C!p&Y-GU0%>{rHlFM>GLXfen2FO?4dEKh~7NhlCGI^D24yyV~YMAQ%gkz1;^D z0B4k0bz#%{*^ivymnFH|sQ+yBf({gT z5^so_FstlR>mM0RqgBAIVIe#6!=<(ht_#pJ(aZ=$LjXgyEt;ycTZkD0`MS;44Y6z16@pT#^=KcW9D+2Q@KJUDHKyn z9c+eq89r}J)jIfgM@*C2Kbj{(F`(Dx?R)+r_+*qNy{|{ z@%82=(fSDbU)q0m4iBO@$?}gSJT3}D?heozOM?rFf&O9-%P?r}QQaE|>>z8#GeYvJ zDz>LvNb__e4s1x?h-Yx|mv)224}nRvwju6!#}>=35&DDEH5C1#=^8G%D=xV34Mz>x z9&884&y&NCGD^u)Xfco}mbuTSZC+z}3fmFkoT9dnS>T$zz6if2KJq>M9Rh*cE)JD1 z;W$YbA`#5y=49`=wsI%;wXGWF*U^s<9KwefJl`H@_tZ8f8u58Ud{@XMlOEz)>=4U% zD7;u-suC5cBk?lF)2|qpL}TdrrQATgn@rbj3ks+9mRs8qkImdUOhe@7 zez_x(@B9VxXHopI{Ld*-R3zw#1gWvfqX6pYVB}815_|UIgh%x)&|jF}?}p*K+R@>Y zBx+hXjk!F?G967$kZjw|;y;^^G*BoRa2ON`7D8k_$fY@XK2yvJ0*XkswP-tw{Ax0j z>k|j5RX~?Q(qre;DJ>K>V$)U^&uy*?_g5s*0@*qJP-M}BRN`!d_%s>C@-*f^)OU>8 zFr}rPk=E(hqscFA43BhNq@!6-S`-8ckPv>JJ9j5D8v=P&i&?8RcxNMO_SR26E|_)1 z@Qn@g-(;#H;d$Z1RA);jNy5oUb0L|(v&32`sFc8S(hSe3DzGrEl07Xeladwspdz$y zn`j~?f;Lghr!skRMX#2PqT2DQT_$4}(O;QEldFXUNz_)`ci)bnr^d}6P=`iIW$SK#|_CUEudQG2gqJ;}fKO$obU1s(OcG?X|9;)zIpP7hp+{>_K zvJ~ktx0iGCOv|mVRmn2e7}S{8 zh%|PsxUH5FIm!%J+V7xqBBjVxt<|9U8gdH4Mb%7Nvi$up30RHt=I=T6_!waX7}A1Kgi85BnOoC^0=%F_M`Z)*J_0tn1IaS|!Y;uo(Z zMHQDQB1H%%U)CKRfoC45Oly9vzfnk{a1))}ELvG-w;&k?9mpYnqtz^ZOG97#IwHfI zbF;9Jem((ZP_A!Nm@4~gv6TS9o#B;dUU=uF zw_bbhP2#pHQ(>n!Y_!Q{TYThWpZdgB+ibVPPT6+JvD+TUob-)vedl|>_|2V5ek|17lA9MgVyCOGp~jkOuBAsk?nzG@X|%D%n`pABrkiQDx#mIa z$Abeup~{S#FloxP8MEfhM@LFZRN7&e3+=YwMP7W@az(vvq%kI#=xvj{V~V3r_{`_N z^0goRwY}W%g znyBH5wth10lQeDeC2kE2LH(EFtf-z&jZ7T#> zIVKoX;h|IE0f9uL6Fk(5*I)w$g=NTWs!im<0r*4xuqnXmc)q|of4o% zZY;Y~mlcrqI%Qg_t@i$|l9g55=`w-lpc-qcxdpY+y!jwUnj#YA+Ue)ZqYPmhlN6{|+O<<__PQm`3R(IR&@i(DZ zxsu3Hqt}@x?9M#jg)Vlf%U$Ve*Sg*f0{ge^SY0iwyPkUMtG|H;p}yrlb{ztQ;>e(s zo;pyOhcPb*bt?!=9oGTSGh-YolEoJ>3rR~rNXbtl+HJG}=*J=}J|_lV7RHBntk~b0 zG4nuc?SPg8_Wf9-;|%X_MZ%pKG{RsU<+9`5cjouLKlK6S$M9?PWdS|aK*L1?-&II& z{~4-j2zX4#YY?4GW09O(A5vEUI!Mo9M$X^MhPlI7sP!gFY6=%3HXQAH)NEJZ&R5}A z2|hc3ZIlu0T`*N?(x%6zBB?p$KDVUO#yXi?p;W0gK7~};Sm%XQ)_GO?+KMTc+G6oU zGL_Es3^C!3F|p-Y_)`R6FR4320BL_7p4 z83L0Ify;&<rBbUk8m(5R)9VcelgVthSgcl?&2D!%oKBYu1R)595d=js z495wAB)wjrkD_RrVOW;qcwXqj=@hg3dnvF!e%f=zb&&r0JB&$em>eoV0v$Q_Jf`)2 z!;20Cc-vixOgXjT@ezSVM-o>Cw}TB`&*=Mh0mSk38Y0i;Fy4LLWNsqhVf5wdgbnmg zX7?DH>0~)~t2(Vq@2`N@dEn_YKWrY}YlQkCoF8=Fdx^m`seO2~7}(C7EeA|)yaft_ z;3dv2@da3K!fkeJe2+NIL=PP_--VT`86MU7$6^ULESC6F>Ea{NEq;hsAIULt6 zolH$rNm?E2Tsr^h5=eVG4kaG`M*9KAyf2!CdT799Xas>V6%znX0T9oR=#WcOJ7^*I zCz!aj<^$o7n*eqI(DQNt8X^D;z^&R8LWWGWUZacvQZTA?oz;9bU3FbL{NMJ7F;ix} z@X9-%eDTw7OKIEhm>h?k_-Fm2)fw8b#x`fBeWsTTi42JeNm|0@?HhY4uKN5NYP=W3^!idS<7uwxJNnF)YC#Q<2>UH&3uYcV7!~icb>^|&K>`ClrvV@S2am-FbB3M{h&-74Bi@VpFl1Sgg+ZjSmmu!@b|!s2o*{ zO6+B!o9^lz7n{hD9k&^>RI-2=HA_lK(hFAwfbm+`cwZA0?Q}5kE(Y%f8Ug* zb7#gStDxkIlkgH)T5B+V`ud^|%i3bs&!>TZ{nGqp^vr*OmoW#gR%VyypUqEsPA}%$ z`8*EHe>*?uALetJ#k;)2I3^K?%S-dLkbXSZGMDyjn9G^{dv;-Vaz=4_`+fVmeI9SR z$Ruv?wsWWdXa7rpG*AzLgaOphY3q3p6yDyFcdw?sfM52p&wcH0$9;H)f!?o_0)|8B z4&`e)xuPT2e4v(Thqgl<`fx`)l93HK$QS@HH+oEC8SB``0fYtP%TzIID%>H}J0cK!4ih;|dw`$!9JrAWVWB+u`Bt zikN(P?@NB>#+9ktT0IDwwZ5k)Rd|wiW}L#e#lwF(?_s=3!I{#x=9ObheeouF#m3g?U&k!eJR6s|eUd#J)WK zD_;`-R|qp2j?r<7fop6${;S*l3AY&r53C{(QE^wm3X=fPim{}ZruPr1y? z#+gG$xpbBXyL=vWnundCs{*kkU>^RDWL)YQ?;2|XJK%uZ3?%eY0s*v`m*BvbZ3!MU?(^j{OVYq0c`u1A zH<975i4elTIGj@2rGJvfp~pE%W+QHd}RWs!j!ViajT zYQhAtC4g0PP~8^780g|CNK-Pw*@=)!i$KLgp=_UT{n=sU=&Z1lyLQwd((fqp#A+x) z!J$eB_fGd%l{9v=2I^qI3F|hjvkJjI>1nGUnRrnZ^$P|A3{ZkMhPFSSmZ77;S;JQE zS~et+xXuy&E2%1xg2n{JNxm!0ZG|Qp;P04wIrXei8g`*W%;-drI#wktzQ9p~g(zZb z2JgSRB$`&QBi{1DL)qFL_x?+&8mrr6?Q=+wX})25*%7D|SfSdu!15=qtHEHX+d|FGq; zl;DoOI@l)EVPS%~K`ey)ak#!L3rnY#M8tZLTN_j+cRcV#Y+X~VDIh_LKBTb_V+;>4RuOPqM;cgFn<8=X%C+G2o<<7NbX#?Q-Z3l9*OHcV8`3!>(z9 zUmby-XgxW`5-f7m-bF#7horq)C>#I)&lkLrMrp;)OELk~G|_zwI8bKwr!+-%t}fw< z4S|AI?x`LUC#yH8k|n@?Q}(}&e@<*V7|87!hkL3?zE5f8^j)0o15iM*9~M57$XJ@m zb4DR{m3o+h)^n7rWxZNy&#~8Q-8EBeU9?%VD zs*Y-{QZFqRiEa0O{L~DK?~iL3`MEv-{Fu!-jLr!nQmy6d7RLL2vk+p1Ua>mbt|vqU z%=AM6Gm~v2I33QPriwSFo_mahhh2)Z4d-u*i3H<*(1ty8%^Swb%7|4G#mO%43x>F- z;T^LXu^if#Nb}(=mw)AhjJMl46-rG8gE`-SfduF>j43&nY1doD)ysoI$5c@ttFotp zYm8p)+*k*cz)U1tKl@{;>Fi z`n@z15NCSR;_b$7w?EHZ0lWif`U9ZTCx8k$KOz=@p;SWO<E7 z%wPzx0c;DL-4Zg@kw8`_-FVmH^~%Wjy^gpm;x3+kyB)Gujo)?quYeYzWL_H4skqP) zYLM!xA)$NnGga^W0nkT0y>VaM0T|kj{AoIlG9U=1~tl(x6T4xH*WCen$c6_CeB*>x0ZO(wI{T9$`@ zslydt*pr@nTH^6|YO^gsiju1=4?0L0m@%LtnUST_6*;v8=CZe1>N=eIs}FwZFObpq zkI@gl@jY+nJ{^@ZfoMm#k`C9t(7JkInIMCQ`@iWp-3arlw?_=#S?j^5VfUO?MczE$ zznEbhSQnEHaypWCr&}7+@yVr&m^eiq%pqTYL%6!_`#XT$~s_@(QDl+vbgjFts=7Rrxq?c zcmsO5t2df6Gcm2}6iOpk-&LJ%9`j_9aZ0CZ+ufVgY}u3FAAqDkoxNoSGF5fC3F@~ar;iAY(&N3|Vu zNID`ASVh^|9AD+^Oa!_#OD^->%RBzkq;ttnMvhqV%PzG=1tJkX&qNC^$Q zli|iErFPL)gaGEJ531I1xhe&?pE4 z!EPgTGcwZTRBd@`%H!n7P~J`cH;4LOu$u!#)FCKohn3|+Re~4Pf5wAH82+Qa+4Kn> ze;h%Si!4~3{RD>M7dOF`4~5sj3kf_SYkXKBrVcus#t^}dj968T!bj{M z+mx(OSyA1t9b(8~AW%miP=qrK)={iEAWe#zEhEFO45aWkkRyR`NEibJ+-d={7&x+? zCjLh{!dQLhcw4oQ=4-jfK|6QoIq6WB6r~&>A5O~|$QzWhs(=C7aK{%9g^9p2!{g!Q z4tfDia!C>XtqfPCN{VaLz++C)dP@a(Qa))!d z{Jut!{4_#vf22?NpCB<9hB=7z7@&}Of+C$VG+zKD%nTc1NM5jVE&nF8C?&u3EquzP z@kKTjsa$o%KujXFb4ASh(r$gMqBzXrp^!36`&$0Pl$G#X)KC9{NlARJvoReJV<#uDxJIOdH#s|-q0TV#Mw z4N&8+bufV8Ow$_`M>`bkePe=)$Oel{gi4#~TQM3zl8B|0kezI`m{_K>v}BUH>Zhha zHcCLqJ-gc~Q7)X}?ZAcO__gH?jYAId2qZ*BK*Kwk$#)_Q4MwG>c$$**M7F|m!Z zB@z6k$1Gypp7c=~BN3taq?lCvrx4a#H$yAU63AF#aCVv`g5jAHigiWf;>UD=gF`{d zp5VSL^%koxFpe;dDQv`p=8pks+@Jf+$$3HDQU>Vg`D|rx`+8KwU8uHu$kLW8!Ww9J z9qSXr6hoxdj%}Zk$RvSaPxVjUV$pi6mJ00CZrsVn{`IX(&|rWckAu#~5oAEG44V$H za0%0#j(Xq1_Ue`kql)(`>@=Q{E%((m2OVarI8CG+)kUEb6S})Hs!0j`?#&?W&c8S4 zUS^)App94(*2|bR0WkapBT{0B6oliV6>)|S=;>msnNC^FONi3Kx3;JzBscSNxPVGS zA#@Ht`SS8#8N6@SpR2!gUR=>nn|ckMU|Nx;Sms%B1QbM|WRtfqOuXAt7!3-N@5h;i zAKmgJDZDxnZ_|HU@kGLz0Qs(70@ zW1PQ};j?UtHrqjk;gAx<3{JeG^>L{tvqwMa4sGAu%#b*?5`tjc2fM4fjw+BmzR;(n z&!Y#Tr|lLcx21~y3zf#1m2!A~Reh<9nir`N4U30x#PD%ax4VQz=)l3`1OdW!v6t-S=$*%p-*0Yo>JP3B!#E2!wtEP(JWi zJ_PAeBnIl>7-}?D#avBQ>(*qA`NU(Xs85V!2zEXR>imBX!pm!;0}Ojsb3j_CZJ_I= zGGWhDB2D24iJVcwuDT=tg8tBtFEuFWno=}L5elt`pDZ|Y$v-Nq^xDYl+6iwh;Kze% z6-V05f+~FBMunrcCRVne1f%h9`}PV9$#A(=oAMJ`NkPI?mu;(% z;I?7EFcK5fG?FNiAw0g}cq-$$W6;TjGKj^2hoH2ODaRk_VQnn1l2(L@ z^Ed+re8f|AoO)v>EW6Hjmp`OSzOX8G5M#2UvL6XY_pHq8&qMC-Fi*=OZR+YzJdBrN zSUkN@&bbo`E=J}PBgn$RZD5VStOXXacJuch!i}Hx3;kC%{^F7IqJzGSIXATPJ7HR6 zEl%D=!4h?wfw8&Wb8^|UWve{CzPPtgJbCs5xW{t{p3KOlS+MZ%#FP^<4EuL`_LyZF z-2EIKQ=n8jIyY(AWOuXEo2#K{SdqnK(LezTIP zALN9pW|aDWvu(TO6Px=8>GCRer339YJ0gA923pHoQi= zwt_;r<_qk<8d48Q3@cSY*tb`>kHQyA`QQIq*62kG%~OnQ_^TFVLJIT{pHBHH|A|um zGg*o_0Rvn zQ;_`H3A5B1)?gsboAOL5$d%ic?)bT0p;bkp$}4whjO!9orLE%{mu<;YcT_+@SU@_$)kqCMcP+WE|O3og z4a)>0EM2NHq;r|QR$0eJMvXn+SrXH_woWy3)RGIvZFA+f>GM1}Z~`TM zbZSS%jU?r{N1{#y6_zIfi1$;kwnq^fISI5nI~$w50uj7&9c=lq8Q`PUD`Ai)E_Y(( zPGe2sL9|9HLpC{EwuU~hQv8c4(i$}p*5(x-&XjB@o{KS$8<`lQT9rrE?M!wUtB;rs zw3(Mhn6qMG3H22BB4{O6bJi_yT#Cu7-w5|JoHFoDs5s%6Bk1&dc4hY+U(?#2<#Cxy zF6BYlE+cXf0FmX1C6=EQ-k@%}p;j%w7-oBL!g*dKBC+vlWmPVP0cfnw0!NZJl_9uHN z)qE3!@nFAZ&3oOJ9XWpoycU`Fg8<^ZrULXXMygfx25ML z>a(9j{F0khY1TzTRxHL zvj;Id%;YIDd2&sj<1`l-ofwANdn?VkxLF=y29cf+sHs89Qj%y6D-A{x&&?VqMKVO9 znnOhPvB<8-%4N=7XI-Xr!|oP2CfpgUnZIMm6OrF4PkmOX6Oiy@9BX+8Kr9z$i|h9O zhHl;kWo=_|BFTnkSMA-djD{-SVv}RXMSUXr+Q%h>fJRZ9)G_#YZdZVS5pzktKD33N zFZ~IMXw5*3Brloc!s0XvynQMO60jLPK;-za;`j~T$^twMT{1EtKwS0?W`)z+){S>&npCM%mghNWQx7Ipvx@ts z@n-Zh5z~J|{|-n}9)}fKZ_Jb2GlO|cexgQH8^w*lMW?ZJBq%M1QD6dg& z9dz{FW%R$doMu+vjJoS8Gdu$kYY15AyeU_6qC&Zlj`>>8Fd>cRYY^0Jw~#`#D+ndV zy+e>i1|f5^4VYQ+uI_%_+LWHPV0Z51?x@iXK~0;1eQ)Kgd&>$dUj^-ahnDia>Z5P> zR%a5|=dw|JZanhQw(PCg$75luLmo|KZN+_g_zAz3AI^Dw>ouqMu+3w(*vd70ooJOj zdW}0P|7RxSr+mD-O&&c4i$&{wh+VNDrS9I2ZP~?5Ts~b)#_yc^aY9CCfqFY)j1hw@ zma!8G00on2Cpf_YsMLjFb63-7tGS)3tSnVtt^?yhr|9iL|v;X8T1C6%=HpZzxdVgtMSY;VCBi&hN&nP}o4BgZ1 zg_oBzsy|%1YbXvQpFNYBdS?FoLksr(3;z}2=r`HY&3dAyz0Rca;-B*>(S0AMr=9Y4 zpiFx=dG@GkfAV)bv`^#DuVFglZ%vdrP;;x^`f|Jo=gja9fa=q?+EA z3f=!dwEe$>c`2Uw#8ntiUP@zR&+(}eCtiZ1s#zC(^U$T7ysfnTw!q2dV~2L^oOoyK z;1TVIVPPM-qH=9?KEx*xpG>>f92`G*R9jxLyeI4f_v{oj^#juuIDlC1OSF=2%*fmM z+b;Z9gtts7rU`W@+#GCg$O=K`$AutR2;ZU_4T7nLdf}F4gVNF76z@l3;uTUq^AwdV zuUFq^Tc-n67Fouq>Mo#xEZPFvq%B~{|0~}zZ7KPy#DcT^!IH5WOb!1SZl9w+O(p-7 zm~_3}|8(=b@Rpb@+Hvh7k1(dtScO_b-;h1Pt8L^W$xIDw4?%2um-V-=UYPYr>n1z+ z&n(XzhB8;}=743|f^L~wbvn=anR=$I;vBhxVj+6(-K|DsPZ~1ITv1V7LGWgYvvso_ z#}d1~R44xPNaQjD3wsvVnOQik6Z9|E_V=@NdA5N6QE`cG+W%`&F@ni!qvo&Y#D>s| z5sw-kft<2JRwJkID5~$!zI~nE*@=iPcaarZE$B;^!py+qsDYzgBZf=RA4_3m>o_k8jg^qbM;*O9vxUsf>ctEtLqB+8&{N2_i?AlkpjL{Q2plp_k@p=bQ0G>5FtY5XEAlKwM!$Ei<4eZ6@hu4}!Xx zs;^Orc-dN>_8$TXjPg=<#W$82F^Nfith7*qr>8B}zpR$&=`j;%3%se5eLU`KE^GMs z-VfhtC4Wk!e@e!FCpQF+AWo|#%~p9AA-B{=wrB;$4%vaNi0b(yG?`^4#_4D?xoshe zu)aBdtNJVB*w~nH?U#|~c88A!OVVogP#W!ajS((DNIH@ZE->0Pm3FI{s-fvGNli;T)dzz{dDe4w(@-CkkiP?4MUm|kap zeXYnAFri;$I;Tw;FVdYDnl2&7608e-V-Bxs+G2fw&dZRs!3{t;l8&gosvXEgDHtifn(Ruh54aF$5#t zR>>WtqP0cu)dtTGE2k~ipRFcM^;af>F+x@A_txIBTv35SC10B){+Mi<&kSfCgAO33 zf5{5HHGQBS0X_(T86ELt=}P2bnD+9ms_MGxEpMv%|0?7HF%OC+%LDr0BA3W~&){|`kOYpkpx|&*FV_oa_4`DeZP{=`%d@QQqEULdX$*+rv zS0ZMq)-o8@^g{C@yusY70g%!}g)Sz^H`wm!T5@9d)LclO4J8#|M}imFij337B3p11 zcBxFr=F8<-8wLgdtQlYTaZXPGDW`jK5)@Lw`Le&xADGj%d5-VxIBBB7r>ktP_kTWZ z2^j}Oz)<860Pqx~U0EwNE6dI0S2b7Hs;__a;q`4(D&8*u@C#4*7u$^!n?67ms@1|Q zq*E+XhP5DVN~Hmt9y>K)Kg3yf6XoJ$Ac<*#mD6|!ZX_XOJv9j?sSrZKQM9k%vFr*f zI)w(Q8Z+CdQ0)6s&jOyqB*8+^{1 z`<72-VxB?{CkZY2Cs8g)3dn_(36N+Tk+F+L2go0*;u55_N`s}+U=gULZ3ZICQCC_5 zSopL8a=r|S+JS4Fy6~g~*FIM;8x?KwtEYHHX3CH0@z1%H=$!02vTMGFvhk=*8V#+< z&f`*5xn!Yk7Lk%PzRrN$BjT#m3cfWJM!+r6cMIcXc*%S?Q_y_BD9eto0-Dtu z`UX2Y4c%YXY>1cWV%I5{T!q$YG#W+0J+G!oZEU=>$xv4O*O%mecSJM{HkPTMDbuOG z4u>7=$16`!5_I9nG$IhIb10!xvEfvAI;5{v?8#ln)j03E~=!b~GmqQu9Ty6a@$b7oL>RQ>td$pNBx%e+n_r ztw8f-(WLb{aI9!dF$UOd2Dc9?=NGeu?8hJn+V(Kar=hg z_{z>Hch!EXm3sro^2%*zTxY&G|F37q=T-L+k{{fbzD@D0d{Qxji~Mug=CQ4w#duET zH{BpSi;qNQOf?4vF*3AJ#k?7?@Rz78e8`!{6$B<}HgE|>%qMG(bBq}TG!D*7or{Bx2KC@su&*ll@bg@t(z z+Y~Xpnl#=Sgs)TQP`Izc!Tp2i6iSE(M?mb{$#JU)6j!o~TM(3c>ie9o=l-_oXJtNA zuhCi;SATt0vA_BbYJnn7rjDNl3x(p_1k8ay-SLWOiGVHgYaON4>Z?#Z+EmT?5QkoI z&m9j%%SBvq4eTxc<4r%{^r2qxt17y4Oe$T(o1gXvB?e3R7n6#~0sX*b#g$p!aYm1# zw{f6(eGXQ|ehwxq<1uT#c!*nHAKA!89Ro9o9s@w)fvF6YaX1S}W z%E5=|B2X;sTTWF_iyCO`J#;1?l0MWuwEc*xtu58=1-BP9ijSj8WP^wZG?QoelfW+r(YS~s6tzM&{wc3RovNEgw z_vtcce37(L4}&g&K%s)gLF54ydNTo8X$sje0_~_7ANYchFt%E}`l6OdQI=F@LFpl~po<0*;7#?2ZA5Lo0qvYK&d$ptvHD&)zt+GP z;Y+GZFnm$t{M!2p(cOXXs_w$NI|z9O)uN13XyW#O6cO+39Kv(90Wi1~I17uTAm3NV zCCXb>X1hlvAX-SZALomGh+E{Hfjb{}m}lYc#|zCE?+kLWeA@-rnTMDD^6a|py@L?t z%9N~slY-5`5A?J8iQ}P<=9sx!2>~acSZGhx=9M&gb`hCHZa%w- z;2b=T5htEaAQ>TRPN^=aPJJ0egTuYSot+&W2JBwKFTLmB=uCLMX@HM`n@t^LaCx ziT(*7X1~sgyf%BFE&;Ig#rq)f!kS6d57QolMXl778jJ__Ny%U58{E!)WZsN+w^?U{ zA&u2&*uG6#@;u+@HXe|!*UoCmLo>*(g{5V%Qfo7meRK)*+ei#r$KHa=s8(Y93g)sc@!aoHDVsb48Sq*K&#Q_?;Y&y>>c#;3Q@L(kVfTas#(=#Wq6I%uQl0w zdwR-xP2MT0lR}|8?RJ_ysc8pyN}5-hSIJz+?++e$oi>xXzNh%Pr0NN z!Tcg?W@7*;K-Rxao|9pgI+tZ6gJO`4uosCJt<@vBG@GS;u%wN++ALMz1=mo`OEyhA z!7-B^H4(D*au{Aq$=a=<@zAn_%#TBZ8|Pe(oaU*<_Bx&F!Cn5wg3!O_lrj~3%&3wi zFDa3e=zD8|#4x%RVGN1d0lxhwqq0CZ0|pvpYuA zpjaN>lh<_DPN_~cR_lyXSfdB^$B#)#m-6#3k*YUyy&*BSR;vR5lQ04#7Yia}T39UB z!VxmIbxo^>CRs}&sOBY$H>|6+LVey!3U3y4%Pz<1a;!4U%g(|KS| zX%@NY-FCro=Hci8?oBoMuKMP^n-3+I?p>0)xhn|1GGpGlc*kPH_4}9f=-@7q^Wf$W zhkkgoQ`B`qPx{+zYb*9?u!i1j&L@yJ1Xy)K9xGM7PfgQaz7CZiEHBNthVobV(bWz0 zPIGlR!ey$yZqHuiZftOOF9jrAo&t4pOauoTunCP1b(X_&ES)rev; zJ-ez!CA{crS=cg{Y66m33)@x+#o|+YQc8aWgNmi(CxlWHuC8_b-J`Pd!Gi1Ul7=tE^&kLwsJ z4f>Cj0?GY7pc$XcTG+Y@O}(!-YPE>MfGxdq_o||$ri^v8YS{nyRCo)SgVGS+&+wq3QbWlE)7A{JvpB z&+{tnF+Es&cgd342YUIj@ZSxVJMmo~9}7Z)OD6uk3O*M8-i=vkb?|Cv7X98rgeTN9 zZPj@hIvbV`^D2wtRq;iYykUpjWT!!t!V&HYJ`viwl?d@yFv?0O5RJBMA!)?S(gj6Z z^fE3&^V7cBf9%Zmr%z1H(eO$S0#BeM2#@|Y zbQW6uU^O(0e-G{9TIKUqS+#mo`zD8M`&5Wb8sTGK6gy>?(s8+;rZpr0w5kyVe?VaP_nT0 ziQ(;^$ezf=rC1C6BGSqmxWi8NcM9p$F|PfFDH8dwL6Mc42IE5OHu6DGyC}a$nUxEu z^Q=-rb~g?ZNrr_l352;g3IB`mB9HpzXrECr-O~&08?+evRvg$G)`j_g_26wRLtNd| z2>6+_;UWP^nvG6(*DtGEFKSzK)zi zwbz%)m1RGCkSWd6xSa;M-2%x>rAYd!z1fmD2Nd0z*Dzh)Uh@$MR4?FG8MpJBMLAkPhD**HF!;t z8YH6OVi9#~9^uMPZuG$|=d)zDt8A?AH$~NnW$FevO~%M{uB>yPUOf4Ymn8(MdEu+z)|5Y+L2AlS&m}3z z_l|$ltD(a^S7im^`%#_m?05a~hwDJc!GW#nZAQ(Ck)@hZLt7}cjS>NXe2NSEBye{9e zwq{ZHcB_STu;sK%O75@MX&pF!{5i z=5$I`XJ@5^U)8{Y_%*6`mmKddYcEZNk>rO80ngxEzQR()l$I}Su9tGWwM=N^Mx#y! zAutH)G?2`sl~sLKx)%A`&l9<`PM~`IE*{r7=MYuLv~^X~)pu6dm{i^QM6QwN>hrg5 zTBVn&RA|TLYsD~Z&yV_7!B;BnI7}5E1a~vD;tHx|`CsMqwd?0znI7R)5$RXJD-WOt zhdIhsd(Uakr3(DBs@b5cm(M_FE`zg(WPx{9GkdzlSL>T24TS~KyAB3Dctqx(kpTEdlUkb3dsJ6v$#LL9d&->`i0M&d4MF5#8e z4`{LF0kn1$|3KI7mMEBLdPoe07AaMR%7Cg_X4Q+;a3U4OBRk2U0Ouz=p!KqKv(SIM zMbKQ>4Q;;6`!`T9s|%VcT@00Klq#pF1ms*|N?8~AmiNp`aisrH#73}U@0+-Hx`YGdYAd1Ie1H_X-BG^S>^BU~@8!{w}e$m}it@qn03 zF8SWk{v$ETX^n2|ZD?rhwMM%nPEA+^k|2SSGHv!K_xEqzhmsN`6^JIxDd~y@>~;1! zzz*gtvT`)kR8zgg6vE;r%ZPl2-9r}H{ce=r7_;syogaZKU<(A^}NfF>jpy%vr4&2ZdZnS{mDnBq)7N}j}^Q=^_revY-kWiy6J_Vq#SrWz}I4WAxWV0;}n(tNprn>Ra@=4$~$!|HR zOyN(zV2+>o8vOeB2~0lm;&vZ8s^tYG(;oBNXHwWp?Yt4{BgQ0TOYLV~^&B)!Rfep7l_sHzoy^X?Tc zj+jCcrqI)>!CkEH#ieXYK|V!B<2KGS#zOTMws^wak-H{1Zt4C8M!}Si=hT3D!*EpB zVtJ*bd;7!W#iX=LlZv6#{GVxt{M0pyCAZT_f$@mJhUnH229A)ETmZ@o!b-*BJffLc zqM_)db5JY{W=AB#rH!&B^-; zjj`vY+|eyA{X{TV)eNH8x5+$2q!5+Q+>#uMwcp?0Ex{>4M1{d6x>H=bxvN1)4(TSZn5y)Y4V6hCb z9mvVul7(KCll^5TzvINLI7_(?ug&^;#KdG|k?t)!g`sHZ5Tv0~F!z_;BV{p6OtsB8 zQ&>2Y&a~T^k;8B1<&UP(3- zoZM}h=qoZzZK*ladn6{o`m-)MUDGq0;w0)hzGsMB$~>P`?K zXga$??Ew`kPnlEYR)FIA*dZ7)nHLS2O+%83Zinxlms0fHCtUYqGxLeM?BnE)Q3aRH zctRmAd}$IL<_C+0eRm(ErhS=?9QTE>MJ&p>V7v7<%UV+9}WMxrsDcaN9=bibS zABeW)QfaTbT!loyl93PC7tbTRTuP6O0u)`n@tlSP_da}!z?AS7aZ>7(;PEY4 zm?i=qK-=oQKCXW|R5p%QyqWV6Sa2aKNv}?H-N%&3m?EK^RgC%BA9#hOD)@lJ7^pw@ z5(vE+8S3^qyFMdiu@aBxq@{B4cvY&o5noM@p(FJ4fqcen8Iuie-DYq@;%$Y?JQGy+Ls9itwW18-y*@S z%{O3XK6Z1TaP<^vlUfLma?+97VRZVJX{itH4*NvG{KF>E%Y{VB69!wsUBgNr{d)I6 z6t++)X3>@~BYm*+ciy2kJ9bx!lAGzl%hSgemAV&8zpLZvC>+Xn$kwj}M<4F(St9nV ztm}Y`%n~RhT<&WcH8Cp2NQTJU%YMp69Q22Q`3qZmiaLiwxs#M09Wz63CHO~t+n z_)$Rz7Km{C>7y(Rv)A zN#m=r_niV}C5_J-zcAHm3Ojf?vE#Thta9Y%$Z!79AA^xA4|%tr*1*>whN2G;NvFz; z?9mp3(P*GijAbtP=6%pj?LBG0SZC@o8d0e;p7)S@+M5M<#Z7npZ8wy3RCh3Ze>miw z`Gx#qz#R>{g_I7BgX-_p;9te=>{xXUr(Pd&dJU38JQFz+`G7QhU^t(6#$1>;eDGM& zH>izw%73_-FPk5{f;1)(K8PjZndnDBZ~eQw9DDt{yZer}e+Xok9r(`stBj~tWH0z5 zL9N1pJ4=$jM7>2gEyx9m!v8~H10awo0K~DNM<>%QOV1y)otN8d4Vx*{X(=InSp|{vkb}19WJhO9&9p%nFMeogFwl_t(ErQHK)ZxDmxmaY_Fa#rznVjEiMQ6x$a4B>4$D zwa((Q?00@kl=H`WyT^`w65UE7wdUuCn<-Q;PflJwcWylD%`KE-vr|J`_vf2AzsUv1 z`se~SocKSBD7_7=`~!!)1+V@ze5kTN2VXe*+C+&oLmDOra4)Em3_vOsM|@Ua;Tu8{ zQ(JAarXhV|9HG9dbI8mc^7w{y=y^x#UG+{&PzUPFX_>?I3-C@QS6c1QVlWjTf0vc@ z83jlcf#TedM>E=AQc=;j=Z5nlN=^_G|4EK7viNv5J>3hvl)X$%2(eoo13ho2!%^W# zwO#s;1jlx4n)ZJXRX7Q7GvLrX7PgyP`=l7L6s1oVi`KMx$SAIIC5 zPNg$A-F{B`DV&dA$f6{Z;#>|Bj^~}u>V(QPj=e!{Px&T9N9Bd1@})DSGdP_~J?XD! zkxuB8DB*Zc>0~;K1K~Jg7d0}-erh!%8md*clSdi7OX(C&cc7jmoux@W32C;!XwqHR zm0a#BcUCUkYAOaa_0JQ}jY|*QXj6^2(sYA=bQBOI^jFURN zLvgH|wR3iQaJvBqqQr@8#2ZKK#_?Rz2^?@q`x!+14&!g_r#eiMG^`cosArsH%1OiC zp`AH$fgE0yoU6v+m_O(6I(XS%b`p-qOlNR9$2gki?#=85SGGeZ8kx-|+{~WemJ;e4t zu(f}%!(Z6#ALJy8?1bx{sJb)5tV`Hq!?N?8V@xg>$`8OkzsJ^u2hsbPl+9O^u(_G$ zNu~^nz`*w~lpldz@gpbNb#~k@n{>O&)iob`BRYiz%P}M~4*09X)EHZnAjYphw-HOZ zQ|Ab@lhYAnAG8J+)-l(gOFb-ITc8z1`ZLE=Y;fHgTz>{rvB7m~aP>Q4dzv*fJ9%g; zB0a9R7GeDPBfS%d|m-tVVc66sR4FjUR&FfM=MYFDDhBBbh4 z5ZLQiY)^}w*=uVLYHPRVt*fk7Co7>5V8` zW7RaaO22+e#k~=OWPP_TH2Cx&lj51?FT@z|OgHOhV9?}bC5IQ2(DlU)M*qY014h$8 zCJQ}-HRQRxlGmFbSM}1T{}(^Aj~TKei(J%6vkge?W6%4NZxa*&Yz9&i?Y$($f5)7zf0^Dutjo~ot2Gmmv?VcT{z7|4z zzqaHg6dWis0W{gLX+U-ZFqnq9;cqw@ft(wJ7)C8P1d1JIrnE|2mIn9VU>Z(_dAq;Q z{aO|Ffmh^ws0G$+dV|YZ+2BXRC4DDQYznPJUA?eIkZ*tuhhaCMj{sxS}G@J}`!(WeWp{F#XxpT4mx*;$vRA$3L5~P!5E{oh? zNWd~evBN#Ja;*36S132frd@Y;Fp#!$wss55Ua|o%N@XA;u^Z`i*kSS;5o|HEU3GT% zo~jxsCEKzL6`&lpk*zq)Y-uoQMuL%Ou#Jno(O4O2i5Mu+xM;9535X15vSaEQ#@-cD z0ty=dR=qdN0qzE1BpMfuXd}r;n@PZGtu}@cZ6p~Zep=6aZ1Hn{sR1$)jRfPOh(2cB z=Owuo^I04ISlS2x2Kg{|dckhKKx@Sk49A)*_odsvCd)9Dr~xw88I#6v=dsv>uE4F4 zTI_Vzb@u4|u983+z0_+<(*@?nj%iRRBcG*(2FOS>5{!#Rw9al_NqO!>fQO=X5~Ynu znUM@**zT<)BZ;(@UaTFz%J32`omEKk9kB<=2=Gy&UiemY4|w8MqeiH{6BQ{jb-nX7Ok$a>AEtdT()t#MK)eZ*!_Nz$S3%|7z>> zR6XHYY}17Ufc2G2?vZhy@-1nrd;^-^#B4iE#IBPgFC^_|+vJ7}PJb#t#O`|AGsL+4 z_~~#HF)Ka%kmA+}B7oz@2_Bok-v>fS0`{f`k^ywZgT(GD+YKNF=+4SdCpQt(dO}HY zPXQ4w$F_{y*FN@OD&3ljNyWyY5S2N#{CpO9d06KrKgY-_p~4auDNj% z7v#vFKR67Rlm-}qv+yA#!#TJE@4ssWBkX~q$(c(vPaoPkM*>E8jlZ)(x_lQkc#94E?;Nc3>b$(yCsLo!*J zzcOF`<7qWa`w28S}8{?mJw~P4atNi&J`>f)Ilj^C^1b%} z-L-4SmdzU`C&pKfjw~MR@9t{o;J=3LZLKW}nwuKy>uPKK)xN4qug7J#nhaVE1WLqw zE|X3!=6%w%Gitjg5yILc#^2u8#&EC^9HQ$Lz}*`UIcD6Iy41@VSlm0kAG?KlumMnk z)EoNUBThLw{dU=i3e2HYV_JO@k0na2;#?!lnyy7YH3Fc(D@fnnfgIn#%v;6%M9noI z2qLk7`0yHl8q0gOux0=o1S_(xP>{T&4ieK_PKGNSw0%J@=3;)SB(E9BR3EH_d)fV(ZmM2VGV!vU&aL`tOky=Im-KlC|3T zub9Y*AqRj2_H{kUVtWGk_4r;zz1{mlrQ0S9TVVJ+876_=fcUK|Lpl*Z;UJtnW@?%A zQUP^ir1V4|u?nx!^J($mtlBv^y|xg{W%f(#@omo?OBTQZdmnL!nD(gmHn=gVzp!5Q z3v<Zr&0q~h*cqkH8m@G)PQn1!?dBMu@6b(VO$zV!O3R# zSMXec-iJwDGdf^_rg>CafXS_rORc+fgG(QI1fDa%i2o5IeED(v)JZEvl z0JRdE`=j&O*^ydgx$efak{Px>X3!5{_8{Md1xFZb;we^bQK2S0Lkeh&wH0%RT$rlu zaaDzu>_+}wBOstrW6zAoJGHWrYF72$e*-3ENrVx_vNIp^O=t$u#9z^>@wmcXLE$AFt!4A`TRCk12XrzU-=mfiiZu8!48mhTw|U9W3E z&PLt7^q$i9&)rsQ?b)-w-Y_JU=y*gCW1thX)jaMp9TI79C7}3@HQMI5Khs)Zx4K2^g5y8SwN`;;e$}ZM(M)Zz^6{4Ea(x!aVu{ z0U=WB;u%kgJt9ZUz;Hxj0HBn$`)o`8rWFY$A`_imR$%V4Hr`9^@1)LP)Fgea>R~LH zju9_wl+FVCl&;1W+crWyd*rcJVew=(K!Ln_5mbq(TO~1+wzb?~v+@5mNRW9nlLx{6 zOB}Y%q)phGUC0ntIBskN`MBKu$TK&zo3t^_Oup|7*$14_Yjb$EigMW6tOyndy)8H0 zx4_m>$uXf?XffpwGv`?VH1RKMyD%a+}93-YS-HN zvwG%gm?e}s^?{5m$93Q{fnAV+99{Zkoy)G`WkWo;jg|>tHz_3B zRw;H8X=m!CN$eni*EQUSY7VtR4HwWE?zkjwjg3TG6E{KIl1YSqu+9o`2^=wz+k(rN zNx_hz+~dAXDPpAGAl`5vOKP?cPa!^kxMWMjP*1XSx^=kSbvp}ARYRsx@5kUMVWnp_ zWZadCBc2Jr)*YF!MYpN?x*v8*WpeE<>?nk-62Xq27jEH)Xc1JRbdzj$U~?r%K>ny4 z`cCQE+4kP|;ZS@&PrNNBuUIsW0(tFYpKuv}@-n>Fb>)n-n#)J|*sBG-otQ?VSkN^T zqP1Yhi2%Ju>ZS=;ZC2!6QHf|akf7_LiyzB2# zV<@EJk6;P}Dup6?yRb5YxXdQq6eyxcW!?mPJAwxJ8V|4|jO#gLQ!I2~DF0EUIZta1h$aHD6Yu5#dAe%T z6{0GE$mo5bCID}q$pP{sv6Qmu&m}n8JL6Cfb%%1{5p51ij?x*hV!GDI(+^f#!;&v` zpS?+qjT2xB>tZ}TOSdWxYK{(p6HU`i#o=-w?NrhkZnFWgv<(x-07+3ogx(VSaZCNs^SbqSH0b1WR;ajQUK7`!zAK72JJjL@mZU5&xG zNZB}Hj_Se6riC1aVnv2DwW8CNnFKq1mUZmnQ7U56lmec`>`rTlcxW*>Gg%sFtD%$X zs$I%44iN{OvPWQT37BwBrU7Vq5g(9c!No_5O4Xa{`<0hMam59tnVePLO$Ptj>uDBL+ZLu;63&7tSMy3vO0Mt#jmHPH9yw`>%+9}VInP>t*)%hk3xrA5=y%n zaX$#I8wMCnDP`V7BL*e3-%~}s6 zMM9yq7Rq(xZex>s;vL!PRtE=wQL|L&bI<2)rm%fh)J2x!2%9;w31mv)|pavrVa8bhwXhhug zdXT-@-6{?6YETE3Kg}jiw|x`<+rO(m*!1X+5QpwZJ2Gj0L~>@dDP%j*`N&UrOz>b; z>q1C*9!4xh9%s*UX5<5qDW?}#{O>|)&|BaG2=lv47NR1$lnKp=7QKwBs;7;*9)~Q| zWYoZGMU=g-e|H1IEQ20tVL@VYzt})=_=8DrB^M_Lj|Sus8p_|2xq`T*4LTrjNa;?d z4s@*D=qLB7P__e(1N5W5e2kHzSM-g%4}84O7^NOaT0=WweOxjvy4~ZW|D5KSrLE6| zK4z){)yBStRTg?rk$YI@AGSLvqb4;!JBERczBpiKy?ha8REyMwT{C^9srqeos}{V0 zaIO~n8;)UP0|~x&>GF7f$gMICRk3;FF+fpj#?;!1+_!Zu~74vPk;#bzFLrx{u~{Nhloi#hEq2hCl&pru-j*OIy_ z%nQVekpouPU5TBH1ggUu{pjOt~%w-eQIrKOa^p=9!VWh8s9Bdq`W z!M7(y5z7ZWG`!ov(cnkLsC74T0i(Kq9I@hYEF7-@1|e=uV`_Azyqv7Y5hN zX#1nM@mkYed!Ss63|C9%3IwLbY5;VebKIlDx2MzH`Jgr;BO(oa1e+uQg2?Y2*YR?P z3Hjnam`(Hb3>2vkNl=$M-Qs$Q4Xb8%LbFthlMA3s?n;tVKe$?hdWVNd9s47!Y*aUq z);#t*)c1Z&hjk>=18K5o$bH|~ytt^44K+Cn%F-WJf>D+<7+t|}$(Qvk{ICrUD-5OE zR=_3~s0dY3RoGFvyp@%W2Bxk1I$G$Xr;k&b#6w$Q6!UH@;%xn;uUvJ(r3WG*fhrDI zeXEuzs^_LeMnucq;0rX2P?hSIM&S|dFm8lW)JE^|7d-~@xsN4IM;m*gQd6TA>Nk^R zcON%4Oo2FbUP9U&bhC~Wd-A;)c$!*4IuK&L(C3USFn_;`Ma|;S@I36KU5hq?uq(?#E?L8?1i$3s;-u)NLr!glyGM^ikz+jNg+908}5dyWKK6>E< z7}1~R=a0~??1;aiZmJayE-Aqg&M<1Gv;y4}XYgbWQQmdw@1}n6lv75A^@_ajNCLfG z#d+uVd1t+lxxPhn6bEs3(92Y~31x8M^YDGsbuGl85ZVR?NScTA<|K<>Wd zS$}hc!DT2Jw|{5Sqd`+j2!e^e&Tjsovt{ud&K%ceG3A~;uVfY(cAlsev*ecIf=9te zkA-+~@wrpBV)#e=z~sk&hf^_y1}(Ll9=`iNav4C+R=@5Lbk9CP^rEqTvYch4xpmEJCWKNIs#a>; zOUvooBRlue88FS{N(qOIz&1hx8a4m}qx4&>=r*`_8}x(%r-(z5%t7K>z)3z_(zp<> zjqt0Yyujn)02)-+d?Ua)>Y%niLHFIqwqMGjDj$TdIbBm?#(e5Yg_DV~>3=sxr@U75!`Gs0;;jebfWj3nrHFO2F@7&&gdm`O=tpfb= zvt*e1t2LZoFp3)d4*~O0i_<&XM z>TMsUl$9^1KKB<-PY-BtcC_*=E>FE?!)WA!C=fuFSip9%A7zyEEy~2R-4+@37l>a{ z*_*gBfcxn#pg={ut*I}B$Q#G#!goS7h;csF{SfXg^3{7keP_3%5UupN;2&?>(B~?wwygIL26Kz(@os13V zhn2v1%FGjIL%>S6Lsky7p(+SjxmJJ+0RfVdO)crz)8Un~A=h$NxxXyP4VA#Dbr^(4-Waai=!#wMCl{(a`mJpTApzS9E>2 zp2nTC*loJBk;2DQyje>uVp`7PW*2*T4XnODY3=WL=*B^Nlo4$De%g%b+5tC zoLOjr^m)-p5%8T(uPxs}enNZpRUpu9C^u(j5k>QY8xk(O0=d-EX`?gGSUQR^zGBat z!Ix^6gNh`poF+piL)t6R_7Imd3-qi~DG33){?}PMA&?TJr$i{0xel+lw&p@jV3CMz zkllE&hEIEH-UPY>6K(S9Gr(cDv#MV&NdSMF)R8IT>27;6gEEiUb&w&xw=*U^-2!0O z+n`;d-3Q9|22=>a8Q&IAmk**_Un0=4V~Vdu^6EW~z|y+;m5i?Z+oH2U?PsXVxPrPQ zDY(QnOh~D$MVW}sFIqT1vg8kJ^5O0U!xTw_{8rYJ>ndM;I1=hA)jc^^ZKKN7#sB?b zvIdL>)L>Le6dm$cT!%38*Hpmx$I${_%>Z<1BieBV5a*j5sG5yK)2t&y)tgC!f7|J5 z90D!~PFtCV2jv`QHq}1G}b~%f&BV-QI&4=c{1QTSUU8gx|axmq&?Z1tC$0 z!J~aA#INrvJ8yNq31+;4v>U-_FAlYuu~yK8kU34pSBDKd4VP_Wlr^L2KS0OXRuGu; zbml1C0`&c>a84I!x~7(b%^BtGOG;1WQ`S*0d#z;C#2lI0Y%&E_a1Z< z_5h;Y&@l5EAV{VKA~!0O5&A0+ju{qlsYg(yXFV=^32k5Ab%QK(1PuVY6aJIV!vDTBc{ zP6OoCj`i6k6ApT7?hpIPA_r+LETJx)Q}=f*^$4}lhB)v$Q;=zF|rvrnNScNN6>!=EFbB_gm<+m8YH-A3FQi5S<}5nDOcy_7)16 zw~bB*9kbO$Z+061fWW99%{TND(P9B}$$30m%TaJ)Et7p0(H_Qfv+- z4L|Q5OiI)Y4u6Y4Vx-Qk1hC7?8p5>!;rYhsw2UQz!s@c#9RlCHdC_;%KU=yb4r(K;>_F_WMS}78%8IN#y-=sw%Zcy)lk^i$-r&{I%jg z!VOKgo6vO+=EEF$Bx?YSgxr%5o?=dlHo`d<**1ae%gfT_kdC1*EqhnquM+(pp1yih zf!R0ggRgVsRUJ($Y^U|Q{~BOgV_>(aQI)!~w?UzyWf$B2l(*r>ulAPDuTKw`=hNsc znxPXCwR!D34e~Vp4lM}Hj@bvlh-k-L4hl(7^Y`zM5BHg>+}&Ipl`@(!%KbW98dLXs zsN_{T<-lAZI&B6RWfXZ3DRRn4HqTNK1D5G-yIH?!xwKsF_o-cMWt;Pb8dayI3iW$t zoQpN;oujP;-IdSTOUAbjl^t+l@h4v}^?P>31(ZKEn=I|w0O#5Q_lL5$P(Kn26he<@ zaCn~7v5|B7eTs|7ip1woqe+$&qdn_7$9w+tD^Y$iKC{KYYTMa5mrmAUZw$J0lBksE z&t;6H${}imW4_VP|4Zp9%xy54bJc&YuvUT21qT+ozo>vgdfe6+HvT^g4hH9{eJ9(E z`Xyb$cq{ihpn8amb43>%ryU5+_ot1`7-SiGHt&%HOwm~Cve+v=-nt)IrPTnSz7zL+ z4mlblE%WkB#Z?7*e z&NG{ideU7hr-zerQp!qoP4kLEFX60LTAJV-rpf&@W?vq(blL5IvP_+|#DfSjBc2M#RCM0F6j z3sZP?8HTBjR=eg-xbKuy43{i54Jgczgb9CO*!_C!UY622~1;1t;7qZZsLyUu= z%gda&^sLV{f*7a;o0Y`^WyqsY*s;B%3t>Rbvickb&=#X^MMJg^(Gy$#rM3E@ks2_5 zwn{&*E)~x__Mttv4uR4-5ZL@dHUJUuj_9R!TYZVyY{MI2M}<1WB@9>!qlHQ8z|z2| z{Wi_i;wMirT{sLZXc+X>D-5?;m1L5=cBDss+NFN;WM0J3^!U_;>CJJCWQxfM63wi? z$~le!gv$Qvc6emrZ~6TAcz=C)nEGv=eD^$A-kDODmgL5S7PL7J z38`)q1F@b*+i0k^wSfqJVu)Xu-;fnqZxDTIWWq8%P6l)W;Q`nd6SYpV#-u%u#V(78 zMR{X$<#7g4 zdY(#0l;>AOh$Aol`(qjIkPvdr=oH?+lEc~(H^e206>{?M)X2uSZ$NU{pg5{Ve4-6~ zf>J@rz_)23A+$LYw~Qr?1;&;Kuj&*>Hc6C8YIlj1ZEK}74?#^}78V9-tQn~?XhUij zC&^%l(JqIlQ1SeXQvi4EWzGMW_4g->E17OuCt%Hq;uH}SW?r3!N4P`|0=(!3=q0gT z&kq&+zfR@-+9pi{NxCv^3**$J5epiw$c;Uu26sdZtKB}L3xYJvF%T9Ivm}rXK22O* zRIw*x>Y6)-YQV2-(!9gi5tL0%$>?l=m2ZzD`I z&P~myuXzqfv>yfF-ldfix5wejTIfm(A zGfO#Huu-U&+i8(yeud9ezRGe)u7j8HP*c<^ zJNOdN84!SKUD2N#n|=`Be~;uMUIXyzXZZkleNMf+vVIlh-H8QA!2lp2Y*_Pw}Cph2w0E8z7H$xfjN@>{+tk|tVAGTzZ|Y;JgctzS#9rP z4Fqrt-n!Zy%qtXT9;hFK=xJB_;l`2rJZ>x8s%g-ZOoov0yv$%B4LO2JenxsTwd z=mYf07KXH7bwrhuBpp;;h$gAj^P_s!B(Ku!Rh-99iC_=)dH*J;ftbdo#k~>1znPB( zItHk_+}PK=3p{2etnJCt+I8%z1jvsSR`xq$RZk@^%ih{n@Am7dp6m`KZ&86RYQISz zZkM{UV(CP6LkKEv^H&!c7Ny|vH732wtQBLzpHa|Jgw>ZWuUTwr&Zz7IN0JGQW1zZa z9o-IoD>~+Bm-M_$e=?s0t92cWpJH{1l6j9a{Lj7*7s)3VGuuE2Vk_F>SrKos%V*bE zj+=tm6>qR3osRV=N=P@tXD`p@M9hK~$wlCBts7&Ra2k_m#JCxrl!~K{0*DhV3^M@> zDfEW$l~@{h@DYY4C!5_q70@^y*a6Av;*MQ|AdMo}P>E{tOu2$}M$Et{NFG+Qfo-f| zoUKfHQ|P}=@L!DQl<-xX5{_I~o}ASCGp3)&k!0@hivn_}A&*tMsAn|#I1@4ClI8Mv zR=yvDk}uawxCg&Y5$mCfqgFnx2K~RxDzS1+>&nK}<^P49v%)^U46Sba$O;ty@cFk) z5a73D5fDgxfK!5-$Q1^Mgga?52;Jz8baC|d{PW)y9BUzhC6wPg>AXUs} zDx1pP%td&%o4GOSlg&KnP0VIq3^z7N1f_=bvf3o z?I5Q@{#S-(hjDkv;R#ILBMvP0L~h#@M}hHwDW~ym0^iHa3FF6yufq<(^$PHEkG9<` z$_YyDf4)NnM<|QH{wm39j07&T>1ps1|;m)9p{J2oE7{j2=6h4QNZJ<6jI?4#?E z)pqiI8f0Gw_hiy&hA+6Nxh6Z$6zB7=&86}?Nz=_>OPQik)Qh8APqJo- z6~|vn;U$=jayh7!E73gjS)fXdcLkCxw8&!A4eHacm`^2=r4XAsB{XcM8BMwjv|`F) z(erfVpdDA9d*)G{U^hmJiv9sMnxT zlV&ZJYSpIQG95Z~>DFVp6?(0-N}tvGt+Doc^UIAku>>l&*m~{xlO1+mNA|Hj_S$DZ zL8UnH2ltwqf5V$b7)et}#XPyU)OZ3r@y31v1PK((1j0#HHfyC)x*5EchRIOn`|R2m zzJ6DF0elC8_~1hUMidZ%xr0K5In=bd=9zDSg;=oc0DmgB#8Rv}Y&q7BIP9on9ktRb ztF6JNQ`T9JZD+9K8u1Ev#@>I9cb@LjT5arh(g~-W`C`@)Lu9J!Q0jjU_E3))Vz2rO zW-m)#)Mr2Yy5*ol4zu4mXN5c8h@*}*A4 z>tio{bTk@cC}C66kSrxW)+x;|wY1X9C^K}J zvciT7AEE4W%8giF`4vQ}up(v_E=B#%NsAsMW~|t8;>L@gAYr1!0ZEc3OCHD?0?3e+ zkL2E%p&)C_sZy;%rKeiQf+o#qP{@@xmZ{SOvz?$aW;lqdt7j9$BlsQYK zS+ixYEJw~1C8zR` z^yzlgRLfgn87ag(UIUSKm^Eg8*i3T$Frr%LSbF68m|Q(o4K++_;KSHL&wAdAUiPZj zz3FZ5df$gW_NmW(>Fe)rNsre5_SW}(>)D+T-gYsVkVvQNP;&nt8YY#}X*#D%YKgHY z6Sh-(DocTFJu57{uH3kg>KLfDhRU^MceR$q+hu1$t#;;VE=q^? z3-gtUez)3Ym9%wJ?XW14^}-`vg9)XdKExuTW4<2iY0Wd$!La&ZEIA;pV`f}lx(-MY zANUUVr1^4X+|K<(+c;Dv8O!36aZ=#~f)6mF7%gX;R_5B~Q*bt&`L3BU(`P|+#_H^5 z$=Nu}I4=;c`$Utj7lZ9r7AA*JLS-T2S@nfMapI^}jIRVu5w=w|eSP!TdPUv;eZ?yJ z*09EdS>(}%HFv~>GA^WwJ%$cokUox{Ma9UW_3VO{sgzPPTA@->4ONANX~llVt^rKR zwN$YplyM=IVOp_`UQwL0z$>B03lUOtCD%&zxkZF($d&23rsEA^`xQ7=;V5wcFBXM4 zyoPPff?R0$?csIv%(0U@*m5V;@}`=>o6apXd6#i;1v|^6bl#gX{x|?0_>iv8t+N=% zDvo}JN4yp)CWzIzInq=@xh6vrsM0_K{b!WEygYZ})^YC+wK88uS!33mE2B9>C-KI# zd3$!9*tU1uWAD`q!7zHJ%7o0=F)(Fqmhdaqc<@L28cJi;#1@^2AXNq_GL@-BzP^Q9 zxXs^2Kdw-FglFq%$2i2LTEwV53(pd*Z1&kL^&6*cbuE+%29a?wX*}z6jiQHgH6pxy3 zydTID%eE^&<;FNV5fTxTl959UGABwZ*b^fu894>z*BH9snv9qAJ9ZlHaDqDp7xErD zvaIf+mI>ZPkFAmW^qV>pkb}(bD7}!66U%FUfSi?FFcva`rN*F_ik&R%{!M7H!$QmPEM~-)1uc)m0D1t?a`H9c zT|u{BAC;;Y*yRLv;I}yuhjNJ68JS-Rjnvcz@9|6E5$`sGO7+U}5_3p#4sIGdi>;cxTM#`0u+vv{u1u&AgQgfbp6_6{Jzgffmh z7mE{Zhcu-z58a};B~)zg=)I@g;g3C>ORjPcpWbO^*{50NQYPB1arbCpBLuk!0)yTY z=na8@pf?P9&ma)!4b960uhgJp?EoT7DB}@Fd#}xuaUqpqTJ4nbn}W|L)O6wTy!1iq zxbRif6IH{lLf2r3O9MhKKwX+vGcT{-MeM?ccSbg$5p7vhiVq19(}+t_WA@1iV~}}9 z@Z&}}2KnSA7Von1B8q{=8+#-pescwtevgXhYNVGo&={d!4i>Fsu;GT~Qq2RrF_^IJ zV5Elq^OZq@{HwP2J-+*&62!vgxCnkiS}e2;ZZmW(q~yl3+gNSm+nAm$X=xOFEkOpW z_t0^DS&C59@pq723SP~lQs5eV4`9HVJSAwe^EwXmX%^W+-;ujLb$b{seiY2^9_EMy(W82QoQrrHWMiDvRE?$CZ8Fv_8}0!&=(FaJ7z6m%O0bGrPU^CBJeN= zhTfEZWaCp!T_hZol#IS&O2toavX)&?_S(RTt#O^N5z*F+1=S$ zSzo2Iw2+Xrf`T*v2yg;`0RR9%ohCp1|F`iA3E=?%h&cd2q#^(?G3*|N94#y$CEQB%Qvm>eX#oJxEAe{K%$B+?Kl1@${b0cUOMstb09Lw| zhCjEIKjZg5*wMfEi%K@u_6|SK7V(2Y`VqYEY`~9gG63Kw0Kf%EU&la4M@P@*<7oDV zC~NzO0)*in8Vs*xd7cAP===D^dRlLw198L~F>95mwRlA0a z3d+=92}eB>=4Y4Vxz`Ty(iU?~TE-l)ExBq8Z_rS5W~;bKf9`F*RxMobuG-0rd$k`B z5T46Z@f~?o!RDtJn+|uUSR-~^6QNudpao z-Vwgo{qM=pYJLJag4b6lBt}G68u~X^=(=PRtdyf=)dE+zxsKsE_gQxpB{${ThpD&x zXLKTSd_lH9=CeA~yp^tSR6?}$dk}5ggOMksYzaqmS?Hl?=;maJcC$F+OY~XMwiAa= z8Vu?G;8Lq&0$FB-kS2gk@*%4@fw*&1!v0Qo`ywL+Yu!WZbOR=o&<%0=z!dbQ2A>kl zql7}j{$96$3@Q*F>qHRdsuAZ)7Ujq}35N#I$uS?ks6<_d&sr>>v)%vUvjebA(pD5+ z$HS@`8|k^%u4qjY;^r-EMTOcjrHr)3V21*q9x@O?j5{!n0XL9mHiO$mpU04h%UEaa zq^WuwFHL+iW2Hx8{0n~PjzHGfCtAIfwW29>Z2g9fn9d*C8gqesPtNtdS7e54d{SN* z-6D-j_iuEWa$OMhY{)Wqo)sF~h(KMwwr|)J!nV4kBrnp!*dH2_>r`inY$_I1I2$^a zgY}7}5WAMTM(~zpxE%jN~@akj(95rflLQvJanw%+Pj3p;(29J0|$$018k1H;Z zXwl!izPM9fOFwv%-=%w^)lVFn&|S|(E`;hHQ75Dg(?VD4Vr<=h(V^9ULK}^4X^h)m z^*%j|Y3;TZs}NB05G~(vR&|5CvklvR zQdL0B1=7t$@tMU&u577%VN3yr3nh0nvaL#{@@t z^P;9kFtbcKliRG{IT`k@J}ip)OT67$RuNWaxB2CnUXu z7mDK7eOZ%OQ~c4lGySg`h5KrljY1Twn6HRS{}|^i(oDC8Dne*N^Oz`Qx)+3`vZaT= z_x?B)e1^~!bvF&QP}Md?4Px`1w>u)E6=50witU(aRR?jh=@YQc&m^;&9);^xq;mdr zha&g}7u|%J`=6M!b-x|u>sxrtJ?!m-N{|BqrSk>`@Ja+7`>&W~bZ3~+(=*o7yD*5{ z+tafHoBL-UJp!GJ7S9(H2If%;M%s&k@AV4b3JL}ersMmYq5QL1-^5_6-$umOSC?KS z>K1<<2d}WF2L`Z+jPURi(q-QUXwkcm}JFrQhtx_Pno4FPUXI|luUajFMfsh+eoUvp{$eV>er2bp*fVa5Yu z)Czekqv@tY)T0YAEB!I6Lnq=3-m8NVtpjSQ3;wJ3=cn&ZFnKO2^#l9W)En`Cw0kUe zNb+7JEc1uacH##ltxR^jR^b|P>jcY(Q6tuNBotpn&a)_PhgM5{2hO?%v70;yAhT>? za5`E;>9h=&!NwC3EMrvnlbpTFgr!{z4!35}RMq>iS@{MVcVO(>%)ZYiv=eRE<%#5p zW}hDyC&ZYljS8(Un)ZXR#Ym2e^BN$AVhLu1^WgbKQ29ZJ`Ds$SYqZ!xNZ)e$2_YSb zTd``4_GK{2S_4q|koFL+xypOdH8_bJ3C0NlY63TAv?ywdk0|b4s+$pdT*tv_Pk}DV z0~`uP)B%T1|CUpu9Q>K%e)GP13kwBp>M^ghx}6ARhI4O)D$hdLm4GCg%FnLQ*p@{y zH;O?CWNJ!r5lmdhvT@T9c;_Z3CY1;-tXTiz=Am=-HVKtt-1WS*u|5?B?8!gwL&}%Ixxi{;ZI@dp^=cO|)O3fEOAqIfycog&YTQ~=D zPB?--W?d~d%6Wj75vA>+W_^?#3>cAAC*8Jo_$!w=-Ndrb%>^s`m}*g($57SNESoD* zR#H0XK=s3h6+%l-HxD>3Igg3lPq(zL<*$verO}R|TH>lY?lpQ8onbYRme(8|%{Sbf zgWK0TPvta|u>ZI!o7 z&kVsQ<|6i1xH{WvY_;P)Cvr92qP|ADCb@<;rjDlA9cv4l5imlTGXG-t^2^?{zMa9O1D65@y>3mO|-{NCznTllP7pa)ih1lE4&axk2 zDdxX#@NEFBpa(agx+uSDgfDH~=dzlWL-lCZ#-GYMt;v#jk;OsQ_0}zdFY7>@Mxs{e z*g=x?vsaZfhPgtQ#A}d@-w9?r%k_p|X!I8N8F}p$#2JuhcwlEF7MD8PHkDSy z6z44*WkJ-d$T13-)XE*rB$+s{8gEKPQO@S#gcu9|be@ViyUhgAN$6rBr3?ye_QEXH z`6*T$86}m|U*CgS$M&py473y0C&Dn-h3;eRAOs)2q-DP*UBAZTI*@di=iHHI-<3D) zDJGqH@EC3tfZ@ue3!KIBdCHaYBf^U0XbI9Q`HMw{mjy!xxZryEGR#skgR?>A= zmTOj$r8R%n`vng`zNbD*7V010tgo|*x z1ioIHp}o!@<0g9s$v^nAyKjZcJx@ zvOzg-TxTG)e`($r&cJJfYTh=!0KZAjfNz5#-D=W;ZSR9e^hftvd>}^*P4B6m(DYh; zU|958_cDLrTnyv(I(_`P=-2L*`oPBOZbOUL%%goh}eOvKh zWrO|f_YTbYjn@(x+$+xkb+uFb!uLk#5>dPddCG9h`tVPyW`8z$uk@7ScIBbbMJ+|e z>P*kwgfJ;^2w`1JKkP8KcHn7lMeo%Vs}_W@N(CQ7`hqr+Mk$3Dft?R23?(OY0B&wT zPtXLhHlMLnMK(?10$q|?DXIv8U06O0rMPrJYGy&N&=jK<-bAhTjxlq^HBGDH*Cd`( zoDp(4A48~SQR*Q1ETtZrsZy;OWBN)kW4nrC8vg~AeTb*PeHc^G z>p)lW>mbG)u-^8ZpI)O0eyy~rZmm#5$cl4AiHfG0#07<#MgXGYGLrd^mwk#+gfteQ40;tO4yetH>2=SN>s6X4)^eLL)h;!(tzogQ{AaFr>qVbH*JeBvu28>;RnT}+Jq=Kb zQ7}goAvvdMSs+j1;e?~2rAv#46c-x~c;#IV)X(nfEuX~h;75f$7aR}R&)@I4p0ezL zo;2?To;vS=o<8php2F|Bo<#2jPUxX$bcPD;shh$K7+e?B4mQuT?qQm0+`=+;y}+gM zctA^%c104SZA;pVI3ykkX)$c;C%KlbP_jvKpkz`9O)w0^&!_5*aENmdeP*v9z9p$R zy)~`Cxye+(a1uHN;h>a@M2BkTBoCa;j_Ya9QRr=+1nW7U;_4xtWbZ+qaMrp$bh)s- z30MGml4tc&niG2Y3?Xbw>xbd~I5+$pYlu0jWZ~@q{QS#aunBOe(G0Rk>9>D{X>63H zZxLEGAH!dycEm|atwbY1<|n)~%?|2GDy=Y7lx)H9`~cO4*d%_}&tSt!GOjGJSzb2Y zyiW&2;(F!zS48X_Xu>sNG+jD(qD^wHG@K+8G*0|ksd@|I*>}by0ZbF9TV2M+7pyd) zyhp}%7w$D+s?~T?a0eslLUE!tiDXfSBzEyS0Vj6uW)F>#1oQwlIp?WG)`xMw`#XXwLG$;Y$N8HZ8~rC{vNMqSdy_a z&mYp|KYJE{|F`|mCZz@dAomBF{TV|Z0ZBloMF!MdJN-9x^4}cFJuAU9F9NVYgj|{1 z;gcjA^J!YHS-2AC8q4V$_q@k6#5Tk3^8_-6x|aatH22VV$?fOCGcX3XeWl24Jx*jD z6Hrf9s4N*Vke_dG2m;6+KfMTaDn1Faubm92883(l7NI!Plhl|Jd_N@u;4-=Moh-FOw6%_t}!oaA@gkxB29q7 z1cxeDu_4fD9-mDV?F3^p_xK^o?*tP%_|OC^dEcI1YCQEHZt?+?Mkc1cxYhJ#3mW{+ zEJv*Ijfd6%g$w8PZofxZ^_`{H2+a#N_>HwJBta};5n+r$oRXa=FB!gJVckLk@thKy zIQO5w`G#>5F@kk+%p+3&@JJ3iG~(6oWVA-yA!V0tFf{i~5hV*#8H-V8^wgxvO*Jh` zGaHKGW@XuAjnBn4bJibyvKFA-G_OzPJ@d66(|!Mio6u2q5!E*&4ce*WQ|KmEW;Hf# zF^>_iSg0GVU&LrOoIj0hsfE~6r-kpwwM$gRl<%Ci997kyUkkO7StY5TF}HwRMYLby zw6Rdngh!tty)kkH)9j7ErgiyR@3X&lc?D#jCBIR5HFIB0zhQpWdLMfSyow`m@Bsb( z1q7I6TFY#;_&-_5kE=`$k2jrr`?$nF)$#F?LNnz8G5SZ%fDiS+sKA-)f@1|i-vF}u zpj}{bciBG%NkdA|!I5;KB!X3G(NKHzRKO^7VJm_qYfzketX9CmcOkHX8Ehe|hBaM~ zX?84OZlS-5Mgk0wqvPZ-#w1!x@Dg+G6e7>$kjx}AOGsb~W*GyIX5`j*+)oKLbHS14 z+}{RgS6F`+A7W{wjN718^-s2NKJNf=gcaXtXbqjaVB+q?dxTowB6&^WzOaACoBTx- zM-+n+rCBAcMvk466Ezb9F{QpND1V6Ur57U}gGr?sH}JoRueX!d8dXN?{g*su=uD)c zzdR3XyT3`p^DgHbkFMUz}irCd;eUkp})Kz}H5B?tO)scO4{I=*7 zzkMkEa{ra)y~F=K<^AZ*7#24)N0=siZ$ejD@z@ynw6M#jn0$t@S>gT|lC?P%X&Rl#9@g*^b?G@3hSK zuHy|1p$9(dU%}g(BOt?tjxsSdSLj?UMP&YA+}^gPap=0Ez1m)V%`Zxt%rnx}`7G5V z?y*#BPfGTF&dt#uI?8n&X+)?VX9x|lT7^VHXLg#Lnw+S}3HO&>!O_^kNG*R*97tVO zIli>SP&qo-n21_XKd7uK5QiCkO@ew+=C1~%xNExajjJ5J)o2SNs`QPE-*7xMcchya z0>`GFM?-mA^v27u&HD?NV65lI=&-~cUAzZ}$RY&hgu0>D$!m6p=x?Fy+^*>wK-%4O zQH^%bM<7G>l8=M@*^_v)x!~=g*Mj9@B)DQ^f3k>lH2r&>vSPPzfi_LJkNZ>SxK>q{w$XRiYPa$2wzFLGwm!I*KpC!P7%nCm+wAz) za8tR|o-xZE1B?g?m`I(Zm+w2xb9-izic(!AD(8VRusuap!Je4eirIo(yTT)tj(;u~ zCn17V&)=;F8FF-GN_Ug_zWhMp_om>!CsciI%ag50@s?3xL$k+Cmh3xL`&TLYU<0^Q zHBvt4PIr45-HE19?KLTgO7hJSwOqZ%lQKTZ^BLOnGn2PmhT+bcaIkO$YPbNa$-G`> zBi8|=Rh?E_*dmK&SPr!coeXsGh0KR^$XXe6#P$m5>MO_EWz;RV5Wt_Md6I~54(_*+?n-_d9x~( z#={f$2pD|dXqyRBrOs*)mr825p zpAZG0zbmEp!=)QSg4^-&kV5>%?>}v6rSO?<#mC31fc%3`R1r4Z_58OB zLu6Kn!LVD__E_rEX+S2sBH|Se&k#%I7|PR&$mW7t;-fMV@>*Ul2>;Noq$OqMI2{#> z;UkQfr8upJAIC78=%O5gvfa7ZJG#X}0`({pF zNP=Jt{ofL3eos|_HqyU_zY8e+G6a3&7N_V}-tre)P~K&=Q-8u$HMq+1dJT0ukN!aA?Ykmqd`V+1$$N~@afWZK|H8>&W8c!P!cm(O-&mFL9phsW@-s`Uolbs4v*f3NCma`+hd?SpsDpyo+QyM*i zj%8QZLEE2q3W-l-5Rf5*z#K5wM}7yvg^w2yfTAlI0zrrWXKJWQFVYzbU5g~?;SP8} zjB0m%ShAQ8-i|GH&icqcHo9d*wj@6^zcfEJzcoKFA5&Od{5H(I;U7AcPk$=g5>yZx zaR|pOJr!EWGBLVVhK|!GUP#3-KZ_ukRIG0ZOwb6Pyg>{ZJwj|R!k-Btu-%565>-yyAKp^T03NaFF6 z^o*W?S?ttJEw*UQAknwS&IAKaN#`dk21kj|)F(v?56Z;&cUwS}?y5ou*>=I$pzjFB)Bo?wJ)IyIA2s zug+NKp_d$uV>zp-scpQF_x}6giS@FFMqW?-j{7g}q9!g8%kFVOO9y?)+-#60T@tlb zdwvQgh5NAbsFhT-T;s_0L~F>^idE^!+Vg;_YNX6zt{Ot{fdIn%B<#f%f;`Qo2_dGD z{5C$*15svR zqzs1DfLTBRqt;S4J!Mv16pu=g+B;=mLplX>fOUT&^R$2dp*%W-#-Vhn-I?_>-gzl; zM>2KX=go4Lr=7lsw(r<8!SQ-G{#@_I0j7b#aasf7Hh~FCGeT>;;3w#v#3Xh^xMBqsWd(3)yNeyZ&bMS;BP_4@-8<11 zeau+Hm34wqqbRjVETM^%qlt2-aayUevz~5B*5?$Tc}Zt^IA^6@7=@x~xvFW!f@ zACli^0Jy}!)bY}lKq%(^eh7-Cg+=XmTY(kc;n?saK>*d>sXk4~P2HFcJ zf@A<|2F~x-*gL!9c%v1NS7Jgg6mqMVwL)?go=qP+L1R7|W!IrW20#9OmuaT}r6{u~ zletLS$Wy62yy*D|1Qf4_N*Ss6pM;DR@p#8=BaGx0tgAPBZE@6*T2pCx_VN+HDM~Y| z{z&Jk**%j@N{vrc)Q}J?CeLIhmT8I?S=`zX!8{MdCfpP(*;?2U$7&}`Ie4ry7`4n__mo=>Lj4eKn{0}=Byom)w`<#Bqz+=)PI??{9i|8 zood`h`sN@Xq>~^ahN+o}m}0NkZ+8|sGKWP2%b2E30odP615crQbrF@VB=yy^#eWP9DQO2STy?L6WgfjD) zqk!kR=^}Q2oyfReJYf?%%6OZd9dKdCWV!fp1E^pfF3O+1E&3uVeD2yFFo%S0m|%Es zu*J(xaetkh?(%2GBU{&3o4})_n3_CW%Iq2im%cFgluZIz2ie}VWz1+_dR6l+%GljD z-1)iKWHe(d*Mmu3)3ySbZ(vl=KxG)j?3`sJZQ<{x<{8>LX69SKVlHbRRIvOZX&3nf z;w^0nSdVV&x|}MN1qwc5#ti8Gg0((osO-rvY6Ox}^f_qSrbg%rxKaL*6ct<=c5FNS za~-f3471(FH_UqB%Y^LTHQ^X?(fy9B;)C;m4|MLJTb25BPVt=1d zoI+aAjPz+Q;!1Zst-K&t!sNO@ACMwx;jMag^41)2H+0H!p|s+4ouH?PIgex<)oaWC zRijV(azNX(6UnI~wm5$2(PZlL*eVYv#s#x@g{r*xe*`!XvTpH71uI#@^RYvLltHJJ z`%guG$!2|kAiZq9brv_AmIgx;zBP_0dW{@-*)f`xG85`$J~xE$A9KZ8Ku~?liLg7e zcJC~_4gMZqdV8Z{Pa>8z@;6!C+?G3?&I$V1swYMcB6p>2V2=i30Oq3kL>K1^L;{b} ziqku^{!NZ%!CB#g_3KhM;jlFcmiRU^e>KWYY_$}Rv$bgIAg!;n$1BTco^ zz6^%v-J=*QXF#r#$vXAX4`q7VgyrJz%_5O7NR2jBUU&$eUesS(B%5x##I}P~r)z^Q zaYtj6f`0lk6}REf7v(^vZDiaj6#3nGNj|>^Sb-qDlLiKIt>=-w?U|44E0J#ymePj( z5oDzW`8^3SDYa=!s_Hdh6&9+(qArXN7l9s@N4p9Pk!uHrI1g?52MgJ( zkc&C^rixh7DMXx@zWUPRX$!Wx3zF2YPdu{J z+_jvBMIt#Z+Yk|!(B|HOvPi@f_~kTi&9rNb}Va*%@duRmn@s4jJ52Sa0x|d>IW4ba60%=)*8ba++DLi(LR#xlJy>C ze5F?$zS22u8Xx!$Fb)f*s?kl5_$9C-2bRu#G-|=n!L-q+bqgL zqp#*5g1ob8nX6FtugPtQac#d2PHC(!$aj%!wIqMi1bmMM10UT zgvV@hLVjOBz5dlz_vm1Da^HAj4OIr_ur8}NiHH1vu$i+({jkDh)=ecTHaALY>{a`KVr!3oe$nk&zfEMUv(luNHqKWidlJA-L0B} zMwN<_^|J#y>gP%Fmd$G1uy;E_G)|QV;h!Qv-!k#K4W&xqF$MpIxhhG=d1?R=m|6V_ z@*i@gNpBYmirqfm1_#GB!ITxJ^&*7pkG4U1s12Z_-wxWx(<-5v^8RQUSl-$icU~a9 z_G1f0LKNUyaU4Q1aIi-m?&=o9>AzZyPtz#aPv&ezd{G$&cYf}L*nMs-$ZGZO3Pk#f z7(es>5bQGdHHlc7gFyIFq_lNV`r@NWoxW{DFp7E6{>-ViF}U`%D5c7pP-~i_vFPtI2tC&& zGl4C_YvPkjKeGRwa0SaJJ#_o53Nh|0#K`@$%<>Xj(+4~Oab2Ty;Atb`j1Q*>_2)wT zrFucOmW`a5Tq&kRju(kqE;r={6taEQpWSPt*?n0U5}dG$OSfobTWaNUvP{!h_Vd|I zwkGo<081)Nm1KYUV#AYSPQMVs^B@h6%4@J{9kHIb&hr`4lvPoIw4dc-wBWN_#ACkI zJ>WV;{BP3*H(7tP#co|69pZB^=|LEy)P)>b-Sr`{*BAKTZYT-lCqb5R0RBxAVyPKb zw|its64F?Wn`guATv_n`I$mxhjqa+0fslX)NiIu)Nr5oL+Su zt}A>oJ78a#8(oa{ej$I~!GEm&sV@*YD&G<3w{@_+K%rDsv>L;yM$PhbT^VLnaOt+5hr$X3|uAOA<*DP=q5|+>{HTz+YD)t;&rkX}0K;9#4fS^WS zlIf5+MQ3o=71qvg*&VqasRqc90!w>xyh!5K4JIOEBRGgWezbM*>?Cs%FiAf2fi# zVD~hTAS?ou$^`ToGMip~dDzrQE7dSYF^C!AXf`++Ix`ZP=QtBGhj#o(nz6~H-bXp*txEcB zRl%yqcAebH2>GzSx_PX471$($!`ggFC7`m(sCE`V{^D%2-*pxp*Kcw#>_GsC$0-NB2 z`V~Ug;$u$whox~=vZ?y@K!Rd<8Gx}#wBbyWaAWJ=muR9@>TRneNMea_DYsi>j&ZZJ zl+uz^U6@_>&#n*M53Yje?S;>3qRY#P6dO=yveC;SAcB}Ut9yWoX?w#Ap1Hj&YtA@w zX=Qe=!XKh*c5tz;u6KozTeD@~~l%z5OhAirI1bfjBu>#3K#-*7u<+ZNOI zCb;KHkCmb*w-XzEJswtzaYa7r6Um{86*%WJd z@*zOZhH{Lpt$aZ)F(a5-+r}0S4_4j;+fh#{id|(~79|{~j@}W^)Fl`!=ZonQqTZ2nLwzGO=`wS~G?RzwXyWn=#-Op;LT+Zlv zhR?B6lVZooX2+ANHqi0%3)xlTNMrf5DUs`RNBB_R`!V@0wROqFiH#SXXW|G9#e}hhi3LGer(HeP15B0 zAB6Xq*nxM`@6xm|is!|!N#7Mm^Is5uJ8h%%C=cjwj+_2{ zE4a@^6(f65`9297p}b4Y^o@FnM-C(U@%P5HAA%ag%;ChY#Spz^78|Sp^~12j1g-7L zFc$m8{mOul?~&LP5_MD3)onYQx{3M2(C6-F@On6Yc*sE0-ZGJKx@YHV)H=}{Mm#@m zqiFv}3BslkvKkQ%EJR1hurNAo#nSul6Lz$rP;4Y)nyK1ik*jb45%|0`*PNCsdjjk# zR;L0Ds4#y2?J1J3V7VDqfaw)WPB z*YNF^@7x#%Or>r5=??haMXAJjt2=B3ZP>l<)L(=tAK9b9ki?5-^f_)AlPOYq0ER?u zdt%V#lId{qi0xJaI@{x@7XeQVj}EOo+6d6nIgH^QbQ1FfgD6Uk4%^eXEsU^lbFJFi zD^H~DU)XV^MDPcevxg4q^>Zkd^qPgOdutKTrGV6Ba9)Bg&PuFjeO$g-0T#N0x1(Y7It0)tAroGt;xiFQCZx4Rxxt*Va6pNPZj#SqLBB^B_}r1Qxa+Xj;6AA* zfrT9cLd)*E!rfZQ*O1N1avRn7VKEGK(rj-3Qv1BZT&A($0@EP?dxQ;KJF2C{LfnTq~WC+F2b}kD%IB=|WWX z$h>jBBOT{{>-0`+5=Q2r8oBl;j`x;|A9N6#!%s<-=%Y)?UB}Q-Iqj5d^pmaC27|?+ zgd4_(`6MI18(wUiah;{EgHj7A31)|HDjgyr@yBiRUGK0zQm}oC_d!l3BL;R^V(Q^h z<9>IZHfokHgkEBD&i(^*4)OU>Ux{d~BEq_hYU-m2lZLoB*`2^=W$M;IrZ}Z_-)gAk zWNrq_)a4?-@~RSFY4!9?RuwELI|2yn+y09FBLu$sM7mE`XSrTw{vYzvEN#+xMdiG7 zzkB2MjOJ(I;a>ZkyAfXW{%qSx#w`14+2x*`DE>WV%A~|)tZ@gbJ(4UDQ>~{rhfgeC z3?*NnE+OeQ;BboKSs)$xhdv;6bS8zW|J;)(o_r$KbRzL|LfmM^7nHvKMeV3Y=156} z5W4))xVAz^v@XuDu58I}bpmQtPPg!a)XKV1%&DGjm7ipFTx}KYJPxFm7fx}7bXZT` z?r+mbvt!fPvxT@<$katlHio0DSYf6ZYCy2ZHEwdI@X$XNl(}$$DBo3FzP!|W) z|LM1JyZ;+)13g`+A**2P%~7B+na_a@Pw&$OqgW+sRVg!xsX)FwI|A`W7v`JMdzvxY zjl9m_gQ^1n%zRA?RS`8CnvXSEwiCJk^y|j<9P49CTwSl3yuv@+wGC=0NTsEW|;L-i#w3v@P_cK5an4JQGE4yAU$XOA~I|MJF zQ}{6r`1T`8c7X=6qVF@g4ji5${ifs$6>R0xYc5mKJ3u|QcmTl8dW8JYS;lFr~&fIf$H8uGw5^mjbwaRibP zI}KYsg60OTG`YWTtkxq-Od z4{x|3h?6%bFI$Gq6hCz8`au5{R9sNpeVlQecI?Y?Qn_=v%Xun(m-zJfNOiY)lkYXD zJ)phLJ?G8Z1IG4i>6aInZjHE&=#9gT*bR7m`Yw7XS)YP22K{`B<%BZx1hYPPJ;loW zg*7!di49#997|&Qxbe~b&ERX%htU_@x4_6>2tJ7t$_r#TD3ZYTzcfjx;Njo{@q31$ zi58`G4XSR`6n03ir5@s66@(PFg~fGht@%bW_9Y=0vg_sI3p8iik~2`Ih7DzFz?S7r z((O5)(1y^5@Vzs3c>caR%qsBA{+Bu|E8uXx`a8(1;MBgtJAYh2w@&l23eXnIPc|R7 z-ZVaacrhI#WQSPyOHETzCQ^^Y?2}#BI*hvLztuvBRDu%CP#VNk%PR<$AkWht7pBb8 zo#5RII5)fWw41Y6xi7ilY|_~DGghbUjEn7;T(3Q(RFYR%ZH?th3r0nQw4sG;WY+S@$gk7Xx>|UG;gber$j2Cb#(KE3)(Z-R=QQ0w<_wDy6 z_Sg4^_qcVWLilJ7bg@@{Kl$hH5VoLZIgu&bB5gid2{(7M_huekQQ>_X*Wj!W1p)(n zs{X4eCEfgj1J?Y%tC{kjE1y5Y7;4sgPC?M%Hz30NO?6OHz)^h-bud>zpM3du z&{;vJe8qo$5U9Ie=^IQkA7r60e4oCA;d@S7$HT) zq}ePgb%-jFDzz;yEz&PxFLdA0-+|wah2e(Wezij?sx7Fg@_FVK_SzS==TOBNYslK~@#eVL7Wqo;liF?3((7pGK zGxICM_uRL+cZ!#imD&aWg;3$|0lZ=GR;}PFqJ?M^jCxk(0J9N$J*pE|d)VeAj_!1= zbgNf}FSPAnmO%BX%cHG(&=+csDRUQ!?)2`l?PKj5JGF1 zP^u$sb6y~`c+Y=BCDP%v*^RugDPAc#Pw>v04u0z));$#~HGMUVnTDhBwDwNN#Sd?D z)tLltClEWJ|5S#>bUR zB?9_PB(p0TCZ}ieHNWt0oD~PT5=9|3K8>VELCdV#(Ntm{6HJ(8``#rZ`MP}cm(jlk(v2>s&5ohg`$2KDFywJ?0N5W6G2l3v4q`Dsk-Pu@^2S2`Joh zZfUp^*75RV_7oYLWLcAmk=Z8CE#lOA>g5)!dVu9nR@?)4kJKsbpv zeKrtZFDisLbW%k7f2F=#zot^|RWdphAA({m{J&KTk>Gbg?P1;j=yQz0)GZ8tcZ27G zCAHxrt1T3b7!b`g3RKS*=s#06ofCb)!fBtY?-P_dN0FD5CXBR3!A^g7LF29 z^TNZnoski%6V2DLH-q<9%WC5!{!rCrk4$wOeR(L*yTCj%VDH73>Zq~y%{fe*8~NS0so7*?MpkRYl>#^^&i70WhPH&ro;!D*dzv6;PPMXYq_N@x3u-n!0d?SP(h zD!FirEXm%DVUU^%Nn}UhkJq*jix=%DR zDr`9768GbmcLhfX3}5ldU|qmeKnRB?=IXcP8St~RRStL1&Y+`*Y3 zE$_PUt*!Z0v$-p)%6O(zMC}nW+4?M5guUdx)qVkRnlCKN8~0*j&fw{gh1h@jus|NB zsGx#hUj*&?27iY`Zw}-{FflFnjkH~G;W~n&khGNRJnqkW*GbS&Cm&5BkU4*-;6PP^ z(lY0Sx@bCi$QyI%en_Y`AA{2{=TTsQz%>f{rn>F=nPHp7t-KO>pgnwd^c)#{1o3(z zK;$m<+wMtW#sW-L^{NsnAf&M?@y%y^^le?I;Sq}5Qyu$U7A+q9)IO%a~)PTgGSVcYJ^{1fEb#KGZhRJY6u`D`Klr z8rBFLHSRYh*OFst5S!J*S5^~K?17XyX2PTUci}{XSULk`&gaD-`OM-h8h4xR*E&By z(wV^4iSO7q8m1FFT`yps=jIb*_kjk1Yp3(;H$f3PiN=wRAy@P(@hlilaxyzAn3(U< zThr@v8Te7`el@Nx+EDoLA+cGmK`;E<>5dhFme`+GMwxA!l``eK(_qy}GJ0T*wJcWx zh6JuH*;f86$O)~eRc)p@Y)_WL1J9~HXGTiqW#8zlgal!v`-5DKihUcac#xO8z+hj# ztP$*-gINuaVZM6*IAeSGu*)vfqq{asIsXpv3_r{^*GEp-u(ng*RzjNGFmP)+NltVD z3bb-TiWA>yX?LahPxud-#5oCq+{=a2%@7u_DDczXv(@Vxw(&S)+H_}8?%p;heH7`1 zj5EG{r)TO@$`7??M7VSBnA9em?ozkqiq2e<2|L?6Cf?EYOkg!OXL!nf33;wa7kq2C zC@A(I8u??=z}-vRJ-*h8FtlXJ*M}MpB|#{hQsBK{%H+ieXIJ;UZnSgOsK-I*v%1cD z)=@jx9Ave~w|YHxQB)kUkJc>tTXGr9L%ohZ4;lM;F#F$%gMrfJ@kNZkXz4_raj$tS z3*a#)3g5)uw3Po9_D!t=eQiyh@x7woD@?cXk{VxDcK(W8OZkr!>7lF=BN^W!Mu1cCLgE&`98)Tq@;mOIU_1Xouz;l8nKOX(3+#kkQ_m%>+tMY@*{J9>(S;)qK769H_SZ|h1npv9-HX3p#Jy(KI31j->4=AZDYz%vNS2t1Y0z1yQuB6~@5#fb z^b00GtuoK8>mS&xQvV|U2hI)s)f?>;fCK9QDNFts^t?A3nkBZ0+8*$R!0U3zo&5QK z>=J$ETM#Q`4TSG!$lgExBIrIf4~O{=aBMKe;fdmO+zj=PCh8mTkVzkA(muLhP=}vG zfLsk^ACQ4UZ_$JFJ~Nsgp+5&P%wpf4DMGO0MN_S$E(V{qY4u1jZEm5fZNtX~x3Oh@ z6$}~dDcGB$>6rW0L&Qym5#AT`9z;VhHPtVdH5h!&oLpn_8ca^(b-yACWx%fLLc`ft zMb5{@Cfo1Ud;)kOG|e2=G_%U(ZdZRL_qi$#tPsDVa;s`|^;O}04N>f54UVOb`V|G`~5g`OWb}VmM$2jzjq#?R+qM(jxwkCH2x(|cDb-mp=2`sHA3we+{B=4+H`3$uSa^tG zG(192q)G=pa-y76c&Tr3ORH8-;ZP#XgwY)TXz-;r7WoiCLKjjm5C>_hNAScfID!Y{0p)l7E90kL6yW_kqKGLFz) zl-TIE^ur7N9`#rF0SmuU=e>XO^Ejik+Etm(XO>j8XUim}?cLk}_Dioy_t3NG<=$P5=ldDXjwLr!CPC~M- z<~9*{WZ4qms3Gh%a6?C$#zDYqI7&@gpNF#?3TOGzgQu>`9C{Y6!?Iv%vh?g3YEbJm zhd--k>-#UYp@-kOOBR}*f$$f9#R=2TmYxMdN5YugDIo%;q}WgWCYE{iy3Af6M#Ey% zmEVE8d3VufnI%Ac^&q2+iaB&5-SN1$G&kz32H7Mb0PzO~YCXJ74 zzIDjT+K=A|GMlxt$_gyhU@pdErJ{tsEFocPh_lzt@JLW^E43=UKusyK42V>-5+243gR#SPJCP-Nf%6` z8M$9AG=@6SFzq*e2_rOGBp5^cq02PYG{EC7cVFRdS%rZ_6RDSR$Ynx+LvWZk=>Cid z`FYrQ9Sn+G2$NE47XL>@Hm1Eap53f2X9$|e7LgmFUWlzfdV{Y@bK$CPYG{03>I=6T z4;YJsOMSCj8X-1cBj4g+de$4=8LIlj;-03=Lh!Cv$u}>U0c*ZhN9*T;6L;E9<_zx? zA-8lGG5oP`eRn)bD>XY+L?NDDh5DXlDCMIuAiI*irL+tk)O+P7*SU3 ze6wBmrl@*pe}e9PKf=BuZJDCiFQI%iqa9q%w8n5~S2fd&d`q$?tVMEt;=Z zKQ6MBNee}08?Ur1O*kvF_)?ABI#rIZ;Us^N9_xoGd6cr(}x~uTpw@eVU zDVfzm+1EcT>TKb9-XKcHQi6`{D)}N}1Oy;lN7A;YA_hvwSzFAAN=AFe(;{#cf`;`} zvdZ<8l9kT?nTsN_)Y(-4wtw2Bmr@#yTQ=eEQ&CmpOk^Un5FNNvRi0TlNMoj;q=DR? zAb)MptuOL--plZp3(*QxQR+{&3O)A`VHT6TMI)P$CDJ3Wr6LAdq~tY}&z4;Ewsxwe ztH`CeSmKzn>q)bU3_XRP1}Qu3;)#!SJn#R0-_Jw+ugG;gd#-i=#?8BSfAvCAxZZ(B z8y&ry*B!D?|dE9bLhmrg~?6HqhA|3F+vvXw#obi*4w0%JTO_v zqdkP&h?>W*(R=K1k;_NeOx+fT^N7_P9(vC@;>#VA4~E?-7~r0(_xQo%BIL<`+vJf1 ztGsYozdv6wf!i|RF}i}n6{t*av`wA_RB4hehi@4L?xl1GAq*8X(S3uwS{v{EqwRrDB~V}veTOB$}B`3f-m|dM{nUl-(_Mnm)_rI;>}p!DM*AM!UfZcXx2da63$`zRMAZ4zm_1V1-R64z zm2>tLi^O^3$;M*E<0?Nvt@liSQVip_dy^Bd_Zv=rzu$1hDLms1f88DBO>Hd@X*O5# zbyssCH@W)w4)syMKG+7>0nOlM)!=5_X_h#J=Z6GZ&5Z)Co19|SO=enRM3(?6SLdwv z%t3X|I7ZKM0e!m5R4wi}g=bbS?g30=j?p7tt!S^7sl#O1%Fu;8S&li`HcWIjQjmx)%?cF@7gTE}Tey{G2#U30$ z^&;LB1774Z{~xIZIn1f~MgeAjlH%#9GFkoqYX$Nq%^^r%^{2iLSP9N}v2iGh&$uE# zwDy#;Z(seBY0SPE;9fSEm($FkPGY%lbsunAK;5@HKAjPMvM`1`?e-(3+0y2^7rqxR z3oXf`$32s>6z^V+#Y~}v%WTWu|AotrApMZQ^*B=+Hgj<>R=JGJgQxPuIV_7aoaP!K zi+JW$x*!m5yO$Y@o@cCrN5y*2=)LsZr4IX&kIM9!K$$#~Q6{g7Q+Ni-D=GTku|iHx zX|3d&^IPG~oc~2H8=5f+ozX(3uiET;zK>eHRgE(W8VmetNLn!22v*w4CaFa`4Ab&Oh)Hvq6WQYEBKNgEwys7_U|r39d}yGH&Vl zy*h5K{IAAoelt8V!VUw7mjboSCE&sD*M5&Sik<3mn!kQ1o8m(M4^5@fk#^3wMQ}g9 z)it?;13&bn4*EfxIpMFaf68wx z%@iQmG@GvntaAm$FDVNeD)bZdRb#O}?I&t{UdSt!zT$0x`s&Y=EVIlIx|ykZZdjTt zj5QY>eH~up;hDlu2$f$mY0H~sva&Ct{%wM9kMP;a>bAZPP5opkTHS`J0`&?IuLA8B ze*Sxy|5Y)fjY+#=W&rDM^?T04t3ofJt^T{V@@Mnjt*pTl9$H#?cjgIRxj>d9=I)Yc zt5dCSuRxK@)i8vz(8K1?)4u01RLhSw6klw1&oVkh@$M?}vAK^ZV@jEyQkU*z6gl>;fHijAzDtaI#{lwQJ(d-2^Y-xR2_ozuIkqufK8eU9;ul(2?$B43iQCM;mY*UZaP8hMhIwm=64lnf!58CL>@3{ zC02*Ts>e-SPi_DgrGh3lBLcf>CSxac6=(tb#$Aa#U}E!wcREW)WfH^#-7%uQpIC}X zZ2yHVpp}VQ;Y^UDdqM8zLXf-Kud6@{0(YX}_%>?Nu=t8&g zK}~c=<-M<7;F5POEp}N0H_`3pS~}CTDDja_I!D$|)W2%o-zqm~R9imqbX3%;rp9r? zimpZAk)@jzO2TxA0~G1O{5yz7(OnM8$k!Q6-prj&Ra1_CPL^hQJwWz|QP5FIZ(Pk5 zhrfcik~67ZWKt`(0^K(X4?RY{oHD9W?SiS!qhiF~JkS1pat{{8L1BXu$6hO*?!1AI zYfG*81`{j}nlTE)(ZbGtJxZL}t&j2h^d-N(uE`!g1$mn_77Pql`(aB0{(ng~>jG~x zupNT|GDR3V_!}}s-K_SdoLO=y$jf(}C;gA*m~#6biba0a-9+GVEI?KTsz{k-24H?KL=MjCuE#SAv$ydOD**_lFd{;ti&_cN59gd{CPV)9WuxiJWWFzU3@UEz)f5jP>1|7cZYSu>J_*bg5x=mYnB6}bLSB2 z`&@|&uu)d(?_22LfKBetGh*gyvAcDZyuHkW^YC&Sk{xC)ZDcNHWL%@~EwXkpHE(I0@) z14{ph32S4|TT{vcj^sX4H|cm|fru_Y0m0b3C&k=yd9pW_I?osjWpEkF;24y_v067L zt6X||i#c@M^l5gpPm{*zP;wYv1wVgP`F+6mtfC9?>R5Zl)!uM+O36}M9@JZu`W|yC zqaBCtSLw@2GkRa2<|xeHu>ZS=o*V!D!nrW2cXU_Dm+U%Ed2VvwF!R<6)l)s63E%f@ z()!23v@<$Nia zd9JRrC`Sz_2tQ1ZN^;i9$ zpOA|DR!}f2eKZ!DQmh|jG3Hpgpdt#=7IPKvY^4PubCsnwX2vsQ&9Ka@NpQ#t%N@B@ z3ny2vu~IQusZ7cj()Stu9idX#v*zb4JZFti8X@H`|AtDRCdpO7_DSZK?~}j2_CU6S z%Q-r)CS^L`^5^HoqUFKTdu{3doo5=Ee_|p0mw#eGRwI7*j#cvK`EmJ!$@ak;1Mh!D zO`<<3h$|?X(f%eg+Q0EKEC`@)0D2Rz&F>ekV;SC*CZNJra)MwVUg>nkTIV*=a$La6 zarahejaBF!p`Kq2YwtFb;bmY0`oIRx6h!a8>dzI>f`;TM3f!!@N{;>7arMsYHEk#~ zD!ONx7PfZlQwzfbX@{vssO z7a2|mgIT+;emVQ?aA{2J%qjIHimXLAzA9z2M?z}{Py%W@6B3YgT3x<%PlLul(FIaG zH~lG|>DDpdWWSmpM$Ri{iYK;0JG&2k?U@%NXf>RY>dU^-^Ht7xF_ncOr-y=*@q=gl zlVSq$CI~VRx_<3K=46~}fDPeBfIDD0^@C{p|=@ns|8qF+(3KN4ZNwA1c5$Gx5?7fD2`V- z?bS!(7+EqIxDc>E0W=$sIRGq-R#TCO=e@*uQ=S}F)(MogAwYRH1Sros z69oEz^4C>5mOX!~T(b(QBi#kn@r4Vj1I-wPP8bkclcA`P?JE*hI0Q~r4MVCb6{)Jv zCMbHXkoi7{`92JMXDBm+Nqh}UjsoNaK&}AfOgM-pwR!C7Eng#O2)jGWO>YM|D_Qan zNEKPE`Ttm(y*h%H8E5!DjBcVY=_YiE{}c+1@(mdCNboD}>F=b5C0H+doAKl)_`NOJ zvsQr=&s~SYG51J8b-k_Q6;E`xcWV?+gv0V@$1Zpiq4Lqgyt>4kl6%$(nV08{GkrR6 z<2?IurW?mz95~@Vr08+u)y4viy|MPv8)b7X?7Mq0VmFG$4hje=Rm;ysv-X@BdqI?#w-H&YU~5cjufrRa@^{7sJoxYbv4ZeUo=DVa3Zy zuhqxl+*aH|1obQQ>8Y8JG5nOE_J|J(zma45(XxcJAYb*eCvCNhd-SW(nY|PbE3;$c zbMD5^9EGukBd56!(=Mm_>8np;9^o)ZK zA7LSA7l4s{mQWm_NX1}FC&gJe$0N4%ydz+l@C!S(oE3=iG{pq;*#w({6z|h^KXhz+ zeTh@lcX*ywm##!3s71oR=>Q$H#GIaikbdjo!*r+b`iyhz+jks210me66n$)<-91^< zD+qcahoj;aj>v7t_gEynW@1i6pSh`dc*FU-9|WC@+2y-?!v<5*>2VKe5B!Ul&=V}W z)e>_pF(Eg({Sc%ayu)SkAWc8Fq(VW}6F%N{$*4*$y=@X+0{w~|)6@xI3m<=GT>)sY zpA3Wj=H8RTI)Ga|IgrPa1GPM99?OpUg(c0)c+&eOOV|f2`6`qp<8JUoV+fuMp}~{W zS#q<4B};=@vg4mh~1B8FVs10B5Bd0|yC@5v^&HF}PL= ztnOx-i?ok|$py zKs~D`5>!D06cR(IT?S4tXuMtw!_9B$O-YOr$|>j`fb0xRl*1SI_VQS-!1`%g|4MXN z#iCUrj=}0+9NN?j(qtZch%|xjJlRj0)aA(@Je5BnO}M9Zd3Z?EMp#fK+avCj!vbS* zXO(UzqY~FkZNIOlZNIOt`a2Fh=?ZNiKz0oR|( zO1})=SHOo-6X=K0vQB84E$YJJc=|BeN!k+IP;K4j?Ic}^ZRJoXIz+Ny5y4XTlF=#8 zp#^-E(w&SZqbGK!&Xp6N!)UGQr#;nTK#fTiti+e_oX}RHS2b}EKhU7|l|5*HyIL1O zMl-53gga6#i?4;ST6sKt#gVVX<<+_`uPX1H3(X1CLi2FNtB~xRTJ(SJSwSDARTi*{ zDY`ms_?S7fhpZC1EJ1JN1&;gKbUdGJdl|S^%ftb-^2_I`yJKHo?1SJluK)IBQ6Hv(w}woq8D>qp*$CsTdH#d?U7OJ9MYn{;gi ze*@n*KUB+LLaiJoWb)9`?*aUB50*SIxejev$UDf^9+K1oz#UZT74t4-B>DP?mb@ia z9DJ-%Y*y-(WIizyzFwzQEfY8T!Wv)PelnB8Kq%tMKvP0A`AO}eDRjTEw34(Ra};_i zdND^yPtxwr(tgl=fjMcaP{F!;%kG(!i!0QD;sjVnPt@@OhHW@VCr~;xM@6e8^ zkokv3GP%`3a#5kLN|Ow%@~gCa02>~FUzy3dH;0~sXAQ17XZ^U}@?!2>7t|ZFhAUQ| zIJ`YnQ}kdgvv%vggPVm>+4~RT=TO^JFjgGef8d8-GT==yB zghG?l`_Qx!e!As!8+w+hAJ~Xnx^b|ph-_!b5~2k;Oad3sLO<99cJNhi;(!|*N$tFd z(a33=Ba#nlV_?66jA6)k9omtv1tice#|qe-q>J(AwdmM7ZGY5~6b;BLK@GiO9;|VaJQ>%N0XAJV7F5?Ttng|KluufoS79)`!wip-5Kh&PE#geF&kxn6Tk{lFi*MFn^D zLnu?$PH~G-U-$0^3PsWnXToAkW99`<))F;?)Y@{y9GVa#=mI!_d<6XZLz;XfT}c;$ zt;Af5&m3F*7+7fjV=`Y!x^%H47-sUgA2b(KXNkl8I*~qn#?wDqIUGEj4C9*ih_+M9?2{(

>Ts6aV=7NQ;S~7>p z5aryBu*l5AxF!}YR9y2pv(&@XW!9|W{@PKe@jHNX;F922Q`KFORAQJ#w75m>6%FsW zw~RUvI>B*hPmU|zF~kGj;as6A5C=SjS-vvZjZf}wT&}9oG&~;S?O7IN7V+o{9tiZY z5?22S3>JY$C4#N~6Es;(Jo+J$-tf}t2?uFC___UkL@*!N z+N3i{+hEWjkPW;1I0j#l{l$G7Ip_~OiaA$MH!<>uk>9=Qq$Ngvwr+0g3p#4l7?Vz# z^zTeYkm+DTyun&f+Zg$uICbEph7ve>bn_XFu9;}TLFbG|54Eq34ZeEia2XhB)SHd` zOS1c-nNK7tGKzE%eEfdeuy)P1brK@!PK;qJj1$xrn~hS43wO>xnbG9~iUmIeFAvqIF}m;knKKuD+I3*pkHWf-}o-3Nw}&g$AF#@Plx9E0U%_#3f9j8o09*yi4JHsqA$n zeDzoko;x|{SxQzP@-LWS}yAG5K!y0i)fCOiSDc4=yFv%7Nz>6=+wB zUvMx^dF|BM$V;b|Oz7wCV7*kUDjCVkBHw{38Cv}&PkPREhuJpCMN0VQ`=W@};SCx{~$)navOtju}0DNlVl39x1gH1=P{(>@0y_H;cy_Eg)gmBE8vGp6JS30K3CTyR&xEsot30g8FL{t ztHkuDJqLCl(1Ha$LX8Y%R;A60xn-Ih7Mibx(UruLAuUHZbh8TeJnbs2g^wNe{4fzHZaFuuOl$PEd)35L7F@pz>zVlG40*k{exLo2% zO?w{a*1BGDvbR;kVLU2P4jLZT=9++6q4<4)+Si+Xx|t>Obx%0(Wz@eAra-A)@{AV; zZp)tT0}0uSvg@J0EQVgi>TqvXy#!IzCyDZtGY6^JWX-S4f9@4F z5~P#Se3E>4tfsPfb(bac>P52A%VdK>*+UB!*677~^m0OxI@XAaWAv2#{UwhvA&+@= zxDlXp<_rqBF54uG$}IXyp#EWEGtNpcu<}18Fdmc%O?1tWMXU{F;ZIqNJi)^Iox0K(p%2sIMgHUd6GHqWgyXHqZW9Od1iD9PWZcO*$7JGbODT^|J1{cF14!Gn_)Y;WiU|e*@T5KcuZ=Y{W#*CZ6vSjG$feVAO7sZk4Eef% zyGSw2B?y&Rx~KYXIZQ2oQ7x;gf#8~|N8tDfy{&7+UY8xGsKoxacO`jX1V%&h%-avKCq~*sw5^1a@#~kx?lr5i=bfXV08C zaaL3sc4uF?41({=^I+c_o>uS;LS7F0)}ga!AxtZj!RZI`N+?QU?}}4o&%`Nm(eEyI z^CqzdYZwHBCfp>0@M8&<6DEKqkv=ykf+Y-6sN#VuDlY;~2IuZmnpHfQ&0sMB_a0z@MQ?z@ex0BO!?}-zpU%o|$17CYe@z10JUw!6^6X9tjpHL{P6z9ps2*|s^8Y-{F_DQUs ze=2`L|Eik*ytX!)x@W-E$a)=XchKzdV(}jaTxrR^ss*GEMxA9PEj~9KVp| zj7tA*S}whtmjBn^O&tkms%m^Yb*q(^oM-8~X$Sgl+98K;cr~q+UQHkTXI@Psc*BdS zf2|z+Gx>(s(i`-(wBR5f`f>ra!2O_G=WP$s% zMGHK=7hZ_hsy~(JMpLN!6nT5*R8@wGxd$mkIGNgSvg0~_RsiP6j9 z<-LH)k?Nm}g2e0Po93>UFF^~7@3XptH}S6o|MKv!me(Ep>=#{Zi^ab(Y!Aiq2A02I z`2hd!;`KMYNh00us!Sx4aF0Hx;hedE5R71#S#iB;qlz3+>E^3+tyN@%>cgJr z;(_P%yn@-h>cd&qi#kJKiD4Z7=*)kRHsA~pusKH#!DKRbhzGNO@6`F#&;lQaQ9A^T zd0EcuxnSTd4c?v2Bk>&*SVN-}zH0$ZP=HBwJM37P=fPu>X!cTW#j9uy<8cwBISo!Z z@KXKBinplyhjiGVR{eK+-k)$>4~LOB4TwFc__UESrEThuv~fqHPvfxo+Va%kfg&;xDSd|)E}j!m(&fKJfaLXQdte(eA9lDJF+UQpac!|K6RbV*gv%q zhq}Pde2Ju0L!JkEuTxI7;fu3-GTP)`e2m)|9^)*Y(#1|lB-9@z8lC^xixTXFftE?+ zyJy%3kpG5KJF#RTSbz$9)GK6N5r^N}}>^eqK!)z$3O@9`zyjaN_lWtu% zW3|}O32E7!pq?1_2l3dYmta&$k&2KXLLpKSfgh=LYS@|XPGmH2IREN*pr)}K1B&op7! z_PpqSUR>3eL1+}Akcv=%B2djp8=y$L3TwdjVcM;1*vn^_V$LJ!bH-E02v`@Xr3T zA&^{`lug?|YPz+4yhk*&^=&Co0CFY`YCaVXnC80o>Y`Ct6D zu=?ZW6Ra^%U_Eu>x4;kpef}Bs)d`p~pyVX ze!aUr3O0yE?O7H3*67{s5d%kDkF;L7{s;d9o2k3K6v_Sh*5hA>`19 zN3VNHA*u9nLSc_eUiXy$H98y{%p_59IIvEIwLzV1^gl|y?h)%rA2x(~-Os2oc-eB9DvR+s=99PNZCwa*oOcG4Dq#VRdO#j}%B-J@RrFi_G|X zA;Rr>DQ;{ks|r6>@0m^$4n1b^@tZ@RCo-_kz1|`HxqnC6Zc9DQ5fweR3{huucw$M# zratI;0?>uW8|shrj+joZ^EEZjkLY#Y2-A$0(#z~bZzSqu-kZwP=uSSh-kDrF`U2q% z{@zc)C>QSym%Pc38T`i)^KDk6G*;rXp)9(KBPZ$j3j?+Z0%)jr+fqCq7kNj~128_V z;&1HaRY;*I&mLNmFVQ>vu?>|ByZqSf9jiZAT8oW_6SnbG4B{;2aq0A23>@#b)N$k) zbsWLVt~@q&VG&dE2^RTv4o_aHmsZZziIm~=UBL9ONwr@(?S zKW>ILeY!(fy_27y4%hqnX(c~Db?hHK{V*2?b@oF_lDl6Xai|1&HT#4(aNxth7sYAN zj?UU%f0(szT@Q>86Ks?t=gc0ZCBDpcc%Ny&tmHq(q?5SU=acwfVE<~se*0%^oYTEN zpVR-0omh9}q5(Vi&r+8o_UBW4I{Qb=PHDUz^XWhFO+w7iX8XU8`m}-X^FL!hK)#<( z{(pg;&AZlTUXkGxIOCPviB-9t;~OeY)M4h24P>C?I^!xm-;JnmbHZQAPRC9slVG*{gpWKK)85$&bD%G{Q z;sz@+jtN=meRS$tl*gf(w}OE5r|FMVWih2Nxk3&r5#?TLWZtjBAZC%@(ly?iakD~G zcL;Er*&DF;=U+_UJ7f~0Z|sH>8EKMj2MVn@%;&D}iwM7^Nei9pD(qCMh`kt@Q=TgW z<1#rI*LCM6cOU+o{8|RTLh~HbJWl!Rk)Ka%-{zvn_vl&k#tN!oV4jwfcIEb~oGIxh z=ZeSXPAYS{X3qMR&xpM1fU+om!^)C>oagQH-$EbRU{R)u19Fmdw3x=4(STKj4nAU+b zC0{6J!znbPa_Ag^!~-EHSAuPiu!XrE%$ltSjtQcfrOs067PLBv{vZTHc+ixArd;ig z!p&kX1qWZc9JJgEx7EsEmhy7&xl1vpR(N8y92P1cx?LIQK5Na)60#IU!SF^`v7lIONe+(5aK>w?@7zs7vQiz0Vv&{* zaQDGKjO?h#u#>;hU0Hl7bUuLhXZ)7z z)0Q#WJ0?Z;(DWKV-C;t^?5wRq>NZ8hj^i6wnJ!zr*2`_t;qyDS0~x!0w`RZ6sE7lO z5=_e(4ujF}s>})|sUu(-4wyQ)HWveVt(j&1Kc5o73f~_vcU-AqI8`% ze~RnkGs#+TwIb7%J(FD?YgPRr2x?>}L{m8oMlq@w=n6H8?-(=klNtPk7pgZB#IItS z95e_)e=Ys7g#4&@#y}GU9mrUd14H0|qG$aD9yZiV!U+^x$O9$AeFn{*k!A|CU;*r) zH4IdAWBL+#Uy$Pkv?2o)s^0i)pd6h1JPzwaCL!oZQ|1z5D?9imWIyJWnd-k9Ft2JX8iQX+v(BKw*+8vuxe&ItYg<) znsG*D1wk35>5p#J&-Ys>j%fxlWo%}hOWgif^L+a|BhZzOu;4}K`7k=q&y(i)$zYzF z_2;e@)7jdZsk(LftpG(2cn{@__R!1m*Y6qaKoUd z^5M1UtUEIz1`A_xH9CC!#F2my0ea<-Z<#@EGsaE0JR?uYWI~Rt_gT4m!#n|p@FN|< zO}-6-Sb&50v0)IE>Pt9|N_D|s3}s2dp}5<7pS;#N*x$6<;ITxmC4IA?FOwe=nvyjA;xJ*z zEe1NlHwvjkvQ*e9+Cq?gDN9z1CR~ORcEc6LYjWkmsQ#pzJ#=Hplnf50fM269jv3Gr zg+bg$`7pWwLfu%>Rnk~rFhy5AI0UyG$Oh7~l6jXsrbjn>2Vx}Xv6lt&5@KK(tS*EE zMD)VN4(zg_30P}iIpE61dO4D&+l9ze@n^H5 zv3Kse$2d5+dyUbmq#+w#*PqK0l@7{Y{T0JUt^g%_xUBk-HYG`6;QRv%&NzPO$$5xR zg&kxy%rAf#at_X^MH}qCv)G(Vjl7m}42{@-%JC&}S4}JOZi0-So5S8*8#!gXsfFEW z@|70BNelbC)dGgG6nxK3ik)6s8gnT*Wm<%dHJI|5nU^jkB+LkPaF{XAUE82Ec?QhC z3(na0YlX17431&nhl)kqo1#LHgR*=u=}m@?AaY`@?UMD10X8-rn(Y^6teUoTq{iGX z@0C!v5Bu(wm3buw`yPvZ_Z*`qp9B4}#OB$c>A{Pte0Vm5go9Q;CU1rqv^Eb=8uA4ls~O z4x2y4eaW)P>jirs#lV%Gp5K}_kTe)5mEa&!MUrd4gM%Fm=}f*+I29}NF3oqI=rzwy zAblOs8bMxq`^CdiH#-WO89+~MMHYFYG*HXTfDP#qsd0I59!XhQaB!A%%Y$wYGWx@n z&J5X2t|-b|firASkPXU4DfE_!sPJ<>jM59ToA#{_gYUmtFKUM0=^*rjmf)8~Qpq9c z%w$E)nl#aC));~GsaH^Uv{6ltNop}nDzq(wH3hJ^SpD}TZyqMC<4CUxD?ss!3g5i4 z%QGJ{ZTZ}lS}^`G<`y*7yv{<|tVf`=;#b*ENocHhuEbofQ>*@mO;&;@>dDJNKq@2MVsMtOz)i&qk4=(lyS#eEcwZ@{r+kyoapPnlC}`Frr*A zW|7R=WEg&2GewoePAtDb@%qur*|-vVJxO|9CZtW zv0nQ<1nVb|@Yp1>7Vd&kM@ljVj94%$%e-(sR3LVn$6A7#2XhS!{aC?1#p&j0hSPvv zqsQVe7VmqGx%F63>D7{5ua@lpDYZ0e#Tzw{a+PmT%5%L^?wn&AbduJnlM1R6!E)pR zXT44;P$%tCC&cKll~Pl!SBgasNhu9FNo&+e2GxmBo_QfjuaiMkC+$%uU{t|Yqf%=0 zO6h@0v5=G^9@)zN-jN)GW9mvNW3xKvUnQIs)RpzgoY5x*mi}?A$CVeCdqyG$SKu9- zBFEvlx@I{``XMAP$>AYei(z(U#2_t?>1yCF&6&iI!+~B1FzvJIS2a0MN0;=sIk=?T(Is7vJv*3}5P!s}vJfsHqL(AK=xTG885`RLU z@*a!JyL*I<4KD8)((*ntbcDl9T;2_W*3XBdQ4irb8U{)v(+4kpbVJf1* z+d-b)z zE#dOVycBwamWzovmv}v5v6uJk#V%9k1jlHxPe**9I$I`rU&*0m={*d1T7Mf_Q@1RW z$dMR04>Q(B@kG8YJD>75IbQ_!WwwQC5hjV>o?>kv@-wAFadTmdSap$bRv&ooZ`(@>uf`OgZ4 z$p5}Z>zdc=vj~+5k$=)AL{fD^!awV?&h->~Xjn1)UM!2RLO&-t93I9&hukOBLu%L) z(t()U_ojYQdA;d*MlInd4!(>^efTiS2{qk(rc>X(GgIM9t*Vn_1(e;Ffz?C#MMqHb zW3gUQA&ahpNmcUbFs{2OuOK18%Fq+X;{vo#&nSuluO;T1Ru8?2VTIO%z?!*!amkE1 zD}5%d7i?B52CZ_N(Zf_lshH)!7ZozdK{AdU3}&EdMf%h7(J7tw3eXY#>k3)wL$G`zk8{jt zp(k@Ye4&TO^hM(ZV#%l$4l9IFMUN{?;;VW+hxt`FNI#%blx6uZUf5=t;UGDB_$*l| zRPB#WfTo)F72nWN8aa#@k-ntoBWqv<(gX%_H)131+=-n%d6LJRvE!yi+|a5eCo4?d@=gTF$->?GclLOjZlej0gPrx1j!@>FaPjAdlm~tG~mAF2$La z+awc)FgBAcJx))*g5M6`xvrVzG11hbXdG}_qJ*AYLhSjx{FsIA?%s2U4)qR8z(mnU zU_N&_JoxUNh{fJBW-c8!Zsyr&t!klT#p5CvS!5Dc1@oVO_gF2KIi6$>LBMBb00I9s zJAj}@Lx3P^3AClr6hzs7)fOP=Gh=|Df7cqSm1$vU4Re-^707V32C>^`<^Vxx4-oXZ zK|l~%L@y>yZxItEGg=4%|7;Qv@ZYeB$sV)oZKBSy-X_GRXcQ3emsSA*|LbM}LH}eI z5Ofk9qEr}7NE5~2l|Hz2-yT+Mjlr#fzI;RU>pqNrb;0^lbm8;!1>?rB)EXEn`WeDf zYo)N%Rrm$@8-$?&q$1STIsHciNZ-={Qn5aO)E}buun>j8jijsS>sud{xB_JSjA8R| zUW4w^1^izIm&Di8M+$qImv9dEv)n z;fJ*GhZT7zWA5ggLi27Jq$O$9)tYeHTBi7FbV+f{%yHg63#a;NT{kGktl8*29d|S~ zlM=AySCPq2#C_0}M~ZpidYwn{WvEUlfxpR!Gc=bIXS^2JRU4j&y{S47^dsbnUn1!5 z2-+30>eH%b)u&b62-$`>&FnwKX=WSZG_xDxG<%Vugfhvh!RYMMjV)UA6@BwNMuPbuxO+L7XL9Sh|@r&t~8MyOJu;a zM3%wh6^#%ril*V9vVRT-mHkhKgUbFQ9JDBoHzP6{n<{%quP`>X=nl>SqZ-0PVbpCN z>x}`Tp^+>J(gVOm34n&%VoPJZZ77Ymb+`e>*TQc=&l^yhWb)*8+|AwT<+rw`Z%)UT zb(laLsHgkW_-l`Rg-vma!n5(WicQ}R$sxwtEzAZy`{k3(%c%6bk4($mu2~NmJb|>o zs15A7d55C?bSrxzGbJtG^o36Nt3cq9BYVF;A{?BqaQ}Hdem5npn3?oMp0t#T^V+@4 zAy37~)zjU^m<~;vQlh<~^jLB>COqg|RDf`UY*g&tv~jn;21D~Ro(sqkETMvXv+8pA zWzD5um$;0b>p66x5JCEJD01Phs~*Elr!Jl8>7!NEnJvx}b$K#$`xQ@?%70ga2L}^j zqFX}y_KIUlSV+vF51G=T_sr2w+IUw5PUq(zXrL0%YSH+{J)?!UcL ztW%POU{3nLl($c!?xtzo6BSdY+Ar*{Azg_aTEkG`i1J;Bgak4HCgS_UQJa66gY0MM z$5;JVGm!l%8){Z%!~JsxGILuaeFicq^_c%3Q;(U|ryeu&Z%94n-2K-|g-*MwzN(a!U4> zp}%F0Xhv>u((b#o6|XJe>*Gp)&w`FwFr)_$`wPIM7@RQ74|6wh1uzna@mcDPM-L|? zbr*;mLn_FI?L3qQa?lY}%4@+(J*F*QG6f0stQS2$%@>B{QOWPYJGw!tUXTQTYm{4^ znDj|OEdMCUe<0_)pbkwE?R9b*1z`trke3vE#4w0_A}8`8cEm_~uNCf++`SWnTO?kd zV@7+^Un$AhI#*xWedsH{FHV3j*xmU5QLN(&RUlqk@njP@itVmxj$l3LT1d#Ev_18I zZ}y}~9~kVIW|E$~DCA^_?@9W1AY|)-km8WHtop}p#V71s2al&UMp#2!S3ZF+@KEl6^s!t@$)oXXGE6LnnP>GV_{?-~?$h~A|F zG$;;X6N#KrM|LwGscR9!!G~+KV%*Ld?_;57y2%xBv52fBsUS|S3K*j$fDOPfS}mys|nvBw5M^meU$@o6=OLgMQA1j+2qw3``XR&RG$^Ez#YhG$F55LbM(Xg@<{OT;3~LYBkc(|FwluhSw7 zjZ#Ov&CL?i$UaAj`dq2kU9fbNfV^>xPm{gNksQ5Vgyd|c3uJIcx}fDu+IPcdjXYyg zG6)!GD(!Y`%7^L2;9iVT_@WY8aQQGkg8_kzS5(qyf6@`$6gB(eQ;SWDCMEXLl35JN zBzR^3!o%%z90<@_dG*W+53glQ-Ej6FJ@MZ@Q(@x&hi58~{lg6By9_fN@6y;J3U65W zYR?n!e~2%aCLf?De=3|$fR^lUuVCv-_0`{6ePqB5IGP4d=!&BD=|BXnAM9e(6|l4# z!->dJ3q_`~@frqn!E?=s*GhimN?z4K8d@Oj=x`ne^Y8Tmzy<#&0l?T5=&J7vbp3C3 zW;Ph1*A_gJXMqt1&vMB#Mm1X;WoQ#e)wivraNu1);R@N66as4$qL77{`as2)H#}Ah zfr>F0sQ6n$Wa4lC!N|mipGPLfRPo?2gB8u6v-&cX|3D)XuNARaicue4^N$)r3V*-B z8Y-{F(MfpS7$y1l6c+mbDIQV$Dw2nN2j~e2GI(Alhv$Ci&{cu@ByQKQlURr)_(^g> z{kkhuq9V|zjwzJYVYlnf<14+cr!9mrx@=u`$|Nyc%vO-F0;NhcftWH`RoyhXcyJ2q zOlc`}nO0&ZL-3N4*;81@_)27;Ba)ej$U2H_EA|w74kclXszIn{WpZ&qod;*7t3Y&c zb8(?E0e+mXBRTg*a#e*Gh$>nXBD$C*W=~4iQKArLD@hbvCabQSR?3Q*Wx7lTkWyoR z5VLMYtK?)Iq9H<|&O+C-5Ks#76CKOy-$#_PRl5!HUw4_!y68LAYi|Q7*eCkxRVcQ! z zHd~R+Br1SMeW+NmWfYf`L?(li!Y?#>OT0$y1=@_vx0=i=3w?uxN6NEv+>cDgvw4Wp zX%uO#nc#Kw*dhTugLsu59|zY3JdyI+gAUbJ1K7%MVlik-Zoh|fHp8Pf8d=}!@ zW{d=_CjQb-heHK2nK+@mDUyZ!u9DXco5C8zQ!>uZ#1z^R{5U7kI=F+Ia}re=P{my* zRB?})aw}+ypEjgzc^Os>Ms*J2O5tRQtPa487uPZHw-?3mH{iP!kiQB2humkL+?v+6 z-+0$vf^IbqS`goeQdKFh>q0v-m0GGV)5|Hb@?l#16XAYIe}??6>rjHb123)NZvxUK z(y5x7%hhYKTd20LlCZ8Av zrol9P0&!d#fvXVqZWIS`I9&LLkLon^{QJb{Ov)ftj9~~JXM~2>5_s)vpdHEKz#=h4 z9V1#=k=MGI0KNf4q8QmoQEw``7Eh1V%#QW>Hb1o1n{sD$Y~By`K53CTT<`?RQGT0gofUjQGGRScWt-M5B1Bgmy#Tk&eXNvNJ(CVtV7x zH1|v8qPUoY1<)J%!eUrVup|q}d}2ZRkcIf0OnYd@n|DwgQNmDY0jX&UHP>B-MT@s67rK#LU3Z4gbvR|x`4HzmR1ek_2x*u#L;SdgIdPmqyl15=r*q;MoL6;& zz>YIapt=g2Ta}G-E1E%$ehSjylv%@+;gmu@MEd{6WCgS>Gh-~vi8LEE&PmM!_y$CI z-Gqj@t2xeH^>DPbv{VoyD==kl+^8o?%d#>>P5pd@Uu%CKE<bwN~|A;yVAUcvD4EJC?dW>z`wr$(C?c^cG7Gm4BZQHuoc5;nk zv&{bs7m2s^7pyn*ZtsV1VCTw(#}fF;{zNc_eh?Vrp0IssdmlD@ajV(B(8502z?riK z&x`Z3arUtvSFZT+&+H#?)kBBl^_%v-+q8F$rsOf2A27O^Dgkb`>umG0B8rT5`;51x<+wc&c z!5jF50BJ~}xF|VFkFulYs5cskCZic>A=-%!pkwGXx`JL}9S3kCoDJu}C2=)e4>!TR z@lZSxNAP$&39rMu@gaNzKgMtI7ornEf+RjkM$(XMqz36g`jaS`Mi!AZWCuA*9*{Rw zr(PPHrlz@RK3axWqqS)Z+LrdDLuiOjrZeaQx{_|9yXhf%l3t)U=v@tKwY7fQZM}rv zQJ=5x*IydMNMd9(Dj02z)y8`>r&-i&VU9F+nkOvXN@NwZx>^gYt=28uXQ#94**)#4 z_AdL0Bb*#gMW?GX$O$#+Y73UIpE;$84ZTJKJMuk0+q;<&m#4%y5dGKcQh z!ZQ_?*@@xtV1)=9U1E4#pc*6fLei4FQg?Tk)ZJoOoED40n?TbD?)LOdd$-^Bojb$w zx)I=xWw?9C?mct<{~wOv$0b;I>(0YEV3=0Jvn3ohL>UM56c3kvVhd>pc0#9Mv<8Pq zN$1&ATEP8iz1LWs+{9txu{5+fVG!911%tR3K!3s@0%0 zB%ucN8mP79Xz*uQE2!n%U$Sl%_CbzNK^_d!HmDpnAaYgkA;zUY%u5M%@T+1k;zFEX z--=gulw~HoLP$a!l{c0+n-;YEDt@;Pcgux&i@%)V;QnM@v-Y*syK;3fZ(BHfw8f_9 z?o%k8I$et~=N8vOL0xhkUU_EV9MmkT!T6fRHE>i(m19<~ikp|Sv-EDlwuQc0zX$^y zupsT$Wm|M0TqOEKpKXf*Ws0!tZ&ASX4|su|(5)x&D$_hbuhhWQpQe>!HT%DVRzk8|D2RC`mZ1)#MpKpD4{c}2~jR%gLbpn28jiEq2{djR{ zy#tI)-%cad1{6PdmWHaZjk}4;0;Y{PEHh0g5*I5#hV2;sXJhm@?Qd<-VW;*F$i8Pa zn5GEGh`^@`7%7;U^I6(Zem+<*3nFHKnTz+L=1s%X;YQ`$-lZ=6J{jT_i)2rXcu*r4 z`tdp3kI$DnSqo}}e+Kk1^A873l(ntpF3J)SvDzhquto)r%jyQYHO=RL~#i9;|+jxLvV5Mpq6o4x%)LH=#|cip7V1pdG63V2Uy(lLTJr7qwQsDmEO_Mwy`5EtGZ zdDOx%_?hh{UtFBxUY0y~9e=@6kpphL9Q_&89QmN=BOQ)n+7XOC3Z{n-o+?l=w(A0V zfx-H<8XxsYe>A!ru)WT0DtK+@7M`Y>;Z`9t4*U*p+^)8M|LviVNq3v^^@&Zrf2rWr z`xMubn^xpF1M@DB=~h%#CQ2mJ%~vwk3wYjX3>%{)3JLX}Np-=y|MY!P zU;p>ZXUt5^AnwjKH-n4SMyj051NEQ40p6(6yAfIg&F8%TFG~)7s`*A zS-?M}L{D9qYGwg1IC4R^tLEz~onBwvYQ4R>`&(u3&D9?9cFRdD0McnHcB3*{DHQe< zqElm3swR0WaFI|~KN3lunh5ID6=@UHrO9{9i0=p45c70^BU{ zwP$++iwIYJmT1*QPipXIE&NIa9&X0`T3mlx;|J4c9%S7-U&VafR?D~HdbDeTmwhNH zOCdZ-rXZD2XN@LjYP9ecO&wsET#Y^$gA=1``3Np2&W?(zasN!sSoYnU@4cl@x$l~l z+|MzZ?Z&6n(p{gGQCpYox-lzj-3^Oqqs41KFV*cyYH1BA4RQEIVX8D7g}*lrGiQdK z$x2|{QIIf>UlGLBx+o0Z?&N-Wk6QQL{u3`cd9gg_g|+*C46>_XOHvXO%Q7$0Zi_#A z^^I5c+4pa_Zk%K4eA z1?J=bpsSL*4xy`pN646KTrO(EtqwD-zX~oG#pi`}c2^I@iK)g3=z}Wmz#W`Q zGal;0RlbAoKq@go=ProSVm+&<6+3-IEBctNXg3bWXob@i%6(mG99El3_x9>ZB(S7L zzd2M%Vj-ogC_UuAWQIQo;0kz$sQjtJwUq2Rnxa^AP32YIgzFHptP zo2+_^*nK)rpJdg#iPIXLyWtMSa}~c$^*)y-;FXf~xRUJV1$!35EsAXmA$fX+h&(M+ z3HA5!&(fwn+`*sZPlobf?x&lJW}yS8Vg;6SD)}tkKEyES5e$PNf`Pyn(5{B?1wE^o z=mYu|*4l8wAWrauFFxP*rJnPiG;LYVsuhnY_OkL#?4J7{drHS>`P8znqsM1#ob^X% z9sB5sH=p0-*!|YFYxS-2sCy+aj>c+*xQoV!mj6Yzkn6uea(x~pOblDR#)T7yJP}Ju z|EOh|=7jLZ^O{MO>$$gMq-H_3(f_al77S-Vv#>WN^alQ;>}62zaXrOqD#mjcPf8x2 zq>EV$=tMuf9q$ZBnO~;c)eEToc;;%{$uD92UcOVBhVRLI-We6=;cAJmmhE*Kj&*{X zARDPXT&kCOFZv+;NI%M+wVsDmW5X%W24+|5Wlt(b5~&P(xeuowDM2QRxOctmh1y@I z5YQe}OySy3sNu>}d?jjeT;nN>_YNQ2+Ncpjd@`}I;SDtHukdItQ(?yuol+IwH6NGB zoJC0~GWdRLy!_8OJ6$0PN3ap1pMNwdV|ZwC1!9L)VE)IYwu&u zwkM@LIsJw$nd@$O?L#LJX*2L=0TcXnod$R%zKiR^(VtJ(d6eiJlpTQ<#eVs2VR2_! z*=1*MHl&kswNTifnO286X9LSY?K)C}}FPZ8m%-vfqvmH%og#^@cm~;p(bt%&ewN z8hGlS51x8Gk3P%oltz%d9}M3iO!CwgJ_au00WsJ-`^&3m1763Slqgt@d%zs$?rP5! zou<{DfRi-z2hn{C8y(I^^5E_$7=t;VD&-3=gw?D9Y8O<0^a~@@N9y$;J&JyJ8|xz z!&O_V;Nb=%JnyYMyq%UmjOp&mLlws5G>yTE4&sR=9%IfV21Y!7?E8N{xBbqi2?`S_ zln{&lQV0WtfR}r41hSExA}Zi&<`)|KEKsE_(T|@zfHN9)b z0dTiyf*yi-nN955-fS}>U?^@704n-pF!yKPTaRr2e?A{_fdBvicmWN{H&#M%6om0_ z=6P()IpC)cX|lRs)S9outxeoO8O?#k2jIGyp6r%C*&8uhBME?i<2j#>S&;S4ccmb@E1GHV&7KZ;h_rAxxvCqA=-NrVHIH_ZezSt?# z*tS(Wwrx9gV|%@Stg)Xv*f-AjzBQNUTxUZ7gm7ApL(7)0S`)EWZ?Zj1XT8*kH^r>F8YziY@u2C(8DK)tg zpVoZ2N(%G6vjkD(@?u2{xxLsy9C^IhMFM%fI1NeU^I{*;k>88`$btf196(m2yf}z# z$nfG2vLn-r!^nYqaBs`TZQJ1BUw7*_+qT5X|ASk$Zi&->-2jvbaiGMtBWdu#j|3h@ zS=2-$sVmD7L;#8q(jjc&^t3Iqjr#AI3KwmQ2FE!A#sT62L!bZ8{;<_Z`)5Cbym0U! zCP1MwTfPJIH@%EFxK=t#7maERc_6ZuY$iL&esYvt_4twePR@J%+W_tY;zH4eZ3v>d ziIM<`k*wgDM~d7}9wkpha1elt5FWND9>=o)V#o@v)_eeH{f>SHfZ7>wE=3E@TJM(= zoUiGvT?`)*5QG3*b#^)vrD;dLk#F@kTkjKI?AY7johoPy(4Sg21MC+cB0L3+Oi6m0 zDG1J)s_^b1_I2r}MZMSk8qnYMGRKwo-Ybs-b~Mb5ExJ9(e< z@%keO&%`(~h0G$Kf@2=@$x^bKY=qz|z6rCmo@d>_dV=*z>*?0Vtk+mKwQkNgWS!Qp zT2HlJXg%M0qV+NB74$u*iTY@Q&ZHuGq7~ZW4OB-(!WqU*(8P{*=ImO0h<+G?QJ8>f zn1j#pEf!)q$C*;zO%)uMC89EKY{H;4UZ_<6NH_*b_ zmezIX`F71jXBK#Z^Ea>xrv%+p57I~B0%##~WUn08Of9G_^t|45B2K2$%(>_mb*sDW z-Ot^{?#i^&X?J~J`ZoHu`%e0<`|kP+`aAk3_!s*3`>zI4f!cxYfun)T!AZd{gF8b7 zLoGtp@9z6L1?H$bvRzrF*+7+ z>I9vDw{?!rMI-%6zd{pTq>K3PEYT%srmJ-|njcA&;%}uFi zR!9SLL0?B$TbTJ!scimWMh_w(ndW1;$MlpJ%y}tfcKq|4>g>O4E^_~6ebT(APnnOo zKd9WV1I;>}Y%b|ka|vnQu98xmylsNY8AK2^7g3s2BemhjPYB`~L^8}Z?%2W|Q@P_? zo~bM&m*WG+k6+>kuH=O=R-nXG;#tLtXZuVH#%h`Gaz4`aC5ixFlYPu`Ew zHuJrh%06?zOmoKOaR^0iE=LfBVMQ6{usp^8@LBR4|CQ&>bSVU%6gD%ZB>NRuQ4Nm0 z$+#`Q_&oHo03ARMGKi;tN>AKre1H}AJKjb~)(olP-VPqnLEW|Qb zAi9cniYVu64SUS($m7aE(}&gvlQcCbx?fk8SP zoRKz6N3l1WF~*ka7RD~db>yGfW_@8Zo!VI!W+!0ml({vZ zYe2mwpTJWZ96f-Sop7=WPS(T8GU9xX_)g>VdUF3vYcl+{OzYWN{Uu$s0pE@67#Taj zJ-V+=?TI$$tc5)%wjG*GEGc$^u5^w#FKHW_q8;p(c4YJ;#sO64K=uZqGt_3dfL(Jf z?Ws$~-xPb~Qf-TCO~tmcgRTP|s-va3&bFIs@}pf3|9>q-uznuvx3PRcl&FqUlk}v5 zUgY(i5NalxRkT*3-zQ2G4BQoErxLF~W%jE`ID6UXpV!7xoC@5fy*T@$e1)HH==e$= zUc0(dl-jG{HrrK@D%&>t>K2U$p}yTf`zD!OkK}zKy6wIof_U3bCbC=~d+R1LHrpY$ zl_(;xTNb+|wT4vGS|BvWua@-MR?L5tUx1P(Vc2+%jpv+(a2m{M2;S}E^r3h9g44%X zzQAcDyZ7)f2rC!7)7P9nLpOrcDD;kkTm-2n)Nr)r&_^?6ButFw&df2B1(ueN`2dX= zG)}3&aSjITZmhsF};d~lnI%hMOXR~(5$7n*mJ zh>7NFo2B2_4E>h*J8n?2Ee3Boc>e|Ozf#J3ryHZw+`iYA%*oub6fC9M9VDZ*y_7?` zt#-^aSKF?;I^46mWG~eYxb{|^`__c}7I2*yoh`w2u_V{k5?wde-7TJ5l}LB^iR!5X zXJhGtC#bk{yj$nt>axVi6}nd?Zhw2M47HQIfG5d!w6&K8jE3~!5gyBjWenON!0<7c zJ>;RFEmuKKw?iIEO^bllO&%ACb{Rfi@Y4N5+vl0~!x9!Glsd1aO{AJOmCwj{O=_YH zHQ|G?g7@ods{b1#zh(Z8IRJb0@q^j}&ByTDb9PsdV3$Sf3yB6lP7}cQ zG1r%}NLNStL!?_^=NTH6(5Ql)(rEa={{*Y8?U`$9bQ-E^HdVEdsv1lEOoxF@)XFv@ zKO#lBFXzbK9%;ZBX)nm!GcxyFW-?~eWA~Dgcxv3o2%uTtj>6w5tptlO?nIxH^9x%=Ip1yHN6_?NKf}V zJ5j8nC76GXZW$(%C7PXboHyn@s4In8m1k9%O05E8ZG~G(H(5#FTQ6m8JPhU1A?_ft z9f`#-o`Vb$?3`m~A38x2!RjWflXzGh&q~w%BJtrg_cGUk>e}&^g`&3+)FmM1pm7?F zJ)DL~FkeSJ`8Jlp4t2xMekvoDs)**~g5&psO98D7F?u?ntw!nwmGB0?Ok!B=Mkf*- zZk;$hNzl4rzzg~zjGbdqa?(i6fU99az@(og9|7S$$Ec!=o&tNh> zLL6NtlMa*Rx`We$xbVjN`+uS|V9XXpqX`mu^qU;-MY+!DNNK zGT4DjB6`4XBFHhWJv?>-y&Ie$j|G)D5I2yOhj1`VeGET*)S>?B+Cj8)v;k}UQ+!ii zPS+KFy2Iv3JLX2&d5J>m9uo12Wo(4NkBTFZfa4x2;L*G&UiQa8c6qr?nGztG5pllH`La* zQc}NT4%iqxIi`(xKRd$ZP_jMDW@Brcgn@WaieRs(?FIEBUM}WN%?5oe_0xx{?aNzS z44xQmG?sxwfPW^|UkE%cg2SuzT>$JaB_jBxcs;AD^U;*NErX`1n06gV@}57j$WSsfc1-_eEm_}M{#6V zK05HpGhV!QA`)Yl$hr~l7j(g@Qd&xQziBJWr{ZU=5+l{*151O6>i?tGES%fOwlsc? zF~)H?FPY?phI!^OFJtlk56jHV%scd$hM9T73=S$|W{_+pl5L?a>)T&_)uqz9Qn27m z?diI=yU(S==iZjorCw!}V23r1E(?sRLt~s1IfvdKc5{l`%9tAowNO&0xPCiewK|XW zuY$(E4nd3PTso^HR>Zkp$26f)UDj_aMbCm_^kFxs9;G#@lgg^h*aIQ(+^;P2-2gzE z#n6V7Tlt2u&N{e{>vK^5qrBaLlo!a@pGUq;cxVQR*Jv0@8}M5obfU2@GU9Hs)`RHa zljJ%BeOhk>5Bjd_36)d`&00c^xvJI~s#VZDq%t!9d-uFRd7G!csFaimWE|?oP)7mW zj}tn)*MMI^&FA zYZgo~7_h1H>|<6KpfyE3b)BYl*iaJ|(_QI%4Vs3y4_0VQR?Re4HFk^ol)oYNAJg|W zg+-i#x?$VG0Ctkp1a{D-Ij}Q42ff5St-sQr&~v{I>v?){j^(+m5%@~ehu8#mIv8|< z_bWU!AfXilG9v&zuMt_!L2U~9CUpipyii6JhsT8e0ZSR-{paX;NT>BM{2bMjdYUnB z=pjr%idX9cp3dqVEl1()u%pNfZ{zsguug$X=?t`= z<>@%(GIqZ7k!99hS>422JAEVGv4tF->4-zGJ(N2+&#mEUD_O2X zi|#c`K8b)FSI53&J@eeA9_I1b0jn&i3;HiPody60(C)&ZqRRAaq-B~h&B!LN68IS5O8=6*tnhPH89s z(0iIu|1-d5)s5Vc0Z|uvm4VO3a4X!khfjrV_~S-%u-P%@UjN3~ETR@vzoElOw;k(G z;oF;O-$uOw>D|s%55@Qn(U6@hzVy@9Z3ni#2OZS1-a2?IAdme>bSFA%C3@|ov_r#Q z-jJi~os{j2Y7gs?&RQ)pccZbl;zNC`9gqruy;gl3>AZT&UU0&hyC2cymv9j4om2hMAus8`5F6iF|1*QTj6vII@#h~Q9q;q zhxycz;7v!qD|%5=J~5Hw9kEi_Xj#z58nbxpB`8@#j|^>pulLpOobxs|*G=y1Qjw8) ztc=(K2MuIc19@gt*Pyt=yMQ_GwsVa64z_oabx-I&kYQSLT%t|h1=jgJNnu7m7oe|* z#FDHQ)0jsrNKgwz@_(6K=rlHhrwPA^_F%{f>XV_C`-_n`{2e_nLC+gJlLd90`+n#s zL+3D@7m z@}use98iMRYqUMe^Roe4r~C^NKZgeAun}v_C-$V`P?okgXOQYuTF1e?O3zr7)zi@b zb3)^eMpxkU869-Qiox+T+|OZO|0D431snIy@C_B9aF}^bKh(^#Hr8jm8MW=^biq5@ z=drW_bwU4eX#NmcTvnQvxZ~?IGiAAR4(6VqZK#rEhUh(~8RkC23NiF?5fA8LirDdI@0 z?L4k|Fu$#b?46H0PmodAzwKh=UghcaIO`SkBz*=#1dhTRz1ykN)0#vICyBogdtXPU z)*>{`V-GDnE%?e%N-CKqyax&Q(zijQ)Ri3)a4(W3`{{d?wH*HpcN24aD?N$k$YO$? zjo}Nyz+R>T-lt%{l%&6F-No7wz{xfpAd=q}euP-QJKW2)A>4}0YAH8~y$DhGPAz$! z&7qUJMMdZ5&CszX+(Go+>ib6kNbo3rctpq4kL*7n_PoRUcXbj^J4}6$>j3t)=r3W% z!+JdS7`Pd9enpq4&ttWHJe8Ks+=U$sBIV!q7of|w-!u9ql753R$B7S@d`h|uc8s1q z^n925w7;wTBmMdn2YbPulVH`nPBJTgOub*@UiT&J`d1krXRZPo2hdWUUgzyur?C&> z0W~AB^8xBBU^ua`&Ma#r7&`(!?w#+fBTkm`P{3j&?_T+p$T4S{`$HOp&N=4#Hk2)) z$9mc#`=a#}D|`cuwmYYPJnW`*3wG0}uftnL-=xnZd}jiu8m@qcB)l(ujrMnRF0}Ex z$oeQsl(>q-x1EuEH?bmEW(MGY0X|0jyx{g|gtJT;Zmyb-W~_G|K5_+G>XF@;y2-So zctH$m2P40Fh`CrracFsxG1F*0r7`C|G)3EB$*^iz5atK6&$ zVIyrvu-7bejdOi~?1UUs&|skFQrHHUm*Mf3C^7iR>x{XWaQr=uJTE|77u=VS;=I1e zxc^`__E6YNGi9ygZXNTVbhe98l6sHvfc1Mq?@;i2@Rv0V#ofNg&|M9_@yLz+0ztv* zk>PjQ13v0g@ZVUS zxuWP(WKeKyN60{brx!_#eL;m?V^t3?Z}&+t;7VN4Ql|fZhI8t@AF%wH#1))laj4J z$-UKH2`J_I3|h`>fHG#TN0l}m%@O@Awv-*=vq(RMwin2=Uvdvt_nM2EF(pOXiBTR` z!&Mi+niJk6>HyAw*Q~Mx#x!jnYu(2Bl=J!!Pn*YT4A5hMzU^4ldM#l|fLG24|G{IA zF$T-S_llMRfRucv^)ULl$ve(0v+ZE7u`*zpvQ85E^Lk}jV+|bb4C^ctgE_$a^$IdT zE9T(MsuA^-UDCY29If%GY&*SI3Obh~D%Ns#8K*^;{|X(^y|o$%?Kc$kB39Jle3y47 zzoZ(&v6rTuw5#hbK9eL&x%yg_>cT@I)Zd7b8dfi?Yg%=R9KzE)&~?E%J_dXar^ z#nzX|Nd~O0k=fp1mO&*=XOB)-iG%&8u`~XTxD#s71oGdzV)9Q=y0Q3X@dT~TsZstN zB8Tn{Tfi3K!Sb(UyB_}z&nW^=wB*gB@6KOs>>6sZo;sH}_V!-8x-2jR96yO?k`I0AhUfGtG#bN)X^GrXmBmG7ZH>`2Y-JhXAu=xt{2 zm-lo2mcJd%HFGsdSXC=;jr0;VI52z-G<9_pB+CfiX!EympXRn=rB4R~vNkZLotfLJ z{)b`vX62`qiSpOtb@Nvv?E&jsiP4{l0X%G%7||(V-D~K#zRFJK)Xz#OpC$n0#MgdX`vb^s8>6fN_lFK~3P7r4 zY{$w;k7Y3 zS&cbv0sig@&z3}q`TYHt@i(gw{dTi6eA=_ZEqxobKtIO_&ruhu0B#NL?-I!_<9t$J zzN`LX*Hr0mn!--{HnQr+jBZmd(!@r8|H;CM!QWjI(2x%s!Q#`{N0aHO@p{d+&&}A_ zoaf)C3-U zQghXrIs$t{1=``fStHi#-mrpz^iL2!(@?n{8?BCnxATk84lKyOieqJf-edPaXCL4l zZ#r*#DytmjZto_z-%Y%f7Vxki@b5=+aFYtH$fTX;)ymr=Cn8U)t6GgXOD)wLfeQPk>qt;UAcq_Ul{!r)ze!;&GLv3hhzMBKubNu;F4$c8M5`+n(@9Su7+umq1 znb_9E$!Klk_U_8Rt=&Ci@!Pg-+qP|Wb-m!lNvG=-dyI9eP!d$DHcH}_c46GoE{a>) zB^uNq%au}&722=;Y>T_v?K-ZL?A95bp;VW3nXdkqKUe)f>P!`{tdd!K!PeLT3Dl2 zwK89AYGYyi{p;1GF6OFR-OTYR^s-ca>hme|tDjjhk(o*<#bOO>*uQo}BP`UYMoDN) zV?Ld6jZ*;H?WQ%>W2brNmI>ZJY z_9?H{Nu5M7Ws50WOnF;OxhSSw>{EU=g?f&jmgxNHbu2f+cY~YZD}ekV;S~Z*0OA|oaNp3+kST2 z0XyiQdB_ftw8M6oop!{Iu+NU#QA+KY9b>B&+jiUij@@y8hrN@MxU4R;ciX$&-)Hah zm+$v2DU2;C#P}tJP8CH?f?_902{YYiIZ0+S$9=9-%{&&mFLIJBb`mUck}P!+EOTmD z?$oiusb{6rz$&Ma)lL&@oMzTKEv#cFRqUdaBxO#5awkUxb?)^}js_<|BdsK9r^CIA z0e_idm}*9taG!K?Op$iax+TbSf+VM$B&Rt`f^%G=hRaR^SGY3(t2FTyt8v?zD5m>EJ#m#r;kv4>;XC==AWA)5pV3KaV&AJnHoEm@~-Z z++>JbPKw*kFn633FLZ`@ku$=JoiSeGjPp`wf|ogyyxf`M6;7I0I@7$$Y30?tmJF}s z4eoE`P3~`YT6qg^b$=W0qJwwy9#XuQkJHH~_zXRK*2(fYr;pD&{d|Ehk>$&L)%|Nu zmajYge8b7|ZN9?*-*fu-zSGYS_%Vb0#L4kfXNaHkYk&D0C&h31J$e4XAKm}NU)=xd zr1-nj%Rihv|K#8P`Tvm^k;&**fr=PYv5M(ai54=hMOw`4Pa5Og;B0~ zQLY71t{qXXrBSXeQLc?quGvwpk|@`XDA(F3SFy6nvRFCg*rB}gC@NMS6T+tOOb(ij9pYGP(R7Bk>y>3tCfS#_WQy7gakGhpd*UF=4 zyYy~-jHEuU&rqw+>T{&@d3}+*zN9a?e_3B~|Ej*~{xyBw{Tuo&z51ShMVo%DKhUK= z>QC-})?eKJs(;X_f9hZE|JHxp|EvGH|4;v;(=bSxte9Rau{r-|;T~Wp2ZAsF&)cWn zYIU}4+qS~9ZQHhO+qP}n2+j-+lgZT#o3D%ZhkBGZQ<)^qOp>N2Nga|j3mKY~3{6Ca zW+X$?k)a+M+6XvnjFM(0NmHSuO>w&!dYXVd%|@OkCQmbwr-D57(bG1#-4<2NMyjSJ zRkKk>MPgDl6RDb*jbfwG!7*$MIBYB%3t7q8G;AW9h<8n4Q*e74n+91)Uc+XvnUItG z%}xF$WsBKjNJ{=nl2@`dYz<_gWQ!2JpYxK!dC1>9XKHEMx=N zCH4k0Nb-fNgnNW%g;#{Pg)c;kM3zLhMUF&nMbkyU#Z0V9JQmLoUlV`E8Sljx@MU}r z-^6$DWBdZY#_#Y~!iXdymB=CTi5jAwXe3&QcA|&aCLTCRoI*}BXNhyq`Qv7BbGdcg z0q!Y}c@4Y?-Y375-_D=oAM+phpMq3Do}gGzA!vbFBz=NW!IWT?WYWXY$TTvO%pvp1 z60)4EBAduovV&YE*T_wBhrA^3s5GjO>ZE$8erkl8rBV!I{Zm4_ejryeiXs(UU zqVwq*x|{BxyW!YJPtr^DD!oDPGsYw_nM@v2%#<-L%sR8h95YwUBlE%hvbk&tTh2DK zZEP<)#E!CC>^lgdvXTFJOB@6^^uF?`ET^c&H^3&?N*?cmJ*e=0GWaMQgX3@#PXD9hEP$g*lQ{nMV=A6NWQi;e=YEIOR+3q_ zSpnAFeYcE~)ABk$9G1n`&~?Mzo!G_Q-F-;n5d1eg^AkcI$W2{&;cf9(2clJry}ApEh8mLq9sPgGa*wY zO|F-zGEJt-44Ek}$y@aQ3cCLcU7t@^SJ2IEbn&Ps^k$StXL<*TO0w>Ase05+(l2G2 z4l`NPWHwXler;gR#W3aK6Pok zus+V-Tz^nIc#ri8@9CXI;@d8gGo9f1ICGLSbHM23ZOKmLeIEbk>FraV*+lj%oK^A= z*4W#roO{xwzC?-@mIldnymD2$v8x-LR?fDt=A5pr@*rfg8sus}a`WM6mkKRHTOXX+ zR0($h_bNC%!;QoUb_v#w2ooDE-$(CEjvj$tu;&IJVYt1gBV7A2KE`VM*cVN}ovm%= z8D3FWKI$$(%iMj`;%Y5-o7vx?h3-=wa)-3SWof_5*H%}G7d)ZshKO^N)=8Y!VtqY! zj6-X-JjOoO%ab}l%nzY=5?)-CV_GgX8YJF1R5H);+W+vs3feMl2BA}C=u6oCtfcdn zVFvV|O8_+r)I#A+R#1mQ9VDA?%8Pm<=ud#$NL)riW!=eFaW?Zd{(I0tJ&i|oNI$4U zAejF|<9qCdjzGNneFCyY6!yqlE{cvzfN!-n;&mh5_F@}x(rP#xg^I$KDDpZHiFj~s z!iG){uRXqOz}vb(doTYf?ed<}UR#+)5qF-{Wg7uSLQ!;hG`}&9J!m{M0g8tbI7(!j z#MSHACTlZw-bJ_blq-3f!?{eP?qa(PwB;bb1M*t@-Ga8QXxj$u;CjCESa-zOS1V>y zFLPCi?5Oym`KqBliN>Q?>SrQeB~vwZ@*=dDC>`MX8TzV%``K-*%wNRHaPl@pEJle% zBa#z{fuDCV2e<=LU(`<|^9b9BVu5uPZ_!f==n2L7G7>)ne}MjpMapCK?9+YZ<~X&` zZr^&@qF=dB^fJ{~KpsAH$Mth6u!;)&8q{d=QtCSCx*$0krRTzRwwDBoE}DJ3+j(663N6+hvXp*5KqXh`Ua8cBQmcEtNb2V{9VDmUkkeh{ zbQd}Ol$?Ie8`NKr*Dt8IYHF>MI(y&Vgs!Kn!qD72R!^#EJRo$vo5t0nV-e9#d^?R# zmH2eV9n&IwYQd-6kWY24L$m0t8hq-Oc1z34xI^{a{cexiPusDDPZKXH+vY2yR2(&oZd5BPEt zNX1BXIT7v&{06km2^HJG@AqsTCfE#(l?>|Ca{;O{zdkCed4 z|Etxvs8uA9I!?!KB68gQ-G|JiVjXa8?Dvp|X-H3JlFp_V(?QI%sj!hc{u0D9AReYV z&xF47GYs-JJp3-RsolDv6|Xy(iPR)HTuv50ptFg#>vrVFg%hjE*!Ztq@)hWNtzMYj zpf-bAMThu8t04s~i#{N`NGB8NL8S7K$j6R0BnIJ3hm#yp$xZOvQ((wRu>m+ zFJG8h%!=P>KT(LWdhp)IOh z4`qU=C1dps?j5%4sP*-1H$aX_Fc_|bu-*gFor&Fp<Re#V6>|LbBvQ(`Ws4;xbv091X zsDVhd<1f=KG@H~ho8T?ImX#0qWfpGV6P=xAaOL+ zq(;H(V2^pgUN@dH5%AV0vmquzDC?YM?-=$hhkGsPo|}Z9Gvyc1&2F*_58*}`=!o9KK|-A%k0}grPiC7R)uQZWKuZiIAh1>;mvUqsW+xH z^e*&1v=zU0YJaF7d{~7C?9YYL$#^DovzsNi&?f;V=6udC;CLa&%pWOo!UX3Z)6pYN zHp8)}d^qc}~!t#Vqw{wtZzYnQpnB=|72_PR7UioZC!19kA0W3kh^Eee|#OYj@3Pp0RMd=lrZ+iQCrC_wn_4!vNGjP zya=RmcpfLz7e`a!UPq)$t#+{+RI<$V>7db#R1nW!Vei{EyV9AI8BiwVhpw*1o`zn~ zQ{?cJ&8;r+LwrNW3FmkwpL6Bc)=QNs@m>0@#rPO*x<3}T{}ws(W{vYRTeP)DppTpXMYE>)YbywMedTViv581A6lsVzv93Hp(m zgp^=MwG`-``Lz3zu^{PY3V#S5HsJVgs;12q(;`?Ow zyf*3(x$Q$UZvtv3SpQ(|ES%fQmNc#y;;>e06p1QJ+5Dec*O~wmd@3X~w+L zklHF+*(OikYm~UJDJ^?uryeV-%et-W_Il0A59py9nzJLPqV?vz_Z!C`smhb0eiex6 zsgV=c^vvbRP+L+bil4XdIz(FiXk0l?tkG)JR@a)f@O4#{wbvXmB5PXpJBUJds*{=P zPuvfBgs19uOlw<(UCc2w&6I%7XRfoJU;hfqvDWqKoq^{3V}BjROL^TusI zc7y(=_W3@D5msJi`j-iLo#!oN4j#)DIS z&uO1yS!o_?KFa#L4-|vJh{Lu0N3y`?^aQ-7uN%LU{C^QztqncWH8P6lw4^%GLk+v< zis#VNk|Edf%t=O%?`TZ(%Hn53TFQz16)fflwBZ`cc?O>+Z{=lw)oIi9cQH&h$$0zdVc%f6uI$DZaTG9+M z|3STteSiW5eSc&hbvW}l&kLM|f5wkq(HFF0f6H1zkIY-(Q4)DH7#h;Awn@cljM!AN z{<}$c)Y9MbKTw{-cN`#VvP^#1cWK;sKczZ(pO#zCNWIs2^jLQC%w+PNQpH=TEZ*#v z-mvm>c>d=jVs*gIN7#cz=Z)iw9zV@}Ze5?JN6nh)@htudxiRXT@(eOY$^E+KC?r0M zvbug+Q~1?ZAds}MiVjijKOet!*rZ%Y@>?=3nDS^=^kGa3j$@!rRbqCu<}EiVodFp& z;)r|lbNY5f!39MmT16cZm8K1Hs}7mO7L32L>RPm8$|Z|ER*6_!r{;s2Acu6`O3c~o ziE^rtubf90@^IExMOEar&F>unL#%23rR0bu(SEc}<eB@zE|j;;w(d(WYD zQCD(HMY~F%kZgeqWY!lLQrr0B)6{vu4kKjthC1f=vObewbU0^a9CvBIrirustY>=Y zOS)%g-_YB-?AQ-v*nAPMa$Ae~ls==5z3z|+Wggecf6&Il8rUqRZF=Okpb5MGO}(X} zF1clrG1}3~dP)CfS6{St|0pO6U)Q8MUL$!+4NbtWqnh>wTHJVO!zE_Xo7jod4_n(A zvAc-TE{)^=puf{3dN)sx?xg)#L?U7@jkM9E)%nK-k89&{fRiFj9<@uZWE#9{ELd z`E~cocK_K-KUg_?{iP|!^&6_`kuH<7j$<=Zc6`kdHoRUfXhV~DW(XfNtR=T@VyE}|UovaUEznm(%;eEb=8On$@0oy+eV^x6kCt?T+veM=wKC-tI7?VH?=Ygr%D#~d@nr2FrB zRTV4wt~$Dj$NNwHrz2x{-jK;}Km1kAPmF_^H>FR5VD%hpk;``co~}E_AO7O2`nVn; zXMBunp7QD-Kkwx}eDe^#w9fyU*>W6XO<5h2j-I?^-|@@JK0d|9zq$+f~W!hJsF{#zyd32P%Y?Ndd}VZz!6WBu_}Rdf{%|1e%- z6g@zDddA;k=Eu_boAQqFRx4V;-eZ`o17W5@W*+-iN-@prIi{7v7QZe_so zsasDp$aKGF@9ahRVSmqt%*$Y54S0l6+)o)$X72bo$Tc%6X-jYFp50MouNq?g(O}=$ zTh4uqFMaG>588{`oIjUiiu=E$mL@a`oL&ZxvmhhZyT&KJaKuMz)1Er3s%`qE;UlTN2C=eO@pHH5`@F<%g=et8 z?R_ZuI1qEIS-i}wbAmn*@$Yw{>E3fs>~O4%DRkfgzNW3R-n2T~s76{+v6!B*n2asg zLeGDNzfI$>q?Yk_H!@utJNRp3J3o{54|cQwRGOQ}ucIfK9E41_0F7oR$`9a7J3i)m5ofuh`O&d3a++wYs zVfy#f{~^EC%s^VdwZqSKl025cW!%sf`#G_G^K1Ain=P?^vt0zf?}Nh`J;ulR zzSn@;1M}XNl^P09a44{q4y8Ps%AgvVuOzBjX(c>yYGS>2W_S>q7pfH z^XTzaEszaaqQ(<0HD8ZYpN;Um&l^8SBA4nr*0LW43-7FHz**zvJTo$jdu7&90RIB= zIRl6%N;@$*f9JOYTZ4jo7+cqwqu*1WUG6Q%5TfsEe&F+me8pkC)5m=LkaHULRnn$P zk=?c6e#6(Tx@zB#qIJGz8*+*HoWzbqKHeeO7;&+{gcPD${C(ZWeh^$=#3DWrD6U;N zTJ&7Wxn`$km^KE1;W-m$i=eOP9pT09D5#lMj)5sj4TJu!MvS)uTuapB|LW=5cKE*) z*Bz`V`9CDxA`?FOKkjiV+a1&4|3v>ZwWYFqKQ)s7GaYmLWu{9mmT3;VT;|4#ZFO|{4#z16l@pyt-|H*@@x5h$d9#%j~{67?(%~_zYBRBwzlpK?aw^R zAM!hH7Tn8UTT&fNV)zUB4UrkN2RQ|Q!-*eE4O*K4Knr zm0suvsqZ1{46z$^j9J0}zc@}WtlIHF%bKFDF_rDSrG{?lQNpH3JTQXo1-ubBVdIgGp`2epMNSLE1v@|CvA%uy5TWnDv%;Ml(tI2{nz|Ev-4W zd7u$gwZuMH$Hw16$XV)mJu!x3&0TBY({RT3y=}zjwr!Qr@a*ce3w{DUU_4`X_#;~K zIU*(2)bv%Pm1nog<7)A?{a)Vcg23oI!wM^|s1d$}r*hpqu(RGlcRr&s&#)@`5OKGxT#{JJAEHt{ZshDc#WwYsc>({SscW#E5)QMc=&_J3bOK!-_ho z-AR7n6s$#!pOJKfb?gW6_viIOnjh@JGQN*Hwv78<2+n<^Q}Xo{t?9GQEr_6FnzHwo z^sctG=<|1Ng3+Y zf83R_)%mX-hgE>vepR#y24OSi58k8S5hGsQnRKp8{~o7Zd|JKpOcmA8?Ur7$QWGGM zTvi?1DM&E`k{CazbB~Jn=QMtVC5lz$N<7uF)d*OsFXVU(vtuL?&Jg;vN^-G32(zbJ2 z+pzuJK4zrn18br~|86R;`(9q_TF@g$2-G|9zvY^Pr>I!XC#?Lb9eT8`a_UodV&j}w zNV4PWb2PQ8*Xga6S)nDd*+2$C2PDc6N5Fbr;HRz>z+@uQ|eMP@a9{xnY6m}QP=gI;QyKK94>(dIcu zKAyGrYffc;M%lk82LpBZ8-8EpK_W9BfOy3bi>D!w2LDAa}~>~Q?{dZM(Q@a^(Xt- z!+g1Ad#DL<7JSe#q8MtKQS<$IpYzz~O*^)&H|P_d25qV2<5xTAvnb{+eJlbbu_9L92U&`9Z~F3hcN9pMF-C7|H!Sj~5jh4MGI|s-pLFSC1IquBeHg z%&6@L=r=85GEN}j!>plLLwb$O2R>ov?BvF-#T)$Bh6k}iJs5b4!`xX3X0q=1eZC{lVHEj^St$K*B>>(p9qq` z`*F-yuBY9Fnp(keMHN=tKav?GNB(r?$E@bFYM6$6k3|rivmHpM3+XxAxgPAmpY|1a zqSIDlcRCz(Su_vjAZCKUK<0kNc23SSyZ<@M0QoWZ9ee^y)Fk)=_5|qrSc@OajIvYL zcDeDq0pdAEP^`(0b*&bjLr-_3v%DX-`oG8c=;r$fzjV^%a)Nq(i1t5chmmWM){tmf zU$*l}#--OZuTtPAK|8T*)adyiD}18lE);ic`z)37Agyud7J9$Q-y*wOah2z7tPQ1xoCSHb;wAwXUTd_bl_CjeXH9 zWs0m7xytjE2l@*w=(g_aPt3!;p{x3c{>3f+{|B-E@(igRy~>!V)-(GDP|yBB8($Us zFWz(E&C86WyY9cJllEVFsC)g(io1)t*T2qZTK{4*&#r&%EY`pH{w*xv{jYz!*B|eb zR5Yx|-3fi{rc~a2%KIRFaF;JE>g9i#xd-6Lvo#Fk?>XsC(vCWr*xgZUJQLel+qUg3 ztZm!8wr%^~wQZI6>!+|T*C@|_-ZMNu1vD;Ul#FOb%No-bI!bdoM&HvR`hgzR z*Y&ub)IapJ<=@=&{*PX8PXBWyu0?h$%XPX+x4R{2D#QV`f3l*yBsodLN?0P?p${Rx#1LQNh%X7mmkPv}O3w6Z#Fr%JZ7t$U9pcL>HCgJ_ zY-v!Zx)elw@yaQ$0M<(o>m`8o62y8b^Iwe$Q-cbVM1`qC zg{en{X+VW3=u%4z8>SH(CWj5vj1AL@4bz4V(}fMwjSZ8mq}$E?ARS&JOA9yun59J2vAW)pJEAacx*wWdv-)|z(Zib8^> zQCP;2SB6bqIY1*AD&sg&V@N9FI8mc`Dq}cN;|Nis#Rl5`zWa$v+)v%FRF1Gx<^JgY zttJeWlzZGgr-XanJ+DUhf_u^4zvNz4JE}^Hd&^7hSScy2lyyGlW194FAJ!BnZOa5z;PPGaT=4?zZI}J+U{w40LRJG@Bj_>G`s}I$cyPL5Uwl(Tpor*XRN>Gn9?_H;Wyw>^%Nr_Uug zPM+S5<2ZR7Cy(P4psNA8>gj3_$0KI*Jp{w0=bpppJh2u0yV^cJCg2v9%*tK8K*l8NOna0lGI4$Bh zE#WvV(%U6^yGU=B=xrs2ND9X(Nhe!yoJMh+R&bnV@kB;(oMv&HMrr0O%^anZb98bH z&1nVAX%@|?n@*0?$q70+f##G#b4sH*rI1L{v@xakEtpPfrITqoIYB4qF`XJ|=31J$ z@|k9CrkOLY)wQY(*{KHEsS4R?0NJS%rLF;`E{pOsh4Pd~c`BehC?*Tvw+mph|4sH z%QS?%G=#Y{gtjz{w$y{Rv>t7#31_JZXK5H`X${WOFwRmB&eD3Er5>E6YJ{aBgrzBj zr8NjkQwU2#2uocEOZ5m#y$DPF2uuA4OC1PH9SBQG;G+^%%`sm-r#{%G@ezGL)+&2u)d*t}))75Aj=1KIbpcVXYi{wezo z_T%hdun%DGC)s|G{a^Nh?1TLGZQst`jeQ&YyX;xp2~KG|Gw=;-gmesZExg#FW>LR`+bYw``;G-ox%UXy5-!N?ofMw z7vJ1f{H8?3_u}bjZ@2Sjo{m>UXs9YxgPfYQmuj_-j?=C>K^N-?U8Z|{Ac)q&Fdp?<z8Rs<+l_#=hU7@mhbS-Z#ti@%nOcknJhX(y!@v z^i%2n`Y-Wxv$lAy*;%}p_qh^p!Rrfo2=6&T&KZT%=;vS+Heee*z!yD+&-8mqe1rTR zex=qGe<*!#zu%%tk^dq0L{%_|tCN?;6>;_4itWl;9gZL1v1)JDjXtdp9?MFejOXK- zC>bvm$B?g9H;4ns!*C4Fi&IcF*r9GK&f+0_MLmHjBhP&cKTw~QW{ThBX16}}#;lNy zxF&gVTozZxHFK_yJ2LUz@nC&qar&p?+4@3p5cyhtQ)yS=2tAG+GNrgrDzF9X3b{*s zihKv&hmToM7yzgy4_X!?cI*{279%gB+a?zVriP}J>o;=N@=dQA4vYp zt?AZx%eoO+=Ej*@q#xpTlzgx|UcAs z+za>`zJp)*zT$UL@5sO4Uo_nd{i@=UxICu+h1}Nf?DzEh`$PTF{zQL^^jG5Pc&@*= z*j$f8e3du{8*mg(@Y70tXcC{nHeBfMDmD-J$71%s`G5RZ(Xco6MD#EDH_}n@J^Tby z^Ful_$i%~Q_)3{?;b&pXuzgq;74Didgr$o|SH#sZH5(Vsyfj=L&c_?V$?;c-d*iX; zKpHZh`M>j;|-Dx8a~e3D;p(h@pC@ zE8RG>H;ZS6P0}qx`_MJs7q2!|CF=VO+R4Tp6yHzBSw}J{TSspA9dIZ-!6B z_rs^*>+oavUHacJNE{KyiBrNXaY0xnt_hpMj<7E#TCr5DAXbjIi#20?v1x1_JI3zu zYUvwe-*|XDHlFNzi|5Bn<=~UQH$EJnjL*kcs0j?C;quO$FkPhT1%R)E2#Fs z&*xo^F~jk7k5W>aWPLK#$kfBHkN*@C&QsobzLR~n#eY1l<~uzv{iTyt7KqZm&!jZT z`I;j#XBpLB@Na`ht142hl{)!OGbiUgAHM^;Z6{xv{7L9j`59${Yn$adli)m+{2^V2 z%-8T|s#VZs(dDH@^i!}jz5CJalM!NxWSE$617G34!AH?VdMA6v=BCMhPR~g15)&f> zOOUC`ZP&+HM81wDi#RXCL`mlyu?p3Mvs5PE%FHz%;a{`*gUK+bk|O&*jS2UYd{Dje zp>~e;u3z9&@Jami2KY#*NN*3OeZ#MX-`%%AjS1}J6jn*^f!@aSHpOX%(*WcZS~}^6 zbDj928Tx#ZXF>P->t>`$4m5L3rWez)B&#qjOTG^IEcr&9x*7MjD;a@*VL;jU6Y`ZIROUt(^yFnr8;1Kez1;LlaE~I^=8@!Wa{Rqsx$Y$EPjjj$<^JrxqR#`<25(nEY=A)+1NH;oQrj_ZQH7Cx2aR7=GnGw+qP}{-v8Zi5a3|B(CK3= z$}8*JahW@^bUv+E0sQqB!GIHfM3O>2)eJJ5UK))^MhntkDnKT)JoKn+98VFjDn$4M^YI_}~zUgABz;y2mKQ=y7imdezmzW@Fq zSl~hc(WFsGE$s|5mz8W`ic?(7_1w+lyv+N2&F`|4mkcE+Tjgq2zbRPaN+2<$Q$!sd zj4+Q?Y-K-Za0xeX4^Qw4AMg!-$X?zGQ=)QIp%x98f)#EA5laTe)YHi*^I6R{4sa%y zawGThB(L%z-}0v%au%0y6Zi2HukjJz z@s}Lss|Y14PgQEukSW;UK?reVQc5G;jI)rnOmc{`xtyE1pQm}9kNIB6Nq&k{it<&h zb`6_?EuMrDPZnh~(Ze(rv5p-a<{Ylz79QXk-ry5{kmM|XMJZJUs!@kVOu-H>3=+tu zoMw8N&SKWHlOvqVmE6jMJju0 zKIdmy$xT6uRfdXHuWpT-f+M~}kW3y`v@yUema&mN9OnYA;cr&z8NiM>2;lJi_hD!D zIks)93EHp;o3m{jO>ACNrMl{x*hZC9ahjM_oXkzw?>v0_Tl2k>a24*rV|WdpjL*bO ze>2)lH}lP6v)ZJX)P#iWVpK4x(_9UUQm|CPq?~-Lc5iZSUJkapH?=S!3D>zdJ0mRt zcPN;bl#LzYzW@60f88z~`L8>EnOl-mh{xQUSD2iOXWX05o5L&aEy~DE#ajv%O`43i zRh)tkRGf;>RGfw%RGf}qRh&V76=zaZ#aYxx#o07W!^x9qf{K%AmWoqofr?XUk&4r3 zg@PrCMHH`Lei5a*x0wIUDBHc2DTR4d=w1M@_-ka?9ePT~SPxkI^~yNOxB~$Q%6J#C zyVz6gA$AqJi6~nPL0HBjq96Qh@6MF!!)2uUa#>RSxI9w*xx7*XxO`Frx%^UtxNNDx zTqre!i=>8fIa0&80#d`df>I;6LcoAew8f~{3&z13>yj_i_rO2Mzl`6T>~XeZ_hRSR z<@Oo-2~NOznnQ`yOuOioGt0T;+zSi|EDP)iJ_`*AEee%}4u-ph7lgNj??s%*s7QRI zJhCU!4(9ijvCKSZGbhZspDfY?3?4`nMd5qykJ`3v+jbkQZQBZJ+qP}nwr$&-?ru)< z#hLeJMlHz029~mn<*Z;Ot69TZ*0G+AY+?&r^|MntwbMGiGdZ)fIIFWehjTi&^Ej{b zIll|IAXmA@b#8EzyWHbG4|vEU9`l5!Jmb0LgihonPD)JO-PUc~)9u{VBRta6+{?Y) z(L+4cgFM*7JlxaW*;5(8NJcT5F`ms>#(A|Ddx@8Ng_nDcS9+C~@dH2d6F>6{ZD{LD zzU(W$>TAC48@}mVzU@04=L9D?#c9rPmUEov0vC<#h@*}P^9 z`d+E@Qz(skh0>}|D4qI+(rZ8{g9dAuGHQfIDXYe4l5%Li7AwD&X@iRBR;aw5>X|Aa zP$i;7RfQbnP*qA(M%5@!dDWmIl~j{j)K+ck(NJ}1LUT2wC9TwycX?0E`Gil@k{|e0 ztq3=#SLsA|y-rX1=v_uIQy;R8WBS>toJ#GS#%a{vxtvQKT*!sh(Is6{o&CPQP#3p% zd-Zb{cTs=O@Ei?LhWDb6%3} z%62Dzw8k@SV=+6nZQHh48XL{AZ5xHP?Q*RO%hD>j_3GuNcV_-m@mCk$OMRjbSKY!nzRV~22rYRhNKk2Y7^Mc$VjQo)>tLmw1_1 zc$L?9op10>zQwos4*ylJHq-XnLAz=x{VeD@5+2Z(QLvjvMknd`#I9{ZwG4F<&FX&8gL<5D z9gmjV`lL=@j-sJw3UO-!0m^{@EBs>3%c`8klbFu1`ntgC>wRN}*9%_!f6VqZL7T~25PMi)ane>>eltTjh;ZN4Pz$y19_$>(2C-< zb{av6Hn(FIUBNL6VlEe9g#zbtp`;>;9drTzRiUZZHV>^uN~C9{*35cWa7(4{Fop;( z@eZS*mC(jGyQLN@2(c9Y#P>rkbaNZ10vJbh#0L06lXiQmy+cDg>)-XGONY}vHk{dx zevDl+nw~kj`gYK}`VO}sqz!P*S5kYR8SQ|yllG-kN9ss6(lI)oUR|qe8Pw}~haq3> z>zMEjzKM-}i*IF9FZdxgZ^~d91xC!~GQT11`mVmG@9PKpp?;(v>nHlDex{#$+9MI+ z9l8CV?SA#TnzPbDi+-VB>R0-;exu)dG}!cf10mem?6ZDH@8BK1lXvzm-qpK#ckkgn zeS6)fHq~bJS&T_Mygo@WNB8@>oR!x(q|Ti`gExPx&Ybl-{aJsv+>&FTf7Ra_40MgG zIpe1(e=gSHr6$2rTRD?+Bj{A>VP83QN|c&g2`o)A2;fh_T`pr#nx=Yw#y{H-l$_p zb_I(+J6L=}ax2zts>L7mr(8WgtxjVei;A>Fw&59GN0Gz&MEsmeq@)mFNj`Nr>$O`>Ey6%%Z3{PN+QEP%_DgJFFQQt~bu-eQZ@_p9y zeKMF_B|m*lv)Sp<<~ZDv>*}e9Q!I;g(%b>tGI&)@|xNeA#LBR#oqjy+k9JSwX>uRwEh18 IPew9NR8&s@0OdFU3;+NC0ljDd0OaQY0RR9100000000000000000000 z0000DgPBJffhrq<(S97cI0j$MSOf+IiAe__TaUbv1=eJk{IwO~ouZpl zJEXh+j-&$C8r}_b4%>Oa;B}J$&2)1=_KH}*jd9uSNSh$NVD|t2|NsA+l8KC2a>%7k z3k6UCR8)Vj+uWvT7NUgUl*AmxR6{YLimikaRYw(ySkBV-t~}}nnlPc<*%VjayIKp&=yq#A`%b3z#dGUwq$PiNMum76dWXi`y zVsvEVV?)vG7~>-5?qM61yL*(IxV!Ilj1id`p7Da#|JKY=#~AykJX1%?)U~&h2Si7Lg<;y#lgFO9vLuQbKBqV$vIHK0RPP%{7vrOvI zz&q>LR2XWM`cepu6(0I-$^em>Nko(E<%Bjdw95WF0AfP24nOdhD7UR@Zu8c-I%;bn z2}$_1gJ;#2lH>@i`ciQUv&*OL{RKj%0ZO#2f(%rqSfw~HndGfF0gujnYe5iVaww*q zfsj=FB{xnX=(Nj^Twg8XO6Y(Yq{FSeXVWirM#BuJ z-PtbN6<${~;T3bI-{^MkTODiY@=>jmeE~0_SBpE?@G>xV8I*_?W1V=1=jYbjUozsx z=I*@s-j^C!m>Bhm^QPVjR)aQPQu%Bwm?K2wU?3ojxWSDYHAZZ79u_K&$Uhk1Pw$px zCT}K_3=<=p5E|AiX4Hgj&s@F?x|E^O-F8eZE zuzz0I)7q~zy}frcYai9K#Y8e*y;C(rGAWQEK0I9W{eP&g4hk22cTt|2*lJMQs@2RE zrUo@h4fen1ZR=m3L-*9FU#EVtix;#GjbTQ_=NJV#;V6hzdSQA`*~ zLZgfbfZ(IL%wfEer-v6Jf z>hn)m75#5t)F)ubfFa=|bC{f+8l4$!hY1lUW+o;~=-3!B0%9VIEp1~19Z0$^?w)!O z)pVcTODL^s1|z#>P!3_Rc%;gZE~`9`kR%uXU9`~yX9VCwSi+%u54i`>*d}Z@vYG@y zRZ>YR2xzWPp#;19XHBfNiHP^Cat=yubEqkq9L) zL_%apC#EZJ_v_ukM@6$r^{5#_WB8fQz9U^W*1K=vi%t=%XmYj@pyWj$ht$UHTehaN zpO1$ML$i163Zw~UjV}vXi}}6Ag>tY@tP+R^^Fd4M0D=GiIB4hoowWt8Ngzxtr9urP zmDfN_IMI3d<-Pu0ij<&ZxM4PrN|`3vly*aG>wCGV6ul~xhl{}#DzY|+geU{{;}x&n zxN^Ncz1hC#-n|SjV=tnAfEAsyFGRJ1*yYg9dVBzvSH&dng3Gp+f_7aL#sS7nz%RxR zv{sSL{%>O5^hAul-H9e5AZ7*`W8n!eW06H?oP%?mmAQAEvw8|0=PX7NRt94QYgl%d zHCW*m2@a6UUe(_J5X9WR)Viud<4DUuo5@31%W1}ElRHW;?h&e2htMd632S>nx0@p7 ziBzZrK@}KSaD}cUm-#P!Knp+xgK|;T!s34$M5iStC@Qqj5KvGXE|%I?27e5W-_SK< z)0RXT+>DDYAWH3jZ>DAX-~5F*L-JJkhcl!sAxj)r24`}}8JGI$_q);a|Cam0kQ7n zC3jeIrqi`HTAPo}0y{R^fR=y)6by?1DE$9BEn(B&?Er=Wod6UD$L~H_vuitToYGOR zOiqX4`DEGbPM+f2IE+2-np!@!$XXRaID$17oaFyZHQPS}g&j~~DJRe&D^{0YA7baO zo&5`tv$G(%yP%}S0?!0NNCp9g1whFlc!6??p>!rzDMOi}!hsh_hnTBarqKDiE4sVR zWt&6kqIFSLhIpL5(mY+Jlny1E(lS;lQ|I4dciJ$F6yOq8g3F3X;a`6*v;DckPEDA4bJY;OmJprTE!Dv==Kc#4t$n-q z@9J6(P)IE4MUJ!>YQ4**HVe2BE4d1Xbi&|Hx1g&4dZl#pB&eI@HMm{AqH5(UB1XMA zQQqg|uJM+;L@>e#V~h~Om^6g6e-CS7MvZJX-u*p<5QY$pF~S%lL?aqeG>s5Oh$i>8 zB0(`AiDY=mk>4r}JGrbbT7;YYI|dg2hl78vNWW$vKVp>MmL5ZUoi_jKm1jGtdX0{M z^+OW{I)DNxe=Zx*G)T~3U;vkZCXv{n#FYS15~Rsdq{c8~Og7zIEml~sQ;$RXU39}O z554ft4{6&J*#_BZdu;!qJ9I}6UtrYe4NhEX)ven4jjX-yW_HQ0-u1h6_iTQT_gruF zVW0O+Kc#j6{4gEnfC{a2Q!+-JED{vsuEDa02iW=h7$B)1_7AB z0X|3q2Ni0dDJUd7HYq))sG_yKqkC`^N(d@btq4`L=~Wmph$E|7VV%>w?mf3W_DbG~ zlBR(fmcsR4(z))cX5)_i!?Eeg`VG(g?pt%WpKTqas`UhnY1FdX1al;1D-G-T&`qme zIZ;I*Dg4sbWy79B2Mg7WE4GgP=<3b;uhtIJwZ48Wbh=~6poIk~a3h2S1ZZf75OH{g zEEJ&{-5A6ts4)Qz7D*u@CyN3GQ^9aX(o8FLw9v%>V?^Xssj-&L3}Pr_m_jK_Sj{%R z=QQUV#yVzNLgf)Q4aYP6PBo)YSgA+MJQHc<*H2e>ehRWNoyLy0*Bh*SSQ8zqbFEw5?~fk0#$QrI`r#)y%IFfExFp3AcS1=9qC`twTJtEv zJdY^iYiqQ**0-x+ebM-)RMO(swWmX!o31UUn{D2OmmEx)wz{?K z!32A@#HCF-#j4i0?!DjWX14GGRn%Wp5mik!QmrMD(p%kWg%n#->E%|Ovidse??Yo% zsv@Y-pC}IvLKUbMHKMU-qCr^_P0ey^4Lid_PeqEAC{vLt9o`%FzZM*t7DUt1EHoQ2 z+Fa*l95lY-L)g&m&*~MBnL$pap=zoX;i3RC3F($sTW8pXFOd z{WwrIZR56KbmrFPzHK8Z9{$!vWkf&uryQB!FmM()W@-|_Kkqg+RolIaVJGC5gx|*e z{^hc|Sm#{V{F>^*)3ed^Y&_;O2l3kQ^Pk@&$O+=rrdOYg$0v-ztlvM+RdtCsM(1Ou z>2_Z`&8L#=9B|4hF=7&nFyh2XkZ=;wKL_1}ok)_7vXqXXm0E%$;q&++7YKou( z4ib>crRe)9(w$E;GTQ*OfwC;bD#^npS^w zP`yIo&KboP3g zyh~Kn`_$YSjAhIBmZBTQKL?Jr4U8T-WW_Y6B@UQTjj$cpI4(T|hD1hu%6)Tp7bsr< zTQnF-Q!A)ex#?QI*ynHljyC)o6GegLd6V%2hcB;jY@bFSN{ulLH7%eeOg_j$IJkkG zD;PUXKzj*v->{)dzvoa)a2ftg+*u52Gxn$$?(mH`h}j_h1(pd<*sD2w$%JFvIf)%( zA~Uqt5WUPn9$Dm($3aBc?42g*v%P61t@k&kNQPQ2pbDmIuCTf8DFKu6xAjp>V-hG( zuWGvH8EP5F1U$yUFu=F~q=$NJN`|ZBD8-Cq|>m~8VG!wDx+3v_yek)loB8J6RnU0mJVQAT&;uXw@`H=P2HNINj=X}U?( z_<*i%`AN*hjH)~Rh^FVdZ>COIcnOb;iXLNk-e+wP5Ev935*l{qznLflgCIQd5^N#4 z$|R-*PkSu?@lc5cP`#u#N)CrjFD{%}=2>K!Ro1hyJK=Bl_AmAG9pEah0`5WLme@jo zkX#T51PEb+?p{8O@*S=s6#yUswg3>w1wa5Gz=mth-nIdOLBS!RVc{u`tX&9NMW7?t zF+oUZSonFUEGd=7)G)X?XQPICLWx1Wqoqs42<=B!x=u%p5sO~0R9DtoO>DN3RsX{H zU=&3MtYGM=pI#to_@r$bK0<88GFZf_Id&l9V>29~( z{K}o0E8`?6v}ewVbb9Qm#t-08FWjooJ@QLPuLr#uHCpcc2>I1Vw<W`KM>D&j#`TP-sLH6hmNTW%{XVnTd3H+) zmj^qe#-bw6b50YaG}-H)N@cihJQvFn85vXRa(yTYHAJuo;Dj35P)e|gt(DJBuMOV2 z_=#1UFp693hvaHlrckyS&;j`$NMb z9o^j7OmaHF412?&a56Xrq08RN zArD=+g8)OR8RdaaIkrfxw93uMDQZ||z0JUXcSy zM_6HiARq@ejC3NZc9qw%>c0c%GA}#I8D{3p^fwD( zT$CN|tXqt${KXQD9%Hin1%gR0Cd91GI5ITr>L&y^H6N+s$WK}EXdNA7GG)o$wKn~f zPdwY?JmBK&7;QXfk!}M#LLic1?^xxR%V0viVW=Q>04`$%FV7A^TnnU;9D)yr@PF;lXe?zrX9%X{pN9=e z;RZ~zvAUgB3(jQEhfw#9$7vnT>Tid1&PpBskfjVHUvdnh9Qt zFa5x#4a_GB57_ha$||xUIoKe(?Tl}!5RnD|m;piD0Xnnb%=)4bV*$-w{L`-JD(JP~ z)RQZk!heps=?;6gQc97=Kot!LshnpMI)=b>ThieoJu%qGNwsGrvc1k$7q67>)RuG;Q$* zlMk*Qd>&D^P=17y^{<`Iv4GpE)9G!g>Ds1FD7V!#_V!R!^UL2IIX9E5Xx0oALK=@S z{dY^xyb0k`jESp+TNkQbgOH-WlrtpoJUwI}u+Np9J|_6NbIjmCK|kjcg$`$F8)x6& z?iGu$6Q%H=AN?F!c_#z^3hF1=eeK~`wzjmQ1v!t0ra#cpurkuAgWP#33>F_<;v>|%;u4!9qs>_NYsmN>QgIe-Slv6b6L1hs)1|1y9T?E!KK zK{gB>-G0+=(I7EqLu};RehwVlf(&GZn=vC&owE2-)C)ni?v)5@{G87ert%_Q1O^8p z)27^yh`f)aoyTG;%YCyWGrKrZjMo{Fd=;RbkHloO~0SF68v1 ztFC{nE<0bY?UU3%GRNOX%w(SbgP>c%4;@{;9z^k~@$>eS@{OAj^?w$~BVcPX@7OI8(lP?&XJo_ID~dIpOb7P#QFdUDv|McavAIB(W}>@o2d#u-AK9?zQW5v zpw?%-a|LhXZR7-2?6v5W#U>2u`nLiTot*GLDLc{2OoGt4rN=QnAM~`O!;!!kW@Eki zcT;^2gdog1F=35hy-gVOLA3_eIhM?JJe-=ljxroPB-`KcEQ)0z)TZl4)BYCC$IQn7 z>4abc5v}xFj-4EKXnv zlBxFo`DDs9jN42(8jZQZ4{784^`jT5l`}c`=PAmgHp#Cgb54GOzYM(bD5|dWMu3M^h z`5^8h+FJ5FzP^1lNLP9Hr|sR~4*?^!D_c^FVmBKlsgaF4IYGdOS0WkUt}ZpatXGUIW7;mjGTi5oR8Iw8h)qUwZQ6gzXrFm;u%#;t~& z+~YL#G63`En;W~vqe4;_`!H6ef(0*GYSV{a34Q98C4wQh{+{NJb24%gBd*FGzp4ks z!ytz-*@Ah%&s<^F7wAsFL7V@GM1r4u2#>N(Fm}R`sKUa`N}eZPtNEs;mip*W<)I3Q zkxJSxI)1<2h;e@Cq8u)iGrpVY!&r3}ni;`Ry%)vnCEpeoQyUHy94dgy$(empsNQkj zc1$0EIKT9%1VRdCYyPkvu44fHXgP>68O=90-S9nB$%F0v(`{62VRP1}@WjF`uT(7D z!c>>XO~;;3ZyPU=?n5_3=D8ixo!f5~Znjy3M;fI-O?Bnb4oyU~Sh?Mn!P^+Q2u-VZ zZ}Lq5xYbGT^|uB&)IEO?DEK)E4jMOCovud+e{ZG>8~xz5GEZ>VNLKSgo&jto^tOs~ z1iEzO_{{zLOK~f5=fr(5YVK?cl)4b8RXby*81G-L$ltF=W6Uq=``rt1>b{>3@P_?r z)pIOQ*1P=US&!c@^^iOhsrX_;b$hIV`f-RxfGH+6uZk}+^uF!&T}|j^rdn&QEoz2p z<3fdwz4+z#We6(s?8=j$23ULp7K?37`5F{_%^Y)+FcPUaj61d8{!8-uy<3b%StYdyteWbCj_OlWPRFT3Ypibwd zDCWYp=a0T4S%A)&niStv<(Lt#GS@U}z4`F2!fYd-;+5uOMLAh8XG&5;|5#{7SZ)4R z)#QOH_RkfjI!nY|MNM4@Ys{nfHIE5Mj=)0acO&Tbn|r@{)}n4I1?nLTIPjIf=>{MH zrPE+!3H7-VP_Zqfjs$a#dx@?7!rC~x<9bc~zv9>@R)c_Qn6oR3Z$xU>f~vN!6%=G6 zy!RUjKpS^~MRp+r705JN)0Ly~#^hqoFedfF@dNyI;}`Sa7`xba{530EF!iHHDbV<( ztMnImlQIqk*#Sp<~tyJc)9UZ z`+;6Bb&};89xOFJGnZ@SRQ4k7#}8W$S7k%ezz-j5KKOZ_>HxgCkhsn+j@nHz(lG}p zSn*oS3}lJvYh>G|-!?FJs;T2>H4Ie|$G)iac_~U$_EZW^Jj0=#e-f*q$?6*Cv3&4g z)^J!?2;}y9{LTz_PLiYJ7OtdlZO-9+!0&T~W&j*=BicEvp|Iqz$X<>?jlXMZNQ8>5 zGgPNvCt;l6<1=xg$lzsRox(pV@4u*6{AKW0GNI6~|>vH#=-#u|KHNDZ*=%-?=6?KFc7PE%X%NZqvn?E!G; zifx07=l!C{D6uFyN;0@;N|9Z@)Nk?N?S(U(=sJ06w~ii|y(Vk_{yt&pd@GdSSJ(C* zfpuRKhdvwf&c@a*tXLOd=}asY+uE#JgFR1Fg68KFvvOscZ5eViK(Q~z979@o{>VXA z4G3r+8uq*sTY*)=n}zBN_& z*54TKfB!={RMo%wG8y;T3N=XT53aqzU_uu7Sc5g4{vSZFtvWX5a|GYwFA?5DVY4No zG)Hy%x0#6e{ldsS2nq;BYkKu)C%~LGgJ3d4YhPu3hAdzdNW8O+gZ&pRENG`r!MtGw zG$rf!FofGDMRSQHK0+k^#3n}7LX|8`1uE5V(Nxrmhnbcyj>&){3_A+u3;s5(FvdA# zleb5>ieWn*82rGLWvzzvu}{-Ewu#J@qn8dN-u!OP!eK*M%Zl^Ekr<#{ajU(>)#Yd! zLYNZfN-gc~V~Q|(e6Bt1BK z1qSZhp#2zZYb2V|tV!rIR|<*IQ#NfKm?1B@qNxzJ8;ts}Ou!8)_^81QM#19}o0pMu z4GLEXA9q9KT+_1-ZHA3p~ zwHKM~UwMP&u)c~o!S`pP-n?B&%!Q20$@uNjn zo5>k`E%&vo(>F|tm2bt#tK z!ek;iy7|jIccClWSY*g!&<21)9?;ETP7rAA?@HO8OXf`#JL)r45>X6No#}U&9!q9a zKIt~x8N)9A(w_L_UY5J`UyeS^{}b4Un?^VtoR5B!_wr4H0G+7Vho&r(-P~j}`CzlI zqK||$$PHnj&Pu2HNe40x^~Y~k6UVrUxFC=^57u@kr9v;pqB7kwDX z0Ge0J@&KO`q{Alv3^BYgmJ>|7IL(-3N{vdcXhsF5Hu6-IPvCN{6tbBl4ek&o&x^B| z7%7UUi>=0sflBt1E^&3ve*nSzfOv>GaiwtUBGsJ46zlxM_jqe&`)-(D0Lm8k6xQ@0 z^gxWII^#M&q}Q)tfj=&0%H3a*4I$@kLA;!;`FXV3yXJ@Cws?}s$b-HY4HLdp*LHOSyr*IXvpm5c+8Y@VL88Nz`Fc2e8 ztlqrpvO#)dWpPb)Wo1ouab;maad9Ces7;9KvRKdhX<00?rMN|5RVk-Wmb$8N%KM9u z%UtjoS{J$uagqHT6+IMVo~~$WP1NTkwDC*Q7&3uOr= zymcdq(x!TMKfX-;TO$)4ochuU#24M%x3$>@uq79}R2U#d{Byw>;|aoiUkYZ6>UWQy zb^By%19Y>J2UQpFDcbc-ULETtoWh!Q7^pzNi68op!Rf__yzXAJiWDmAnq0zOoii?b?;tsmVprX4_S2itUUDQju3g6CBS;JC;KD1>Y zF>r3nuTI3O+{5!6#7}e1=wd0*}#Z@C91^08i0lan>who3LRP^B8@Z z&LqZXGE zBG{RNU@NQH&N^Z$aUL5K0%@L8IwLa}kkqGY)u};@Py3499N-vAU2jha3ZcP1JT=NB z*Y7v~gb$2l6#7i@Qzr3LE$2DH{a$_Z{28CLg7Kr~4N@d`E1UlbTd&)3;L66~=YMeb zBBL2xq#}!T43SGW$M}*3tYsS_WY9>ON)NI&u(q&H5NP4$o@&*Ne(4hbZ?$KGB_kw* ziHal*d6$Lmt*hbgR^7=iZo?91TkYBwvigm`J~b(&vs0j;LI0r1G%anxlC_wzik2p% zrBKIWhzXvsLDeORdg<}>rE2|1ixRr9!xpJVLggeWX&0f0WPu)z9otm#T%nV6sa#hz zLkqOby4n)^+O*@kzkB7n{7m2I8+?hcnfj3>T8cJC&#U2TR*kBwR98%KV>}iY;%;0n zJ>^nvk+~#3xlOJ~YLnu`j{xl9F$NJj&OR#^WF%WAtTwwPJZAV|CXI$YCWmwN-kN|*H{fa+t;Nf+xvIeF6%RWyOX=` zb>%&MVovUXR+;uqyVKG1o-{u#N?TJSE6%1fS&rt*`CQ&m$l_J>%K_zgDK7I$W$6#( zFbGjFVJ}$Wl+X*IAtTh{`&o()eBnRb1&4dO&=sF&-PZrdUxF_5+&|(Z%9gK4sR~u< zG#TTAkhG4JQn^d zB8pr_u8K@YCDDcGX!Mq7FGFTdOfPf8+{V0#1;j?N$=IW@k8BbfJH27i#~ce>@gJ&D zk7o2?Q1r!8MCL*{OSEK5zu9D7=B-_BC-!MO9M=`D<&0DJaHX!oRk^qR8(;acfBUx~ zE;NUch(*yi!I%(8_&tX$9JNrC_;uoMxyigzUJLKS-YJX2lQc=a$!nIVC9%mh$#?fJ zh|EhVPwD2rytIhl%YS-cW2!3k&dq6QrnJdh{$~X@{m1k_-HTQZ2wsfJ6?`jb6#PC( zs!4rQ<5X#pUVIiWE`Ba0mrgIqHJ&!EJpqEjF*prG12Is7|K_#c&`0!h^-ld4gJ^7x zeq+J7&d4!p4b=wGN;F14REk>A40hlce#2_Afdr(FG?2HHL64?6`U_NGph5%;uptd? z*uXrbfDFo@4&Jd{Y{4jNU?VJv$=C=7ocWwPc!(eIR^HD)a6-rve4#9c#B1e!@`*xK zx)rf6QL$cHf%F<#xoO{&TJO3g3avbup(-wS@(KZ zg}&E%fkunv{j>LN?~0c8);u3~A5|;2jrWDVo$defv-5ND3->E;Z|ey7U-Op)umb)H z$PdtTjS2J$yc-xA_%cx5RnXG-z&SCYjwgh~S0Lff^pYbd<|aE&j~M*$Y2nMcfp)B+2t4Pzw# zpxPnsK%P?oVEHTojH3V0ttiYN_%TU5h&si}0G$4fWR4FELN@xbz(xO|fq8?C14!6u zdcmy6QFbL4X{`S*-tb3Lkhe+%9*gMp(%E9Uq2%P6DI|<}!|3Qk@vzM~jzXE z<_V*9p(`q?qgRxAhU!iz^0>z$E|RG9JI#oWQmq(OSi&S~r>iMo5s>I$UFK85c2d-c z^0V=gFq)W@!h^~2#2-NpgS;;YCKxNrNN({E^Uy<%CS?ly?<=aAIBNFD1%MZOH zt5uCjq$P^3mE(9b0WK91(Rsiumks*<7BM7vASH^j>NTjb>K< zby6L%toHIny((t#tT0Cm@&$hJ;=e)g-!b(xELxf7c|(Dphd=Y^f&7*%l=r&F&7-Yw zfFCaKv%lS9Kd92BDbF8%SfYeQeor)Bvz|DR|?*z^n<5>w;o4fA~TnX6Ud^ox8BJT?nURqHLRhD>FotjS@Gr1D&H^@}^I( z7u2CvhCI4k6Kq43nmJHdTo z*l9RDMl=o$NPGug-D(ET{Ac=i2vl{D@+p!&Glp0p-C;CSpdbCh#d0(WVHx~d&<(JV z(2wH}XQrJ9Nz1rhi>hAgxYC1mt(@4{b}$Ry2WANvJC3mgTuH#J)p1$EgS{Z|T136( z@`HRd3!U3f)QHSO(}PWGpJE?X@AG`roc0ao zo=!EBJP)t^HLdqEgQ%WBu0l(wMG6O6IO<#^sGVrxzCzG*94r8A2?3;t^5^p92znZV zL;dxRr^DniG1#g>NEYW zzMa;qnnP<1QVB(_TIrP}w|%SLuesyN&ZBJTOv|H8ln0s8npFDKJP-w&Dd_hrLj(ue zX1PxxxnQ9Vj$Fuux|hl<39-O0LQmVlEP7rXI@e!~HT?y38VP!S!z53CCBRlk6d~gD zfku5C+N1?6*>W#>+DKhUKNhG9(N-D6Qi1sAtdsBz46A(_d?3IbCReZ)dh+pU>kR~A zQRuqE@HRo%K&>&ea8Lk-`|=$9)(?mg<{Re%Bx+}qC8@*k%M1}~JAUjyB_^rtca2J5 zQG~C?sq=u`A_iuiR!fC*s=;=DRKtPu>w_c0`n4W1t9zoy!ngJE=piBV(>&mzJNP0% zck#9_zZ4ki6-J{IEyBNmn#{pxcB~^2t1UuA*{^gZTj|alP_lH6DAjSR3sUUc#kf)T zAHv>--hKul%7Z4?0{|=K!we%SMCr|=#Nte%XQ_I;xL5|!~njTF+S1W(x^VyOUjux%}>(+{KtqS zK%m}pvmbX%aGs(3*@>+cmlAGVwt!yo5DX-D$Gtb$QJU80{>d%{Lv^#d>D!(fp>*cu zYH`_1&y#NumvuzWkjXCB$<_$|P2* zr@XW%tBvEqqe%k(M9ovaQT>gsVe6eO@?HY@YJ&8KT2^AnlK$W(zwe0y5|h4H-$e%?_{Y~(Ff1^$WvvcsIghQd<|76kekxez z59f}nNYm8ucbF$<#t&w-P$8WWuQ{Qp^KPLS3+ad@@Kf-i13!(gOH32SC0b+rR2IJ$ zC$VfIOiZP9EMv&!42~L(xKNc>_|cp8Dz82-D{ri{Q7dulpX7=*ZJthiBqFO!RDVfO zYh-*tEX+#geH*3MDK}d~J-k+@;^X8amMYQ@JC6jB_sRDdUDqal&T2FAbqXG6i1Pp` z46%!}aLB*zsT!3rk@7X&cG4 zmq1l5f}(8YpS#}tvlWbhdB3fzovJ9VA36e#yKpH1L)9_M$6gWdE^EHR*detX&rEeY zk5P@YAV*ST6aZc!+_Z$vAu7h*7HzOrzsR* z^SOL)T^qBAQTCg-eCaI>|5@w7>YmM%3su@pcXgRN)-R9k_7MMIF;~&5Kpgx}ryD%Y=|K%Gq4Rt z!aO)KF}i;$zC7OFF?W{bqTgzYL*CihcOVdtofpHmuu$KpX`7BC?){$q&AUqEQ#3We z#2n4tf}>e){T{z!fO9>&wXV_b)4-MAqOiOt9+!lT%qs`PB&syY1ZL)j_;nS{9~Y_~ z+@7*b9|1FzLedG!n6g2e$Dm<{YL<)IY>y7+~GZh=Ous{ZceMSp!!fnt$R)6 z8u4!kQ9p`cRgw}dik0O01JzpVxxpgKxE$$Fv31?6`@$hJez=(~#(WyN$i0@7b?4mM z({HM54d(XSInPW7R3?xe`Apun+?1e)x7=2A&gemj4r{D51ChPbO!=Ec_GutgbnkCL zMf?50wdw+#A1@v&Zl1prOjTC+>C|;GKgdnoHbtHNd$X-arkHA>MtrV;Z`!G>p~b^Z zCUOq(ouevn-Q^G5nxE{HW*Sw_T7W8Jj5qSlRs$o)B;{-~Q46`7ZvS~B-ojEiGXgY` z+n~!x7MyLF2EWI1Y`%i354~f^C`M&;vTZWSO);0SMB$u!z!Od~u{0)#eAgA}1B!ea z8YxOXqhudx*g{u2UvBaZA+0fA2(-F~*Km?IE4sE?(Y7N@+O**U4rjr=29TKzV9w`^mz2i_iLO8E6|02YPphpow>BC3ov710 zdy3exDu0toP)Cm!E56yKM2yNiFgUOSCo8pVzp1|MFx2lnG`M@<%bB_zf4wvjpZEOk zLUobZtYShzLMS10J_OK!RQM2B=ysLK(9YF2z&tTI7%JwpCa4d|bwODg9*)LYG-PSG zmj)My&&-BtL)vS$so&8;0+jn?4j8sVmI0UpDpjEQO+Ur=Gc9~Q(&NIv!&sS+QM-wK z>6mxwcQoI#{9u>=%H8q@E|eo~%T-zUoJnh>=H}v87(ZU&^$F&58QlB8PUmjUz$t6q zd=7Pp&|zhrgYGx={SrY0gV`m z)tn%cB!e|4f1k_UQ)b1&doi{bXI6|^@v?pJcfIbd5Uzcr&}UeagG-Mm-gRJ?gTkAG zl+7Y7)xfvKk!F0rw2I>=b#@5`E7~TApJQH(Fox>*me`Ic$(S+^oXA(}G>-;|FpN>Z zbAKgI6sGUGe5OYzdhz5@nAl`3rrC&QM{f#pgdPL#3tPocb^m#n1w*v_ax)l4FB7oX zJ24=Xl2C^G@sb<%FnV3cN?W+`t3aL@D;%Ip$sQL#gWC7tHJWcSRg=H!(2KJO+Q9qd zT5XL>n~=R^b?$5gyNQbc+UFtJ>mb$N03K<@K@%l{^9#*K$zXqT^b&bDTxT2N`3G}k zT%X%wUjUT22=2>xZD@mN>%|Xl0+tJoL26Ht5c3Gj>zLFGvbBAJn&7XBo`6n`LvA~) z9VpEpJIRQD=TOg=0tp2Azr^ufPsn>EOV3J#;Rs$f9>r!>yf@0HfQ34)_yXOwC>5*# z(M8jqy1{3Tz-zRj9^&!p7zKwxTLrJd2{YRSJvX_vsZ(hyK48N1i>EX@&2})vffFGr zVVfe9RnzvNA>?jNF{ZSq1)L1kXP4{v(1h7-qZs)DBRh#t(SfcvN(C8kg0}hotS`i% zJZMA^^D)N=+*XMf6ZobfXv}NWnST>fFI#RVTuP3;^J0{MH26K|T)p;?;6gpScN`ge z;q-QqY{M7O7l&sEYQ)*5-{_ne6FG4+;^Z0MfQG2vF@KwI`B?G4YD71-K01J$5Rr-+ z@OZvINTf~^`NN=<=-QoP|C{}xxjxPr2d>viIr&ijCEi`+gWo^ato%2*@|T54r}U89gmo*Q~lN0 zaC6-9#B13uE;I=Hf`G5h8nAXoOFIjfj=!BV94{YQ?JSCqK@@UK<~oyc;6}xQwv&co z3F{EDmP4#V$iPlw$${KDafFp8+Jf5Ni@uHv01xd$&Yu|M6MoO85iiH>xr@U$Iqc*UOyqr^q$vmZpXt$57VWq ziKY7hL_oX03V@N2p2A~~QQ4iYvOl=QHwWQEXbc6ZK7SijJMzayr7~OvmZ`5ck(U0? zQ0<@Bp#2$Kf8ZhZ*ke4;g7Y^v1=3{`(hPe=8ZFI?2z-&HU={g4tA;HLTw1JNMcu=L3EgqC2u9^w`6JkT16Pu z%0jfwZ+z;Im9`v{w$?GKKeawhQoDEhL}^a0hUxF9`GUOXoOYzy2FzS}wSw$j+C9j4 z=@!^$riM6-CR|otef66DnGKQpj^)7Z?gC<&0`@nHonk2`1^sl}A&LJ2GaZI1vWW&O z$`NrLvx!)y1I80?sC;630KGkN0Xw2|$o>#_?R}v-h>iiGc&x}Du98QOj2DMJRCYj+ zJw(?G71U&=sMt)%;v$YHJOX#>5FVFjXr=TIsw?2L(YR!s=U=wgEyA~BRq-~Z=q5!np+RkB#~qHpXT8*C(f$pi7S(u{X~QIAQT&BE zt*HrJWfO_VcTniHjk@SZB5DuflZ}wYV+3&!C|jD#*u_!EcMj9?&acE}apuyc)XSFY z%#11^u^MnRc(ad0aZKIP9U)bn=ke6p#(9D+==YXwId3KfrBV!!k_~XN_mZYcq8uyRu6>x`$}JorH$OFq->r$O{eYw_e5j&Y(Gx19wMrJQF{=LH z|IU#GS40Zm-Sf-*mV*;4fQw10+4gaBWkpMdyx?WI+y@?)EidRYq`}+jIfJMTG^L#%JM{iv8k6jUOP~@JAN?h@;Gr3LfeXyWrd{8@BuFji&AgJ zDQbZ=;qnO!*hPqq1Zj)h5qBM|`6sy5Mm4Xkh2Z9Dxh=XiI~xIZXusLR%v47uI6Hy^ z4yg&}Rg8sYpm|JADeTb8c?vVRW<^djQ>i0Q3SZeLH6?}s!`6h_s5Mkeg1iKoW}bL2 zeP1x?KO^eX7x_Vf)@v$Ep=Q}fU`M^jrb>YTes`0Jh6N|;EUVv{*0HFc>9q^#Tk~76 zX6WA_HuI!aszQhhGt;x7^!cO8`n%Yj5$aoKsn$*EzIy$5vB5oL&cl)Fso(=5>+mFI z5)KzR^y@zdXom^_y{?>vhP=kSR?)^5l1Q$T?PLceE@jsFqe^21yDg?Ja(7{0<3*A4fivpb&U8zKv^R2GElx*QJGXyuCAA6 zzgi~|tD^){YO-z!W3h?KEmVTdvIk^7$V0$9gdbT((`Yn}rfKCjz*7IJw@`9a(h6bD z&oj_FJB6`REcOPAy@9b)SjitER_lRZJzD9ch+W3R@i@DTvy-9{_)-=6e{02BD$i@B zT(W|^55IbFbEG+qBrDK|-gqgYgJsid7TG{z`-9v=6ebx`%qtu_DNt0@F^}2q&zcod zzUnS$f&uHFK9zpLf@uBPU<~76{=i1~U@*u~X5_v0VZfIC(I36vW4NioZ`!T~tpsKK zSi`Abf~c{saaAl}BN0PXB)2CK3~#u`nVL!bb!%MB&aRFo10O;aPsR^?(t`za!?%=~VA@?FU9SG`@ zu8hHVNycWefHRn~;QjTeg(V*Mv>uDAsouZ*h-F~dS2^Dl6;T}8zX(zYFO5PA-Tc<^ z879-{5@gpiO?v2h>!^ldFJxUD@z6{emfwKfN& zGH-ObJQBZeGK}WwW~DM9a#_qiAaUGDK=x;J*J^Ab;ih?3h5=i2J}sCmp61wq1vJ&8 z+d#rJ?hzfcO;r8X|6PYjuBV9XY6N6kfkOa1lMUB-U!!AOovNS8AHyr1LlE_6$FwJ) zPSC@MiU9;NL5vBalcSv#ol>P_7|oJ=v^tNV(k;(PwI6q1^t6PTbgZ$r8d|?5Y~Kf_ z`eK1yQ%GEs+nL(rwnnY~32}@wL}WmW-$Z4cvEAw5nrI)QcJ}IPy}?RXo39on zA0x;G$e`BbXZXCe-6fv{K_eR?Bjuc`_po=i+eL^oRk8sBn^E=dbBu4^|GpfOt&Ac0 zO)>Et_6D(Jd~SA&To> zFsy)g-{$E#j|}%Os$&WEL4+C0E_A|m2V?W@1Nk^1K_)!&FIIng$tQ_i|AIl)bwqB- z*s_g-Ei)0IEj4`xi@}V8PBc{SqeoFL-0=Q28G?Bi3C@8`m;}0XxQwq0e(49~${=^W z3sUIJd_PGMj^{~I-F%1R29ddmzE0j??8D**!a`&4YQjeDNmavg6=C_~$i2lTxeqmi z(gD#UqvjvFXE55sq;B8ddZRr*4G#WaI~>I-aNw1!K9J#D7^Di*!q$9R38BZD6~7jb zxB3okAu}zO1@;9C&d^KhJ9JEA;=6S{KJ?;!x3?6#a$8gkJ6Wld^>2!`MGb8TtIXZ@ zE@>?+sdl&m6jqu)R5i4~WW$?c%ze=@h*z5r6xn1@b-E`B72C}ysj_JiuQBKM#M})? z+-d{f`#*GfVQk4YHLBCk>N`{lt|XIVSVT&N1xGX|`b-gAc-VLm30DHHxbC%|%0I8(&zp=iKqHTS3P6ZsHGf%4>+bH?#+@te;By;laVQ~<}Ly|U4fTw;XK}M9J<)eD3kh_f3qsWGSBxLeOu}Zy1 zo{2#{gJNt5T+kO)Q?SKEB;est)JX4fCu^wAN}4dAzt+O_OtuafxAJYF4?_}iCP3ua z4WPN#v9Sv?du$otYPk0)*}8!xtKjFKs_sEtzPOnfM@{~d5;;DGm5)^hEiz-#G8iwv z`)t--Ik+Wfb+VAin1DyT9DG0V+pDI70L^bt-5}|oL1)YCt6*P~&$^=EC zt?TJ7TZNdT$B7)Yb*6KlwHVS`(Fw(+Bro7ta2B2Lk88Ya<3GCUNSb@?Bk8F4Sw6Zp zNdMdw{h3M50aNP+M40#^_B{?LeNFQ4_9ffClX1(uOG`X~9>qJib+Lb)JW zC3<}`ToK4~_ft}*&9_fJ*w}`h9*DiRtZoo`v92Mr8QP#;l`Iy_55iI(EoMBEL;#V8 zLWp3*JlH{5#tw_DRa4i}z-CWr-{hw-5vvtWXB;uJCo?RnN}g&<1j$wP`)~)OjO5H8 z2TW6O0DD1)0ac^}ljhQ9$|EPO^!oo6Q5z;uDEdtf!(Y6&J_M}!6ndW7%AEbu&BJ<3 zmU&k!sfUT;LaZC#yJ1+Q;OrD%bjW%aU=Fa&KDosjYnuO&L=nvyw;+JYKx!(l)>r7` zD^WRXZ(E-^y$7>bj^Rj(983Ue88gsz7)Uo(mE+_xMgPh2Gv#5)XE63OpmX7~FI2sb zD+QjXT|3Cirv}_%l=1pH;FX&nwD$O^#D`tUkm-ygiOX3AECH~F3fSxZnFt~5_3?S6 zBrE}BW~Rr0G}I3gkb&h)BGR&(gc<94iIz|acC$^c-N!Yds3eTkVdw3x71tPC>ox7#>yG~mPlpz}1sWEDkZ zKf7R;u*P%kp^P=S#EoW8gaRIRddZUoIDO#dn%mi&tx-I20xTk2@qD9SIT zU(#Jca&Syyz<3;kjZc;FIuI2(fAY+nkIld9+((y8#*`@wPVH~)rLO$eJ_b?RO~s6X zl(bLh_6UMcSma81N}kN6W{$+%eAs+CQOSQQKU+qXGtctTt zC!0Dq5VLp3zkj3_+`@;#*LV=nO|CDBXG(T@!TTZIJ1+dNoHh7D z!v<4o<{QN&wkN-w{rOZC21><)Va}2%;5NZbR8U_E{t!Hb&Fg^4xPH6jh3hv#vGO%G zq9KF_(=GZ(ml8OaKbalOKyE@tM!}g`J?OKW0Mpf>oI(>pqe{eE6ut@`ca$}90`L33 zYfD=>22toZ6s;Hf%qPdTrd3v70#JdE576&i$tudFKuV<$Ye(VXqP*PC^8@`#CJo_` zflP}AeSA|H74pfu?jhw#QUqiF{|))8eQW;a7cN4HkFOpkg)?4Nj(pPBZ7AGubFZ+g zsP!?!jNCWwNbOt9{65h^|GYns4UP8--^*(|y@J1VE7a+Q@Gf~M=k!8Ims1}T9~^OI zb#v(d!&ixaXze`wb=lWHq4OURr&TU|h@cn$zYDBMi~u7Ezw_KfC;sU2xAi(M9-PfQ zvUQzVsh8w!K6>CE^x}(Mdg%9-=Fkf-bg74&pFc!=b?EEQ4pJYqS~?)T(6vkV&n=xl zpz8;T)2j0uicb5JkfXm0pfZ4cf!>mo3}Z^fjq+F7(AG0sJXBoUhF~?p`0W}n2+ZhM z-ZFf`Tmg*k^&D?b{Kar4@KlJbk!hAW+WNf?Q{uXtxZ59tvTnBF`ulgk!G5rM zz`gD4;h0)5S;Iu|8}~h!osn2NIleit5xbGz&gm7)wlJ9e+It0bKt{((0fBevse%I? zo$h$4V6yvVW;;v)7Lw9Bjj8W3XaB%Pip8J4j^xsBZ{u<#tQ3nZ^cIs3|K z?mJU{7qz6Jk&}dqfh;zE_U&f}shp*8?>z(M6+hd9-nd?hd%q_Ez+e?)T~;T(_mk}( z-~?i=(`WF&85u{vXTwc8QRV1H_T+}f6t8mXk1F2~m6GeV_P}CqWR+cw=#PC_a zY#l$Vx+Yjc_X`t+*A#yoq`LA7zrGu<_-9KzZx^XS@D+R>1OhA8JSn1`PUPc{1y>v2 zXn30FCoSYL)5cFqZ~d&{^&NPmV10p4zkUbSm2eUauW9bRg{FIr?BXZRrs5X z3^BJ?Ai>y9O!};etTnfXd@IZ?>JCs6CTi+|EeqDt!!5LF-77|0i z0Gi=i5D3GPk`}C(!K4h#juM$*-;1w44}572wn{7AbRW$i)&OjoAQiMDqrLpEN!ND< z&-|;N>DLjLGQ>nTs-nM^k+>KQ<^u}TN5XFR$Vi%d@hcH~-V1&h^LMdlqUtRWnJo8A znNlyEAQgtset!n(vqAdQRnnM-?75qPChE~8`ml_oxLzDWwdtyIXRjN+;~KUG;~LQh zFN(~xDh=q;<3eW&CyKD8hz4oO9ulvo*(u%}xt#L97F?XDGKj$E;? zF9VtCg~uzQzelddqgpLb6iJPK6j^t)@Y{714+-YB-N(qBx4^PH5ljLN)$M@=W<{oe z=?nS5l(4%S-+l}lklah+?~B^~hctb}{+AIZ_lfx2r%li}H_F^nq928R8Fd23eRo`! z$1+^gdrjH~XJ*4uG-VNpA`y!C) zm8wORtOszfT3cJyBBWJX-06DbTs5`OesSWDcE^{R_U_9sM@UE==Yg=;I4t4(m|PyC zw}#0h-qELvVTf*|*-So`hAJ+h&`ZS8%vkAy8~g}p2!wRlq1KD7hhxkp-O%0P&|C0; zqc|tkzxfB4c6u@ z*KtoSJGrRd-HO(?4&)ATJO-|j=NQcB?9=jk5hoBLC|EoNM+un6P;&XJjK*~N3>{0_ zJ#+Ldzki-sqDyAIK1uNu+Gb@6hK@kgb!*1@I#2w>txVXXaKpx2EjN;cQm%{(f!rcL z8C789b=h7jF#TCqzPgC>`kQWB7m1{r9~oy_s;>*(F84{^l!|H-#Fm^Q+m|XSYquQUoIY*}uw`|?8CkujpK-KYdIDb3Mpt259zp!lP6I)aa zVdg-gxy!B;etkkQ)j^p@_%XR zFAS#VV`h8KZb&Ct_Yd=IgN5eA znM?ucLD{y{&qs0kmcsTq9pUFG5}-=a!NUqnQ$O~BpFAnvr#*Aq>7$6x|V3@JuV z?O26!PHkoewzECW6dmB9N8$1xnUa}!nfqBW#-8XI{z`2a4IIPBnk_q!gp(y0&m_Vp zvJ|DAkV=UdS?6*S^PC7Ygc?ExshkR60a6u#f{y;RCi)BhH-V<JDnvOhns91v@;}H{mwJpD z<-#E-Y7s1u6Jq?~&_q?f17Hhy)Nqdi^^^Z6qHXz2sk;U3X;U7e7o@&><}gY-q~uTM zmA*mUPt!#u#@owXVxpjE{IFlcl)p5jaEwq9DN9Tg6phNhhp9xcj2kH4{=g+B3M#-s zVwfsfsMt?spD^$HXNKq?D`tShg^C>Ge&MGyrD(5Wct8*w9qp%N?Q@HSV4@B&C7v2k z%?q$1njU=w@MF)2`{ZloWV!oAb^RfnMejj}(IXJ4Mq)KHvRT(s++}}LxF?sGC@2~~ z6vLEQ2=F)eLb@I>zWAa`OcWH2g9c-mf)Xtv@rTe4i`5q0ly*??DxrkA9zsi6|VxOpBok2N%W9 z!LXp8xTMv=H)~VO+euN68}yG?2|2%z5@6kR5u?gkxHu_oO!A$2bb{Xj>_;%pm@9)h z_iXBs@Jm~4Z%O7Al;jqIDPbJ1XE)9dEhI-Tz#*-^UYj*;B6l<*NMOqqztwQAX}AZ4 zGiSV`jD+08GVtCWs%NjEZ{Q9UrweI(=QOFrxkLUbL34WKgV|6CytIF03RUAc8BeiW0&knv`6V zSeOmV@`akFf#==y5aW1nInHec3R{3tTPRGvk$6y#`}G}GjZ8}sMFAw zs^mm5=nAz-zy)RCA{xHr-KmdgXAnDqxCkjzPaUmjfo*q*%x1l%i9vD-WR0%I%K0(Z zfhODOj_qxGeF*YB(y{UT7kpNPK*m95jspL&+B<*WjmRq@7TX8C$*~xz?UnY%BIDUj z_IN?Q#YBIOuOueakZ{Nj(!L4TW7 zt+rT&VzaXc$_4s_Tgne1CMfq7b*V!kv;Nr?7X+``jiv-Phj*KJ3zjAyeuMeR$LCMNQK z+^3~>xQs#79^v72JaoL`5_q>;N#7VWypXGTBVX4Qs7#4Nq$(*1mK|!1Weh~bS9`!lE6n5=rm)Gaa5<{LA#1!@V z&+T5nW4~y9oSAG^;5?p0s7x>wamDFK9pWE8;5n;J__ z)ZACJw+ziMBi=ek);0jdkkJ6z`J`r>SA zvoTMcVW{r-3XV2K9G-b#EKafmzBYJV8xU&)HkgP!{SrLzaXK?`m(isp)8_pZ4ulw$ z&H&FS$EA|3ExFQo;@m!afO-8J9#W<{_w@b+Q%;4qeS5PlD+p64-HiskOP6_SI+_u^ zt76ioQ~Y<)E>WSn{5@@Inz41#L~$ZdR0n2e^_y}eeE30%6+9WS@Np-D3O^`AO(DE4 z9_y4Fd5*TZdP-a+d~7K7t?|#DgH11S<4iOv zgG^A-=##sNJ)abRX5~z0NXD}=FC}4A_TLE~$7mZ(W2k^fvC+j1aI0KS9!0L{v|mnk zOqb}4Ih7~zL&n|A^W1|%GuFeyxmu^Wn!N;kXP_NLZrhbEl=zcM(%riDKL)jh@Md;)%%zvE(DAKc+tCp@zz`L3LhB_zmX@rZQRy`E`H_RlrW z*<07*vYiVc3Sx670HY_S-vi`a0MKXn~8BK2^s!D_Ved~gM_xB#Z83+zoysfT|6fmyhLKT$~gv0ryR&3}O2tJ%@B z(B!ZYZQQ9gmJD9|78d3cw~n^Aj!@Qzx_FRH4w#tRmANE5HEmBe8n&5O7H!WGQtv1z z_UzsyL2zJbb0D!EQU@w*SvTx-5C?S~Z=QVlh9$N~Gr=ZXBGHI2$mf^eZrZcDd;jrs zXwc*+2cp=+lJ2Rhdwvf`6YemCB3L;Y==xpLBNE_~HwkVQG=5LTGMrRe=w#29)vQj( zYQ{ya97X6Lq%ErzsCF&?RXfr=uK!k&RjD{1kG*(MdNEMqovgjRaL0D=jQjSJog*W%ZZ21*5kQ6k z*jC+wg2m5x(Hz8xo$o1NB!As9UIXiXAPT=38#@=yM~uAR#31qzeFuOsZHUDHMRWRx3K2Ms1mH>^tR{B|+FlYB$t9t*dczj)|AiNu?qN1?W_` zQ>8%XN*!4E9O9` zHo$k;vO19GO$nmKgSrm=`MJ9dJeiU_Py~6rj~W-bke)oqDW%Uu$V0j z#1heq02PGq>Rfiy*`wq~VU@Bwe4qjKm3cG0sCsfo+@zxMvUx#+9&QB%RCmiz{rzWo zb&xvy&eps5czbDegdt4&!c8k&!tq?l-q+oEiqr(E_&xUD<$dRT6-r)`NV;|W+8#q- z-!5NNYH|09vsfb#NOcjB($0~r7R|~rBINA(inMmPSk%nfSDAAkreD5Q-rDDY3?05R zjwZ$RoBos`-U$#k7!t||CT!BAH!^g++{(dalm4ewA+jH?VlJZR=QiK!U$kUp-aWCu z-*$6CIq5$&K@V2}&lxW|hN7HeHTRe9Gx-o`f%4?%<30ef;7qR}kx8W_jUT}wRvR?j zc;ql}rhCUNxqXNqz(~LC@`S$yz$|q8RsukSBxwIF(2dysX3S>L4bV7X zyZ%CZY?A)IHFM42Sur12$fw;l({D+Z9BZ?HoYVUR8!Fkwl+Byijg&2AW2Yrf;3?1v z((51qM8iY&hp(i7l#Q*HIK+dv38Xmy01f;Hc%O9d)SC{H&*ZcPTlDI;HD4FmdYesK z)nrf3kC-e)eLk;pU0^FzKY)`M!#A`QTXokn8XHl67q2cIyo#=x2fLEMiD_(T&GKkl zb`MxbIMf5kZOj{TvFZ&?6}UAV2%yrn!0BeSnor@gprzu*=vX+U`(<4w;z> zkk8hzmh%1gfk;kS%ceO!hRw?3srNw$;jVLp z5IHlP7Lu?b8D#4vOy{28Mozka6TH#)1Hqnf-N-MdWb+{>`r0H&ymI`ZH-+&d!cX~} zk^)z+e9@!0HB~tV3l2L09oDGz;NeLl^fRPvS%Rg}hBY4jDApWe7cts|v6{I=W9cC$ zDE3aLq%LL2R}Ov?K*XAws{`K5v!7UIT|u6cwo(lkEaRsvl~R|Lj#$JbgRk6&)ZXs2 zUG*i0km%LjnDPp{xwSDA+*!NKLcYR>a&0;2;RoFVkK$^bD@^1j)vk}2OU(9dqt+0J zcw%AuSfI}+mMD$NUjMzX3;+fX zIosp*+s^us7)+6$qW13NuA268B!d`a=93wNa9IR#47+|@7=#W6;p4%` zP>B>b_Cv;b{M8|)3}WS=jNS}3LfQtDqiQnlPzcG=KUR@)+{?N$x++nu;|M6O@9Qg$ zrx8N#o4AS&;PU-3(@&@Irf3p9p!A{!yGxNgn z`k^ZL_y@wCKR$Lcwjs4{W-!OELp;m)-6T_4ZAk?vJck&wJwx_>cZp$$#07Gvggf*n z&Q3OB83>(C!=bIUvkzL3f~-{1hjo~zvY3d<I%HYx_R1fNI ztjb^m4z^#ql;ViDkT2^Fo5_ltA9_YGA4$-w{X5x znVck4#l&XzO_*{P{_K>X7?hznwhnU4W_SgxcY&L z)OtkjiuzXX5LJ;}Ll8m9i#M-sk&fm<@)p0S5b~%&_8nlF3`5IPOFK@rm*@ooiF(&A zNzVu*_fcHUuNSx$&legcGPyZ6R^H};a^1Wu{XRH-wu^(PzPP+j*Uxr-P5uCH7I-qi z3m*eM$Rkd1YsB=)A~5i=;e$^ce6X!S&HhtWnPN!tV{0|E;iJa^AGG14TkBai@JQ_A zffqix;DxtM7AoiXEw&)g!z^&WvKUlE00`xo0|fy}>0D6!^EWTx2)b)5EG=qQoLN^JV{Lb$w$n7zAL zBBjVTpPnGW*iPpUh?P(oH1MJU{|$_OQR7$X=o%YP2Jv>{!rIzwicL5E=wpwq(yup&~Z<{tsLv4GNSm$;hB!uwm28z%um?f+X{7BM~mlL zF2q*cdUpGS@e66`?`GWMkB<<&U*9sB#>6r@z7nA(J?}eObLhJo^!+_V)Q<(`2oAH@ zn|RD?8*4j%g$LOWcM>ypNi(9USAz%q<}G#g#x{Sivwffn-J&k#>og@CW>!>iCT49!pY*6|oPn;5eyCp0RitPdU z8H_THT;$$5@=EW3-&M>Y86v4@=8!j|;$h0og!RnHU$4hO1st)-W_`%)<8|Lg7{9L! zx^dedW6H~Bo&gy}qGAWYYK&O6Vvl}(4^|NfHf+|fsyC#fg3dv%BK78?;_n~J zRLI%#etuq(Y?AlZpsMC9(EX0dumo6X{dfsVMJtcb$JqGg>@2pwXG{^;r-NF!X?s1u zzIBHqdKxS7cmpw55dnt=#h{pxSzI<5xl3T=2SyR6Z}G@i-p$O zq81p&T_t4W&#nFZHd!P^i7x+#mo)mz)pA0@=k<$s{T!abq)BPVzv>~cLfp=)&!DUp zF7xMEpy)Gjf+pI^CvM$LtQu~!Tks3+d>P zg>!i9>F7i1!5{>)SE*3&Z#-M5INSHlA8D)KgCa2v>K`R=>W>w;N8p_ABL%Y7@|@9E zynb~vqTJ0+4#=L@C$%{p`^}9$O2k-Po13TIT)M@R&txHfTX9Ot@5<$WX01o)v<9*E zO4{57LwszCXDk>Lrrg1ajueOV*)WT&Kgrenk}WfFva9ePkiLon2hun*aO*ShK*((g zTgXBXC?V{apGq-AFmBy-6hcuF?g!%Rv7kNVA)54!KnHG+DJDz!0h{+$wsEM1dAV*G!-iHdzygl07}JYuO?i z7~*D!;RSPL4G0FT9ZMw%&%*M;l`biG7o|1^%l~HBA(GqH%oy<^+0GR~(GORXu(dh~) z7KtTRc=|(g^I0!VfDw{#p9og5wE9k2C?o}Ea@?RycC?gPQUDe?;$rO>32Ylp7^i6u z$uW5_wzVGHA7@@ct?agfU3-$niJQU2(yD7F%e~&R{89=AwLvCuOu($pt|n7X(m6AT zCDRo|1qqC~5GxWQSnN{{?2so><79#rDYe1&nCV)Al|>+X4+Bo-b~Hh|!X;*A4E%lt zc$S^yThP{*lI=XHsU_Fmn0XyDAa)}5MaR^6?U>ksQn`kz*F!L<{2{Vi8N`&WR2%vq zMa$tI;zvu7~O zt24TGDQ4L9TjxcH$2Cy$2GHGy(g9n$f3b0*0Hgxdp8kr3qk7sE*7ZK%GR)r+E6l_Z zD_&x;8H1NHszm*eQlN7El7Rc_f1@zXHD9?NRXhh~Sb;=a0+qTAuI3PH__Tj-0S^WO z#keXNPfn;{_1gg2qWy{)XJosPB3$dP)hC3%X4FF3L)IEd!oQCT(WZ!s zpe)78pMM~J(%f%9mzRqd3~q9t3(&(DCTUe=rGAtuQseVk`viFRXH#M4{w)Lpcm`W6?<(byGsx zQKW|DOcDe?`n4%i#>W}NjrYEOov^`>Jz%CAsv3 zmJdFNCWn=xiG3Tf>FAkPe?xpV#7Z#)#2r68I*Z0 zNPDn{_D-3q{YcNwpmc`PRgS&9lcZ}3zZLfQol>>g5DB@Ow&Vj1<{3Q zB&ATrBB69DAHn=Yo)1TU2{a9X+K+trI?0DiiMil8ILx87Sk!8taT z5w|_@Mzf&>hrF<_=RirH_Ikp|rB=J7rTZ9)+d2)kw`9Y~zPR7lOTSoY!{@NM6iER_6V zdH;M{rQns|;S2URG2%$0$JEnjaFDME)&0^d(qGY(0wX zY?2q#@mr!{i9m^0p6)cbkF%eleo0sOF77RPHf>hcChKu>5djmLbz6t$&QN@iazo=FblGs8r3SHlagUmr@=7X2T z$Bi@#^=Qlr&`c64b*iVz86G(o@meqza@vDVQH>X&Iv}dlwzKw;aMi}y!9&f=gm6C} z&!R>&U{+Ru<`Z9etRiT=cYGGf5<>ZQg1%Nq!(J_?KRv-w0|TN^hdK(+C#s=p(orPM zus&q=Mv&3xrGQ^m*gypv7Q}!~97-G!Jo%WV6ED_gnNdO_B6s8t0CBjBP8%k#1sEwi zecp;1A{IsNP=C~eV~O_O8ca2Xt2MDO1FipAfgqz-LlMzgRV2=2peU-NI`Be`DfQjq zAnsrJ!v(Siv4&@y6JMo%P4I6G!y>Xa)q82L(j0YiKcSfOsx}jfr`ZF-vroHM{=Fg4Jj?PA_L2u92 z`GlimkNuxr3qnD??q+;>WokN|qvpjg8k@1||EoP}_%n;<8BTgJYh%0E%i%uiv%Y8_-yw)#goKkrnR8w3W_REPnMO7se;o{h zd9V#GAuaqF0z!z-6)RO9ii0b(1C7FtWRXqe8Tmv}(b4EsbT#@d@``T9;4b>!SEzDIq;h|m7om9Jaw`hYMy?G~8s0zV&JJN}|WH-gsPz=|?#q6lxu zVHiEE5XtcB>Dp|=* zUEXH0h>jaxOI>xBw5-+b@3ST~uZmW+x1&Q$Z8G&@ma)jh)vkA;i(lq)SFxJ4u5Uvl zUZ8%vcc;wMgnqqBs~YL7f{Ri{7JPBlwKdS^W+2q)Z?sR%0dePu6720+0!ru!QiA1G zBJLdt-!tgethO185Ng$Mg#oN!d=%1WSz(+PbFq6J^5HrHkro+6JrrS$E=QwIE(RE& zxZb4{jC$Dt0lCu?M(k*D?yaAqa~ujws>g3_ANKHEC$a72YA|H95+C=gt~=$W3;Cpx zD|6S1R@`f`S+nvLc_tMJv7`2Ya!M`1IP6WwCk&62gg9cM&xLB;w*#uudNtA&j2Mp; zSID5%jK>mfSfPyVO;h=b!7{=4=l90F?q_a(1ZhZVYQvoP(WG^sqaFxB>tAhQePH?e zx!i8kMrOz!GqBCi$hCXkyQM)eWI*(oH3a)WEqz}8P|gB>w*EYh3eWFgu6+ei%{(7W zHS>LR#IuN*cT>jt8zgNLub9~)>x(PfK=TvPi^!>J26cmvkaX0OtKY;lDjhKCH4)M# ziQ8c|Q604D6HVZ&4%{CwyP32=1$3I8@G^BQHka$+=OxD@tXoK|v3Vp5+)L&cK$>2^ zeF|2xLWhPa;jSB6P434?La^01vp*i89-$1ZY$Q1r=@%`xPP$4|Kw(T57g@3LLzaz@ zG`gCcIqoKc;@Q4dLxkavPaZ+$)=f^HE8)1@)OXMIL8!=0&(IECCn$%w^g5FO1)t{H zmAP5bPrBafJq-E*NOzfCrYYio*VujZ|BKSPQ7>*ME`#E!N(O8GEZ_4lK4tmQ;muK#mzc(rpZgL>3 zlH*)ll4^0hefMhQ`>5Ej~K8(mCRKDk!fenptzWPB!$LZ7)j;`n? z8S`PMx3f2g!&YDqJhjsleJLA zzry!)#lGSD;fc&Gk%{7u#w_(OnX>2}G{5m>b-A46Mab_f)2tqp#X{yMhaf0&yys{K z;_w&ZH?q;sywTtZbj6^?Ld;<7mGN~4DelrO08K!$zZJ6yzEVHk90>}GbOc(e z>|A+4uB9+{s?b_2$d(seWZetFSq%VD(B{@Mk>SbLzB8<5)^)M!y}rZI?nGl>mZsAL z|3I-5uhsiXd*@B%TrX86CySKP4O262>6@@*L6HH1YZ&Sxa1o(8$0;c7od9;#z9S9G z*9qnaHw|ZY1~VInL9huj0Sjeh$7Fl;B%L*{s}fG0qomGW5Vv{q(PjO%>OK2seN#QU z_DhZYUH`b5w}o>2D-K367tC1;gY7&PCeMffqtYlAD^02V6g)ldDH=6k(cQh*nz^dd zxNg2ytD=P=cYiQE`2>WO^cBqV$YYi)Zb|MFSU6RnB==grxESkGn1X~VPAEr0 zB`ZzTIxK_nf)n{ZC*gjN=OkSvpN-=d({Zz=gpm1yq9uN`2i~7*^{Eal0dGVU0n#Ks zqVYrPb0`0VT9G)wTb(yQ;e$y_eN%6s{|E*@x|zja)p^D@Gt1drh7{=TCF==OGE%1TK_+96UNMJ0wJuZ|H*wYv_&M)B*9j>;j< zPG_DBJHtKzZJ7xXqL_9Uw_70pskjmd0)Q{wWDNx!(Wj8Rkh9w)GM_Im|r^}7ma2@o(BjX8iB zwWV%>@La=2?BW2yi+GnY1-ng7ZqP_ZsllbDY_uQ?ke*~ZE>;*#CjUtQ_-z~K%ye0L znRcqqrmKY1O;FDTl`+x8pIX4Mo-xTRq$xXfnSu6PYVy!YBa4OSAwh zpOig1&ZGDDB@gWn*I;TaK|CDE@athqXTn#IT-!sN73AY4$C;J3n;f`+`|`jAD+mlY z_UyFN29m;;pE;rS5+9^j!v8f<4yz}q?hZta>`s~XrPBm~yU=SdRx>2h_KJwHFu z8SQAsJ1Zr~mU?NEbekt5p7>6lUY*Q2?F$|x`r09sJ%4b#Lp~d zFN|fF<3gIzWJ;U6jm^PLCd(@{Y}S>nf1-kl!1bluq4i<(C(A8+f@326ZG&_4d)WRC zv7Wg^X-pDX8ag07aEMe_f&?45T5b_I_yXlQKseTB^(%v6M`u|vkM!-#Z>Q(63yZ~` zbbkCY0!FZCiz6ooS4I(RwDtg+xxx{*@o7Pv(+mcL)(|Ca%HwyQ&eKonvyl@;6{1(Gj~~|-QDQ4`sd{~OcHJ|<``(Q0CeIjU76dWsxd+zalO*V zkH2Cn+%!heG4t@X+a5y)=CFhXsbMq-l}NDgeqCh87)+;^tXpFgrshJ`X?;;_4ekBy zxdhoAtIA8`QngGa|0``&eu${+t10vOJyH|37bW$)n4zex8+@r!+Ns^dW znAy8I$in9huLiu)K94G9y>rG;t^K5zkKdh*lgbYrH#({4j!>+3+VR{{brH^)wNkzu zVnuvNIySvn;d2;>zBkA*;ehME<`k|HDYV(RAo772g9U-?{p?r24xr2gnc-Qf$!MH- z2CHted2Ds=ni+KIkBYw333x1j&4tl0(VM=7#c&W-!g|GlICOnU9{=Hv=8RluV#3~zX(`~Oq z`c3B@Yx7>2P*4}%&D2t{r)bu*HTP0CH-|ISb9E0+1VvS=cmw0OgB;G}kd(=rXYxe% zC+@a?hvtj8QD-G*?W%S!ySvh3cuv+M8-?;P0Xw4D$nDPsxH%Quf4c1cwViDEoJP;? zTUhxx@tfm&)-Q?EygvNn5jWUqM(Q0tDB6Z? zRJ_i0D&4;AQ?~uvuYAXLOa*oM+-1IZSrT<6vsXTj(y(P}DV&w!*R&7E(#AA_ znak_BeI*||Qn!ano@>c+6Zt#N*N1t1rPS853@Yz3-mc&w4eaMF4-G#oR*B$qB>`KO z+n3^tRFzODKtmHAtUkX|_?jFIU>veJI+CHp^<3mhtfNK9lvnE*@K97L7VL(Qe% z9mCs+*oOR-#Mc&V(|H@ppoM07O=V5x%o@NY$!BQv>@+xE#$DE25T{;FJ;~Dy`v|^F zk}8K&q9}7%I8Bmot*FpM4(lPnQzl+Sd4;JcQ6d;^tuoLyw%^X8_6_=Cx<;@|VqfgN z_SC*CEtN6XYNX9rh|po$I$;3En*zgv8EuJ;<##9S*>9+MnB{O^eut>Qv|X)oLOD763Ld%b zVe0j5hkeIU-}A5^$@OCo`C!J|nSH7O_ z2EEm!M@@UL8Tn@AoAau9uX=p1THHxL?x>&lV2C~3mUd^1-pb&bv~2(f)j>XTB(kJ@ z5NV2y3$;v^b|JJSXHUVJZ;PnthuRBgwuBjBt(cwSHI%YeMysq!94VfjV5dAQ(RmV( ztdnAtYFg1sIyM7a$5rEUon@u2ouK=pkrNq{Xp^Z^98c9>QFS_hhHw=HG{RLe`I1G; z8pq)hRG^ZYKyvOeB#)fGsSxReN+L9)fp{bVQmKKSE0H@E36(T1n;USMnV!|6#`$$a z^>~Zs98=vrWWmVgG`HihL@c@_CevO$QV_S}91n9gM!dFQ7YO!{+7=Y3xe9U@%UgZE zMA>*^q(VHaP4$G7T&&!zvXR7~LL{J6k5U1Cm!#q7YwKrw3S|zKk zB=o2q(y^mHihihUt#*nUfZBz{b7Xla%$wo9IAIj+K`~NnL~+wnvN&fEPe`Do){(B2 zp{MVU>D}>tKdRp~JEUe^&v${+ZUstRUNL@|04rd%p!-$`ir`pqB7u9)BVm2zr3<9Uh$b#{rYNN zTm9TT4WC}qYa)`1tX(S9P(&yh8H9{xDjSCC1pGx%w=dS^5&J8t{gsyON(T&eYBW#p z(2`Z_fQ>bFOI6g6UgC!l!eI<+88C}v=lA)*xz;i4{#>DDn;+NM_@*T`H@Pt>&B4yD zC{VN@r9vC1G;JjoyLRw-_W2x3Z5C&K66YWuQOZci3rH9T6QlhSm^3tWHXU7jV9rJD6!=u;N{7s5 z3CI=ntdQ$b?!`Jxb-D{QIA9}US5mu@VQXb-V;Nw{alFV5GYVh(;4t8h7+Yr&?1&{5B0~4xoIo2_4n6x%UCB;GF+svx5Op2a_s6^K_ zn{&}@RjcRj(#h>~r2yk?lfON|ZpumJ@h_aQ7cV0LmcodY#*(QD%-XtnbBh!&nii`+ zMcOfOS_HjO2Z&zEOK9k;t0qvuM-8ngg19oZZso9y@bhVa7$SPIw1t2a18SR?q^I&R z2Gb8!;6bZZBf>?R^;Hr^a^`&GM0ir@)ZmH@Rk72;lq)(97lRF0MN0WZQ3>M?2Yf24 zW%a~Og-;i)EM6nHX4Hth`UkhAJjjJ;^*e1LYj#SgK(P-k?Q9bZEB)NSfs{=i&p=2$W^4B1;GbLs96Tz-N<)k0Br)HP`;Xg&#Vlr5o34Y*J}w^=Z%0RYxQfj(+@;B zl{OHpPPt}?DPv!r66U>dUkl;9h)Ge^SV<}8*3cH7nxm`nWl?z3TAMM(2_?4l>7fyb zoZc8C6cN;PUA=7Vnqe&5N)g!)yyjU7Pw_idLBiBw`Qo(WSZBMy4*8&*la*Tm&YjC! zU9jTUf~)0t@xpTK1mh%yov(9eddSyrnq7S?2NNtJJyxQdaW>&j6>PAZ75QrEU>fr* z+&3?wP%y1fv8c3YpTugFfieVxvQ5bC0;d#oRnc*r6}g-6_JY5hVAtVmqc?_D14e#5 zvpR1Z#_UjH1*yFr=5aVEYXgoCG39hF4S?Bkjz0kRRL>VyolyfuuH)V6yEJsb#)-`~ zL;3tRt)FM(5}Q%Sjgq#WDBn_pOn2(2u8G=Z_I8DLU+|xMY!CLtnV#JL!C~g%Ch!&7 z>gdhLU>TN^H)1KJ_Dy9?G^?d83g;y-u2U9{la5GJPCq%`t4ZWcvN{N6qu*@n1 z4Z|Cd37e=YkYzd#tLB0vte`I{lL#I(@vEEP|1JKdq2B1)nWnhb%haqgpH~tsOR-_4 zGWQBME-l@=^~eLjtYF{wLH?l&5-?XP5LQ52s**&>KyRs3*I#u%oFx-}DWicV;L#1g zIuBY&_2>1bjI<`f-JXC zS_HVhBipxqm5R<3yd;8=bFIxVM0OlY!;solRn9xjQINB`5f1uxX2G_BHj|}B)G!E> zkR=;Zyp6(y|76>xy6ZGWk3D7DQMKT>Bx20yKh5iE#sNxURYIg#2}SmfOW*J?C;yv8 zqFKpJ4QJGIS#>gMqM^x<4Dl3)wRz@LbYAf0mP&Y>7J~fdu0^q?wpEHs3IMT2Cx_2= zuPL!K^n#MI|CKh-mG=pjR4ZROCRQ@kw~HeCkfl0r6C`6<|=WONf1y|npN z2C!k4?st^bqB+P5^0+FgicjD_FZ$Aa)MpQj?sn0k$OTJ6FgKO94);g#)afd&B@BQ&g5T4-f^AAqJh$ zml|5IznGeX%~B0#VEf{pdGOC7r8k2)z@*p31bwg6KrI#h&^AGpfh|j7$Ca1q_t0ND zT_f5y=*T~L(k71gF0~C*DGiRkyTaa?fyxIQEkCgUr@S_vo~GLerx?*V7(^`j^V>hN z1SrGqvNT;vrRS)C1olT^qeBPaMr|8L5<*#dr>;O<+}zcvR)YyT8Sk%dC{fNE8DTtC z2yajfuza!9B$E)-@_TKml3AHnFuht8?Q(l|mxF0c4mb6jPEBGbFQ3X76jZUF%<1@m zqI+hpQqfq{5x#{{c1wrCL0HnO7dZLoUIAL>Yxm5FO#YDEe0$(h1AnO050_H^v zg$OWXNU_~}fN3heUesh)0kqiQ7wdOQWG_`6wF>Arrya{hPsW0Jm^B3x*Lh`JN1gfiTXG}QZD!>F=e#|pF9W*|35N-4YB;ciLFku_4W)EXjF(5fm6ZBZ(RrjM&^YyI#o z$L4ag*uEH{ttGk=fV*D1KqUu&msnvIVuJy;( zr~*kMLXO*pIByoC2)fj_+K{92GRO%>e|6u%KE2di%Y@)fxh!})owOt6;LNPKei2<& zRHFT-^Q0zpnVI1FY^DBU5m=R&;^gf)9$3B2dwK|&64rw%d8i;JKd|Wth?*|m3R}|| zDkZN)QTvzpbree_XSGG3aS#{jF5V5V_;{gT`l<#B#G7GlsUpI8h(w|3P|ei3E%%)g zj_$K`6Ggefu1=M3EkTY_l%NaC3bSXsGZQN@MDCw#N-=s03j;k9=_Z8RtJ zP~`E;56%$FTNCQ4+T=?c7Ft?eW*93Pa7H4dHBv#r7JgbObw4FAiXzwQ(s&v~Lo+=U z6EbP9g_#12&LDxoTEyx&qp~v)w*wlrA6$_XNc0BT3i`|}2~SJcyZJ?dUZis@sKD_+ z<|VW2lgunWl!yeQbK5I%5YP`*Tgl`8ibeB<-GX&uka|kAp<3*EbAl~~Bs@euB>qMD zMoCqj$ef^U%AKlW6Y8h}@43RaztwTe+2L1pQ?IU2WfMBImyh7dWZ-1M1Yff$#(H-M^O$#QK+N;#=HGt$?nqhOw{2fwWgxp8Nr-fP&aF4DoTK=Rt{UsoZ-(*t~2~6j*4TD`)I%=7VZjY3#d`TVkJ4{m{aZ)Q<1EC$$`y!g7A~zEX)yTiAkwD`UL6l4Qcl(JLBc# zy3H-?t*w!)G>CE@tnIM)EHB;vQ~B=nX;G8kUI%~2g3FYkZky^ryR6%_Ai_ipQ*3oZ5;CX6CkAUnIoso0D#XHN zkR*##l}R#uf+|nXU+7Y1MVyg~gqaSs#pXnb5du+yeGJLEQ;DguS6j412ArxxzKmS| zwjzB}gl2%!ItG;v>*zq%#Pe)tSW|n=VY;6_i)v4K`18G6c7XfDVPEWxTK4dDIp(<&evIb_ zOHQi>BhiU!xNm5m?#O9?Nmy}EqN+}n9-xtk=YLR!b&?uxG><7>noICirDrq>BZ z#iGhHeW8>Iya(9NiYg);-F08XQ%CI)Ngl;Y4ggwpa%r+Ea?>s#YlO{B1(9PeWf%g~ z#Tg;Rxmptg1jVLF)48Y$Yv1Rin7_Do=h=K7BxxZJ6NP(Bv}LouXv{G3S|~*^G-2fxAJl`(%Hp~ojV9Muqs%|Trlc}&ns;4W zA*wtxR~BS1lFO3jH+5#))Z4V#UZZ=X+dlEeI~ev0j7zzOuaG(oIQ6pjptGL<=wcna zKrpHJsUVyCD!?{-0Ug57>THyx2gmwMbm_wI?kgiqfJLZT5}2q;RM9F_%ooGBBq0l# zAis?Xh&rKg(z1eXl(HfPJXQNV#0i5iM`6rV5CA`vosACpT1*AQEyd8{Bbjuwg#Zpb z`!6Dzig?4IHcK3S*|MRG5 zp|19q-Zj{}`Mxs6)W=Rs*dGCiPQ_U(tq_WDR(n-yD6JCz|2px|u0r#AJ{D?*+cNj* zlHd%S=y`LZb*D0SRXw14>4^;XlsUKR+>TRNTv zmKFgZNVns_2uTkU6LrTbxk6eE(QML_@S^zO!0f9?SIFdk_A(j845C%qX2qCTU-0uH|GMf9*?#xO2f~mTKok0KV-UchM@g(Nmc7B7%%(z>$Ykg?0fHe?Dnz$7ZK31B{h|5CjeIFdLn?zgxxN@q zsSRRHnvWfQp~?E%Pe;&#sJX6JNd@W)!ibxNsN^i+gkame3Zbua?d$nEkyJ_XKRf`S*t|6XCzvTg;gXl>w_;QhvX7b4TE}l!r`NcKZZ509in-;1&?E>0NM}-b zt6Q4DuidjC`J%UW*x%=VLv72DT@>%bt_V^Tl~d_OSkj4FpQL3r{x9Bl-st6gT|q4# zJ?)y3TsN-RS}G>PhedPTQ>s!&MWH$~ig^SzJ1Ti7hccPPov@mMIjJ}yMf;!hVRM)) z1+<|oK{edfLs3ibmbO=6pY^Cw#C96)hoO`&a0t>ZQViB1ho5 z1WcUb9;&Xi+HRu}NLwmLOTeXFP##tE^a!IKAcWQI%@=qm;WicNT2aW~_$ z(o+J!S6~yyZiWGH6$TAOK&n(|DXnqHFtq^0a)GY|2$cgD<-$^Va8Q0?6ac0wgo%n^ zr()Qs(+5!3T^qu_C&f{?iD-qN1`8%h&-hH4ALb219ee)LgJN4@Aw4 zkpyD|;NT=EoeUGFKw$@5TnJYe!OF#ObP4S3zQxR?%ZX8jTWnpvd}>qzZk`BhPlA&t zL+&ZJn0xBVbW8_qT$LErfSa3|b3b*-IUqxmgh121O^XSp8GyjsA#z`a@7T)o6WdFr ztNMWHK7oo4<~l#L!9@xuk>%I1J4c;Uqx@A?qX3liK=(d!#0 zo+}Abq^VLVX)>B6TQWx(H!4)LQgzyE4Cc;|ncfUl&y(Sg-j6Ve7n4opL!+7em}L%s zbHRmX0p<&`K(K}4vHDN!zSrAp8{;LO{VQS!%khgb?ec4zso+s`s^3yfRjR;a!$DOkmZ6%7gv-^ zuB2XdUEFZPO*h?gYrpHBXb(iBhZ*IOr(!&l?Rmy}>8)7rPI2D*D90zC;ft@n`8Iz* zgr61tuN=Sp5$kUxBt!{CSPa5KQf$ITWGX}`IZ;fhX~vh4ULxrj!@?ko5M7Muk<%lW zi$}nS9b1Z1ZKcZr3N1oB0#>BV7*nUhivHCYI{>jtVI@x^0F!df5M5)6z)@4-plPtu z^d&2X14GRL95okCYHSW*n;cK3%Bu;DiMLV?r9@gOVfH@>lbYW%=J#wbSy;c9rFx~; z9MbE(9{xse`dhu_Z}-mc-t8kBTI@T?zV8=n`?cS~fA5dEfA$YDLi&}~|Fq!$TAcYW z|1eN+%?M>9Vk%SviB>Ze22okcRGhNHr>vzZbD2yU2ia7g6j_@=*d}XBlSDSsl7-Za z8@5T!(qtpUvazQqEhmeJn+rD;(~T1xH#KX-9vFE!VCa=F^6F*{-TNZ1-2(RLmEu6h zTczo^;*YV$I&D^_7Dc4F8~|KO^h%i@Kwzpvq0bLHA@cw05)|=;eO&8?@PFj>Aw0N* zFyob29gT{Xg(QljHPtIMK-qcWX&T)my{co+Y1cVhj09qN`}1|rp~-1Fnwe&uzU!AU`RdoZk!fxkJ%(;O?W(ut zMz4Jtms!6BVKF8w*r=e28XVO1UndVfg1;*gAx44}O|;NP2N}BPp^pKUSYt<^U}2)g zijyEos#-$~Rj<)(b2Xc9frVPMYO_eY4vQ_Z)H2Jhu*zy{thLU18*H@67TfLArCYCE z_UN=*xuV``|iLwht4(k$}=~$na%In`n}b=E%tps^n3q5WRop7 z*=CdNH`!s6g&f`v`MVHoE2lVb@$hI#Qe2VvtOQQ7G*u;2H>r9zc4L)M%mfJJ4|iq{18Z8*R1O;wBRX)N)-+lIb|a7crWpsZe<-tdmxg z$hi+C_@EA=i+y1O*S4C55;M(ADrPt%DvW5883PFR7Pe4?NLdTFBHShN6iQL3L|2CV zjP^IFZET?(Y(A72pPZnZNDO@A3XthEt01V^<0JcQXcav^zT|R$*KtGARiW%${`N`! zMFF1_^oz%3$EPJA%14sLDPXF9$?$WT{y0dUB3s2juj%W%48JS#gxC+u zCN6#JC)Na*sMP@bnQ5YIvXJa4kIVc}iWEzc%%(V>mSQ=fej2c1X?r4Z5_K}vlbU-ni+~HtqGYAu9NERoCr+E2l9x`%a0@}&eD`(p ztayvq(V1stQrL^)WeMc+nOQBnFfchv*g~~6EF&AtsEQQ_oZ(Qc+7iqR(t(t?_}c|G z9qiD=6{ML$IR)G9)OMG#r#$q$4MmKSyurA#xu4bjOIF3SrM=glCZV3jNfMkUQj)@H(( z!72qzltkmGT*|@vIO9v|o8ko-&jwql>@KvYR6J**NK?{}r@P=M9e?9ia@&~|su3rM z=WKFPK0UFP*>&1*z|Ej>i#ORm+wf@dM59S&ld)5j>5>%BVcP~U-~)=K@)>9(B_+{% zpH00466C2C7E0AzgjfzDl`EOff<~(#1k#op!EI0Z($8op*=QTP+YUxF&3DdHYnP;D z?=uCwo~c>KX+6h5drc~hrcAT>We=9U+HTiZaI~8{n`V6rUQs~`62cg=FKiRuoKyZS3II&?}d0He28Lv=p<>Hd~#H<1$#w=2Wy(;|iLK zO<)hidH7810tmu-DM)N0nYaB2%~G0BR@^!TyK<%`6`daI3hg$;zcS2x`NI&dV1zP* z4Gl+#8u@}vY@C+kc`^$c6+*MJluuNr1loOPW4N zR_ZpfM_@llbD9zvK0rOxF6}@@ielb{QkO(Ic@s}GNI){_CC#vD<_5_=nSR*|GR4HK z)~Ydx9b$Wf=4|btE~xxo>Q<(aaBftv8zDr6%%e<8YNnzC%uGh$(e^gn4vy9xwT2zA zn|ZOOx3F<;^8+3{XdE|hpc}D@#NXAiL#k7CIrKm;2EKA3Zy z8ZesL7bu|tJg1K0L(Lj_1;Gn7pgTti35 z(&|V}z#iqIuiftVX+V!ffvvkLb^?x47S#CBBV4thxOidSB3!eI%y=wal`&Ol+sHaV zr{j>5tW*Z2jF$S{czP837$W1kpl{qHR3Gqg3w7?!?hHMuS8KDdd=N%wVCTi^aB&1T zU-KecU!da(d3UOV)0>vDQh#{sir)J4+mMfHmA1r#WYv6>sDswS!X-U>@TXw`KF#`O z9zg~95Q=;RBC6lnuH6czM5Q3T+0$Am!CPLi4Ly)vk>`#`iwSZeHh|n&EUpYA8l6WC zzSHDs4K%8=n4V(!npUtHQ{HQhEZDo*h`KPg9U+||U12>TS-t}3Cay=sZD~U>iaa@a zg>Z|v+nVL8A+l)&T3HA?5gqIeizL(I`N;x=Or|hLSBBn9*`f;h-p^<|ho7fpUU}`l z#@FZcyTm7v2;v&-THBm-6DYzwKzS$$sVkB%_1O|IzL3kh&jw=>sT%s~zl3u-uBgj)z zUO#kV3CfY7THpf15~2hu8Dv0^5)P-cg6Q5=4(I8$E0eZBG|x*4F_5rl_z|?ko4lzy zSLt!}0orod3A>KGN#ZtPE&u?q)Iw)KTxj}j^A@L({PAIg-#RyfZi?6Drxhu)3m851V&6E30 z!fz2zv5{hMr_p9H)EzMDL~VR88}G^zV&x{~dS~U*Eh6!J*9YFr%SoLPFJlUAMAR{eZ17P45b>HT;~z9U1Vq;zgbGiQbD zOjNVwS@ry^%qS%ZAlf&VF8F<+sRd87W2Dyfup%jaRD{FUsGX~7>yj_K+a)t0W_1!9 zB;rwE0RMJ$O!b{z<08pdGtEzBU`I(R8&&iw zZJK>t&MT7Q3w7`?x3RH5Yo|2^FyYwsx^A$HTfljk1sM`BT)B4AOS2oAFY0n65WJn|<|Jm^qSKAnh$nM&+TZKhj-vkB z0tMu*>ptLVH~odrj{T08%6dfy?L+EvlI4aJTKUBbmiP zsm$_ZEP{Yhm?0Ia($o_zm4J8MmCwCOg5o4vh(o)Ip|PKRmK-|kvI2xKyS9_c8L9f6To3;*aJHGEYo-&bWtby?*e@fT_WrXV8#l(AtTVHp5|p|z#L*5b{M`^C4;$F6d? z(ckPk@i>I)y$ma52)r-8P+HcNzU0vv~mJQA9kO(SE+G*Oz(QQej*VAtrDv@Y>xLTZK$ z@*R^D^oG?=Y7^^=dOoqQzI#|ggK|9@GsG;L3PX_svY_gaB?|i9qFGfHL1q2X<~!;C zqBpw#OJ){5x|uAQ>;npuwjA?s`gNE9hq6e?9GA5nV(uC^}GSN47_}`zN*EuNK9pc2s`zZ zR6oNDC`dhY@lc-uJ77^BFX+NvWn-ja54K7(0jkJ9i*oz03M$PrE0H55hbm4E2rfwn zM)f(AI0G1J@cM@hf+{7J_#}|Rm-q64u5B(HW?8D89yd&wYb`;}OC(7Twi%m&G0q8L zs;OQU7hA6C>64rza4hjGX`878C-GS>%I4(QD%`QzM5#LU%{lO9s>p9=g@~rzYZa@c znSO8tSK%vyS>zdzkYfoH!xAYcAH}pkE^c|;E?syivr7RbZNY`P+{iUUhB*^;PqpN% zIk5pDYBD_WIILmaw<@!$9yUVVQ#U&ZHkz6l8`l@=J8|TgYdx%I0x~=DZaB6r>av$M zyh0EPt6f>Ke*RF|tkfvZYcoNuqkWT^i_62aDB&~;9YK8jj<*n;1A0Cjq3Kb{wo9O~ z&q#8IL*RkLe1SUC$cQLaDis07Wu)WpUHoQxtIc#UF)xx-{4Kc>%?*~(6O}>jwE5=> zQNHb&bc3}nU?W9>+P#VdA#Qj$NgnG1AgA)ygiVgtcfYBmr%Rx*jeaFGS7{fs*l@a2 zMU9N^XPSCd2I+?JS}c{ALRSrSSYnt)mitO`1&GD!f|elHm!)3Em;`_86#yRF)opVn zZb)S1{zhS?0TW5nBy3BOYI?fZ2$?D~QwTB#(lFTw=T%M1%pfXj28~oxW6MO8pv2}0 zg^DB2%WCpPO`%_!Yv7S%F*GZRgT1G!A`S>X1nDP&MK&iBJ%WK=eiP7oj5^e-ra233 zA^XVF6?qBT9)x-&j*gW}$GkCJ@(qjl4C*>;QQs%~?E8_5r%1D(;z3+g*SHDFnd7~7 zEUQzH)X`ePHpfjfMc19X?VfFC;kYK=ik0vb>0^6BH}uQP z)lNMKJI%@vwK2mlDBAl;R8(HLV@$Cebj`Y&3|TNHm{Kg0!6-$anc0YwZDFd2P)ep3 zi6B0>R9kQ^Hp3h7kkxTP&yA=mK|y;Av=%8XN^tElVg{`ZNYHI1M2TG%DRiiC^&{z{ z99V!aDk`v>ZUch`4oK$ACcXD`y8_zi$`Wu9%6PM#gpp&%xF=fgKUk!`ZrR<)dMIst zOk}su=g_`ZX&nN;hvA%V6Ld=OU0dDW*p>z}UF$*2ZZ+p|9BF0C{Q6VzQxQ}h=Jk7S z9($KE5=wF!6G)-k@*l5D^o@#cIR|F#D+G%u4w_ct_i)lBsAJwXp$-i}&{vwc&K&XS zb`0p%X0u5`1h1z;?U&VFK){qxETW;JR(gwlxib#Je5InY0Gy<6C+u5vAQCVhDepzC z*&lax2|ED`w8@}p`l*K*G|LT+3^#!y&I9HdWa$tr)XB8;3FIh+&R6lNj3AvQO;ls- zvecnqRY!gqC2U2$eZ?hXAZRvQFg(J^((DxTEJ6li@2dES)5f7=R`L#s>PN(6>E@+~>(8i&xP%~=cTyy9S;7E^10=Xb>0iOzge7WTBy#~Z zuSrTyg;eZqm8=bTXt_8|nH){rNU=5DN_8G6-`Fv4XD65|^Qs`7fdxz_WOpwZwKi#) z+ys-xYlEcnv;Z%0or61TgSDxx8Usl(<7p9}0rUc__2Vjx)*td*$5z9sO~M(e`kY!~ zXQny!L5i&5x1Xi{*_%?L6zpYC4iNH~yv{DoAS02GR_JJ8TzkR#^2DfOz7$gG4hV>? zWgUPlG@K_L)cIbS6xuGH8Mw}Bq1BR{*B(Uq#$5!2eWy47A=Y?Z8|E&hlr*EFQQAq$ z-C8}QK^URnoAFox^wldG&v#njjfEab7T!fkD_8BRnf7J_;nYNkBfvdHF(X%`Y*4<; z3kQ5N%WP60RWuZKaMIb*3~_@@*6y9qSbkY^ye`O4JaGP@d8i8EHw-co&7g|&#JHio z?bh36RdX)tc=n;uVIm+Wef>xfU%vq&X25{$`^%)5WXCulmVD~O!lRm2@#h248Oo! zP{twq{%MqN0n=s{ikH0W86tdDKV7@WA)_!x1OyCr@-m#2!Htl#;t@a*XL22ro!TU^ zHAj2_(oZ}qP9H$F>sYcB9-Rvpal~dQLj`0x?YBcYFG0)1enK76Y*lUYeJo^Jd2!Du zc!Up;!pp1*uCGk!mbW<8yk`QPgmB2?cZ?WTyS7e9z7}~Q;T%uZ&C5o*BtGy0!lP67 z8H-|8?J2>e271Sh*`-ce6nOGs@hWUu!qQFD?|Io)03}&LN8ZK}YXhD}5M#bGB+F4^ z1{yR>*YvzHAFJKFWJ+j3p63XJ-+Ve#Vg+l zDXprAKDU;&zBnn#$m$Sgq2&&SL?w(Uv3A1)ufxq!QZ2o!kTyyWlwIE~ z#OxpuAk%)(L)rn8DK5?3Q(Xo&aIb$-!EfM_m*OSJ>mZRQsBb<(8<#%k)ef`tOXt*>gMX>@;*owON-1=mPScs*O z#9uQ{3ZT|&8dPxTaRF$yoj3dzx%w~TB_lmk+{>k;)D}7urq&vvq3e4)sTgAc$*JkK zPk=-ernJ)BbEsd18l`2weNj5rCX*dXmI~nDP-okbco(b9T=|h0k-EA2!;;z!X0%e;~nO7uiHb6rrQE9!bvUCW%{T-1lvYOdIw_uM^bEs z`O0NldUznDgVHMu&$wnUq*WszLSQ8i0n*UNuVXe^nGoxdP65fSZO9cbLNfpqLDQCK zQvd+NlN!S3$bP@2Z>)3LjXd@Rn-+|$@)qc52#YOB>HdhCna~9aSW2{zD$*iN^{3o` zM2*X)3$s~i4N8p$hQ(k*FBwg6Dsv9``E83B*S(8GnKCtjV zSih_)U+bt~B`yAxssOg`=mZnNB92ZQ<3ZS0XmIqjYC;`NV=n$@re^KU?U36uT1%d~A@EbXE!=A)R zYK5bkm!*T|y`t8`CaXLBs8Ugl+B*{6g_2UPsx0hoDm?W#C=9(4QS<|PHSkfX_n18lwGZLN;oE`xnpR7 zN}{xVCHkth>xpiN=7kj%KV|nS*WAj2f@%k=!r9#mUJR~&Y3Hu$wJt6=Xw=3jF2mGy z;&j05p5M+Ne%OC@j1T&%k;nFNRUo`z;|1l`)&l(T8du=N0w8Q&(21F&{Pt=?mG0VU zIe^uuHnR1uR2*$imSkbaxf@P2r;1dZKk*Mwsfm)ZO>UVeSN>-o zJk|3pjGCse89G$(T_1Sa?9^U_PwliLVyJmZ!S0f3%^5%p zuOy-|Sm6YO<9F|0UEl0&Q>xzgQ@h~aZEu1g)qW2jSV^)cfn{Qg6&L3W>z(ECPV!{C zd!Uc{q!0S6&l>8BzHGR!v$+WF#2^N~h9wQH?034fDV3#Z>M$dnmNz$DYnrVY4P=ZK z;}MhTrmw+Zpxg)ppskJE+NiCK%QcbK)pv&p?28Dc0#wz+5=dg}AWx-@UOB2bgfsVMZKrB>Jf1-LJn-IMFAaT-e2w`Kk-# zTy%vMS7%#tZM1&I8`?MB9B)Zmal0+K6D!l0vblfAmPcqip2W_vColQ^M@l}S6?|?Z zzDz3^@RgEp(+a-(!GWJqTE}pT^T3sY8xLNm-lZlZS*J5ydy$=V_c&f0Extj(e9o~^(7vQj`PlnudLrDzwW2<%fze%Am+ALcvwda1^E98xnu zhAM;XVt}Ph3bSF;%yxmT&27UjqbIDHq+M%i*M%(ESUADiuwgB$P9z8l1O9?venfk zH|Oo+?c?o(2V{=Q&t2uNa!-|y9z#91{EVF3#Tu;^Kmd9Met$bBE~GUj(*5&%Rx*E1 zhC(E!P8eu3ks8$D371GmPZzzl6JM#PQKd4Rkgp83bIRVr3C_m0DHs)*8#dWmvav8~ z8{4W08{4FbXl`zfnwS9yKmg)mC>RQvLZ%o?2iwAC&tx&mI!w?w)l3+UcBHfj0(p%iM-in-5 zeB;wMx%Igceom|!T)QEyodcTpH_W>W%iJjHFJ!-hY=tJ-)X|id%`s?JGtoj><)%OI zQx{z*wcaqJP1M*jv&?@Nt^MDe5fnvH6h%=K&HOJkXya*U58a2zK_SE#Jl$@ZAO9iY zAQ%OiI75q><5U;P$uLGSm}!;Rg+x)z#-LqmrMR!2k8v3#OXaRZ+YWP+VT?~HyTqMP zt{$yU^{cjbNq-O*TqLf!g#NHXZs5@KVY+7#g!GswQlc2}1TN+hQn(=%L_J!mn`r<- zP4lJ+uRcCGCQ{=65-zooz$qBS0v9v~heg(y=n&{l5+|th<|I2lngWJM=Q4NZm)e{` zrC<^stmU^T2sX560zM_tNEY+vK;`IYXLZj;nBu)7Z}`!KjpmWLkqR9000wXw(ZD%e z)KkV)6fu5CQptKS0vIMelRc9FNCD<@k z-z}EUL*QeXnVmpzCI z!I=~vxRBB#+ZvPhXc;}YX8A~3ijS1r?Z7ABM?Ti1s&cyQsKD^xUUwXNprNC`HGA|< z<*lsLj}L@>cMv&70b+(7NH9d=)Kg<5&Y@Ugl?y@j619SN^8r3c8aEUQk^cP`6Ir5I z?6Te~&8OG>IPVcFe=OR?v3FNVg*jQM7eXa+Q2c!;Fd!k6&x>|YadIn&~nIMW>S zEwV--H{usYu1zkukGQu4iUAk%#}6i4WXip1R1Yp0$ys3v6;tuFX|^~uZF|@DfSqey zH>p7b;DcOUoKU5x{~y1I*Zn%byXVU`Qq5EaC-t=E|Ms&gT)>05!V6FF%GT9P;c&$r zDZxWW(u)^7eSWbvzPYTDh~IkM^LWrmaA7JQ#YJsNpY`I(tM*!%dqRVJf6oTxKq0ZU zVs}ITVWS*W)ZGl#0c5J5nN1heNUIa<9*B7&7T-P7iyT#%-G|ul#CUBngFv*3FD%i7 zWErFg_L4*Ns}+}Ziu>M~*T(+DV@V7k90C%8L7OXhG)c9brlA>VCfaoEUI#@>ge4sn zP(V*olG>K7oXU52hmW|$wSLY{{~}AyCs-<Z)P_>Gdo&N*{ydW-yR3g9JEUEyWku2mikQG^t)4C4sr>tT%@AcqbeF}6k z)bI-7JKZArbxPqy**X~A6u?nR+;0+l^k?x~M2ojg>$w#Na6@)SMJcJyaN*j7p@zcW zx5{0)6`LNDx_71^E5 z&G|D>8I|;d;j;GvRlI9GL61bN3UehRMP3fE1QXD9H*LdJn%VqLPovpkdLI)`;`OzsHU33R8!p$ zZ}>CF9|pa@gpVF29)SO0h7xbW<*GE?WOH;_XQu;ByY8{~enlgqM5!`nE4EB5DHGF? z94?of>&e~7L-I27R+rsd5`({KZh@JW+TbuJInPzySWh>1e^2*%gMHRd5huT+6LI3y zMQ1OrEXWOn!b64yj`$KOS-xr`HJE3K4Z0n2)=f`+^d|<9BuSI0#Nx|7uw|LXV~G=f zL`hMg#wb%YTWX^ohn;iFGoSoThe!)5tO+HRP)^ffP9wF#8Gq4I6{EV;yTTaJJlk2Nj?h>@m9oiUm$u-s<59Cg7RFMRR8j%X!Ko28VJ z%4<3}YNR%}5-3)>VuOq|%|a_|vD+~h-SyHyfD|O!$@+2U%u#arEyqor*~(ucij$$l zVB<{JVx_J2IPQ{rUilh{aEVSK{V;UqETw|BL#j^fy5A2LFH@-@#+#wlD%y6T~~enc_y|4C6~)}l+VxMdlw|Jn+?2$Lj7g?f|B z)^4p%`<-&lBk%l-N`whh7F9wqWmM9Se1+1%p}7QW_#cC|0(k_?#tHf9|M_&t=w4G{ zVkkq8l@>u#6j9b}K+><#EB^RohCg{OZR-D4b;wB8R9G=wA-Ten@*`3yZ9$z-eegDb z19?o!Q(2z7@^T;KZ+U_U$@_>@`2iwNoFvKyPmUvo%VR{7yoYF$_Y%{kabiK>zOnO! zH#L|j{8#yLF6#evc*yf?^C^V+v;rL_D_<)XvtCOM*A-2@X+1~Bgr0_0dt~PkVov4$QS7_mhsb}(a)ZXBQ&hgH8o)xuEb5SE+b93OG_ z;r#LbiG8}pvnYe*0=pTw1Ydg!#lDA z4QXh@s&9A=P2KCg+1tI_`+eBQjc;O;o9h1__Nd1_>1oe;-iu!LYUD+tjdh+q1zU0s z(ugE7MS-fQL^I_F1HAfTcSkumXrw_NAV2a$D1<^Vikl>qR%Fz%rz9`ep^w9W{!XJy zh}kU`kDWwFC4DfxdVMxI7*z8cPIYN~b^;$wPI0AqI+h)hrhcLvjZV$x_2Pz(D7wYc{fmiBZ6)LO2h)^-=Q zep1xNgF$tnho~<02-T$?qq^J^R9AY6>UEz{z3B_8t35+?t>>t&_X5?8UZT3$D^#~f zL3L*gP~9C9RQJXL)%~$SMJNZ<%IQ%zZ4QQ~ZPwJ4Av(rd+b%|@(f8MQ4K+qE0H;$^mIAy}^4sFf_Mc5DyY=#?(Jj)h`-@W!lc zIW1lomWOQY%9q;`EDzndRV=Ti*dDg=t6YA|7LMUv+r2#)?pg2lqDpKzq9jzwi$ImK zNJOcq(iVj(ebI=F5=bDz>9{3h>$9Z13 zmQ}5KHLG3S25s<$Z0Lq<*LqMG6qdlkER?nrY3zMQQ(2ip1w%(0eT*^38had3@PyL> zLDP(VzP8nG_{XU?uu&VmF&n#a8^7J_MPbrx6P(IrTyKlTse~o5-UJ)h2PX<%j*N~^ zYo7^;cgfgLE#LmpYgU7E7?Wm`l@I>S-=* zks_mfAT!Z13YdT4on+6h6gC>>#_i*Q=D~v#TBEDw!DO)d2)7VFHyq}F1M z`}0%}CQV)Gk%s_v?GyMCsftlY1I?|_3E$6G-`U3P z5$tl88-NwLKb>P8E`ph7vn0ys3o{S&VCT$6ATmTzhXDhqafygROCbFWF&TfLe*Gp| zTq6q&wU4E{*2LaRHup-RgFCy4$_(&jvw-HgPz~q~~FHYh3U`7P_#7FJh64TJ&Nz z&yC9?a~{eYWn~fG9(>uF4hVat>*izC%=*lPpHIyXywxdBY`3pdpU0<|U2W=UXU&;D zwbVh&lI_$NK0PLiwpvAn$|+}nsyDbhjYPdJc@ZsIM4L9T+G?@czW9K1tduBomm0JX zJbk`OanR2c_=wkwJYg_#QuvZoBTwcj&1qylOc|VXJWd2oBI<8K1lvu4Q{H{~Y_P=+ zd*ohCM^fZ)^2_IgFMjw77@AI|P&(37@Vu_hJ%lfMX~1r+x>OufimaEbNrmV%*rgYt z54asS@dkCQoIV*%3+b}G=`Cygt#Uu~1$NnOkG=Ly_*Jn$p!bYBwvsHakHShbL17Uo zG&qBJ$y+Z|TK2)s{Kst{?shs=!U6wBkKoGFw5ASlgJQESkmUFf$;v@>%aUaCFYwqSo zTsksrZ=d0q=3$}g8A}JQc-~NVbL68mZ2b}AUT07Ld%vKUJTlB5H(`nI;G5I0W0{3?fk#S>%N}Uny#3A&A*-QUT_6IWMFs! zd4UGn|A#MW>BrTZVUd*%a)gWQ?9Ltv`F_9b+x~ldJ3?<-^TX|9?sM_=$v4}`5I*@_lGyE& z^W*o}-(R{$x6kiB>CN@IhqssCwo; z@|XZkB2^92#F>DDB!ndu=X3+QTdlXXl`M6*8ke+`x+6^K7BK%Lz`>eMcI>R|)Pea`v%hHwAr^ z?B_v0M-Fo3C{Ips;t)U1@ZppI=lDA-$OVDUi*-k|TS8nC7JqaFoDA6Oy zo=EaoiljlTv3^z)z5Kf_{TXbcRA zVp2lm<6&f~n3%x0xR?+hQxa=R%QUmnGbaPH)91@+rM@wvQ@I}oM^GONGm`B?m$FEa zy6`mV3N5U?ZE8z9>TFvZTHp3Ix7F07CMVL6gbCZZaf~-7MYyKGCu35_^mNQjx8Zu* z*X~W+r1rLFQ}QaN_+pF8T1~Zuzh&;{H^`SSwOLeDR@Kzf$c&rO zkt;Mn&d~5r!LWO`&M%VqX+y{f+9F42hvqrVdTDStW9VrY(^ts3#x~$ zC=a%wD%g&!VFxOMoyY`sp?KJX;$SZ-hkeKf!rPDL0|!PkmxFZ(4+9RP>cCOd6F7!0 z0FI-EzzIAQIEktPr$*N;57xtI6!3^@13c>Wm=&g#T9yJ<8H>s-uY!4%j8j^b%9g6E zQ?16vYVE6zoq7%S)M$H6PS@;WEzZ{Jd~L2boJRg~#_P48q$MK%(8QOT`mC9`&$sZM zNXtX5*WQwr=xoJ!5$jc)-FRyWb`otQIY?GaaZ07RNH@;VVY2kbUaq|-Ejd@~c5(Dh zJU(vh0HQ*+qc!l_Z_*Mhpd+rmlIa2dAElSmbq3`FIEzXH=TII%ZdJB{8bE?WAj5e; z0d|8Ts0oyU!=OB<1C)kipbXRp$_FPw`Jn+&0XPLJ2z7x9!EsPwXb4mU9t0JIMnJ{j zAy9E>4O9Z229<;+K&9XjP-$oZR0f^^m4!Ay<=`1md1wk$0UiZagpNR!-~~_&?SamN z=RgT$L6zYpP!;F|stPZHs=)=I>hKDv2AmJ72`__c!PTJJ@Byd}TnVZR?}6&UMWFid z8mIwW1!@TIgBro5pvLevs0myFY6|ayn!&Z8=I{}y#cUfLlNp!q=dS;5N|3@Ezz9xD|9Md<(h^ zz5!kSJkx)#z(4pAPe2#YRqz++YPcJ84g3tc7CM8jgFivn!~LKe;CIlC&=YhM{13Vr zdV_9(GoV|c7w9%P4Z0orfbM{^pgW~M=q{n}hJK)XAZL~Cg}$Ks;2h|F84P+rqV6n% zKwTtsR~ZQEChqPs0n|f^-Fm*RIae>FaQBwspgxl6zA_%vPm139zphT#0Hjb4lyRUz zQltmVB+w8k(L-e#Xqc4g;V>OELS}NUVH*I0Kbpwfj>Zvz#pQT;ExWf4}lWe0l}l) z8$v~BKZHEA7eX3shmb+rAmm5;AQV8mAQVJQW2b>t2g>*4d(T0oQ0DRIPw_Le)RUySCcB)g8Bm>M!7L zq53QM8>o?tH*d|MH5NC4x<&EF@b5XOKb)?HhQqm&!T0buWX4N?kAJ?|^Zp$75bSsx&R!r51%NWdE_rK4fVlFM? zM~Uo{xgMUrr79L+udbc!X(=5<4@kT*7xa+5#-UW&tBx%z?d67j>lx10Rw55e*lMD1 zir$}yDq4->yc*8UcE3Gz%n50wk!))g$k^U-L+WfFv(wO1*4`w5-Nu4cNDKA-Ue4W& zG0K;Upe}~l6WK)KB73WKG0h4;?0kQWz&IuBSR3KQ+z7KxX6z3N;A|RzGnx}PHy5_y5YIF65ZX-oAp(`AA8 zaGVV1qT?-GOn`}F$Q{ebO?0j0=qVK#gAUH2Ei^6l9ea0+PbhO#OBY}%P~8})v$Lq* z(hI{pBPq{1X&(%Wwav2hIAr98X zc1tO+6Ue_=;w$jpvk?QoA>9p?Rj;+)?`;bZujJw zULOxJ(z)@Dlgs|?PGS9yg1}&VD1A5eJ^S9;@gHUN_!NeIYgvuXdEdKEa=%V}DX8^q zx1}(+Iv1fv=;?|e*ZFbxBwj{g0NIT}3HP{cfqN=)n<-3wjn&nkT0H)nHkChfr16N4tLA_OZt0pE=Gdnkh7c}_aU zN+k@`!c@)lw3SS=SZWQc92sjn3;hH!)Fe!TTwBiI0xJ)U^cx=?XRo(ae2$sM_!Gob z;{&(lnO)Cixg0q7Wa(gB;tTPIh{Agnwz&o%t}9ZI`+6b*T~r1SNc2A2(Z!~NOBbIG zGJCOmJMNZo&ysnoAoJRkhJmozcTz-AL;=t|*8ZLX~ z;;SBA4GxjjI7Gi>UW2_j{#pON#fhx-U4h(wO&WBTw`N@KR%g_>-;Wb5MnE5xMawWMs3Ag#04cOFp5zrXj~~IVTTc3lNFa#V z1qzQ-VBpLRFfkDsER+fZ8zXt3ik>>4hD^Os$5}_Afvdj%Dj4Y#-XlOo3qgb@fI{Yc zFrev~6K2ngz=DQXPT1hBq{4ehm5-AeUm_0QgE}nyBQ&59_=pd4VHNoQT|~|!ckBJT z!jGN*)j|3HQZxnMX1Ih=fPZHHkCmhNhako`2K=T3k%Rqr@l~L{eyV8#EMYoFK&k!> z3cid4r-EEnsofh<3Vq>VBwqx^*FGHx5dTs!d*7&D;M3E& z`YnW?($o0J0=k`#2h?U#p(SulL_E%6=n>s2uyo~SA_Dk0<`H2amZ{0;?=MhKm)i&b zOm_0z6Z0AC;pk_3GN1QvZl^%kANoT_*+_$-z;c7k1V64c9hPE#P6|_|MU5CMb4^a| x3bVZmHoQs`jq2u@d*(flJ!wzYQ+!;lX_sa<1n*jSbSF>a{QCRfaQ|`jDmSq;aqa*B literal 0 HcmV?d00001 From 13a3799976eb301efef122474bc011a1cd6498b3 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 15:58:50 -0800 Subject: [PATCH 07/28] add colours --- src/App.css | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/App.css b/src/App.css index c8ed02c..f8b838b 100644 --- a/src/App.css +++ b/src/App.css @@ -2,6 +2,77 @@ @tailwind components; @tailwind utilities; +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + /*@font-face {*/ + /* font-family: "KMR Apparat";*/ + /* src: url("/assets/fonts/trial/KMR-Apparat-Bold.woff") format("woff");*/ + /* font-weight: bold;*/ + /* font-style: normal;*/ + /*}*/ + + /*@font-face {*/ + /* font-family: "KMR Apparat";*/ + /* src: url("/assets/fonts/trial/KMR-Apparat-Medium.woff") format("woff");*/ + /* font-weight: 500;*/ + /* font-style: normal;*/ + /*}*/ + + @font-face { + font-family: "GT Planar"; + src: + url("/assets/fonts/GT-Planar-Regular.woff") format("woff"), + url("/assets/fonts/GT-Planar-Regular.woff2") format("woff2"); + font-weight: normal; + font-style: normal; + } + + @font-face { + font-family: "CoFo Sans Mono", monospace, monospace; + src: + url("/assets/fonts/CoFoSansMono-Regular.woff") format("woff"), + url("/assets/fonts/CoFoSansMono-Regular.woff2") format("woff2"); + font-weight: normal; + font-style: normal; + } + + :root { + --background: #f8f4f2; + --foreground: #120e15; + --off-white: #f8f4f2; + --off-black: #120e15; + --accent-aubergine: #7d0d8c; + --accent-dragonfruit: #b90674; + --accent-apple: #c90e33; + --accent-blood-orange: #fa4300; + --accent-tangerine: #ff9000; + --accent-butter: #f2f091; + } + + @media (prefers-color-scheme: dark) { + :root { + --background: #0f0f10; + --foreground: #ede6e1; + --off-black: #0f0f10; + --off-white: #ede6e1; + --accent-aubergine: #771584; + --accent-dragonfruit: #a81770; + --accent-apple: #98253c; + --accent-blood-orange: #de4208; + --accent-tangerine: #f18a03; + --accent-butter: #eae9bc; + } + } +} + +*::selection { + background: var(--foreground); + color: var(--background); +} + :root { --radius: 0.5rem; --font-mono: monospace; From dd022179e3a0d0faffc24eccf06b4aef28a78ad8 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Tue, 10 Dec 2024 17:03:21 -0800 Subject: [PATCH 08/28] update colours part 1 --- src/App.css | 34 +-- src/App.tsx | 2 +- src/components/Logo.tsx | 2 +- src/components/auth/AuthBlock.tsx | 2 +- src/components/auth/AuthProvider.tsx | 6 +- src/components/footer/Footer.tsx | 22 +- src/components/footer/SocialLink.tsx | 8 +- src/components/listings/ListingGridCard.tsx | 12 +- .../listings/ListingGridSkeleton.tsx | 10 +- src/components/nav/NavButton.tsx | 4 +- src/components/nav/Navbar.tsx | 12 +- src/components/nav/Sidebar.tsx | 14 +- src/components/pages/About.tsx | 2 +- src/components/pages/Browse.tsx | 2 +- src/components/pages/Home.tsx | 2 +- src/components/pages/Login.tsx | 2 +- src/components/ui/Header.tsx | 6 +- src/components/ui/button.tsx | 12 +- tailwind.config.js | 255 +++++++++--------- 19 files changed, 210 insertions(+), 199 deletions(-) diff --git a/src/App.css b/src/App.css index f8b838b..cdb91d2 100644 --- a/src/App.css +++ b/src/App.css @@ -42,8 +42,8 @@ :root { --background: #f8f4f2; --foreground: #120e15; - --off-white: #f8f4f2; - --off-black: #120e15; + --off-var(--foreground): #f8f4f2; + --off-var(--background): #120e15; --accent-aubergine: #7d0d8c; --accent-dragonfruit: #b90674; --accent-apple: #c90e33; @@ -56,8 +56,8 @@ :root { --background: #0f0f10; --foreground: #ede6e1; - --off-black: #0f0f10; - --off-white: #ede6e1; + --off-var(--background): #0f0f10; + --off-var(--foreground): #ede6e1; --accent-aubergine: #771584; --accent-dragonfruit: #a81770; --accent-apple: #98253c; @@ -79,8 +79,8 @@ } body { - background-color: black; - color: white; + background-color: var(--background); + color: var(--foreground); margin: 0; padding: 0; font-family: var(--font-mono); @@ -89,14 +89,14 @@ body { .container { padding: 1em; max-width: 100em; - border: 1px solid white; + border: 1px solid var(--foreground); border-radius: 3px; margin: 0 auto; box-sizing: border-box; } a { - color: white; + color: var(--foreground); text-decoration: none; padding: 0.3em 0.6em; border: 1px solid #333; @@ -107,7 +107,7 @@ a { } a:hover { - border-color: white; + border-color: var(--foreground); } .content { @@ -130,16 +130,16 @@ form { form textarea { height: 10rem; - background: black; - color: white; + background: var(--background); + color: var(--foreground); border: 1px solid #333; font-family: var(--font-mono); } form button { width: 100%; - background: black; - color: white; + background: var(--background); + color: var(--foreground); border: 1px solid #333; padding: 0.5em; font-family: var(--font-mono); @@ -147,11 +147,11 @@ form button { } form button:hover { - border-color: white; + border-color: var(--foreground); } .card { - background: black; + background: var(--background); border: 1px solid #333; border-radius: 3px; padding: 1em; @@ -159,7 +159,7 @@ form button:hover { } .card:hover { - border-color: white; + border-color: var(--foreground); } @media (max-width: 600px) { @@ -177,6 +177,6 @@ form button:hover { @apply border-[#333]; } body { - @apply bg-black text-white; + @apply bg-background text-foreground; } } diff --git a/src/App.tsx b/src/App.tsx index 02700e3..7d3305b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -43,7 +43,7 @@ const App = () => { -

+
diff --git a/src/components/Logo.tsx b/src/components/Logo.tsx index b8cf5d8..ef45e07 100644 --- a/src/components/Logo.tsx +++ b/src/components/Logo.tsx @@ -4,7 +4,7 @@ const Logo = () => { return (
K Scale Logo - + K-Scale Labs
diff --git a/src/components/auth/AuthBlock.tsx b/src/components/auth/AuthBlock.tsx index 8178515..5a54a6a 100644 --- a/src/components/auth/AuthBlock.tsx +++ b/src/components/auth/AuthBlock.tsx @@ -22,7 +22,7 @@ interface AuthBlockProps { const AuthBlock: React.FC = ({ title, onClosed, signup }) => { return ( - +
{ @@ -70,7 +70,7 @@ const Navbar = () => { ? "ghost" : "outline" } - className={`px-2 xl:px-3 py-2 text-sm tracking-widest text-gray-1 ${ + className={`px-2 xl:px-3 py-2 text-sm tracking-widest text-foreground ${ location.pathname === ROUTES.BOT.buildPath({ username: listing.username, @@ -105,7 +105,7 @@ const Navbar = () => { ), )}
-
+
{isAuthenticated ? ( <>
-
+
)} {hasNavItems && ( @@ -113,7 +113,7 @@ const Sidebar = ({ show, onClose }: SidebarProps) => { ))}
)} -
+
{isAuthenticated ? (
{ return ( -
+

K-Scale Labs

diff --git a/src/components/pages/Browse.tsx b/src/components/pages/Browse.tsx index 06e2096..11e62fa 100644 --- a/src/components/pages/Browse.tsx +++ b/src/components/pages/Browse.tsx @@ -166,7 +166,7 @@ const Browse = () => { key={option.value} checked={sortOption === option.value} onCheckedChange={() => setSortOption(option.value)} - className={`text-gray-11 cursor-pointer ${sortOption === option.value ? "text-gray-12 bg-gray-3" : ""}`} + className={`text-background cursor-pointer ${sortOption === option.value ? "text-background bg-foreground" : ""}`} > {option.label} diff --git a/src/components/pages/Home.tsx b/src/components/pages/Home.tsx index 1819a84..e5667a6 100644 --- a/src/components/pages/Home.tsx +++ b/src/components/pages/Home.tsx @@ -34,7 +34,7 @@ const HeroSection: React.FC = () => {
-

+

K-Scale Labs

diff --git a/src/components/pages/Login.tsx b/src/components/pages/Login.tsx index 8dbb8b7..865928c 100644 --- a/src/components/pages/Login.tsx +++ b/src/components/pages/Login.tsx @@ -8,7 +8,7 @@ const Login = () => { return (

- navigate(-1)} /> + navigate(-1)} />
); diff --git a/src/components/ui/Header.tsx b/src/components/ui/Header.tsx index c920bb9..2780c40 100644 --- a/src/components/ui/Header.tsx +++ b/src/components/ui/Header.tsx @@ -17,12 +17,12 @@ const Header = ({ title, label, onClosed, className }: HeaderProps) => { className, )} > -

{title}

- {label &&

{label}

} +

{title}

+ {label &&

{label}

} {onClosed && ( diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 0221c1e..2d8874b 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -10,13 +10,13 @@ const buttonVariants = cva( variants: { variant: { default: - "bg-gray-12 text-gray-1 border border-transparent hover:border-gray-1", - selected: "bg-gray-12 text-gray-1 border border-gray-1", + "bg-background text-foreground border border-transparent hover:border-foreground", + selected: "bg-background text-foreground border border-foreground", destructive: - "bg-destructive text-gray-1 shadow-sm hover:bg-destructive/90", - outline: "border border-gray-1 bg-gray-12 text-gray-1 hover:bg-gray-11", - ghost: "text-gray-1 border border-transparent hover:border-gray-1", - link: "text-gray-1 underline-offset-4 hover:underline", + "bg-destructive text-foreground shadow-sm hover:bg-destructive/90", + outline: "border border-foreground bg-background text-foreground hover:bg-accent-blood-orange", + ghost: "text-foreground border border-transparent hover:border-foreground ", + link: "text-foreground underline-offset-4 hover:underline", }, size: { default: "h-9 px-4 py-2", diff --git a/tailwind.config.js b/tailwind.config.js index a1f0b3c..7cf6d23 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,131 +2,140 @@ import animate from "tailwindcss-animate"; /** @type {import('tailwindcss').Config} */ export default { - darkMode: ["class"], - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], - theme: { - fontFamily: { - sans: ["Inter", "sans-serif"], - orbitron: ["Orbitron", "sans-serif"], - mono: ["monospace"], - }, - extend: { - animation: { - meteor: "meteor 5s linear infinite", - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", - }, - keyframes: { - meteor: { - "0%": { - transform: "rotate(215deg) translateX(0)", - opacity: "1", - }, - "70%": { - opacity: "1", - }, - "100%": { - transform: "rotate(215deg) translateX(-500px)", - opacity: "0", - }, - }, - "accordion-down": { - from: { - height: "0", - }, - to: { - height: "var(--radix-accordion-content-height)", - }, - }, - "accordion-up": { - from: { - height: "var(--radix-accordion-content-height)", - }, - to: { - height: "0", - }, - }, - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", - }, - colors: { - gray: { - 1: "#ffffff", - 2: "#f9f9fb", - 3: "#eff0f3", - 4: "#e7e8ec", - 5: "#e0e1e6", - 6: "#d8d9e0", - 7: "#cdced7", - 8: "#b9bbc6", - 9: "#8b8d98", - 10: "#80828d", - 11: "#62636c", - 12: "#000000", - }, - primary: { - 1: "#fefcfb", - 2: "#fff5f1", - 3: "#ffe8de", - 4: "#ffd7c7", - 5: "#ffc9b4", - 6: "#ffb89f", - 7: "#ffa284", - 8: "#fb8765", - 9: "#ffffff", - 10: "#f14000", - 11: "#de3500", - 12: "#000000", - DEFAULT: "#ff4f00", - foreground: "#000000", - }, - background: "#000000", - foreground: "#ffffff", - card: { - DEFAULT: "#000000", - foreground: "#ffffff", + darkMode: ["class"], + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + fontFamily: { + planar: ["GT Planar", "sans-serif"], + mono: ["Cofo Sans Mono", "monospace"], + sans: ["Inter", "sans-serif"], + orbitron: ["Orbitron", "sans-serif"], }, - popover: { - DEFAULT: "#000000", - foreground: "#ffffff", + extend: { + animation: { + meteor: "meteor 5s linear infinite", + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + keyframes: { + meteor: { + "0%": { + transform: "rotate(215deg) translateX(0)", + opacity: "1", + }, + "70%": { + opacity: "1", + }, + "100%": { + transform: "rotate(215deg) translateX(-500px)", + opacity: "0", + }, + }, + "accordion-down": { + from: { + height: "0", + }, + to: { + height: "var(--radix-accordion-content-height)", + }, + }, + "accordion-up": { + from: { + height: "var(--radix-accordion-content-height)", + }, + to: { + height: "0", + }, + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + colors: { + gray: { + 1: "#ffffff", + 2: "#f9f9fb", + 3: "#eff0f3", + 4: "#e7e8ec", + 5: "#e0e1e6", + 6: "#d8d9e0", + 7: "#cdced7", + 8: "#b9bbc6", + 9: "#8b8d98", + 10: "#80828d", + 11: "#62636c", + 12: "#000000", + }, + primary: { + 1: "#fefcfb", + 2: "#fff5f1", + 3: "#ffe8de", + 4: "#ffd7c7", + 5: "#ffc9b4", + 6: "#ffb89f", + 7: "#ffa284", + 8: "#fb8765", + 9: "#ffffff", + 10: "#f14000", + 11: "#de3500", + 12: "#000000", + DEFAULT: "#ff4f00", + foreground: "#000000", + }, + background: "var(--background)", + foreground: "var(--foreground)", + card: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + popover: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + secondary: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + muted: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + accent: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + destructive: { + DEFAULT: "var(--accent-blood-orange)", + foreground: "var(--foreground)", + }, + border: "var(--foreground)", + input: "var(--background)", + ring: "var(--foreground)", + chart: { + 1: "rgb(59, 130, 246)", + 2: "rgb(16, 185, 129)", + 3: "rgb(251, 146, 60)", + 4: "rgb(147, 51, 234)", + 5: "rgb(236, 72, 153)", + }, + "off-white": "var(--off-white)", + "off-black": "var(--off-black)", + "accent-aubergine": "var(--accent-aubergine)", + "accent-dragonfruit": "var(--accent-dragonfruit)", + "accent-apple": "var(--accent-apple)", + "accent-blood-orange": "var(--accent-blood-orange)", + "accent-tangerine": "var(--accent-tangerine)", + "accent-butter": "var(--accent-butter)", + }, }, - secondary: { - DEFAULT: "#000000", - foreground: "#ffffff", - }, - muted: { - DEFAULT: "#000000", - foreground: "#ffffff", - }, - accent: { - DEFAULT: "#000000", - foreground: "#ffffff", - }, - destructive: { - DEFAULT: "#DD4425", - foreground: "#ffffff", - }, - border: "#ffffff", - input: "#000000", - ring: "#ffffff", - chart: { - 1: "rgb(59, 130, 246)", - 2: "rgb(16, 185, 129)", - 3: "rgb(251, 146, 60)", - 4: "rgb(147, 51, 234)", - 5: "rgb(236, 72, 153)", - }, - }, }, - }, - plugins: [animate], - base: { - "html, body": { - color: "#ffffff", - backgroundColor: "#000000", + plugins: [animate], + base: { + "html, body": { + color: "var(--foreground)", + backgroundColor: "var(--background)", + }, }, - }, }; From 8af4ed78e1e68cb446fbd967d66de5ba17afae10 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 21:53:59 -0800 Subject: [PATCH 09/28] prettier and update colours --- .babelrc | 4 +- assets/cursor/default.svg | 3 + assets/cursor/default_dark.svg | 3 + assets/cursor/grab.svg | 3 + assets/cursor/grab_dark.svg | 3 + assets/cursor/grabbing.svg | 3 + assets/cursor/grabbing_dark.svg | 3 + assets/cursor/pointer.svg | 4 + assets/cursor/pointer_dark.svg | 4 + assets/cursor/progress.svg | 15 + assets/cursor/progress_dark.svg | 15 + assets/cursor/text.svg | 10 + assets/cursor/text_dark.svg | 10 + assets/cursor/wait.svg | 13 + assets/cursor/wait_dark.svg | 13 + assets/gstwebrtc-api-2.0.0.min.js | 5055 ++++++++++++++++++- components.json | 2 +- index.html | 319 +- src/App.css | 347 +- src/App.tsx | 14 +- src/components/ProtectedRoute.tsx | 23 +- src/components/auth/AuthBlock.tsx | 4 +- src/components/footer/Footer.tsx | 20 +- src/components/listings/ListingGridCard.tsx | 5 +- src/components/nav/Navbar.tsx | 45 +- src/components/nav/Sidebar.tsx | 8 +- src/components/pages/Browse.tsx | 5 +- src/components/pages/Profile.tsx | 10 +- src/components/ui/button.tsx | 6 +- tailwind.config.js | 269 +- tsconfig.app.json | 4 +- 31 files changed, 5809 insertions(+), 433 deletions(-) create mode 100644 assets/cursor/default.svg create mode 100644 assets/cursor/default_dark.svg create mode 100644 assets/cursor/grab.svg create mode 100644 assets/cursor/grab_dark.svg create mode 100644 assets/cursor/grabbing.svg create mode 100644 assets/cursor/grabbing_dark.svg create mode 100644 assets/cursor/pointer.svg create mode 100644 assets/cursor/pointer_dark.svg create mode 100644 assets/cursor/progress.svg create mode 100644 assets/cursor/progress_dark.svg create mode 100644 assets/cursor/text.svg create mode 100644 assets/cursor/text_dark.svg create mode 100644 assets/cursor/wait.svg create mode 100644 assets/cursor/wait_dark.svg diff --git a/.babelrc b/.babelrc index 4be9f92..0f200ed 100644 --- a/.babelrc +++ b/.babelrc @@ -4,7 +4,5 @@ "@babel/preset-react", "@babel/preset-typescript" ], - "plugins": [ - "@babel/plugin-proposal-private-property-in-object" - ] + "plugins": ["@babel/plugin-proposal-private-property-in-object"] } diff --git a/assets/cursor/default.svg b/assets/cursor/default.svg new file mode 100644 index 0000000..dcaae24 --- /dev/null +++ b/assets/cursor/default.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/default_dark.svg b/assets/cursor/default_dark.svg new file mode 100644 index 0000000..3615458 --- /dev/null +++ b/assets/cursor/default_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/grab.svg b/assets/cursor/grab.svg new file mode 100644 index 0000000..1a7b16a --- /dev/null +++ b/assets/cursor/grab.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/grab_dark.svg b/assets/cursor/grab_dark.svg new file mode 100644 index 0000000..2f58d60 --- /dev/null +++ b/assets/cursor/grab_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/grabbing.svg b/assets/cursor/grabbing.svg new file mode 100644 index 0000000..4240aff --- /dev/null +++ b/assets/cursor/grabbing.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/grabbing_dark.svg b/assets/cursor/grabbing_dark.svg new file mode 100644 index 0000000..4630652 --- /dev/null +++ b/assets/cursor/grabbing_dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/cursor/pointer.svg b/assets/cursor/pointer.svg new file mode 100644 index 0000000..ad496b7 --- /dev/null +++ b/assets/cursor/pointer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/cursor/pointer_dark.svg b/assets/cursor/pointer_dark.svg new file mode 100644 index 0000000..88d5f17 --- /dev/null +++ b/assets/cursor/pointer_dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/cursor/progress.svg b/assets/cursor/progress.svg new file mode 100644 index 0000000..e571612 --- /dev/null +++ b/assets/cursor/progress.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/assets/cursor/progress_dark.svg b/assets/cursor/progress_dark.svg new file mode 100644 index 0000000..20eedb4 --- /dev/null +++ b/assets/cursor/progress_dark.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/assets/cursor/text.svg b/assets/cursor/text.svg new file mode 100644 index 0000000..40e06fe --- /dev/null +++ b/assets/cursor/text.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/cursor/text_dark.svg b/assets/cursor/text_dark.svg new file mode 100644 index 0000000..303505c --- /dev/null +++ b/assets/cursor/text_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/cursor/wait.svg b/assets/cursor/wait.svg new file mode 100644 index 0000000..a332a03 --- /dev/null +++ b/assets/cursor/wait.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/assets/cursor/wait_dark.svg b/assets/cursor/wait_dark.svg new file mode 100644 index 0000000..a991433 --- /dev/null +++ b/assets/cursor/wait_dark.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/assets/gstwebrtc-api-2.0.0.min.js b/assets/gstwebrtc-api-2.0.0.min.js index 0bfbf37..1f68c67 100644 --- a/assets/gstwebrtc-api-2.0.0.min.js +++ b/assets/gstwebrtc-api-2.0.0.min.js @@ -1,5 +1,5056 @@ /*! gstwebrtc-api (https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/tree/main/net/webrtc/gstwebrtc-api), MPL-2.0 License, Copyright (C) 2022 Igalia S.L. , Author: Loïc Le Page */ /*! Contains embedded adapter from webrtc-adapter (https://github.com/webrtcHacks/adapter), BSD 3-Clause License, Copyright (c) 2014, The WebRTC project authors. All rights reserved. Copyright (c) 2018, The adapter.js project authors. All rights reserved. */ -(()=>{"use strict";var e={2:e=>{const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},t.getDescription=function(e){const n=t.splitSections(e);return n&&n[0]},t.getMediaSections=function(e){const n=t.splitSections(e);return n.shift(),n},t.matchPrefix=function(e,n){return t.splitLines(e).filter((e=>0===e.indexOf(n)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let e=8;e0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let n;const r=e.substring(e.indexOf(" ")+1).split(";");for(let e=0;e{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)})),t+="a=fmtp:"+n+" "+r.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const n=t.matchPrefix(e,"a=mid:")[0];if(n)return n.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let i=3;i{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const d=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));d.length>0&&d[0].length>1&&d[0][0]===a&&(c=d[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;i=e||t.generateSessionId();return"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let e=0;e{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={};n.r(e),n.d(e,{fixNegotiationNeeded:()=>w,shimAddTrackRemoveTrack:()=>P,shimAddTrackRemoveTrackWithNative:()=>E,shimGetDisplayMedia:()=>y,shimGetSendersWithDtmf:()=>S,shimGetStats:()=>k,shimGetUserMedia:()=>C,shimMediaStream:()=>v,shimOnTrack:()=>b,shimPeerConnection:()=>R,shimSenderReceiverGetStats:()=>T});var t={};n.r(t),n.d(t,{shimAddTransceiver:()=>G,shimCreateAnswer:()=>U,shimCreateOffer:()=>N,shimGetDisplayMedia:()=>x,shimGetParameters:()=>j,shimGetUserMedia:()=>A,shimOnTrack:()=>I,shimPeerConnection:()=>O,shimRTCDataChannel:()=>H,shimReceiverGetStats:()=>M,shimRemoveStream:()=>L,shimSenderGetStats:()=>D});var r={};n.r(r),n.d(r,{shimAudioContext:()=>B,shimCallbacksAPI:()=>J,shimConstraints:()=>q,shimCreateOfferLegacy:()=>V,shimGetUserMedia:()=>K,shimLocalStreamsAPI:()=>F,shimRTCIceServerUrls:()=>W,shimRemoteStreamsAPI:()=>z,shimTrackEventTransceiver:()=>Y});var i={};n.r(i),n.d(i,{removeExtmapAllowMixed:()=>re,shimAddIceCandidateNullOrEmpty:()=>ie,shimConnectionState:()=>ne,shimMaxMessageSize:()=>ee,shimParameterlessSetLocalDescription:()=>oe,shimRTCIceCandidate:()=>$,shimRTCIceCandidateRelayProtocol:()=>Q,shimSendThrowTypeError:()=>te});let o=!0,s=!0;function a(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function c(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function d(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(o=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function l(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(s=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function h(){if("object"==typeof window){if(o)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function p(e,t){s&&console.warn(e+" is deprecated, please use "+t+" instead.")}function u(e){return"[object Object]"===Object.prototype.toString.call(e)}function m(e){return u(e)?Object.keys(e).reduce((function(t,n){const r=u(e[n]),i=r?m(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function _(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?_(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{_(e,e.get(t),n)}))})))}function f(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&_(e,n,i)}))})),i}const g=h;function C(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),g("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return g("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function y(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,o=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:o||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function v(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function b(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else c(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function S(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function k(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},o=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(o(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(o(i(t)))},n])})).then(n,r)}}function T(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>f(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),c(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>f(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function E(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function P(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return E(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function R(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function w(e,t){c(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}function A(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){p("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function x(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function I(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function O(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function D(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function M(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),c(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function L(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){p("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function H(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function G(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function j(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function N(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function U(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function F(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function z(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function J(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function K(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(q(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function q(e){return e&&void 0!==e.video?Object.assign({},e,{video:m(e.video)}):e}function W(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;nt.generateCertificate})}function Y(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function V(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function B(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var Z=n(2),X=n.n(Z);function $(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=X().parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,c(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function Q(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||c(e,"icecandidate",(e=>{if(e.candidate){const t=X().parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function ee(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=X().splitSections(e.sdp);return t.shift(),t.some((e=>{const t=X().parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=X().matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function te(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},c(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function ne(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function re(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function ie(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function oe(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}!function({window:n}={},o={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const s=h,c=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=a(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=a(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=a(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(n),p={browserDetails:c,commonShim:i,extractVersion:a,disableLog:d,disableWarnings:l,sdp:Z};switch(c.browser){case"chrome":if(!e||!R||!o.shimChrome)return s("Chrome shim is not included in this adapter release."),p;if(null===c.version)return s("Chrome shim can not determine version, not shimming."),p;s("adapter.js shimming chrome."),p.browserShim=e,ie(n,c),oe(n),C(n,c),v(n),R(n,c),b(n),P(n,c),S(n),k(n),T(n),w(n,c),$(n),Q(n),ne(n),ee(n,c),te(n),re(n,c);break;case"firefox":if(!t||!O||!o.shimFirefox)return s("Firefox shim is not included in this adapter release."),p;s("adapter.js shimming firefox."),p.browserShim=t,ie(n,c),oe(n),A(n,c),O(n,c),I(n),L(n),D(n),M(n),H(n),G(n),j(n),N(n),U(n),$(n),ne(n),ee(n,c),te(n);break;case"safari":if(!r||!o.shimSafari)return s("Safari shim is not included in this adapter release."),p;s("adapter.js shimming safari."),p.browserShim=r,ie(n,c),oe(n),W(n),V(n),J(n),F(n),z(n),Y(n),K(n),B(n),$(n),Q(n),ee(n,c),te(n),re(n,c);break;default:s("Unsupported browser!")}}({window:"undefined"==typeof window?void 0:window});const se=Object.freeze({meta:null,signalingServerUrl:"ws://127.0.0.1:8443",reconnectionTimeout:2500,webrtcConfig:{iceServers:[{urls:["stun:stun.l.google.com:19302","stun:stun1.l.google.com:19302"]}]}}),ae=Object.freeze({idle:0,connecting:1,streaming:2,closed:3});class ce extends EventTarget{constructor(e,t){super(),this._peerId=e,this._sessionId="",this._comChannel=t,this._state=ae.idle,this._rtcPeerConnection=null}get peerId(){return this._peerId}get sessionId(){return this._sessionId}get state(){return this._state}get rtcPeerConnection(){return this._rtcPeerConnection}close(){this._state!==ae.closed&&(this._state!==ae.idle&&this._comChannel&&this._sessionId&&this._comChannel.send({type:"endSession",sessionId:this._sessionId}),this._state=ae.closed,this.dispatchEvent(new Event("stateChanged")),this._comChannel=null,this._rtcPeerConnection&&(this._rtcPeerConnection.close(),this._rtcPeerConnection=null,this.dispatchEvent(new Event("rtcPeerConnectionChanged"))),this.dispatchEvent(new Event("closed")))}}const de=Object.freeze({32:"space",33:"exclam",34:"quotedbl",35:"numbersign",36:"dollar",37:"percent",38:"ampersand",39:"apostrophe",40:"parenleft",41:"parenright",42:"asterisk",43:"plus",44:"comma",45:"minus",46:"period",47:"slash",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",58:"colon",59:"semicolon",60:"less",61:"equal",62:"greater",63:"question",64:"at",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",91:"bracketleft",92:"backslash",93:"bracketright",94:"asciicircum",95:"underscore",96:"grave",97:"a",98:"b",99:"c",100:"d",101:"e",102:"f",103:"g",104:"h",105:"i",106:"j",107:"k",108:"l",109:"m",110:"n",111:"o",112:"p",113:"q",114:"r",115:"s",116:"t",117:"u",118:"v",119:"w",120:"x",121:"y",122:"z",123:"braceleft",124:"bar",125:"braceright",126:"asciitilde",160:"nobreakspace",161:"exclamdown",162:"cent",163:"sterling",164:"currency",165:"yen",166:"brokenbar",167:"section",168:"diaeresis",169:"copyright",170:"ordfeminine",171:"guillemotleft",172:"notsign",173:"hyphen",174:"registered",175:"macron",176:"degree",177:"plusminus",178:"twosuperior",179:"threesuperior",180:"acute",181:"mu",182:"paragraph",183:"periodcentered",184:"cedilla",185:"onesuperior",186:"masculine",187:"guillemotright",188:"onequarter",189:"onehalf",190:"threequarters",191:"questiondown",192:"Agrave",193:"Aacute",194:"Acircumflex",195:"Atilde",196:"Adiaeresis",197:"Aring",198:"AE",199:"Ccedilla",200:"Egrave",201:"Eacute",202:"Ecircumflex",203:"Ediaeresis",204:"Igrave",205:"Iacute",206:"Icircumflex",207:"Idiaeresis",208:"ETH",209:"Ntilde",210:"Ograve",211:"Oacute",212:"Ocircumflex",213:"Otilde",214:"Odiaeresis",215:"multiply",216:"Ooblique",217:"Ugrave",218:"Uacute",219:"Ucircumflex",220:"Udiaeresis",221:"Yacute",222:"THORN",223:"ssharp",224:"agrave",225:"aacute",226:"acircumflex",227:"atilde",228:"adiaeresis",229:"aring",230:"ae",231:"ccedilla",232:"egrave",233:"eacute",234:"ecircumflex",235:"ediaeresis",236:"igrave",237:"iacute",238:"icircumflex",239:"idiaeresis",240:"eth",241:"ntilde",242:"ograve",243:"oacute",244:"ocircumflex",245:"otilde",246:"odiaeresis",247:"division",248:"oslash",249:"ugrave",250:"uacute",251:"ucircumflex",252:"udiaeresis",253:"yacute",254:"thorn",255:"ydiaeresis",260:"Aogonek",728:"breve",321:"Lstroke",317:"Lcaron",346:"Sacute",352:"Scaron",350:"Scedilla",356:"Tcaron",377:"Zacute",381:"Zcaron",379:"Zabovedot",261:"aogonek",731:"ogonek",322:"lstroke",318:"lcaron",347:"sacute",711:"caron",353:"scaron",351:"scedilla",357:"tcaron",378:"zacute",733:"doubleacute",382:"zcaron",380:"zabovedot",340:"Racute",258:"Abreve",313:"Lacute",262:"Cacute",268:"Ccaron",280:"Eogonek",282:"Ecaron",270:"Dcaron",272:"Dstroke",323:"Nacute",327:"Ncaron",336:"Odoubleacute",344:"Rcaron",366:"Uring",368:"Udoubleacute",354:"Tcedilla",341:"racute",259:"abreve",314:"lacute",263:"cacute",269:"ccaron",281:"eogonek",283:"ecaron",271:"dcaron",273:"dstroke",324:"nacute",328:"ncaron",337:"odoubleacute",345:"rcaron",367:"uring",369:"udoubleacute",355:"tcedilla",729:"abovedot",294:"Hstroke",292:"Hcircumflex",304:"Iabovedot",286:"Gbreve",308:"Jcircumflex",295:"hstroke",293:"hcircumflex",305:"idotless",287:"gbreve",309:"jcircumflex",266:"Cabovedot",264:"Ccircumflex",288:"Gabovedot",284:"Gcircumflex",364:"Ubreve",348:"Scircumflex",267:"cabovedot",265:"ccircumflex",289:"gabovedot",285:"gcircumflex",365:"ubreve",349:"scircumflex",312:"kra",342:"Rcedilla",296:"Itilde",315:"Lcedilla",274:"Emacron",290:"Gcedilla",358:"Tslash",343:"rcedilla",297:"itilde",316:"lcedilla",275:"emacron",291:"gcedilla",359:"tslash",330:"ENG",331:"eng",256:"Amacron",302:"Iogonek",278:"Eabovedot",298:"Imacron",325:"Ncedilla",332:"Omacron",310:"Kcedilla",370:"Uogonek",360:"Utilde",362:"Umacron",257:"amacron",303:"iogonek",279:"eabovedot",299:"imacron",326:"ncedilla",333:"omacron",311:"kcedilla",371:"uogonek",361:"utilde",363:"umacron",8254:"overline",12290:"kana_fullstop",12300:"kana_openingbracket",12301:"kana_closingbracket",12289:"kana_comma",12539:"kana_conjunctive",12530:"kana_WO",12449:"kana_a",12451:"kana_i",12453:"kana_u",12455:"kana_e",12457:"kana_o",12515:"kana_ya",12517:"kana_yu",12519:"kana_yo",12483:"kana_tsu",12540:"prolongedsound",12450:"kana_A",12452:"kana_I",12454:"kana_U",12456:"kana_E",12458:"kana_O",12459:"kana_KA",12461:"kana_KI",12463:"kana_KU",12465:"kana_KE",12467:"kana_KO",12469:"kana_SA",12471:"kana_SHI",12473:"kana_SU",12475:"kana_SE",12477:"kana_SO",12479:"kana_TA",12481:"kana_CHI",12484:"kana_TSU",12486:"kana_TE",12488:"kana_TO",12490:"kana_NA",12491:"kana_NI",12492:"kana_NU",12493:"kana_NE",12494:"kana_NO",12495:"kana_HA",12498:"kana_HI",12501:"kana_FU",12504:"kana_HE",12507:"kana_HO",12510:"kana_MA",12511:"kana_MI",12512:"kana_MU",12513:"kana_ME",12514:"kana_MO",12516:"kana_YA",12518:"kana_YU",12520:"kana_YO",12521:"kana_RA",12522:"kana_RI",12523:"kana_RU",12524:"kana_RE",12525:"kana_RO",12527:"kana_WA",12531:"kana_N",12443:"voicedsound",12444:"semivoicedsound",1548:"Arabic_comma",1563:"Arabic_semicolon",1567:"Arabic_question_mark",1569:"Arabic_hamza",1570:"Arabic_maddaonalef",1571:"Arabic_hamzaonalef",1572:"Arabic_hamzaonwaw",1573:"Arabic_hamzaunderalef",1574:"Arabic_hamzaonyeh",1575:"Arabic_alef",1576:"Arabic_beh",1577:"Arabic_tehmarbuta",1578:"Arabic_teh",1579:"Arabic_theh",1580:"Arabic_jeem",1581:"Arabic_hah",1582:"Arabic_khah",1583:"Arabic_dal",1584:"Arabic_thal",1585:"Arabic_ra",1586:"Arabic_zain",1587:"Arabic_seen",1588:"Arabic_sheen",1589:"Arabic_sad",1590:"Arabic_dad",1591:"Arabic_tah",1592:"Arabic_zah",1593:"Arabic_ain",1594:"Arabic_ghain",1600:"Arabic_tatweel",1601:"Arabic_feh",1602:"Arabic_qaf",1603:"Arabic_kaf",1604:"Arabic_lam",1605:"Arabic_meem",1606:"Arabic_noon",1607:"Arabic_ha",1608:"Arabic_waw",1609:"Arabic_alefmaksura",1610:"Arabic_yeh",1611:"Arabic_fathatan",1612:"Arabic_dammatan",1613:"Arabic_kasratan",1614:"Arabic_fatha",1615:"Arabic_damma",1616:"Arabic_kasra",1617:"Arabic_shadda",1618:"Arabic_sukun",1106:"Serbian_dje",1107:"Macedonia_gje",1105:"Cyrillic_io",1108:"Ukrainian_ie",1109:"Macedonia_dse",1110:"Ukrainian_i",1111:"Ukrainian_yi",1112:"Cyrillic_je",1113:"Cyrillic_lje",1114:"Cyrillic_nje",1115:"Serbian_tshe",1116:"Macedonia_kje",1118:"Byelorussian_shortu",1119:"Cyrillic_dzhe",8470:"numerosign",1026:"Serbian_DJE",1027:"Macedonia_GJE",1025:"Cyrillic_IO",1028:"Ukrainian_IE",1029:"Macedonia_DSE",1030:"Ukrainian_I",1031:"Ukrainian_YI",1032:"Cyrillic_JE",1033:"Cyrillic_LJE",1034:"Cyrillic_NJE",1035:"Serbian_TSHE",1036:"Macedonia_KJE",1038:"Byelorussian_SHORTU",1039:"Cyrillic_DZHE",1102:"Cyrillic_yu",1072:"Cyrillic_a",1073:"Cyrillic_be",1094:"Cyrillic_tse",1076:"Cyrillic_de",1077:"Cyrillic_ie",1092:"Cyrillic_ef",1075:"Cyrillic_ghe",1093:"Cyrillic_ha",1080:"Cyrillic_i",1081:"Cyrillic_shorti",1082:"Cyrillic_ka",1083:"Cyrillic_el",1084:"Cyrillic_em",1085:"Cyrillic_en",1086:"Cyrillic_o",1087:"Cyrillic_pe",1103:"Cyrillic_ya",1088:"Cyrillic_er",1089:"Cyrillic_es",1090:"Cyrillic_te",1091:"Cyrillic_u",1078:"Cyrillic_zhe",1074:"Cyrillic_ve",1100:"Cyrillic_softsign",1099:"Cyrillic_yeru",1079:"Cyrillic_ze",1096:"Cyrillic_sha",1101:"Cyrillic_e",1097:"Cyrillic_shcha",1095:"Cyrillic_che",1098:"Cyrillic_hardsign",1070:"Cyrillic_YU",1040:"Cyrillic_A",1041:"Cyrillic_BE",1062:"Cyrillic_TSE",1044:"Cyrillic_DE",1045:"Cyrillic_IE",1060:"Cyrillic_EF",1043:"Cyrillic_GHE",1061:"Cyrillic_HA",1048:"Cyrillic_I",1049:"Cyrillic_SHORTI",1050:"Cyrillic_KA",1051:"Cyrillic_EL",1052:"Cyrillic_EM",1053:"Cyrillic_EN",1054:"Cyrillic_O",1055:"Cyrillic_PE",1071:"Cyrillic_YA",1056:"Cyrillic_ER",1057:"Cyrillic_ES",1058:"Cyrillic_TE",1059:"Cyrillic_U",1046:"Cyrillic_ZHE",1042:"Cyrillic_VE",1068:"Cyrillic_SOFTSIGN",1067:"Cyrillic_YERU",1047:"Cyrillic_ZE",1064:"Cyrillic_SHA",1069:"Cyrillic_E",1065:"Cyrillic_SHCHA",1063:"Cyrillic_CHE",1066:"Cyrillic_HARDSIGN",902:"Greek_ALPHAaccent",904:"Greek_EPSILONaccent",905:"Greek_ETAaccent",906:"Greek_IOTAaccent",938:"Greek_IOTAdiaeresis",908:"Greek_OMICRONaccent",910:"Greek_UPSILONaccent",939:"Greek_UPSILONdieresis",911:"Greek_OMEGAaccent",901:"Greek_accentdieresis",8213:"Greek_horizbar",940:"Greek_alphaaccent",941:"Greek_epsilonaccent",942:"Greek_etaaccent",943:"Greek_iotaaccent",970:"Greek_iotadieresis",912:"Greek_iotaaccentdieresis",972:"Greek_omicronaccent",973:"Greek_upsilonaccent",971:"Greek_upsilondieresis",944:"Greek_upsilonaccentdieresis",974:"Greek_omegaaccent",913:"Greek_ALPHA",914:"Greek_BETA",915:"Greek_GAMMA",916:"Greek_DELTA",917:"Greek_EPSILON",918:"Greek_ZETA",919:"Greek_ETA",920:"Greek_THETA",921:"Greek_IOTA",922:"Greek_KAPPA",923:"Greek_LAMBDA",924:"Greek_MU",925:"Greek_NU",926:"Greek_XI",927:"Greek_OMICRON",928:"Greek_PI",929:"Greek_RHO",931:"Greek_SIGMA",932:"Greek_TAU",933:"Greek_UPSILON",934:"Greek_PHI",935:"Greek_CHI",936:"Greek_PSI",937:"Greek_OMEGA",945:"Greek_alpha",946:"Greek_beta",947:"Greek_gamma",948:"Greek_delta",949:"Greek_epsilon",950:"Greek_zeta",951:"Greek_eta",952:"Greek_theta",953:"Greek_iota",954:"Greek_kappa",955:"Greek_lambda",956:"Greek_mu",957:"Greek_nu",958:"Greek_xi",959:"Greek_omicron",960:"Greek_pi",961:"Greek_rho",963:"Greek_sigma",962:"Greek_finalsmallsigma",964:"Greek_tau",965:"Greek_upsilon",966:"Greek_phi",967:"Greek_chi",968:"Greek_psi",969:"Greek_omega",9143:"leftradical",8992:"topintegral",8993:"botintegral",9121:"topleftsqbracket",9123:"botleftsqbracket",9124:"toprightsqbracket",9126:"botrightsqbracket",9115:"topleftparens",9117:"botleftparens",9118:"toprightparens",9120:"botrightparens",9128:"leftmiddlecurlybrace",9132:"rightmiddlecurlybrace",8804:"lessthanequal",8800:"notequal",8805:"greaterthanequal",8747:"integral",8756:"therefore",8733:"variation",8734:"infinity",8711:"nabla",8764:"approximate",8771:"similarequal",8660:"ifonlyif",8658:"implies",8801:"identical",8730:"radical",8834:"includedin",8835:"includes",8745:"intersection",8746:"union",8743:"logicaland",8744:"logicalor",8706:"partialderivative",402:"function",8592:"leftarrow",8593:"uparrow",8594:"rightarrow",8595:"downarrow",9670:"soliddiamond",9618:"checkerboard",9225:"ht",9228:"ff",9229:"cr",9226:"lf",9252:"nl",9227:"vt",9496:"lowrightcorner",9488:"uprightcorner",9484:"upleftcorner",9492:"lowleftcorner",9532:"crossinglines",9146:"horizlinescan1",9147:"horizlinescan3",9472:"horizlinescan5",9148:"horizlinescan7",9149:"horizlinescan9",9500:"leftt",9508:"rightt",9524:"bott",9516:"topt",9474:"vertbar",8195:"emspace",8194:"enspace",8196:"em3space",8197:"em4space",8199:"digitspace",8200:"punctspace",8201:"thinspace",8202:"hairspace",8212:"emdash",8211:"endash",9251:"signifblank",8230:"ellipsis",8229:"doubbaselinedot",8531:"onethird",8532:"twothirds",8533:"onefifth",8534:"twofifths",8535:"threefifths",8536:"fourfifths",8537:"onesixth",8538:"fivesixths",8453:"careof",8210:"figdash",10216:"leftanglebracket",10217:"rightanglebracket",8539:"oneeighth",8540:"threeeighths",8541:"fiveeighths",8542:"seveneighths",8482:"trademark",9747:"signaturemark",9665:"leftopentriangle",9655:"rightopentriangle",9647:"emopenrectangle",8216:"leftsinglequotemark",8217:"rightsinglequotemark",8220:"leftdoublequotemark",8221:"rightdoublequotemark",8478:"prescription",8242:"minutes",8243:"seconds",10013:"latincross",9644:"filledrectbullet",9664:"filledlefttribullet",9654:"filledrighttribullet",9679:"emfilledcircle",9646:"emfilledrect",9702:"enopencircbullet",9643:"enopensquarebullet",9645:"openrectbullet",9651:"opentribulletup",9661:"opentribulletdown",9734:"openstar",8226:"enfilledcircbullet",9642:"enfilledsqbullet",9650:"filledtribulletup",9660:"filledtribulletdown",9756:"leftpointer",9758:"rightpointer",9827:"club",9830:"diamond",9829:"heart",10016:"maltesecross",8224:"dagger",8225:"doubledagger",10003:"checkmark",10007:"ballotcross",9839:"musicalsharp",9837:"musicalflat",9794:"malesymbol",9792:"femalesymbol",9742:"telephone",8981:"telephonerecorder",8471:"phonographcopyright",8248:"caret",8218:"singlelowquotemark",8222:"doublelowquotemark",8869:"downtack",8970:"downstile",8728:"jot",9109:"quad",8868:"uptack",9675:"circle",8968:"upstile",8866:"lefttack",8867:"righttack",8215:"hebrew_doublelowline",1488:"hebrew_aleph",1489:"hebrew_beth",1490:"hebrew_gimmel",1491:"hebrew_daleth",1492:"hebrew_he",1493:"hebrew_waw",1494:"hebrew_zayin",1495:"hebrew_het",1496:"hebrew_teth",1497:"hebrew_yod",1498:"hebrew_finalkaph",1499:"hebrew_kaph",1500:"hebrew_lamed",1501:"hebrew_finalmem",1502:"hebrew_mem",1503:"hebrew_finalnun",1504:"hebrew_nun",1505:"hebrew_samekh",1506:"hebrew_ayin",1507:"hebrew_finalpe",1508:"hebrew_pe",1509:"hebrew_finalzadi",1510:"hebrew_zadi",1511:"hebrew_qoph",1512:"hebrew_resh",1513:"hebrew_shin",1514:"hebrew_taw",3585:"Thai_kokai",3586:"Thai_khokhai",3587:"Thai_khokhuat",3588:"Thai_khokhwai",3589:"Thai_khokhon",3590:"Thai_khorakhang",3591:"Thai_ngongu",3592:"Thai_chochan",3593:"Thai_choching",3594:"Thai_chochang",3595:"Thai_soso",3596:"Thai_chochoe",3597:"Thai_yoying",3598:"Thai_dochada",3599:"Thai_topatak",3600:"Thai_thothan",3601:"Thai_thonangmontho",3602:"Thai_thophuthao",3603:"Thai_nonen",3604:"Thai_dodek",3605:"Thai_totao",3606:"Thai_thothung",3607:"Thai_thothahan",3608:"Thai_thothong",3609:"Thai_nonu",3610:"Thai_bobaimai",3611:"Thai_popla",3612:"Thai_phophung",3613:"Thai_fofa",3614:"Thai_phophan",3615:"Thai_fofan",3616:"Thai_phosamphao",3617:"Thai_moma",3618:"Thai_yoyak",3619:"Thai_rorua",3620:"Thai_ru",3621:"Thai_loling",3622:"Thai_lu",3623:"Thai_wowaen",3624:"Thai_sosala",3625:"Thai_sorusi",3626:"Thai_sosua",3627:"Thai_hohip",3628:"Thai_lochula",3629:"Thai_oang",3630:"Thai_honokhuk",3631:"Thai_paiyannoi",3632:"Thai_saraa",3633:"Thai_maihanakat",3634:"Thai_saraaa",3635:"Thai_saraam",3636:"Thai_sarai",3637:"Thai_saraii",3638:"Thai_saraue",3639:"Thai_sarauee",3640:"Thai_sarau",3641:"Thai_sarauu",3642:"Thai_phinthu",3647:"Thai_baht",3648:"Thai_sarae",3649:"Thai_saraae",3650:"Thai_sarao",3651:"Thai_saraaimaimuan",3652:"Thai_saraaimaimalai",3653:"Thai_lakkhangyao",3654:"Thai_maiyamok",3655:"Thai_maitaikhu",3656:"Thai_maiek",3657:"Thai_maitho",3658:"Thai_maitri",3659:"Thai_maichattawa",3660:"Thai_thanthakhat",3661:"Thai_nikhahit",3664:"Thai_leksun",3665:"Thai_leknung",3666:"Thai_leksong",3667:"Thai_leksam",3668:"Thai_leksi",3669:"Thai_lekha",3670:"Thai_lekhok",3671:"Thai_lekchet",3672:"Thai_lekpaet",3673:"Thai_lekkao",12593:"Hangul_Kiyeog",12594:"Hangul_SsangKiyeog",12595:"Hangul_KiyeogSios",12596:"Hangul_Nieun",12597:"Hangul_NieunJieuj",12598:"Hangul_NieunHieuh",12599:"Hangul_Dikeud",12600:"Hangul_SsangDikeud",12601:"Hangul_Rieul",12602:"Hangul_RieulKiyeog",12603:"Hangul_RieulMieum",12604:"Hangul_RieulPieub",12605:"Hangul_RieulSios",12606:"Hangul_RieulTieut",12607:"Hangul_RieulPhieuf",12608:"Hangul_RieulHieuh",12609:"Hangul_Mieum",12610:"Hangul_Pieub",12611:"Hangul_SsangPieub",12612:"Hangul_PieubSios",12613:"Hangul_Sios",12614:"Hangul_SsangSios",12615:"Hangul_Ieung",12616:"Hangul_Jieuj",12617:"Hangul_SsangJieuj",12618:"Hangul_Cieuc",12619:"Hangul_Khieuq",12620:"Hangul_Tieut",12621:"Hangul_Phieuf",12622:"Hangul_Hieuh",12623:"Hangul_A",12624:"Hangul_AE",12625:"Hangul_YA",12626:"Hangul_YAE",12627:"Hangul_EO",12628:"Hangul_E",12629:"Hangul_YEO",12630:"Hangul_YE",12631:"Hangul_O",12632:"Hangul_WA",12633:"Hangul_WAE",12634:"Hangul_OE",12635:"Hangul_YO",12636:"Hangul_U",12637:"Hangul_WEO",12638:"Hangul_WE",12639:"Hangul_WI",12640:"Hangul_YU",12641:"Hangul_EU",12642:"Hangul_YI",12643:"Hangul_I",4520:"Hangul_J_Kiyeog",4521:"Hangul_J_SsangKiyeog",4522:"Hangul_J_KiyeogSios",4523:"Hangul_J_Nieun",4524:"Hangul_J_NieunJieuj",4525:"Hangul_J_NieunHieuh",4526:"Hangul_J_Dikeud",4527:"Hangul_J_Rieul",4528:"Hangul_J_RieulKiyeog",4529:"Hangul_J_RieulMieum",4530:"Hangul_J_RieulPieub",4531:"Hangul_J_RieulSios",4532:"Hangul_J_RieulTieut",4533:"Hangul_J_RieulPhieuf",4534:"Hangul_J_RieulHieuh",4535:"Hangul_J_Mieum",4536:"Hangul_J_Pieub",4537:"Hangul_J_PieubSios",4538:"Hangul_J_Sios",4539:"Hangul_J_SsangSios",4540:"Hangul_J_Ieung",4541:"Hangul_J_Jieuj",4542:"Hangul_J_Cieuc",4543:"Hangul_J_Khieuq",4544:"Hangul_J_Tieut",4545:"Hangul_J_Phieuf",4546:"Hangul_J_Hieuh",12653:"Hangul_RieulYeorinHieuh",12657:"Hangul_SunkyeongeumMieum",12664:"Hangul_SunkyeongeumPieub",12671:"Hangul_PanSios",12673:"Hangul_KkogjiDalrinIeung",12676:"Hangul_SunkyeongeumPhieuf",12678:"Hangul_YeorinHieuh",12685:"Hangul_AraeA",12686:"Hangul_AraeAE",4587:"Hangul_J_PanSios",4592:"Hangul_J_KkogjiDalrinIeung",4601:"Hangul_J_YeorinHieuh",338:"OE",339:"oe",376:"Ydiaeresis",8352:"EcuSign",8353:"ColonSign",8354:"CruzeiroSign",8355:"FFrancSign",8356:"LiraSign",8357:"MillSign",8358:"NairaSign",8359:"PesetaSign",8360:"RupeeSign",8361:"WonSign",8362:"NewSheqelSign",8363:"DongSign",8364:"EuroSign",768:"dead_grave",769:"dead_acute",770:"dead_circumflex",771:"dead_tilde",772:"dead_macron",774:"dead_breve",775:"dead_abovedot",776:"dead_diaeresis",778:"dead_abovering",779:"dead_doubleacute",780:"dead_caron",807:"dead_cedilla",808:"dead_ogonek",837:"dead_iota",12441:"dead_voiced_sound",12442:"dead_semivoiced_sound",8:"BackSpace",9:"Tab",10:"Linefeed",11:"Clear",13:"Return",19:"Pause",20:"Scroll_Lock",21:"Sys_Req",27:"Escape",1169:"Ukrainian_ghe_with_upturn",1168:"Ukrainian_GHE_WITH_UPTURN",1415:"Armenian_ligature_ew",1417:"Armenian_verjaket",1373:"Armenian_but",1418:"Armenian_yentamna",1372:"Armenian_amanak",1371:"Armenian_shesht",1374:"Armenian_paruyk",1329:"Armenian_AYB",1377:"Armenian_ayb",1330:"Armenian_BEN",1378:"Armenian_ben",1331:"Armenian_GIM",1379:"Armenian_gim",1332:"Armenian_DA",1380:"Armenian_da",1333:"Armenian_YECH",1381:"Armenian_yech",1334:"Armenian_ZA",1382:"Armenian_za",1335:"Armenian_E",1383:"Armenian_e",1336:"Armenian_AT",1384:"Armenian_at",1337:"Armenian_TO",1385:"Armenian_to",1338:"Armenian_ZHE",1386:"Armenian_zhe",1339:"Armenian_INI",1387:"Armenian_ini",1340:"Armenian_LYUN",1388:"Armenian_lyun",1341:"Armenian_KHE",1389:"Armenian_khe",1342:"Armenian_TSA",1390:"Armenian_tsa",1343:"Armenian_KEN",1391:"Armenian_ken",1344:"Armenian_HO",1392:"Armenian_ho",1345:"Armenian_DZA",1393:"Armenian_dza",1346:"Armenian_GHAT",1394:"Armenian_ghat",1347:"Armenian_TCHE",1395:"Armenian_tche",1348:"Armenian_MEN",1396:"Armenian_men",1349:"Armenian_HI",1397:"Armenian_hi",1350:"Armenian_NU",1398:"Armenian_nu",1351:"Armenian_SHA",1399:"Armenian_sha",1352:"Armenian_VO",1400:"Armenian_vo",1353:"Armenian_CHA",1401:"Armenian_cha",1354:"Armenian_PE",1402:"Armenian_pe",1355:"Armenian_JE",1403:"Armenian_je",1356:"Armenian_RA",1404:"Armenian_ra",1357:"Armenian_SE",1405:"Armenian_se",1358:"Armenian_VEV",1406:"Armenian_vev",1359:"Armenian_TYUN",1407:"Armenian_tyun",1360:"Armenian_RE",1408:"Armenian_re",1361:"Armenian_TSO",1409:"Armenian_tso",1362:"Armenian_VYUN",1410:"Armenian_vyun",1363:"Armenian_PYUR",1411:"Armenian_pyur",1364:"Armenian_KE",1412:"Armenian_ke",1365:"Armenian_O",1413:"Armenian_o",1366:"Armenian_FE",1414:"Armenian_fe",1370:"Armenian_apostrophe",4304:"Georgian_an",4305:"Georgian_ban",4306:"Georgian_gan",4307:"Georgian_don",4308:"Georgian_en",4309:"Georgian_vin",4310:"Georgian_zen",4311:"Georgian_tan",4312:"Georgian_in",4313:"Georgian_kan",4314:"Georgian_las",4315:"Georgian_man",4316:"Georgian_nar",4317:"Georgian_on",4318:"Georgian_par",4319:"Georgian_zhar",4320:"Georgian_rae",4321:"Georgian_san",4322:"Georgian_tar",4323:"Georgian_un",4324:"Georgian_phar",4325:"Georgian_khar",4326:"Georgian_ghan",4327:"Georgian_qar",4328:"Georgian_shin",4329:"Georgian_chin",4330:"Georgian_can",4331:"Georgian_jil",4332:"Georgian_cil",4333:"Georgian_char",4334:"Georgian_xan",4335:"Georgian_jhan",4336:"Georgian_hae",4337:"Georgian_he",4338:"Georgian_hie",4339:"Georgian_we",4340:"Georgian_har",4341:"Georgian_hoe",4342:"Georgian_fi",7682:"Babovedot",7683:"babovedot",7690:"Dabovedot",7808:"Wgrave",7810:"Wacute",7691:"dabovedot",7922:"Ygrave",7710:"Fabovedot",7711:"fabovedot",7744:"Mabovedot",7745:"mabovedot",7766:"Pabovedot",7809:"wgrave",7767:"pabovedot",7811:"wacute",7776:"Sabovedot",7923:"ygrave",7812:"Wdiaeresis",7813:"wdiaeresis",7777:"sabovedot",372:"Wcircumflex",7786:"Tabovedot",374:"Ycircumflex",373:"wcircumflex",7787:"tabovedot",375:"ycircumflex",1776:"Farsi_0",1777:"Farsi_1",1778:"Farsi_2",1779:"Farsi_3",1780:"Farsi_4",1781:"Farsi_5",1782:"Farsi_6",1783:"Farsi_7",1784:"Farsi_8",1785:"Farsi_9",1642:"Arabic_percent",1648:"Arabic_superscript_alef",1657:"Arabic_tteh",1662:"Arabic_peh",1670:"Arabic_tcheh",1672:"Arabic_ddal",1681:"Arabic_rreh",1748:"Arabic_fullstop",1632:"Arabic_0",1633:"Arabic_1",1634:"Arabic_2",1635:"Arabic_3",1636:"Arabic_4",1637:"Arabic_5",1638:"Arabic_6",1639:"Arabic_7",1640:"Arabic_8",1641:"Arabic_9",1619:"Arabic_madda_above",1620:"Arabic_hamza_above",1621:"Arabic_hamza_below",1688:"Arabic_jeh",1700:"Arabic_veh",1705:"Arabic_keheh",1711:"Arabic_gaf",1722:"Arabic_noon_ghunna",1726:"Arabic_heh_doachashmee",1740:"Farsi_yeh",1746:"Arabic_yeh_baree",1729:"Arabic_heh_goal",1170:"Cyrillic_GHE_bar",1174:"Cyrillic_ZHE_descender",1178:"Cyrillic_KA_descender",1180:"Cyrillic_KA_vertstroke",1186:"Cyrillic_EN_descender",1198:"Cyrillic_U_straight",1200:"Cyrillic_U_straight_bar",1202:"Cyrillic_HA_descender",1206:"Cyrillic_CHE_descender",1208:"Cyrillic_CHE_vertstroke",1210:"Cyrillic_SHHA",1240:"Cyrillic_SCHWA",1250:"Cyrillic_I_macron",1256:"Cyrillic_O_bar",1262:"Cyrillic_U_macron",1171:"Cyrillic_ghe_bar",1175:"Cyrillic_zhe_descender",1179:"Cyrillic_ka_descender",1181:"Cyrillic_ka_vertstroke",1187:"Cyrillic_en_descender",1199:"Cyrillic_u_straight",1201:"Cyrillic_u_straight_bar",1203:"Cyrillic_ha_descender",1207:"Cyrillic_che_descender",1209:"Cyrillic_che_vertstroke",1211:"Cyrillic_shha",1241:"Cyrillic_schwa",1251:"Cyrillic_i_macron",1257:"Cyrillic_o_bar",1263:"Cyrillic_u_macron",7818:"Xabovedot",300:"Ibreve",437:"Zstroke",486:"Gcaron",415:"Obarred",7819:"xabovedot",301:"ibreve",438:"zstroke",487:"gcaron",466:"ocaron",629:"obarred",399:"SCHWA",601:"schwa",7734:"Lbelowdot",7735:"lbelowdot",7840:"Abelowdot",7841:"abelowdot",7842:"Ahook",7843:"ahook",7844:"Acircumflexacute",7845:"acircumflexacute",7846:"Acircumflexgrave",7847:"acircumflexgrave",7848:"Acircumflexhook",7849:"acircumflexhook",7850:"Acircumflextilde",7851:"acircumflextilde",7852:"Acircumflexbelowdot",7853:"acircumflexbelowdot",7854:"Abreveacute",7855:"abreveacute",7856:"Abrevegrave",7857:"abrevegrave",7858:"Abrevehook",7859:"abrevehook",7860:"Abrevetilde",7861:"abrevetilde",7862:"Abrevebelowdot",7863:"abrevebelowdot",7864:"Ebelowdot",7865:"ebelowdot",7866:"Ehook",7867:"ehook",7868:"Etilde",7869:"etilde",7870:"Ecircumflexacute",7871:"ecircumflexacute",7872:"Ecircumflexgrave",7873:"ecircumflexgrave",7874:"Ecircumflexhook",7875:"ecircumflexhook",7876:"Ecircumflextilde",7877:"ecircumflextilde",7878:"Ecircumflexbelowdot",7879:"ecircumflexbelowdot",7880:"Ihook",7881:"ihook",7882:"Ibelowdot",7883:"ibelowdot",7884:"Obelowdot",7885:"obelowdot",7886:"Ohook",7887:"ohook",7888:"Ocircumflexacute",7889:"ocircumflexacute",7890:"Ocircumflexgrave",7891:"ocircumflexgrave",7892:"Ocircumflexhook",7893:"ocircumflexhook",7894:"Ocircumflextilde",7895:"ocircumflextilde",7896:"Ocircumflexbelowdot",7897:"ocircumflexbelowdot",7898:"Ohornacute",7899:"ohornacute",7900:"Ohorngrave",7901:"ohorngrave",7902:"Ohornhook",7903:"ohornhook",7904:"Ohorntilde",7905:"ohorntilde",7906:"Ohornbelowdot",7907:"ohornbelowdot",7908:"Ubelowdot",7909:"ubelowdot",7910:"Uhook",7911:"uhook",7912:"Uhornacute",7913:"uhornacute",7914:"Uhorngrave",7915:"uhorngrave",7916:"Uhornhook",7917:"uhornhook",7918:"Uhorntilde",7919:"uhorntilde",7920:"Uhornbelowdot",7921:"uhornbelowdot",7924:"Ybelowdot",7925:"ybelowdot",7926:"Yhook",7927:"yhook",7928:"Ytilde",7929:"ytilde",416:"Ohorn",417:"ohorn",431:"Uhorn",432:"uhorn",803:"dead_belowdot",777:"dead_hook",795:"dead_horn"}),le=Object.freeze({AltLeft:"Alt_L",AltRight:"Alt_R",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right",ArrowUp:"Up",Backspace:"BackSpace",CapsLock:"Caps_Lock",ControlLeft:"Control_L",ControlRight:"Control_R",Enter:"Return",HyperLeft:"Hyper_L",HyperRight:"Hyper_R",NumLock:"Num_Lock",NumpadEnter:"Return",MetaLeft:"Meta_L",MetaRight:"Meta_R",PageDown:"Page_Down",PageUp:"Page_Up",ScrollLock:"Scroll_Lock",ShiftLeft:"Shift_L",ShiftRight:"Shift_R",SuperLeft:"Super_L",SuperRight:"Super_R"}),he=new Set(["Clear","Copy","Cut","Delete","End","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","Home","Insert","Paste","Redo","Tab","Undo"]);function pe(e,t){var n="Unidentified";if(1===e.length){const t=e.charCodeAt(0);t in de&&(n=de[t])}else t in le?n=le[t]:he.has(t)&&(n=t);return n}const ue=Object.freeze(["wheel","contextmenu","mousemove","mousedown","mouseup","touchstart","touchend","touchmove","touchcancel","keyup","keydown"]),me=Object.freeze({mousemove:"MouseMove",mousedown:"MouseButtonPress",mouseup:"MouseButtonRelease"}),_e=Object.freeze({touchstart:"TouchDown",touchend:"TouchUp",touchmove:"TouchMotion",touchcancel:"TouchUp"}),fe=Object.freeze({keydown:"KeyPress",keyup:"KeyRelease"});function ge(e){const t=[];return e.altKey&&t.push("mod1-mask"),e.ctrlKey&&t.push("control-mask"),e.metaKey&&t.push("meta-mask"),e.shiftKey&&t.push("shift-mask"),t.join("+")}class Ce extends EventTarget{constructor(e,t){super(),this._rtcDataChannel=e,this._consumerSession=t,this._videoElement=null,this._videoElementComputedStyle=null,this._videoElementKeyboard=null,this._lastTouchEventTimestamp=0,this._requestCounter=0,e.addEventListener("close",(()=>{this._rtcDataChannel===e&&this.close()})),e.addEventListener("error",(t=>{if(this._rtcDataChannel===e){const e=t.error;this.dispatchEvent(new ErrorEvent("error",{message:e&&e.message||"Remote controller error",error:e||new Error("unknown error on the remote controller data channel")}))}})),e.addEventListener("message",(e=>{try{const t=JSON.parse(e.data);"ControlResponseMessage"===t.type?this.dispatchEvent(new CustomEvent("controlResponse",{detail:t})):"InfoMessage"===t.type&&this.dispatchEvent(new CustomEvent("info",{detail:t}))}catch(e){this.dispatchEvent(new ErrorEvent("error",{message:"cannot parse control message from signaling server",error:e}))}}))}get rtcDataChannel(){return this._rtcDataChannel}get consumerSession(){return this._consumerSession}get videoElement(){return this._videoElement}attachVideoElement(e){if(e instanceof HTMLVideoElement&&e!==this._videoElement){this._videoElement&&this.attachVideoElement(null),this._videoElement=e,this._videoElementComputedStyle=window.getComputedStyle(e);for(const t of ue)e.addEventListener(t,this);e.setAttribute("tabindex","0")}else if(null===e&&this._videoElement){const e=this._videoElement;e.removeAttribute("tabindex"),this._videoElement=null,this._videoElementComputedStyle=null,this._lastTouchEventTimestamp=0;for(const t of ue)e.removeEventListener(t,this)}}sendControlRequest(e){try{if(!e||"object"!=typeof e&&"string"!=typeof e)throw new Error("invalid request");if(!this._rtcDataChannel)throw new Error("remote controller data channel is closed");let t={id:this._requestCounter++,request:e};return this._rtcDataChannel.send(JSON.stringify(t)),t.id}catch(e){return this.dispatchEvent(new ErrorEvent("error",{message:`cannot send control message over session ${this._consumerSession.sessionId} remote controller`,error:e})),-1}}close(){this.attachVideoElement(null);const e=this._rtcDataChannel;this._rtcDataChannel=null,e&&(e.close(),this.dispatchEvent(new Event("closed")))}_sendGstNavigationEvent(e){let t={type:"navigationEvent",event:e};this.sendControlRequest(t)}_computeVideoMousePosition(e){const t={x:0,y:0};if(!this._videoElement||this._videoElement.videoWidth<=0||this._videoElement.videoHeight<=0)return t;const n=parseFloat(this._videoElementComputedStyle.paddingLeft),r=parseFloat(this._videoElementComputedStyle.paddingRight),i=parseFloat(this._videoElementComputedStyle.paddingTop),o=parseFloat(this._videoElementComputedStyle.paddingBottom);if("offsetX"in e&&"offsetY"in e)t.x=e.offsetX-n,t.y=e.offsetY-i;else{const r=this._videoElement.getBoundingClientRect(),o={left:parseFloat(this._videoElementComputedStyle.borderLeftWidth),top:parseFloat(this._videoElementComputedStyle.borderTopWidth)};t.x=e.clientX-r.left-o.left-n,t.y=e.clientY-r.top-o.top-i}const s={x:this._videoElement.clientWidth-(n+r),y:this._videoElement.clientHeight-(i+o)},a=Math.min(s.x/this._videoElement.videoWidth,s.y/this._videoElement.videoHeight);s.x=Math.max(.5*(s.x-this._videoElement.videoWidth*a),0),s.y=Math.max(.5*(s.y-this._videoElement.videoHeight*a),0);const c=0!==a?1/a:0;return t.x=(t.x-s.x)*c,t.y=(t.y-s.y)*c,t.x=Math.min(Math.max(t.x,0),this._videoElement.videoWidth),t.y=Math.min(Math.max(t.y,0),this._videoElement.videoHeight),t}handleEvent(e){if(this._videoElement)switch(e.type){case"wheel":e.preventDefault();{const t=this._computeVideoMousePosition(e);this._sendGstNavigationEvent({event:"MouseScroll",x:t.x,y:t.y,delta_x:-e.deltaX,delta_y:-e.deltaY,modifier_state:ge(e)})}break;case"contextmenu":e.preventDefault();break;case"mousemove":case"mousedown":case"mouseup":e.preventDefault();{const t=this._computeVideoMousePosition(e),n={event:me[e.type],x:t.x,y:t.y,modifier_state:ge(e)};"mousemove"!==e.type&&(n.button=e.button+1,"mousedown"===e.type&&0===e.button&&this._videoElement.focus()),this._sendGstNavigationEvent(n)}break;case"touchstart":case"touchend":case"touchmove":case"touchcancel":for(const t of e.changedTouches){const n=this._computeVideoMousePosition(t),r={event:_e[e.type],identifier:t.identifier,x:n.x,y:n.y,modifier_state:ge(e)};!("force"in t)||"touchstart"!==e.type&&"touchmove"!==e.type||(r.pressure=t.force),this._sendGstNavigationEvent(r)}e.timeStamp>this._lastTouchEventTimestamp&&(this._lastTouchEventTimestamp=e.timeStamp,this._sendGstNavigationEvent({event:"TouchFrame",modifier_state:ge(e)}));break;case"keyup":case"keydown":e.preventDefault();{const t={event:fe[e.type],key:pe(e.key,e.code),modifier_state:ge(e)};this._sendGstNavigationEvent(t)}}}}class ye extends ce{constructor(e,t,n){super(e,t),this._streams=[],this._remoteController=null,this._pendingCandidates=[],this._mungeStereoHack=!1,this._offerOptions=n,this.addEventListener("closed",(()=>{this._streams=[],this._pendingCandidates=[],this._remoteController&&this._remoteController.close()}))}set mungeStereoHack(e){"boolean"==typeof e&&(this._mungeStereoHack=e)}get streams(){return this._streams}get remoteController(){return this._remoteController}connect(){if(!this._comChannel||this._state===ae.closed)return!1;if(this._state!==ae.idle)return!0;if(this._offerOptions)this.ensurePeerConnection(),this._rtcPeerConnection.createDataChannel("control"),this._rtcPeerConnection.createOffer(this._offerOptions).then((e=>{if(this._rtcPeerConnection&&e)return this._rtcPeerConnection.setLocalDescription(e);throw new Error("cannot send local offer to WebRTC peer")})).then((()=>{if(this._rtcPeerConnection&&this._comChannel){const e={type:"startSession",peerId:this._peerId,offer:this._rtcPeerConnection.localDescription.toJSON().sdp};if(!this._comChannel.send(e))throw new Error("cannot send startSession message to signaling server");this._state=ae.connecting,this.dispatchEvent(new Event("stateChanged"))}})).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during SDP handshake",error:e})),this.close())}));else{const e={type:"startSession",peerId:this._peerId};if(!this._comChannel.send(e))return this.dispatchEvent(new ErrorEvent("error",{message:"cannot connect consumer session",error:new Error("cannot send startSession message to signaling server")})),this.close(),!1;this._state=ae.connecting,this.dispatchEvent(new Event("stateChanged"))}return!0}onSessionStarted(e,t){if(this._peerId===e&&this._state===ae.connecting&&!this._sessionId){console.log("Session started",this._sessionId),this._sessionId=t;for(const e of this._pendingCandidates)console.log("Sending delayed ICE with session id",this._sessionId),this._comChannel.send({type:"peer",sessionId:this._sessionId,ice:e.toJSON()});this._pendingCandidates=[]}}ensurePeerConnection(){if(!this._rtcPeerConnection){const e=new RTCPeerConnection(this._comChannel.webrtcConfig);this._rtcPeerConnection=e,e.ontrack=t=>{if(this._rtcPeerConnection===e&&t.streams&&t.streams.length>0){this._state===ae.connecting&&(this._state=ae.streaming,this.dispatchEvent(new Event("stateChanged")));let e=!1;for(const n of t.streams)this._streams.includes(n)||(this._streams.push(n),e=!0);e&&this.dispatchEvent(new Event("streamsChanged"))}},e.ondatachannel=e=>{const t=e.channel;if(t&&"control"===t.label){if(this._remoteController){const e=this._remoteController;this._remoteController=null,e.close()}const e=new Ce(t,this);this._remoteController=e,this.dispatchEvent(new Event("remoteControllerChanged")),e.addEventListener("closed",(()=>{this._remoteController===e&&(this._remoteController=null,this.dispatchEvent(new Event("remoteControllerChanged")))}))}},e.onicecandidate=t=>{this._rtcPeerConnection===e&&t.candidate&&this._comChannel&&(this._sessionId?(console.log("Sending ICE with session id",this._sessionId),this._comChannel.send({type:"peer",sessionId:this._sessionId,ice:t.candidate.toJSON()})):this._pendingCandidates.push(t.candidate))},this.dispatchEvent(new Event("rtcPeerConnectionChanged"))}}mungeStereo(e,t){const n=/a=fmtp:.* sprop-stereo/g;let r=new Set;for(const t of e.matchAll(n)){const e=t[0].match(/a=fmtp:(\d+) .*/);e&&r.add(e[1])}for(const e of r){const n=new RegExp("a=fmtp:"+e+".*stereo");t.match(n)||(t=t.replaceAll("a=fmtp:"+e,"a=fmtp:"+e+" stereo=1;"))}return t}onSessionPeerMessage(e){if(this._state!==ae.closed&&this._comChannel&&this._sessionId)if(this.ensurePeerConnection(),e.sdp)this._offerOptions?this._rtcPeerConnection.setRemoteDescription(e.sdp).then((()=>{console.log("done")})).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during SDP handshake",error:e})),this.close())})):this._rtcPeerConnection.setRemoteDescription(e.sdp).then((()=>this._rtcPeerConnection?this._rtcPeerConnection.createAnswer():null)).then((t=>this._rtcPeerConnection&&t?(this._mungeStereoHack&&(t.sdp=this.mungeStereo(e.sdp.sdp,t.sdp)),this._rtcPeerConnection.setLocalDescription(t)):null)).then((()=>{if(this._rtcPeerConnection&&this._comChannel){console.log("Sending SDP with session id",this._sessionId);const e={type:"peer",sessionId:this._sessionId,sdp:this._rtcPeerConnection.localDescription.toJSON()};if(!this._comChannel.send(e))throw new Error("cannot send local SDP configuration to WebRTC peer")}})).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during SDP handshake",error:e})),this.close())}));else{if(!e.ice)throw new Error(`invalid empty peer message received from consumer session ${this._sessionId}`);{const t=new RTCIceCandidate(e.ice);this._rtcPeerConnection.addIceCandidate(t).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during ICE handshake",error:e})),this.close())}))}}}}class ve extends ce{constructor(e,t,n,r){super(e,n),this._sessionId=t,this._state=ae.streaming;const i=new RTCPeerConnection(this._comChannel.webrtcConfig);this._rtcPeerConnection=i;for(const e of r.getTracks())i.addTrack(e,r);i.onicecandidate=e=>{this._rtcPeerConnection===i&&e.candidate&&this._comChannel&&this._comChannel.send({type:"peer",sessionId:this._sessionId,ice:e.candidate.toJSON()})},this.dispatchEvent(new Event("rtcPeerConnectionChanged")),i.setLocalDescription().then((()=>{if(this._rtcPeerConnection===i&&this._comChannel){const e={type:"peer",sessionId:this._sessionId,sdp:this._rtcPeerConnection.localDescription.toJSON()};if(!this._comChannel.send(e))throw new Error("cannot send local SDP configuration to WebRTC peer")}})).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during SDP handshake",error:e})),this.close())}))}onSessionPeerMessage(e){if(this._state!==ae.closed&&this._rtcPeerConnection)if(e.sdp)this._rtcPeerConnection.setRemoteDescription(e.sdp).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during SDP handshake",error:e})),this.close())}));else{if(!e.ice)throw new Error(`invalid empty peer message received from producer's client session ${this._peerId}`);{const t=new RTCIceCandidate(e.ice);this._rtcPeerConnection.addIceCandidate(t).catch((e=>{this._state!==ae.closed&&(this.dispatchEvent(new ErrorEvent("error",{message:"an unrecoverable error occurred during ICE handshake",error:e})),this.close())}))}}}}class be extends EventTarget{constructor(e,t){super(),this._comChannel=e,this._stream=t,this._state=ae.idle,this._clientSessions={}}get stream(){return this._stream}get state(){return this._state}start(){if(!this._comChannel||this._state===ae.closed)return!1;if(this._state!==ae.idle)return!0;const e={type:"setPeerStatus",roles:["listener","producer"],meta:this._comChannel.meta};return this._comChannel.send(e)?(this._state=ae.connecting,this.dispatchEvent(new Event("stateChanged")),!0):(this.dispatchEvent(new ErrorEvent("error",{message:"cannot start producer session",error:new Error("cannot register producer to signaling server")})),this.close(),!1)}close(){if(this._state!==ae.closed){for(const e of this._stream.getTracks())e.stop();this._state!==ae.idle&&this._comChannel&&this._comChannel.send({type:"setPeerStatus",roles:["listener"],meta:this._comChannel.meta}),this._state=ae.closed,this.dispatchEvent(new Event("stateChanged")),this._comChannel=null,this._stream=null;for(const e of Object.values(this._clientSessions))e.close();this._clientSessions={},this.dispatchEvent(new Event("closed"))}}onProducerRegistered(){this._state===ae.connecting&&(this._state=ae.streaming,this.dispatchEvent(new Event("stateChanged")))}onStartSessionMessage(e){if(this._comChannel&&this._stream&&!(e.sessionId in this._clientSessions)){const t=new ve(e.peerId,e.sessionId,this._comChannel,this._stream);this._clientSessions[e.sessionId]=t,t.addEventListener("closed",(e=>{const n=e.target.sessionId;n in this._clientSessions&&this._clientSessions[n]===t&&(delete this._clientSessions[n],this.dispatchEvent(new CustomEvent("clientConsumerRemoved",{detail:t})))})),t.addEventListener("error",(e=>{this.dispatchEvent(new ErrorEvent("error",{message:`error from client consumer ${e.target.peerId}: ${e.message}`,error:e.error}))})),this.dispatchEvent(new CustomEvent("clientConsumerAdded",{detail:t}))}}onEndSessionMessage(e){e.sessionId in this._clientSessions&&this._clientSessions[e.sessionId].close()}onSessionPeerMessage(e){e.sessionId in this._clientSessions&&this._clientSessions[e.sessionId].onSessionPeerMessage(e)}}const Se=Object.freeze({welcome:"welcome",peerStatusChanged:"peerStatusChanged",list:"list",sessionStarted:"sessionStarted",peer:"peer",startSession:"startSession",endSession:"endSession",error:"error"});function ke(e,t){if(!e||"object"!=typeof e)return null;const n={id:"",meta:{}};if(e.id&&"string"==typeof e.id)n.id=e.id;else{if(!e.peerId||"string"!=typeof e.peerId)return null;n.id=e.peerId}return n.id===t?null:(e.meta&&"object"==typeof e.meta&&(n.meta=e.meta),Object.freeze(n.meta),Object.freeze(n))}class Te extends EventTarget{constructor(e,t,n){super(),this._meta=t,this._webrtcConfig=n,this._ws=new WebSocket(e),this._ready=!1,this._channelId="",this._producerSession=null,this._consumerSessions={},this._ws.onerror=e=>{this.dispatchEvent(new ErrorEvent("error",{message:e.message||"WebSocket error",error:e.error||new Error(this._ready?"transportation error":"cannot connect to signaling server")})),this.close()},this._ws.onclose=()=>{this._ready=!1,this._channelId="",this._ws=null,this.closeAllConsumerSessions(),this._producerSession&&(this._producerSession.close(),this._producerSession=null),this.dispatchEvent(new Event("closed"))},this._ws.onmessage=e=>{try{const n=JSON.parse(e.data);if(n&&"object"==typeof n)switch(n.type){case Se.welcome:this._channelId=n.peerId;try{this._ws.send(JSON.stringify({type:"setPeerStatus",roles:["listener"],meta:t}))}catch(e){this.dispatchEvent(new ErrorEvent("error",{message:"cannot initialize connection to signaling server",error:e})),this.close()}break;case Se.peerStatusChanged:if(n.peerId===this._channelId)!this._ready&&n.roles.includes("listener")&&(this._ready=!0,this.dispatchEvent(new Event("ready")),this.send({type:"list"})),this._producerSession&&n.roles.includes("producer")&&this._producerSession.onProducerRegistered();else{const e=ke(n,this._channelId);e&&(n.roles.includes("producer")?this.dispatchEvent(new CustomEvent("producerAdded",{detail:e})):this.dispatchEvent(new CustomEvent("producerRemoved",{detail:e})))}break;case Se.list:for(const e of n.producers){const t=ke(e,this._channelId);t&&this.dispatchEvent(new CustomEvent("producerAdded",{detail:t}))}break;case Se.sessionStarted:{const e=this.getConsumerSession(n.peerId);e&&(delete this._consumerSessions[n.peerId],e.onSessionStarted(n.peerId,n.sessionId),e.sessionId&&!(e.sessionId in this._consumerSessions)?this._consumerSessions[e.sessionId]=e:e.close())}break;case Se.peer:{const e=this.getConsumerSession(n.sessionId);e?e.onSessionPeerMessage(n):this._producerSession&&this._producerSession.onSessionPeerMessage(n)}break;case Se.startSession:this._producerSession&&this._producerSession.onStartSessionMessage(n);break;case Se.endSession:{const e=this.getConsumerSession(n.sessionId);e?e.close():this._producerSession&&this._producerSession.onEndSessionMessage(n)}break;case Se.error:this.dispatchEvent(new ErrorEvent("error",{message:"error received from signaling server",error:new Error(n.details)}));break;default:throw new Error(`unknown message type: "${n.type}"`)}}catch(e){this.dispatchEvent(new ErrorEvent("error",{message:"cannot parse incoming message from signaling server",error:e}))}}}get meta(){return this._meta}get webrtcConfig(){return this._webrtcConfig}get ready(){return this._ready}get channelId(){return this._channelId}get producerSession(){return this._producerSession}createProducerSession(e){if(!(this._ready&&e instanceof MediaStream))return null;if(this._producerSession)return this._producerSession.stream===e?this._producerSession:null;const t=new be(this,e);return this._producerSession=t,t.addEventListener("closed",(()=>{this._producerSession===t&&(this._producerSession=null)})),t}createConsumerSession(e,t){if(!this._ready||!e||"string"!=typeof e)return null;if(t&&"object"!=typeof t&&(t=void 0),e in this._consumerSessions)return this._consumerSessions[e];for(const t of Object.values(this._consumerSessions))if(t.peerId===e)return t;const n=new ye(e,this,t);return this._consumerSessions[e]=n,n.addEventListener("closed",(e=>{let t=e.target.sessionId;t||(t=e.target.peerId),t in this._consumerSessions&&this._consumerSessions[t]===n&&delete this._consumerSessions[t]})),n}getConsumerSession(e){return e in this._consumerSessions?this._consumerSessions[e]:null}closeAllConsumerSessions(){for(const e of Object.values(this._consumerSessions))e.close();this._consumerSessions={}}send(e){if(this._ready&&e&&"object"==typeof e)try{return this._ws.send(JSON.stringify(e)),!0}catch(e){this.dispatchEvent(new ErrorEvent("error",{message:"cannot send message to signaling server",error:e}))}return!1}close(){this._ws&&(this._ready=!1,this._channelId="",this._ws.close(),this.closeAllConsumerSessions(),this._producerSession&&(this._producerSession.close(),this._producerSession=null))}}class Ee{constructor(e){this._channel=null,this._producers={},this._connectionListeners=[],this._producersListeners=[];const t=Object.assign({},se);e&&"object"==typeof e&&Object.assign(t,e),"object"!=typeof t.meta&&(t.meta=null),this._config=t,this.connectChannel()}registerConnectionListener(e){return!(!e||"object"!=typeof e||"function"!=typeof e.connected||"function"!=typeof e.disconnected)&&(this._connectionListeners.includes(e)||this._connectionListeners.push(e),!0)}unregisterConnectionListener(e){const t=this._connectionListeners.indexOf(e);return t>=0&&(this._connectionListeners.splice(t,1),!0)}unregisterAllConnectionListeners(){this._connectionListeners=[]}createProducerSession(e){return this._channel?this._channel.createProducerSession(e):null}getAvailableProducers(){return Object.values(this._producers)}registerProducersListener(e){return!(!e||"object"!=typeof e||"function"!=typeof e.producerAdded||"function"!=typeof e.producerRemoved)&&(this._producersListeners.includes(e)||this._producersListeners.push(e),!0)}unregisterProducersListener(e){const t=this._producersListeners.indexOf(e);return t>=0&&(this._producersListeners.splice(t,1),!0)}unregisterAllProducersListeners(){this._producersListeners=[]}createConsumerSession(e){return this._channel?this._channel.createConsumerSession(e):null}createConsumerSessionWithOfferOptions(e,t){return this._channel?this._channel.createConsumerSession(e,t):null}connectChannel(){if(this._channel){const e=this._channel;this._channel=null,e.close();for(const e in this._producers)this.triggerProducerRemoved(e);this._producers={},this.triggerDisconnected()}this._channel=new Te(this._config.signalingServerUrl,this._config.meta,this._config.webrtcConfig),this._channel.addEventListener("error",(e=>{e.target===this._channel&&console.error(e.message,e.error)})),this._channel.addEventListener("closed",(e=>{if(e.target===this._channel){this._channel=null;for(const e in this._producers)this.triggerProducerRemoved(e);this._producers={},this.triggerDisconnected(),this._config.reconnectionTimeout>0&&window.setTimeout((()=>{this.connectChannel()}),this._config.reconnectionTimeout)}})),this._channel.addEventListener("ready",(e=>{e.target===this._channel&&this.triggerConnected(this._channel.channelId)})),this._channel.addEventListener("producerAdded",(e=>{e.target===this._channel&&this.triggerProducerAdded(e.detail)})),this._channel.addEventListener("producerRemoved",(e=>{e.target===this._channel&&this.triggerProducerRemoved(e.detail.id)}))}triggerConnected(e){for(const t of this._connectionListeners)try{t.connected(e)}catch(e){console.error("a listener callback should not throw any exception",e)}}triggerDisconnected(){for(const e of this._connectionListeners)try{e.disconnected()}catch(e){console.error("a listener callback should not throw any exception",e)}}triggerProducerAdded(e){if(!(e.id in this._producers)){this._producers[e.id]=e;for(const t of this._producersListeners)try{t.producerAdded(e)}catch(e){console.error("a listener callback should not throw any exception",e)}}}triggerProducerRemoved(e){if(e in this._producers){const t=this._producers[e];delete this._producers[e];for(const e of this._producersListeners)try{e.producerRemoved(t)}catch(e){console.error("a listener callback should not throw any exception",e)}}}}Ee.SessionState=ae,window.GstWebRTCAPI||(window.GstWebRTCAPI=Ee)})()})(); -//# sourceMappingURL=gstwebrtc-api-2.0.0.min.js.map \ No newline at end of file +(() => { + "use strict"; + var e = { + 2: (e) => { + const t = { + generateIdentifier: function () { + return Math.random().toString(36).substring(2, 12); + }, + }; + (t.localCName = t.generateIdentifier()), + (t.splitLines = function (e) { + return e + .trim() + .split("\n") + .map((e) => e.trim()); + }), + (t.splitSections = function (e) { + return e + .split("\nm=") + .map((e, t) => (t > 0 ? "m=" + e : e).trim() + "\r\n"); + }), + (t.getDescription = function (e) { + const n = t.splitSections(e); + return n && n[0]; + }), + (t.getMediaSections = function (e) { + const n = t.splitSections(e); + return n.shift(), n; + }), + (t.matchPrefix = function (e, n) { + return t.splitLines(e).filter((e) => 0 === e.indexOf(n)); + }), + (t.parseCandidate = function (e) { + let t; + t = + 0 === e.indexOf("a=candidate:") + ? e.substring(12).split(" ") + : e.substring(10).split(" "); + const n = { + foundation: t[0], + component: { 1: "rtp", 2: "rtcp" }[t[1]] || t[1], + protocol: t[2].toLowerCase(), + priority: parseInt(t[3], 10), + ip: t[4], + address: t[4], + port: parseInt(t[5], 10), + type: t[7], + }; + for (let e = 8; e < t.length; e += 2) + switch (t[e]) { + case "raddr": + n.relatedAddress = t[e + 1]; + break; + case "rport": + n.relatedPort = parseInt(t[e + 1], 10); + break; + case "tcptype": + n.tcpType = t[e + 1]; + break; + case "ufrag": + (n.ufrag = t[e + 1]), (n.usernameFragment = t[e + 1]); + break; + default: + void 0 === n[t[e]] && (n[t[e]] = t[e + 1]); + } + return n; + }), + (t.writeCandidate = function (e) { + const t = []; + t.push(e.foundation); + const n = e.component; + "rtp" === n ? t.push(1) : "rtcp" === n ? t.push(2) : t.push(n), + t.push(e.protocol.toUpperCase()), + t.push(e.priority), + t.push(e.address || e.ip), + t.push(e.port); + const r = e.type; + return ( + t.push("typ"), + t.push(r), + "host" !== r && + e.relatedAddress && + e.relatedPort && + (t.push("raddr"), + t.push(e.relatedAddress), + t.push("rport"), + t.push(e.relatedPort)), + e.tcpType && + "tcp" === e.protocol.toLowerCase() && + (t.push("tcptype"), t.push(e.tcpType)), + (e.usernameFragment || e.ufrag) && + (t.push("ufrag"), t.push(e.usernameFragment || e.ufrag)), + "candidate:" + t.join(" ") + ); + }), + (t.parseIceOptions = function (e) { + return e.substring(14).split(" "); + }), + (t.parseRtpMap = function (e) { + let t = e.substring(9).split(" "); + const n = { payloadType: parseInt(t.shift(), 10) }; + return ( + (t = t[0].split("/")), + (n.name = t[0]), + (n.clockRate = parseInt(t[1], 10)), + (n.channels = 3 === t.length ? parseInt(t[2], 10) : 1), + (n.numChannels = n.channels), + n + ); + }), + (t.writeRtpMap = function (e) { + let t = e.payloadType; + void 0 !== e.preferredPayloadType && (t = e.preferredPayloadType); + const n = e.channels || e.numChannels || 1; + return ( + "a=rtpmap:" + + t + + " " + + e.name + + "/" + + e.clockRate + + (1 !== n ? "/" + n : "") + + "\r\n" + ); + }), + (t.parseExtmap = function (e) { + const t = e.substring(9).split(" "); + return { + id: parseInt(t[0], 10), + direction: + t[0].indexOf("/") > 0 ? t[0].split("/")[1] : "sendrecv", + uri: t[1], + attributes: t.slice(2).join(" "), + }; + }), + (t.writeExtmap = function (e) { + return ( + "a=extmap:" + + (e.id || e.preferredId) + + (e.direction && "sendrecv" !== e.direction + ? "/" + e.direction + : "") + + " " + + e.uri + + (e.attributes ? " " + e.attributes : "") + + "\r\n" + ); + }), + (t.parseFmtp = function (e) { + const t = {}; + let n; + const r = e.substring(e.indexOf(" ") + 1).split(";"); + for (let e = 0; e < r.length; e++) + (n = r[e].trim().split("=")), (t[n[0].trim()] = n[1]); + return t; + }), + (t.writeFmtp = function (e) { + let t = "", + n = e.payloadType; + if ( + (void 0 !== e.preferredPayloadType && + (n = e.preferredPayloadType), + e.parameters && Object.keys(e.parameters).length) + ) { + const r = []; + Object.keys(e.parameters).forEach((t) => { + void 0 !== e.parameters[t] + ? r.push(t + "=" + e.parameters[t]) + : r.push(t); + }), + (t += "a=fmtp:" + n + " " + r.join(";") + "\r\n"); + } + return t; + }), + (t.parseRtcpFb = function (e) { + const t = e.substring(e.indexOf(" ") + 1).split(" "); + return { type: t.shift(), parameter: t.join(" ") }; + }), + (t.writeRtcpFb = function (e) { + let t = "", + n = e.payloadType; + return ( + void 0 !== e.preferredPayloadType && (n = e.preferredPayloadType), + e.rtcpFeedback && + e.rtcpFeedback.length && + e.rtcpFeedback.forEach((e) => { + t += + "a=rtcp-fb:" + + n + + " " + + e.type + + (e.parameter && e.parameter.length + ? " " + e.parameter + : "") + + "\r\n"; + }), + t + ); + }), + (t.parseSsrcMedia = function (e) { + const t = e.indexOf(" "), + n = { ssrc: parseInt(e.substring(7, t), 10) }, + r = e.indexOf(":", t); + return ( + r > -1 + ? ((n.attribute = e.substring(t + 1, r)), + (n.value = e.substring(r + 1))) + : (n.attribute = e.substring(t + 1)), + n + ); + }), + (t.parseSsrcGroup = function (e) { + const t = e.substring(13).split(" "); + return { + semantics: t.shift(), + ssrcs: t.map((e) => parseInt(e, 10)), + }; + }), + (t.getMid = function (e) { + const n = t.matchPrefix(e, "a=mid:")[0]; + if (n) return n.substring(6); + }), + (t.parseFingerprint = function (e) { + const t = e.substring(14).split(" "); + return { algorithm: t[0].toLowerCase(), value: t[1].toUpperCase() }; + }), + (t.getDtlsParameters = function (e, n) { + return { + role: "auto", + fingerprints: t + .matchPrefix(e + n, "a=fingerprint:") + .map(t.parseFingerprint), + }; + }), + (t.writeDtlsParameters = function (e, t) { + let n = "a=setup:" + t + "\r\n"; + return ( + e.fingerprints.forEach((e) => { + n += "a=fingerprint:" + e.algorithm + " " + e.value + "\r\n"; + }), + n + ); + }), + (t.parseCryptoLine = function (e) { + const t = e.substring(9).split(" "); + return { + tag: parseInt(t[0], 10), + cryptoSuite: t[1], + keyParams: t[2], + sessionParams: t.slice(3), + }; + }), + (t.writeCryptoLine = function (e) { + return ( + "a=crypto:" + + e.tag + + " " + + e.cryptoSuite + + " " + + ("object" == typeof e.keyParams + ? t.writeCryptoKeyParams(e.keyParams) + : e.keyParams) + + (e.sessionParams ? " " + e.sessionParams.join(" ") : "") + + "\r\n" + ); + }), + (t.parseCryptoKeyParams = function (e) { + if (0 !== e.indexOf("inline:")) return null; + const t = e.substring(7).split("|"); + return { + keyMethod: "inline", + keySalt: t[0], + lifeTime: t[1], + mkiValue: t[2] ? t[2].split(":")[0] : void 0, + mkiLength: t[2] ? t[2].split(":")[1] : void 0, + }; + }), + (t.writeCryptoKeyParams = function (e) { + return ( + e.keyMethod + + ":" + + e.keySalt + + (e.lifeTime ? "|" + e.lifeTime : "") + + (e.mkiValue && e.mkiLength + ? "|" + e.mkiValue + ":" + e.mkiLength + : "") + ); + }), + (t.getCryptoParameters = function (e, n) { + return t.matchPrefix(e + n, "a=crypto:").map(t.parseCryptoLine); + }), + (t.getIceParameters = function (e, n) { + const r = t.matchPrefix(e + n, "a=ice-ufrag:")[0], + i = t.matchPrefix(e + n, "a=ice-pwd:")[0]; + return r && i + ? { usernameFragment: r.substring(12), password: i.substring(10) } + : null; + }), + (t.writeIceParameters = function (e) { + let t = + "a=ice-ufrag:" + + e.usernameFragment + + "\r\na=ice-pwd:" + + e.password + + "\r\n"; + return e.iceLite && (t += "a=ice-lite\r\n"), t; + }), + (t.parseRtpParameters = function (e) { + const n = { + codecs: [], + headerExtensions: [], + fecMechanisms: [], + rtcp: [], + }, + r = t.splitLines(e)[0].split(" "); + n.profile = r[2]; + for (let i = 3; i < r.length; i++) { + const o = r[i], + s = t.matchPrefix(e, "a=rtpmap:" + o + " ")[0]; + if (s) { + const r = t.parseRtpMap(s), + i = t.matchPrefix(e, "a=fmtp:" + o + " "); + switch ( + ((r.parameters = i.length ? t.parseFmtp(i[0]) : {}), + (r.rtcpFeedback = t + .matchPrefix(e, "a=rtcp-fb:" + o + " ") + .map(t.parseRtcpFb)), + n.codecs.push(r), + r.name.toUpperCase()) + ) { + case "RED": + case "ULPFEC": + n.fecMechanisms.push(r.name.toUpperCase()); + } + } + } + t.matchPrefix(e, "a=extmap:").forEach((e) => { + n.headerExtensions.push(t.parseExtmap(e)); + }); + const i = t.matchPrefix(e, "a=rtcp-fb:* ").map(t.parseRtcpFb); + return ( + n.codecs.forEach((e) => { + i.forEach((t) => { + e.rtcpFeedback.find( + (e) => e.type === t.type && e.parameter === t.parameter, + ) || e.rtcpFeedback.push(t); + }); + }), + n + ); + }), + (t.writeRtpDescription = function (e, n) { + let r = ""; + (r += "m=" + e + " "), + (r += n.codecs.length > 0 ? "9" : "0"), + (r += " " + (n.profile || "UDP/TLS/RTP/SAVPF") + " "), + (r += + n.codecs + .map((e) => + void 0 !== e.preferredPayloadType + ? e.preferredPayloadType + : e.payloadType, + ) + .join(" ") + "\r\n"), + (r += "c=IN IP4 0.0.0.0\r\n"), + (r += "a=rtcp:9 IN IP4 0.0.0.0\r\n"), + n.codecs.forEach((e) => { + (r += t.writeRtpMap(e)), + (r += t.writeFmtp(e)), + (r += t.writeRtcpFb(e)); + }); + let i = 0; + return ( + n.codecs.forEach((e) => { + e.maxptime > i && (i = e.maxptime); + }), + i > 0 && (r += "a=maxptime:" + i + "\r\n"), + n.headerExtensions && + n.headerExtensions.forEach((e) => { + r += t.writeExtmap(e); + }), + r + ); + }), + (t.parseRtpEncodingParameters = function (e) { + const n = [], + r = t.parseRtpParameters(e), + i = -1 !== r.fecMechanisms.indexOf("RED"), + o = -1 !== r.fecMechanisms.indexOf("ULPFEC"), + s = t + .matchPrefix(e, "a=ssrc:") + .map((e) => t.parseSsrcMedia(e)) + .filter((e) => "cname" === e.attribute), + a = s.length > 0 && s[0].ssrc; + let c; + const d = t.matchPrefix(e, "a=ssrc-group:FID").map((e) => + e + .substring(17) + .split(" ") + .map((e) => parseInt(e, 10)), + ); + d.length > 0 && d[0].length > 1 && d[0][0] === a && (c = d[0][1]), + r.codecs.forEach((e) => { + if ("RTX" === e.name.toUpperCase() && e.parameters.apt) { + let t = { + ssrc: a, + codecPayloadType: parseInt(e.parameters.apt, 10), + }; + a && c && (t.rtx = { ssrc: c }), + n.push(t), + i && + ((t = JSON.parse(JSON.stringify(t))), + (t.fec = { + ssrc: a, + mechanism: o ? "red+ulpfec" : "red", + }), + n.push(t)); + } + }), + 0 === n.length && a && n.push({ ssrc: a }); + let l = t.matchPrefix(e, "b="); + return ( + l.length && + ((l = + 0 === l[0].indexOf("b=TIAS:") + ? parseInt(l[0].substring(7), 10) + : 0 === l[0].indexOf("b=AS:") + ? 1e3 * parseInt(l[0].substring(5), 10) * 0.95 - 16e3 + : void 0), + n.forEach((e) => { + e.maxBitrate = l; + })), + n + ); + }), + (t.parseRtcpParameters = function (e) { + const n = {}, + r = t + .matchPrefix(e, "a=ssrc:") + .map((e) => t.parseSsrcMedia(e)) + .filter((e) => "cname" === e.attribute)[0]; + r && ((n.cname = r.value), (n.ssrc = r.ssrc)); + const i = t.matchPrefix(e, "a=rtcp-rsize"); + (n.reducedSize = i.length > 0), (n.compound = 0 === i.length); + const o = t.matchPrefix(e, "a=rtcp-mux"); + return (n.mux = o.length > 0), n; + }), + (t.writeRtcpParameters = function (e) { + let t = ""; + return ( + e.reducedSize && (t += "a=rtcp-rsize\r\n"), + e.mux && (t += "a=rtcp-mux\r\n"), + void 0 !== e.ssrc && + e.cname && + (t += "a=ssrc:" + e.ssrc + " cname:" + e.cname + "\r\n"), + t + ); + }), + (t.parseMsid = function (e) { + let n; + const r = t.matchPrefix(e, "a=msid:"); + if (1 === r.length) + return ( + (n = r[0].substring(7).split(" ")), + { stream: n[0], track: n[1] } + ); + const i = t + .matchPrefix(e, "a=ssrc:") + .map((e) => t.parseSsrcMedia(e)) + .filter((e) => "msid" === e.attribute); + return i.length > 0 + ? ((n = i[0].value.split(" ")), { stream: n[0], track: n[1] }) + : void 0; + }), + (t.parseSctpDescription = function (e) { + const n = t.parseMLine(e), + r = t.matchPrefix(e, "a=max-message-size:"); + let i; + r.length > 0 && (i = parseInt(r[0].substring(19), 10)), + isNaN(i) && (i = 65536); + const o = t.matchPrefix(e, "a=sctp-port:"); + if (o.length > 0) + return { + port: parseInt(o[0].substring(12), 10), + protocol: n.fmt, + maxMessageSize: i, + }; + const s = t.matchPrefix(e, "a=sctpmap:"); + if (s.length > 0) { + const e = s[0].substring(10).split(" "); + return { + port: parseInt(e[0], 10), + protocol: e[1], + maxMessageSize: i, + }; + } + }), + (t.writeSctpDescription = function (e, t) { + let n = []; + return ( + (n = + "DTLS/SCTP" !== e.protocol + ? [ + "m=" + + e.kind + + " 9 " + + e.protocol + + " " + + t.protocol + + "\r\n", + "c=IN IP4 0.0.0.0\r\n", + "a=sctp-port:" + t.port + "\r\n", + ] + : [ + "m=" + + e.kind + + " 9 " + + e.protocol + + " " + + t.port + + "\r\n", + "c=IN IP4 0.0.0.0\r\n", + "a=sctpmap:" + t.port + " " + t.protocol + " 65535\r\n", + ]), + void 0 !== t.maxMessageSize && + n.push("a=max-message-size:" + t.maxMessageSize + "\r\n"), + n.join("") + ); + }), + (t.generateSessionId = function () { + return Math.random().toString().substr(2, 22); + }), + (t.writeSessionBoilerplate = function (e, n, r) { + let i; + const o = void 0 !== n ? n : 2; + i = e || t.generateSessionId(); + return ( + "v=0\r\no=" + + (r || "thisisadapterortc") + + " " + + i + + " " + + o + + " IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n" + ); + }), + (t.getDirection = function (e, n) { + const r = t.splitLines(e); + for (let e = 0; e < r.length; e++) + switch (r[e]) { + case "a=sendrecv": + case "a=sendonly": + case "a=recvonly": + case "a=inactive": + return r[e].substring(2); + } + return n ? t.getDirection(n) : "sendrecv"; + }), + (t.getKind = function (e) { + return t.splitLines(e)[0].split(" ")[0].substring(2); + }), + (t.isRejected = function (e) { + return "0" === e.split(" ", 2)[1]; + }), + (t.parseMLine = function (e) { + const n = t.splitLines(e)[0].substring(2).split(" "); + return { + kind: n[0], + port: parseInt(n[1], 10), + protocol: n[2], + fmt: n.slice(3).join(" "), + }; + }), + (t.parseOLine = function (e) { + const n = t.matchPrefix(e, "o=")[0].substring(2).split(" "); + return { + username: n[0], + sessionId: n[1], + sessionVersion: parseInt(n[2], 10), + netType: n[3], + addressType: n[4], + address: n[5], + }; + }), + (t.isValidSDP = function (e) { + if ("string" != typeof e || 0 === e.length) return !1; + const n = t.splitLines(e); + for (let e = 0; e < n.length; e++) + if (n[e].length < 2 || "=" !== n[e].charAt(1)) return !1; + return !0; + }), + (e.exports = t); + }, + }, + t = {}; + function n(r) { + var i = t[r]; + if (void 0 !== i) return i.exports; + var o = (t[r] = { exports: {} }); + return e[r](o, o.exports, n), o.exports; + } + (n.n = (e) => { + var t = e && e.__esModule ? () => e.default : () => e; + return n.d(t, { a: t }), t; + }), + (n.d = (e, t) => { + for (var r in t) + n.o(t, r) && + !n.o(e, r) && + Object.defineProperty(e, r, { enumerable: !0, get: t[r] }); + }), + (n.o = (e, t) => Object.prototype.hasOwnProperty.call(e, t)), + (n.r = (e) => { + "undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), + Object.defineProperty(e, "__esModule", { value: !0 }); + }), + (() => { + var e = {}; + n.r(e), + n.d(e, { + fixNegotiationNeeded: () => w, + shimAddTrackRemoveTrack: () => P, + shimAddTrackRemoveTrackWithNative: () => E, + shimGetDisplayMedia: () => y, + shimGetSendersWithDtmf: () => S, + shimGetStats: () => k, + shimGetUserMedia: () => C, + shimMediaStream: () => v, + shimOnTrack: () => b, + shimPeerConnection: () => R, + shimSenderReceiverGetStats: () => T, + }); + var t = {}; + n.r(t), + n.d(t, { + shimAddTransceiver: () => G, + shimCreateAnswer: () => U, + shimCreateOffer: () => N, + shimGetDisplayMedia: () => x, + shimGetParameters: () => j, + shimGetUserMedia: () => A, + shimOnTrack: () => I, + shimPeerConnection: () => O, + shimRTCDataChannel: () => H, + shimReceiverGetStats: () => M, + shimRemoveStream: () => L, + shimSenderGetStats: () => D, + }); + var r = {}; + n.r(r), + n.d(r, { + shimAudioContext: () => B, + shimCallbacksAPI: () => J, + shimConstraints: () => q, + shimCreateOfferLegacy: () => V, + shimGetUserMedia: () => K, + shimLocalStreamsAPI: () => F, + shimRTCIceServerUrls: () => W, + shimRemoteStreamsAPI: () => z, + shimTrackEventTransceiver: () => Y, + }); + var i = {}; + n.r(i), + n.d(i, { + removeExtmapAllowMixed: () => re, + shimAddIceCandidateNullOrEmpty: () => ie, + shimConnectionState: () => ne, + shimMaxMessageSize: () => ee, + shimParameterlessSetLocalDescription: () => oe, + shimRTCIceCandidate: () => $, + shimRTCIceCandidateRelayProtocol: () => Q, + shimSendThrowTypeError: () => te, + }); + let o = !0, + s = !0; + function a(e, t, n) { + const r = e.match(t); + return r && r.length >= n && parseInt(r[n], 10); + } + function c(e, t, n) { + if (!e.RTCPeerConnection) return; + const r = e.RTCPeerConnection.prototype, + i = r.addEventListener; + r.addEventListener = function (e, r) { + if (e !== t) return i.apply(this, arguments); + const o = (e) => { + const t = n(e); + t && (r.handleEvent ? r.handleEvent(t) : r(t)); + }; + return ( + (this._eventMap = this._eventMap || {}), + this._eventMap[t] || (this._eventMap[t] = new Map()), + this._eventMap[t].set(r, o), + i.apply(this, [e, o]) + ); + }; + const o = r.removeEventListener; + (r.removeEventListener = function (e, n) { + if (e !== t || !this._eventMap || !this._eventMap[t]) + return o.apply(this, arguments); + if (!this._eventMap[t].has(n)) return o.apply(this, arguments); + const r = this._eventMap[t].get(n); + return ( + this._eventMap[t].delete(n), + 0 === this._eventMap[t].size && delete this._eventMap[t], + 0 === Object.keys(this._eventMap).length && delete this._eventMap, + o.apply(this, [e, r]) + ); + }), + Object.defineProperty(r, "on" + t, { + get() { + return this["_on" + t]; + }, + set(e) { + this["_on" + t] && + (this.removeEventListener(t, this["_on" + t]), + delete this["_on" + t]), + e && this.addEventListener(t, (this["_on" + t] = e)); + }, + enumerable: !0, + configurable: !0, + }); + } + function d(e) { + return "boolean" != typeof e + ? new Error("Argument type: " + typeof e + ". Please use a boolean.") + : ((o = e), + e ? "adapter.js logging disabled" : "adapter.js logging enabled"); + } + function l(e) { + return "boolean" != typeof e + ? new Error("Argument type: " + typeof e + ". Please use a boolean.") + : ((s = !e), + "adapter.js deprecation warnings " + (e ? "disabled" : "enabled")); + } + function h() { + if ("object" == typeof window) { + if (o) return; + "undefined" != typeof console && + "function" == typeof console.log && + console.log.apply(console, arguments); + } + } + function p(e, t) { + s && console.warn(e + " is deprecated, please use " + t + " instead."); + } + function u(e) { + return "[object Object]" === Object.prototype.toString.call(e); + } + function m(e) { + return u(e) + ? Object.keys(e).reduce(function (t, n) { + const r = u(e[n]), + i = r ? m(e[n]) : e[n], + o = r && !Object.keys(i).length; + return void 0 === i || o ? t : Object.assign(t, { [n]: i }); + }, {}) + : e; + } + function _(e, t, n) { + t && + !n.has(t.id) && + (n.set(t.id, t), + Object.keys(t).forEach((r) => { + r.endsWith("Id") + ? _(e, e.get(t[r]), n) + : r.endsWith("Ids") && + t[r].forEach((t) => { + _(e, e.get(t), n); + }); + })); + } + function f(e, t, n) { + const r = n ? "outbound-rtp" : "inbound-rtp", + i = new Map(); + if (null === t) return i; + const o = []; + return ( + e.forEach((e) => { + "track" === e.type && e.trackIdentifier === t.id && o.push(e); + }), + o.forEach((t) => { + e.forEach((n) => { + n.type === r && n.trackId === t.id && _(e, n, i); + }); + }), + i + ); + } + const g = h; + function C(e, t) { + const n = e && e.navigator; + if (!n.mediaDevices) return; + const r = function (e) { + if ("object" != typeof e || e.mandatory || e.optional) return e; + const t = {}; + return ( + Object.keys(e).forEach((n) => { + if ("require" === n || "advanced" === n || "mediaSource" === n) + return; + const r = "object" == typeof e[n] ? e[n] : { ideal: e[n] }; + void 0 !== r.exact && + "number" == typeof r.exact && + (r.min = r.max = r.exact); + const i = function (e, t) { + return e + ? e + t.charAt(0).toUpperCase() + t.slice(1) + : "deviceId" === t + ? "sourceId" + : t; + }; + if (void 0 !== r.ideal) { + t.optional = t.optional || []; + let e = {}; + "number" == typeof r.ideal + ? ((e[i("min", n)] = r.ideal), + t.optional.push(e), + (e = {}), + (e[i("max", n)] = r.ideal), + t.optional.push(e)) + : ((e[i("", n)] = r.ideal), t.optional.push(e)); + } + void 0 !== r.exact && "number" != typeof r.exact + ? ((t.mandatory = t.mandatory || {}), + (t.mandatory[i("", n)] = r.exact)) + : ["min", "max"].forEach((e) => { + void 0 !== r[e] && + ((t.mandatory = t.mandatory || {}), + (t.mandatory[i(e, n)] = r[e])); + }); + }), + e.advanced && + (t.optional = (t.optional || []).concat(e.advanced)), + t + ); + }, + i = function (e, i) { + if (t.version >= 61) return i(e); + if ( + (e = JSON.parse(JSON.stringify(e))) && + "object" == typeof e.audio + ) { + const t = function (e, t, n) { + t in e && !(n in e) && ((e[n] = e[t]), delete e[t]); + }; + t( + (e = JSON.parse(JSON.stringify(e))).audio, + "autoGainControl", + "googAutoGainControl", + ), + t(e.audio, "noiseSuppression", "googNoiseSuppression"), + (e.audio = r(e.audio)); + } + if (e && "object" == typeof e.video) { + let o = e.video.facingMode; + o = o && ("object" == typeof o ? o : { ideal: o }); + const s = t.version < 66; + if ( + o && + ("user" === o.exact || + "environment" === o.exact || + "user" === o.ideal || + "environment" === o.ideal) && + (!n.mediaDevices.getSupportedConstraints || + !n.mediaDevices.getSupportedConstraints().facingMode || + s) + ) { + let t; + if ( + (delete e.video.facingMode, + "environment" === o.exact || "environment" === o.ideal + ? (t = ["back", "rear"]) + : ("user" !== o.exact && "user" !== o.ideal) || + (t = ["front"]), + t) + ) + return n.mediaDevices.enumerateDevices().then((n) => { + let s = (n = n.filter((e) => "videoinput" === e.kind)).find( + (e) => t.some((t) => e.label.toLowerCase().includes(t)), + ); + return ( + !s && + n.length && + t.includes("back") && + (s = n[n.length - 1]), + s && + (e.video.deviceId = o.exact + ? { exact: s.deviceId } + : { ideal: s.deviceId }), + (e.video = r(e.video)), + g("chrome: " + JSON.stringify(e)), + i(e) + ); + }); + } + e.video = r(e.video); + } + return g("chrome: " + JSON.stringify(e)), i(e); + }, + o = function (e) { + return t.version >= 64 + ? e + : { + name: + { + PermissionDeniedError: "NotAllowedError", + PermissionDismissedError: "NotAllowedError", + InvalidStateError: "NotAllowedError", + DevicesNotFoundError: "NotFoundError", + ConstraintNotSatisfiedError: "OverconstrainedError", + TrackStartError: "NotReadableError", + MediaDeviceFailedDueToShutdown: "NotAllowedError", + MediaDeviceKillSwitchOn: "NotAllowedError", + TabCaptureError: "AbortError", + ScreenCaptureError: "AbortError", + DeviceCaptureError: "AbortError", + }[e.name] || e.name, + message: e.message, + constraint: e.constraint || e.constraintName, + toString() { + return this.name + (this.message && ": ") + this.message; + }, + }; + }; + if ( + ((n.getUserMedia = function (e, t, r) { + i(e, (e) => { + n.webkitGetUserMedia(e, t, (e) => { + r && r(o(e)); + }); + }); + }.bind(n)), + n.mediaDevices.getUserMedia) + ) { + const e = n.mediaDevices.getUserMedia.bind(n.mediaDevices); + n.mediaDevices.getUserMedia = function (t) { + return i(t, (t) => + e(t).then( + (e) => { + if ( + (t.audio && !e.getAudioTracks().length) || + (t.video && !e.getVideoTracks().length) + ) + throw ( + (e.getTracks().forEach((e) => { + e.stop(); + }), + new DOMException("", "NotFoundError")) + ); + return e; + }, + (e) => Promise.reject(o(e)), + ), + ); + }; + } + } + function y(e, t) { + (e.navigator.mediaDevices && + "getDisplayMedia" in e.navigator.mediaDevices) || + (e.navigator.mediaDevices && + ("function" == typeof t + ? (e.navigator.mediaDevices.getDisplayMedia = function (n) { + return t(n).then((t) => { + const r = n.video && n.video.width, + i = n.video && n.video.height, + o = n.video && n.video.frameRate; + return ( + (n.video = { + mandatory: { + chromeMediaSource: "desktop", + chromeMediaSourceId: t, + maxFrameRate: o || 3, + }, + }), + r && (n.video.mandatory.maxWidth = r), + i && (n.video.mandatory.maxHeight = i), + e.navigator.mediaDevices.getUserMedia(n) + ); + }); + }) + : console.error( + "shimGetDisplayMedia: getSourceId argument is not a function", + ))); + } + function v(e) { + e.MediaStream = e.MediaStream || e.webkitMediaStream; + } + function b(e) { + if ( + "object" == typeof e && + e.RTCPeerConnection && + !("ontrack" in e.RTCPeerConnection.prototype) + ) { + Object.defineProperty(e.RTCPeerConnection.prototype, "ontrack", { + get() { + return this._ontrack; + }, + set(e) { + this._ontrack && this.removeEventListener("track", this._ontrack), + this.addEventListener("track", (this._ontrack = e)); + }, + enumerable: !0, + configurable: !0, + }); + const t = e.RTCPeerConnection.prototype.setRemoteDescription; + e.RTCPeerConnection.prototype.setRemoteDescription = function () { + return ( + this._ontrackpoly || + ((this._ontrackpoly = (t) => { + t.stream.addEventListener("addtrack", (n) => { + let r; + r = e.RTCPeerConnection.prototype.getReceivers + ? this.getReceivers().find( + (e) => e.track && e.track.id === n.track.id, + ) + : { track: n.track }; + const i = new Event("track"); + (i.track = n.track), + (i.receiver = r), + (i.transceiver = { receiver: r }), + (i.streams = [t.stream]), + this.dispatchEvent(i); + }), + t.stream.getTracks().forEach((n) => { + let r; + r = e.RTCPeerConnection.prototype.getReceivers + ? this.getReceivers().find( + (e) => e.track && e.track.id === n.id, + ) + : { track: n }; + const i = new Event("track"); + (i.track = n), + (i.receiver = r), + (i.transceiver = { receiver: r }), + (i.streams = [t.stream]), + this.dispatchEvent(i); + }); + }), + this.addEventListener("addstream", this._ontrackpoly)), + t.apply(this, arguments) + ); + }; + } else + c( + e, + "track", + (e) => ( + e.transceiver || + Object.defineProperty(e, "transceiver", { + value: { receiver: e.receiver }, + }), + e + ), + ); + } + function S(e) { + if ( + "object" == typeof e && + e.RTCPeerConnection && + !("getSenders" in e.RTCPeerConnection.prototype) && + "createDTMFSender" in e.RTCPeerConnection.prototype + ) { + const t = function (e, t) { + return { + track: t, + get dtmf() { + return ( + void 0 === this._dtmf && + ("audio" === t.kind + ? (this._dtmf = e.createDTMFSender(t)) + : (this._dtmf = null)), + this._dtmf + ); + }, + _pc: e, + }; + }; + if (!e.RTCPeerConnection.prototype.getSenders) { + e.RTCPeerConnection.prototype.getSenders = function () { + return ( + (this._senders = this._senders || []), this._senders.slice() + ); + }; + const n = e.RTCPeerConnection.prototype.addTrack; + e.RTCPeerConnection.prototype.addTrack = function (e, r) { + let i = n.apply(this, arguments); + return i || ((i = t(this, e)), this._senders.push(i)), i; + }; + const r = e.RTCPeerConnection.prototype.removeTrack; + e.RTCPeerConnection.prototype.removeTrack = function (e) { + r.apply(this, arguments); + const t = this._senders.indexOf(e); + -1 !== t && this._senders.splice(t, 1); + }; + } + const n = e.RTCPeerConnection.prototype.addStream; + e.RTCPeerConnection.prototype.addStream = function (e) { + (this._senders = this._senders || []), + n.apply(this, [e]), + e.getTracks().forEach((e) => { + this._senders.push(t(this, e)); + }); + }; + const r = e.RTCPeerConnection.prototype.removeStream; + e.RTCPeerConnection.prototype.removeStream = function (e) { + (this._senders = this._senders || []), + r.apply(this, [e]), + e.getTracks().forEach((e) => { + const t = this._senders.find((t) => t.track === e); + t && this._senders.splice(this._senders.indexOf(t), 1); + }); + }; + } else if ( + "object" == typeof e && + e.RTCPeerConnection && + "getSenders" in e.RTCPeerConnection.prototype && + "createDTMFSender" in e.RTCPeerConnection.prototype && + e.RTCRtpSender && + !("dtmf" in e.RTCRtpSender.prototype) + ) { + const t = e.RTCPeerConnection.prototype.getSenders; + (e.RTCPeerConnection.prototype.getSenders = function () { + const e = t.apply(this, []); + return e.forEach((e) => (e._pc = this)), e; + }), + Object.defineProperty(e.RTCRtpSender.prototype, "dtmf", { + get() { + return ( + void 0 === this._dtmf && + ("audio" === this.track.kind + ? (this._dtmf = this._pc.createDTMFSender(this.track)) + : (this._dtmf = null)), + this._dtmf + ); + }, + }); + } + } + function k(e) { + if (!e.RTCPeerConnection) return; + const t = e.RTCPeerConnection.prototype.getStats; + e.RTCPeerConnection.prototype.getStats = function () { + const [e, n, r] = arguments; + if (arguments.length > 0 && "function" == typeof e) + return t.apply(this, arguments); + if ( + 0 === t.length && + (0 === arguments.length || "function" != typeof e) + ) + return t.apply(this, []); + const i = function (e) { + const t = {}; + return ( + e.result().forEach((e) => { + const n = { + id: e.id, + timestamp: e.timestamp, + type: + { + localcandidate: "local-candidate", + remotecandidate: "remote-candidate", + }[e.type] || e.type, + }; + e.names().forEach((t) => { + n[t] = e.stat(t); + }), + (t[n.id] = n); + }), + t + ); + }, + o = function (e) { + return new Map(Object.keys(e).map((t) => [t, e[t]])); + }; + if (arguments.length >= 2) { + const r = function (e) { + n(o(i(e))); + }; + return t.apply(this, [r, e]); + } + return new Promise((e, n) => { + t.apply(this, [ + function (t) { + e(o(i(t))); + }, + n, + ]); + }).then(n, r); + }; + } + function T(e) { + if ( + !( + "object" == typeof e && + e.RTCPeerConnection && + e.RTCRtpSender && + e.RTCRtpReceiver + ) + ) + return; + if (!("getStats" in e.RTCRtpSender.prototype)) { + const t = e.RTCPeerConnection.prototype.getSenders; + t && + (e.RTCPeerConnection.prototype.getSenders = function () { + const e = t.apply(this, []); + return e.forEach((e) => (e._pc = this)), e; + }); + const n = e.RTCPeerConnection.prototype.addTrack; + n && + (e.RTCPeerConnection.prototype.addTrack = function () { + const e = n.apply(this, arguments); + return (e._pc = this), e; + }), + (e.RTCRtpSender.prototype.getStats = function () { + const e = this; + return this._pc.getStats().then((t) => f(t, e.track, !0)); + }); + } + if (!("getStats" in e.RTCRtpReceiver.prototype)) { + const t = e.RTCPeerConnection.prototype.getReceivers; + t && + (e.RTCPeerConnection.prototype.getReceivers = function () { + const e = t.apply(this, []); + return e.forEach((e) => (e._pc = this)), e; + }), + c(e, "track", (e) => ((e.receiver._pc = e.srcElement), e)), + (e.RTCRtpReceiver.prototype.getStats = function () { + const e = this; + return this._pc.getStats().then((t) => f(t, e.track, !1)); + }); + } + if ( + !("getStats" in e.RTCRtpSender.prototype) || + !("getStats" in e.RTCRtpReceiver.prototype) + ) + return; + const t = e.RTCPeerConnection.prototype.getStats; + e.RTCPeerConnection.prototype.getStats = function () { + if ( + arguments.length > 0 && + arguments[0] instanceof e.MediaStreamTrack + ) { + const e = arguments[0]; + let t, n, r; + return ( + this.getSenders().forEach((n) => { + n.track === e && (t ? (r = !0) : (t = n)); + }), + this.getReceivers().forEach( + (t) => ( + t.track === e && (n ? (r = !0) : (n = t)), t.track === e + ), + ), + r || (t && n) + ? Promise.reject( + new DOMException( + "There are more than one sender or receiver for the track.", + "InvalidAccessError", + ), + ) + : t + ? t.getStats() + : n + ? n.getStats() + : Promise.reject( + new DOMException( + "There is no sender or receiver for the track.", + "InvalidAccessError", + ), + ) + ); + } + return t.apply(this, arguments); + }; + } + function E(e) { + e.RTCPeerConnection.prototype.getLocalStreams = function () { + return ( + (this._shimmedLocalStreams = this._shimmedLocalStreams || {}), + Object.keys(this._shimmedLocalStreams).map( + (e) => this._shimmedLocalStreams[e][0], + ) + ); + }; + const t = e.RTCPeerConnection.prototype.addTrack; + e.RTCPeerConnection.prototype.addTrack = function (e, n) { + if (!n) return t.apply(this, arguments); + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + const r = t.apply(this, arguments); + return ( + this._shimmedLocalStreams[n.id] + ? -1 === this._shimmedLocalStreams[n.id].indexOf(r) && + this._shimmedLocalStreams[n.id].push(r) + : (this._shimmedLocalStreams[n.id] = [n, r]), + r + ); + }; + const n = e.RTCPeerConnection.prototype.addStream; + e.RTCPeerConnection.prototype.addStream = function (e) { + (this._shimmedLocalStreams = this._shimmedLocalStreams || {}), + e.getTracks().forEach((e) => { + if (this.getSenders().find((t) => t.track === e)) + throw new DOMException( + "Track already exists.", + "InvalidAccessError", + ); + }); + const t = this.getSenders(); + n.apply(this, arguments); + const r = this.getSenders().filter((e) => -1 === t.indexOf(e)); + this._shimmedLocalStreams[e.id] = [e].concat(r); + }; + const r = e.RTCPeerConnection.prototype.removeStream; + e.RTCPeerConnection.prototype.removeStream = function (e) { + return ( + (this._shimmedLocalStreams = this._shimmedLocalStreams || {}), + delete this._shimmedLocalStreams[e.id], + r.apply(this, arguments) + ); + }; + const i = e.RTCPeerConnection.prototype.removeTrack; + e.RTCPeerConnection.prototype.removeTrack = function (e) { + return ( + (this._shimmedLocalStreams = this._shimmedLocalStreams || {}), + e && + Object.keys(this._shimmedLocalStreams).forEach((t) => { + const n = this._shimmedLocalStreams[t].indexOf(e); + -1 !== n && this._shimmedLocalStreams[t].splice(n, 1), + 1 === this._shimmedLocalStreams[t].length && + delete this._shimmedLocalStreams[t]; + }), + i.apply(this, arguments) + ); + }; + } + function P(e, t) { + if (!e.RTCPeerConnection) return; + if (e.RTCPeerConnection.prototype.addTrack && t.version >= 65) + return E(e); + const n = e.RTCPeerConnection.prototype.getLocalStreams; + e.RTCPeerConnection.prototype.getLocalStreams = function () { + const e = n.apply(this); + return ( + (this._reverseStreams = this._reverseStreams || {}), + e.map((e) => this._reverseStreams[e.id]) + ); + }; + const r = e.RTCPeerConnection.prototype.addStream; + e.RTCPeerConnection.prototype.addStream = function (t) { + if ( + ((this._streams = this._streams || {}), + (this._reverseStreams = this._reverseStreams || {}), + t.getTracks().forEach((e) => { + if (this.getSenders().find((t) => t.track === e)) + throw new DOMException( + "Track already exists.", + "InvalidAccessError", + ); + }), + !this._reverseStreams[t.id]) + ) { + const n = new e.MediaStream(t.getTracks()); + (this._streams[t.id] = n), + (this._reverseStreams[n.id] = t), + (t = n); + } + r.apply(this, [t]); + }; + const i = e.RTCPeerConnection.prototype.removeStream; + function o(e, t) { + let n = t.sdp; + return ( + Object.keys(e._reverseStreams || []).forEach((t) => { + const r = e._reverseStreams[t], + i = e._streams[r.id]; + n = n.replace(new RegExp(i.id, "g"), r.id); + }), + new RTCSessionDescription({ type: t.type, sdp: n }) + ); + } + (e.RTCPeerConnection.prototype.removeStream = function (e) { + (this._streams = this._streams || {}), + (this._reverseStreams = this._reverseStreams || {}), + i.apply(this, [this._streams[e.id] || e]), + delete this._reverseStreams[ + this._streams[e.id] ? this._streams[e.id].id : e.id + ], + delete this._streams[e.id]; + }), + (e.RTCPeerConnection.prototype.addTrack = function (t, n) { + if ("closed" === this.signalingState) + throw new DOMException( + "The RTCPeerConnection's signalingState is 'closed'.", + "InvalidStateError", + ); + const r = [].slice.call(arguments, 1); + if (1 !== r.length || !r[0].getTracks().find((e) => e === t)) + throw new DOMException( + "The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.", + "NotSupportedError", + ); + if (this.getSenders().find((e) => e.track === t)) + throw new DOMException( + "Track already exists.", + "InvalidAccessError", + ); + (this._streams = this._streams || {}), + (this._reverseStreams = this._reverseStreams || {}); + const i = this._streams[n.id]; + if (i) + i.addTrack(t), + Promise.resolve().then(() => { + this.dispatchEvent(new Event("negotiationneeded")); + }); + else { + const r = new e.MediaStream([t]); + (this._streams[n.id] = r), + (this._reverseStreams[r.id] = n), + this.addStream(r); + } + return this.getSenders().find((e) => e.track === t); + }), + ["createOffer", "createAnswer"].forEach(function (t) { + const n = e.RTCPeerConnection.prototype[t], + r = { + [t]() { + const e = arguments; + return arguments.length && "function" == typeof arguments[0] + ? n.apply(this, [ + (t) => { + const n = o(this, t); + e[0].apply(null, [n]); + }, + (t) => { + e[1] && e[1].apply(null, t); + }, + arguments[2], + ]) + : n.apply(this, arguments).then((e) => o(this, e)); + }, + }; + e.RTCPeerConnection.prototype[t] = r[t]; + }); + const s = e.RTCPeerConnection.prototype.setLocalDescription; + e.RTCPeerConnection.prototype.setLocalDescription = function () { + return arguments.length && arguments[0].type + ? ((arguments[0] = (function (e, t) { + let n = t.sdp; + return ( + Object.keys(e._reverseStreams || []).forEach((t) => { + const r = e._reverseStreams[t], + i = e._streams[r.id]; + n = n.replace(new RegExp(r.id, "g"), i.id); + }), + new RTCSessionDescription({ type: t.type, sdp: n }) + ); + })(this, arguments[0])), + s.apply(this, arguments)) + : s.apply(this, arguments); + }; + const a = Object.getOwnPropertyDescriptor( + e.RTCPeerConnection.prototype, + "localDescription", + ); + Object.defineProperty( + e.RTCPeerConnection.prototype, + "localDescription", + { + get() { + const e = a.get.apply(this); + return "" === e.type ? e : o(this, e); + }, + }, + ), + (e.RTCPeerConnection.prototype.removeTrack = function (e) { + if ("closed" === this.signalingState) + throw new DOMException( + "The RTCPeerConnection's signalingState is 'closed'.", + "InvalidStateError", + ); + if (!e._pc) + throw new DOMException( + "Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.", + "TypeError", + ); + if (!(e._pc === this)) + throw new DOMException( + "Sender was not created by this connection.", + "InvalidAccessError", + ); + let t; + (this._streams = this._streams || {}), + Object.keys(this._streams).forEach((n) => { + this._streams[n].getTracks().find((t) => e.track === t) && + (t = this._streams[n]); + }), + t && + (1 === t.getTracks().length + ? this.removeStream(this._reverseStreams[t.id]) + : t.removeTrack(e.track), + this.dispatchEvent(new Event("negotiationneeded"))); + }); + } + function R(e, t) { + !e.RTCPeerConnection && + e.webkitRTCPeerConnection && + (e.RTCPeerConnection = e.webkitRTCPeerConnection), + e.RTCPeerConnection && + t.version < 53 && + [ + "setLocalDescription", + "setRemoteDescription", + "addIceCandidate", + ].forEach(function (t) { + const n = e.RTCPeerConnection.prototype[t], + r = { + [t]() { + return ( + (arguments[0] = new ( + "addIceCandidate" === t + ? e.RTCIceCandidate + : e.RTCSessionDescription + )(arguments[0])), + n.apply(this, arguments) + ); + }, + }; + e.RTCPeerConnection.prototype[t] = r[t]; + }); + } + function w(e, t) { + c(e, "negotiationneeded", (e) => { + const n = e.target; + if ( + !( + t.version < 72 || + (n.getConfiguration && + "plan-b" === n.getConfiguration().sdpSemantics) + ) || + "stable" === n.signalingState + ) + return e; + }); + } + function A(e, t) { + const n = e && e.navigator, + r = e && e.MediaStreamTrack; + if ( + ((n.getUserMedia = function (e, t, r) { + p("navigator.getUserMedia", "navigator.mediaDevices.getUserMedia"), + n.mediaDevices.getUserMedia(e).then(t, r); + }), + !( + t.version > 55 && + "autoGainControl" in n.mediaDevices.getSupportedConstraints() + )) + ) { + const e = function (e, t, n) { + t in e && !(n in e) && ((e[n] = e[t]), delete e[t]); + }, + t = n.mediaDevices.getUserMedia.bind(n.mediaDevices); + if ( + ((n.mediaDevices.getUserMedia = function (n) { + return ( + "object" == typeof n && + "object" == typeof n.audio && + ((n = JSON.parse(JSON.stringify(n))), + e(n.audio, "autoGainControl", "mozAutoGainControl"), + e(n.audio, "noiseSuppression", "mozNoiseSuppression")), + t(n) + ); + }), + r && r.prototype.getSettings) + ) { + const t = r.prototype.getSettings; + r.prototype.getSettings = function () { + const n = t.apply(this, arguments); + return ( + e(n, "mozAutoGainControl", "autoGainControl"), + e(n, "mozNoiseSuppression", "noiseSuppression"), + n + ); + }; + } + if (r && r.prototype.applyConstraints) { + const t = r.prototype.applyConstraints; + r.prototype.applyConstraints = function (n) { + return ( + "audio" === this.kind && + "object" == typeof n && + ((n = JSON.parse(JSON.stringify(n))), + e(n, "autoGainControl", "mozAutoGainControl"), + e(n, "noiseSuppression", "mozNoiseSuppression")), + t.apply(this, [n]) + ); + }; + } + } + } + function x(e, t) { + (e.navigator.mediaDevices && + "getDisplayMedia" in e.navigator.mediaDevices) || + (e.navigator.mediaDevices && + (e.navigator.mediaDevices.getDisplayMedia = function (n) { + if (!n || !n.video) { + const e = new DOMException( + "getDisplayMedia without video constraints is undefined", + ); + return ( + (e.name = "NotFoundError"), (e.code = 8), Promise.reject(e) + ); + } + return ( + !0 === n.video + ? (n.video = { mediaSource: t }) + : (n.video.mediaSource = t), + e.navigator.mediaDevices.getUserMedia(n) + ); + })); + } + function I(e) { + "object" == typeof e && + e.RTCTrackEvent && + "receiver" in e.RTCTrackEvent.prototype && + !("transceiver" in e.RTCTrackEvent.prototype) && + Object.defineProperty(e.RTCTrackEvent.prototype, "transceiver", { + get() { + return { receiver: this.receiver }; + }, + }); + } + function O(e, t) { + if ( + "object" != typeof e || + (!e.RTCPeerConnection && !e.mozRTCPeerConnection) + ) + return; + !e.RTCPeerConnection && + e.mozRTCPeerConnection && + (e.RTCPeerConnection = e.mozRTCPeerConnection), + t.version < 53 && + [ + "setLocalDescription", + "setRemoteDescription", + "addIceCandidate", + ].forEach(function (t) { + const n = e.RTCPeerConnection.prototype[t], + r = { + [t]() { + return ( + (arguments[0] = new ( + "addIceCandidate" === t + ? e.RTCIceCandidate + : e.RTCSessionDescription + )(arguments[0])), + n.apply(this, arguments) + ); + }, + }; + e.RTCPeerConnection.prototype[t] = r[t]; + }); + const n = { + inboundrtp: "inbound-rtp", + outboundrtp: "outbound-rtp", + candidatepair: "candidate-pair", + localcandidate: "local-candidate", + remotecandidate: "remote-candidate", + }, + r = e.RTCPeerConnection.prototype.getStats; + e.RTCPeerConnection.prototype.getStats = function () { + const [e, i, o] = arguments; + return r + .apply(this, [e || null]) + .then((e) => { + if (t.version < 53 && !i) + try { + e.forEach((e) => { + e.type = n[e.type] || e.type; + }); + } catch (t) { + if ("TypeError" !== t.name) throw t; + e.forEach((t, r) => { + e.set( + r, + Object.assign({}, t, { type: n[t.type] || t.type }), + ); + }); + } + return e; + }) + .then(i, o); + }; + } + function D(e) { + if ("object" != typeof e || !e.RTCPeerConnection || !e.RTCRtpSender) + return; + if (e.RTCRtpSender && "getStats" in e.RTCRtpSender.prototype) return; + const t = e.RTCPeerConnection.prototype.getSenders; + t && + (e.RTCPeerConnection.prototype.getSenders = function () { + const e = t.apply(this, []); + return e.forEach((e) => (e._pc = this)), e; + }); + const n = e.RTCPeerConnection.prototype.addTrack; + n && + (e.RTCPeerConnection.prototype.addTrack = function () { + const e = n.apply(this, arguments); + return (e._pc = this), e; + }), + (e.RTCRtpSender.prototype.getStats = function () { + return this.track + ? this._pc.getStats(this.track) + : Promise.resolve(new Map()); + }); + } + function M(e) { + if ("object" != typeof e || !e.RTCPeerConnection || !e.RTCRtpSender) + return; + if (e.RTCRtpSender && "getStats" in e.RTCRtpReceiver.prototype) return; + const t = e.RTCPeerConnection.prototype.getReceivers; + t && + (e.RTCPeerConnection.prototype.getReceivers = function () { + const e = t.apply(this, []); + return e.forEach((e) => (e._pc = this)), e; + }), + c(e, "track", (e) => ((e.receiver._pc = e.srcElement), e)), + (e.RTCRtpReceiver.prototype.getStats = function () { + return this._pc.getStats(this.track); + }); + } + function L(e) { + e.RTCPeerConnection && + !("removeStream" in e.RTCPeerConnection.prototype) && + (e.RTCPeerConnection.prototype.removeStream = function (e) { + p("removeStream", "removeTrack"), + this.getSenders().forEach((t) => { + t.track && + e.getTracks().includes(t.track) && + this.removeTrack(t); + }); + }); + } + function H(e) { + e.DataChannel && + !e.RTCDataChannel && + (e.RTCDataChannel = e.DataChannel); + } + function G(e) { + if ("object" != typeof e || !e.RTCPeerConnection) return; + const t = e.RTCPeerConnection.prototype.addTransceiver; + t && + (e.RTCPeerConnection.prototype.addTransceiver = function () { + this.setParametersPromises = []; + let e = arguments[1] && arguments[1].sendEncodings; + void 0 === e && (e = []), (e = [...e]); + const n = e.length > 0; + n && + e.forEach((e) => { + if ("rid" in e) { + if (!/^[a-z0-9]{0,16}$/i.test(e.rid)) + throw new TypeError("Invalid RID value provided."); + } + if ( + "scaleResolutionDownBy" in e && + !(parseFloat(e.scaleResolutionDownBy) >= 1) + ) + throw new RangeError( + "scale_resolution_down_by must be >= 1.0", + ); + if ("maxFramerate" in e && !(parseFloat(e.maxFramerate) >= 0)) + throw new RangeError("max_framerate must be >= 0.0"); + }); + const r = t.apply(this, arguments); + if (n) { + const { sender: t } = r, + n = t.getParameters(); + (!("encodings" in n) || + (1 === n.encodings.length && + 0 === Object.keys(n.encodings[0]).length)) && + ((n.encodings = e), + (t.sendEncodings = e), + this.setParametersPromises.push( + t + .setParameters(n) + .then(() => { + delete t.sendEncodings; + }) + .catch(() => { + delete t.sendEncodings; + }), + )); + } + return r; + }); + } + function j(e) { + if ("object" != typeof e || !e.RTCRtpSender) return; + const t = e.RTCRtpSender.prototype.getParameters; + t && + (e.RTCRtpSender.prototype.getParameters = function () { + const e = t.apply(this, arguments); + return ( + "encodings" in e || + (e.encodings = [].concat(this.sendEncodings || [{}])), + e + ); + }); + } + function N(e) { + if ("object" != typeof e || !e.RTCPeerConnection) return; + const t = e.RTCPeerConnection.prototype.createOffer; + e.RTCPeerConnection.prototype.createOffer = function () { + return this.setParametersPromises && this.setParametersPromises.length + ? Promise.all(this.setParametersPromises) + .then(() => t.apply(this, arguments)) + .finally(() => { + this.setParametersPromises = []; + }) + : t.apply(this, arguments); + }; + } + function U(e) { + if ("object" != typeof e || !e.RTCPeerConnection) return; + const t = e.RTCPeerConnection.prototype.createAnswer; + e.RTCPeerConnection.prototype.createAnswer = function () { + return this.setParametersPromises && this.setParametersPromises.length + ? Promise.all(this.setParametersPromises) + .then(() => t.apply(this, arguments)) + .finally(() => { + this.setParametersPromises = []; + }) + : t.apply(this, arguments); + }; + } + function F(e) { + if ("object" == typeof e && e.RTCPeerConnection) { + if ( + ("getLocalStreams" in e.RTCPeerConnection.prototype || + (e.RTCPeerConnection.prototype.getLocalStreams = function () { + return ( + this._localStreams || (this._localStreams = []), + this._localStreams + ); + }), + !("addStream" in e.RTCPeerConnection.prototype)) + ) { + const t = e.RTCPeerConnection.prototype.addTrack; + (e.RTCPeerConnection.prototype.addStream = function (e) { + this._localStreams || (this._localStreams = []), + this._localStreams.includes(e) || this._localStreams.push(e), + e.getAudioTracks().forEach((n) => t.call(this, n, e)), + e.getVideoTracks().forEach((n) => t.call(this, n, e)); + }), + (e.RTCPeerConnection.prototype.addTrack = function (e, ...n) { + return ( + n && + n.forEach((e) => { + this._localStreams + ? this._localStreams.includes(e) || + this._localStreams.push(e) + : (this._localStreams = [e]); + }), + t.apply(this, arguments) + ); + }); + } + "removeStream" in e.RTCPeerConnection.prototype || + (e.RTCPeerConnection.prototype.removeStream = function (e) { + this._localStreams || (this._localStreams = []); + const t = this._localStreams.indexOf(e); + if (-1 === t) return; + this._localStreams.splice(t, 1); + const n = e.getTracks(); + this.getSenders().forEach((e) => { + n.includes(e.track) && this.removeTrack(e); + }); + }); + } + } + function z(e) { + if ( + "object" == typeof e && + e.RTCPeerConnection && + ("getRemoteStreams" in e.RTCPeerConnection.prototype || + (e.RTCPeerConnection.prototype.getRemoteStreams = function () { + return this._remoteStreams ? this._remoteStreams : []; + }), + !("onaddstream" in e.RTCPeerConnection.prototype)) + ) { + Object.defineProperty(e.RTCPeerConnection.prototype, "onaddstream", { + get() { + return this._onaddstream; + }, + set(e) { + this._onaddstream && + (this.removeEventListener("addstream", this._onaddstream), + this.removeEventListener("track", this._onaddstreampoly)), + this.addEventListener("addstream", (this._onaddstream = e)), + this.addEventListener( + "track", + (this._onaddstreampoly = (e) => { + e.streams.forEach((e) => { + if ( + (this._remoteStreams || (this._remoteStreams = []), + this._remoteStreams.includes(e)) + ) + return; + this._remoteStreams.push(e); + const t = new Event("addstream"); + (t.stream = e), this.dispatchEvent(t); + }); + }), + ); + }, + }); + const t = e.RTCPeerConnection.prototype.setRemoteDescription; + e.RTCPeerConnection.prototype.setRemoteDescription = function () { + const e = this; + return ( + this._onaddstreampoly || + this.addEventListener( + "track", + (this._onaddstreampoly = function (t) { + t.streams.forEach((t) => { + if ( + (e._remoteStreams || (e._remoteStreams = []), + e._remoteStreams.indexOf(t) >= 0) + ) + return; + e._remoteStreams.push(t); + const n = new Event("addstream"); + (n.stream = t), e.dispatchEvent(n); + }); + }), + ), + t.apply(e, arguments) + ); + }; + } + } + function J(e) { + if ("object" != typeof e || !e.RTCPeerConnection) return; + const t = e.RTCPeerConnection.prototype, + n = t.createOffer, + r = t.createAnswer, + i = t.setLocalDescription, + o = t.setRemoteDescription, + s = t.addIceCandidate; + (t.createOffer = function (e, t) { + const r = arguments.length >= 2 ? arguments[2] : arguments[0], + i = n.apply(this, [r]); + return t ? (i.then(e, t), Promise.resolve()) : i; + }), + (t.createAnswer = function (e, t) { + const n = arguments.length >= 2 ? arguments[2] : arguments[0], + i = r.apply(this, [n]); + return t ? (i.then(e, t), Promise.resolve()) : i; + }); + let a = function (e, t, n) { + const r = i.apply(this, [e]); + return n ? (r.then(t, n), Promise.resolve()) : r; + }; + (t.setLocalDescription = a), + (a = function (e, t, n) { + const r = o.apply(this, [e]); + return n ? (r.then(t, n), Promise.resolve()) : r; + }), + (t.setRemoteDescription = a), + (a = function (e, t, n) { + const r = s.apply(this, [e]); + return n ? (r.then(t, n), Promise.resolve()) : r; + }), + (t.addIceCandidate = a); + } + function K(e) { + const t = e && e.navigator; + if (t.mediaDevices && t.mediaDevices.getUserMedia) { + const e = t.mediaDevices, + n = e.getUserMedia.bind(e); + t.mediaDevices.getUserMedia = (e) => n(q(e)); + } + !t.getUserMedia && + t.mediaDevices && + t.mediaDevices.getUserMedia && + (t.getUserMedia = function (e, n, r) { + t.mediaDevices.getUserMedia(e).then(n, r); + }.bind(t)); + } + function q(e) { + return e && void 0 !== e.video + ? Object.assign({}, e, { video: m(e.video) }) + : e; + } + function W(e) { + if (!e.RTCPeerConnection) return; + const t = e.RTCPeerConnection; + (e.RTCPeerConnection = function (e, n) { + if (e && e.iceServers) { + const t = []; + for (let n = 0; n < e.iceServers.length; n++) { + let r = e.iceServers[n]; + void 0 === r.urls && r.url + ? (p("RTCIceServer.url", "RTCIceServer.urls"), + (r = JSON.parse(JSON.stringify(r))), + (r.urls = r.url), + delete r.url, + t.push(r)) + : t.push(e.iceServers[n]); + } + e.iceServers = t; + } + return new t(e, n); + }), + (e.RTCPeerConnection.prototype = t.prototype), + "generateCertificate" in t && + Object.defineProperty(e.RTCPeerConnection, "generateCertificate", { + get: () => t.generateCertificate, + }); + } + function Y(e) { + "object" == typeof e && + e.RTCTrackEvent && + "receiver" in e.RTCTrackEvent.prototype && + !("transceiver" in e.RTCTrackEvent.prototype) && + Object.defineProperty(e.RTCTrackEvent.prototype, "transceiver", { + get() { + return { receiver: this.receiver }; + }, + }); + } + function V(e) { + const t = e.RTCPeerConnection.prototype.createOffer; + e.RTCPeerConnection.prototype.createOffer = function (e) { + if (e) { + void 0 !== e.offerToReceiveAudio && + (e.offerToReceiveAudio = !!e.offerToReceiveAudio); + const t = this.getTransceivers().find( + (e) => "audio" === e.receiver.track.kind, + ); + !1 === e.offerToReceiveAudio && t + ? "sendrecv" === t.direction + ? t.setDirection + ? t.setDirection("sendonly") + : (t.direction = "sendonly") + : "recvonly" === t.direction && + (t.setDirection + ? t.setDirection("inactive") + : (t.direction = "inactive")) + : !0 !== e.offerToReceiveAudio || + t || + this.addTransceiver("audio", { direction: "recvonly" }), + void 0 !== e.offerToReceiveVideo && + (e.offerToReceiveVideo = !!e.offerToReceiveVideo); + const n = this.getTransceivers().find( + (e) => "video" === e.receiver.track.kind, + ); + !1 === e.offerToReceiveVideo && n + ? "sendrecv" === n.direction + ? n.setDirection + ? n.setDirection("sendonly") + : (n.direction = "sendonly") + : "recvonly" === n.direction && + (n.setDirection + ? n.setDirection("inactive") + : (n.direction = "inactive")) + : !0 !== e.offerToReceiveVideo || + n || + this.addTransceiver("video", { direction: "recvonly" }); + } + return t.apply(this, arguments); + }; + } + function B(e) { + "object" != typeof e || + e.AudioContext || + (e.AudioContext = e.webkitAudioContext); + } + var Z = n(2), + X = n.n(Z); + function $(e) { + if ( + !e.RTCIceCandidate || + (e.RTCIceCandidate && "foundation" in e.RTCIceCandidate.prototype) + ) + return; + const t = e.RTCIceCandidate; + (e.RTCIceCandidate = function (e) { + if ( + ("object" == typeof e && + e.candidate && + 0 === e.candidate.indexOf("a=") && + ((e = JSON.parse(JSON.stringify(e))).candidate = + e.candidate.substring(2)), + e.candidate && e.candidate.length) + ) { + const n = new t(e), + r = X().parseCandidate(e.candidate); + for (const e in r) + e in n || Object.defineProperty(n, e, { value: r[e] }); + return ( + (n.toJSON = function () { + return { + candidate: n.candidate, + sdpMid: n.sdpMid, + sdpMLineIndex: n.sdpMLineIndex, + usernameFragment: n.usernameFragment, + }; + }), + n + ); + } + return new t(e); + }), + (e.RTCIceCandidate.prototype = t.prototype), + c( + e, + "icecandidate", + (t) => ( + t.candidate && + Object.defineProperty(t, "candidate", { + value: new e.RTCIceCandidate(t.candidate), + writable: "false", + }), + t + ), + ); + } + function Q(e) { + !e.RTCIceCandidate || + (e.RTCIceCandidate && + "relayProtocol" in e.RTCIceCandidate.prototype) || + c(e, "icecandidate", (e) => { + if (e.candidate) { + const t = X().parseCandidate(e.candidate.candidate); + "relay" === t.type && + (e.candidate.relayProtocol = { 0: "tls", 1: "tcp", 2: "udp" }[ + t.priority >> 24 + ]); + } + return e; + }); + } + function ee(e, t) { + if (!e.RTCPeerConnection) return; + "sctp" in e.RTCPeerConnection.prototype || + Object.defineProperty(e.RTCPeerConnection.prototype, "sctp", { + get() { + return void 0 === this._sctp ? null : this._sctp; + }, + }); + const n = e.RTCPeerConnection.prototype.setRemoteDescription; + e.RTCPeerConnection.prototype.setRemoteDescription = function () { + if ( + ((this._sctp = null), "chrome" === t.browser && t.version >= 76) + ) { + const { sdpSemantics: e } = this.getConfiguration(); + "plan-b" === e && + Object.defineProperty(this, "sctp", { + get() { + return void 0 === this._sctp ? null : this._sctp; + }, + enumerable: !0, + configurable: !0, + }); + } + if ( + (function (e) { + if (!e || !e.sdp) return !1; + const t = X().splitSections(e.sdp); + return ( + t.shift(), + t.some((e) => { + const t = X().parseMLine(e); + return ( + t && + "application" === t.kind && + -1 !== t.protocol.indexOf("SCTP") + ); + }) + ); + })(arguments[0]) + ) { + const e = (function (e) { + const t = e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/); + if (null === t || t.length < 2) return -1; + const n = parseInt(t[1], 10); + return n != n ? -1 : n; + })(arguments[0]), + n = (function (e) { + let n = 65536; + return ( + "firefox" === t.browser && + (n = + t.version < 57 + ? -1 === e + ? 16384 + : 2147483637 + : t.version < 60 + ? 57 === t.version + ? 65535 + : 65536 + : 2147483637), + n + ); + })(e), + r = (function (e, n) { + let r = 65536; + "firefox" === t.browser && 57 === t.version && (r = 65535); + const i = X().matchPrefix(e.sdp, "a=max-message-size:"); + return ( + i.length > 0 + ? (r = parseInt(i[0].substring(19), 10)) + : "firefox" === t.browser && -1 !== n && (r = 2147483637), + r + ); + })(arguments[0], e); + let i; + i = + 0 === n && 0 === r + ? Number.POSITIVE_INFINITY + : 0 === n || 0 === r + ? Math.max(n, r) + : Math.min(n, r); + const o = {}; + Object.defineProperty(o, "maxMessageSize", { get: () => i }), + (this._sctp = o); + } + return n.apply(this, arguments); + }; + } + function te(e) { + if ( + !e.RTCPeerConnection || + !("createDataChannel" in e.RTCPeerConnection.prototype) + ) + return; + function t(e, t) { + const n = e.send; + e.send = function () { + const r = arguments[0], + i = r.length || r.size || r.byteLength; + if ("open" === e.readyState && t.sctp && i > t.sctp.maxMessageSize) + throw new TypeError( + "Message too large (can send a maximum of " + + t.sctp.maxMessageSize + + " bytes)", + ); + return n.apply(e, arguments); + }; + } + const n = e.RTCPeerConnection.prototype.createDataChannel; + (e.RTCPeerConnection.prototype.createDataChannel = function () { + const e = n.apply(this, arguments); + return t(e, this), e; + }), + c(e, "datachannel", (e) => (t(e.channel, e.target), e)); + } + function ne(e) { + if ( + !e.RTCPeerConnection || + "connectionState" in e.RTCPeerConnection.prototype + ) + return; + const t = e.RTCPeerConnection.prototype; + Object.defineProperty(t, "connectionState", { + get() { + return ( + { completed: "connected", checking: "connecting" }[ + this.iceConnectionState + ] || this.iceConnectionState + ); + }, + enumerable: !0, + configurable: !0, + }), + Object.defineProperty(t, "onconnectionstatechange", { + get() { + return this._onconnectionstatechange || null; + }, + set(e) { + this._onconnectionstatechange && + (this.removeEventListener( + "connectionstatechange", + this._onconnectionstatechange, + ), + delete this._onconnectionstatechange), + e && + this.addEventListener( + "connectionstatechange", + (this._onconnectionstatechange = e), + ); + }, + enumerable: !0, + configurable: !0, + }), + ["setLocalDescription", "setRemoteDescription"].forEach((e) => { + const n = t[e]; + t[e] = function () { + return ( + this._connectionstatechangepoly || + ((this._connectionstatechangepoly = (e) => { + const t = e.target; + if (t._lastConnectionState !== t.connectionState) { + t._lastConnectionState = t.connectionState; + const n = new Event("connectionstatechange", e); + t.dispatchEvent(n); + } + return e; + }), + this.addEventListener( + "iceconnectionstatechange", + this._connectionstatechangepoly, + )), + n.apply(this, arguments) + ); + }; + }); + } + function re(e, t) { + if (!e.RTCPeerConnection) return; + if ("chrome" === t.browser && t.version >= 71) return; + if ("safari" === t.browser && t.version >= 605) return; + const n = e.RTCPeerConnection.prototype.setRemoteDescription; + e.RTCPeerConnection.prototype.setRemoteDescription = function (t) { + if (t && t.sdp && -1 !== t.sdp.indexOf("\na=extmap-allow-mixed")) { + const n = t.sdp + .split("\n") + .filter((e) => "a=extmap-allow-mixed" !== e.trim()) + .join("\n"); + e.RTCSessionDescription && t instanceof e.RTCSessionDescription + ? (arguments[0] = new e.RTCSessionDescription({ + type: t.type, + sdp: n, + })) + : (t.sdp = n); + } + return n.apply(this, arguments); + }; + } + function ie(e, t) { + if (!e.RTCPeerConnection || !e.RTCPeerConnection.prototype) return; + const n = e.RTCPeerConnection.prototype.addIceCandidate; + n && + (e.RTCPeerConnection.prototype.addIceCandidate = function () { + return arguments[0] + ? (("chrome" === t.browser && t.version < 78) || + ("firefox" === t.browser && t.version < 68) || + "safari" === t.browser) && + arguments[0] && + "" === arguments[0].candidate + ? Promise.resolve() + : n.apply(this, arguments) + : (arguments[1] && arguments[1].apply(null), Promise.resolve()); + }); + } + function oe(e, t) { + if (!e.RTCPeerConnection || !e.RTCPeerConnection.prototype) return; + const n = e.RTCPeerConnection.prototype.setLocalDescription; + n && + 0 !== n.length && + (e.RTCPeerConnection.prototype.setLocalDescription = function () { + let e = arguments[0] || {}; + if ("object" != typeof e || (e.type && e.sdp)) + return n.apply(this, arguments); + if (((e = { type: e.type, sdp: e.sdp }), !e.type)) + switch (this.signalingState) { + case "stable": + case "have-local-offer": + case "have-remote-pranswer": + e.type = "offer"; + break; + default: + e.type = "answer"; + } + if (e.sdp || ("offer" !== e.type && "answer" !== e.type)) + return n.apply(this, [e]); + return ("offer" === e.type ? this.createOffer : this.createAnswer) + .apply(this) + .then((e) => n.apply(this, [e])); + }); + } + !(function ( + { window: n } = {}, + o = { shimChrome: !0, shimFirefox: !0, shimSafari: !0 }, + ) { + const s = h, + c = (function (e) { + const t = { browser: null, version: null }; + if (void 0 === e || !e.navigator || !e.navigator.userAgent) + return (t.browser = "Not a browser."), t; + const { navigator: n } = e; + if (n.mozGetUserMedia) + (t.browser = "firefox"), + (t.version = a(n.userAgent, /Firefox\/(\d+)\./, 1)); + else if ( + n.webkitGetUserMedia || + (!1 === e.isSecureContext && e.webkitRTCPeerConnection) + ) + (t.browser = "chrome"), + (t.version = a(n.userAgent, /Chrom(e|ium)\/(\d+)\./, 2)); + else { + if ( + !e.RTCPeerConnection || + !n.userAgent.match(/AppleWebKit\/(\d+)\./) + ) + return (t.browser = "Not a supported browser."), t; + (t.browser = "safari"), + (t.version = a(n.userAgent, /AppleWebKit\/(\d+)\./, 1)), + (t.supportsUnifiedPlan = + e.RTCRtpTransceiver && + "currentDirection" in e.RTCRtpTransceiver.prototype); + } + return t; + })(n), + p = { + browserDetails: c, + commonShim: i, + extractVersion: a, + disableLog: d, + disableWarnings: l, + sdp: Z, + }; + switch (c.browser) { + case "chrome": + if (!e || !R || !o.shimChrome) + return ( + s("Chrome shim is not included in this adapter release."), p + ); + if (null === c.version) + return ( + s("Chrome shim can not determine version, not shimming."), p + ); + s("adapter.js shimming chrome."), + (p.browserShim = e), + ie(n, c), + oe(n), + C(n, c), + v(n), + R(n, c), + b(n), + P(n, c), + S(n), + k(n), + T(n), + w(n, c), + $(n), + Q(n), + ne(n), + ee(n, c), + te(n), + re(n, c); + break; + case "firefox": + if (!t || !O || !o.shimFirefox) + return ( + s("Firefox shim is not included in this adapter release."), p + ); + s("adapter.js shimming firefox."), + (p.browserShim = t), + ie(n, c), + oe(n), + A(n, c), + O(n, c), + I(n), + L(n), + D(n), + M(n), + H(n), + G(n), + j(n), + N(n), + U(n), + $(n), + ne(n), + ee(n, c), + te(n); + break; + case "safari": + if (!r || !o.shimSafari) + return ( + s("Safari shim is not included in this adapter release."), p + ); + s("adapter.js shimming safari."), + (p.browserShim = r), + ie(n, c), + oe(n), + W(n), + V(n), + J(n), + F(n), + z(n), + Y(n), + K(n), + B(n), + $(n), + Q(n), + ee(n, c), + te(n), + re(n, c); + break; + default: + s("Unsupported browser!"); + } + })({ window: "undefined" == typeof window ? void 0 : window }); + const se = Object.freeze({ + meta: null, + signalingServerUrl: "ws://127.0.0.1:8443", + reconnectionTimeout: 2500, + webrtcConfig: { + iceServers: [ + { + urls: [ + "stun:stun.l.google.com:19302", + "stun:stun1.l.google.com:19302", + ], + }, + ], + }, + }), + ae = Object.freeze({ idle: 0, connecting: 1, streaming: 2, closed: 3 }); + class ce extends EventTarget { + constructor(e, t) { + super(), + (this._peerId = e), + (this._sessionId = ""), + (this._comChannel = t), + (this._state = ae.idle), + (this._rtcPeerConnection = null); + } + get peerId() { + return this._peerId; + } + get sessionId() { + return this._sessionId; + } + get state() { + return this._state; + } + get rtcPeerConnection() { + return this._rtcPeerConnection; + } + close() { + this._state !== ae.closed && + (this._state !== ae.idle && + this._comChannel && + this._sessionId && + this._comChannel.send({ + type: "endSession", + sessionId: this._sessionId, + }), + (this._state = ae.closed), + this.dispatchEvent(new Event("stateChanged")), + (this._comChannel = null), + this._rtcPeerConnection && + (this._rtcPeerConnection.close(), + (this._rtcPeerConnection = null), + this.dispatchEvent(new Event("rtcPeerConnectionChanged"))), + this.dispatchEvent(new Event("closed"))); + } + } + const de = Object.freeze({ + 32: "space", + 33: "exclam", + 34: "quotedbl", + 35: "numbersign", + 36: "dollar", + 37: "percent", + 38: "ampersand", + 39: "apostrophe", + 40: "parenleft", + 41: "parenright", + 42: "asterisk", + 43: "plus", + 44: "comma", + 45: "minus", + 46: "period", + 47: "slash", + 48: "0", + 49: "1", + 50: "2", + 51: "3", + 52: "4", + 53: "5", + 54: "6", + 55: "7", + 56: "8", + 57: "9", + 58: "colon", + 59: "semicolon", + 60: "less", + 61: "equal", + 62: "greater", + 63: "question", + 64: "at", + 65: "A", + 66: "B", + 67: "C", + 68: "D", + 69: "E", + 70: "F", + 71: "G", + 72: "H", + 73: "I", + 74: "J", + 75: "K", + 76: "L", + 77: "M", + 78: "N", + 79: "O", + 80: "P", + 81: "Q", + 82: "R", + 83: "S", + 84: "T", + 85: "U", + 86: "V", + 87: "W", + 88: "X", + 89: "Y", + 90: "Z", + 91: "bracketleft", + 92: "backslash", + 93: "bracketright", + 94: "asciicircum", + 95: "underscore", + 96: "grave", + 97: "a", + 98: "b", + 99: "c", + 100: "d", + 101: "e", + 102: "f", + 103: "g", + 104: "h", + 105: "i", + 106: "j", + 107: "k", + 108: "l", + 109: "m", + 110: "n", + 111: "o", + 112: "p", + 113: "q", + 114: "r", + 115: "s", + 116: "t", + 117: "u", + 118: "v", + 119: "w", + 120: "x", + 121: "y", + 122: "z", + 123: "braceleft", + 124: "bar", + 125: "braceright", + 126: "asciitilde", + 160: "nobreakspace", + 161: "exclamdown", + 162: "cent", + 163: "sterling", + 164: "currency", + 165: "yen", + 166: "brokenbar", + 167: "section", + 168: "diaeresis", + 169: "copyright", + 170: "ordfeminine", + 171: "guillemotleft", + 172: "notsign", + 173: "hyphen", + 174: "registered", + 175: "macron", + 176: "degree", + 177: "plusminus", + 178: "twosuperior", + 179: "threesuperior", + 180: "acute", + 181: "mu", + 182: "paragraph", + 183: "periodcentered", + 184: "cedilla", + 185: "onesuperior", + 186: "masculine", + 187: "guillemotright", + 188: "onequarter", + 189: "onehalf", + 190: "threequarters", + 191: "questiondown", + 192: "Agrave", + 193: "Aacute", + 194: "Acircumflex", + 195: "Atilde", + 196: "Adiaeresis", + 197: "Aring", + 198: "AE", + 199: "Ccedilla", + 200: "Egrave", + 201: "Eacute", + 202: "Ecircumflex", + 203: "Ediaeresis", + 204: "Igrave", + 205: "Iacute", + 206: "Icircumflex", + 207: "Idiaeresis", + 208: "ETH", + 209: "Ntilde", + 210: "Ograve", + 211: "Oacute", + 212: "Ocircumflex", + 213: "Otilde", + 214: "Odiaeresis", + 215: "multiply", + 216: "Ooblique", + 217: "Ugrave", + 218: "Uacute", + 219: "Ucircumflex", + 220: "Udiaeresis", + 221: "Yacute", + 222: "THORN", + 223: "ssharp", + 224: "agrave", + 225: "aacute", + 226: "acircumflex", + 227: "atilde", + 228: "adiaeresis", + 229: "aring", + 230: "ae", + 231: "ccedilla", + 232: "egrave", + 233: "eacute", + 234: "ecircumflex", + 235: "ediaeresis", + 236: "igrave", + 237: "iacute", + 238: "icircumflex", + 239: "idiaeresis", + 240: "eth", + 241: "ntilde", + 242: "ograve", + 243: "oacute", + 244: "ocircumflex", + 245: "otilde", + 246: "odiaeresis", + 247: "division", + 248: "oslash", + 249: "ugrave", + 250: "uacute", + 251: "ucircumflex", + 252: "udiaeresis", + 253: "yacute", + 254: "thorn", + 255: "ydiaeresis", + 260: "Aogonek", + 728: "breve", + 321: "Lstroke", + 317: "Lcaron", + 346: "Sacute", + 352: "Scaron", + 350: "Scedilla", + 356: "Tcaron", + 377: "Zacute", + 381: "Zcaron", + 379: "Zabovedot", + 261: "aogonek", + 731: "ogonek", + 322: "lstroke", + 318: "lcaron", + 347: "sacute", + 711: "caron", + 353: "scaron", + 351: "scedilla", + 357: "tcaron", + 378: "zacute", + 733: "doubleacute", + 382: "zcaron", + 380: "zabovedot", + 340: "Racute", + 258: "Abreve", + 313: "Lacute", + 262: "Cacute", + 268: "Ccaron", + 280: "Eogonek", + 282: "Ecaron", + 270: "Dcaron", + 272: "Dstroke", + 323: "Nacute", + 327: "Ncaron", + 336: "Odoubleacute", + 344: "Rcaron", + 366: "Uring", + 368: "Udoubleacute", + 354: "Tcedilla", + 341: "racute", + 259: "abreve", + 314: "lacute", + 263: "cacute", + 269: "ccaron", + 281: "eogonek", + 283: "ecaron", + 271: "dcaron", + 273: "dstroke", + 324: "nacute", + 328: "ncaron", + 337: "odoubleacute", + 345: "rcaron", + 367: "uring", + 369: "udoubleacute", + 355: "tcedilla", + 729: "abovedot", + 294: "Hstroke", + 292: "Hcircumflex", + 304: "Iabovedot", + 286: "Gbreve", + 308: "Jcircumflex", + 295: "hstroke", + 293: "hcircumflex", + 305: "idotless", + 287: "gbreve", + 309: "jcircumflex", + 266: "Cabovedot", + 264: "Ccircumflex", + 288: "Gabovedot", + 284: "Gcircumflex", + 364: "Ubreve", + 348: "Scircumflex", + 267: "cabovedot", + 265: "ccircumflex", + 289: "gabovedot", + 285: "gcircumflex", + 365: "ubreve", + 349: "scircumflex", + 312: "kra", + 342: "Rcedilla", + 296: "Itilde", + 315: "Lcedilla", + 274: "Emacron", + 290: "Gcedilla", + 358: "Tslash", + 343: "rcedilla", + 297: "itilde", + 316: "lcedilla", + 275: "emacron", + 291: "gcedilla", + 359: "tslash", + 330: "ENG", + 331: "eng", + 256: "Amacron", + 302: "Iogonek", + 278: "Eabovedot", + 298: "Imacron", + 325: "Ncedilla", + 332: "Omacron", + 310: "Kcedilla", + 370: "Uogonek", + 360: "Utilde", + 362: "Umacron", + 257: "amacron", + 303: "iogonek", + 279: "eabovedot", + 299: "imacron", + 326: "ncedilla", + 333: "omacron", + 311: "kcedilla", + 371: "uogonek", + 361: "utilde", + 363: "umacron", + 8254: "overline", + 12290: "kana_fullstop", + 12300: "kana_openingbracket", + 12301: "kana_closingbracket", + 12289: "kana_comma", + 12539: "kana_conjunctive", + 12530: "kana_WO", + 12449: "kana_a", + 12451: "kana_i", + 12453: "kana_u", + 12455: "kana_e", + 12457: "kana_o", + 12515: "kana_ya", + 12517: "kana_yu", + 12519: "kana_yo", + 12483: "kana_tsu", + 12540: "prolongedsound", + 12450: "kana_A", + 12452: "kana_I", + 12454: "kana_U", + 12456: "kana_E", + 12458: "kana_O", + 12459: "kana_KA", + 12461: "kana_KI", + 12463: "kana_KU", + 12465: "kana_KE", + 12467: "kana_KO", + 12469: "kana_SA", + 12471: "kana_SHI", + 12473: "kana_SU", + 12475: "kana_SE", + 12477: "kana_SO", + 12479: "kana_TA", + 12481: "kana_CHI", + 12484: "kana_TSU", + 12486: "kana_TE", + 12488: "kana_TO", + 12490: "kana_NA", + 12491: "kana_NI", + 12492: "kana_NU", + 12493: "kana_NE", + 12494: "kana_NO", + 12495: "kana_HA", + 12498: "kana_HI", + 12501: "kana_FU", + 12504: "kana_HE", + 12507: "kana_HO", + 12510: "kana_MA", + 12511: "kana_MI", + 12512: "kana_MU", + 12513: "kana_ME", + 12514: "kana_MO", + 12516: "kana_YA", + 12518: "kana_YU", + 12520: "kana_YO", + 12521: "kana_RA", + 12522: "kana_RI", + 12523: "kana_RU", + 12524: "kana_RE", + 12525: "kana_RO", + 12527: "kana_WA", + 12531: "kana_N", + 12443: "voicedsound", + 12444: "semivoicedsound", + 1548: "Arabic_comma", + 1563: "Arabic_semicolon", + 1567: "Arabic_question_mark", + 1569: "Arabic_hamza", + 1570: "Arabic_maddaonalef", + 1571: "Arabic_hamzaonalef", + 1572: "Arabic_hamzaonwaw", + 1573: "Arabic_hamzaunderalef", + 1574: "Arabic_hamzaonyeh", + 1575: "Arabic_alef", + 1576: "Arabic_beh", + 1577: "Arabic_tehmarbuta", + 1578: "Arabic_teh", + 1579: "Arabic_theh", + 1580: "Arabic_jeem", + 1581: "Arabic_hah", + 1582: "Arabic_khah", + 1583: "Arabic_dal", + 1584: "Arabic_thal", + 1585: "Arabic_ra", + 1586: "Arabic_zain", + 1587: "Arabic_seen", + 1588: "Arabic_sheen", + 1589: "Arabic_sad", + 1590: "Arabic_dad", + 1591: "Arabic_tah", + 1592: "Arabic_zah", + 1593: "Arabic_ain", + 1594: "Arabic_ghain", + 1600: "Arabic_tatweel", + 1601: "Arabic_feh", + 1602: "Arabic_qaf", + 1603: "Arabic_kaf", + 1604: "Arabic_lam", + 1605: "Arabic_meem", + 1606: "Arabic_noon", + 1607: "Arabic_ha", + 1608: "Arabic_waw", + 1609: "Arabic_alefmaksura", + 1610: "Arabic_yeh", + 1611: "Arabic_fathatan", + 1612: "Arabic_dammatan", + 1613: "Arabic_kasratan", + 1614: "Arabic_fatha", + 1615: "Arabic_damma", + 1616: "Arabic_kasra", + 1617: "Arabic_shadda", + 1618: "Arabic_sukun", + 1106: "Serbian_dje", + 1107: "Macedonia_gje", + 1105: "Cyrillic_io", + 1108: "Ukrainian_ie", + 1109: "Macedonia_dse", + 1110: "Ukrainian_i", + 1111: "Ukrainian_yi", + 1112: "Cyrillic_je", + 1113: "Cyrillic_lje", + 1114: "Cyrillic_nje", + 1115: "Serbian_tshe", + 1116: "Macedonia_kje", + 1118: "Byelorussian_shortu", + 1119: "Cyrillic_dzhe", + 8470: "numerosign", + 1026: "Serbian_DJE", + 1027: "Macedonia_GJE", + 1025: "Cyrillic_IO", + 1028: "Ukrainian_IE", + 1029: "Macedonia_DSE", + 1030: "Ukrainian_I", + 1031: "Ukrainian_YI", + 1032: "Cyrillic_JE", + 1033: "Cyrillic_LJE", + 1034: "Cyrillic_NJE", + 1035: "Serbian_TSHE", + 1036: "Macedonia_KJE", + 1038: "Byelorussian_SHORTU", + 1039: "Cyrillic_DZHE", + 1102: "Cyrillic_yu", + 1072: "Cyrillic_a", + 1073: "Cyrillic_be", + 1094: "Cyrillic_tse", + 1076: "Cyrillic_de", + 1077: "Cyrillic_ie", + 1092: "Cyrillic_ef", + 1075: "Cyrillic_ghe", + 1093: "Cyrillic_ha", + 1080: "Cyrillic_i", + 1081: "Cyrillic_shorti", + 1082: "Cyrillic_ka", + 1083: "Cyrillic_el", + 1084: "Cyrillic_em", + 1085: "Cyrillic_en", + 1086: "Cyrillic_o", + 1087: "Cyrillic_pe", + 1103: "Cyrillic_ya", + 1088: "Cyrillic_er", + 1089: "Cyrillic_es", + 1090: "Cyrillic_te", + 1091: "Cyrillic_u", + 1078: "Cyrillic_zhe", + 1074: "Cyrillic_ve", + 1100: "Cyrillic_softsign", + 1099: "Cyrillic_yeru", + 1079: "Cyrillic_ze", + 1096: "Cyrillic_sha", + 1101: "Cyrillic_e", + 1097: "Cyrillic_shcha", + 1095: "Cyrillic_che", + 1098: "Cyrillic_hardsign", + 1070: "Cyrillic_YU", + 1040: "Cyrillic_A", + 1041: "Cyrillic_BE", + 1062: "Cyrillic_TSE", + 1044: "Cyrillic_DE", + 1045: "Cyrillic_IE", + 1060: "Cyrillic_EF", + 1043: "Cyrillic_GHE", + 1061: "Cyrillic_HA", + 1048: "Cyrillic_I", + 1049: "Cyrillic_SHORTI", + 1050: "Cyrillic_KA", + 1051: "Cyrillic_EL", + 1052: "Cyrillic_EM", + 1053: "Cyrillic_EN", + 1054: "Cyrillic_O", + 1055: "Cyrillic_PE", + 1071: "Cyrillic_YA", + 1056: "Cyrillic_ER", + 1057: "Cyrillic_ES", + 1058: "Cyrillic_TE", + 1059: "Cyrillic_U", + 1046: "Cyrillic_ZHE", + 1042: "Cyrillic_VE", + 1068: "Cyrillic_SOFTSIGN", + 1067: "Cyrillic_YERU", + 1047: "Cyrillic_ZE", + 1064: "Cyrillic_SHA", + 1069: "Cyrillic_E", + 1065: "Cyrillic_SHCHA", + 1063: "Cyrillic_CHE", + 1066: "Cyrillic_HARDSIGN", + 902: "Greek_ALPHAaccent", + 904: "Greek_EPSILONaccent", + 905: "Greek_ETAaccent", + 906: "Greek_IOTAaccent", + 938: "Greek_IOTAdiaeresis", + 908: "Greek_OMICRONaccent", + 910: "Greek_UPSILONaccent", + 939: "Greek_UPSILONdieresis", + 911: "Greek_OMEGAaccent", + 901: "Greek_accentdieresis", + 8213: "Greek_horizbar", + 940: "Greek_alphaaccent", + 941: "Greek_epsilonaccent", + 942: "Greek_etaaccent", + 943: "Greek_iotaaccent", + 970: "Greek_iotadieresis", + 912: "Greek_iotaaccentdieresis", + 972: "Greek_omicronaccent", + 973: "Greek_upsilonaccent", + 971: "Greek_upsilondieresis", + 944: "Greek_upsilonaccentdieresis", + 974: "Greek_omegaaccent", + 913: "Greek_ALPHA", + 914: "Greek_BETA", + 915: "Greek_GAMMA", + 916: "Greek_DELTA", + 917: "Greek_EPSILON", + 918: "Greek_ZETA", + 919: "Greek_ETA", + 920: "Greek_THETA", + 921: "Greek_IOTA", + 922: "Greek_KAPPA", + 923: "Greek_LAMBDA", + 924: "Greek_MU", + 925: "Greek_NU", + 926: "Greek_XI", + 927: "Greek_OMICRON", + 928: "Greek_PI", + 929: "Greek_RHO", + 931: "Greek_SIGMA", + 932: "Greek_TAU", + 933: "Greek_UPSILON", + 934: "Greek_PHI", + 935: "Greek_CHI", + 936: "Greek_PSI", + 937: "Greek_OMEGA", + 945: "Greek_alpha", + 946: "Greek_beta", + 947: "Greek_gamma", + 948: "Greek_delta", + 949: "Greek_epsilon", + 950: "Greek_zeta", + 951: "Greek_eta", + 952: "Greek_theta", + 953: "Greek_iota", + 954: "Greek_kappa", + 955: "Greek_lambda", + 956: "Greek_mu", + 957: "Greek_nu", + 958: "Greek_xi", + 959: "Greek_omicron", + 960: "Greek_pi", + 961: "Greek_rho", + 963: "Greek_sigma", + 962: "Greek_finalsmallsigma", + 964: "Greek_tau", + 965: "Greek_upsilon", + 966: "Greek_phi", + 967: "Greek_chi", + 968: "Greek_psi", + 969: "Greek_omega", + 9143: "leftradical", + 8992: "topintegral", + 8993: "botintegral", + 9121: "topleftsqbracket", + 9123: "botleftsqbracket", + 9124: "toprightsqbracket", + 9126: "botrightsqbracket", + 9115: "topleftparens", + 9117: "botleftparens", + 9118: "toprightparens", + 9120: "botrightparens", + 9128: "leftmiddlecurlybrace", + 9132: "rightmiddlecurlybrace", + 8804: "lessthanequal", + 8800: "notequal", + 8805: "greaterthanequal", + 8747: "integral", + 8756: "therefore", + 8733: "variation", + 8734: "infinity", + 8711: "nabla", + 8764: "approximate", + 8771: "similarequal", + 8660: "ifonlyif", + 8658: "implies", + 8801: "identical", + 8730: "radical", + 8834: "includedin", + 8835: "includes", + 8745: "intersection", + 8746: "union", + 8743: "logicaland", + 8744: "logicalor", + 8706: "partialderivative", + 402: "function", + 8592: "leftarrow", + 8593: "uparrow", + 8594: "rightarrow", + 8595: "downarrow", + 9670: "soliddiamond", + 9618: "checkerboard", + 9225: "ht", + 9228: "ff", + 9229: "cr", + 9226: "lf", + 9252: "nl", + 9227: "vt", + 9496: "lowrightcorner", + 9488: "uprightcorner", + 9484: "upleftcorner", + 9492: "lowleftcorner", + 9532: "crossinglines", + 9146: "horizlinescan1", + 9147: "horizlinescan3", + 9472: "horizlinescan5", + 9148: "horizlinescan7", + 9149: "horizlinescan9", + 9500: "leftt", + 9508: "rightt", + 9524: "bott", + 9516: "topt", + 9474: "vertbar", + 8195: "emspace", + 8194: "enspace", + 8196: "em3space", + 8197: "em4space", + 8199: "digitspace", + 8200: "punctspace", + 8201: "thinspace", + 8202: "hairspace", + 8212: "emdash", + 8211: "endash", + 9251: "signifblank", + 8230: "ellipsis", + 8229: "doubbaselinedot", + 8531: "onethird", + 8532: "twothirds", + 8533: "onefifth", + 8534: "twofifths", + 8535: "threefifths", + 8536: "fourfifths", + 8537: "onesixth", + 8538: "fivesixths", + 8453: "careof", + 8210: "figdash", + 10216: "leftanglebracket", + 10217: "rightanglebracket", + 8539: "oneeighth", + 8540: "threeeighths", + 8541: "fiveeighths", + 8542: "seveneighths", + 8482: "trademark", + 9747: "signaturemark", + 9665: "leftopentriangle", + 9655: "rightopentriangle", + 9647: "emopenrectangle", + 8216: "leftsinglequotemark", + 8217: "rightsinglequotemark", + 8220: "leftdoublequotemark", + 8221: "rightdoublequotemark", + 8478: "prescription", + 8242: "minutes", + 8243: "seconds", + 10013: "latincross", + 9644: "filledrectbullet", + 9664: "filledlefttribullet", + 9654: "filledrighttribullet", + 9679: "emfilledcircle", + 9646: "emfilledrect", + 9702: "enopencircbullet", + 9643: "enopensquarebullet", + 9645: "openrectbullet", + 9651: "opentribulletup", + 9661: "opentribulletdown", + 9734: "openstar", + 8226: "enfilledcircbullet", + 9642: "enfilledsqbullet", + 9650: "filledtribulletup", + 9660: "filledtribulletdown", + 9756: "leftpointer", + 9758: "rightpointer", + 9827: "club", + 9830: "diamond", + 9829: "heart", + 10016: "maltesecross", + 8224: "dagger", + 8225: "doubledagger", + 10003: "checkmark", + 10007: "ballotcross", + 9839: "musicalsharp", + 9837: "musicalflat", + 9794: "malesymbol", + 9792: "femalesymbol", + 9742: "telephone", + 8981: "telephonerecorder", + 8471: "phonographcopyright", + 8248: "caret", + 8218: "singlelowquotemark", + 8222: "doublelowquotemark", + 8869: "downtack", + 8970: "downstile", + 8728: "jot", + 9109: "quad", + 8868: "uptack", + 9675: "circle", + 8968: "upstile", + 8866: "lefttack", + 8867: "righttack", + 8215: "hebrew_doublelowline", + 1488: "hebrew_aleph", + 1489: "hebrew_beth", + 1490: "hebrew_gimmel", + 1491: "hebrew_daleth", + 1492: "hebrew_he", + 1493: "hebrew_waw", + 1494: "hebrew_zayin", + 1495: "hebrew_het", + 1496: "hebrew_teth", + 1497: "hebrew_yod", + 1498: "hebrew_finalkaph", + 1499: "hebrew_kaph", + 1500: "hebrew_lamed", + 1501: "hebrew_finalmem", + 1502: "hebrew_mem", + 1503: "hebrew_finalnun", + 1504: "hebrew_nun", + 1505: "hebrew_samekh", + 1506: "hebrew_ayin", + 1507: "hebrew_finalpe", + 1508: "hebrew_pe", + 1509: "hebrew_finalzadi", + 1510: "hebrew_zadi", + 1511: "hebrew_qoph", + 1512: "hebrew_resh", + 1513: "hebrew_shin", + 1514: "hebrew_taw", + 3585: "Thai_kokai", + 3586: "Thai_khokhai", + 3587: "Thai_khokhuat", + 3588: "Thai_khokhwai", + 3589: "Thai_khokhon", + 3590: "Thai_khorakhang", + 3591: "Thai_ngongu", + 3592: "Thai_chochan", + 3593: "Thai_choching", + 3594: "Thai_chochang", + 3595: "Thai_soso", + 3596: "Thai_chochoe", + 3597: "Thai_yoying", + 3598: "Thai_dochada", + 3599: "Thai_topatak", + 3600: "Thai_thothan", + 3601: "Thai_thonangmontho", + 3602: "Thai_thophuthao", + 3603: "Thai_nonen", + 3604: "Thai_dodek", + 3605: "Thai_totao", + 3606: "Thai_thothung", + 3607: "Thai_thothahan", + 3608: "Thai_thothong", + 3609: "Thai_nonu", + 3610: "Thai_bobaimai", + 3611: "Thai_popla", + 3612: "Thai_phophung", + 3613: "Thai_fofa", + 3614: "Thai_phophan", + 3615: "Thai_fofan", + 3616: "Thai_phosamphao", + 3617: "Thai_moma", + 3618: "Thai_yoyak", + 3619: "Thai_rorua", + 3620: "Thai_ru", + 3621: "Thai_loling", + 3622: "Thai_lu", + 3623: "Thai_wowaen", + 3624: "Thai_sosala", + 3625: "Thai_sorusi", + 3626: "Thai_sosua", + 3627: "Thai_hohip", + 3628: "Thai_lochula", + 3629: "Thai_oang", + 3630: "Thai_honokhuk", + 3631: "Thai_paiyannoi", + 3632: "Thai_saraa", + 3633: "Thai_maihanakat", + 3634: "Thai_saraaa", + 3635: "Thai_saraam", + 3636: "Thai_sarai", + 3637: "Thai_saraii", + 3638: "Thai_saraue", + 3639: "Thai_sarauee", + 3640: "Thai_sarau", + 3641: "Thai_sarauu", + 3642: "Thai_phinthu", + 3647: "Thai_baht", + 3648: "Thai_sarae", + 3649: "Thai_saraae", + 3650: "Thai_sarao", + 3651: "Thai_saraaimaimuan", + 3652: "Thai_saraaimaimalai", + 3653: "Thai_lakkhangyao", + 3654: "Thai_maiyamok", + 3655: "Thai_maitaikhu", + 3656: "Thai_maiek", + 3657: "Thai_maitho", + 3658: "Thai_maitri", + 3659: "Thai_maichattawa", + 3660: "Thai_thanthakhat", + 3661: "Thai_nikhahit", + 3664: "Thai_leksun", + 3665: "Thai_leknung", + 3666: "Thai_leksong", + 3667: "Thai_leksam", + 3668: "Thai_leksi", + 3669: "Thai_lekha", + 3670: "Thai_lekhok", + 3671: "Thai_lekchet", + 3672: "Thai_lekpaet", + 3673: "Thai_lekkao", + 12593: "Hangul_Kiyeog", + 12594: "Hangul_SsangKiyeog", + 12595: "Hangul_KiyeogSios", + 12596: "Hangul_Nieun", + 12597: "Hangul_NieunJieuj", + 12598: "Hangul_NieunHieuh", + 12599: "Hangul_Dikeud", + 12600: "Hangul_SsangDikeud", + 12601: "Hangul_Rieul", + 12602: "Hangul_RieulKiyeog", + 12603: "Hangul_RieulMieum", + 12604: "Hangul_RieulPieub", + 12605: "Hangul_RieulSios", + 12606: "Hangul_RieulTieut", + 12607: "Hangul_RieulPhieuf", + 12608: "Hangul_RieulHieuh", + 12609: "Hangul_Mieum", + 12610: "Hangul_Pieub", + 12611: "Hangul_SsangPieub", + 12612: "Hangul_PieubSios", + 12613: "Hangul_Sios", + 12614: "Hangul_SsangSios", + 12615: "Hangul_Ieung", + 12616: "Hangul_Jieuj", + 12617: "Hangul_SsangJieuj", + 12618: "Hangul_Cieuc", + 12619: "Hangul_Khieuq", + 12620: "Hangul_Tieut", + 12621: "Hangul_Phieuf", + 12622: "Hangul_Hieuh", + 12623: "Hangul_A", + 12624: "Hangul_AE", + 12625: "Hangul_YA", + 12626: "Hangul_YAE", + 12627: "Hangul_EO", + 12628: "Hangul_E", + 12629: "Hangul_YEO", + 12630: "Hangul_YE", + 12631: "Hangul_O", + 12632: "Hangul_WA", + 12633: "Hangul_WAE", + 12634: "Hangul_OE", + 12635: "Hangul_YO", + 12636: "Hangul_U", + 12637: "Hangul_WEO", + 12638: "Hangul_WE", + 12639: "Hangul_WI", + 12640: "Hangul_YU", + 12641: "Hangul_EU", + 12642: "Hangul_YI", + 12643: "Hangul_I", + 4520: "Hangul_J_Kiyeog", + 4521: "Hangul_J_SsangKiyeog", + 4522: "Hangul_J_KiyeogSios", + 4523: "Hangul_J_Nieun", + 4524: "Hangul_J_NieunJieuj", + 4525: "Hangul_J_NieunHieuh", + 4526: "Hangul_J_Dikeud", + 4527: "Hangul_J_Rieul", + 4528: "Hangul_J_RieulKiyeog", + 4529: "Hangul_J_RieulMieum", + 4530: "Hangul_J_RieulPieub", + 4531: "Hangul_J_RieulSios", + 4532: "Hangul_J_RieulTieut", + 4533: "Hangul_J_RieulPhieuf", + 4534: "Hangul_J_RieulHieuh", + 4535: "Hangul_J_Mieum", + 4536: "Hangul_J_Pieub", + 4537: "Hangul_J_PieubSios", + 4538: "Hangul_J_Sios", + 4539: "Hangul_J_SsangSios", + 4540: "Hangul_J_Ieung", + 4541: "Hangul_J_Jieuj", + 4542: "Hangul_J_Cieuc", + 4543: "Hangul_J_Khieuq", + 4544: "Hangul_J_Tieut", + 4545: "Hangul_J_Phieuf", + 4546: "Hangul_J_Hieuh", + 12653: "Hangul_RieulYeorinHieuh", + 12657: "Hangul_SunkyeongeumMieum", + 12664: "Hangul_SunkyeongeumPieub", + 12671: "Hangul_PanSios", + 12673: "Hangul_KkogjiDalrinIeung", + 12676: "Hangul_SunkyeongeumPhieuf", + 12678: "Hangul_YeorinHieuh", + 12685: "Hangul_AraeA", + 12686: "Hangul_AraeAE", + 4587: "Hangul_J_PanSios", + 4592: "Hangul_J_KkogjiDalrinIeung", + 4601: "Hangul_J_YeorinHieuh", + 338: "OE", + 339: "oe", + 376: "Ydiaeresis", + 8352: "EcuSign", + 8353: "ColonSign", + 8354: "CruzeiroSign", + 8355: "FFrancSign", + 8356: "LiraSign", + 8357: "MillSign", + 8358: "NairaSign", + 8359: "PesetaSign", + 8360: "RupeeSign", + 8361: "WonSign", + 8362: "NewSheqelSign", + 8363: "DongSign", + 8364: "EuroSign", + 768: "dead_grave", + 769: "dead_acute", + 770: "dead_circumflex", + 771: "dead_tilde", + 772: "dead_macron", + 774: "dead_breve", + 775: "dead_abovedot", + 776: "dead_diaeresis", + 778: "dead_abovering", + 779: "dead_doubleacute", + 780: "dead_caron", + 807: "dead_cedilla", + 808: "dead_ogonek", + 837: "dead_iota", + 12441: "dead_voiced_sound", + 12442: "dead_semivoiced_sound", + 8: "BackSpace", + 9: "Tab", + 10: "Linefeed", + 11: "Clear", + 13: "Return", + 19: "Pause", + 20: "Scroll_Lock", + 21: "Sys_Req", + 27: "Escape", + 1169: "Ukrainian_ghe_with_upturn", + 1168: "Ukrainian_GHE_WITH_UPTURN", + 1415: "Armenian_ligature_ew", + 1417: "Armenian_verjaket", + 1373: "Armenian_but", + 1418: "Armenian_yentamna", + 1372: "Armenian_amanak", + 1371: "Armenian_shesht", + 1374: "Armenian_paruyk", + 1329: "Armenian_AYB", + 1377: "Armenian_ayb", + 1330: "Armenian_BEN", + 1378: "Armenian_ben", + 1331: "Armenian_GIM", + 1379: "Armenian_gim", + 1332: "Armenian_DA", + 1380: "Armenian_da", + 1333: "Armenian_YECH", + 1381: "Armenian_yech", + 1334: "Armenian_ZA", + 1382: "Armenian_za", + 1335: "Armenian_E", + 1383: "Armenian_e", + 1336: "Armenian_AT", + 1384: "Armenian_at", + 1337: "Armenian_TO", + 1385: "Armenian_to", + 1338: "Armenian_ZHE", + 1386: "Armenian_zhe", + 1339: "Armenian_INI", + 1387: "Armenian_ini", + 1340: "Armenian_LYUN", + 1388: "Armenian_lyun", + 1341: "Armenian_KHE", + 1389: "Armenian_khe", + 1342: "Armenian_TSA", + 1390: "Armenian_tsa", + 1343: "Armenian_KEN", + 1391: "Armenian_ken", + 1344: "Armenian_HO", + 1392: "Armenian_ho", + 1345: "Armenian_DZA", + 1393: "Armenian_dza", + 1346: "Armenian_GHAT", + 1394: "Armenian_ghat", + 1347: "Armenian_TCHE", + 1395: "Armenian_tche", + 1348: "Armenian_MEN", + 1396: "Armenian_men", + 1349: "Armenian_HI", + 1397: "Armenian_hi", + 1350: "Armenian_NU", + 1398: "Armenian_nu", + 1351: "Armenian_SHA", + 1399: "Armenian_sha", + 1352: "Armenian_VO", + 1400: "Armenian_vo", + 1353: "Armenian_CHA", + 1401: "Armenian_cha", + 1354: "Armenian_PE", + 1402: "Armenian_pe", + 1355: "Armenian_JE", + 1403: "Armenian_je", + 1356: "Armenian_RA", + 1404: "Armenian_ra", + 1357: "Armenian_SE", + 1405: "Armenian_se", + 1358: "Armenian_VEV", + 1406: "Armenian_vev", + 1359: "Armenian_TYUN", + 1407: "Armenian_tyun", + 1360: "Armenian_RE", + 1408: "Armenian_re", + 1361: "Armenian_TSO", + 1409: "Armenian_tso", + 1362: "Armenian_VYUN", + 1410: "Armenian_vyun", + 1363: "Armenian_PYUR", + 1411: "Armenian_pyur", + 1364: "Armenian_KE", + 1412: "Armenian_ke", + 1365: "Armenian_O", + 1413: "Armenian_o", + 1366: "Armenian_FE", + 1414: "Armenian_fe", + 1370: "Armenian_apostrophe", + 4304: "Georgian_an", + 4305: "Georgian_ban", + 4306: "Georgian_gan", + 4307: "Georgian_don", + 4308: "Georgian_en", + 4309: "Georgian_vin", + 4310: "Georgian_zen", + 4311: "Georgian_tan", + 4312: "Georgian_in", + 4313: "Georgian_kan", + 4314: "Georgian_las", + 4315: "Georgian_man", + 4316: "Georgian_nar", + 4317: "Georgian_on", + 4318: "Georgian_par", + 4319: "Georgian_zhar", + 4320: "Georgian_rae", + 4321: "Georgian_san", + 4322: "Georgian_tar", + 4323: "Georgian_un", + 4324: "Georgian_phar", + 4325: "Georgian_khar", + 4326: "Georgian_ghan", + 4327: "Georgian_qar", + 4328: "Georgian_shin", + 4329: "Georgian_chin", + 4330: "Georgian_can", + 4331: "Georgian_jil", + 4332: "Georgian_cil", + 4333: "Georgian_char", + 4334: "Georgian_xan", + 4335: "Georgian_jhan", + 4336: "Georgian_hae", + 4337: "Georgian_he", + 4338: "Georgian_hie", + 4339: "Georgian_we", + 4340: "Georgian_har", + 4341: "Georgian_hoe", + 4342: "Georgian_fi", + 7682: "Babovedot", + 7683: "babovedot", + 7690: "Dabovedot", + 7808: "Wgrave", + 7810: "Wacute", + 7691: "dabovedot", + 7922: "Ygrave", + 7710: "Fabovedot", + 7711: "fabovedot", + 7744: "Mabovedot", + 7745: "mabovedot", + 7766: "Pabovedot", + 7809: "wgrave", + 7767: "pabovedot", + 7811: "wacute", + 7776: "Sabovedot", + 7923: "ygrave", + 7812: "Wdiaeresis", + 7813: "wdiaeresis", + 7777: "sabovedot", + 372: "Wcircumflex", + 7786: "Tabovedot", + 374: "Ycircumflex", + 373: "wcircumflex", + 7787: "tabovedot", + 375: "ycircumflex", + 1776: "Farsi_0", + 1777: "Farsi_1", + 1778: "Farsi_2", + 1779: "Farsi_3", + 1780: "Farsi_4", + 1781: "Farsi_5", + 1782: "Farsi_6", + 1783: "Farsi_7", + 1784: "Farsi_8", + 1785: "Farsi_9", + 1642: "Arabic_percent", + 1648: "Arabic_superscript_alef", + 1657: "Arabic_tteh", + 1662: "Arabic_peh", + 1670: "Arabic_tcheh", + 1672: "Arabic_ddal", + 1681: "Arabic_rreh", + 1748: "Arabic_fullstop", + 1632: "Arabic_0", + 1633: "Arabic_1", + 1634: "Arabic_2", + 1635: "Arabic_3", + 1636: "Arabic_4", + 1637: "Arabic_5", + 1638: "Arabic_6", + 1639: "Arabic_7", + 1640: "Arabic_8", + 1641: "Arabic_9", + 1619: "Arabic_madda_above", + 1620: "Arabic_hamza_above", + 1621: "Arabic_hamza_below", + 1688: "Arabic_jeh", + 1700: "Arabic_veh", + 1705: "Arabic_keheh", + 1711: "Arabic_gaf", + 1722: "Arabic_noon_ghunna", + 1726: "Arabic_heh_doachashmee", + 1740: "Farsi_yeh", + 1746: "Arabic_yeh_baree", + 1729: "Arabic_heh_goal", + 1170: "Cyrillic_GHE_bar", + 1174: "Cyrillic_ZHE_descender", + 1178: "Cyrillic_KA_descender", + 1180: "Cyrillic_KA_vertstroke", + 1186: "Cyrillic_EN_descender", + 1198: "Cyrillic_U_straight", + 1200: "Cyrillic_U_straight_bar", + 1202: "Cyrillic_HA_descender", + 1206: "Cyrillic_CHE_descender", + 1208: "Cyrillic_CHE_vertstroke", + 1210: "Cyrillic_SHHA", + 1240: "Cyrillic_SCHWA", + 1250: "Cyrillic_I_macron", + 1256: "Cyrillic_O_bar", + 1262: "Cyrillic_U_macron", + 1171: "Cyrillic_ghe_bar", + 1175: "Cyrillic_zhe_descender", + 1179: "Cyrillic_ka_descender", + 1181: "Cyrillic_ka_vertstroke", + 1187: "Cyrillic_en_descender", + 1199: "Cyrillic_u_straight", + 1201: "Cyrillic_u_straight_bar", + 1203: "Cyrillic_ha_descender", + 1207: "Cyrillic_che_descender", + 1209: "Cyrillic_che_vertstroke", + 1211: "Cyrillic_shha", + 1241: "Cyrillic_schwa", + 1251: "Cyrillic_i_macron", + 1257: "Cyrillic_o_bar", + 1263: "Cyrillic_u_macron", + 7818: "Xabovedot", + 300: "Ibreve", + 437: "Zstroke", + 486: "Gcaron", + 415: "Obarred", + 7819: "xabovedot", + 301: "ibreve", + 438: "zstroke", + 487: "gcaron", + 466: "ocaron", + 629: "obarred", + 399: "SCHWA", + 601: "schwa", + 7734: "Lbelowdot", + 7735: "lbelowdot", + 7840: "Abelowdot", + 7841: "abelowdot", + 7842: "Ahook", + 7843: "ahook", + 7844: "Acircumflexacute", + 7845: "acircumflexacute", + 7846: "Acircumflexgrave", + 7847: "acircumflexgrave", + 7848: "Acircumflexhook", + 7849: "acircumflexhook", + 7850: "Acircumflextilde", + 7851: "acircumflextilde", + 7852: "Acircumflexbelowdot", + 7853: "acircumflexbelowdot", + 7854: "Abreveacute", + 7855: "abreveacute", + 7856: "Abrevegrave", + 7857: "abrevegrave", + 7858: "Abrevehook", + 7859: "abrevehook", + 7860: "Abrevetilde", + 7861: "abrevetilde", + 7862: "Abrevebelowdot", + 7863: "abrevebelowdot", + 7864: "Ebelowdot", + 7865: "ebelowdot", + 7866: "Ehook", + 7867: "ehook", + 7868: "Etilde", + 7869: "etilde", + 7870: "Ecircumflexacute", + 7871: "ecircumflexacute", + 7872: "Ecircumflexgrave", + 7873: "ecircumflexgrave", + 7874: "Ecircumflexhook", + 7875: "ecircumflexhook", + 7876: "Ecircumflextilde", + 7877: "ecircumflextilde", + 7878: "Ecircumflexbelowdot", + 7879: "ecircumflexbelowdot", + 7880: "Ihook", + 7881: "ihook", + 7882: "Ibelowdot", + 7883: "ibelowdot", + 7884: "Obelowdot", + 7885: "obelowdot", + 7886: "Ohook", + 7887: "ohook", + 7888: "Ocircumflexacute", + 7889: "ocircumflexacute", + 7890: "Ocircumflexgrave", + 7891: "ocircumflexgrave", + 7892: "Ocircumflexhook", + 7893: "ocircumflexhook", + 7894: "Ocircumflextilde", + 7895: "ocircumflextilde", + 7896: "Ocircumflexbelowdot", + 7897: "ocircumflexbelowdot", + 7898: "Ohornacute", + 7899: "ohornacute", + 7900: "Ohorngrave", + 7901: "ohorngrave", + 7902: "Ohornhook", + 7903: "ohornhook", + 7904: "Ohorntilde", + 7905: "ohorntilde", + 7906: "Ohornbelowdot", + 7907: "ohornbelowdot", + 7908: "Ubelowdot", + 7909: "ubelowdot", + 7910: "Uhook", + 7911: "uhook", + 7912: "Uhornacute", + 7913: "uhornacute", + 7914: "Uhorngrave", + 7915: "uhorngrave", + 7916: "Uhornhook", + 7917: "uhornhook", + 7918: "Uhorntilde", + 7919: "uhorntilde", + 7920: "Uhornbelowdot", + 7921: "uhornbelowdot", + 7924: "Ybelowdot", + 7925: "ybelowdot", + 7926: "Yhook", + 7927: "yhook", + 7928: "Ytilde", + 7929: "ytilde", + 416: "Ohorn", + 417: "ohorn", + 431: "Uhorn", + 432: "uhorn", + 803: "dead_belowdot", + 777: "dead_hook", + 795: "dead_horn", + }), + le = Object.freeze({ + AltLeft: "Alt_L", + AltRight: "Alt_R", + ArrowDown: "Down", + ArrowLeft: "Left", + ArrowRight: "Right", + ArrowUp: "Up", + Backspace: "BackSpace", + CapsLock: "Caps_Lock", + ControlLeft: "Control_L", + ControlRight: "Control_R", + Enter: "Return", + HyperLeft: "Hyper_L", + HyperRight: "Hyper_R", + NumLock: "Num_Lock", + NumpadEnter: "Return", + MetaLeft: "Meta_L", + MetaRight: "Meta_R", + PageDown: "Page_Down", + PageUp: "Page_Up", + ScrollLock: "Scroll_Lock", + ShiftLeft: "Shift_L", + ShiftRight: "Shift_R", + SuperLeft: "Super_L", + SuperRight: "Super_R", + }), + he = new Set([ + "Clear", + "Copy", + "Cut", + "Delete", + "End", + "F1", + "F2", + "F3", + "F4", + "F5", + "F6", + "F7", + "F8", + "F9", + "F10", + "F11", + "F12", + "Home", + "Insert", + "Paste", + "Redo", + "Tab", + "Undo", + ]); + function pe(e, t) { + var n = "Unidentified"; + if (1 === e.length) { + const t = e.charCodeAt(0); + t in de && (n = de[t]); + } else t in le ? (n = le[t]) : he.has(t) && (n = t); + return n; + } + const ue = Object.freeze([ + "wheel", + "contextmenu", + "mousemove", + "mousedown", + "mouseup", + "touchstart", + "touchend", + "touchmove", + "touchcancel", + "keyup", + "keydown", + ]), + me = Object.freeze({ + mousemove: "MouseMove", + mousedown: "MouseButtonPress", + mouseup: "MouseButtonRelease", + }), + _e = Object.freeze({ + touchstart: "TouchDown", + touchend: "TouchUp", + touchmove: "TouchMotion", + touchcancel: "TouchUp", + }), + fe = Object.freeze({ keydown: "KeyPress", keyup: "KeyRelease" }); + function ge(e) { + const t = []; + return ( + e.altKey && t.push("mod1-mask"), + e.ctrlKey && t.push("control-mask"), + e.metaKey && t.push("meta-mask"), + e.shiftKey && t.push("shift-mask"), + t.join("+") + ); + } + class Ce extends EventTarget { + constructor(e, t) { + super(), + (this._rtcDataChannel = e), + (this._consumerSession = t), + (this._videoElement = null), + (this._videoElementComputedStyle = null), + (this._videoElementKeyboard = null), + (this._lastTouchEventTimestamp = 0), + (this._requestCounter = 0), + e.addEventListener("close", () => { + this._rtcDataChannel === e && this.close(); + }), + e.addEventListener("error", (t) => { + if (this._rtcDataChannel === e) { + const e = t.error; + this.dispatchEvent( + new ErrorEvent("error", { + message: (e && e.message) || "Remote controller error", + error: + e || + new Error( + "unknown error on the remote controller data channel", + ), + }), + ); + } + }), + e.addEventListener("message", (e) => { + try { + const t = JSON.parse(e.data); + "ControlResponseMessage" === t.type + ? this.dispatchEvent( + new CustomEvent("controlResponse", { detail: t }), + ) + : "InfoMessage" === t.type && + this.dispatchEvent(new CustomEvent("info", { detail: t })); + } catch (e) { + this.dispatchEvent( + new ErrorEvent("error", { + message: + "cannot parse control message from signaling server", + error: e, + }), + ); + } + }); + } + get rtcDataChannel() { + return this._rtcDataChannel; + } + get consumerSession() { + return this._consumerSession; + } + get videoElement() { + return this._videoElement; + } + attachVideoElement(e) { + if (e instanceof HTMLVideoElement && e !== this._videoElement) { + this._videoElement && this.attachVideoElement(null), + (this._videoElement = e), + (this._videoElementComputedStyle = window.getComputedStyle(e)); + for (const t of ue) e.addEventListener(t, this); + e.setAttribute("tabindex", "0"); + } else if (null === e && this._videoElement) { + const e = this._videoElement; + e.removeAttribute("tabindex"), + (this._videoElement = null), + (this._videoElementComputedStyle = null), + (this._lastTouchEventTimestamp = 0); + for (const t of ue) e.removeEventListener(t, this); + } + } + sendControlRequest(e) { + try { + if (!e || ("object" != typeof e && "string" != typeof e)) + throw new Error("invalid request"); + if (!this._rtcDataChannel) + throw new Error("remote controller data channel is closed"); + let t = { id: this._requestCounter++, request: e }; + return this._rtcDataChannel.send(JSON.stringify(t)), t.id; + } catch (e) { + return ( + this.dispatchEvent( + new ErrorEvent("error", { + message: `cannot send control message over session ${this._consumerSession.sessionId} remote controller`, + error: e, + }), + ), + -1 + ); + } + } + close() { + this.attachVideoElement(null); + const e = this._rtcDataChannel; + (this._rtcDataChannel = null), + e && (e.close(), this.dispatchEvent(new Event("closed"))); + } + _sendGstNavigationEvent(e) { + let t = { type: "navigationEvent", event: e }; + this.sendControlRequest(t); + } + _computeVideoMousePosition(e) { + const t = { x: 0, y: 0 }; + if ( + !this._videoElement || + this._videoElement.videoWidth <= 0 || + this._videoElement.videoHeight <= 0 + ) + return t; + const n = parseFloat(this._videoElementComputedStyle.paddingLeft), + r = parseFloat(this._videoElementComputedStyle.paddingRight), + i = parseFloat(this._videoElementComputedStyle.paddingTop), + o = parseFloat(this._videoElementComputedStyle.paddingBottom); + if ("offsetX" in e && "offsetY" in e) + (t.x = e.offsetX - n), (t.y = e.offsetY - i); + else { + const r = this._videoElement.getBoundingClientRect(), + o = { + left: parseFloat( + this._videoElementComputedStyle.borderLeftWidth, + ), + top: parseFloat(this._videoElementComputedStyle.borderTopWidth), + }; + (t.x = e.clientX - r.left - o.left - n), + (t.y = e.clientY - r.top - o.top - i); + } + const s = { + x: this._videoElement.clientWidth - (n + r), + y: this._videoElement.clientHeight - (i + o), + }, + a = Math.min( + s.x / this._videoElement.videoWidth, + s.y / this._videoElement.videoHeight, + ); + (s.x = Math.max(0.5 * (s.x - this._videoElement.videoWidth * a), 0)), + (s.y = Math.max( + 0.5 * (s.y - this._videoElement.videoHeight * a), + 0, + )); + const c = 0 !== a ? 1 / a : 0; + return ( + (t.x = (t.x - s.x) * c), + (t.y = (t.y - s.y) * c), + (t.x = Math.min(Math.max(t.x, 0), this._videoElement.videoWidth)), + (t.y = Math.min(Math.max(t.y, 0), this._videoElement.videoHeight)), + t + ); + } + handleEvent(e) { + if (this._videoElement) + switch (e.type) { + case "wheel": + e.preventDefault(); + { + const t = this._computeVideoMousePosition(e); + this._sendGstNavigationEvent({ + event: "MouseScroll", + x: t.x, + y: t.y, + delta_x: -e.deltaX, + delta_y: -e.deltaY, + modifier_state: ge(e), + }); + } + break; + case "contextmenu": + e.preventDefault(); + break; + case "mousemove": + case "mousedown": + case "mouseup": + e.preventDefault(); + { + const t = this._computeVideoMousePosition(e), + n = { + event: me[e.type], + x: t.x, + y: t.y, + modifier_state: ge(e), + }; + "mousemove" !== e.type && + ((n.button = e.button + 1), + "mousedown" === e.type && + 0 === e.button && + this._videoElement.focus()), + this._sendGstNavigationEvent(n); + } + break; + case "touchstart": + case "touchend": + case "touchmove": + case "touchcancel": + for (const t of e.changedTouches) { + const n = this._computeVideoMousePosition(t), + r = { + event: _e[e.type], + identifier: t.identifier, + x: n.x, + y: n.y, + modifier_state: ge(e), + }; + !("force" in t) || + ("touchstart" !== e.type && "touchmove" !== e.type) || + (r.pressure = t.force), + this._sendGstNavigationEvent(r); + } + e.timeStamp > this._lastTouchEventTimestamp && + ((this._lastTouchEventTimestamp = e.timeStamp), + this._sendGstNavigationEvent({ + event: "TouchFrame", + modifier_state: ge(e), + })); + break; + case "keyup": + case "keydown": + e.preventDefault(); + { + const t = { + event: fe[e.type], + key: pe(e.key, e.code), + modifier_state: ge(e), + }; + this._sendGstNavigationEvent(t); + } + } + } + } + class ye extends ce { + constructor(e, t, n) { + super(e, t), + (this._streams = []), + (this._remoteController = null), + (this._pendingCandidates = []), + (this._mungeStereoHack = !1), + (this._offerOptions = n), + this.addEventListener("closed", () => { + (this._streams = []), + (this._pendingCandidates = []), + this._remoteController && this._remoteController.close(); + }); + } + set mungeStereoHack(e) { + "boolean" == typeof e && (this._mungeStereoHack = e); + } + get streams() { + return this._streams; + } + get remoteController() { + return this._remoteController; + } + connect() { + if (!this._comChannel || this._state === ae.closed) return !1; + if (this._state !== ae.idle) return !0; + if (this._offerOptions) + this.ensurePeerConnection(), + this._rtcPeerConnection.createDataChannel("control"), + this._rtcPeerConnection + .createOffer(this._offerOptions) + .then((e) => { + if (this._rtcPeerConnection && e) + return this._rtcPeerConnection.setLocalDescription(e); + throw new Error("cannot send local offer to WebRTC peer"); + }) + .then(() => { + if (this._rtcPeerConnection && this._comChannel) { + const e = { + type: "startSession", + peerId: this._peerId, + offer: + this._rtcPeerConnection.localDescription.toJSON().sdp, + }; + if (!this._comChannel.send(e)) + throw new Error( + "cannot send startSession message to signaling server", + ); + (this._state = ae.connecting), + this.dispatchEvent(new Event("stateChanged")); + } + }) + .catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during SDP handshake", + error: e, + }), + ), + this.close()); + }); + else { + const e = { type: "startSession", peerId: this._peerId }; + if (!this._comChannel.send(e)) + return ( + this.dispatchEvent( + new ErrorEvent("error", { + message: "cannot connect consumer session", + error: new Error( + "cannot send startSession message to signaling server", + ), + }), + ), + this.close(), + !1 + ); + (this._state = ae.connecting), + this.dispatchEvent(new Event("stateChanged")); + } + return !0; + } + onSessionStarted(e, t) { + if ( + this._peerId === e && + this._state === ae.connecting && + !this._sessionId + ) { + console.log("Session started", this._sessionId), + (this._sessionId = t); + for (const e of this._pendingCandidates) + console.log( + "Sending delayed ICE with session id", + this._sessionId, + ), + this._comChannel.send({ + type: "peer", + sessionId: this._sessionId, + ice: e.toJSON(), + }); + this._pendingCandidates = []; + } + } + ensurePeerConnection() { + if (!this._rtcPeerConnection) { + const e = new RTCPeerConnection(this._comChannel.webrtcConfig); + (this._rtcPeerConnection = e), + (e.ontrack = (t) => { + if ( + this._rtcPeerConnection === e && + t.streams && + t.streams.length > 0 + ) { + this._state === ae.connecting && + ((this._state = ae.streaming), + this.dispatchEvent(new Event("stateChanged"))); + let e = !1; + for (const n of t.streams) + this._streams.includes(n) || + (this._streams.push(n), (e = !0)); + e && this.dispatchEvent(new Event("streamsChanged")); + } + }), + (e.ondatachannel = (e) => { + const t = e.channel; + if (t && "control" === t.label) { + if (this._remoteController) { + const e = this._remoteController; + (this._remoteController = null), e.close(); + } + const e = new Ce(t, this); + (this._remoteController = e), + this.dispatchEvent(new Event("remoteControllerChanged")), + e.addEventListener("closed", () => { + this._remoteController === e && + ((this._remoteController = null), + this.dispatchEvent( + new Event("remoteControllerChanged"), + )); + }); + } + }), + (e.onicecandidate = (t) => { + this._rtcPeerConnection === e && + t.candidate && + this._comChannel && + (this._sessionId + ? (console.log( + "Sending ICE with session id", + this._sessionId, + ), + this._comChannel.send({ + type: "peer", + sessionId: this._sessionId, + ice: t.candidate.toJSON(), + })) + : this._pendingCandidates.push(t.candidate)); + }), + this.dispatchEvent(new Event("rtcPeerConnectionChanged")); + } + } + mungeStereo(e, t) { + const n = /a=fmtp:.* sprop-stereo/g; + let r = new Set(); + for (const t of e.matchAll(n)) { + const e = t[0].match(/a=fmtp:(\d+) .*/); + e && r.add(e[1]); + } + for (const e of r) { + const n = new RegExp("a=fmtp:" + e + ".*stereo"); + t.match(n) || + (t = t.replaceAll("a=fmtp:" + e, "a=fmtp:" + e + " stereo=1;")); + } + return t; + } + onSessionPeerMessage(e) { + if (this._state !== ae.closed && this._comChannel && this._sessionId) + if ((this.ensurePeerConnection(), e.sdp)) + this._offerOptions + ? this._rtcPeerConnection + .setRemoteDescription(e.sdp) + .then(() => { + console.log("done"); + }) + .catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during SDP handshake", + error: e, + }), + ), + this.close()); + }) + : this._rtcPeerConnection + .setRemoteDescription(e.sdp) + .then(() => + this._rtcPeerConnection + ? this._rtcPeerConnection.createAnswer() + : null, + ) + .then((t) => + this._rtcPeerConnection && t + ? (this._mungeStereoHack && + (t.sdp = this.mungeStereo(e.sdp.sdp, t.sdp)), + this._rtcPeerConnection.setLocalDescription(t)) + : null, + ) + .then(() => { + if (this._rtcPeerConnection && this._comChannel) { + console.log( + "Sending SDP with session id", + this._sessionId, + ); + const e = { + type: "peer", + sessionId: this._sessionId, + sdp: this._rtcPeerConnection.localDescription.toJSON(), + }; + if (!this._comChannel.send(e)) + throw new Error( + "cannot send local SDP configuration to WebRTC peer", + ); + } + }) + .catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during SDP handshake", + error: e, + }), + ), + this.close()); + }); + else { + if (!e.ice) + throw new Error( + `invalid empty peer message received from consumer session ${this._sessionId}`, + ); + { + const t = new RTCIceCandidate(e.ice); + this._rtcPeerConnection.addIceCandidate(t).catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during ICE handshake", + error: e, + }), + ), + this.close()); + }); + } + } + } + } + class ve extends ce { + constructor(e, t, n, r) { + super(e, n), (this._sessionId = t), (this._state = ae.streaming); + const i = new RTCPeerConnection(this._comChannel.webrtcConfig); + this._rtcPeerConnection = i; + for (const e of r.getTracks()) i.addTrack(e, r); + (i.onicecandidate = (e) => { + this._rtcPeerConnection === i && + e.candidate && + this._comChannel && + this._comChannel.send({ + type: "peer", + sessionId: this._sessionId, + ice: e.candidate.toJSON(), + }); + }), + this.dispatchEvent(new Event("rtcPeerConnectionChanged")), + i + .setLocalDescription() + .then(() => { + if (this._rtcPeerConnection === i && this._comChannel) { + const e = { + type: "peer", + sessionId: this._sessionId, + sdp: this._rtcPeerConnection.localDescription.toJSON(), + }; + if (!this._comChannel.send(e)) + throw new Error( + "cannot send local SDP configuration to WebRTC peer", + ); + } + }) + .catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during SDP handshake", + error: e, + }), + ), + this.close()); + }); + } + onSessionPeerMessage(e) { + if (this._state !== ae.closed && this._rtcPeerConnection) + if (e.sdp) + this._rtcPeerConnection.setRemoteDescription(e.sdp).catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during SDP handshake", + error: e, + }), + ), + this.close()); + }); + else { + if (!e.ice) + throw new Error( + `invalid empty peer message received from producer's client session ${this._peerId}`, + ); + { + const t = new RTCIceCandidate(e.ice); + this._rtcPeerConnection.addIceCandidate(t).catch((e) => { + this._state !== ae.closed && + (this.dispatchEvent( + new ErrorEvent("error", { + message: + "an unrecoverable error occurred during ICE handshake", + error: e, + }), + ), + this.close()); + }); + } + } + } + } + class be extends EventTarget { + constructor(e, t) { + super(), + (this._comChannel = e), + (this._stream = t), + (this._state = ae.idle), + (this._clientSessions = {}); + } + get stream() { + return this._stream; + } + get state() { + return this._state; + } + start() { + if (!this._comChannel || this._state === ae.closed) return !1; + if (this._state !== ae.idle) return !0; + const e = { + type: "setPeerStatus", + roles: ["listener", "producer"], + meta: this._comChannel.meta, + }; + return this._comChannel.send(e) + ? ((this._state = ae.connecting), + this.dispatchEvent(new Event("stateChanged")), + !0) + : (this.dispatchEvent( + new ErrorEvent("error", { + message: "cannot start producer session", + error: new Error( + "cannot register producer to signaling server", + ), + }), + ), + this.close(), + !1); + } + close() { + if (this._state !== ae.closed) { + for (const e of this._stream.getTracks()) e.stop(); + this._state !== ae.idle && + this._comChannel && + this._comChannel.send({ + type: "setPeerStatus", + roles: ["listener"], + meta: this._comChannel.meta, + }), + (this._state = ae.closed), + this.dispatchEvent(new Event("stateChanged")), + (this._comChannel = null), + (this._stream = null); + for (const e of Object.values(this._clientSessions)) e.close(); + (this._clientSessions = {}), + this.dispatchEvent(new Event("closed")); + } + } + onProducerRegistered() { + this._state === ae.connecting && + ((this._state = ae.streaming), + this.dispatchEvent(new Event("stateChanged"))); + } + onStartSessionMessage(e) { + if ( + this._comChannel && + this._stream && + !(e.sessionId in this._clientSessions) + ) { + const t = new ve( + e.peerId, + e.sessionId, + this._comChannel, + this._stream, + ); + (this._clientSessions[e.sessionId] = t), + t.addEventListener("closed", (e) => { + const n = e.target.sessionId; + n in this._clientSessions && + this._clientSessions[n] === t && + (delete this._clientSessions[n], + this.dispatchEvent( + new CustomEvent("clientConsumerRemoved", { detail: t }), + )); + }), + t.addEventListener("error", (e) => { + this.dispatchEvent( + new ErrorEvent("error", { + message: `error from client consumer ${e.target.peerId}: ${e.message}`, + error: e.error, + }), + ); + }), + this.dispatchEvent( + new CustomEvent("clientConsumerAdded", { detail: t }), + ); + } + } + onEndSessionMessage(e) { + e.sessionId in this._clientSessions && + this._clientSessions[e.sessionId].close(); + } + onSessionPeerMessage(e) { + e.sessionId in this._clientSessions && + this._clientSessions[e.sessionId].onSessionPeerMessage(e); + } + } + const Se = Object.freeze({ + welcome: "welcome", + peerStatusChanged: "peerStatusChanged", + list: "list", + sessionStarted: "sessionStarted", + peer: "peer", + startSession: "startSession", + endSession: "endSession", + error: "error", + }); + function ke(e, t) { + if (!e || "object" != typeof e) return null; + const n = { id: "", meta: {} }; + if (e.id && "string" == typeof e.id) n.id = e.id; + else { + if (!e.peerId || "string" != typeof e.peerId) return null; + n.id = e.peerId; + } + return n.id === t + ? null + : (e.meta && "object" == typeof e.meta && (n.meta = e.meta), + Object.freeze(n.meta), + Object.freeze(n)); + } + class Te extends EventTarget { + constructor(e, t, n) { + super(), + (this._meta = t), + (this._webrtcConfig = n), + (this._ws = new WebSocket(e)), + (this._ready = !1), + (this._channelId = ""), + (this._producerSession = null), + (this._consumerSessions = {}), + (this._ws.onerror = (e) => { + this.dispatchEvent( + new ErrorEvent("error", { + message: e.message || "WebSocket error", + error: + e.error || + new Error( + this._ready + ? "transportation error" + : "cannot connect to signaling server", + ), + }), + ), + this.close(); + }), + (this._ws.onclose = () => { + (this._ready = !1), + (this._channelId = ""), + (this._ws = null), + this.closeAllConsumerSessions(), + this._producerSession && + (this._producerSession.close(), + (this._producerSession = null)), + this.dispatchEvent(new Event("closed")); + }), + (this._ws.onmessage = (e) => { + try { + const n = JSON.parse(e.data); + if (n && "object" == typeof n) + switch (n.type) { + case Se.welcome: + this._channelId = n.peerId; + try { + this._ws.send( + JSON.stringify({ + type: "setPeerStatus", + roles: ["listener"], + meta: t, + }), + ); + } catch (e) { + this.dispatchEvent( + new ErrorEvent("error", { + message: + "cannot initialize connection to signaling server", + error: e, + }), + ), + this.close(); + } + break; + case Se.peerStatusChanged: + if (n.peerId === this._channelId) + !this._ready && + n.roles.includes("listener") && + ((this._ready = !0), + this.dispatchEvent(new Event("ready")), + this.send({ type: "list" })), + this._producerSession && + n.roles.includes("producer") && + this._producerSession.onProducerRegistered(); + else { + const e = ke(n, this._channelId); + e && + (n.roles.includes("producer") + ? this.dispatchEvent( + new CustomEvent("producerAdded", { detail: e }), + ) + : this.dispatchEvent( + new CustomEvent("producerRemoved", { + detail: e, + }), + )); + } + break; + case Se.list: + for (const e of n.producers) { + const t = ke(e, this._channelId); + t && + this.dispatchEvent( + new CustomEvent("producerAdded", { detail: t }), + ); + } + break; + case Se.sessionStarted: + { + const e = this.getConsumerSession(n.peerId); + e && + (delete this._consumerSessions[n.peerId], + e.onSessionStarted(n.peerId, n.sessionId), + e.sessionId && + !(e.sessionId in this._consumerSessions) + ? (this._consumerSessions[e.sessionId] = e) + : e.close()); + } + break; + case Se.peer: + { + const e = this.getConsumerSession(n.sessionId); + e + ? e.onSessionPeerMessage(n) + : this._producerSession && + this._producerSession.onSessionPeerMessage(n); + } + break; + case Se.startSession: + this._producerSession && + this._producerSession.onStartSessionMessage(n); + break; + case Se.endSession: + { + const e = this.getConsumerSession(n.sessionId); + e + ? e.close() + : this._producerSession && + this._producerSession.onEndSessionMessage(n); + } + break; + case Se.error: + this.dispatchEvent( + new ErrorEvent("error", { + message: "error received from signaling server", + error: new Error(n.details), + }), + ); + break; + default: + throw new Error(`unknown message type: "${n.type}"`); + } + } catch (e) { + this.dispatchEvent( + new ErrorEvent("error", { + message: + "cannot parse incoming message from signaling server", + error: e, + }), + ); + } + }); + } + get meta() { + return this._meta; + } + get webrtcConfig() { + return this._webrtcConfig; + } + get ready() { + return this._ready; + } + get channelId() { + return this._channelId; + } + get producerSession() { + return this._producerSession; + } + createProducerSession(e) { + if (!(this._ready && e instanceof MediaStream)) return null; + if (this._producerSession) + return this._producerSession.stream === e + ? this._producerSession + : null; + const t = new be(this, e); + return ( + (this._producerSession = t), + t.addEventListener("closed", () => { + this._producerSession === t && (this._producerSession = null); + }), + t + ); + } + createConsumerSession(e, t) { + if (!this._ready || !e || "string" != typeof e) return null; + if ( + (t && "object" != typeof t && (t = void 0), + e in this._consumerSessions) + ) + return this._consumerSessions[e]; + for (const t of Object.values(this._consumerSessions)) + if (t.peerId === e) return t; + const n = new ye(e, this, t); + return ( + (this._consumerSessions[e] = n), + n.addEventListener("closed", (e) => { + let t = e.target.sessionId; + t || (t = e.target.peerId), + t in this._consumerSessions && + this._consumerSessions[t] === n && + delete this._consumerSessions[t]; + }), + n + ); + } + getConsumerSession(e) { + return e in this._consumerSessions ? this._consumerSessions[e] : null; + } + closeAllConsumerSessions() { + for (const e of Object.values(this._consumerSessions)) e.close(); + this._consumerSessions = {}; + } + send(e) { + if (this._ready && e && "object" == typeof e) + try { + return this._ws.send(JSON.stringify(e)), !0; + } catch (e) { + this.dispatchEvent( + new ErrorEvent("error", { + message: "cannot send message to signaling server", + error: e, + }), + ); + } + return !1; + } + close() { + this._ws && + ((this._ready = !1), + (this._channelId = ""), + this._ws.close(), + this.closeAllConsumerSessions(), + this._producerSession && + (this._producerSession.close(), (this._producerSession = null))); + } + } + class Ee { + constructor(e) { + (this._channel = null), + (this._producers = {}), + (this._connectionListeners = []), + (this._producersListeners = []); + const t = Object.assign({}, se); + e && "object" == typeof e && Object.assign(t, e), + "object" != typeof t.meta && (t.meta = null), + (this._config = t), + this.connectChannel(); + } + registerConnectionListener(e) { + return ( + !( + !e || + "object" != typeof e || + "function" != typeof e.connected || + "function" != typeof e.disconnected + ) && + (this._connectionListeners.includes(e) || + this._connectionListeners.push(e), + !0) + ); + } + unregisterConnectionListener(e) { + const t = this._connectionListeners.indexOf(e); + return t >= 0 && (this._connectionListeners.splice(t, 1), !0); + } + unregisterAllConnectionListeners() { + this._connectionListeners = []; + } + createProducerSession(e) { + return this._channel ? this._channel.createProducerSession(e) : null; + } + getAvailableProducers() { + return Object.values(this._producers); + } + registerProducersListener(e) { + return ( + !( + !e || + "object" != typeof e || + "function" != typeof e.producerAdded || + "function" != typeof e.producerRemoved + ) && + (this._producersListeners.includes(e) || + this._producersListeners.push(e), + !0) + ); + } + unregisterProducersListener(e) { + const t = this._producersListeners.indexOf(e); + return t >= 0 && (this._producersListeners.splice(t, 1), !0); + } + unregisterAllProducersListeners() { + this._producersListeners = []; + } + createConsumerSession(e) { + return this._channel ? this._channel.createConsumerSession(e) : null; + } + createConsumerSessionWithOfferOptions(e, t) { + return this._channel + ? this._channel.createConsumerSession(e, t) + : null; + } + connectChannel() { + if (this._channel) { + const e = this._channel; + (this._channel = null), e.close(); + for (const e in this._producers) this.triggerProducerRemoved(e); + (this._producers = {}), this.triggerDisconnected(); + } + (this._channel = new Te( + this._config.signalingServerUrl, + this._config.meta, + this._config.webrtcConfig, + )), + this._channel.addEventListener("error", (e) => { + e.target === this._channel && console.error(e.message, e.error); + }), + this._channel.addEventListener("closed", (e) => { + if (e.target === this._channel) { + this._channel = null; + for (const e in this._producers) this.triggerProducerRemoved(e); + (this._producers = {}), + this.triggerDisconnected(), + this._config.reconnectionTimeout > 0 && + window.setTimeout(() => { + this.connectChannel(); + }, this._config.reconnectionTimeout); + } + }), + this._channel.addEventListener("ready", (e) => { + e.target === this._channel && + this.triggerConnected(this._channel.channelId); + }), + this._channel.addEventListener("producerAdded", (e) => { + e.target === this._channel && this.triggerProducerAdded(e.detail); + }), + this._channel.addEventListener("producerRemoved", (e) => { + e.target === this._channel && + this.triggerProducerRemoved(e.detail.id); + }); + } + triggerConnected(e) { + for (const t of this._connectionListeners) + try { + t.connected(e); + } catch (e) { + console.error( + "a listener callback should not throw any exception", + e, + ); + } + } + triggerDisconnected() { + for (const e of this._connectionListeners) + try { + e.disconnected(); + } catch (e) { + console.error( + "a listener callback should not throw any exception", + e, + ); + } + } + triggerProducerAdded(e) { + if (!(e.id in this._producers)) { + this._producers[e.id] = e; + for (const t of this._producersListeners) + try { + t.producerAdded(e); + } catch (e) { + console.error( + "a listener callback should not throw any exception", + e, + ); + } + } + } + triggerProducerRemoved(e) { + if (e in this._producers) { + const t = this._producers[e]; + delete this._producers[e]; + for (const e of this._producersListeners) + try { + e.producerRemoved(t); + } catch (e) { + console.error( + "a listener callback should not throw any exception", + e, + ); + } + } + } + } + (Ee.SessionState = ae), window.GstWebRTCAPI || (window.GstWebRTCAPI = Ee); + })(); +})(); +//# sourceMappingURL=gstwebrtc-api-2.0.0.min.js.map diff --git a/components.json b/components.json index 7874e8d..c8ffe69 100644 --- a/components.json +++ b/components.json @@ -17,4 +17,4 @@ "lib": "@/lib", "hooks": "@/hooks" } -} \ No newline at end of file +} diff --git a/index.html b/index.html index 2040c55..8330c35 100644 --- a/index.html +++ b/index.html @@ -1,124 +1,207 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if (sprigConsent) { + (function (l, e, a, p) { + if (window.Sprig) return; + window.Sprig = function () { + S._queue.push(arguments); + }; + var S = window.Sprig; + S.appId = "bHT8PZvMNWLZ"; + S._queue = []; + window.UserLeap = S; + a = l.createElement("script"); + a.async = 1; + a.src = e + "?id=" + S.appId; + p = l.getElementsByTagName("script")[0]; + p.parentNode.insertBefore(a, p); + })(document, "https://cdn.sprig.com/shim.js"); + } - - - - - - - - - - - - - - - - K-Scale - - - -
- - + + + K-Scale + + +
+ + diff --git a/src/App.css b/src/App.css index cdb91d2..57e6390 100644 --- a/src/App.css +++ b/src/App.css @@ -13,19 +13,17 @@ /* font-weight: bold;*/ /* font-style: normal;*/ /*}*/ - /*@font-face {*/ /* font-family: "KMR Apparat";*/ /* src: url("/assets/fonts/trial/KMR-Apparat-Medium.woff") format("woff");*/ /* font-weight: 500;*/ /* font-style: normal;*/ /*}*/ - @font-face { font-family: "GT Planar"; src: - url("/assets/fonts/GT-Planar-Regular.woff") format("woff"), - url("/assets/fonts/GT-Planar-Regular.woff2") format("woff2"); + url("/assets/fonts/GT-Planar-Regular.woff") format("woff"), + url("/assets/fonts/GT-Planar-Regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } @@ -33,150 +31,261 @@ @font-face { font-family: "CoFo Sans Mono", monospace, monospace; src: - url("/assets/fonts/CoFoSansMono-Regular.woff") format("woff"), - url("/assets/fonts/CoFoSansMono-Regular.woff2") format("woff2"); + url("/assets/fonts/CoFoSansMono-Regular.woff") format("woff"), + url("/assets/fonts/CoFoSansMono-Regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } - :root { - --background: #f8f4f2; - --foreground: #120e15; - --off-var(--foreground): #f8f4f2; - --off-var(--background): #120e15; - --accent-aubergine: #7d0d8c; - --accent-dragonfruit: #b90674; - --accent-apple: #c90e33; - --accent-blood-orange: #fa4300; - --accent-tangerine: #ff9000; - --accent-butter: #f2f091; + --background: #f8f4f2ff; + --foreground: #120e15ff; + --logotype: #120e15ff; + --background-0: #f8f4f200; + --foreground-60: #120e159a; + --foreground-70: #120e15b3; + --filament-60: #f8f4f29a; + --filament-70: #f8f4f2b3; + --filament: #f8f4f2ff; + --carbon: #120e15ff; + --carbon-50: #120e1580; + --carbon-0: #120e1500; + --methyl: #7d0d8cff; + --plasma: #b90674ff; + --oxide: #c90e33ff; + --rust: #fa4300ff; + --molten: #ff9000ff; + --sol: #f2f091ff; + --grab: url("/assets/cursor/grab.svg"), grab; + --grabbing: url("/assets/cursor/grabbing.svg"), grabbing; + --pointer: url("/assets/cursor/pointer.svg"), pointer; } @media (prefers-color-scheme: dark) { :root { - --background: #0f0f10; - --foreground: #ede6e1; - --off-var(--background): #0f0f10; - --off-var(--foreground): #ede6e1; - --accent-aubergine: #771584; - --accent-dragonfruit: #a81770; - --accent-apple: #98253c; - --accent-blood-orange: #de4208; - --accent-tangerine: #f18a03; - --accent-butter: #eae9bc; + --background: #0f0f10ff; + --foreground: #ede6e1ff; + --logotype: #de4208ff; + --background-0: #0f0f1000; + --foreground-60: #ede6e180; + --foreground-70: #ede6e1b3; + --filament-60: #ede6e180; + --filament-70: #ede6e1b3; + --carbon: #0f0f10ff; + --carbon-50: #0f0f1080; + --carbon-0: #0f0f1000; + --filament: #ede6e1ff; + --methyl: #771584ff; + --plasma: #a81770ff; + --oxide: #98253cff; + --rust: #de4208ff; + --molten: #f18a03ff; + --sol: #eae9bcff; + --grab: url("/assets/cursor/grab_dark.svg"), grab; + --grabbing: url("/assets/cursor/grabbing_dark.svg"), grabbing; + --pointer: url("/assets/cursor/pointer_dark.svg"), pointer; } } -} -*::selection { - background: var(--foreground); - color: var(--background); -} + *::selection { + background: var(--foreground); + color: var(--background); + } -:root { - --radius: 0.5rem; - --font-mono: monospace; -} + :root { + --radius: 0.5rem; + --font-mono: monospace; + } -body { - background-color: var(--background); - color: var(--foreground); - margin: 0; - padding: 0; - font-family: var(--font-mono); -} + body { + background-color: var(--background); + color: var(--foreground); + margin: 0; + padding: 0; + font-family: var(--font-mono); + } -.container { - padding: 1em; - max-width: 100em; - border: 1px solid var(--foreground); - border-radius: 3px; - margin: 0 auto; - box-sizing: border-box; -} + .container { + padding: 1em; + max-width: 100em; + border: 1px solid var(--foreground); + border-radius: 3px; + margin: 0 auto; + box-sizing: border-box; + } -a { - color: var(--foreground); - text-decoration: none; - padding: 0.3em 0.6em; - border: 1px solid #333; - border-radius: 3px; - margin: 0.2em; - display: inline-block; - transition: border-color 0.2s; -} + a { + color: var(--foreground); + text-decoration: none; + padding: 0.3em 0.6em; + border: 1px solid #333; + border-radius: 3px; + margin: 0.2em; + display: inline-block; + transition: border-color 0.2s; + } -a:hover { - border-color: var(--foreground); -} + a:hover { + border-color: var(--foreground); + } -.content { - margin-top: 16px; - margin-bottom: 56px; -} + .content { + margin-top: 16px; + margin-bottom: 56px; + } -canvas { - width: 100%; - height: auto; - touch-action: none; - border: 1px solid #333; - border-radius: 3px; -} + canvas { + width: 100%; + height: auto; + touch-action: none; + border: 1px solid #333; + border-radius: 3px; + } -form { - max-width: 500px; - margin: 0 auto; -} + form { + max-width: 500px; + margin: 0 auto; + } -form textarea { - height: 10rem; - background: var(--background); - color: var(--foreground); - border: 1px solid #333; - font-family: var(--font-mono); -} + form textarea { + height: 10rem; + background: var(--background); + color: var(--foreground); + border: 1px solid #333; + font-family: var(--font-mono); + } -form button { - width: 100%; - background: var(--background); - color: var(--foreground); - border: 1px solid #333; - padding: 0.5em; - font-family: var(--font-mono); - cursor: pointer; -} + form button { + width: 100%; + background: var(--background); + color: var(--foreground); + border: 1px solid #333; + padding: 0.5em; + font-family: var(--font-mono); + cursor: pointer; + } -form button:hover { - border-color: var(--foreground); -} + form button:hover { + border-color: var(--foreground); + } -.card { - background: var(--background); - border: 1px solid #333; - border-radius: 3px; - padding: 1em; - margin: 1em 0; -} + .card { + background: var(--background); + border: 1px solid #333; + border-radius: 3px; + padding: 1em; + margin: 1em 0; + } -.card:hover { - border-color: var(--foreground); -} + .card:hover { + border-color: var(--foreground); + } -@media (max-width: 600px) { - .about-section { - font-size: 0.9em; + @media (max-width: 600px) { + .about-section { + font-size: 0.9em; + } + + .container { + padding: 0.5em; + } } - .container { - padding: 0.5em; + @layer base { + * { + @apply border-[#333]; + } + + body { + @apply bg-background text-foreground; + } } -} -@layer base { - * { - @apply border-[#333]; + /*CURSOR*/ + *::selection { + @apply bg-rust text-background; } - body { - @apply bg-background text-foreground; + + @media (pointer: fine) and (prefers-color-scheme: light) { + body { + cursor: url("/assets/cursor/default.svg"), auto; + } + + h1, + h2, + h3, + h4, + h5, + h6, + span, + text, + code, + blockquote, + label, + li, + p { + cursor: url("/assets/cursor/text.svg"), text; + } + + button, + button *, + a, + a *, + input, + input *, + label, + label *, + .pointer { + cursor: url("/assets/cursor/pointer.svg"), pointer; + } + + .grab { + cursor: url("/assets/cursor/grab.svg"), grab; + } + + .grab:active { + cursor: url("/assets/cursor/grabbing.svg"), grabbing; + } + } + + @media (pointer: fine) and (prefers-color-scheme: dark) { + body { + cursor: url("/assets/cursor/default_dark.svg"), auto; + } + + h1, + h2, + h3, + h4, + h5, + h6, + span, + text, + code, + blockquote, + label, + li, + p { + cursor: url("/assets/cursor/text_dark.svg"), text; + } + + button, + button *, + a, + a *, + input, + input *, + label, + label *, + .pointer { + cursor: url("/assets/cursor/pointer_dark.svg"), pointer; + } + + .grab { + cursor: url("/assets/cursor/grab_dark.svg"), grab; + } + + .grab:active { + cursor: url("/assets/cursor/grabbing_dark.svg"), grabbing; + } } } diff --git a/src/App.tsx b/src/App.tsx index 7d3305b..431de20 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,7 @@ import "@/App.css"; import NotFoundRedirect from "@/components/NotFoundRedirect"; import PendoInitializer from "@/components/PendoInitializer"; +import ProtectedRoute from "@/components/ProtectedRoute"; import { ScrollToTop } from "@/components/ScrollToTop"; import SprigInitializer from "@/components/SprigInitializer"; import Footer from "@/components/footer/Footer"; @@ -33,7 +34,6 @@ import TermsOfService from "@/components/pages/TermsOfService"; import { AlertQueue, AlertQueueProvider } from "@/hooks/useAlertQueue"; import { AuthenticationProvider } from "@/hooks/useAuth"; import ROUTES from "@/lib/types/routes"; -import ProtectedRoute from "@/components/ProtectedRoute"; const App = () => { return ( @@ -54,7 +54,10 @@ const App = () => { {/* Public routes */} } /> } /> - } /> + } + /> {/* Protected routes */} { /> {/* General pages */} - - } - /> + } /> } diff --git a/src/components/ProtectedRoute.tsx b/src/components/ProtectedRoute.tsx index e0e1f60..b332f4a 100644 --- a/src/components/ProtectedRoute.tsx +++ b/src/components/ProtectedRoute.tsx @@ -1,7 +1,8 @@ import { Navigate, useLocation } from "react-router-dom"; + +import { useFeaturedListings } from "@/components/listing/FeaturedListings"; import { useAuthentication } from "@/hooks/useAuth"; import ROUTES from "@/lib/types/routes"; -import { useFeaturedListings } from "@/components/listing/FeaturedListings"; interface ProtectedRouteProps { children: React.ReactNode; @@ -18,16 +19,18 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => { ROUTES.SIGNUP.EMAIL.path, ] as const; - if (publicPaths.some(path => location.pathname === path)) { + if (publicPaths.some((path) => location.pathname === path)) { return <>{children}; } - if (location.pathname.includes('/bots/browse') && !isAuthenticated) { - return ; + if (location.pathname.includes("/bots/browse") && !isAuthenticated) { + return ( + + ); } - if (location.pathname.startsWith('/bot/')) { - const isFeaturedListing = featuredListings?.some(listing => { + if (location.pathname.startsWith("/bot/")) { + const isFeaturedListing = featuredListings?.some((listing) => { const listingPath = ROUTES.BOT.buildPath({ username: listing.username, slug: listing.slug || "", @@ -36,10 +39,14 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => { }); if (!isAuthenticated && !isFeaturedListing) { - return ; + return ( + + ); } } else if (!isAuthenticated) { - return ; + return ( + + ); } return <>{children}; diff --git a/src/components/auth/AuthBlock.tsx b/src/components/auth/AuthBlock.tsx index 5a54a6a..aab515d 100644 --- a/src/components/auth/AuthBlock.tsx +++ b/src/components/auth/AuthBlock.tsx @@ -85,9 +85,9 @@ export const AuthBlockInner: React.FC<{ initialSignup?: boolean }> = ({ ))}
- {isAuthenticated && navItems.map((item) => - item.isExternal ? ( - - {item.name} - - ) : ( - - {item.name} - - ), - )} + {isAuthenticated && + navItems.map((item) => + item.isExternal ? ( + + {item.name} + + ) : ( + + {item.name} + + ), + )}
{isAuthenticated ? ( diff --git a/src/components/nav/Sidebar.tsx b/src/components/nav/Sidebar.tsx index 43049e8..6aa1923 100644 --- a/src/components/nav/Sidebar.tsx +++ b/src/components/nav/Sidebar.tsx @@ -55,8 +55,8 @@ const Sidebar = ({ show, onClose }: SidebarProps) => { } }; - const filteredNavItems = navItems.filter(item => { - if (!isAuthenticated && item.path.includes('/bots/browse')) { + const filteredNavItems = navItems.filter((item) => { + if (!isAuthenticated && item.path.includes("/bots/browse")) { return false; } return true; @@ -95,7 +95,9 @@ const Sidebar = ({ show, onClose }: SidebarProps) => { } /> ))} - {hasNavItems &&
} + {hasNavItems && ( +
+ )}
)} {hasNavItems && ( diff --git a/src/components/pages/Browse.tsx b/src/components/pages/Browse.tsx index 11e62fa..af1244d 100644 --- a/src/components/pages/Browse.tsx +++ b/src/components/pages/Browse.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from "react"; import { FaTimes } from "react-icons/fa"; -import { useSearchParams, useNavigate } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router-dom"; import ListingGrid from "@/components/listings/ListingGrid"; import { Input } from "@/components/ui/Input/Input"; @@ -17,9 +17,8 @@ import { import { components, paths } from "@/gen/api"; import { useAlertQueue } from "@/hooks/useAlertQueue"; import { useAuthentication } from "@/hooks/useAuth"; -import { useDebounce } from "@uidotdev/usehooks"; import ROUTES from "@/lib/types/routes"; - +import { useDebounce } from "@uidotdev/usehooks"; type SortOption = components["schemas"]["SortOption"]; diff --git a/src/components/pages/Profile.tsx b/src/components/pages/Profile.tsx index 7d29c2c..4c67781 100644 --- a/src/components/pages/Profile.tsx +++ b/src/components/pages/Profile.tsx @@ -297,7 +297,10 @@ export const RenderProfile = (props: RenderProfileProps) => { value === "own" ? "border text-gray-12" : "" }`} > - + {getListingsTabLabel()} @@ -309,7 +312,10 @@ export const RenderProfile = (props: RenderProfileProps) => { value === "upvoted" ? "border text-gray-12" : "" }`} > - + Upvoted Robots diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 2d8874b..fee940c 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -14,8 +14,10 @@ const buttonVariants = cva( selected: "bg-background text-foreground border border-foreground", destructive: "bg-destructive text-foreground shadow-sm hover:bg-destructive/90", - outline: "border border-foreground bg-background text-foreground hover:bg-accent-blood-orange", - ghost: "text-foreground border border-transparent hover:border-foreground ", + outline: + "border border-foreground bg-background text-foreground hover:bg-accent-blood-orange", + ghost: + "text-foreground border border-transparent hover:border-foreground ", link: "text-foreground underline-offset-4 hover:underline", }, size: { diff --git a/tailwind.config.js b/tailwind.config.js index 7cf6d23..5eb4558 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,140 +2,145 @@ import animate from "tailwindcss-animate"; /** @type {import('tailwindcss').Config} */ export default { - darkMode: ["class"], - content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], - theme: { - fontFamily: { - planar: ["GT Planar", "sans-serif"], - mono: ["Cofo Sans Mono", "monospace"], - sans: ["Inter", "sans-serif"], - orbitron: ["Orbitron", "sans-serif"], + darkMode: ["class"], + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + cursor: { + pointer: "var(--pointer)", + grab: "var(--grab)", + grabbing: "var(--grabbing)", + }, + fontFamily: { + planar: ["GT Planar", "sans-serif"], + mono: ["Cofo Sans Mono", "monospace"], + sans: ["Inter", "sans-serif"], + orbitron: ["Orbitron", "sans-serif"], + }, + extend: { + animation: { + meteor: "meteor 5s linear infinite", + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + keyframes: { + meteor: { + "0%": { + transform: "rotate(215deg) translateX(0)", + opacity: "1", + }, + "70%": { + opacity: "1", + }, + "100%": { + transform: "rotate(215deg) translateX(-500px)", + opacity: "0", + }, }, - extend: { - animation: { - meteor: "meteor 5s linear infinite", - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", - }, - keyframes: { - meteor: { - "0%": { - transform: "rotate(215deg) translateX(0)", - opacity: "1", - }, - "70%": { - opacity: "1", - }, - "100%": { - transform: "rotate(215deg) translateX(-500px)", - opacity: "0", - }, - }, - "accordion-down": { - from: { - height: "0", - }, - to: { - height: "var(--radix-accordion-content-height)", - }, - }, - "accordion-up": { - from: { - height: "var(--radix-accordion-content-height)", - }, - to: { - height: "0", - }, - }, - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", - }, - colors: { - gray: { - 1: "#ffffff", - 2: "#f9f9fb", - 3: "#eff0f3", - 4: "#e7e8ec", - 5: "#e0e1e6", - 6: "#d8d9e0", - 7: "#cdced7", - 8: "#b9bbc6", - 9: "#8b8d98", - 10: "#80828d", - 11: "#62636c", - 12: "#000000", - }, - primary: { - 1: "#fefcfb", - 2: "#fff5f1", - 3: "#ffe8de", - 4: "#ffd7c7", - 5: "#ffc9b4", - 6: "#ffb89f", - 7: "#ffa284", - 8: "#fb8765", - 9: "#ffffff", - 10: "#f14000", - 11: "#de3500", - 12: "#000000", - DEFAULT: "#ff4f00", - foreground: "#000000", - }, - background: "var(--background)", - foreground: "var(--foreground)", - card: { - DEFAULT: "var(--background)", - foreground: "var(--foreground)", - }, - popover: { - DEFAULT: "var(--background)", - foreground: "var(--foreground)", - }, - secondary: { - DEFAULT: "var(--background)", - foreground: "var(--foreground)", - }, - muted: { - DEFAULT: "var(--background)", - foreground: "var(--foreground)", - }, - accent: { - DEFAULT: "var(--background)", - foreground: "var(--foreground)", - }, - destructive: { - DEFAULT: "var(--accent-blood-orange)", - foreground: "var(--foreground)", - }, - border: "var(--foreground)", - input: "var(--background)", - ring: "var(--foreground)", - chart: { - 1: "rgb(59, 130, 246)", - 2: "rgb(16, 185, 129)", - 3: "rgb(251, 146, 60)", - 4: "rgb(147, 51, 234)", - 5: "rgb(236, 72, 153)", - }, - "off-white": "var(--off-white)", - "off-black": "var(--off-black)", - "accent-aubergine": "var(--accent-aubergine)", - "accent-dragonfruit": "var(--accent-dragonfruit)", - "accent-apple": "var(--accent-apple)", - "accent-blood-orange": "var(--accent-blood-orange)", - "accent-tangerine": "var(--accent-tangerine)", - "accent-butter": "var(--accent-butter)", - }, + "accordion-down": { + from: { + height: "0", + }, + to: { + height: "var(--radix-accordion-content-height)", + }, }, - }, - plugins: [animate], - base: { - "html, body": { - color: "var(--foreground)", - backgroundColor: "var(--background)", + "accordion-up": { + from: { + height: "var(--radix-accordion-content-height)", + }, + to: { + height: "0", + }, + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + colors: { + gray: { + 1: "#ffffff", + 2: "#f9f9fb", + 3: "#eff0f3", + 4: "#e7e8ec", + 5: "#e0e1e6", + 6: "#d8d9e0", + 7: "#cdced7", + 8: "#b9bbc6", + 9: "#8b8d98", + 10: "#80828d", + 11: "#62636c", + 12: "#000000", + }, + primary: { + 1: "#fefcfb", + 2: "#fff5f1", + 3: "#ffe8de", + 4: "#ffd7c7", + 5: "#ffc9b4", + 6: "#ffb89f", + 7: "#ffa284", + 8: "#fb8765", + 9: "#ffffff", + 10: "#f14000", + 11: "#de3500", + 12: "#000000", + DEFAULT: "#ff4f00", + foreground: "#000000", + }, + background: "var(--background)", + foreground: "var(--foreground)", + card: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + popover: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", }, + secondary: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + muted: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + accent: { + DEFAULT: "var(--background)", + foreground: "var(--foreground)", + }, + destructive: { + DEFAULT: "var(--accent-blood-orange)", + foreground: "var(--foreground)", + }, + border: "var(--foreground)", + input: "var(--background)", + ring: "var(--foreground)", + chart: { + 1: "rgb(59, 130, 246)", + 2: "rgb(16, 185, 129)", + 3: "rgb(251, 146, 60)", + 4: "rgb(147, 51, 234)", + 5: "rgb(236, 72, 153)", + }, + filament: "var(--filament)", + carbon: "var(--carbon)", + methyl: "var(--methyl)", + plasma: "var(--plasma)", + oxide: "var(--oxide)", + rust: "var(--rust)", + molten: "var(--molten)", + sol: "var(--sol)", + }, + }, + }, + plugins: [animate], + base: { + "html, body": { + color: "var(--foreground)", + backgroundColor: "var(--background)", }, + }, }; diff --git a/tsconfig.app.json b/tsconfig.app.json index e286804..abe04df 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -2,9 +2,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] } } } From f53c4f6a76ab6e4252cd64639fb3539fee98879e Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 22:55:06 -0800 Subject: [PATCH 10/28] nav and footer update --- package.json | 1 + src/App.css | 54 ++++- src/App.tsx | 11 +- src/components/footer/Footer.tsx | 136 ----------- src/components/footer/SocialLink.tsx | 46 ---- src/components/footer/SocialMediaItem.tsx | 34 +++ src/components/footer/footer.tsx | 213 ++++++++++++++++++ src/components/footer/socialMediaSvgs.tsx | 175 ++++++++++++++ src/components/logotypes/footerLogotype.tsx | 67 ++++++ src/components/logotypes/logotype.tsx | 75 ++++++ src/components/nav/NavButton.tsx | 52 ----- src/components/nav/Navbar.tsx | 144 ------------ src/components/nav/Sidebar.tsx | 147 ------------ src/components/nav/navigation.tsx | 47 ---- src/components/navbar/burgerMenu.tsx | 48 ++++ src/components/navbar/burgerOpenButton.tsx | 66 ++++++ src/components/navbar/navButtons.tsx | 40 ++++ src/components/navbar/navbar.tsx | 98 ++++++++ src/components/ui/CTAButtons.tsx | 179 +++++++++++++++ src/components/ui/iconography/Iconography.tsx | 85 +++++++ .../ui/iconography/ResearchIcons.tsx | 159 +++++++++++++ src/components/util/constants.tsx | 63 ++++++ src/components/util/functions.tsx | 91 ++++++++ src/components/util/interfaces.tsx | 22 ++ 24 files changed, 1475 insertions(+), 578 deletions(-) delete mode 100644 src/components/footer/Footer.tsx delete mode 100644 src/components/footer/SocialLink.tsx create mode 100644 src/components/footer/SocialMediaItem.tsx create mode 100644 src/components/footer/footer.tsx create mode 100644 src/components/footer/socialMediaSvgs.tsx create mode 100644 src/components/logotypes/footerLogotype.tsx create mode 100644 src/components/logotypes/logotype.tsx delete mode 100644 src/components/nav/NavButton.tsx delete mode 100644 src/components/nav/Navbar.tsx delete mode 100644 src/components/nav/Sidebar.tsx delete mode 100644 src/components/nav/navigation.tsx create mode 100644 src/components/navbar/burgerMenu.tsx create mode 100644 src/components/navbar/burgerOpenButton.tsx create mode 100644 src/components/navbar/navButtons.tsx create mode 100644 src/components/navbar/navbar.tsx create mode 100644 src/components/ui/CTAButtons.tsx create mode 100644 src/components/ui/iconography/Iconography.tsx create mode 100644 src/components/ui/iconography/ResearchIcons.tsx create mode 100644 src/components/util/constants.tsx create mode 100644 src/components/util/functions.tsx create mode 100644 src/components/util/interfaces.tsx diff --git a/package.json b/package.json index 1b6ad81..256e2a5 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "hamburger-react": "^2.5.1", "leva": "^0.9.35", "lucide-react": "^0.424.0", + "motion": "^11.14.4", "onnxruntime-web": "^1.19.2", "openapi-fetch": "^0.10.5", "pako": "^2.1.0", diff --git a/src/App.css b/src/App.css index 57e6390..79abb16 100644 --- a/src/App.css +++ b/src/App.css @@ -86,9 +86,28 @@ } } - *::selection { - background: var(--foreground); - color: var(--background); + nav, footer { + display: grid; + grid-template-columns: repeat(4, 1fr); + padding: 0 5vw; + } + + @media (min-width: 640px) { + nav, footer { + grid-template-columns: repeat(6, 1fr); + } + } + + @media (min-width: 768px) { + nav, footer { + grid-template-columns: repeat(9, 1fr); + } + } + + @media (min-width: 1440px) { + nav, footer { + grid-template-columns: repeat(12, 1fr); + } } :root { @@ -289,3 +308,32 @@ } } } + +.scroll-lock { + overflow: hidden; + height: 100vh; /* Prevents resizing quirks */ +} + +.grid-a { + @apply px-[5vw] grid grid-cols-4 sm:grid-cols-6 md:grid-cols-9 2xl:grid-cols-12 gap-x-[5vw] sm:gap-x-[2.5vw] 2xl:gap-x-[1.25vw]; +} + +.grid-m { + @apply grid-a auto-rows-min; +} + +nav a { + border : none; + color: var(--background); + padding: 0; + margin: 0; +} + + +footer a { + border : none; + color: var(--background); + padding: 0; + margin: 0; +} + diff --git a/src/App.tsx b/src/App.tsx index 431de20..0551718 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,16 +1,19 @@ import { Route, BrowserRouter as Router, Routes } from "react-router-dom"; + + import "@/App.css"; + + import NotFoundRedirect from "@/components/NotFoundRedirect"; import PendoInitializer from "@/components/PendoInitializer"; import ProtectedRoute from "@/components/ProtectedRoute"; import { ScrollToTop } from "@/components/ScrollToTop"; import SprigInitializer from "@/components/SprigInitializer"; -import Footer from "@/components/footer/Footer"; import GDPRBanner from "@/components/gdpr/gdprbanner"; import { FeaturedListingsProvider } from "@/components/listing/FeaturedListings"; -import Navbar from "@/components/nav/Navbar"; +import NavBar from "@/components/navbar/navbar"; import APIKeys from "@/components/pages/APIKeys"; import About from "@/components/pages/About"; import Account from "@/components/pages/Account"; @@ -34,6 +37,8 @@ import TermsOfService from "@/components/pages/TermsOfService"; import { AlertQueue, AlertQueueProvider } from "@/hooks/useAlertQueue"; import { AuthenticationProvider } from "@/hooks/useAuth"; import ROUTES from "@/lib/types/routes"; +import Footer from "@/components/footer/footer"; + const App = () => { return ( @@ -44,7 +49,7 @@ const App = () => {
- + {NavBar()} diff --git a/src/components/footer/Footer.tsx b/src/components/footer/Footer.tsx deleted file mode 100644 index 30513c9..0000000 --- a/src/components/footer/Footer.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { FaDiscord, FaGithub, FaLinkedinIn } from "react-icons/fa"; -import { FaXTwitter } from "react-icons/fa6"; -import { Link, useLocation } from "react-router-dom"; - -import Logo from "@/components/Logo"; -import SocialLink from "@/components/footer/SocialLink"; -import ROUTES from "@/lib/types/routes"; - -const Footer = () => { - const location = useLocation(); - const { pathname } = location; - - // Show/hide footer based on pathname - const showFooter = - pathname?.startsWith("/browse") === false && - pathname?.startsWith("/login") === false && - pathname?.startsWith("/item") === false && - pathname?.startsWith("/create") === false && - pathname?.startsWith("/signup") === false && - pathname?.startsWith("/terminal") === false; - - if (!showFooter) { - return null; - } - - return ( - - ); -}; - -export default Footer; diff --git a/src/components/footer/SocialLink.tsx b/src/components/footer/SocialLink.tsx deleted file mode 100644 index 6ac7643..0000000 --- a/src/components/footer/SocialLink.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { FC, ReactNode } from "react"; - -interface SocialLinkProps { - href: string; - ariaLabel: string; - bgColor?: string; - ringColor: string; - children: ReactNode; // social link icon - className?: string; -} - -const SocialLink: FC = ({ - href, - ariaLabel, - bgColor, - ringColor, - children, - className, -}) => { - return ( - - - - ); -}; - -export default SocialLink; diff --git a/src/components/footer/SocialMediaItem.tsx b/src/components/footer/SocialMediaItem.tsx new file mode 100644 index 0000000..9c93f39 --- /dev/null +++ b/src/components/footer/SocialMediaItem.tsx @@ -0,0 +1,34 @@ +import { SocialMediaItemProps } from "@/components/util/interfaces"; +import { motion } from "motion/react"; + +const SocialMediaItem = (props: SocialMediaItemProps) => { + return ( + + + {props.iconSvg} + + + ); +}; + +export default SocialMediaItem; diff --git a/src/components/footer/footer.tsx b/src/components/footer/footer.tsx new file mode 100644 index 0000000..1a0cb14 --- /dev/null +++ b/src/components/footer/footer.tsx @@ -0,0 +1,213 @@ +import { AnimatePresence, cubicBezier, motion } from "motion/react"; +import SocialMediaItem from "@/components/footer/SocialMediaItem"; +import { Discord, Github, Twitter } from "@/components/footer/socialMediaSvgs"; +import FooterLogotype from "@/components/logotypes/footerLogotype" +import { JSX, useEffect, useState } from "react"; +import { circOut } from "motion"; + +const socialMediaSvgs: JSX.Element[] = [ + , + , + , +]; + +const socialMediaLinks: { linkURL: string; name: string }[] = [ + { linkURL: "https://discord.gg/kscale", name: "Discord" }, + { linkURL: "https://x.com/kscalelabs", name: "Twitter" }, + { linkURL: "https://github.com/kscalelabs", name: "Github" }, +]; + +export interface FooterSectionListProps { + title: string; + items: { title: string; url: string; isInternal?: boolean }[]; + extraStyling: string; +} + +const FooterSectionList = ({ extraStyling, items, title }: FooterSectionListProps) => { + return ( +
+

{title}

+ +
+ ); +}; + +export default function Footer() { + const handleCopyEmail = async () => { + const email = "ben@kscale.dev"; + + // Check if the clipboard API is available + if (navigator.clipboard && navigator.clipboard.writeText) { + try { + await navigator.clipboard.writeText(email); + } catch { + // Fallback to legacy approach + legacyCopy(email); + } + } else { + // Use legacy approach for browsers that don't support clipboard API + legacyCopy(email); + } + setIsCopied(true); + }; + + // Legacy approach using temporary input element + const legacyCopy = (text: string) => { + const tempInput = document.createElement("input"); + tempInput.value = text; + document.body.appendChild(tempInput); + tempInput.select(); + try { + document.execCommand("copy"); + } catch { /* empty */ } + document.body.removeChild(tempInput); + }; + + const [isCopied, setIsCopied] = useState(false); + + useEffect(() => { + if (isCopied) { + setTimeout(() => { + setIsCopied(false); + }, 2500); + } + }, [isCopied]); + + return ( +
+
    + {socialMediaLinks.map((link, index) => ( +
  • + +
  • + ))} +
+ +
+

Get in touch

+
+

Business inquiries

+ handleCopyEmail()} + initial="initial" + animate="animate" + whileHover="hover" + whileTap="tap" + > +

ben@kscale.dev

+ + + {isCopied ? ( + + Copied! + + ) : ( + + Copy email + + )} + + +
+
+
+ + + + +
+ ); +} diff --git a/src/components/footer/socialMediaSvgs.tsx b/src/components/footer/socialMediaSvgs.tsx new file mode 100644 index 0000000..d393ed0 --- /dev/null +++ b/src/components/footer/socialMediaSvgs.tsx @@ -0,0 +1,175 @@ +import { motion } from "motion/react"; +import { ColorVariant } from "@/components/util/constants"; +import clsx from "clsx"; +import { IconMode } from "@/components/util/constants"; + +const getVariantClass = (variant: ColorVariant): string => { + switch (variant) { + case ColorVariant.METHYL: + return "fill-methyl "; + case ColorVariant.PLASMA: + return "fill-plasma "; + case ColorVariant.OXIDE: + return "fill-oxide "; + case ColorVariant.RUST: + return "fill-rust "; + case ColorVariant.MOLTEN: + return "fill-molten "; + case ColorVariant.SOL: + return "fill-sol "; + case ColorVariant.FILAMENT: + return "fill-filament "; + case ColorVariant.CARBON: + return "fill-carbon "; + default: + return "fill-foreground "; + } +}; + +const socialVariants = (mode: IconMode) => { + return { + initial: { + scale: 1, + rotate: 0, + }, + hover: { + scale: 1.2, + rotate: mode === IconMode.SET ? 15 : 0, + }, + }; +}; + +export const Discord = ({ + mode = IconMode.FULL, + variant = ColorVariant.FILAMENT, +}: { + mode?: IconMode; + variant?: ColorVariant; +}) => { + const fill = getVariantClass(variant); + + return ( + + + + ); +}; + +export const LinkedIn = ({ + mode = IconMode.FULL, + variant = ColorVariant.FILAMENT, +}: { + mode?: IconMode; + variant?: ColorVariant; +}) => { + const fill = getVariantClass(variant); + + return ( + + + + ); +}; + +export const Twitter = ({ + mode = IconMode.FULL, + variant = ColorVariant.FILAMENT, +}: { + mode?: IconMode; + variant?: ColorVariant; +}) => { + const fill = getVariantClass(variant); + + return ( + + + + ); +}; + +export const Facebook = ({ + mode = IconMode.FULL, + variant = ColorVariant.FILAMENT, +}: { + mode?: IconMode; + variant?: ColorVariant; +}) => { + const fill = getVariantClass(variant); + + return ( + + + + ); +}; + +export const Github = ({ + mode = IconMode.FULL, + variant = ColorVariant.FILAMENT, +}: { + mode?: IconMode; + variant?: ColorVariant; +}) => { + const fill = getVariantClass(variant); + + return ( + + + + ); +}; diff --git a/src/components/logotypes/footerLogotype.tsx b/src/components/logotypes/footerLogotype.tsx new file mode 100644 index 0000000..16c7b93 --- /dev/null +++ b/src/components/logotypes/footerLogotype.tsx @@ -0,0 +1,67 @@ +import React from "react"; + +const FooterLogotype = () => { + return ( + + ); +}; + +export default FooterLogotype; diff --git a/src/components/logotypes/logotype.tsx b/src/components/logotypes/logotype.tsx new file mode 100644 index 0000000..0905587 --- /dev/null +++ b/src/components/logotypes/logotype.tsx @@ -0,0 +1,75 @@ +import React from "react"; + +const Logotype = () => { + return ( + + ); +}; + +export default Logotype; diff --git a/src/components/nav/NavButton.tsx b/src/components/nav/NavButton.tsx deleted file mode 100644 index c251fe2..0000000 --- a/src/components/nav/NavButton.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FaExternalLinkAlt } from "react-icons/fa"; -import { Link } from "react-router-dom"; - -import { Button } from "@/components/ui/button"; - -interface NavButtonProps { - to: string; - currentPath: string; - children: React.ReactNode; - isExternal?: boolean; -} - -export const NavButton = ({ - to, - currentPath, - children, - isExternal = false, -}: NavButtonProps) => { - const isActive = currentPath.startsWith(to); - - if (isExternal) { - return ( - - ); - } - - return ( - - ); -}; diff --git a/src/components/nav/Navbar.tsx b/src/components/nav/Navbar.tsx deleted file mode 100644 index 5909500..0000000 --- a/src/components/nav/Navbar.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { useState } from "react"; -import { FaBars } from "react-icons/fa6"; -import { Link, useLocation, useNavigate } from "react-router-dom"; - -import { useFeaturedListings } from "@/components/listing/FeaturedListings"; -import Sidebar from "@/components/nav/Sidebar"; -import { getNavItems } from "@/components/nav/navigation"; -import { Button } from "@/components/ui/button"; -import { useAuthentication } from "@/hooks/useAuth"; -import ROUTES from "@/lib/types/routes"; - -import { NavButton } from "./NavButton"; - -const Navbar = () => { - const { isAuthenticated, currentUser } = useAuthentication(); - const [showSidebar, setShowSidebar] = useState(false); - const location = useLocation(); - const navigate = useNavigate(); - const { featuredListings } = useFeaturedListings(); - - const isAdmin = currentUser?.permissions?.includes("is_admin") ?? false; - const navItems = getNavItems(isAuthenticated, isAdmin); - - const isSignupPage = location.pathname === ROUTES.SIGNUP.path; - - const handleFeaturedClick = (username: string, slug: string | null) => { - const path = ROUTES.BOT.buildPath({ - username, - slug: slug || "", - }); - if (location.pathname !== path) { - navigate(path, { replace: true }); - } - }; - - return ( - <> - - setShowSidebar(false)} /> - - ); -}; - -export default Navbar; diff --git a/src/components/nav/Sidebar.tsx b/src/components/nav/Sidebar.tsx deleted file mode 100644 index 6aa1923..0000000 --- a/src/components/nav/Sidebar.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { FaExternalLinkAlt, FaTimes } from "react-icons/fa"; -import { useNavigate } from "react-router-dom"; - -import Logo from "@/components/Logo"; -import { useFeaturedListings } from "@/components/listing/FeaturedListings"; -import { getNavItems } from "@/components/nav/navigation"; -import { useAuthentication } from "@/hooks/useAuth"; - -interface SidebarItemProps { - title: string; - icon?: JSX.Element; - onClick: () => void; - isExternal?: boolean; -} - -interface SidebarProps { - show: boolean; - onClose: () => void; -} - -const SidebarItem = ({ - icon, - title, - onClick, - isExternal, -}: SidebarItemProps) => ( -
  • - -
  • -); - -const Sidebar = ({ show, onClose }: SidebarProps) => { - const navigate = useNavigate(); - const { isAuthenticated, currentUser } = useAuthentication(); - const { featuredListings } = useFeaturedListings(); - - const isAdmin = currentUser?.permissions?.includes("is_admin") ?? false; - const navItems = getNavItems(isAuthenticated, isAdmin); - - const handleItemClick = (path: string, isExternal?: boolean) => { - if (isExternal) { - window.open(path, "_blank"); - } else { - onClose(); - navigate(path, { replace: true }); - } - }; - - const filteredNavItems = navItems.filter((item) => { - if (!isAuthenticated && item.path.includes("/bots/browse")) { - return false; - } - return true; - }); - - const hasNavItems = filteredNavItems.length > 0; - - return ( - <> - {show && ( -
    - -
    - )} - - ); -}; - -export default Sidebar; diff --git a/src/components/nav/navigation.tsx b/src/components/nav/navigation.tsx deleted file mode 100644 index c13ac6b..0000000 --- a/src/components/nav/navigation.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { FaRobot, FaTerminal } from "react-icons/fa"; - -import ROUTES from "@/lib/types/routes"; - -export interface BaseNavItem { - name: string; - path: string; - isExternal?: boolean; - icon?: JSX.Element; -} - -export interface NavItem extends BaseNavItem { - icon?: JSX.Element; -} - -export const DEFAULT_NAV_ITEMS: BaseNavItem[] = [ - { - name: "Robots Hub", - path: ROUTES.BOTS.BROWSE.path, - icon: , - }, -]; - -const TERMINAL_NAV_ITEM: BaseNavItem = { - name: "Terminal", - path: ROUTES.TERMINAL.path, - icon: , -}; - -export const AUTHENTICATED_NAV_ITEMS: BaseNavItem[] = []; - -export const getNavItems = ( - isAuthenticated: boolean, - isAdmin: boolean, -): BaseNavItem[] => { - let navItems = [...DEFAULT_NAV_ITEMS]; - - if (isAdmin) { - navItems = [TERMINAL_NAV_ITEM, ...navItems]; - } - - if (isAuthenticated) { - navItems = [...AUTHENTICATED_NAV_ITEMS, ...navItems]; - } - - return navItems; -}; diff --git a/src/components/navbar/burgerMenu.tsx b/src/components/navbar/burgerMenu.tsx new file mode 100644 index 0000000..afb6840 --- /dev/null +++ b/src/components/navbar/burgerMenu.tsx @@ -0,0 +1,48 @@ +import { + navItemLinksMobile, + navItemsMobile, + transitionEaseLinearDuration300, +} from "@/components/util/constants"; +import { ExpressiveArrow } from "@/components/ui/iconography/Iconography"; +import { motion } from "motion/react"; + +const BurgerMenu = (isOpen: boolean) => { + return isOpen ? ( + + {navItemsMobile.map((navItem, index) => { + return ( + + + {navItem} + + {index !== 1 ? : <>} + + ); + })} + + ) : ( + <> + ); +}; + +export default BurgerMenu; diff --git a/src/components/navbar/burgerOpenButton.tsx b/src/components/navbar/burgerOpenButton.tsx new file mode 100644 index 0000000..f4f4370 --- /dev/null +++ b/src/components/navbar/burgerOpenButton.tsx @@ -0,0 +1,66 @@ +import { BurgerOpenButtonProps } from "@/components/util/interfaces"; +import clsx from "clsx"; +import { motion } from "motion/react"; + +const BurgerOpenButton = ({ ...props }: BurgerOpenButtonProps) => { + return ( + + ); +}; + +export default BurgerOpenButton; diff --git a/src/components/navbar/navButtons.tsx b/src/components/navbar/navButtons.tsx new file mode 100644 index 0000000..c548b11 --- /dev/null +++ b/src/components/navbar/navButtons.tsx @@ -0,0 +1,40 @@ +import { motion } from "motion/react"; +import React from "react"; +import { ExpressiveArrow } from "@/components/ui/iconography/Iconography"; +import { navItemLinks, navItems } from "@/components/util/constants"; + +const arrowLinkVariants = { + hover: { + opacity: 0.5, + }, +}; + +export const NavLogInButton = () => { + return ( + + {navItems[1]} + + ); +}; + +export const NavDocsButton = () => { + return ( + + {navItems[0]} + + ); +}; diff --git a/src/components/navbar/navbar.tsx b/src/components/navbar/navbar.tsx new file mode 100644 index 0000000..399281e --- /dev/null +++ b/src/components/navbar/navbar.tsx @@ -0,0 +1,98 @@ +import React, { useEffect, useState } from "react"; + +import Logotype from "@/components/logotypes/logotype"; +import BurgerMenu from "@/components/navbar/burgerMenu"; +import BurgerOpenButton from "@/components/navbar/burgerOpenButton"; +import { NavDocsButton, NavLogInButton } from "@/components/navbar/navButtons"; +import { NavCTAButton } from "@/components/ui/CTAButtons"; +import { FillMode } from "@/components/util/constants"; +import { useWindowSize } from "@/components/util/functions"; +import clsx from "clsx"; +import { AnimatePresence, useMotionValueEvent, useScroll } from "motion/react"; + +export default function NavBar() { + const { scrollY } = useScroll(); + const [, setDesktopNavHidden] = useState(false); + const [desktopPreviousScroll, setPrevScroll] = useState(scrollY.get()); + const [mobileShouldOpenBurger, setMobileShouldOpenBurger] = useState(false); + + function update(current: number, previous: number): void { + if (current < previous) { + setDesktopNavHidden(false); + } else if (current > 100 && current > previous) { + setDesktopNavHidden(true); + } + } + + useMotionValueEvent(scrollY, "change", (current: number) => { + update(current, desktopPreviousScroll); + setPrevScroll(current); + }); + const width = useWindowSize().width; + + const navBasedOnWidth = (isDesktop: boolean) => { + return isDesktop ? desktopNavBar() : mobileNavBar(); + }; + + const atTop = scrollY.get() < 100; + + const mobileNavBar = () => { + return ( + <> + + + + + {BurgerMenu(mobileShouldOpenBurger)} + + ); + }; + + const desktopNavBar = () => { + return ( + <> + + + + + + + View all products + + + ); + }; + useEffect(() => { + setMobileShouldOpenBurger(false); + }, [width]); + + useEffect(() => { + if (mobileShouldOpenBurger) { + document.body.classList.add("scroll-lock"); + } else { + document.body.classList.remove("scroll-lock"); + } + + return () => { + document.body.classList.remove("scroll-lock"); + }; + }, [mobileShouldOpenBurger]); + + return ( + + ); +} diff --git a/src/components/ui/CTAButtons.tsx b/src/components/ui/CTAButtons.tsx new file mode 100644 index 0000000..5dad5e4 --- /dev/null +++ b/src/components/ui/CTAButtons.tsx @@ -0,0 +1,179 @@ +import { motion } from "motion/react"; +import clsx from "clsx"; +import { ColorVariant, FillMode } from "@/components/util/constants"; +import { Size } from "@/components/util/constants"; +import routes from "@/lib/types/routes"; + +const SHOP_URL = "https://shop.kscale.dev/collections/all"; + +const getVariantClass = (variant: ColorVariant, mode: FillMode): string => { + if (mode === FillMode.FILL) { + switch (variant) { + case ColorVariant.METHYL: + return "bg-methyl text-filament"; + case ColorVariant.PLASMA: + return "bg-plasma text-filament"; + case ColorVariant.OXIDE: + return "bg-oxide text-filament"; + case ColorVariant.RUST: + return "bg-rust text-filament"; + case ColorVariant.MOLTEN: + return "bg-molten text-filament"; + case ColorVariant.SOL: + return "bg-sol text-filament"; + case ColorVariant.FILAMENT: + return "bg-filament text-carbon"; + case ColorVariant.CARBON: + return "bg-carbon text-filament"; + default: + return "bg-carbon text-filament"; + } + } else if (mode === FillMode.INVERT) { + switch (variant) { + case ColorVariant.METHYL: + return "bg-filament text-methyl"; + case ColorVariant.PLASMA: + return "bg-filament text-plasma"; + case ColorVariant.OXIDE: + return "bg-filament text-oxide"; + case ColorVariant.RUST: + return "bg-filament text-rust"; + case ColorVariant.MOLTEN: + return "bg-filament text-molten"; + case ColorVariant.SOL: + return "bg-filament text-sol"; + case ColorVariant.FILAMENT: + return "bg-carbon text-filament"; + case ColorVariant.CARBON: + return "bg-filament text-carbon"; + default: + return "bg-filament text-carbon"; + } + } else if (mode === FillMode.STROKE) { + switch (variant) { + case ColorVariant.METHYL: + return "border border-methyl text-methyl"; + case ColorVariant.PLASMA: + return "border border-plasma text-plasma"; + case ColorVariant.OXIDE: + return "border border-oxide text-oxide"; + case ColorVariant.RUST: + return "border border-rust text-rust"; + case ColorVariant.MOLTEN: + return "border border-molten text-molten"; + case ColorVariant.SOL: + return "border border-sol text-sol"; + case ColorVariant.FILAMENT: + return "border border-filament text-filament"; + case ColorVariant.CARBON: + return "border border-carbon text-carbon"; + default: + return "border border-foregrounds text-foreground"; + } + } else { + switch (variant) { + case ColorVariant.METHYL: + return "bg-methyl dark:bg-filament text-filament dark:text-methyl"; + case ColorVariant.PLASMA: + return "bg-plasma dark:bg-filament text-filament dark:text-plasma"; + case ColorVariant.OXIDE: + return "bg-oxide dark:bg-filament text-filament dark:text-oxide"; + case ColorVariant.RUST: + return "bg-rust dark:bg-filament text-filament dark:text-rust"; + case ColorVariant.MOLTEN: + return "bg-molten dark:bg-filament text-filament dark:text-molten"; + case ColorVariant.SOL: + return "bg-sol dark:bg-filament text-filament dark:text-sol"; + case ColorVariant.FILAMENT: + return "bg-filament text-carbon dark:bg-filament dark:text-carbon"; + case ColorVariant.CARBON: + return "bg-carbon text-filament dark:bg-filament dark:text-carbon"; + default: + return "bg-carbon dark:bg-filament text-filament dark:text-carbon"; + } + } +}; + +const hoverVariants = { + hover: { + scale: 1.05, + }, + tap: { + scale: 0.95, + opacity: 0.8, + }, +}; + +export const NavCTAButton = ({ + children, + href = SHOP_URL, + className, + variant = ColorVariant.RUST, + mode = FillMode.DEFAULT, + size = Size.THIN, + target = "_self", +}: { + children: React.ReactNode; + href?: string; + className?: string; + variant?: ColorVariant; + mode?: FillMode; + size?: Size; + target?: string; +}) => { + + return target === "_blank" ? ( + + + {children} + + + ) : ( + routes.BOTS} + > + {children} + + ); +}; diff --git a/src/components/ui/iconography/Iconography.tsx b/src/components/ui/iconography/Iconography.tsx new file mode 100644 index 0000000..242c0b2 --- /dev/null +++ b/src/components/ui/iconography/Iconography.tsx @@ -0,0 +1,85 @@ +import { motion } from "motion/react"; +import { ExpressiveArrowProps } from "@/components/util/interfaces"; + +export const ExpressiveArrow = (props: ExpressiveArrowProps) => { + const arrowVariants = { + initial: { + x: "0", + y: "0", + }, + hover: { + x: "100%", + y: "-100%", + }, + }; + + const arrowBottomVariants = { + initial: { + x: "-100%", + y: "100%", + }, + hover: { + x: "0%", + y: "0%", + }, + }; + + return ( +
    + + ↗ + + + ↗ + +
    + ); +}; + +export const DownloadIcon = () => { + const topPath = { + initial: { + y: "-100%", + }, + hover: { + y: "0", + }, + }; + + const bottomPath = { + initial: { + y: "0", + }, + hover: { + y: "100%", + }, + }; + + return ( + + + + + + + + + + + + + + ); +}; diff --git a/src/components/ui/iconography/ResearchIcons.tsx b/src/components/ui/iconography/ResearchIcons.tsx new file mode 100644 index 0000000..45e71ab --- /dev/null +++ b/src/components/ui/iconography/ResearchIcons.tsx @@ -0,0 +1,159 @@ +import { motion } from "motion/react"; + +export const EVLAIcon = () => { + return ( + + + + + + + + + + + + + + + + + + ); +}; + +export const KOSIcon = () => { + return ( + + + + + + + ); +}; + +export const KLANGIcon = () => { + return ( + + + + + + + + ); +}; + +export const KRECIcon = () => { + return ( + + + + + + + + + + ); +}; + +export const KSIMIcon = () => { + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/src/components/util/constants.tsx b/src/components/util/constants.tsx new file mode 100644 index 0000000..746e376 --- /dev/null +++ b/src/components/util/constants.tsx @@ -0,0 +1,63 @@ +export const transitionEaseLinearDuration300: string = " transition ease-linear duration-300 "; + +export const navItems: string[] = ["Docs", "Log In", "Buy K-Bot"]; +export const navItemLinks: { link: string; target: string }[] = [ + { link: "https://docs.kscale.dev/", target: "_blank" }, + { link: "https://dashboard.kscale.dev", target: "_self" }, + { link: "https://discord.com/invite/kscale", target: "_blank" }, +]; + +export const navItemsMobile: string[] = ["Docs", "Log In", "Discord"]; +export const navItemLinksMobile: { link: string; target: string }[] = [ + { link: "https://docs.kscale.dev/", target: "_blank" }, + { link: "https://dashboard.kscale.dev", target: "_self" }, + { link: "https://discord.com/invite/kscale", target: "_blank" }, +]; + +export enum IconMode { + FULL, + SET, +} + +export enum Size { + THIN, + NORMAL, +} + +export enum ColorVariant { + FILAMENT, + CARBON, + METHYL, + PLASMA, + OXIDE, + RUST, + MOLTEN, + SOL, +} + +export enum FillMode { + DEFAULT, + FILL, + INVERT, + STROKE, +} + +export const CursorTypes = { + DEFAULT: "default", + POINTER: "pointer", + PROGRESS: "progress", + WAIT: "wait", + TEXT: "text", + ALIAS: "alias", + NOT_ALLOWED: "not-allowed", + E_RESIZE: "e-resize", + NE_RESIZE: "ne-resize", + NW_RESIZE: "nw-resize", + S_RESIZE: "s-resize", + SE_RESIZE: "se-resize", + SW_RESIZE: "sw-resize", + W_RESIZE: "w-resize", + N_RESIZE: "n-resize", + GRAB: "grab", + GRABBING: "grabbing", +}; diff --git a/src/components/util/functions.tsx b/src/components/util/functions.tsx new file mode 100644 index 0000000..c0abb4d --- /dev/null +++ b/src/components/util/functions.tsx @@ -0,0 +1,91 @@ +import { useEffect, useState } from "react"; +import { CursorTypes } from "@/components/util/constants"; + +export function useWindowSize() { + const [windowSize, setWindowSize] = useState({ + width: 0, + height: 0, + }); + + useEffect(() => { + function handleResize() { + setWindowSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + } + + window.addEventListener("resize", handleResize); + + handleResize(); + + return () => window.removeEventListener("resize", handleResize); + }, []); + return windowSize; +} + +export function setCustomCursorForStates(currentCursor: string | undefined) { + let customCursorUrl: string | null; + + // Use a switch statement to set the cursor based on its state + switch (currentCursor) { + case CursorTypes.DEFAULT: + customCursorUrl = "./styles/cursor/default.svg"; + break; + case CursorTypes.POINTER: + customCursorUrl = "./styles/cursor/pointer.svg"; + break; + case CursorTypes.PROGRESS: + customCursorUrl = "./styles/cursor/progress.svg"; + break; + case CursorTypes.WAIT: + customCursorUrl = "./styles/cursor/wait.svg"; + break; + case CursorTypes.TEXT: + customCursorUrl = "./styles/cursor/text.svg"; + break; + case CursorTypes.ALIAS: + customCursorUrl = "./styles/cursor/alias.svg"; + break; + case CursorTypes.NOT_ALLOWED: + customCursorUrl = "./styles/cursor/not-allowed.svg"; + break; + case CursorTypes.E_RESIZE: + customCursorUrl = "./styles/cursor/e-resize.svg"; + break; + case CursorTypes.NE_RESIZE: + customCursorUrl = "./styles/cursor/ne-resize.svg"; + break; + case CursorTypes.NW_RESIZE: + customCursorUrl = "./styles/cursor/nw-resize.svg"; + break; + case CursorTypes.S_RESIZE: + customCursorUrl = "./styles/cursor/s-resize.svg"; + break; + case CursorTypes.SE_RESIZE: + customCursorUrl = "./styles/cursor/se-resize.svg"; + break; + case CursorTypes.SW_RESIZE: + customCursorUrl = "./styles/cursor/sw-resize.svg"; + break; + case CursorTypes.W_RESIZE: + customCursorUrl = "./styles/cursor/w-resize.svg"; + break; + case CursorTypes.N_RESIZE: + customCursorUrl = "./styles/cursor/n-resize.svg"; + break; + case CursorTypes.GRAB: + customCursorUrl = "./styles/cursor/grab.svg"; + break; + case CursorTypes.GRABBING: + customCursorUrl = "./styles/cursor/grabbing.svg"; + break; + default: + customCursorUrl = null; // Default to no custom cursor if not in list + } + + // Set the custom cursor if a URL was assigned + if (customCursorUrl) { + return customCursorUrl; + } +} diff --git a/src/components/util/interfaces.tsx b/src/components/util/interfaces.tsx new file mode 100644 index 0000000..513962c --- /dev/null +++ b/src/components/util/interfaces.tsx @@ -0,0 +1,22 @@ +import { Dispatch, JSX, SetStateAction } from "react"; + +export interface SocialMediaItemProps { + linkURL: string; + iconSvg: JSX.Element; + name: string; +} + +export interface ExpressiveArrowProps { + size: string; +} + +export interface BurgerOpenButtonProps { + className?: string; + isOpen: boolean; + onClick: Dispatch>; + atTop: boolean; +} + +export interface SvgProps { + styling: string; +} From fbf060325ba145942ac2ad0cb366363fcee4fbd1 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 22:56:42 -0800 Subject: [PATCH 11/28] disable scroll bar --- src/App.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/App.css b/src/App.css index 79abb16..23acb34 100644 --- a/src/App.css +++ b/src/App.css @@ -337,3 +337,7 @@ footer a { margin: 0; } +::-webkit-scrollbar { + display: none; +} + From b9575e04dfb02bce64eaedc54ba172a1cc9281aa Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 23:22:58 -0800 Subject: [PATCH 12/28] update nav logic --- src/App.css | 9 ++++----- src/App.tsx | 9 ++------- src/components/navbar/burgerMenu.tsx | 2 +- src/components/navbar/navButtons.tsx | 5 +++-- src/components/navbar/navbar.tsx | 25 ++++++++++++++----------- src/components/ui/CTAButtons.tsx | 3 +++ 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/App.css b/src/App.css index 23acb34..867afeb 100644 --- a/src/App.css +++ b/src/App.css @@ -120,7 +120,6 @@ color: var(--foreground); margin: 0; padding: 0; - font-family: var(--font-mono); } .container { @@ -170,7 +169,6 @@ background: var(--background); color: var(--foreground); border: 1px solid #333; - font-family: var(--font-mono); } form button { @@ -179,7 +177,6 @@ color: var(--foreground); border: 1px solid #333; padding: 0.5em; - font-family: var(--font-mono); cursor: pointer; } @@ -324,7 +321,8 @@ nav a { border : none; - color: var(--background); + white-space: nowrap; + color: var(--foreground); padding: 0; margin: 0; } @@ -332,11 +330,12 @@ nav a { footer a { border : none; - color: var(--background); + color: var(--filament); padding: 0; margin: 0; } + ::-webkit-scrollbar { display: none; } diff --git a/src/App.tsx b/src/App.tsx index 0551718..be7aebe 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,16 +1,13 @@ import { Route, BrowserRouter as Router, Routes } from "react-router-dom"; - - import "@/App.css"; - - import NotFoundRedirect from "@/components/NotFoundRedirect"; import PendoInitializer from "@/components/PendoInitializer"; import ProtectedRoute from "@/components/ProtectedRoute"; import { ScrollToTop } from "@/components/ScrollToTop"; import SprigInitializer from "@/components/SprigInitializer"; +import Footer from "@/components/footer/footer"; import GDPRBanner from "@/components/gdpr/gdprbanner"; import { FeaturedListingsProvider } from "@/components/listing/FeaturedListings"; import NavBar from "@/components/navbar/navbar"; @@ -37,8 +34,6 @@ import TermsOfService from "@/components/pages/TermsOfService"; import { AlertQueue, AlertQueueProvider } from "@/hooks/useAlertQueue"; import { AuthenticationProvider } from "@/hooks/useAuth"; import ROUTES from "@/lib/types/routes"; -import Footer from "@/components/footer/footer"; - const App = () => { return ( @@ -48,8 +43,8 @@ const App = () => { + {NavBar()}
    - {NavBar()} diff --git a/src/components/navbar/burgerMenu.tsx b/src/components/navbar/burgerMenu.tsx index afb6840..8a2a8c8 100644 --- a/src/components/navbar/burgerMenu.tsx +++ b/src/components/navbar/burgerMenu.tsx @@ -9,7 +9,7 @@ import { motion } from "motion/react"; const BurgerMenu = (isOpen: boolean) => { return isOpen ? ( { { - + "col-span-full grid grid-cols-subgrid overflow-hidden py-4 items-end h-fit px-[5vw] -mx-[5vw]", + )}> + { return ( <> - - - - + + + + {navBasedOnWidth(width >= 768)} - + ); } diff --git a/src/components/ui/CTAButtons.tsx b/src/components/ui/CTAButtons.tsx index 5dad5e4..e94d34c 100644 --- a/src/components/ui/CTAButtons.tsx +++ b/src/components/ui/CTAButtons.tsx @@ -3,6 +3,7 @@ import clsx from "clsx"; import { ColorVariant, FillMode } from "@/components/util/constants"; import { Size } from "@/components/util/constants"; import routes from "@/lib/types/routes"; +import {ExpressiveArrow} from "@/components/ui/iconography/Iconography"; const SHOP_URL = "https://shop.kscale.dev/collections/all"; @@ -149,6 +150,7 @@ export const NavCTAButton = ({ )} > {children} + ) : ( @@ -174,6 +176,7 @@ export const NavCTAButton = ({ onClick={() => routes.BOTS} > {children} + ); }; From fa3e2eb7e858a8242cff5d24c959d516f9250676 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 23:28:52 -0800 Subject: [PATCH 13/28] upadte nav and footer --- src/components/navbar/burgerMenu.tsx | 68 +++++++------- src/components/navbar/burgerOpenButton.tsx | 100 ++++++++++----------- 2 files changed, 85 insertions(+), 83 deletions(-) diff --git a/src/components/navbar/burgerMenu.tsx b/src/components/navbar/burgerMenu.tsx index 8a2a8c8..b6a1ec4 100644 --- a/src/components/navbar/burgerMenu.tsx +++ b/src/components/navbar/burgerMenu.tsx @@ -8,40 +8,42 @@ import { motion } from "motion/react"; const BurgerMenu = (isOpen: boolean) => { return isOpen ? ( - - {navItemsMobile.map((navItem, index) => { - return ( - - - {navItem} - - {index !== 1 ? : <>} - - ); - })} - +
    + + {navItemsMobile.map((navItem, index) => { + return ( + + + {navItem} + + {index !== 1 ? : <>} + + ); + })} + +
    ) : ( - <> + <> ); }; diff --git a/src/components/navbar/burgerOpenButton.tsx b/src/components/navbar/burgerOpenButton.tsx index f4f4370..bb9e715 100644 --- a/src/components/navbar/burgerOpenButton.tsx +++ b/src/components/navbar/burgerOpenButton.tsx @@ -5,60 +5,60 @@ import { motion } from "motion/react"; const BurgerOpenButton = ({ ...props }: BurgerOpenButtonProps) => { return ( ); }; From 3ba24191435daa13790a21b2495f12238a035413 Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 23:43:13 -0800 Subject: [PATCH 14/28] Update nav styling --- src/App.css | 16 ++++++---------- src/components/navbar/navButtons.tsx | 6 +++--- src/components/ui/CTAButtons.tsx | 7 ++----- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/App.css b/src/App.css index 867afeb..766a111 100644 --- a/src/App.css +++ b/src/App.css @@ -21,18 +21,16 @@ /*}*/ @font-face { font-family: "GT Planar"; - src: - url("/assets/fonts/GT-Planar-Regular.woff") format("woff"), - url("/assets/fonts/GT-Planar-Regular.woff2") format("woff2"); + src: url("/assets/fonts/GT-Planar-Regular.woff") format("woff"), + url("/assets/fonts/GT-Planar-Regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } @font-face { font-family: "CoFo Sans Mono", monospace, monospace; - src: - url("/assets/fonts/CoFoSansMono-Regular.woff") format("woff"), - url("/assets/fonts/CoFoSansMono-Regular.woff2") format("woff2"); + src: url("/assets/fonts/CoFoSansMono-Regular.woff") format("woff"), + url("/assets/fonts/CoFoSansMono-Regular.woff2") format("woff2"); font-weight: normal; font-style: normal; } @@ -85,7 +83,7 @@ --pointer: url("/assets/cursor/pointer_dark.svg"), pointer; } } - +} nav, footer { display: grid; grid-template-columns: repeat(4, 1fr); @@ -304,7 +302,6 @@ cursor: url("/assets/cursor/grabbing_dark.svg"), grabbing; } } -} .scroll-lock { overflow: hidden; @@ -320,10 +317,9 @@ } nav a { - border : none; + border: none; white-space: nowrap; color: var(--foreground); - padding: 0; margin: 0; } diff --git a/src/components/navbar/navButtons.tsx b/src/components/navbar/navButtons.tsx index c5e9dbe..0881d88 100644 --- a/src/components/navbar/navButtons.tsx +++ b/src/components/navbar/navButtons.tsx @@ -14,7 +14,7 @@ export const NavLogInButton = () => { { - {navItems[0]} + {navItems[0]} ); }; diff --git a/src/components/ui/CTAButtons.tsx b/src/components/ui/CTAButtons.tsx index e94d34c..5b3365d 100644 --- a/src/components/ui/CTAButtons.tsx +++ b/src/components/ui/CTAButtons.tsx @@ -3,7 +3,6 @@ import clsx from "clsx"; import { ColorVariant, FillMode } from "@/components/util/constants"; import { Size } from "@/components/util/constants"; import routes from "@/lib/types/routes"; -import {ExpressiveArrow} from "@/components/ui/iconography/Iconography"; const SHOP_URL = "https://shop.kscale.dev/collections/all"; @@ -126,7 +125,7 @@ export const NavCTAButton = ({ return target === "_blank" ? ( {children} - ) : ( routes.BOTS} > {children} - ); }; From cccc29658cf34e496139f45761eb087b3704a5ca Mon Sep 17 00:00:00 2001 From: Deborah Wang Date: Sat, 14 Dec 2024 23:52:24 -0800 Subject: [PATCH 15/28] Update login styling page --- src/App.tsx | 4 ++-- src/components/pages/Login.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index be7aebe..d466e09 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -44,7 +44,7 @@ const App = () => { {NavBar()} -
    +
    @@ -160,8 +160,8 @@ const App = () => {
    -
    +