From 255c33342bd93cd19026766bbda104b53f19dfef Mon Sep 17 00:00:00 2001 From: JeremyGamer13 <69337718+JeremyGamer13@users.noreply.github.com> Date: Thu, 24 Aug 2023 23:30:10 -0600 Subject: [PATCH] early dark mode --- package-lock.json | 18 +++++ package.json | 1 + src/app.html | 54 ++++++++++++- src/lib/MenuModals/CreateBlock.svelte | 64 +++++++++++++-- src/lib/MenuModals/ExtensionColors.svelte | 26 ++++++ src/lib/NavigationBar/Button.svelte | 11 +-- src/lib/NavigationBar/Divider.svelte | 4 +- src/lib/NavigationBar/NavigationBar.svelte | 53 +++++++++++-- src/lib/StyledComponents/ToolboxButton.svelte | 10 +++ src/resources/blocks/core.js | 2 +- src/resources/events/index.js | 21 +++++ src/routes/+page.svelte | 75 ++++++++++++++++-- static/favicon_any.png | Bin 0 -> 8302 bytes static/favicon_dark.png | Bin 0 -> 25626 bytes static/images/theme_switcher.svg | 2 + 15 files changed, 312 insertions(+), 29 deletions(-) create mode 100644 src/resources/events/index.js create mode 100644 static/favicon_any.png create mode 100644 static/favicon_dark.png create mode 100644 static/images/theme_switcher.svg diff --git a/package-lock.json b/package-lock.json index bdf7d45..f1c33d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "@blockly/continuous-toolbox": "^5.0.2", + "@blockly/theme-dark": "^6.0.1", "@sveltejs/adapter-vercel": "^3.0.2", "file-saver": "^2.0.5", "js-beautify": "^1.14.9", @@ -46,6 +47,17 @@ "blockly": "^10.0.0" } }, + "node_modules/@blockly/theme-dark": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-6.0.1.tgz", + "integrity": "sha512-fZa834SKstG31PNkoZ26DLIpevNVBWLDwDT/g99a6EtwqnkZg2VjCjbJDLA0xzrCmxN8AH6zmZU/lAdMoBH8sw==", + "engines": { + "node": ">=8.17.0" + }, + "peerDependencies": { + "blockly": "^10.0.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.17", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", @@ -2372,6 +2384,12 @@ "integrity": "sha512-7ayim3y4X4vwTLC+SYPijurlx/GoJI0ZemqnoYBcSuqkgnkFCYj8NSYejal1NLdzExjdVm3gsTwRVl9zJJ1cAA==", "requires": {} }, + "@blockly/theme-dark": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-6.0.1.tgz", + "integrity": "sha512-fZa834SKstG31PNkoZ26DLIpevNVBWLDwDT/g99a6EtwqnkZg2VjCjbJDLA0xzrCmxN8AH6zmZU/lAdMoBH8sw==", + "requires": {} + }, "@esbuild/android-arm": { "version": "0.18.17", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", diff --git a/package.json b/package.json index debade2..a16543a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "type": "module", "dependencies": { "@blockly/continuous-toolbox": "^5.0.2", + "@blockly/theme-dark": "^6.0.1", "@sveltejs/adapter-vercel": "^3.0.2", "file-saver": "^2.0.5", "js-beautify": "^1.14.9", diff --git a/src/app.html b/src/app.html index 2874a6e..a14fb4c 100644 --- a/src/app.html +++ b/src/app.html @@ -10,11 +10,17 @@ - + diff --git a/src/lib/MenuModals/ExtensionColors.svelte b/src/lib/MenuModals/ExtensionColors.svelte index 006751c..e438100 100644 --- a/src/lib/MenuModals/ExtensionColors.svelte +++ b/src/lib/MenuModals/ExtensionColors.svelte @@ -32,6 +32,9 @@ function getExampleData(color1, color2, color3, color3Included) { const tokens = ["[{{COLOR1}}]", "[{{COLOR2}}]", "[{{COLOR3}}]"]; + if (color3Included && !color3) { + color3 = "#000000"; + } if (!color3 || !color3Included) { const rgb = ColorUtil.hexToRGB(color1); const r = Math.max(0, rgb.r - 51); @@ -176,6 +179,13 @@ border: 1px solid rgba(0, 0, 0, 0.25); } + :global(body.dark) input[type="color"]::-webkit-color-swatch { + border-color: rgba(255, 255, 255, 0.5); + } + :global(body.dark) input[type="color"]::-moz-color-swatch { + border-color: rgba(255, 255, 255, 0.5); + } + .bg { position: fixed; left: 0px; @@ -200,6 +210,12 @@ align-items: center; overflow: hidden; } + :global(body.dark) .bg { + background-color: #333333b0; + } + :global(body.dark) .modal { + background-color: #111; + } .modal-title { width: 100%; @@ -211,6 +227,9 @@ align-items: center; justify-content: center; } + :global(body.dark) .modal-title { + background-color: #333; + } .modal-content { width: 100%; height: 75%; @@ -239,6 +258,13 @@ .extensionMenuPreview:active { background-color: #e9eef2; } + :global(body.dark) .extensionMenuPreview { + color: #ccc; + } + :global(body.dark) .extensionMenuPreview:focus, + :global(body.dark) .extensionMenuPreview:active { + background-color: #1e1e1e; + } .extensionBubbleIcon { width: 20px; height: 20px; diff --git a/src/lib/NavigationBar/Button.svelte b/src/lib/NavigationBar/Button.svelte index 90b55db..ccb776b 100644 --- a/src/lib/NavigationBar/Button.svelte +++ b/src/lib/NavigationBar/Button.svelte @@ -28,13 +28,14 @@ font-weight: bold; font-size: 0.75rem; color: white; - background: #ff4b4b; + background: transparent; cursor: pointer; border: 0; } - button:focus, - button:hover, - button:active { - background: rgb(211, 62, 62); + button:hover { + background: rgba(0, 0, 0, 0.2); + } + :global(body.dark) button:hover { + background: rgba(255, 255, 255, 0.2); } diff --git a/src/lib/NavigationBar/Divider.svelte b/src/lib/NavigationBar/Divider.svelte index eda524a..c299a36 100644 --- a/src/lib/NavigationBar/Divider.svelte +++ b/src/lib/NavigationBar/Divider.svelte @@ -3,7 +3,7 @@ diff --git a/src/lib/NavigationBar/NavigationBar.svelte b/src/lib/NavigationBar/NavigationBar.svelte index e1dbc67..91d4376 100644 --- a/src/lib/NavigationBar/NavigationBar.svelte +++ b/src/lib/NavigationBar/NavigationBar.svelte @@ -1,15 +1,33 @@ @@ -23,10 +41,8 @@ position: fixed; left: 0px; top: 0px; - width: calc(100% - 8px); - height: calc(var(--nav-height) - 8px); - - padding: 4px; + width: 100%; + height: var(--nav-height); display: flex; flex-direction: row; @@ -35,6 +51,29 @@ background: #ff4b4b; } .logo-margin { - margin-right: 8px; + margin: 0 6px; + margin-left: 10px; + } + .theme-switcher { + background: transparent; + height: 100%; + border: 0; + margin: 0; + cursor: pointer; + } + .theme-switcher:hover { + background: rgba(0, 0, 0, 0.2); + } + .theme-switcher > img { + width: 28px; + height: 28px; + } + + :global(body.dark) .theme-switcher:hover { + background: rgba(255, 255, 255, 0.2); + } + + :global(body.dark) .nav { + background: #333; } diff --git a/src/lib/StyledComponents/ToolboxButton.svelte b/src/lib/StyledComponents/ToolboxButton.svelte index 05b746e..52850b5 100644 --- a/src/lib/StyledComponents/ToolboxButton.svelte +++ b/src/lib/StyledComponents/ToolboxButton.svelte @@ -28,4 +28,14 @@ button:active { background: white; } + + :global(body.dark) button { + color: #ccc; + border-color: #c6c6c6; + } + :global(body.dark) button:focus, + :global(body.dark) button:hover, + :global(body.dark) button:active { + background: #111; + } diff --git a/src/resources/blocks/core.js b/src/resources/blocks/core.js index 78757d7..4a97b16 100644 --- a/src/resources/blocks/core.js +++ b/src/resources/blocks/core.js @@ -7,7 +7,7 @@ const categoryColor = '#ff4b4b'; function register() { // used in block creation menu registerBlock(`${categoryPrefix}builderblock`, { - message0: '...', + message0: '⠀', // empty character breaks block shape args0: [], previousStatement: null, nextStatement: null, diff --git a/src/resources/events/index.js b/src/resources/events/index.js new file mode 100644 index 0000000..38c332e --- /dev/null +++ b/src/resources/events/index.js @@ -0,0 +1,21 @@ +let canAccessWindow = false; +class EventManager { + static allowAttachment () { + canAccessWindow = true; + } + + static on (type, callback) { + if (!canAccessWindow) { + throw new Error('EventManager must be used after onMount allows attachment.'); + } + + window.tbevents_.push({ type, callback }); + } + + // enums + static get EVENT_THEME_CHANGED () { + return 'THEME'; + } +} + +export default EventManager; \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 91cacc8..aaf7de2 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -22,6 +22,7 @@ import Prism from "prismjs"; import * as FileSaver from "file-saver"; import fileDialog from "../resources/fileDialog"; + import EventManager from "../resources/events"; import Blockly from "blockly/core"; import * as ContinuousToolboxPlugin from "@blockly/continuous-toolbox"; @@ -67,9 +68,15 @@ disable: false, theme: Theme, renderer: "zelos", + grid: { + spacing: 25, + length: 3, + colour: "#00000022", + snap: false, + }, zoom: { controls: true, - wheel: true, + wheel: false, startScale: 0.8, maxScale: 4, minScale: 0.25, @@ -80,6 +87,14 @@ flyoutsVerticalToolbox: ContinuousToolboxPlugin.ContinuousFlyout, metricsManager: ContinuousToolboxPlugin.ContinuousMetrics, }, + move: { + scrollbars: { + horizontal: true, + vertical: true, + }, + drag: true, + wheel: true, + }, }; let workspace; @@ -134,6 +149,11 @@ compiler = new Compiler(workspace); // workspace was changed workspace.addChangeListener(updateGeneratedCode); + + EventManager.allowAttachment(); + EventManager.on(EventManager.EVENT_THEME_CHANGED, () => { + workspace.refreshTheme(); + }); }); let fileMenu; @@ -325,10 +345,8 @@ class="project-name" type="text" placeholder="Extension ID (ex: extensionID)" - style={"margin-left:4px;margin-right:4px" + - (isExtensionIDInvalid(projectID) - ? ";background-color:#ffabab;text-decoration:red underline;" - : "")} + style="margin-left:4px;margin-right:4px" + data-invalid={isExtensionIDInvalid(projectID)} bind:value={projectID} on:change={updateGeneratedCode} /> @@ -515,6 +533,28 @@ background: white; } + :global(body.dark) input[type="file"]::file-selector-button { + color: #ccc; + border-color: #c6c6c6; + } + :global(body.dark) input[type="file"]::file-selector-button:focus, + :global(body.dark) input[type="file"]::file-selector-button:hover, + :global(body.dark) input[type="file"]::file-selector-button:active { + background: #111; + } + + :global(body.dark) input[type="text"], + :global(body.dark) input[type="number"] { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.7); + color: white; + } + :global(body.dark) input[type="text"]:hover, + :global(body.dark) input[type="number"]:hover { + background: transparent; + border: 1px solid dodgerblue; + } + .main { position: absolute; left: 0px; @@ -561,6 +601,15 @@ transition: 0.25s; } + .project-name[data-invalid="true"] { + background-color: #ffabab; + text-decoration: red underline; + } + :global(body.dark) .project-name[data-invalid="true"] { + background-color: #9b0000 !important; + text-decoration: red underline; + } + .extensionIcon { width: 96px; height: 96px; @@ -607,6 +656,13 @@ .extensionMenuPreview:active { background-color: #e9eef2; } + :global(body.dark) .extensionMenuPreview { + color: #ccc; + } + :global(body.dark) .extensionMenuPreview:focus, + :global(body.dark) .extensionMenuPreview:active { + background-color: #1e1e1e; + } .extensionBubbleIcon { width: 20px; height: 20px; @@ -631,6 +687,9 @@ background: #f9f9f9; } + :global(body.dark) .blockMenuButtons { + background-color: #111; + } .blocklyWrapper { position: relative; @@ -656,6 +715,9 @@ background: #f9f9f9; } + :global(body.dark) .codeActionsWrapper { + background-color: #111; + } .codeWrapper { position: relative; width: 100%; @@ -674,6 +736,9 @@ white-space: pre-wrap; font-family: monospace !important; } + :global(body.dark) .codeDisplay { + background-color: #111; + } .warning { background-color: yellow; diff --git a/static/favicon_any.png b/static/favicon_any.png new file mode 100644 index 0000000000000000000000000000000000000000..1f34a099a01c8a47251c4d11aac9f01c6f66fe10 GIT binary patch literal 8302 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 literal 0 HcmV?d00001 diff --git a/static/favicon_dark.png b/static/favicon_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8504d49ac4c1cb4acb1f5a5d03314fa3aefa4fb3 GIT binary patch literal 25626 zcmeF3_dnHd{Qr-=M`kIjC?l!N?2&b39UL4X$)3q5dnDPCQT8|o$8pSK9U+8}bvX7h zl5xzGmHByjf4<*;;(Po4plte#IC&U;%v zW8AGjf0qB8^<=it$gZ%lhh5{Pdk=+CI|Btf`v=o0)q~}W6Qz>GQH<5F-l1_x+2HC~ zz?rpg*_xBvAo4HT(R~FZP+V44*2aAd+sCXs;M-k9Q5;ZT3(q>7OAMYA^$02$jlX{R;A)C@InM(CFlJv$Sx%k-3*Sf@KVxtL7^v8Wi5t{3EzlpL%gD~8N?MbBQ< z*Wr{)itxqfkGjOc6oSD3c00{QoA+_+_fb~9 zVpMF&FO03ex`Y?%GBs%!sufRVj2`$IHkdzP6DG$?aR|hCBuSdPN_D$n@SO(;g!p~( z7dxsgJNh+pgX>NxD0Ep(?8)0ZzqnLsK0{D-+Jqa+H)5rirBGDp?OJhR-#k80pz?al zYb;(Ey6)21(D`vLG|wEV`)T3r4}KwjybJlQ1hMJfGKc$I&oqQ$4|DN~&?0JGJ#ku{ zRr4HY1j)?%lHYruO$VTNDDHI2@$XZEwbNkj+G3hgJsel!x%6#`jHsEd{`Ve@x1aAA z`!?iw?vshCK|1m5*|GgrPwH+Za{-SuJD5mc)42_eL{n?(84$c0rZ|VuQO1(#Eso+< zk+IwL#RUuS<$G+KuJ3L;coqJl1`EZ=br_|%4x|?KlzY^O^Eh-$rL_14t=7w$pd7X5P0LAY+|u80GdliHFYUf*ee{!^n5Ngs1_#@)p- zq33E3CG0Yp*;Hv%9~;bdjo+%{;(nHPU>e)sE`(B^&Y+vgkxXtWVc!dNKz#NP5>sPk zF`g}+fQ{>bz+69Kq8ohu z3FqP1DA`ovf&W;KOHNB$-6m*Qz{yDMRl$XEaNLMQCld3)qtf!MIXFh)schHEWT2H; zQ5%M9Tbyspg|c|pN2=(-T7Y`wR7UqOjNp35a?2gxMN6FMb@BG~-S3Ywc1vuTXHPX* z|D$@03^ZZY+GB3WIXm00fqCw{5%Z#vq!t60%1{W%vo%j#&CYRO4>`$EbT$ypzM0sv zQwKY(M6dbv--CUs>T)vba6rZlbyAEm9`!7fE+}+Ro$JJ)@7i#?@Am9eo#*_Vm}Rk|YUFVI1SblGvbhU9wP0xx zpDNmiy5^ztiUE6G?lblKJK<0?tcgR6wqa#|W8&l%OMwlRGSF2_*0)Qlc8JQdFl?Em z&uT1I61Q$Bs%Tn3ve#9=KW=#<-t@D2#g*F>ZP{>O6DDR^zlWIU`YZc)b;w_4)=S-o zPkfoF$JTV6$3Ui3Yiy-i#Zw}*+rE)CiPmX7z2gu6=yIN%7`NWqUkKWk(iOguWVW64#-3xJ|IixM%fr zqQc6m!GjQ_Yw&;`sdiHcq0SWnu|r$81Qabudd?{{IE~!A;IVA1OwdKRwCL6(|GYjR!M?R`ki-4@UNa=iJ;7X@NvemQe$Up!&2zaE9Q>q+#Oac}T# z2|V;`3E2NrDa9y+28J|bRCP9HD{MXeqbn15u<7ZtJ=@fJQW-zYZq`i=w(sybu*c(z zq5M$=nFT^VW){Y`fct5pLSTgykSF>D&V$*HJjTl{&P!h!KhiRLdhPkR<+ZBoXMTRN zJ?n0$&T{X=!#Sk!oreB<&5dM?vR^}q@mC*oY+*MlDs0+9T6OivN@_Ljz;myc64vfg z4+NkRt#4^+XhhX-8c`J7Z(B-~*L0j3F1L_SRyStikECSqR*z=%rQ-HUzStR7k3A0} z;t+4L>n0}38cdlSy3&{;AcGd#I4Vni9R&CJE7hfFN+zDogBed{|6d=pu#rqklX;%C z1JWVPemu;nxbS?FP}sT()1AQ0>gZ6XYxkdp?fkKB@UY5tn0L3U%P_qY=!vO4o>kHm zJTlv_8p84*5{A}{{6*AiNdSFtJEiXdwnCusms&I)5 zM!;TLz&W9SU;W)$Twjh?2hF*#sm!z_(^n5LIl_leNQxmiS1QZI%9kqxu`L&Mo1&OL z`ZmEa&_b%=uvfAJqI4zIyHryf_pbgktq#{retOYP$YJyL(NfakqPFWbVn7qW5Q0oq zI9}R)`p5$qppFq`|9balSIEnOc%n06TebtD4~%ge#g8<|Q`-JY#zD7*6fK(Q6(BSsZIB~!E zi}OQ*-;DE?F33qX!HP>MsPTko5W3#HS$C=e1}<@S?_pwos;!YWPELobF{dmU9tOYW znqeJ)l;6UPo-Vk7oM_k6NB@v2|LZlF?Y)z?8L&6(t%)?I*L9q1fmv$v7g2++u`43r z-Vb!@xPa&_RYx;xeK0-GQt`V{fs&PtL--RL|lo|$i9L*6T z0?zq}jt|}ZSCT;jI$}@Ep1zE-p-`~jsMzxK%_cM?iDch&r3O#IOIU#u+!P=dV}_JY zjvTyv8%R`yOErj-c1gaRPrbtD4B(W>x1Y%wsyJ;TtgI z1K{lMl?(;BGvE$x?lRuz|5i^J?vn7iV&ubk_8`OTJqz3Pz|?-arz%2h6i^J$c{TWG z`i7+Ys0T^DDg?)Fc4Id9y|Q}Ql~i11N7;*|6ii79rCY7c^{_8OeqA{}I2}aL(dhly zD+l)#FkZ13VC6R7Ba!=FCIB3Yx`^Vm{j!2D#ePqPo zsDzDRoI0X2#a{CQASZ9GU%{92K3&XG(~PC->vk%z*iM8%V}`spMoW_Nrn*IDKz%xG zA!nz@UO<>Ps##GGMBG{>&eIB^4s%@(%x`;j!gM$!90P)P9AArTHl8f`n+$tR>f8 z3Yxn*o1r2LbIIZKs>1e#D-+)`$c8CXVDae3dPAUO+OEI?hi<_qiq!O*`uq`)>63h8faUcNpXznIXTE}6PTC#tWR0sPy`up z1ZM;U{Mhc}-lDb}=rEaI9amE%4T2|j3nRN)097!O_IS7~^&vT8Z<4SsACPVo5PovGNI{NfVi ziEYf2!X?>1{RmRkc&fhc={nal&TMeFR=bvscUhXKS;$7INVPB2G%YQyP3%%aX@GXH!+TBtF^ui@?Bvd@R z(1aQ+=peJGyY-t6wNOi_pAQLa%eYcMJKOXsIL=_V*QP*we}BS8OZmgKW99Pvy^{{% zpOcOzc?J}SgLAcRAxU9{OKIo%no#R#Fuz~%N-`UE;?cNB+2Amcxdt{YDnEagH`+j3 zB191Zq0u-Sy2!&vovS^|unB3(+j=)(>_5qA6SS!Qq2oiu2kX`EZYbAH${^$amZ}xNUUfsRy?OwM#6zHpG{&&rIbMKs z;2EwsGqCw2+J}CLnUq1$|1aB;ky;$A4+GoWG_F%gSkM@Hd_BC zWB<%tQk$S%4Vi#Fr}^h_@$k3ZT=0Q7XwuApzY%cHcZHn&s-(|En%xE2vd5OohZ1;h zOJ09P!1`9WPE^?QW=amacD$ttS#fy=`=}xY7U$IeAQ=IPnH)H52Kx0GzjHN}J2^fn zc~^`p_Iyr%NDLi$N!s_ZDO1=Oe7Apc_CCoJ3QfG1{oI)C_SWCB5LdCKk!hQ|#&jHa ze~VRCwj5+yetBK(X^&Ic^+s&#`VLVQ^F%uz@B~fF#l_KOBnyliiEvBpZbDvP8`PKI z`jvOym(b1T{B=3>Y$CL&c^lh5KijWx0}nrsc)TLB`aZ-aX0P@|I4pBa%Kz_xO!JIq z8=>Xm{6tAIHOsd1ogltuTt*}nq>3a59G>GD+kDgCX^n@3hA+_e2{{d}_vkRV>J(Rb ztmm7F^_C9Zv5z4($1MdM1B}7H+o=e^Td+fB{K!c6EH|*sOuEq>?Jf10PnQ~uDA=wK z0oEfY;V=?1N!vRYW3auIEKjU!Wy^TW@j5Ex2E{r&B!UKbTY1^_jd%}Ejwcye%a!&y ze~V>4D*FnD-i|8qE)XkV$*0=Lp%uS;#?E^+I94^oldT4uJ&}1y4>g(92X@^@Br}un zm(V3T@e!5d7UE&F-Y_|hZ;!LI^CN|-y|s}}h8v|fSW_t@7~*e}@Y|9jaFZh~ zl1GF7t*klA8O5t20?Td>z8gw*uORyRz;*HY;hTrjBaGq})dwbuPMVYM4Fo6$VV*`Y z)n%uFKqvk|AOg}+xT^z85?niiTlq~1PK^5R!^=3}R6MWqpOzfTr1EU#)dkGu+3FGx zOXiEl>)RcitZI}m{tfB;pch4|MpFKZ9{uW9&-L_mjKG!Dl#K72QRJBsx|$Lmk{|W# zQVc!q%DW#*BVQI)gYD3JCyy1KBDzYAioBJFEp3JGD?UY?=rPS`Gph=}$!ucw2}*$` z=q;#Qve4@I&j&YTNxQ>*DE9NKrHZz6&tp1-xjI9VXmwzb>r$a4S%_W^CdIvEo1VLs zEZ9{S7Uq6(f%yDX1@~xXpH-bL^)amP`FPhY0rw9&P$rn-=FqUo-pSZbnmxz5j;)T> zvT=!iLdCCsMtOmnPKJJRVDbpRft?xY;;23jQ%S#MQa-)UkF;e=*{;U6)zo(GuXS_R6rG7qjb5jvyDT8-BqPi361C$1%#( zH^3y4FW;^a_mysC_!?3ba#zDt6<8VOZin6e(No~s<6tZIW1&9$>PEF3LcJo zPuF;Y_eR$4Dzi|7Ghv)T0o>Bv#f>y&rKOWSj6E=l4ZHCgko-=$1^nO3)f|5;LN`Ox zagtoBiBM7_{yPw8+A~g2)O{gCqUE=zS1su%#V|P5P^PnMKanSTOTvFKoc2J$nQeTz zq_!Pcva@M0#V2Ed5fT)Aec?R^`#82-oEB281B0)4pj^=v4awg&>shMin;kl>JP~bF zzP;6iUI!;JjDkCq@a4^4f$jE~yAL8SRO28Ko5Bmv)U3XsY zOABH4$>sSCl&ED5rM(!l!$P9`WYRd?D#+e3DuZ+O4wElH*FyXBP^^hd`B zTE8cVV%TI0lbl=QMscDgc{C#xcxuA-QqL+JW?bQK&y~vOFhgHje_*r`iL?fp!KLDI zXD!mT5L9boS&by11{x0M0-OKSb~SogWK`Cqs!I!VRfn9GR|Mg1%Gn4*Q`7zH@+L3} z;vYABS=tG{GK4+HJ`48od`bEI7L$aX%b_US(7r|!4!i_oi(vD?EFV8XWyUI(sKSmP z?W>2_E(*;Ds{Kk1K5uA<#6FSKG_v~5)ejGE3h*j>BM$u=8=~*JvbHKYiadG+nFy92 zJ@i&wNVxjord+?Y`$XZ(G!mkWz3ybSnfoCY!7LYN*&r?F%p z$*2+jejzd?W?Ov5!nv#SXJI`pm{zCDUEJke=@`1}@7YeMvW%tp*-YD+<@f5efcwUV z*kZ5PVQMf<_4UuwY3!+zpXA?vk+gCB(P49OJh4{(i!Equz?5Divlq^X;loOIdYIqk zOdKmKiUO;GQ8W-MJ_q20~hT~N6NyfHac&YEPO9aIGa@Z`qu%F??49~e5 zs3b20d;Q@HZJ%^2z+drQ>T$ItrWncM7AyxuMxDG9eh9Gf%eX|9aHC_}b@b!}EvDNv z;yAW5+D;M54g|X-#g(~`ldZM#UST1m2D0q`UiWC1pP?bGG}FPKesO<7vwzZH%|>yS zhqq10KYO3_t5HQvhNR4Sw5-tZ6Q1TmXdg*}F1>AI_mw)@HWTY$sG zuvWdkz7Ck@)@0s8a~pB!VoSU=PDKp4RnB6e)Esbu7k zekGM9sMyxEc?qTu6bOGhOE9W}ZqA_4>_ z-&zWIR{7i?GZMFNO4nJp?)RQ>3x0Dy z(C;SQ6W8$K>I1>wFBaKUZk%L09YY`7r3g)-k+r=0fMzo>Uyv7bgB%EM`eMG2Bi{VQ zC>R-HN0c?RN!P_`b?wmI|L91>%#+XNcF19=nDWT+A8Mr3;9lBsne^y<%!}R>0Y8?B zgjTpK6UgEPP&~$VES=vu-G2j2nc1W|o^)CoKB48uJQ29lf3ThhLT%(KKAlvLaQ498>A!|(-Iz1y__jv5EUzh^njAtR4Q zzPvfO5HYK?=5C?YG+xJq@r0$)Hhy+1WJ@RQKM%NnO%=Fxh4KQ7M~?IY6F6(yA$0qJ zA?!Gx@}#Q5s#!W9&Hc?}Eh7cFAY60dj*ebQmW71{GVL9STT_}5#mBGetcISK|7M*z z8=gJ7X`~lVeOnw2{!SIa0=X3~l?sx~y{$oR)gPJvR+3+c1jO~c!t`b!1Bo+`m4PJR zrc(`nqt3s}oC*T%bLhSQWGYMcCn=vC1Y(Z-|9}2J{sdB40oy&!ngj$+2=oqNPEBFo z{8)>JT542+K#1{Ty{t9%8o+=H1BCn5R+ZJ_U3#TdP%=;WPOqeyAmFvqN5KIJZu^U0 z$bGVkKY#)>HIDV&STkj&1WzrN@Y25fl2A~TbAx0e0!5!5COaCrA0QOexnwvnlpQ4W0Tr+G9{6X$0gUTZ$aJ z^}7+I@o;F+O_s(-xCW{hDm*-ya{k*lT4)`@@QG0w)G_&N=BB3j`|_L5@pCrRaL1us z;LLrU#sXp8z2@3H7g_H0G1m5$3t6`a9x9r^?ISgW!!_1KUY43HLYRgUAPz#Bx#&8INQZiz=X?)u1YUIYi;WXjQsialOaN(>H7?Gh| z#@p}>4Y)r;Jjt3u9mSGN@}E;JGQ)zE*>Ujo8H)@DQG@k<%$37v7wCbEYLAl9<10un zgfh*LA1D>+KeH~}8e?Ps3aQvTMq zi2PJ-U5Jr&1WvT_OUfjHT;(G*NBSR@R5oTF4{Ph^ z2!|mnUqxY{*!cpfP~2dRSa`9YJ5Lv%P`)$ynSz)_&9`OyAJ1cW9Hf-$C)xdxc*9V3 z%eVO$3Kw#Cp2gWLcp#_Uu>oH{VI8PZS>rkP}_jFu*Hx@8YzGiv0Uds{GpEu%S zDa4FVoNouf(6xb!H_rH_lkzdwzzcv}!D?p?_|@Q*pn^H3UYAjZdjo!Dq^W8huso?- zsQM*QC7Ubvo4jbB=}svc{hjmWrLXUO(UZtcNR(f(8!}_~@JYf^A8Fa^LRH)jRV*K$ z4t^OP0`k2jgy(lrJkB+(-q+r^$?bq3UbvTo!7|CL`m+2oXq}zb6OVpj zg$``;e9rr@rzgNWk4bpZuH7ttSce-O(T9?uV|y*-B}-zlv+o!O49xycR@)Jdc9)83 zpLtXtTLDSn>g8h-!8)E#ud9Xfhph}`HQQXkE@Dp`Pqv#0V@TtoT9bd@z!yDxe8>r2 zOQfp@<>8Nq4B)zm57U0^@ff<=xfna53u4i9shk$5e?ApT7c)n7feo>Mn)^r6Nd9##{xWH`4H|@ z=__HFbK~8M=0vU+R`T@hk&t`ivC|&STeC?adqqG?s+q*IH5agfUc39L8roLJv?&UF zJ_+`Rjsv7nL)!Z5;gmiXf0Zw4T}O+5y>iM-h4Pqj&R(w0qMwV|r%k)^G2Z}aW|9=a zarRSW`!l_<9#^XLXpOPuY+Lin{v5QcTD^`ed5m7S3CMay{Q=vy8SvCJ%>FDLwq3MX zR^MF1`gW*zLv2C`}l0fllWo3(_m;ar}%;9&1B2oh}{cvKA4M!?o6Gv z85uKdxDb(?C&_G_&lLvB8kvhIhlOO38an(sTZm(SA!_$BL#inFsJ^_IOk4%N`1-fi zJSxv$BgZ;PCT3<-Hl;K|cVM19tz=_kMf zyEQx`X(+v2{G`yWaM0x8}9|Gc0L@J;4{CSd#Hd8 zTJoda>x3v;Y@G`<6HIaXr*GgVtpQA93?*v!XUvH$)4g-eTjfd(JJAD!x2N3^*og(yvo(sNs=O0|mQnINt7w`Xk|b)@DF$GQ3`e0?uo`?2712C5{wD+xS{; z2rgSi46MOA?KBq!!&D@Venximdr9V4i~d_Bgj4aX4a#lYow$@hw4_GGM)i+oY7*1= zW7%iq*nsp}0EyBYy}0rn2w7$yt!96maahije0{PQ&8z>s@>YUDKzU8g!wIP4H_|+ z|AJp9D~7#!=8ybV**CWMM8yMh|L^?KM-CI-zdPu}1@PrRYCtNan-cYW$nA#D5{}s5 zgQ*^WgXNr7-gk`L>t;LSnXjldm(tljjZd8%-3n9|KQwcFf8sa3ZVkI0lg#$s0b}*D zi`^qhF#^aC<#aRd0nK+((qP2sxyMIZaT4<47}oYXdZil2%NaI_gMSPNo|z=UyIq{k zz}k!c8m2aGw1RwPKk8X0WNK>4ZAazX!2MG^U&oh->pE0+)pB#!gXl|+>TN^`1enVjo~ITGzc1#65hr-Qrp zU=1WA3;N|T>xh#3^qEbZw%_*bBP>h_!=@5(!Zor*DIl~SGWs(FHd%>kyZZed!}Xy4 z6lmSOJDK|>yB3}A82+j{12_hGadC-r8r@dQX-rE=n?+l(--KmUS~^H5i9~|NP(^O# zlijRA$RE}VO7V=)7|_$iQrWs;axEcpS7cC~q_;>#a!15kO> zyI!Nok-KY#qV@%zL8FBxrlxfb+!#R`D-S&t5@J;+GQ~CBg<^``b7xnEg8e1j7%wjo;ZH{^ zFaY56V=0iuMn#%})g_i6U>~f(NylDA!4%l)h^F2nqNyw-e_r#8t^*=_A1y%!& z+zEkuj~jm9f-%mAa<~gD1~-<3_EHJTKbmCB#PfUIjSBpIe*d}&S zXk%C0##7xZyBLw0ansDF^x!))svA_l_1b7$9^tTB^CxqMryzH9cHhS*1cx7=7R?s) zy+D9cQlXtZjA?y_3G%xc_sy9yyL)x5o&EagFcZ2B?t8*^8!uL(f|S~Fa-P1cXOQQn zN<=sS^O|h)*924tpMmXJ_q?+SM3IveRfxum@ zX7}nk#moJEbF$=*vnJr%SBNA~LOS4s?<4lNSb|CiQfA6SCOU9!kc(X?nQvXTvyphz z%>)U#qlL(`ud<4W()orP2ez)Xv|0`GA!vq-exmJuFqff%D?IDRd@H=*VeFHMkV> zJ|orx(`~Gc>#L?|9$ilY1|}NCLIp<#sknZ`cN>X*d}sJ1Pl*t`k2l-y7jKI{hnG7k zwz{&V?m3(%;OnuOcPvPDh4ap9CHr z+(2K~X$qZwruZP!si+EW%jzVzo;f;sn*sev#xvIv*z#rc1`Ov-!GZ(duk zFm`@)m7?rtwYi*4>#61Sza@kTsFDzJX3GWjO!SsV9UiKLaZ*?2mP%+ncr)PIwIRoG zQErayPT3+>2kg7}Pgwbx^NmX@?X$1pGTgF2H=VXHJTLHd(>nfb}EmhvL zB_~B0_o8om{%*n%EL?7Xe)VpPhyIJ>{b65tv34F!0)R7=xZYsZe|mV zPbwOt#jB`aNj3C@nJp1Z^8A<-eyboIW!K)xOJhmMv>%<6D>+AxK$lLVSUyR+XEqay zvraMo`TW%2QqBSB(aHS9wsqiE-5R*Jw0|pRt(%Tdo~IsY4}(LYq?y6{6K&`CmVYZ* zBka%qQiCVUfe(Fx0B~oB%qb|V70^IWbq&?zoAzeH>sDqyJ+PYv0-UXqaz?1Ab@w z6V05~uiIseO1?Ei0eSxjF7pETp4u; zZi3kdHk<_QoocK&*Aj?tX|uN6YHFteI{{{u1nY0y)ytIZZGbBSaxLDbLk3{`wgG-( zcVG}u_iZ+hAKJ(AJEs!N9gjpo-t9`GncRQEOnW(s%Hv2!zs0Z;d?&0{a|70e+d{AP zS;oc2#ztYURlx;98zQ4}QMe(B@1iVo*r0&&)T`+_RnFa~C55iS16wKOLf?s8p}0 zKw6LFFMz z_O&H|Zi^224dvpQs0OKSPDmzCB{|{2$yi-SSwj_l#S+GjE2<cbKnRVN>c?W^|G}HocRog&Y z@S7Kcrb=lybs&0>B~MkEV7!;X7l^Y7KsXg2^_h$t{X`y^&7URtrh(B;aCFH=B)t8 zw`Qlf!cVq${St|VSuAS;;q0v6jQi^G{>Exj85HfkpZAHHLB@!}M@kGV438SbM7^hc zfeO?kqj*)iBBuk4aeV~jiE7xC2TK@n!0H+x{!i~YsT_4g(Gf7tqd^AY?+l&(?sEIj zJ~*Zs(_#?=-zEQ`cKrKSwshy0&e(JTP}Yk>YWKpx7CZqO@U;&e|3m+tJV4`joI^{@ zbBq9qlhZ~D@~sMd+bxvi;#-X8!BPsuR;?qNXbO?J z5r`%Ez1fV+;~uPsXir;B)abj4?(fXc?{5=k_Sf2Y08kdet3MbFc;P&X0gd5g zRF@sjD7V*Fl8|?A$CrmqM*m}lKI_2lXpl)}%>?eg(qlL?=6NoQ-O!T%EM)w=QWt^A+ww}RElc`2{OKT!i7?uhNR3!OcASB?t z;3v{NBROYmmso*a7g4rL2s6nAR#i8^l-;d;cqy~zr6#_-S)XHsrT&p^{>)=4OOecZ z&@`@A+XdV+>aNr&GMKaC6E6KWrtlwB_^nzhfcT5)uR$NMqxI?Lcy z0d;BNnCB=pkZqd=;HPy&$@8^X(F!ks9M$z**v`EHNnCdA2~MtUbEPfd1}R zibsyH3WaSNXJE18#;hrl^ow_t|Hbe|rgn_`rZVqP2E`qGGXD7Y{gqp%KhuS)veI%D z>SFFil84dP4pm`sNwtuPfZofV=xj|(`A;YFq&~SX@Kp7=7J`9xt`R^)1;hgPA2eS7 z-dIW(3{S(3>4KTU+1c5*dz8zGmLC6+1h5K^&2-iN)!v^%va;SS#4R43SYz zMRWfxuquHg8k|iz{&SD85SFfX0{c0=$~vN;Ur%Cs@X_iG|AlZWO|!6L;Br+Z{fL-R z{Z|00{3%pU^orsK9(B$e$=3w8yp44myDb^7-si)Tj`0HfNPdNpF?s>1Zh)|3*9ZmG zi?CqL=;=j1REkg2{?^Qd)$7Hm&E9un<3HxUwN)?S1GXw9s{v$YT->Qt+=L->)CkSe zHBqNa_Re%V>xmZnJ*?J83}NY!iZD<<8zTT5$K@Ua0AlKUx@da3Duz(^`#-?1Ax)NexWu;i{MVmji*}VK%-YLwGGnAhsU`=tOycYcE zmQ3xKRPlonfFn-~1eD(FrCz-5`DL+KKWE)xD0l1P=~6`B4@p$DixHQt_<7elwN=-J zVcf?9#p{wz$;vF*>skeWktMmYgDjoqf_#FTf%f9^PHvFrXr1XX%Vuh)76G?8;3~J2 z&X4SP-vT*Ude^SH&g<#*1{WiocEgT2@-v&%TEc&tYA$f6=~70^sJhT6O6!}%v91@F zU;%gOUr92#Gq4K;2nu9?rv0+X!`xXSLSrzuiMc_S6gAX+Oixj8UF!3F+lauG&yGR= z39EP`{T@!KD9&;oPg|S2ahrPReX)Z&7qoJF1CX+{`}YU`>AlnX$Q#J(&j%3pzpvdm zcfZ8pWvo8a5MAnq=lVxC6%|XoXjE{8)jG5~^M5%>M{6EVr#wD^{G7RjZ>#~H;qd#d zq(+(fpi$-D8>$>xi167WQBhG|@xiR@=liOQg6nqYr~d$dIrmlQ@o3&G@V*m)YGMU> zBL-`?)Rhug1Bp_EfDlDP`O;PT-vAG5J79mEJx7&8+AlA$2ppb&D6Lcl!`2iLHRzv|LH<@VDKGD{s3qJ&fN z1`Q9vMkD1ie_Ta{PWr#UOi&DQ6er$9TX8Cw`;vI!2=$Ywd$I$XMu#udFq@}Z2f6y2 zHq@!|C+9*HS!`dVbm%DaUKgJGE=Py4Wpj`QsYEu?l?>wN$hC|Yb8AI<8B5+2PuV0X z9hWu(E!W4*ci;rTnCh(5O-r^af5&D`N{t3|rEIsW$21#IJ*wA5Z23>*~q#s6#vF>#A zX(Q>a8k+Xs@`_D+=ShCKiRA30u=YDq z%P;p~MW?jyOQB7;&A0N~jh&UruzP1eXrw=no>2dHpZxXw$ zaMjDD?k2#`O6#ilak+JijA}iXE8An5tSC!1%xjD=UitfBc_fqm3pJ}==aZ5w4{Wbz zLDT|(B-UY-`;_KcCJNzIaKBa~sK5CL1Lr5~!e0AutNfb=V9GwOj2In|Kl((I|HIj0 z)16Md6WIQwVsZBuO6utRc%rRlK>Ohsp*UVbq))*&mI2Ii#^l+69aw)Ls`-HeUeRdj z(bT1vTb?%h*Y)>8dxi0x0ZwXt8P5Z0P{(wyi^`(CERE8$w72hU6#o7C7-AreosKY0 zzqF(O%@nJpxcT*&0$VO=Q89pCfNdMgXS*!hja$$@=H)zPIr4=5o&w@jo{%l_hrtrO$^`TVvgyi3oFj} zegt3ajMl3BLoA5q@xDYr2btg33mW+uy=&s{libJUYXo6#C*a=#P4Li`4>m3RaNM~0 z*a&7>KqD;VEElYQvYaJmUiEb+f%DT`UOA3|{MkGO_aUXGsJ`n%xzF!=yy|?`LLt3WNSkl8Gm!>p1 z^Exj?CcSi>jn*5Fka5sX+eItyw@<^Lavu}BGrp3h9(Oq}_GSPpeP(Ph)g=`!D)xu# zTfS=KY?Uo+Pd?Q8^&&-EG0(cax=*>@MB1a)dI;sn&$qN%Fe^(}HJ84NPLAYmk><$_ zO4pivmVHyyHE5(`-GqUbsQbp3rYaN5fxInugo72sIMKoM)RBYCde`w4cOyn?7Vz4) z4|V&q=FhhMb?Bdd>00+cP&LvO3cJlL*0Sr0qC1OHNt9bJeaiR?niTGLDo)lFW=t}*^~vJwcBCDRFcT9b=5<%z&HkEZo9 zl=oqBDZ0D@SnI!RO%z{z!m16^qn;ljuQ}~Wa0QOM2)~{B6!XpPrXey7|>+z$FP<;5xbQvTO>{`?}p+GOenrGebc!(h}%DpP4HYdNMOV zyGP_&$+Do8t0Vh>{qm4AV*S>H6;z7Uq*~q(K|uSWCv!?3-2MFe=?Ep3)5^yvrTI5i z!;4;)Lz|0zn-PoqF5~DLrgH28NRp(v&Dt$`-rU*GnVIT_SC~AoFABJt*MP}Ms2y^N zJpNJ29h>@Fa>L5%X%p?^m)_i|>kzGtkKjO;HKdax%A`T|vH=9>ZToxS$o-h6ZS2Nu zM-;43^lI=hd+NCj5O3H`wd`g19nC}Aw?8}P_@>VQq(M>b=I9{ZbhzrqZN#T^ax-R; zdNyZR@YLHvY^s%ESzPc!-QeKm7I(JHF{=_+mtb&CCzJB*R$J)sK7nN)*duW~6-`^g_+)>9Jb9v6pZ`?lIBdK~b zqV^F0rY)Vk7rusH_T34CHJ$*3?=e!SF=C;E++TAS73(Oaxd(f@%j@Tv{T!bkb+w;D z)tPm#IA%^kT&sX+C(2!?sV*iLIePE_U)lEPLg*Zki0Jufs|L%WDG1?fpDvCC=dir+Px%tle34NA|VOa^RK!+g1 z^{;a4fn=ia?)=g^9%Ti9*-v)>2wUO=bLID+<-UjQYdh<{Cns6vvJ_Q_O`g|P++$lD z<-TY6k&NCs^8Sf~HCxp^Jg=r}kdI?YbgsAK0x%SRBz#3w4>Yr!_8kM?)Z!DMf>VFq z{QPzrw0gKUaw~v6J~t>*@r=}7(`s3@xxelmgvaS+FN?=(`9bi!X=v3>`G4f*2p>5@ zvq~oC_;qCi&f}XuOt|Te1K>P)Og$X<^`n*ipoT8Qj;il{t9(Qq+*Mn(*^i5m931Yr z*FExNUJLC}i_HlelLf}8ky$Vi9Vk66!lR)v9%SfyCy)95*`y>GPXb6X@iZwKEyCfeoo)o0mJlGbpsRtJ!rFZ%oYirvxYr1MZ&Q_qk8grv_vz+tpx!yF~S?ubF)ye;&B7 zsuV5TGasf38yA|j3k$GYe(1p`IpXKDbTXQb zCkM9cq1^AHwQT_s>wO1Kxg6v5E+xbeW-LsVS?7Wm3Apy;9!Cx-gm2AJSX@PYAM&$obd*}Yo^!vyE5s5;M6;Xt2NXjX4CJbSib0o((l$>%H zS`Ilyjya1t&g6WUWA8{g$L5qnC-0C$2du2k_nPU#))MjM&Kt zYL7>lP6rasfXqz--qUsrFu0GwQ!}E3?J^BT-%3Ybm16XK)K^2IO zpZNU!;<^LyanIKhdphBkwuR8vZIre79S#RNFzOdh&^;g*|qlRIjM75=|(tK8r- z{`K$N0m`m761~G_s}BfkChZ&d@OCYUx0uT+oz>Wn%-*-x<1_v?jW4sF%Zjg$XQW9y z6<}RB`$&WJh@0lJpbVRAev$CLUGuTMR2G5ck{F^Vn6d1@o_#R=NAt|F`H00sJ~j>b z1^^Kr^?*?Z9%j6v#)-8NCM>#wzR^1=S0N{XYhY5izG@W=;vS#MR^24SddY4H5a;1p z507xwoffve#dq}3vQ;bIwn-w4F9vbiP#WaDzc3YM1HRq0HQ|X!gD#|g1tY6C2U0=c zO5i47VSFP)RcR0m;-=X5m&V%htEah*m>~9kAvhs`(XN821fbd(+a%s{x_qA^D;+0?aQ>wJ_c#k1cRD$!Gq4s4JABoTWjdL8U-Y8Z+n{g!5ify4W^mTz zpbGS>MjOVH2n#ptHn(M&bZ6|lM_TjjA0&XJ$F-+9B}AOHXt#^LeM)owK?!)UvbllE z;JP%f1aH{5**dp;+-D(6lRM1L%f}%)-dQNZo>-TYXOxV^x!6&dGSI@VNeFgf?!bCNK@>`JYp6zZ_Iw2LFQfK?gxq4?Y)J7 zagf2NFwXt7)q6l&t;MP*z(cxB@rf4qvp)4WCqo+hx3t1+rj9&xH?GRJJ<`-N)Oy2| zvmWju)MNwjjKHr2WgpGv$Ur>N{x;*HzK6+8uyt(EEUXS=NinNyqa1AT^=(d<{>NNf zX*wJUpi=pd;d9Xo%x1G&FiGkHCoxo=dqI`FrqiAAov$&HnZ|*s=HJb6Ez@&m-``10 z3`hu2bCD#Z87%a2%_h;pH0ZFGp6we&`&GOMI%#}`3fGv+aht*cCLej9gM5ptQX^co z3iEe~1sFvDWtO}u{T`g(L&+efqwi5&UidgktGe!_70*L9`&wZUgPpGf{G!z4{f|i+ zW#Knb+hoxD4X}0$%JQC;KIdfEOWnMyGp0R_*4J8Vi?xUW+hp3}2B>?O%g;Blx7d76 zjr#i;{0Mp{i?&m#q34ln*=59^>i-Z`VdaQA*ygR5Z;yCFI?-tu>8|hk7)|pIMtl7= zm3y-qY1VaWa51CB4CQc)o4S1^Ttfp4tmK~ndalcA#v#DujjaMxdCcKG4MjD)A|bUf z=|!(2cX3V~{{_@G0deC`=W{{ujW?6XQe7fXSCT2aqY_DCowp-h^|5K_e?yudWtUED z3_V1y?_2d<{6_WPX*HJA95oYQ0>`CtF zg{bme*NgUEp(m--wQcjL;{9;^T%Kh%hx%`4B~P=+?922T_W@OmmDZP% z0*aUNm+b;?1V=6wd(IXA^#svB)sHberB{98{zZDrAC&Kvqn}#sPr( z0kv7)ZN4r?#k+WTsYDq2){Snjdo!H1Va6QNA4J{M#KHLa;hg;u@^os|KE%N~copNUpq`*YcZ;1$(ghP`^&7F+6# z#=dHht!23pVy^}jD+B`*KM<0AQuoDFTjo#L8(RB!ZbNV-*{A;S(2Ynbgbm>X=D0&| zg zN=v@Jm<93{^36)t6aMhyr!I}GY_#PO3!?hD^nXiGyEg8gvXPQPzy0b?ekW$zN1T?M zk9!=HzJ7bVo4hB}E2N4t>Wl~nZ-1G!mYjOEE(o~G&A@*5INa^}aRY?WgBOFW=@ZMZ zVSjaaCXeD-=5lBgAa<=u`PNV}d;?-BC6+2-Q#hzX6#xalL>^tJ@SIL53VZ>E%fL}K*iNHTau#{+o<0G_CBV;hgaU?V;+oL;tC42w6t7Jh-|l-*lGjg zppM(Gf&>cpM+(R;2%ajgp+ihGj$0CZuvv1|z&#!JkyEC06XkZu}Z zJErQX_ltw3J>~<9U_Ds|+fgm2y?h(#GsRS`^$C%jgSROalr_Lfohf9ljC%KKJyxIJr8m__i-aPe*WdZH z9W;-xn#5XUGHO-#Z%EWmgJe-52*6`WxEJl85*uxxO3*y>sy-|t8rC!2emUqfU*|94 zl`L%mN=eDi0b6BN65S003JRjkLEYBnmc&-Csn@B3h|>t@F)yE|Pu7t)rVfXGpA!1x zjxT!c>Qj+fxTb#Vn!w=hg!~yl<-osL2D`$P3^c7)bvwFLtt_&`tGho*L;Q8c)2l%MH*u{^qPCOdv zo&Wl4`FN!yUp9+DyzaDRIw zz*eT|=2nh$EOgF#6MXRN-_d|WBKas}mNzK&;PbhI$79^jw=oItLXN<}mMi=j{~9C$ zmHZZz!FU-p#|-gF+zXgG;*Po1G8w{%0MSD3ceO{+%0TUonV#XoQzxG6ROOmvAlQ8)0*7z(o69~5~iKc4P zsN~+XdXJ*exO%4ZWZrZds1iDDo80xRxhuo}+JGN;N((x$@#q&;Xh$S$*~#G9Kio|p zAzw&CSyGG3v^^!DT`E|Geg2WqTIQ^OToTnkP5b{>1>3Ps@!7v!gQ(>(2G zPH#H^41jD)Kga$C_|T6P$*Z^Oyd`{arBAivegb!so;BorXEW~*I0>%v%h>TcLRkq5 zS1=`+4CYN6JiyI`k(w;J*S2s!3E&;%QYlE93}83>>El}`w(@@b7XgS$-laC5^OA1* zZ{1(=t-b#F{S{~Dpm2C{oiZf1G`^cYv@@YAeGpf|KAYjPwbk31EddCK|@SJpizSBRqyXXh)Ysa1tm2^wZ^CtOF>NKQ8f_lCFL<{=0zeN8u zEVZ9v(3D=x2ixf)-FTx!y~+Ao+zq_JcS`@Ar_^pWz(Q@f6+FCo-hzzW3u2Q2B(no( zP$pQg2ej>jJ;8;Fm@QJW(GXof=1TVF zfGg!w`yl!V==Atw#apDyVbX>Ts#^dfC(D>XCNk+Q+lv{0f22n34DzjGXLSuQ;15JhX z42IM(2o9{8bb{S8uv}0_r-~KJn4`z8Vms=+7nlC=>-0$DU0Vt9Qr8& zE7oI<-C;pHm5`y_R>5~iNX4|Biy`F2kWR0u3caXwR1CHN#U=EVheRSJNx@+1Z8>Z& z)$pzFcI7SF3XVqf0)QcMU>h9Z2=ov!AT0DW%v-0se}766(I^X(Z)-E&jXHJH{1oN7 zkPnO1N%}k)9PICaoP~UO6i9b$0q4|?h!;4R`GJVsyW$FA5$GVet;~UXv3a%?+>4(3 z84@PoQlDM zBG5{39V;nms3i2VTij6;>U)La2lVF@r3j-8!Z$jz1R~i&RLd>kv5PJtHq-GCjhVfk z08_Qy%)2JjMLuWr3}8o?%Fp7svWfAeS1^m))dmdoc#IzqQS^l0R6?>dTF(^N<= z(>H@NU=W|B9SOv!V5iU(J~HTzP^Mi{t|64+fBH5?t2>^F{daHHQqpd9Zq=7ic{BUQ zU~Q}uRPrl`!narwO%5~4mG>VW-d&uzcRlh=B*5L#A@g7}_fSK+OzxE|OZrvsTH!WW9JYh-I6{izrMH3w zr3X&v|LU+iKz*co;D((Cq%GC_PT>{jU4pG@Ci+SLa)BFY;dS)gr(O$hZPp0}2&$6|fc}e<~~mim-uMtfRsw*3Bth#=F*L zihze4@}oW4xQ78YZpt?SHoF#7i+S|=G(P{^LPwKE@W!m%ezh)GdC%X~GIX3&&`Eo; zUNdceK0uEze731ieeMt z_>0isunIS!Lr@&J$wB@J*Sb~Q5{F8nor-_@BCZ>TJ04DJVdu}Cl?K-s_jR@-n4&)mpw20;0sh8V_RhMEUz3R%QG5$kMUaUiy` zQUcdIJFH%3~_K&Nz3TFq-M;rO2`%ZakFqf^_4u@UASsDGTt@%~(?Uz`5MwmcyY`l97g>+ed6%pws{6AuB>aV0?p)|4AFf_cV=ooL?9 zFP4FC%QK3a52kuF{a^*9>Kjyau2AG{g$XCkJfQt<-h6ClcyW%B&)4!!4A9B<6&N#$ zddT(j1BnWrlb>(mG_D}aZkINMTH6+G%9ap`Ve)h9j#7B$iXZy5tZ@=xrf_+0pw!pA zIi%oq@GA7LDpJ*+D-W*kJ?P-=B-zG$^WDk4qMm*ZjTXdjeXpwBRV%4jtjo7|gTYLg z^O7Q5=AM&mgO32pQkgBGZPD1w*1$hI#m^pSS4c2gNP{W&rh>d|=z0qcF}6zz!t%i7n?z1Uax0T{7_o1gv?fjegdT`2pAI(k7ywzNTCz+2w>>)tJrim&EduFN#} zo*r?T8f=H6H6re{-A>=H5`jzr1rze#kC zu>=l$p3)D*nVQNhOa@^su@0Zj}`yyk~4Amo9l z?^<`Ice8*<(=qrPkcz0p*EXY5gJZ`9@fkY>K(mc-3AV>C4CbGR)|Gq2w_` zhtreM-qd88v5Y~CXeKlG7Z1n_+L^?^8=30?mS;~7i$*~2Y|HqDl=?>OHNxt6rk84X z6^Sa-d@;Nj%l%xJ)04%xECa!zvGXUMJ8)%2tN4iOR+m@*?tlvO)qEn5v329NXpQjv zZ(GjJK8boV#tJj6N#VsrGS%#as=}JxCi(F{DN7dywEij_gbWmyTOF&4-;Y#g=$|zn zwlqhpdk0aIdx#JI8D|JD_PHD1PBwImA_v8m&L?W<{AR%1+d5!TzB>A6sm8Pr{67zf Nq25j1I&Ejn{{eG34FmuH literal 0 HcmV?d00001 diff --git a/static/images/theme_switcher.svg b/static/images/theme_switcher.svg new file mode 100644 index 0000000..391ba91 --- /dev/null +++ b/static/images/theme_switcher.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file