From 1b53532ab9d2e4ac6678d641e32d6bde9a0344ca Mon Sep 17 00:00:00 2001 From: josarcsal Date: Fri, 6 Jun 2025 17:34:46 +0200 Subject: [PATCH] chore: branding refactor --- .DS_Store | Bin 0 -> 8196 bytes resources/vaultwarden-icon-white.svg | 83 +--------------- resources/vaultwarden-icon.svg | 79 ++------------- resources/vaultwarden-logo-auto.svg | 86 +++-------------- resources/vaultwarden-logo-white.svg | 91 ++---------------- src/api/admin.rs | 2 +- src/config.rs | 4 +- src/http_client.rs | 2 +- src/main.rs | 16 +-- src/static/.DS_Store | Bin 0 -> 6148 bytes src/static/images/.DS_Store | Bin 0 -> 6148 bytes src/static/images/logo-gray.png | Bin 2406 -> 2433 bytes src/static/images/vaultwarden-favicon.png | Bin 886 -> 842 bytes src/static/images/vaultwarden-icon.png | Bin 1459 -> 1062 bytes src/static/templates/404.hbs | 12 +-- src/static/templates/admin/base.hbs | 4 +- src/static/templates/admin/login.hbs | 58 ++++++----- .../email/admin_reset_password.html.hbs | 30 ++++-- .../templates/email/change_email.html.hbs | 39 +++++--- .../templates/email/delete_account.html.hbs | 49 +++++----- src/static/templates/email/email_header.hbs | 2 +- ...ergency_access_recovery_initiated.html.hbs | 39 +++++--- .../email/incomplete_2fa_login.html.hbs | 66 ++++++------- .../templates/email/invite_accepted.hbs | 10 +- .../templates/email/invite_accepted.html.hbs | 46 +++++---- .../templates/email/invite_confirmed.hbs | 6 +- .../templates/email/invite_confirmed.html.hbs | 30 +++--- .../templates/email/new_device_logged_in.hbs | 16 +-- .../email/new_device_logged_in.html.hbs | 63 ++++++------ .../templates/email/protected_action.hbs | 4 +- .../templates/email/protected_action.html.hbs | 32 +++--- .../templates/email/pw_hint_none.html.hbs | 39 ++++---- .../templates/email/send_org_invite.html.hbs | 52 ++++++---- .../send_single_org_removed_from_org.html.hbs | 29 ++++-- src/static/templates/email/smtp_test.hbs | 4 +- .../templates/email/twofactor_email.hbs | 6 +- .../templates/email/verify_email.html.hbs | 44 ++++----- src/static/templates/email/welcome.hbs | 4 +- 38 files changed, 437 insertions(+), 610 deletions(-) create mode 100644 .DS_Store create mode 100644 src/static/.DS_Store create mode 100644 src/static/images/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d716ba76d82b4598c021bba542996e2c40b5c563 GIT binary patch literal 8196 zcmeI1&u`N(6vv;}ZcAH06+fh2kRov{qp$)(T)MV9Oacz;03kplS-LG+8c%6Tk*Y~O z!~ej)z?Hv*|AiBL{Txb?wjeHu30tzC6Tfe5f1Xpz<)_V zeLvX9%C-_a)t0|HQ1B4|wusxDP{%odHFjcKiJfZ8QhcU9J%~gqk|T!DaT%ja-uT7| zHKH?=F=}VF*E}TvKnzcr>S5(KJ{sc9H6Jgst-BU8dN+Y zsG?jCUvs`?>i+blLuSy=YF3VNnhHIl9T3>2C)7i!#`TWktcsa^Ofg%-d>wF#&>z1a z$+1fNmf`DzZUjY)nxrtVVOD8PiFPrTEzIXJk7+<&c0@vP$|@peD-rt$BLnB0Lect- z!W|D!lbL*WPXm7#HyU5WN};&Awr;Ik73+2HSdM$K6OV>%Cwi%__M{BlA9crl=J&_@ z)vFyD#*QEMBNq5xA1<$+`=KYtZ8-|PA!~cO!75p${c3G8xx0D4Zf`c4XLWn>;7+4% zH}5si&Pvv`8@C?r?wYg@FuJ^p)}oJVx+{ z=_ap3i4}Q3$B2-R=qy>AymrzAFU&sW5HXII>D1~Gmr|>z!Yi#qPZ8xE+M^dx&PAB; z%w<#sj2Ds3MHNq3#%pyppM3m5CgZ6%Of?UNiGp`wShN3wi%EvSc_L8IgRNCyx0k>F zKTlIKV>JW}fj=Z5irrqf4H56^3&d)dw~^lMF3+kg(2`)348~7w<|IL literal 0 HcmV?d00001 diff --git a/resources/vaultwarden-icon-white.svg b/resources/vaultwarden-icon-white.svg index bb241d51..60aaf535 100644 --- a/resources/vaultwarden-icon-white.svg +++ b/resources/vaultwarden-icon-white.svg @@ -1,78 +1,5 @@ - - - - - Vaultwarden Icon - White - - - - - Vaultwarden Icon - White - - - Mathijs van Veluw - - - Rust Logo - - - - + + + Vaultwarden Icon - White + + \ No newline at end of file diff --git a/resources/vaultwarden-icon.svg b/resources/vaultwarden-icon.svg index 91abbd6a..ccade936 100644 --- a/resources/vaultwarden-icon.svg +++ b/resources/vaultwarden-icon.svg @@ -1,74 +1,9 @@ - - - - - Vaultwarden Icon - \ No newline at end of file diff --git a/resources/vaultwarden-logo-auto.svg b/resources/vaultwarden-logo-auto.svg index 99f788c7..5543f284 100644 --- a/resources/vaultwarden-logo-auto.svg +++ b/resources/vaultwarden-logo-auto.svg @@ -1,78 +1,14 @@ - - \ No newline at end of file diff --git a/resources/vaultwarden-logo-white.svg b/resources/vaultwarden-logo-white.svg index 49a75eb6..d3b3f600 100644 --- a/resources/vaultwarden-logo-white.svg +++ b/resources/vaultwarden-logo-white.svg @@ -1,88 +1,9 @@ - - - + + Vaultwarden Logo - White - - - - - - - - + - aultwarden - - - - - - - image/svg+xml - - Vaultwarden Logo - White - - - Mathijs van Veluw - - - Rust Logo - - - - + + Locker + \ No newline at end of file diff --git a/src/api/admin.rs b/src/api/admin.rs index b2601cab..6b954963 100644 --- a/src/api/admin.rs +++ b/src/api/admin.rs @@ -98,7 +98,7 @@ const DT_FMT: &str = "%Y-%m-%d %H:%M:%S %Z"; const BASE_TEMPLATE: &str = "admin/base"; -const ACTING_ADMIN_USER: &str = "vaultwarden-admin-00000-000000000000"; +const ACTING_ADMIN_USER: &str = "z1-locker-admin-00000-000000000000"; pub const FAKE_ADMIN_UUID: &str = "00000000-0000-0000-0000-000000000000"; fn admin_path() -> String { diff --git a/src/config.rs b/src/config.rs index 5b995c6d..3cf90ec7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -544,7 +544,7 @@ make_config! { admin_token: Pass, true, option; /// Invitation organization name |> Name shown in the invitation emails that don't come from a specific organization - invitation_org_name: String, true, def, "Vaultwarden".to_string(); + invitation_org_name: String, true, def, "Z1 Locker".to_string(); /// Events days retain |> Number of days to retain events stored in the database. If unset, events are kept indefinitely. events_days_retain: i64, false, option; @@ -725,7 +725,7 @@ make_config! { /// From Address smtp_from: String, true, def, String::new(); /// From Name - smtp_from_name: String, true, def, "Vaultwarden".to_string(); + smtp_from_name: String, true, def, "Z1 Locker".to_string(); /// Username smtp_username: String, true, option; /// Password diff --git a/src/http_client.rs b/src/http_client.rs index 5feeeedd..ccb07d98 100644 --- a/src/http_client.rs +++ b/src/http_client.rs @@ -34,7 +34,7 @@ pub fn make_http_request(method: reqwest::Method, url: &str) -> Result ClientBuilder { let mut headers = header::HeaderMap::new(); - headers.insert(header::USER_AGENT, header::HeaderValue::from_static("Vaultwarden")); + headers.insert(header::USER_AGENT, header::HeaderValue::from_static("Z1 Locker")); let redirect_policy = reqwest::redirect::Policy::custom(|attempt| { if attempt.previous().len() >= 5 { diff --git a/src/main.rs b/src/main.rs index fc104997..18deae1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -76,7 +76,7 @@ async fn main() -> Result<(), Error> { check_data_folder().await; auth::initialize_keys().await.unwrap_or_else(|e| { - error!("Error creating private key '{}'\n{e:?}\nExiting Vaultwarden!", CONFIG.private_rsa_key()); + error!("Error creating private key '{}'\n{e:?}\nExiting Z1 Locker!", CONFIG.private_rsa_key()); exit(1); }); check_web_vault(); @@ -95,7 +95,7 @@ const HELP: &str = "\ Alternative implementation of the Bitwarden server API written in Rust USAGE: - vaultwarden [FLAGS|COMMAND] + z1-locker [FLAGS|COMMAND] FLAGS: -h, --help Prints help information @@ -119,13 +119,13 @@ async fn parse_args() { let version = VERSION.unwrap_or("(Version info from Git not present)"); if pargs.contains(["-h", "--help"]) { - println!("Vaultwarden {version}"); + println!("Z1 Locker {version}"); print!("{HELP}"); exit(0); } else if pargs.contains(["-v", "--version"]) { config::SKIP_CONFIG_VALIDATION.store(true, Ordering::Relaxed); let web_vault_version = util::get_web_vault_version(); - println!("Vaultwarden {version}"); + println!("Z1 Locker {version}"); println!("Web-Vault {web_vault_version}"); exit(0); } @@ -221,7 +221,7 @@ fn launch_info() { println!( "\ /--------------------------------------------------------------------\\\n\ - | Starting Vaultwarden |" + | Starting Z1 Locker |" ); if let Some(version) = VERSION { @@ -440,7 +440,7 @@ fn chain_syslog(logger: fern::Dispatch) -> fern::Dispatch { let syslog_fmt = syslog::Formatter3164 { facility: syslog::Facility::LOG_USER, hostname: None, - process: "vaultwarden".into(), + process: "z1-locker".into(), pid: 0, }; @@ -607,7 +607,7 @@ async fn launch_rocket(pool: db::DbPool, extra_debug: bool) -> Result<(), Error> tokio::spawn(async move { tokio::signal::ctrl_c().await.expect("Error setting Ctrl-C handler"); - info!("Exiting Vaultwarden!"); + info!("Exiting Z1 Locker!"); CONFIG.shutdown(); }); @@ -629,7 +629,7 @@ async fn launch_rocket(pool: db::DbPool, extra_debug: bool) -> Result<(), Error> instance.launch().await?; - info!("Vaultwarden process exited!"); + info!("Z1 Locker process exited!"); Ok(()) } diff --git a/src/static/.DS_Store b/src/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9c6941af7375be29f8cb0f27ede093c2a0216efd GIT binary patch literal 6148 zcmeHK%}T>S5Z-NTn^J@v6nYGJEf{MlikA@U3mDOZN=-J>@XEMt5rV*X!Zf9$2UL*=As^ z&xfFo#-q)qYaAXOUtCXLl6flL6p{U(`OGpe51H=F^ zuzL*Xv%u)>Ug=aZF+dFbzyR(K7BoahW2sPX9nj(R8T~Cp6wvW4foN%TG?og%1Hx4* zpi1TXiNRGm*exCBXey()>_b>prK$~i3$klwMzgDa3ASQr}A5nU8V!lML-fl9Wn3=4158cB}@tc literal 0 HcmV?d00001 diff --git a/src/static/images/.DS_Store b/src/static/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8371bf954892f13d5050a992fbf72e6753961821 GIT binary patch literal 6148 zcmeHK!AiqG5Pcg9R*G0b(Tk8DXi*T)vDAZS&w@>>u^1bvw(2c+|HG>v;z#M5-8Hmn z+M|ffgxR;*owt*H8?spdrZX8F0ZjmPx?r%uqQazKe8B?WBAv#L@qiJM^EB(n=|Z$N z{6z(1?bdOOLwXxC>zBpsk=Nps-u|-28qmNs#=J6m3om3nV*0b{1?!{4+QtofNO{G? zKJLgJ5;MLrm3hrUX@oj%$%y%k)$wno_)X@@kkDH!$ISX#%?x(QJeir{7Va56Bwv_A zJTdcxnJe=KNh$9h)#x!kCGVNFF$Pp@#IZzy>FQbIlB2!PJj>3~(N?O5&(b)&RZ|62 z0ac(-fP1!Bz2Q(xRX`O`1qub^`w-FvBagX5`{`g|j{w9Po2{`fKaIi(Jw_gLhwPyl zMaha>zL>d}GiIh^gj0hdfREAPWO5vLsO}bDn zQ%ao}qog4fb>|#|2S`%>&mjE_7Z;bgJ~Ek1BogN`bFrJ78xQ~nkH-Ty0CskE1Ofqc2V0PxD~51j zU?2d%1;x*vKa9|pN~QiU^P?<;Aplk&o|^@XGL$LMeXa{&pnrtSsf}=?RfwS`a`90*nV%$PSbMLwe;iQIc~D z0t~s7M#wdn|91*vKx+UX47s2d|6r6UFbTjv9Y30acMV}k02pXg<>U}gqtT$0QU+X* z1`Gg^V4d642IpN4zM&6E0e+icH)p$5T>LvW+=)Jvb>xY}nW4;{D(%yW3>NdG6viY1qHd!32da!qFogGgn2-!Je zEoALcy#CB6MBl}=$j~{S3*555T)4h*k?-yp+e~~xQ~k+%>RujcUe_o?qXSN2mln~} zFEBFq`fFXIPEq6D9@*!&=_ulp^BM2Buc6y}93J{eXV(6f zZ0N%{W_4>Y!je?DG*|!1bcs76|6^6z4x>gr?4vrlMzE!*dCEP) z^vn1S4)t+QO>9Q`m0YjRAv1H)h`jlM&m{ORkew zJdc~flYAzql9c=gi#xxazkH49C#P;YSWl&>3q z+2A90+nRj_g43|XXPfU%{K0$UqmT%-?u3ztK1X4ZM7^Sfdkf8l`s{o4Y8LOa7Jt{f zsQFoeE*kYXYi2)D$}HHxnzqxVw%ThC)N0LE&vP|fWDqIdX_HgUddJ9|%qaTw#+uSi z;JMTvTi=mFwx@&{9(7)}OJhO!)N;Vph+85k(4co?qxlox!aL-o@i@-A~IRe$kDg3uh`T z3-+sT)c4-B(y@BCz3Z2P7mV|2jTm;vFMJ`Y`W_+CI!Cm(0vQnP#4-%!6}52)?62(`{ef1Nv?zp&Hf|>;Tsj4H~z$J>mdp&tGjrU77(>Jajd22t^ zEeRiWiPV-zG{lWXzISfwO>KTtdRiFJl;@xPXj$g@Q_T5CgnaGL8eOxz6U{kHVG@DG3H}F?O9Co5Hx+)$8=8D0Hbo`Vv z?#$}9j%f^pq|Do==NWdYZlcxj7WX-;O1?((=%!LROw!fZ!EpJ@)T63R> zE@<1$DJRqa6y%tzVosv#-9ss2{|vJ>UaIZEr)}CTwNt7g2Ku1~NVgV~o>)13yxQL( zy1R=_;AW`xrWK>cXC0(X-(d3mRnfnurZoJrs*anL%aY%ZsEHenn&4>_T<15?CSf2j60^1U zR(I}e#q@p%S8F>qvMOY7XxcQRuWF1|8!kO}F-~>h!j_c$i1cC9!}v16A2tpxi^HXt zal2E82a2!aBnV8TbF{&!D<~D(F*nayzVYF|iHh=@v#@NY+%ciXM;H8OU^EXu_ZmvX Gk^cgA4c&GC literal 2406 zcmV-s37PhZP)25DT(3<50X98Qo!Sz>vEx>BMn-+|7Ja=)_$7R(n5c^E9Usg;!MJDJQ$9^9{1Bayt7k z9OgXvUv0i1)tLdW6&Ze1sN=w&fVOZ7zi^iI|6UIKGm8X2D!k0MbRid`nnOjx`zCUX zfCaw?-xhcELroqLy`BF=T1hgtvJ^{i8q1EpOnBe>!uXCTX88AFMA!dE!mo#j@ys3w|8SFyyca!wYzH)3o9v z)O$PujdoAw$!4-KY#=eh@CW@b!Y|1H46otQpKT-pM)h=D-zxm6ZTAqzT1FwWff1C+ z^Q8oL@Cp4H!%*7ujJAkyE3b;4kJ@-JXluk@z~_82#j>4OgBnjI8d3}QSsK#N4Fej` zkW$zs^=&-DJ^#Epq&y9g3WhS=#Z%lt0(LL=@gz4<5|1k3;8TXHd7Rs+=h`W&{g&ny zp5h@b+j*TV>FO&=Fb%_{#Ii@D`%~PGn&_-JMj~fom`^D_5L-5qrud0ejHAbR4DEyA zLF?O=%@?#i9u7Wb_(eW+S4;5dPYmU>3(k^@nx1UK-HWN7oH?4m}65o@iy)5SvJdaCBQBwxr5r@YQ+RYYR z`1AB*X@^G)pIM;OxmF&rBPK-s+)Ux&Kd$|_@axIn7g_x*7Rw;Z@;rvU#2~XrMly$= z_=s+t#E?QGZ1_L$28Jx=FqVmko%1+~A(ei7LtEBi_>3$YKIK>-9zFSpw(OIT&{lyz zkntE6(~e&lD|7fHjbuncpcAQqxN`wU^%Cnr>Jd=;Rpce2QMi`+cJTTIu?bGpDgZG|1&v;p@YXM%*BY_V7=vPJwW@(vc9h~ zVka@$)#X8}k24VqP+nVa#)#&UOyS^*@H8fL!R0smAVf}H+p-YDZHj8Y_8KC5g<&CX z%9=wQw$D9cz1FeKx8ZXdege+?Yb5lpv)~)Pbb9y#!$yw-8qJrZjl8Rv_oIVhjrx9W z`JRK(sEj3KE3U7pUHtH+{7lo_JOjf+g0ww4HvCi$51$t#rd{~gxW06fwZXN$X~P#* z%UutaV))L1e~RtF!x+*%PGL@%$ggW19izF=sM^PDmxV-r99QusU(<;m3|9CJA^^V> zS$T0u6>`a;JXc}Z9nA90B>{v3UxDfZafbu{sD_Wdiga^rT<5?aFNv*!qa!8HD|~X? zez^vN5vT;TMo?jvLhFM2V-~+#|MQ@o^NFD;2QZH24}WPP;EOOVuO{O~43qJQrGV)>R_NshDW z!}om1fDrggLg4S$=T)Ji1Ai-qO-u>VA1wH5!ot@&UzZ-8me~sNK0L1dt1};FVzkb$ zujy*IuKxb;@OjUIf3(o>FOYXGMH#a2Qyp0(krIHu263&Xc^`}GW5rztSr^)`IrG_bJn<22)bXS?u_ zB1xqr`!#($>v(-Fw&2+gFNb8(*F)g9$B1qwE@)|60Qe6CE!&B4AB5hr?fC;kOZ6U! z;YB7$A`%PnGXBS$v3Dx~{2wuFb>EW~Hhg*JiF&@tx7IGWjO9~{ zbmxx49XdZ=B#EjtC(VKHzTbEr=3#na3IP8~^=Z!?Ji+&zip~ipu-u-xviSCrWY$1! zX}Td3;dC+z0RK`9h9^-A$!v1qSKy?Ksu1wyJYUb{huWVpUG#zVWQ75CH=3||BIo&( zl!3T<(1lNRd1zNpGNna_3kz;_au3tx-9_i;|4#P$bj;apPWIkvGvLSzn=`Lh7< zE3zn<7dA^ErE)2oZTPac&c;aF0WB~p6%@WseFCgv4~B(yd8utjNI+_9_OX&cxS!#2 zJ2S`>j~P57y-dW1kD8XxRSc8JOkokPkVGsq#OGG>wlO}@q3$ZgoZz9 z?o`M3Ik8>u*iL1D%pX5%c~=VPA&fzf;PBCh@K**}v0U&TrWdE+@f$uGI(?tTuWXXh z9b-Kmxkb-*9>d3A+#b)zhtIyf&^Z{7S$xPO43*K16*(Buwvt->%;3FXw)fLL-0cP8 z@j|2!KA|GhzX(Di5qu>H6zSg1cs$NTPB}OmeK@{oCO|{#S9GG z!XV7ZFl&wkP=RKEPlzi}l8;Go6cG%8V|7)RcoE{-7;bCOdO z7$n&HncR3f z`wA9|^bKnjKXx&$XYxEI{(@_X=)&pE6lItCwmd@XsX0YS`Ovj1* zFJ5=oCvf>ltbbu-Fpo{kptia_`nw2o^CF20oIUP|TnA?5_8A&P7|SJXU{B)MaKC@e zflk2_rMC`0IJKjlaW+%(#JfB^c|Er!_cTaw?b)WF`5~3%lTX98*$#geZ*p)ZC=_MZW7Rsgy3sJDT|~1-J3z!G|L2(o&PCG>h#axA=yH|w xbi8x%_Yct{$^Jj?H}v`aIe)+;-yp@7;d)7)qA%-e9bhanc)I$ztaD0e0su>H?XUm< delta 874 zcmV-w1C{*B2KEM!8Gi%-007x@vVQ;o13gJZK~#9!l$BGoHAfVL_nGtCwryJ%v2EM7 zZR0twv2EM7otbO%ORb)sS#!CPs+Zoit1U~wXpZ4|LR#ns%0|4%@r<=B2-u2OX(WR> z{s2A~;SWVw$oU4_5?Bm!9K=7_PTnQrN!IZUTZ_-A^dyng?0?`S9O0W_EB?l#L3#z7 zC}uN^q4XAqVr(XEQYNAy+r;+q++QKZ2dw8PMq-Y6E)?@V8p+YDmm`BW8E+h$H2N2> zaz6u{Ibb|nGn>oB*=(&SaQXl_UX|0MiBpW{@OYV#jBv&wT+UZC@;Xbz*J)IAg_}ws z$4EI-yk>;)+TDI|PutYACyUK5>0lZ6r8~$|OWUVs}!&) z$Mv=xJIc9I%2U(<27j{NCHG=JH&Vmq&ODG8N$@Iz zvY6vpBsf1-lz}F>Hn|R;PNwh$Ta(AQh8UkR#@Uzo8&<+f7mrcKK~5vj)_l=<0}bqo ziG6vTcz=BTP%O2f(+1KhoJN8>{E<2ifRkN0km@04I)!u*#cio4#`jEh%3S{7Zx*`p zRH-rQB)mUN^e&_SZa(fk44ofvPP)Tsw@I14-?iy0WW zg+Z8+Vb&Z8paR(dpAc7|Gyhc0S$pe%;1?t2{v*G97ct%}(s{y?v^74)=8B}2x0lcd z!{(kDYZfX@-)3xesL|(lUgEt-ld?Vs`CVS53%GP=Ea?zGJeN&EGXBw|NeWu3 zUiQZ|Rb6`+H}&{y7(4tk%(G1538-jRuj({(_^2r7sl<~oz0TnV!_(h0g1pKVw!Dg6 z(ZIDSb^AgS6)97R{G=D{sZwjDGnf(<)XE-ZwYqK~%W&FcSNKJi4H5@dSFk$U>s)>j z?K`m54(eLui|6Y6%7v~Q!+)Eef0hwypVsUg3D+2e6SMME)kX)^6bGn1=YHJ z3r{FZC)COW@4qU@(W{}-n!t1Ra6%X7sjZ1A3E~YWGiBN~zTs=obU(%{k!JnQ)sR8e zdiR@VO981b>#7Z9mlyKhXQV_x+Fp6hc3ZY7H^tFvLNxL3na+WD)@ zpjWr*qa?$56S><8TfUd+{F2%R+$XJQGGC?3E#lu% z(O$;c3wUP!zu|r0KyO7X&;rKS8(yiWIDDvD;c!7&$Fg|?V~3CM9;w}RI~WyLZ;%w= zyDYYislDzGn?jUWlKu%Jg(B4{+W(}d*R_@NoM2N(PnVg=CVt>qlg1o5^>YkwfSit) zu0)1yMiWJt3sR&W@peSI&1Br@?Rlv`vq4EZlWm4RQ}C;RcfSu_iSR%#1(6DFK U7M;MgKo$dor>mdKI;Vst0LG3*!vFvP delta 1452 zcmV;d1ylN_2(t^28Gi%-0001Bxm5rF1$s$DK~#9!wAll+D_IuC@tsNEJPq4+XY4i> zMs0gxY}>XyZ7;NK+qP{ho%@*ID5;gIQul6ww7={pzApUp4SDOFRbNi+_@+POqdP2t~HKpbir&B3oBr%BmBsc zLR%G&cvKZ_VM#x7gsBTA;4PqI9~UU+Kut{tE9X3W>wvc`n1I!cW264I9LH)4CSXa` z%mv>P!gsQtRDZGL{0Z3C)&68#yG!Z0*f+e#bZ20mqa9-&&M?EezUfjuDZAR%pImL< zdIGLe&ddH_t)Ub>!+vuHJk%$Wp&J{ zZUUQEY|W31sU3^_NC;bio1B`}R%;cL@LI65&~Os2>heQ&8&gBy4)f3Q6eDT4gLcBTg zz$NMkNZ*3}YI^)8x##aJ^}rf$L7If+et);FBLB=i|81!Urg3bNgvmC%p>$&Ei%$); z-wpSt9#|STC)+SNh+e5EJyT!YB73%3g$Jg&G?^Ym`J))#TRM5I5!-C9)B|gks~vAE znh|_c)H-NhGF=Eucrx|C()cbE%&2e2=aX?s#q`t{cgxH+&lf6IxDtwXoOW|PYk!wc zPkr$yAsiylY|E6+Z>J?+T9N^OOsALn;wz?`@NA_AmL5WBNtPC+or>Qf^~LRNQR;zd zEbZm$qV)TU{8@+^zIdqpOFb}+zon)=zA;JTPH4MI`Yd zDdRnGs_V!&N83c5=JfC5eX(W>zkgTSoYrg4zoKDvoBNty+Mv=G%W`J}zw|YmTV2EF z>bB=UmNL_TNvl-&VtS0PV$y(F^)D!nP|i!{fjujHG4;Sb!8|W1=ZMjlRJ$1FGaBCF z3H+=-?nh+w^rRm6Gd%7s8a`{79n(vyao2Q@4(;Njs(dl=z@ubWTDhd%c7OgaDrZ_j zXgC|URrzA#fw$u<4PnJx4*Y3Bu4?b`Bd2CLzE0|kg+8#I?UPgd$UP($RQs}eS7lu0 zJ3eH#B6Do+yDnG8PRV8ULSNU - Page not found! + 404 - Page Not Found -