openvibers/afresume Commits

November: the 14 OpenVibe sites that went live since October, the counts that moved, and the coworker link (?PAE2)

OP OpenVibers committed 6 days ago · 6a4d63e210 · 34 files, +158 −50

- The network: Design, Report, Today, Tours, Fun, Meme, Surf, Cam and Open.Shoes for people; Exchange, Vision,
  Website, Domains and Node for builders (each answers with its own page). 53 live sites behind one login.
- Counts: 50+ sites and services, 1M+ lines of code (about 1.3 million across 69 repositories, tests included).
- The OpenVibe role, plain English: 50+ sites on one account, the stream write-ups, the move to PostgreSQL, and the AI
  side (one account for every model, agents people watch work live, your own computer on the network). The
  engineering one-column résumé keeps all four bullets; the designed PDF still fits one page (gaps 8.6/7.6 pt).
- ?PAE2 in capitals is the link for coworkers: the same album and Break Room Simulator as the hat link (?pae2,
  where fc.tools sends people), with a welcome instead of the hat line: a hand that waves, two ripples, the line
  rising letter by letter, one light sweep. Marked before paint in Base.astro, so it never shifts the page; first
  on phones, across the top on wide screens; still under prefers-reduced-motion.

Changes

ddiff --git a/public/Alex_Frison_Resume_Data_Analyst.pdf b/public/Alex_Frison_Resume_Data_Analyst.pdf
iindex 3817c8d..b4fc479 100644
---- a/public/Alex_Frison_Resume_Data_Analyst.pdf
++++ b/public/Alex_Frison_Resume_Data_Analyst.pdf
@@@ -47,7 +47,7 @@ endobj
endobj
8 0 obj
<<
--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (Data Analyst: SQL, Excel and Power Query, compliance reporting and automation) /Title (Alex Frison - Resume) /Trapped /False
>>
endobj
@@@ -58,10 +58,10 @@ endobj
endobj
10 0 obj
<<
--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3015
++/Filter [ /ASCII85Decode /FlateDecode ] /Length 2985
>>
stream
--Gb!#]>>s9I(4OT53,_0-D9%fXR!i+YaUYY=&7B-`X7F])g3+!i>3Tp54>f?P^XFdXL&_\uC+:B<**rEr^[n"[Lq<A<r+D0+*F@4,pCThK?-aqaGPZE07OQf+^:]<f-O3"D*5tcf+"uPuV`Vhh&O$&/k&53@e=>EklPsQX'^bMFEPs6n9epuamu=WaGY?Z'e+MU#g*ce\O>n5@)MrGcl+uhD&u#;R&/rs+'.f#n<0O:jmW?jNs%_eLhN\f#AWh_/iq$CN':8Rc!8i+?;7eb.O)RZUdspr/b\Pr^UoU]U]7>NPA?(M^U@WT/GfMc-ca@V:F6+1feDL1+b2QJ[Q,`6rHo-;WY<.BVgKjg(Z1O>($R]UcLhpYY!F:+7CXL70+u9j#8f)e&%=P7P=g\MbQC/@S,0@o()[DH"VaTWg/tCW5Z,,Y#HH2*1h=Gr"rTF*+Er!IU&dJ\`O>s$^DZ7L[_V`Od]d`ls3VCF_%UI6@lEOh'j)/q^2_%"I+e_K8IRpllQHM^[email protected]=+un$-VI5#lpeMq9cQlJnV8a\o]XbW:.[)HR?CcF]))2+HRg5:QcGH"eE1A/l"(7mYu6s"+k%daU/nbXrB%"<<YeH"'rB&"La-5-d^EgmWQ^'k5FqVSL,<R1h4dm$`Dd5/>(8c#,"8Xe<*;FrBdso+G8_WaFHIi6&IGb!hfP,dgTf<Dml9\dkH*+AAOoq('.'0U<*;=:D^F^$E/H-.X@bh]qYVjcXt*.7CY);a*oDdF6^J9'b*b.#150M+P6J'2(GA`V_8kUeG-9/2;655P+[/XIQHDl\]UN,U5ht`25A'1]dTkjrX>J93;1j9FFC55FCo"[sOg::L$F50e3*TLg\$a@>;)l]AD%;I;/Wtgs$7^qGo6b]lLANVub@g,)hkt+"=1\SFOO`5q:;$i:m_eXH$RBWtKse!tk@sgDh<RTPGjVsiDJop/>5,l"f>G^3$#LrNe?JhZP(&TlFic,O&(QG;(!c$eh@$eX;[email protected]_hZ*!WTb=Ueh-E]@HLX-R)f5jrEe;sCi@c\B\!.PTii[Q[_FS(Tr=/??*B[O6/952[/qUp`VdTCu$L2u+YfgV*'o(@`QP6/:u99n:R&GN]VWJ<+i0h%"k>b(5&6+=I$]<;OZ$U);Xqj?d)]"*qe?-ZON(I"(IYZg/:-E,\Z6ep/0>TY%OYA\nIGg6.MdWo.6.X<L]?fNg?L-Rr4+1.@aQ1UmcR;sh'E)@hZOrMEVAAP0UZo"fIjhSd5ei1%FKgja8##s:haA3PZarGL**dVq_iL=6dT<ApO8S7W?rg6\gecr9(2mefJ=F2PS?094#!;Heib0KH0mo#%]I=BqF1K@CuhY%l0>?$Ip59<X0W\WIq/@r75GF@'Df&hBF,bP!XEH6>No&8eCLX=n,_lLKRQM[?E05`07CYbDA#*LbNrC"ue'(hSeC17;.+#.<WDYIglKPnH?[dLY>3T%pK)s5\GYu`BS<P"F*FqU$e;U$ZY`^AZ">qc@0G%f8BFs!^IR!Re8n1Z#.2tOt/=o12tNP%*(qDLQ.pB?O<^"UqDFubjhc'_B'*(Eqo27GUVR1ImO@iH<gVO=aKpiWft!iT>?C^.9-,J(f;Alc=d7fD:SVll!`#<Ze0M.TTn!Uq4UJK+*Y9VK)#Opo_5oD.IG>q:\.>VNC8M4m1QSE^GgTj!@*W8Bq0Zs="@QkEtekI<r=jgJ5o=f&^C+_*;W4TS5=UUsNH#u)o,H=f2?%E92g9c;("eR_T:?`-L8aJO\XR98,PYb8*`V'QrV(1k4#R/ZYM9J$o9p?50f:j,!k.IbcEod'<emh?<t1[lN>mLJ+)MrGg9QS.B3%VS\C1jTY\fEo-N2%Uh%a5Frhg5B['H%?0W<f^XU3ESH>:[email protected]#hqI1](.:P(3Z=3)FDNCU>LBPdq@+$^'tH5Te9I.02H(>Cd:EKD.Yb0@j;QAlUn::kCADRG5<o<p39BS0]aA5Y+Li"cC^IS<J[C[p`KfesS#(,U,"VL@Au_nS.,)IOR%MfR@+G3c0-#L!a3;c8M'7l/a?*=%M-pOE;!GSdTN)W=;]5<?T^0;ZR#7N+&+86EO7"-5*j6MrJaVjfRZ:\:2cC#XncSR)VC='&Ho!l"gI[/QseUFssd@^N;4%,\.!bMH`X<pj%dg(1[,36"3i&U#:i*4RN_AO&]LKlLb(=b1d^(T^pgm:3Sf#K3:A<oMCTt6/[uiCL.5W![_Ei#[kbaXe5XPN4JT0F,21[/;=Z>`e,tP>*!DmVRDV:4rMtdlZsRhQ#Rq+m05Y=W"TK1bu%(7LM-dacU9Q-Nn_eXr=C[5GC47B!5FUZ%kRs_o46)s(?j'0/t)e=*VsN3a(aCmD2@3n9M7Y"r/5&+[[G./_Fq!n]L.n@(//\Qbk.oYeW%MgZ6&5-.q70L*3cK*ir+U@I"*;Vn'bHhDpt_Q3'4L'7^#cI(R('8fCAQ,e!E\!9BBCq?T-62'92$BB!.M6R-63&Q#/et]@=l>>([hLnlf=DJDY1]kkRs*<me1&']IiSN%b=_bC]BoeCU8qFPE5#nQ3S$"k's[nLh_L*&[jfI]6/W^2r[4a(Vg0q=-RskT095L(M#@m+?U=.Pt;IZfjVmM=CkRH#!qsh/##[AeT^fShWLQNY-K%TDQ;l3W0KIkGt&k5IK;U>F(@sTYq!R2\uo"Q6[+Q/d?J3O7pY/?R!pP!qEUFQAO%qQP[4gpRo"Ka>.\5_rgd#AX8MI9](*iMGrR]7jT=Ymk]sY3nJ$fg8k=?0(i38ipYV52N%@72bMYa.2,\^?WlIq9AjQG0p]*<H"Ao6U[[:i?gZto@NYB6Aj-oC'l#RmcU4SmY4_jT)DI7lmaeY\gV!-t6n%h(4UoW)T>%d=o'O'=TpMY]f[+6I^]Kk<f@d;j5(%24p4KmI'W?fg#rO3ApWTkM'hf(e$8f(A$j!'mi3uZ5<>\CaOZ8:s_/88"P5[Qhgu\?g^UOS<j4:@*+<Cs.0TIF,,*qLhIT=bek5X/a8)j~>endstream
++Gb!#]gN"3(&q0LUjP.bfJ>'L[mE;5^G;LgQZI$nB7eihD/tb\i?1"Y,0GF'JHa9YcO=U\gXI-6R5e&J4pQHuR*GXW4j$2R_kkLJ#^$ecFU>$Q.HEA7E?I7BmS'Q"6eW]q4/e4XOlOY`-HE03ET-6AqD<>bU=Jn?t9=GeaNi7$?B1Et+q-]`80D+*LX7NfBq`EX5NMV'AcNB#VdBJoR<K\F$IOGfn*sSDZ)RY/c;35NjQ-Z#H)t`#BI6*`diERj((b%Y^V*At!(\R=#3uBlfUX9X>">p')J'>R6X^&I&lFdQbpeE.cDoFbaVt,%ZPQ'@iFtd!8;,7)7X$Ys`Wi7guO6+:,MgaFHfA:E:GE/N/r)>XAj'8Bql],ZLnY/<^?XfFda:l/9.r"3W.F#Fi:pEQVaC@e2(>:`mbWdCGV_d;]hMCi[0@`.17.7;1Hh*fPbONjWp.=TqbX(6=<k.r5IgLUCrq.W4%qjB2EB:HUV9*5foLJ<FQu>s:+$i5aC;#^DXW<adi,W!ErqH`?I'.K=btjXqf'/`G/K-\hBAsGme+q,+0qFM7jYA!gO>ONEXgo+,o:+2J>%r%:9D,<9pfJt=]T>^UB:VN(h>TL8Hms-7c'f8VA&Jt_.qoqZ/QM)Qd2t#h=@4"VTl*[NlscuK8Z]\!8s(5t(TODTZ8@gSKfc](>.TOMdYJ`C`,E68D!]efMKbTaQ?-)@gbL.VeZf`^=t2+qQV5GH$_3s^3%^>UJ3O!RSa"RcdFpHfJ]G6okKp%oa)\&:KM:>CjCD#$aMeNuT(=\iR[rbc>ib4CCl"-NZ)&WZ%e"!F+:ts8_2kR!8t(Z3P*H5t+_n4lKas&lM7%H70N(rW<)+4u!+u]*osRn(-ZV]pUs3=fX@9ek<^B0:[@Y_4ro!:BC&(FcrVQNP@^8d;+'JR@jj^DPi''9t\NmI3:fto@G+Q,QfY*-kOk5&[iXU/$XDo?+IQ\a%Q-_uE8I`:]-gA)X<L'XPr(qft<UPf@mCdHH,c0O#:oS<u'\au7]pqL9AF/UAp@oWtGs,6Z8H"@JY1IR-%Ib1='U.1J_U1HV>o,9oUHu@5/#9`*k\"\687VT-(s7!UA/C6Oak%K7NH=0p/l[5E6/:M?k8q4-`tU+KI!r`T"mu"1mCjnY0D#6SmpieAlfL\5FLbZR?hdGm_J5?-)l%:HO)[tYF+&B4]Y;'fs#'EF6t]YjX8&[(I>u,E(]sNkIaD?!7+16rUrof"_aT.SMshJbiru'Dd`SN"QNIbr>2S#Q%MnHK),P$;+?u.G13LqQGj*OlO)G5.I(i?,a/RUMpg[@%BbRuphpG%k@I6si]#]tu!:UL[OfdMLhMi5Sqt.<_(Fh)QGhX_oDbqV.r-1J\WChS7ZKTjpgLjirZSCqG+o1K6la*)PZO\ErH\?PQCL6ZSYhT>7IrRP1h!!%J1m"4nkU1]=<hRc\<Y691s+DQ%Ek=j%'6N7t[^AVJbP=Vn?Sel<NP%lS8u3JpBdZ3ga5rhcFu02:d5<_AI#f'!62Qe%Ni5%n":l/DHTP"cQaNGH_kED$;;^O!c@&!R<k%XAQsEI`<HI;$5)3"#7E)B(6fu;Z^t>*qJ8$?H3.;lbUB'Qp1ReCs\O)Wb7*MYHg8I4ulr:Aij+(dE2V'F:+TNSE/oV&%Pq$mbFdrLoJ%[email protected]^;G"nc(JP;EYU!)oU?n/SpY]%dc&/'C=>[q';%V'geuB66cm=4!c8X_4M0csV7+jckl9?!ZSmo6%(;JS]'<P_ukc!=P>'<*F=imni/'_t9:l@VV=8Yt&HLJ?nLo9S&P-X=(hCHma^ER=PS\FSG:5DC>9XF6Q/3kC=HS$_ul=NLc_`=TRInH44[Bd9]LFb]>U;[!Dkmbe`S\J&5_Pj1ZWK;)m^ZT@g'AO9?iM_1<M/?_^%-Us-5K?]1/h"T!(_:,0g-/Hn1o&)IQ)]&%*8Rs![H6OCV[A8^Zp?)'>)F-a2M!$Nf=,q)4rF&!?Ogm2dt=D,bnPDDd")T&\o`i#eSpk;80@f(;il*TQ+f1(*M387h!VjF;H>Tm+>5ghedGV6dkVm\uJ<.RRq9Ec!#0ns,&$aj$(R>Bsr/;cp1Qa`D2iVG\R,8:;@@N#@=M0X;"dHMF^)miaElr!+'HKeo$8]V+Oj@`$[q0@mhf#R9FJAeJC6GXJ3Ggm\>*ilqef]rG^Q+&:-=VMB8=Hb]eNjfrVAJL9D4N.Be\\3#P@_,t.3snocos!OVOg2/`fL0JOKe&t2FS@cNVTsV;J\Yok81@#+F!i!d2F^92CG0sdZ3sqP)li\FSl-E^q;A4QiZ`s9To10U`lJp$/U<GUN/L&EF3(g!nGm1?&EY&V[=a%cQO9jH5%tp?JPf,WWErZo!D0-PRTNAnqtCgtFBDItmk9p]I9FJVAK'*^Ard^ui@EHsp%U*/Fh52joVKpp;RdF\Qc8R]F@OY&1KD@L9'7k,Kj?tTCZ4QJem(_(XB+L*^pb79H@F>N;dV'u5rc>*+]/)O)6d7`L116AgR5qK'4Ia>=kp[dP%"n2'>K[%94^5:Y^=g'[email protected](9#[V*9lnk"89iUYaq%$_>3'urefsC$'e*RuT#@Ol.o\FNE#eSF/^$_YcrJ0n6Un[*LD(idB-);S93/?PVJsW3t,\&hN"$;?0GN?+a&a;W5pt7f)7:Flm$XK3JLg+e&R?pl]o6f1G$VC&hD_u^X.<1lOOq?1<WCCc2l<GL?2LnCYHE)7qpMC2jl1A;#<3.?D.`raFijKd[[`]N2=So`dg]'#'nWL(rEs8fZHqcC=MPLY<)U.@fdW8?6K`2AsLcK[[f\p](Bk--9I&<J>B$F-/iu*'H5VhZP_@m#fBU2JJ"g3BZZ[I7LnCUe/#BAug:_<d@C/jWhO^W)OQl;t>BP(Nmq4[B;[m\8J(d'Nm3/gGFD<.%Dr]DI]c/kA.\.(jnet)IU*Xon>DT'sIQKjD+WhAV$rrL1b4q@~>endstream
endobj
11 0 obj
<<
@@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000001249 00000 n
0000001314 00000 n
--0000004421 00000 n
++0000004391 00000 n
trailer
<<
/ID
--[<0708869bd847a2f084ce65d9fc9de7c3><0708869bd847a2f084ce65d9fc9de7c3>]
++[<5d29013ba6b75c536fae594dd3cf204e><5d29013ba6b75c536fae594dd3cf204e>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
@@@ -95,5 +95,5 @@ trailer
/Size 12
>>
startxref
--6392
++6362
%%EOF
ddiff --git a/public/Alex_Frison_Resume_Engineering.pdf b/public/Alex_Frison_Resume_Engineering.pdf
iindex d3b3279..9b1557c 100644
---- a/public/Alex_Frison_Resume_Engineering.pdf
++++ b/public/Alex_Frison_Resume_Engineering.pdf
@@@ -47,7 +47,7 @@ endobj
endobj
8 0 obj
<<
--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (Software Engineer: full-stack TypeScript and Node.js, payments, identity and live streaming) /Title (Alex Frison - Resume) /Trapped /False
>>
endobj
@@@ -58,17 +58,17 @@ endobj
endobj
10 0 obj
<<
--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3349
++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3240
>>
stream
--Gb!#]>Bedl&q801W4+auJfq59o<K2p@jZBY!&N:ga"NG%!l^=+dqY;4P93"r[4^*bR!?Ya:F:-J(8C-g<Rk0)9.g'_mAh$:S^-Km)jf><bl`!ubq@6ol$WKiY8;*PA?V&`K=9Ms`YWU/g$7V4!U[VejU3'jf&q6j*olTF\]9)@gZ=W[7ZmUBDfhAGj;#p(dJR?&m0!@T8F-il[D[5;C$0nG,1Jh0KXs!V()F:cWB(BMV,<(:+%LEo1m>eD8<V=tgq9Ab\CGHjE7O1`)P,i+J6N)DreFh^X)0YTVS)fa"qJA4I[DrT'u(6BfDHe?X_^(&L1Z](m"b%.RJ[XLUs9HP4r?K:f?IXhm1s&M/?S"i'ppl&V"8+7-;s+B$M#T[A4CgQ1uG*Lk34QW,SHa+.:4ttAIbPG'?e>P.eN6PRZ78.$L]6O##:*8c3%,>##DY$]uQ"*@E%\:=/5#PLEuR)oKm#Zf(e_n^*ruQrq[hD&'*0?1,rGOd;7\p]j[s*jp)Xi[3;4J?FKo@F!gsn$imD2MACISq&'2KBdA\6<%C3-9P3+..qP03=im%QSg884Kh:r.W0.fd,@LYM@g$Ie4kU%@L0_70N/[5G%q!)h+$-GIfr--Pir^n&-dL&GCsl:gJqgGY>3bWMR$Us8#nih1=[iFE!N16!b>`It/`)gs\4i\o+eJGiSW$MTbFr^RqC`P]4Foh"T1h]J4JW%YP/SS18@5eQ[sU9T=UElL,gnJ.?_m1U4f4OI&kS5&8\^A'ZPt?d>ij"N6Y`/o^PcXoP-l(Q`e7[,okC+]e9>k4PK#)l>pC+]&7=Nd&/bs%DO;1<51q[F_=9]'pLP6lla,Th4ABflo5P?9qSuB#h]lk,G&hjg4!_$8nG`$\l.&r.D&9.6JQ48mj86jDdA9C"\QI"UnEdii3kACt*;WCbM<aq`@ocjkB-/`HqGlLo`O/("\T$bAIKe+USfRAiVlj/%fS!1&=./i1%&dt.q<(^%FW?jAcfPudN,@&5FiYE'YV\diae8V^WqOsJfS0;;_lAc<0iJWm%Wmn@]8,#$Z0G""Z,`YUQ'nJ7f(E)`qhCFKAaSXDj66'r'lL'_WQn6ZRYS/l4ESuWdfXmu_p>+N)m'aZ58[<J4Fj>#p-sf586U$k6!C%^9$IN*,b?T06-(;Q2N8Ho3W)[&KLS@ci:u[8k1/MSFH;LWk(h.-H+H`%FYO)<WZ&Xm^mRK78/*d_0G0YdEqCQK88PFtjNtN>$-+;+OU3%cUq`ul":gDi"i#=%LYe)4ZYBSrmjDc.]%kgf"f_9:%`_7Um9Ukcl8AQi4+jonH\^0mYu9kQ(sW@h6att+Mq7pU9s_FKYt;H[RBbQ--U`#:+2`aKkpA0NVl[B<"2j>ncEFBZe8,Jt9HPo7W%8aO1L-Q3Aetp\6(CR*AcDT!*H$019ba#=4gt'L-W4j<)+:Q-@0UC&]ehm.Ra,nQS=d\>P6YrRNuK^h,ld3BpL1]L,f4chN!kV7>n,&T=O7nP)+Q1NK?/Y$MqoQi?R20t7]-)=l]fWSMq"ccUN<a(mr_7jN<`'W\(uPBShcc$1"Rfg2=_/s^p7@[UVs7@8jgqaKfR4fd]d8uKM2@QP9P\^`gfVp=EsCF8<GH#,[taI[&rcf2>ZqE?Ct"@kO6FRLP37bdHis8h5>":>\VKi9u2nfqZdg>?k];4R5t"V$Mq8DSO'k;*'ZJ:etfuH6`ZASW\ftq$6Nll;8/iLX5+"Wd!'&EO(!N.Mfr`/^:(!sX?q\>]<rYQ+%,CS3uD(6&G9O^Frq&02ERb5M]qks,3>,MY/3$7207HW]`]?tgh4O8F)Ia<$gEKb)3\#o6/Yc-n;H6$<jpF;cds"`.J"73!c)EZ3]Ii/#j!e&hStIM5VB3/j$p"Qfe/./"=[cbi&Q?g6UamH\[C<cL$"efffsFB,25#P9]j'(CtX1YGs#Gs#ONPC$fr:qj>Pfr'h)ksM_&5ne]TftF><*M&8-b)*2$\9,W6O$7?*B62K$3K47*_f-5$\7A*5bo7QN>m=+\d,;(A4d_)M9`!q@\UZ/gc(^b!hRFS??pT*.m=Lr`'9UELJj'#q0qGRQ)@a9b>GMCLI$1'(TIJOMQj&p-d"&Qt@NGuFG$P>"8[NcqAEf%W8#"rIB!+\udDmR/*rX,M2GOZ^<KNT+E!5QK(=Psh+1m&X8:j5d6\"hrr0JAp0'GRLLN@u:P!!rt%RE]9qR'AK^2#*bF4+o_>G<`TaN)cKB0bYBXX,E"75/A^+q4JuTKWEOV9#Jp_,@0%kJ5X`e3bB4piGmHp2IGD.<Ho4"c(ED6I["G,CX4_OjSK99MRZ?5shF(3@P1#0F#<5W)[H:=1'7o4b`.dN1g>1>pBuudb%U9^s(8n29riBmobY!3J3eJ3>%a$MVng$'Ba**_FH*:e%?pNU2kh\5ASi4i'Ach'$JgGC`3sC?N<j$A.;8&7eDMtJH:<fZp@rtl[:lRH91dn->^bqu!oltL*P&Ba1/(+(i-9'rgi5pUsHI$8.bX^4-\K1=`*L*=u;bs8Z5B+c5A,iW-Rp+,Xhf-cZ4l?eTc0$;nDore/>.sW1J=4G.h&3D>.QZS=X/H,X*VZ/:YPp-T6+]hY+L,VsXph$_!:6agKU<mr5)kc9h;M/#rPMsnk1p,c;Y1`h4e?Jtr,r6W>JFT5@db8DPXo%bliM%q&Y<k2-TbPuU?XX595S*cR/;*$2S"V^2%s)ek"B68*=HkCdMN^D-gC>[%3?VX%'`X$q;+Gj9L/H[+@nJ_(QC0$Rgnnk!&ObD1">H3S5u]0eO"/c$r#]pU&Eu4$PqFtPHRr>QE3?8_Ca;MZ#nMJf?A!E\_%J:No5EiV8R5Yp.X1)$+W$tWQ!/W\l]Pc/W];>95VdZNg:fN%>WaABFkI.HY=VBKA4HqD-JGbBm.P%?'p8`,/$68Cm3JV;4itjVThup]p1s7WdLE0<r-Z8QM6c56)%16j1t8V$]p3,=`?ZEg"J*'&.dhZ0QfuE"$Ds%66#J>ONo1IJG][P\(LK9;iBR[K4*B3(.f:pYM.k?/5[,t?#>q&C4T!C14Xok9&3PK@rFi3M/B5k.S(4$XGj7/$a`Ek<jY"0Jt1;Z15QKXYhbpq"IemH@GoI9`2rH%q6S3M9rapdVAH)m@[s/]RE8CBEd(Y`R$H=,cRTL*<ZEFGbH/l8;1Onld:*J@5%+WHVMNSl";a&(nKD:c\RLGacq6\l_&f<^^_`jfeNShA?:L6#d\f4i.0\F:dLL%C^s9sQ@:!`/j`,,fS)rQgO=OH:ec(6<[s0ZRpcFRI+7m\66NiidEF%-r&?j/m8'C;-rP[@GKqKROgGcIs6XTBXME@J$n3iT0Jr<t5%Gh)Vc2~>endstream
++Gb!#]>Bedl&q801W4-bi"lYL3]I_(JR#.@n^eApsnOk)aTNG*-\m$NBjN#SJXUBk,+l;bBP;ie8,B_hVWqr`0;?MDCpZfdek;.GW\k1-^bnegqe2oM!VT[YN5@67*41dX,p05f<.3?9N^!Xa454-,NjU5nUXS-S]/B6NuC7b"QXX<La15t9AHEBQ0P*\$&8@*fN[[email protected]&YU($Z4=bSm0^eV<TI&Q<#:QI2LDga]&U_,=t3pEVGX1@&_W?ii:i#f@kjC+%l[(reFhr:>:(=D6^[YJ;s#/&12O,`NR/>'n8e^9&!+,Tj;5NpZ9"d-GP=WWQc$uqh$9n]&'R%h;E(/V6bQL(3U-CkqZCrM3Rjq(0M@%N"u=Tbr2PkqDq;%M'Sb'.Zj=a`hQLL@[U>'K`U$t]5c^uiI`CciNsHi4CUags&:LP#HVV%<r@,^1S"A_9O\f(cR&9uNA#eCMu<V9QPYLj3Mt)P_9np3VMDVE%N<kUhl1k0"UPq53]Z]pHNB3s!,0&D1sa#e0EbLROgL9LXb+d+`jtnOb1)MYad@19,]GVp8U3t-Ou#]T@2DPV#gi'a]F@sH40pYB`fK/8`uje:RjsT/.[&G5T`mVhs%LTs9dD6&kuOp_*j(+oa]+WMiG3!5/JnoKeX+:SI+q8@+AK@>A3_=+&*/A%<!pgBCSgmRZqsm,Kq(=r7?9R,(/uW=7tQh9CSgKFfjLudDG(W,>O4"@Gfjl%a]=7o87AEgal;0:'Mtt)A%Wtm:7U31ZMB?b(=C-V^=i?>=%MT]33,e!'k>dO3>BE,]Eoe"6,\@\iUb`ofcIR4TQhU.83*=(4(`2aNU#C*EOU/g<:kS`D;L5TYG]DDFogHLSi,=RC]</ob%+lpMu<@]EHH4QP%>u+dc@!JPZ9)l.[ET>M?d!bheqe<bPUr1[7@t[/6q"WFI``!Y%BU(9r$r-:UI0[ooDg,7s1(gE57"(`a4*d2,_JialRX,&Am).[6TM+nIeJ.1`$8ecV_)ghSUu<QP`bOORoH'&::4BFB`%`5*&\[_MSFBh'up$=ut9mCtot96BnmiP7PRs]9cW#a\lE7HSc+?Bmb$MMt80>"2iH[okUZBHT2iU.=?Xn:\L5CI3^DTRNS_0<2J`/+;3QH\ja[c!]H#PauTAq^P>iXLu@LVp?q%Oc0:ai*mBZl8*B+ph,_K3\1)4k!<]58koipB>erg5rli`IJ0M8/'p2")DoNc\<(&Y:.$DEPlk%f+:)3]hD`i>)bj;>5'YYMnN2go"[1oFrLD_'fRC9[iYc(Xur+6:Mdruk8ja<oS4Y`IfZA),XI1WO\URS,\LLZNe%5VL>^e]dKA2]#G1"&c5Q)1Rl%MtGY4.4p[_Pl]%A=5VdNDWi]Y,AeD(f%7s=tJZ4!\^n;-?$0Q.l:+60)+#@=2%59FW6-=Y<i>)ebq<fMOO6Q=e),%*TN\KJ%uNF@?Q'0M#/m_EY8t/FMWZ#UTT@F>0L[`b`!a2"cLHQM2U1P&t^J@1I`_h12RiOjKm@9(8,`Sk9"h=mYs_/=/XSq[[o5o+#):r("G'l3FJ8]h-jbo>,@q]nA6/U33G9I?pc7@\OhoM!FsD#;(R+*)c@qS'T#p3%;hm3I#\-r^UKPnn`ANQjY<IRk@jSVe':lL5:nbUfd>n&]u'r0/$Ol\W6CcY'a=QEAaOrI/0*P//lnd]9`q:kZVY?[@h_,NG/J,fX[]>rTV1aGo8$h)7>k4D5ea\*4X`[Q;7j(R9YZ;6]4ShHUd<N)q74$dBM`U`T$E,LMis;d2S'7E'\CQ?0+JV:d.)VqkK^Vt!mRPp@Ur/12?eY5V8LW2lW_b/X#sa!r$CAR('W:7*qZZc\.QmD6M_Wc634X.)3/HcE^dU]Rh2BKadhMs<Xfd81$-tP/JX^e;J,sE#mmqT8k*EDWbpGe6LoB8,Tk`eoFT/&1s'"602rXb2(hQ\a/bhH:?[)V[3>5R'0&7nTL`l-O%$I<#<$J5E]`[L>p^2*.-'GJbXU;gbU\Uu%oFgL-c%b>9`ji5_Qi0Yk/]+#l?<^LdN8TdjbUuI<ML]S_%Obm)gDe7)ormd\<8>k`%h?t7"IcdoFc7=KFp5/\9UsTk`\\+mS<JSbLYEp'F#BTM]lHkJ0%)oPt)_XMBhqCP?PrE"G$QCCFY0!("l`n:rXq\)%(c9f)U_O,OlOIA]GJs*WlBrrGjiqL_JOH1'Wu/N$3ZJ<\('Qj,L#a!9PUCcB3Ah7?1dD6_75\oMd-Ma9*$)a05Q/p`Q;"[Ujb.I!H,jm6f[8"ankTrtcY<(:8jl>,0qfp=`eOi&.(<OaId1$]pTV$pVOi>-9`D&k4DtQQn+fB@Q3'r_6&29Qo>VT=-^b-1L)&A#1X<ERX54E;-(D""6f/>CPt"1.q!mS.5tk7iOTP%<K-UZC%%FE<O+@30V#q_[%dE2pA6"9)A;X<#;HU;[Y9?blt%8*0qKedV?TUV@*!0Hn:H*mZW]">DJ^'PRdc?G38#kUM2n6Pr%THd%b3f(eq\Y1<o]I=3MY>B8t'`C?G:1\,<Z>RY-(fq8gVBiWomn?Mc7gbi^5,.3IrAFMt5?U5gXFg3r73oiDG*g1BgTM04%#arosN^k%A3L^E(adl9q*1\bCbJ!ZA[%;"_8O6oD^1^FP7<q$X+@^=)27JO$HTC!XlH`kg6`A`m9:Cu,+h9t^2;/VH);-\ldM?3^4@\N7e"aTS<>]<LN,F%GX9%.g:r2Aa#3<F0YNTV5X!<?<cS1)02I"(q[J^639lR;C_WD4YHm0%%k!MR,Rd)ZZ,QBeI(f-cGr=-Q42KmRorf!-A6'Z'bnV4uXV*13OO&FsdH;2;i;kkk^RCN]!X?><"016d0KCcL]D_?I-$^djU0Dqp(5C"Fh[$?KhsgB2FICXl@<F(^5Zbq],`A[@?ARGWZd_<):A&;3N2AHNA%UlKf*%S@`9B_[MpD97jS($d]r<B9/*7N,[!(sl,rP8d]p8c`C:q00*B4R[CKaAiHh0o"QJP36LZ:i"g=>Y?nm$ePhD"b5-n@e6^(&`#6`=NV5Wo\'Oqk)W=^QlgDgNROC>9R%\aE76rojN_hhT1.%K%iU>LiG>5'*1+OUH2WO!!`SmNY!\0:+KJ0q>R0HBaK[c%R)Q&*%`'b^5[&eaE,dA_cKk\mA7iUR4,OErURp]u6N0en\?jCJj:2tH`<2Od+&j@'5R*_.+em!ca4m/^fM8I5j@AeV&.BCgb^QYX`EuX-=f_~>endstream
endobj
11 0 obj
<<
--/Filter [ /ASCII85Decode /FlateDecode ] /Length 2981
++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3197
>>
stream
--Gb!#]flGh,(4FM1gnu%aN229Zih`8Xfh%]S@RX2SI`Mmb66b,/_#U->FnNf$\KE3!e*\oh;5tV6CbF@bQZLFU!p\bmn@t`Wk^6,Y?Nh-s1ga/-n+:=C9pbGf?X<kXbJ=`#O+Yp,&0:8Q'+XR$R(iQ8<\H./YT"[:@F,G#pZU+f*af84IPc*i\iZ\]3gQ>oD2[PG6I$dM$J2#qLVcT?LU.NCb";GWF?@)5r(Dr')(T-<=gVioNEW(DEg[Y_L&49k6CLYKi8qLOCf6i$J_u91IFk3_;<a7*?N*:_heE'33kDl5(q40>$O9%FHTQ.C^/FboMsSGERDg`rVn.hRWA"qeU*i[Q(/9b5Ue>64gX^4>[email protected]>lZL,!G2:ka?iBrWG%'R010mGKHjShe[IGl&'/[j#MRBnVCA_MiU/<9:d.t0&0Kea^pCDPr:\g4W-_nkHrhPZJ<PEK7DpdqXpL-#IPLK/!(qq%L/8/,jeD?]="bTQH9o>V1<aX-nrj1_Mk]:]jm,u5Rhe1p+Y7mIMHF8b2>Xpa=>fHnJe*Q5+G,2Gg<?dJL>tluL[+=AWRHjG_+m?"^/(+kMBVdC[Jpp"dg[5!,<.6KAVp,Ec@O!**N1csmOiOgW<U0Jb1#0<tb:<Lk-Kq+^K72-@33pCM]2TVr-Hng;d^F'8;RmrJ`lb"JQVn]h@7K!cY^8Uu4Bp"$Hc%!#]aZS9,+7k%@]@VD=[a$i7RS3Q1mUcP3P&9m/QAb*k#XZ;e\*dn=Y+Bpd)*`:"=)=;n7\d80cZRZ@cr8VWlb?oEp;6.mBqftI45=1bPak\Z(noX486;k9",]l@?jl1P*\#Q5XG6C8f6P6I6%T?9K"N^>TDiX0tL0nN@%^l=09qpBdJTN7gC(@^nuCTo/jKsEJ2eNKK"8kr7!qJP)V4b0eE/NeaP*?UYs]TR*ekd1aD=1U0G*bd19aTmECfP163'RbX3H-HAla#Eo13Ii-;ahe+:beg<MRiI:[4uH=+U%Pp"WOCIAQW8*BT)A<%XgcrnlD6Z38Q77\aH;_P4.A`R':(@<mC:)8is*EU?tOI5DJ$fMED!4Se@aJQf3AEVkQKV#To3fuLC<K=^GaJ#"mJ^.39q?)S+0>7\gItH6Z$f(kin\0S<#Q<[XGb?`YS9=.BlSZm)L0NCp^Nc4Ti!dYap/K&3#pH#epMYtn/!r[9;Ak!%;1tma>?Du+.Y2]gI-?9e0#<`)V02oK'cCj?'hK-d74N?4g'&Bs!H-=Tq0,:il(cYHh,<?._YL2Tf_VKncSpDXL>o7CNfCfmnZT0jn1$hfP9M6b,d5<bQptM(0LNBC-tqqZ*Pb!A_Y[)EC:9;=;ebMsN_OW#Dd&GQ,%j0^IElWO7c%Wc1lsU.Ba#;I<^%BB%'s`,*+RPTX`>5VP4J2+CkbH_LUaNP();@A6D]#/LR4i[OSK+Ci]'n3`7#g"Fq,nf?g0>d3l*]jnm83+0O2q==ZD9p"b)4foo(JCd.d5+\7'r@iubDY^&^gAJ:hQ66"ImO^#%<qcS(,)SLM(-o"52=E=>4U&4jr*:5,q,Xb8g;86UiY&L@kh-"mkY_1%9l<[IWIS/?H6W#ipTc\GIga;4TmKS;*4LL24MCklbM>Uj5(!N'1=]g?GT9%P6iN(>B2^Z3TgLN%-'WU@n"AV-=DQgI4Yp_Y0El:<Uj"X!\qnDi*8Ycf^=?oa!HQL\(Y\0gfj!Ph7`j5NDO\FP70QX$,!!K(T'S`k/CB9/-$^cEV$efU/uS9U,h6aUtC8H-6*X*8kLUArefaQ1V,;:n7IXn9Rm>,]Z_XQ5j"8.rVm^V5$o)t6,Sj[6r>O&)Ar!-br["f"5.qGrtg$3TT5^hf7r$B(X.d<TF@\Co:^8>O4,VUKm:mn\9.:<,/VT=C3M@ahR0iM$#Ia;%`b.Mt"dg$_)uni-`j.3R1GB!60Q,)@!b-0`o$0X]'Xrfr/6db/g$+]^,Ti$.BZ(b4@)eS2Z0"]`p_dP4\I^3JO\XXPcPe)q,7'E?<2c,thdnWfq&$a04QepJijV[(]^+A&9,!9TQo1*gJ.%sD/ABY>'HH&>^:6I**6nWr#dj,q[9-ED8"a3Z]0>aM2)NcuGWD(nPgdk'ZYnEZ6%nWNW/)s[CkA?]:kGDhs,<nmg`^;f/Ye^?(R0?<\-$^sb-hVr;$1j?-pGt;_`HHR,Ts68hc\Smp&WH6"#.Ab^]K+%rK-(1Bc\o"BGaOt>qc5Xjg:MM%7f+8dJjLqc\3[9+B`CCjN'1=C0P-%J>UZq[sgjAq\C>qVN<\C9@E@jjf'h#E=(+FMD\tDVZ$;0$AM`joZV5doXT*TQ1;C<*rY't"DPhV'/4")p]#uKS_<Wd&,qA>Bm+i)!%n5E`RY[2Q]mIi^%LcOOLMRaXE<K1K%^Y*$'c?rSnX>fFh_D="k5$rP;T/lsemhGri>.LFmF)_!$=&A,TGU@uaN4"8jf-3p8S<7TbQ=/4R1-sr:.pF]7]nTeI08(L7MOS@Yb"+-.RKQ=:*W?bLGS$KtL]j(;YnF-pG:n1N7^GlMkhH0$@H)]E[&(<7pY\)5S:2E.q%2tF=0thIN>P#F<?ef5Sq"iiGe@m=n$b"+XO@"F9SnX;@m,N"2:ff6r+oBqNt_@qjIE2o;(iKL2\c^;WlZtD8@?92_+FE#p*("+."jS'$XMKOBOn-NCQAYf2P4dZKW"N)q!I;1E22.(JV+Nd;#c[l#("!-feo:R\G(@"W6'5ng-;$GH^bT$PF24%!95D64Ni$8lTM:"#Tko\jIg(0'K>,G0^Sf6[eE#6i8qqunS!Aoo=eX.PjKju561u#6\t293!,fRW1a!pK'HDGT'HM_dO+TUH+B;USatH@#K87=32LH!ANprE<2LtE+>Y.;:`k`a5!J7MiQl@abR0KmD23LUkQFk`gT_+DD!sdO#k<MCS3;a8PqS,q[[ToRW.!0<JAugCGc]m0&]X>(;%mWU87`"4Q@F*?^%`Zj-qWn~>endstream
++Gb!#]flkh:(4G?rc;Q[XD&Z+h6GepB!+@0!fEUb2^QbS#<CBlEW_shoF[*V7WKIK/(Vq<f$=Uo6U`+?0^%XN%;&;HZs.(]tNi2O9AOKBhdlBkq:7nC"F>eR<q+4OM3>gc86$Lt<0`]f[@WO&spn6*2kq^K1olJ&66`3#a^OpGgc%;Pd2``qn(JR-a14T>Zr]8Gn$Q\e>?E)u:H?rhqglZWC7d";^.Z[+:P!kJsWc7#SiQ+QPAC?XRQ"E``nOX[KHDsi2dn700Ecin31b+Wr7CJF9,uLI;Ptipm$PEhM?j/dJas\Y9.not;:D:t2+.]H!fo2H*2jRL4at]O<,sGAH-+K)Z-*=PbnS>i-@miVW/AniO/de"SOgV>#kuE9bbHc0:OOIa?Jp4<@G%$jH,OsW]bnV)f*Ib`nh=,\CGch_37fM]E94N0+%,t[\*Z]Q"8"H?_oYcUIk(qmRNB<b?VWk[VPJjEJ[HQt[1t(CC7l_Ma:Zr[EI!pJ"U5Oq&)I8uq`[fl>CMhnEaN;&P(+j*tK[j)UU6RQMN_/C)ALSEI[N8[]3_<J_[dSPoB'W\<Ic]2@<o::JC/h_p``cI,V^F&7:ZB3PhL(j%W*$"X%ZXdu-^SP*:3'X:o,JN]d4p\!a4QC!9*r(,[Vah=Nl$Md"h(?BgL/Oi!5F.hIjg&`'R-,RX2]tRkB-n4]:K?WBN0d-]5>skah(E.7SE9L/fJmfk[C?\Eird?52T\-c=6X.7OD3U_W_,^*9$@r)tuAj/qr9Q_hJW>LE!RIJJ6G('E)9W@Xk)TET1_5+K==;RU#g=k1n+E-k],7j3t8/b^$?m7n?fn24Tf4!?5&H"6<!%C3@/Es,\^J!<a;`Ot)q<=^hR=@,YXfGp))M;E/cbV`k=&,8d)5K7u\8>N(g;.ni/>AgRk!gK/U0>a)*a`MiI?;FW8VHCD.P4*[iM&,;*JpD,a#9)uLa43W8o4/2ka.jL4bIl*F3i$$o+X(Eh_DZ'X'(cr08Q3s,+ZnNrU^dsD>4BjF,$MS,3gmUGY(!J>0OH)K[?@aKfF!Z'7*\U.0S_Q&(H#VEjVZ!\F>RdPO$A23I!?QfFoWDYdH:B!:JHOM>QZ4pD$C;W9WeAb6d&V<GY,n^]#o<`;dp21t7]or8iO"O4L6jq<Cf09FZ#$d8'Z6e$Et-H)573G,^_r.)9Ja9Z(qpH6rJg1=ATMcjVHd((f[ten"2=FFh\bMp2UabCR-F/&=Dd4>hnCj(c+PdY.\oU[IuS+BqWPd;OXuTJ#qMV$Go4d]-p]oaS9ee<W=o4fkKu2sDIi"1e3PR\#-$:YYRt2\"`TsSVL49]Xb.]<oW2'D$#%%G;'7M#EbHY;T^u9k3'j:sNGkKj5!X%jKg#QDEPI(k#>l9f4A6S9cFS/2otJ1Us7uV^qbb;d=9)tn?F6Uc<_`o4Q+2<1,O:LQ'Hsje'Xq2rZ<q!f0WG9(62+e%L:Rdp5$&Yc)9?a'[8^`]oZCDQG,P;S$ZM:fb25#/8KWp2h9@3M//j,B5E$Y%!j`T[>GW;Yho,$mfMHf-,03?\,X!NYb+:DOE`HRj[E'b2l_5E966Y=d+>u)]akisYpF=3q]%f4rb7`;J!//5P]XDY;4\j!!dO$.KE7&4X62/2L];EX_XBO^/GC_5(Df<d1fWdRBIf6RN!i-JZhZGjnXK7'(2_Z&gTkYdCIP9Pir3,//9@TZf-eRPqok2Ph_tQ_S$V0GZJ`!ZrH;>5j/t,NR2Aepp#"[-l6g6W3jS,#.*=b#OH$h%TFJdtOb-N-3`%_N@59MCn3"b.f2op5Nm4ZBjnK\PH,tJUA_0q3K<Y53]:5^&5;EM/JZQWBVE^fD@YS>(ln1#6c*NHqqY)IK+OF!br!lZH9?-<Z_Ok1TZV]:<!+ea2en`/_^M9P/M=`*pJ!M&ID0T8HhrIt%F`k\g^08j3uLHeqa>IECHbhE<j'"TKhVg?4&(BhM6ibS]m9JWYBkI\_AOp";\gt_ZL36-k;aWs7nVh!cV#e>9!LSO\6F\8fD?ghMgK\Jhc*odR7oH5[[O"i$qUY`^GJ,9Jt5S_gT_qt:(DaIum8K/f+_kul+adFie]`H%u=eW&Gq?J$B<e6ShI0>,.(rp`I$fCnOY:arY@HiX;nlVt4p=Y?FXFL@m`Bd*bK8*C<#EL`n!ba/OD[L`sL=lYY"`e:]8s2sJ#udn!m;GS[.D=O/*)a1@%PE>[8h4d#>+MQq5nHBNV,!G-p4`CpCCN995E?m>i*ZA*L1qDmPaS^)D,kVa:T<Kk,^4N!qgaeKM@*0$N5f_lTFJ>H+$@4O6:Ho:B/3e61#jk!ji+,]8"6T'n5/IVj2aY8C>?=(qhDq0VO_<BLJhJ\r.8S:nSG/rj8S#`MOM@Ne=[!apoX5+`m-3^:8V[%F?R?aK5ZsNQ&",,+4:KThsd!%J,JS'i?)B(s6pTFm8?]CH`)]1ImYpH+*!c($`M`o6Hq%%k7;;S3u<toIce>*I<n;/hoh$<$71L0Q6R?&E^\sP-(N.!F!$-Z%m<IH<e,sKb4;>6@1.\ZZ_3Pr3o(J@8ZkZ$nX70H06.\&DX2H]6A5kbfKo%U8:V#eEgdM4UlQX4)M1%3m/IhlGZZW3%=Ps;*&3//:aoHH0%;fY*!IE1B0@^p<Z6+Mn;%Tgph\nlIF8+_]i>K<rlcd\2`Q6G.jp;1qLSB\U(tnd&pZ+gN']T`#Fj9Z#p0@g":Ne]pJ?\#R5":_Q1%Neae_@gFGUL=^I9A2Leg9&K$3sh$!+rJ(VKm>fm=]\C]ML0nNJDUb1s"$n/Q4<h`bF#KR;VlD,ad[VN=M<IKn3q7:*diD*Atn&,EK'o_gc_Q.al;qI!L.O+R/\U+1<of#Mp+iE<i[W81_&ZjDY#;@mT,U\]W#dXucU7j5fR>3O+`,E]7^Y'hM(bC$DI4eC@Hi7lW;:a<>bi#i02i?MFL[R:=Ook10\oVUa,.I-npN8&,3CeeC''*HIJJaY/QWNYrqZ64MDc4GSnV,>s6.rk%@gYI?LK4h+N:I`h)X1(f=7baf]0@8V5l,+&"4Q9knXaKEcnu3]Z][.OLUs8,2nldcs3p1"f%dI/bE),*5X$72A;WSY-6"N;QTenq6qtRDq#`!<G@o<Xt!q24($_;eNF^&#MT'[Oe4@R%n.n;[tX,=G"U!I!6.IBm[!?9K&T6:#26AR?[HIr??cZ6Q!>g%'a:/Cio0%J<N~>endstream
endobj
xref
0 12
@@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000001263 00000 n
0000001328 00000 n
--0000004769 00000 n
++0000004660 00000 n
trailer
<<
/ID
--[<858ee61722a5f5c2c69b17e80403fd90><858ee61722a5f5c2c69b17e80403fd90>]
++[<7629e1a2f6a75fb70111c845e6802214><7629e1a2f6a75fb70111c845e6802214>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
@@@ -95,5 +95,5 @@ trailer
/Size 12
>>
startxref
--7842
++7949
%%EOF
ddiff --git a/public/Alex_Frison_Resume_IT_Support.pdf b/public/Alex_Frison_Resume_IT_Support.pdf
iindex a268c1c..d69fdde 100644
---- a/public/Alex_Frison_Resume_IT_Support.pdf
++++ b/public/Alex_Frison_Resume_IT_Support.pdf
@@@ -47,7 +47,7 @@ endobj
endobj
8 0 obj
<<
--/Author (Alex Frison) /CreationDate (D:20261021063644-07'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261021063644-07'00') /Producer (ReportLab PDF Library - \(opensource\))
++/Author (Alex Frison) /CreationDate (D:20261106171201-08'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261106171201-08'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (IT and Technical Support: Linux and servers, hardware troubleshooting, customer support and escalations) /Title (Alex Frison - Resume) /Trapped /False
>>
endobj
@@@ -58,10 +58,10 @@ endobj
endobj
10 0 obj
<<
--/Filter [ /ASCII85Decode /FlateDecode ] /Length 3089
++/Filter [ /ASCII85Decode /FlateDecode ] /Length 3000
>>
stream
--Gb!#]?$?rB&q/qEeD#WsgXtns3;^!.#tnk:"P^`Y3I-bAZ7XM\lB0S9bi-V2/ZIRO\&jdh#N.S=5GV1Wh-7?</Sa9`bC@M\dH_+PHIJTh7$BX=3fOVDhU1lS`Et9%jceLA0(u&@@imA^HDB02T0D*1BbiA+=K>W?9p69,8(?8U[A+M@]JiOF'tl?ElKffk^=)'a]\>sS]sV?gd'%VOb+3GK]Y,Q6h[c3bB[@#4MScMC;;&hNX@?QOFM9]"_RW't0N+FUV!khCM7WK5me,o5_4Zi^!g`hD5N^hV7ODDdou7.dHm*,PCW&8^V6X0MPJ1t\[^T(N=\Se=&%TnJX/Rq!a2r\aVu"!TDfdLR2u,N?di\O!66_oH7)mDD`?M!qOltH."+$lNil^/cdTjYj)D-Z2Xl'n67MjNAg83@1SuY^n=Jo)3aG/=B^$:^-@U\5[c?:51dsgT0U3fYdp*Uf/3^"LDrjusd(,@'"fV91!rkVsY^X9f'AH(PP3WmZp-G_q@/^s)Mg$i<lRu<i!MZI+1DrEc^f,;+K-juG7,8+Q.WJk_jCBLibBJ"qCA;VqU*D4qZ<uE0^EfmJRZ^V4Ai(Gi/:CEH_#iUV.a25r8XBM7oNTa:UlrqJ`)J';AKnMEHdUP&\W^Or[`Y3_3&Ou[%c&3iuQ#e1O1I^X;j@cKg`[:bgORVm:)GN#TkYs$MUe8-AS=i8SgRt78@4K"M`K?`9f4%B#=Su'#V\X).b_QX:pscjGeS&REV5tK$$3sgMF(&A,H7%f1G1L"R;\JQ2V+drWSYjg!nNTV7;fm'TE>XWHR7PnJrWrbc3NWrf)Xl\(f'6@G/PCf:JeFY]j0^`gZSYRGYn<![9;D81?^-ZQ%i2*7DD,A^9EJ[K,-kUNLgrQBNUiEq::3#^e'M8DK#eq&_QF&9fYj=$P<"WiYFUeaf7;s=*>^/BdqT1n:9'lJlKS@f`bOXS)Wfnl*.)/FWR_m%RLQF)MJYJ9WG^n@`S_=Bs6&J!]CCmjgOj,>EN=dh^W]FGlnU9D$D;3HM:m[1#KsSMGag>sr->GRIr@u^5&prBe`_;d!YBn`mP(f[Q[13EEb0DDKPV=A._(t@q_Y6W:PmebOSWfQ!IrnZSc'VbqL!/^Y%2;9ECi_`J\/?#3o>:?`!GGs$Ij4tZ6Us5lrOEF*9m5bRMm1n\sU_UcYG7b-PS08'NHbIhg6s7MeOBL8U;Cc_%D0UgGD#SZ+Mo7<4ubEMV<6aXl%eWl!5>%7%_/ZNeo>AS=JHr]=5ZiA`9W"1Er,m^M0rT0M@r)iU2@:N)+MMbJ2-_R%<?#,*PftpGdQ%_;[NZ=f4'#<qO="jdbRd$O`m@n)\oAHF@ui:@:?bV$O9@jN0HLiBK1<Isb=mZaXR,O%=>+:,Ol]Rb?Csrs2AGHkjg-n"&^.1fZ/U/==UfdHB-!*N+rZcO#IbWUiO7F4Nrr)<h-:/o(IhR4T%@q5#>E&W.7@>/X)&5R7[YP+GU-bK#'k1o.#Aq/9hpIT8CC>LcSrJSP<&g>RTp[.1rXZi9KeB?-d2j7e>L]/FO*4R]cRUJ9nM\E3T,b6O%*;SD`i_:!DfH0UbG80V$rH\XXl&3@h#:U!3Ni5\XEmPgclhfoO]W&>*t8ZgF:O_!j0An5!p-u)47:4k?1r`Z.C^l%>.AOV8m>D^s4F5'2JQI4ltIc'UJNIK*pXd^7=)XYu!Tk?FgAM#[!^/l[TQ01HWd1HL`JdaS3fW;"+>apsgk/A!_*,K+M;],rr60Z:kE6F'*AdQ`T/P*lXHaZ1InS2RY>;>3s5N"t;5_(3hic6%e+OITq_o$e7*8#O>Bdi>B:gj`ZKkVr1)?q]JX67>ZBXU%DF"rQ@h9&&7Mj^_d:17ih\XQh8KE:e\<,r.8MMs!#Y*28WHsrX&\fm!JkWoS;Ks_X,:)X@0`#=eX,jQo`c*0CAecC^M]&#7U;p-q`4ZZXKg/lV`$9C+S4,LQ_grZc`KRPD]d-QjJm:PN!@J5H3L_qA9%;66I`SL5i-X5NZB[]jDDHJ`OSdfGYXI%SEOY@IG:9++O'NQ[tAGu8#TeF:GIJA`sNV;7]^Zuip_I("0BF_VP8ul/mgupNQnmpfNKlHjm5\:e[gbJU%Ff-&(pJE**k^p>9iKQMKmmQL5d;*(FVQN8-'-#gd]a^=N\3_J6.dL.[8L,FA!\\"-o$F@6X#Htus5of\WP7A-;ZkrcpI-2,XNo(3b&-4.GX+V`i7:c;f<-u.F3oE[/P'lg=O4jBK-oRee2,M5>'XMmP2I+_V_V'?\ocJVKN-XsDUUK5h?b1+"%Z:qIui%S7;-tb,j4*Y$QK@#"akmXF]QEdkGESAV&Lga\R\crF=?^Jn"Q4P6KA15qZ[8KHB<$Ye#&)%!\EJlD:cZU/0U3tK`!c%M&+<cGS<g$@[X<CLp@`:]PP"jZ>26(TW]P5'>T_MnZPC(biqH4&*,@^AJf[Acq$fZ==tcO]m1\^Q\&ng/AQNGL.faV2[:Qbs4Cpq^k/poIP3E@;tOjejh]C9N`UKS$#@Q(SbdG@\3dZZ.Z\4DCObjGmeoG?52ok'@<tiC"-m%Md+MhrJ%oa_J!Q;EL<#F['A&#PSr13&4r))dnd^;`eV*AqkTKA!IgbJCDfcq?+')O4^#KWQep6VK.%`@EUSEsLff>;5!C7E&NF2_e>^ll+-[3g/Btn!o*mGDQ,(M&!<S8FX;_Mt&BiO1ukcW+fJ`L6kcZBAtKn-IML#p@l9EjXcro#=mf-Q:l+CjJ>"f_YtO.?Rph:Gd.,+]mC_@s#k4_gim?.^+&R0?C:]M&09YD*t5jc8#P7l;U"rRfBkM(P`.#b:ABP!nAs]t2^I\P[B*&`fmVZd#04XFrL&m<!.0s-V4tM">&4#btG78[LC/#$W77C:@ib5D]8Mo@^?T9oTf`AFPj;.3AA'`]eIZj2U`'^FnkG2j_n+4XZm!:s=g&Rebub>82fl#7r<I-t:KX13VQl"<'F^i&10aPUV(X`f/ctQ<XY(F)BdZ*!>!BGNkI^I:Li8`2+inI^S[lD\[$;HlXm&_Du>9425P"^Kp=F[t1L5$F`A&F!o-AL<Uj3pm2!E^ol`=5gtYk!ICk4q>~>endstream
++Gb!#\?#poE(4FN4\8U^"!hgQlNV@"?m;+lu`t"2AVTLQd&YN7^lB/Z;8`e"]\PgoO.jhF/VNRa*FA'4&8*A`bg@uW_cQjf_4f2;!,)ThJcRA(e\hnk+a5[tc^PJnT]0/:3Mkeie2W/k]h8>jJ])-@-05t#mTAQ>^MR-fMpA+&7ifeQj>$fYsX.7:<deF30s38tUi9q\C^&D=i0s2eXq7\?klL+tO&bTAEU,Y]O>%R<BA.AAtTSoA''Le]A#qO!69DXB5h09aN3k`4=Vr-CL,6:Mgj,]V[[["t/H@"lX%_e0+Q*h6g^/EW7IS&GJ[dD:=Yp_"!j]O4B:MM)UgL>GHpSklep0,)9]A*7QKBZ)p)3`.=1mZ6-;i/jX.eDHJidfmbXM"6[S[;HpX$I,%Vb9"'$>[e@Q>U,)!REVO.:$@[Buu(r]WX4k3ZK[XA[60MFZWAV/UkL@NjiisnapoWr+he?#al5Lp1T;L^[mNUDtq'`R9uI^\'Gr@-MZbt@s32p<kPoRai//=`DBi%DrEe01`7$N;!'Ns<bUS%;An:_f+qh^d7Oc3aHft`2jCJd/2KUnjW[q-bH3"6J00*gS<QYC#[rEFM(%F3<maG;,5t[L]+Hfl6.oLS+X)l+b_W?B8h6;U=MYL[@DlO"XOJ.lcE(u=/X)ns^8,L]I0.b.#u=p)2)L#EKhCI/<!dJ2+\3R8=u7X@OG^6o3&D<0>2n`KLL3VSW&Z@<23QBk[Q6@r##252P0Ga\_8)nPQ`^UgVfF,J_YN@p8n*:TOD-;\0JkmTr\"Ra743j4#!j,h$,(r^:FQ"@0Le,ZfF*V.1PrtON_5'/,s8lX[M:!mYYnN,&I!TG<j=*GQ'Ea=*)M:C:;/EM7#C#/A3iYH,ZnQXnrKnENE=`Y^c<Zla9jt^??<'LN]T<L.h'ARY`[,3"jNql.9!mVjT<#`e<4J0q>`Sj2>&W).cA&]13)TtR*2/I\up%1CHZ!&]A4iA#*2aR+"-O6NOB,ZoUht9UBmLkR+pi8bCuA8"j1"L2>_h!T_Scun)EG[\*$6JmqeZI7nt:+X_FX4!"fe#*o^B$BI3d0=(S9raOXe$K=_W):P6[3P\AhZW>E/VpuC6!me>YjkAq=%8uD"WQW11&Y\W9lMk0<f(]h9U!P0mi<a^X+rcI)8O\%1%D:"t7j`I@_XsO"8E,f#[;=1ZIS_#'rS7qFmdd%_T%f'VaTu$P]j.dKeRPfEAd'h29Heih-hWI1#o\"Ro0X(_6PEQ6!pNA6d/?ES%<[8=A2_!p27Z!$D]H&e[Yr29[r3MoPfNAAUAGgHB*l]Q3.)(CsFh@TbXe*J2S23<9@0q,9^&3D_kGr(.ao/i]&n)_Y*j9T%rmROfLNa1gIsVZP7%-bqC;@qlN7QSU-*[%:[email protected],e*Fgclf7DS(<*g@\X!cY>4X9q$^<MUCS:kd=)+o/.nL3r'G_ua,Ra'+&.+J^R8K<SO8T8#:eg-EhoS^kp!(n:Y`@EFHmdjF/KSTGCCg>*l6$%OIQT_QIXcUT9kaFeEPJh%Y;>pn2;_bVhJ_d_m&_'V/2Je=:)u+n8VHA<kKmaEKE]ts:U!2k_2hgOfkWg[^[W5H;B>%LQ(gmITk*SAAn4``.;m0h:4mW;r/I3*4'KSs+Y+mE[l&Gjg7(:kZ&HDQp@c-M#l68/8%/Zp>Fip_Tk?FgABco\^1Sf$Q03_Bd1HYO7YY+OD!"[8bh/.jk/e:N%Q6&7M+iT#TQE(?Mabi\ZN01b)CT+*HT$SnjOGQ27<-GcJ#F0)#m.7EaQ4o!!783QK>V;t*7/t.F!sRV\7&&.KPJ#e$ku`cg<>7&^tJ8ulOmH;DF4f&/>oAU[_gEcE]6!+&-L"f;K<(<b)@K[B!aHhJ$DeZ\j;7*k^a*W$>1kg3#NR/`<qiK.%;[ibV28kd/f15FM4Xh'?;qs4ZZLWgt0b^$9VCrT#BFkhII0.U7Y&lBXZ:)::pC^AbLl7L_qA9/RT']`SL7/kY:"nB\cQNY#sJ?T<6T[=g&sQV&>-Co=ODiJ759@J_#<t>4ol0I&R&(]iO;<WP=pS*j*27N3+N6h_f4/ZJR*KN!c^F[pW<+S&;?;kNi4p00,YD@>r"fpqSE,=G+>NQ9oA4H^p1U'rS.n[Z^nCPaX&(mSm;-().*s(n`HG!0scBH+kU;?d&WV/W_T4nAM&%O?iD6s&0nIAW+j:HkVu!XVh,cBZj+-_Q3mWr:5:u(s%Mr)\r!2kNcE)5#g[uX=Esp=OUeL/4d\X/VOg-r<KjNY7^J?]@Fot]8s%#iaQ=a/)[3r=9_A!E'U0Z7FQa*LF!1LY`!/qrfVnQLSW9d9E?t87<I'Q"el@NR0hd\K.T:k=Rk"01<k6glU5E5*=s_d)J<;g]K+r\_AJa09HcA0kJe6X.mXKZ-mEJ:.bLC#HD<$R<VPmk'_5slKLgbb+$TAUfslGNgm_m%SJfG5@(50/_o*dc3=)C;L7_d/Wp.Xc3^ipiNQaTpJEMRFfRrb>M5nTZ:HhR.obb2-U#&04%k\n$,Pcgfcs>9c>@nVr(nLWYj9_;V5&!cH7mfLYRc+lC+RfnS&.6,1k/sG/2lM]o_o?:`1KEX(:_)^D.jeR3QlpoXW6VftaB!`#jM%0n/`8+gMOSU3NeEr/!*8^X>,/nGjV66Zjklo?rg)H-N);N[&:&^2c]9Q9#L).M0Jf[Wh5rEQS-N0Q-%:a&!4MKPcCr=).T09TT5ZeT*6$/8!pA;aX[V[1X+24;$hW$_jJZ*h`'C2i":^l=F_go&]P!<M^*&>PZn[lnaXZ@Kj6i$$#O=R2T<7PInZ3L;##BL]p3#9O]'&p>>abQh?T%@'-Wal/G8rd;JXDaP"C2nkh+*h=*Io2]\0mfU<TLlK5qcCF_.T3.\=e*>/Xg`0o7CW/5&"qo[2E=Jo<W9jU=]3`C\_Mq"TNhdqaN`g`l;6tKs]OHM7t(kqhLY+e8Bupd5Q$^a:!VSO;=FqUX?W<pPPAFr#_GB$+g~>endstream
endobj
11 0 obj
<<
@@@ -83,11 +83,11 @@ xref
0000000902 00000 n
0000001275 00000 n
0000001340 00000 n
--0000004521 00000 n
++0000004432 00000 n
trailer
<<
/ID
--[<a8f118002d6fd8b1daaf8b897f8fb0a6><a8f118002d6fd8b1daaf8b897f8fb0a6>]
++[<50c9a8ff198432236f139c99b051fcc0><50c9a8ff198432236f139c99b051fcc0>]
% ReportLab generated PDF document -- digest (opensource)
/Info 8 0 R
@@@ -95,5 +95,5 @@ trailer
/Size 12
>>
startxref
--6718
++6629
%%EOF
ddiff --git a/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf b/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf
nnew file mode 100644
iindex 0000000..585abbe
BBinary files /dev/null and b/public/Alex_Frison_Resume_Nov_2026_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf b/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf
ddeleted file mode 100644
iindex e237904..0000000
BBinary files a/public/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf
ddeleted file mode 100644
iindex bc5c26f..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf
nnew file mode 100644
iindex 0000000..85db10c
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_amber_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf
ddeleted file mode 100644
iindex e1aa6a4..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf
nnew file mode 100644
iindex 0000000..e08e7ea
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf
ddeleted file mode 100644
iindex 022576f..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_green_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf
nnew file mode 100644
iindex 0000000..0891b5e
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_green_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf
ddeleted file mode 100644
iindex 2e5ad3d..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf
nnew file mode 100644
iindex 0000000..28d9ff4
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf
ddeleted file mode 100644
iindex 8b173ba..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf
nnew file mode 100644
iindex 0000000..046785c
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_lime_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf
ddeleted file mode 100644
iindex abc46f7..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf
nnew file mode 100644
iindex 0000000..c22bbd5
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_orange_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf
ddeleted file mode 100644
iindex 22be974..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf
nnew file mode 100644
iindex 0000000..e32c179
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_pink_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf
ddeleted file mode 100644
iindex 10e3162..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_red_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf
nnew file mode 100644
iindex 0000000..5e9f687
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_red_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf
ddeleted file mode 100644
iindex 394e6b4..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf
nnew file mode 100644
iindex 0000000..5d42c8e
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_teal_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf
ddeleted file mode 100644
iindex becb154..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf
nnew file mode 100644
iindex 0000000..16b57ee
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_violet_e28027d7.pdf differ
ddiff --git a/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf b/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf
ddeleted file mode 100644
iindex 12ba750..0000000
BBinary files a/public/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf b/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf
nnew file mode 100644
iindex 0000000..cf51ed2
BBinary files /dev/null and b/public/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf differ
ddiff --git a/resume/build_ats_resume.py b/resume/build_ats_resume.py
iindex 35bfd19..f7d15af 100644
---- a/resume/build_ats_resume.py
++++ b/resume/build_ats_resume.py
@@@ -52,7 +52,7 @@ VERSIONS = {
"zero-downtime deploys"]),
("AI", ["tool-use agents", "Anthropic and OpenAI-compatible APIs", "local inference (whisper.cpp, Ollama)"]),
],
-- "bullets": {"PowerChat": 3, "OpenVibe": 3, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,
++ "bullets": {"PowerChat": 3, "OpenVibe": 4, "Amazon/analytics": 2, "Amazon/operations": 1, "Verizon Wireless": 2,
"founder": 2, "earlier": 1},
"projects": ["openvibe-live", "openvibe-network", "openvibe-games", "irdr-autonomous-bot"],
},
ddiff --git a/src/components/Album.astro b/src/components/Album.astro
iindex 416a729..66cedda 100644
---- a/src/components/Album.astro
++++ b/src/components/Album.astro
@@@ -14,8 +14,12 @@ const countWord = WORDS[count] ?? String(count);
<script is:inline>
(function () {
try {
-- if (/(?:^|[?&])pae2(?:[=&]|$)/.test(location.search)) {
-- document.documentElement.classList.add("pae2");
++ var q = location.search, d = document.documentElement;
++ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) {
++ d.classList.add("pae2"); d.classList.add("pae2-crew");
++ document.title = "Welcome, coworker · Alex Frison";
++ } else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) {
++ d.classList.add("pae2");
document.title = "The Amazon Robotics FC Album · Alex Frison";
}
} catch (e) {}
@@@ -25,7 +29,8 @@ const countWord = WORDS[count] ?? String(count);
<section class="section album" id="album" aria-labelledby="album-title">
<div class="container">
<div class="album__head">
-- <div class="eyebrow"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>
++ <div class="eyebrow album__eyebrow-hat"><i class="fa-solid fa-hat-cowboy" aria-hidden="true"></i> You found the hat link</div>
++ <div class="eyebrow album__eyebrow-crew"><i class="fa-solid fa-people-group" aria-hidden="true"></i> Made for the PAE2 crew</div>
<h2 class="sec-title album__title" id="album-title">{album.title.replace(/FC Album$/, "")}<em>FC Album</em></h2>
<p class="album__edition">({album.edition})</p>
<p class="sec-lead album__lead">{countWord} parody music videos about life on the floor: rates, andons, scanners, AR and everything in between. Turn it up, then keep scrolling for the grown-up part of the site.</p>
@@@ -140,6 +145,10 @@ const countWord = WORDS[count] ?? String(count);
.album { display: none; }
/* Tight below: the metrics strip that follows has its own top padding. */
:global(html.pae2) .album { display: block; padding-bottom: clamp(4px, 1vw, 16px); }
++ /* The hat line on the hat visit, the crew line on the coworker visit (?PAE2). */
++ .album__eyebrow-crew { display: none; }
++ :global(html.pae2-crew) .album__eyebrow-hat { display: none; }
++ :global(html.pae2-crew) .album__eyebrow-crew { display: inline-flex; }
.album__head { max-width: 760px; margin-bottom: 1.75rem; }
.album__head .eyebrow i { margin-right: .35rem; }
.album__title em { font-style: normal; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
ddiff --git a/src/components/Hero.astro b/src/components/Hero.astro
iindex c7668e8..20e8325 100644
---- a/src/components/Hero.astro
++++ b/src/components/Hero.astro
@@@ -4,12 +4,29 @@ const name = "Alex Frison";
const words = name.split(" ");
const offsets = words.map((_, i) => words.slice(0, i).join(" ").length + (i ? 1 : 0));
import fcAlbum from "../data/fc-album.json";
++// The coworker welcome (?PAE2): each letter is its own span so the line can ripple like a wave.
++const crewHi = "Hey, fellow PAE2 coworker!".split(" ");
++let crewI = 0;
++const crewWords = crewHi.map((w) => Array.from(w).map((c) => ({ c, i: crewI++ })));
---
<section class="hero" id="top" aria-labelledby="hero-title">
<canvas class="hero__aurora" id="aurora" aria-hidden="true"></canvas>
<div class="hero__veil" aria-hidden="true"></div>
<div class="container hero__grid">
++ <!-- Only on the coworker link (?PAE2 in capitals): a welcome, then the same album and game as the hat. -->
++ <div class="hero__crew" role="note" aria-label="Hey, fellow PAE2 coworker! Glad you're here: the album and the break room game are just below.">
++ <span class="hero__crew-hand" aria-hidden="true">
++ <span class="hero__crew-ripple"></span><span class="hero__crew-ripple"></span>
++ <span class="hero__crew-emoji">👋</span>
++ </span>
++ <span class="hero__crew-copy" aria-hidden="true">
++ <span class="hero__crew-hi">{crewWords.map((w) => (
++ <span class="hero__crew-word">{w.map((x) => <span class="hero__crew-ch" style={`--i:${x.i}`}>{x.c}</span>)}</span>
++ ))}</span>
++ <span class="hero__crew-sub">Glad you're here. The album and the break room game are just below.</span>
++ </span>
++ </div>
<div class="hero__copy">
<p class="hero__status hero__in" style="--d:0ms">
<span class="hero__status-seg hero__status-seg--now"><span class="live-dot" aria-hidden="true"></span>Now</span>
@@@ -226,6 +243,62 @@ import fcAlbum from "../data/fc-album.json";
:global(html.pae2) .hero__album, .hero__eq i, .hero__album .hero__album-arrow { animation: none; }
.hero__eq i { height: 70%; }
}
++ /* The coworker welcome (html.pae2-crew): a hand that waves, two ripples, the line rising letter by letter like a
++ wave, and one light sweep across the card. Every animation is finite and fills backwards only, so nothing
++ keeps a GPU layer once it has played (phones painted those as blank boxes, 2026-09-26). */
++ .hero__crew { display: none; }
++ /* Wide screens: the welcome sits across the top, close to the copy it introduces. */
++ @media (min-width: 921px) { :global(html.pae2-crew) .hero__grid { row-gap: 22px; } }
++ :global(html.pae2-crew) .hero__crew {
++ position: relative; overflow: hidden; display: flex; align-items: center; gap: 14px;
++ grid-column: 1 / -1; justify-self: start;
++ width: fit-content; max-width: 100%; margin: 0; padding: 12px 20px 12px 12px; border-radius: 20px;
++ border: 1px solid rgba(var(--accent-rgb), .34);
++ background:
++ linear-gradient(115deg, rgba(var(--accent-rgb), .16), rgba(var(--accent-2-rgb), .10) 55%, rgba(var(--accent-3-rgb), .14)),
++ var(--surface);
++ box-shadow: 0 14px 34px -22px rgba(var(--accent-2-rgb), .9);
++ animation: crewIn .7s var(--ease) .1s backwards;
++ }
++ :global(html.pae2-crew) .hero__crew::after {
++ content: ""; position: absolute; inset: 0; pointer-events: none; transform: translateX(-130%);
++ background: linear-gradient(100deg, transparent 30%, rgba(255, 255, 255, .16) 50%, transparent 70%);
++ animation: crewSweep 1.4s var(--ease) 1.6s backwards;
++ }
++ .hero__crew-hand { position: relative; flex: none; display: grid; place-items: center; width: 54px; height: 54px; border-radius: 50%;
++ background: radial-gradient(circle at 35% 30%, rgba(var(--accent-2-rgb), .30), rgba(var(--accent-rgb), .14)); }
++ .hero__crew-emoji { display: inline-block; font-size: 29px; line-height: 1; transform-origin: 70% 80%;
++ animation: crewWave 1.8s ease-in-out .55s 3 backwards; }
++ .hero__crew-ripple { position: absolute; inset: 0; border-radius: 50%; border: 2px solid rgba(var(--accent-rgb), .55); opacity: 0;
++ animation: crewRipple 1.8s ease-out .55s 3 backwards; }
++ .hero__crew-ripple + .hero__crew-ripple { border-color: rgba(var(--accent-2-rgb), .5); animation-delay: 1.45s; }
++ .hero__crew-copy { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
++ .hero__crew-hi { color: var(--fg); font: 700 clamp(1.02rem, 2.3vw, 1.22rem)/1.25 var(--font-display, var(--font-body)); letter-spacing: -.01em; }
++ .hero__crew-word { display: inline-block; white-space: nowrap; margin-right: .28em; }
++ .hero__crew-word:last-child { margin-right: 0; }
++ .hero__crew-ch { display: inline-block; animation: crewBob 1s var(--ease) backwards; animation-delay: calc(.35s + var(--i) * 38ms); }
++ .hero__crew-sub { color: var(--dim); font: 500 .86rem/1.35 var(--font-body); }
++ @keyframes crewIn { from { opacity: 0; transform: translateY(-8px) scale(.97); } to { opacity: 1; transform: none; } }
++ @keyframes crewSweep { from { transform: translateX(-130%); } to { transform: translateX(130%); } }
++ @keyframes crewWave {
++ 0%, 62%, 100% { transform: rotate(0); }
++ 10% { transform: rotate(18deg); } 20% { transform: rotate(-9deg); } 30% { transform: rotate(16deg); }
++ 40% { transform: rotate(-5deg); } 50% { transform: rotate(10deg); }
++ }
++ @keyframes crewRipple { from { opacity: .85; transform: scale(.85); } to { opacity: 0; transform: scale(1.75); } }
++ @keyframes crewBob {
++ 0% { opacity: 0; transform: translateY(6px); } 35% { opacity: 1; transform: translateY(-7px); }
++ 65% { transform: translateY(1.5px); } 100% { opacity: 1; transform: none; }
++ }
++ @media (max-width: 520px) {
++ :global(html.pae2-crew) .hero__crew { width: 100%; gap: 12px; padding: 11px 14px 11px 11px; border-radius: 18px; }
++ .hero__crew-hand { width: 48px; height: 48px; }
++ .hero__crew-emoji { font-size: 26px; }
++ }
++ @media (prefers-reduced-motion: reduce) {
++ :global(html.pae2-crew) .hero__crew, :global(html.pae2-crew) .hero__crew::after,
++ .hero__crew-emoji, .hero__crew-ripple, .hero__crew-ch { animation: none; }
++ }
.hero__tags { max-width: 620px; }
@media (max-width: 920px) { .hero__tags { max-width: none; } }
.hero__tags-label { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font: 500 .72rem var(--font-mono); letter-spacing: .16em; text-transform: uppercase; color: var(--dim); }
@@@ -338,6 +411,7 @@ import fcAlbum from "../data/fc-album.json";
.hero { min-height: auto; padding-top: calc(var(--nav-h) + 30px); padding-bottom: 16px; }
.hero__grid { grid-template-columns: 1fr; }
.hero__visual { order: -1; }
++ :global(html.pae2-crew) .hero__crew { order: -2; justify-self: stretch; width: auto; }
.portrait { width: min(290px, 72vw); margin-top: 10px; }
/* On narrow screens the tags hang off the plinth's edges instead of sitting over the face. */
.portrait__tag--tl { top: 25%; left: -6%; font-size: .66rem; padding: 6px 10px; }
ddiff --git a/src/content/experience/02-openvibe.json b/src/content/experience/02-openvibe.json
iindex c4a8e72..48c7b9d 100644
---- a/src/content/experience/02-openvibe.json
++++ b/src/content/experience/02-openvibe.json
@@@ -3,23 +3,27 @@
"role": "Founder · Architect · Sole Engineer",
"start": "2026",
"end": "Present",
-- "location": "openvibe.live and 20+ domains",
++ "location": "openvibe.live and 50+ domains",
"kind": "founder",
"link": "https://openvibe.live",
"featured": true,
"current": true,
"order": 2,
-- "summary": "An open, community-run live-streaming network I own end to end. Launched in 2026 as a single streaming site and grown, in the same year, into seven connected apps sharing one login, with me as the only engineer on it.",
++ "summary": "An open, community-run network of websites I own end to end. Launched in 2026 as a single live-streaming site and grown, in the same year, into more than fifty connected sites that share one login, with me as the only engineer on it.",
"bullets": [
-- "Designed and built an entire network of seven apps that work together under one account: live streaming, sign-in and a virtual-currency wallet, media storage, a 169-tool toolbox, a browser game and a community hub. About 363,000 lines of code and 900+ web endpoints — all built, deployed and kept running by me alone.",
-- "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it automatically re-broadcasts to Twitch, YouTube, Kick and more at the same time, saves the recording and auto-generates short clips. It also produces live captions and translates them into about 21 languages in real time, and uses AI to spot and label the best moments in every stream.",
-- "Ran it like a real product: I built a deploy pipeline that updates the live site with zero downtime viewers ever notice, cut the homepage's load time roughly in half and eliminated the jarring layout jumps it used to have, and — when it came time to move everything to new infrastructure — moved every user, every account balance and every active player over with zero downtime and zero data loss."
++ "Designed and built a network of 50+ websites that share one account: live streaming, chat and video, a wallet and payments, an AI model marketplace, travel, shopping and job search, a browser game and more. Over a million lines of code and 900+ web endpoints, all built, deployed and run by me alone.",
++ "Built the live-streaming engine from the ground up: anyone can broadcast from a browser or an app, and it re-broadcasts to Twitch, YouTube, Kick and more at once, saves the recording and cuts short clips. It captions and translates streams into about 21 languages live, and AI picks the best moments and writes up what every stream talked about.",
++ "Ran it like a real product: zero-downtime deploys, a homepage that loads about twice as fast without layout jumps, and a move of every site to new infrastructure and PostgreSQL with every user, balance and active player carried over, with zero downtime and zero data loss.",
++ "Built its AI side: one account that reaches every major AI model with live prices, speed and uptime; agents that write code and finish tasks while people watch them work live; and an app that connects your own computer to run AI or share it."
],
"stack": [
"Node.js",
"TypeScript",
"Express",
-- "SQLite (WAL)",
++ "WebRTC / WHIP",
++ "LLM APIs",
++ "Go",
++ "PostgreSQL",
"mediasoup",
"werift",
"ffmpeg",
ddiff --git a/src/data/profile.json b/src/data/profile.json
iindex b42efc4..501bbd9 100644
---- a/src/data/profile.json
++++ b/src/data/profile.json
@@@ -20,7 +20,7 @@
{ "icon": "fa-solid fa-layer-group", "title": "Ships the whole product", "text": "Design, code, infrastructure, deployment and support, with no hand-off in between." },
{ "icon": "fa-solid fa-credit-card", "title": "Moves money safely", "text": "Rebuilt PowerChat's payments across five processors, with ledgers that make double-charging impossible." },
{ "icon": "fa-solid fa-robot", "title": "Builds AI that does real work", "text": "Autonomous agents that researched and wrote compliance reports Amazon associates used every day." },
-- { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "25+ sites and services with zero-downtime deploys, operated by one person." },
++ { "icon": "fa-solid fa-server", "title": "Runs it in production", "text": "50+ sites and services with zero-downtime deploys, operated by one person." },
{ "icon": "fa-solid fa-handshake", "title": "Understands the business side", "text": "Ten years running my own company, three leading a retail sales team, then a year each in Amazon Robotics operations and floor leadership and as an Amazon ICQA data analyst." }
],
"roles": ["Software Engineer", "Full-Stack Developer", "AI Agent Builder", "Data Analyst", "Business Owner", "Automation Engineer", "Platform Architect", "Product Builder", "Team Leader", "Problem Solver"],
@@@ -36,13 +36,13 @@
"githubDisplay": "github.com/OpenVibers",
"linkedin": "https://www.linkedin.com/in/fris/",
"linkedinDisplay": "linkedin.com/in/fris",
-- "resumePdf": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
++ "resumePdf": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
"availability": "Open to pretty much anything — engineering, platform, analytics, ops, sales, whatever fits · remote or Pacific Northwest",
"status": {
"now": "Contract software engineer at PowerChat, building its developer platform and payments program.",
-- "also": "Founder and sole engineer of OpenVibe: 39 live sites behind one login, one operator."
++ "also": "Founder and sole engineer of OpenVibe: 53 live sites behind one login, one operator."
},
-- "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 25+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.",
++ "pitch": "I'm a software engineer and business owner who builds complete products and keeps them running: websites, platforms, payment systems, AI agents and the automation behind them. Over the last decade I've shipped 50+ sites and services, rebuilt a live payments program across five processors, led a sales team, and turned an Amazon data-analysis job into tooling other Amazon associates used every day. Give me a problem or a rough idea and I'll deliver the whole thing: design, code, deployment and support.",
"seeking": [
{ "label": "Honestly, open to anything", "detail": "Title and level are negotiable. The team, the problem and the chance to own something matter more than the label." },
{ "label": "Software engineering", "detail": "Full-stack web apps, platforms, APIs, payments, streaming and realtime systems, designed, shipped and kept running in production." },
@@@ -52,8 +52,8 @@
"foundedOrg": "Own company, LLC",
"lastRole": "PowerChat — Software Engineer (Contract)",
"metrics": [
-- { "num": 25, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },
-- { "num": 500, "suffix": "k+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },
++ { "num": 50, "suffix": "+", "label": "Websites, apps and services designed, built and shipped end to end", "short": "Sites and services shipped", "icon": "fa-solid fa-cubes-stacked" },
++ { "num": 1, "suffix": "M+", "label": "Lines of production code written and maintained", "short": "Lines of production code", "icon": "fa-solid fa-code" },
{ "num": 900, "suffix": "+", "label": "API endpoints and pages running in production, all built solo", "short": "Endpoints live in production", "icon": "fa-solid fa-route" },
{ "num": 169, "suffix": "", "label": "Free web tools built and published for anyone to use", "short": "Free web tools published", "icon": "fa-solid fa-toolbox" },
{ "num": 5, "suffix": "", "label": "Payment processors merged into one billing system that can't double-charge", "short": "Payment processors unified", "icon": "fa-solid fa-credit-card" },
@@@ -94,6 +94,15 @@
{ "name": "OpenVibe.Homes", "url": "https://openvibe.homes", "role": "Home buying", "group": "people" },
{ "name": "OpenVibe.Food", "url": "https://openvibe.food", "role": "Food and meals", "group": "people" },
{ "name": "OpenVibe.Host", "url": "https://openvibe.host", "role": "Hosting compared", "group": "people" },
++ { "name": "OpenVibe.Design", "url": "https://openvibe.design", "role": "Themes and AI design", "group": "people" },
++ { "name": "OpenVibe.Report", "url": "https://openvibe.report", "role": "Open numbers", "group": "people" },
++ { "name": "OpenVibe.Today", "url": "https://openvibe.today", "role": "Calendar", "group": "people" },
++ { "name": "OpenVibe.Tours", "url": "https://openvibe.tours", "role": "Travel", "group": "people" },
++ { "name": "OpenVibe.Fun", "url": "https://openvibe.fun", "role": "Things to do", "group": "people" },
++ { "name": "OpenVibe.Meme", "url": "https://openvibe.meme", "role": "Meme database", "group": "people" },
++ { "name": "OpenVibe.Surf", "url": "https://openvibe.surf", "role": "Surf maps", "group": "people" },
++ { "name": "OpenVibe.Cam", "url": "https://openvibe.cam", "role": "Camera app", "group": "people" },
++ { "name": "Open.Shoes", "url": "https://open.shoes", "role": "Shoe prices", "group": "people" },
{ "name": "OpenVibe.Services", "url": "https://openvibe.services", "role": "Developer platform", "group": "builders" },
{ "name": "OpenVibe.AI", "url": "https://ai.openvibe.services", "role": "AI layer", "group": "builders" },
{ "name": "OpenVibe.Codes", "url": "https://openvibe.codes", "role": "Coding agents", "group": "builders" },
@@@ -103,7 +112,12 @@
{ "name": "OpenVibe.Events", "url": "https://openvibe.events", "role": "Event delivery", "group": "builders" },
{ "name": "OpenVibe.Watch", "url": "https://openvibe.watch", "role": "Watches", "group": "builders" },
{ "name": "OpenVibe.Space", "url": "https://openvibe.space", "role": "Static hosting", "group": "builders" },
-- { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" }
++ { "name": "OpenVibe.Zone", "url": "https://openvibe.zone", "role": "S3 storage", "group": "builders" },
++ { "name": "OpenVibe.Exchange", "url": "https://openvibe.exchange", "role": "AI marketplace", "group": "builders" },
++ { "name": "OpenVibe.Vision", "url": "https://openvibe.vision", "role": "Image AI", "group": "builders" },
++ { "name": "OpenVibe.Website", "url": "https://openvibe.website", "role": "Website builder", "group": "builders" },
++ { "name": "OpenVibe.Domains", "url": "https://openvibe.domains", "role": "Domain prices", "group": "builders" },
++ { "name": "OpenVibe Node", "url": "https://node.openvibe.network", "role": "Your own computer", "group": "builders" }
],
"education": "Snohomish High School, WA. AP Statistics, Calculus, English, Creative Writing and Spanish. Self-taught engineer since age 12: systems, infrastructure, graphics, hardware and whatever the problem needs.",
"capabilities": ["websites", "platforms", "APIs", "dashboards", "AI features", "automations", "identity systems", "payment systems", "real-time chat", "streaming infra", "whatever you need"]
ddiff --git a/src/data/theme-pdf-manifest.json b/src/data/theme-pdf-manifest.json
iindex 3cdb3b2..becf82c 100644
---- a/src/data/theme-pdf-manifest.json
++++ b/src/data/theme-pdf-manifest.json
@@@ -1,15 +1,15 @@
{
-- "amber": "/Alex_Frison_Resume_Themed_amber_38b37ff8.pdf",
-- "blue": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
-- "cyan": "/Alex_Frison_Resume_Themed_cyan_38b37ff8.pdf",
-- "default": "/Alex_Frison_Resume_Oct_2026_38b37ff8.pdf",
-- "green": "/Alex_Frison_Resume_Themed_green_38b37ff8.pdf",
-- "indigo": "/Alex_Frison_Resume_Themed_indigo_38b37ff8.pdf",
-- "lime": "/Alex_Frison_Resume_Themed_lime_38b37ff8.pdf",
-- "orange": "/Alex_Frison_Resume_Themed_orange_38b37ff8.pdf",
-- "pink": "/Alex_Frison_Resume_Themed_pink_38b37ff8.pdf",
-- "red": "/Alex_Frison_Resume_Themed_red_38b37ff8.pdf",
-- "teal": "/Alex_Frison_Resume_Themed_teal_38b37ff8.pdf",
-- "violet": "/Alex_Frison_Resume_Themed_violet_38b37ff8.pdf",
-- "yellow": "/Alex_Frison_Resume_Themed_yellow_38b37ff8.pdf"
++ "amber": "/Alex_Frison_Resume_Themed_amber_e28027d7.pdf",
++ "blue": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
++ "cyan": "/Alex_Frison_Resume_Themed_cyan_e28027d7.pdf",
++ "default": "/Alex_Frison_Resume_Nov_2026_e28027d7.pdf",
++ "green": "/Alex_Frison_Resume_Themed_green_e28027d7.pdf",
++ "indigo": "/Alex_Frison_Resume_Themed_indigo_e28027d7.pdf",
++ "lime": "/Alex_Frison_Resume_Themed_lime_e28027d7.pdf",
++ "orange": "/Alex_Frison_Resume_Themed_orange_e28027d7.pdf",
++ "pink": "/Alex_Frison_Resume_Themed_pink_e28027d7.pdf",
++ "red": "/Alex_Frison_Resume_Themed_red_e28027d7.pdf",
++ "teal": "/Alex_Frison_Resume_Themed_teal_e28027d7.pdf",
++ "violet": "/Alex_Frison_Resume_Themed_violet_e28027d7.pdf",
++ "yellow": "/Alex_Frison_Resume_Themed_yellow_e28027d7.pdf"
}
ddiff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
iindex 9de336d..2533eda 100644
---- a/src/layouts/Base.astro
++++ b/src/layouts/Base.astro
@@@ -84,6 +84,13 @@ const imageUrl = new URL(image, site).toString();
(function () {
var d = document.documentElement;
d.classList.remove('no-js');
++ // The FC album visits: ?pae2 from the hat (fc.tools), ?PAE2 in capitals from a link handed to coworkers
++ // (the same album and game, with a welcome instead of the hat line). Marked here, before paint.
++ try {
++ var q = location.search;
++ if (/(?:^|[?&])PAE2(?:[=&]|$)/.test(q)) { d.classList.add('pae2'); d.classList.add('pae2-crew'); }
++ else if (/(?:^|[?&])pae2(?:[=&]|$)/.test(q)) d.classList.add('pae2');
++ } catch (e) {}
try {
var t = localStorage.getItem('afnet-theme');
if (t === 'light' || t === 'dark') d.dataset.theme = t;