From 2372b7fe05555cbd73a305bf62595a56ccb09731 Mon Sep 17 00:00:00 2001 From: jamie prince Date: Tue, 18 Aug 2026 19:58:11 +0100 Subject: [PATCH] Add provisioning server docs, agentbridge state, and update submodule --- .agentbridge/conversation.db | Bin 0 -> 4096 bytes .agentbridge/conversation.db-shm | Bin 0 -> 32768 bytes .agentbridge/conversation.db-wal | Bin 0 -> 696312 bytes SERVER.md | 132 +++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 .agentbridge/conversation.db create mode 100644 .agentbridge/conversation.db-shm create mode 100644 .agentbridge/conversation.db-wal create mode 100644 SERVER.md diff --git a/.agentbridge/conversation.db b/.agentbridge/conversation.db new file mode 100644 index 0000000000000000000000000000000000000000..4d0f4d75c0c482c3485d3529b474a8f56497a2ca GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WYFvV%?r{lK(-m98b?E5 nGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nC=3ArvhW9) literal 0 HcmV?d00001 diff --git a/.agentbridge/conversation.db-shm b/.agentbridge/conversation.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..63921544e0e29120cea716a3059b9dc058a2a966 GIT binary patch literal 32768 zcmeI5M^9Bz6onTkh++W?qF4YG3yOdU7VN$E-h0K~3-;c7?|o+c1O5gF#*q^fM-H4i z)4j>La$+L64%D;BTFGVa^Ui(me(%d;x=-e(9?+D^l>nr@k~&bXq>8UyUw`;KE${97 z{GpX!l0H_xne**kX;J1M-Y*|jm6!7OyBGKJ&mzx8qFh?*$W_<%Nv^j_SL?gl zz|~Z#4PD>J)y7hrxIWF*bXS|Y+DvM5*SC>Q3mF3o2+jxCjuWu)P zdvBdBeU7)zmA-?w?&$TMygtwM`fPn(XK$~I*Q+<(?3+UXe3i2(q#%nhD<5QlBo#o zk&8|;O`!)0W$r+k%nKNVp%{VD7>`Mqf*F{P#aNEjSc~=8gss?t-Pn(VID+FigG;!I z8@P@8c!Z~T9tWnzd$!lO%gt&7d6)k}82HIN9M_F^HsEIm18i5VI;<40w!ZB=3pU~VkOpK9V)OH+prURQHeu1ijz1O0QVGh1$p|8<+u57GoY3VHs9oV*oTEBj|iw8#!$QGXP4Rfy=}(pwpmj zI0p1o7aO^512X_hJ(Y!tV?fXPv5{LgFaw|*5&(k@1U=cx zM(*0c41jWY01P$|^c*)Exn~120LoDTFxWuQ6AEqQp$*IcD8~iBU;{zVAhnSvHZTLA uoEQLu4TNkPm_n&%BQtRfOp9|9?-2tzv{35|Os{p{=x==?Jz1TJW8eoHxNx5U literal 0 HcmV?d00001 diff --git a/.agentbridge/conversation.db-wal b/.agentbridge/conversation.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..b205380ce316ee028120c058404c7491ead83af5 GIT binary patch literal 696312 zcmeFa3t${qeJ-xGq+MxcS$1M)tjLPjQ5^3?R%|6WP5|R5@+J|HCdjIYy8g?hPk!w4xz8LPyK6Y-+KKy1l|tH0Tu-)Mx31yl1kJxr{G*%E58b|r zE%85Wf6DK$#dQtWzVc`7Bqh>ux`F(U4-fzXKmZ5;0U!VbfB+Bx0zd!=0D(1xz)UO> zGfXowGvuZx^0t$ivI}YJv|Vv>rK0|8-QZ|yU_6x=AGl>WmC(}?$#{Z%#CD0q(8ze| zw$y0i&e5U61Ea?hcchN(W;xR3az1BgEz-pwPu)A77&$`z9UUHyn*?;$&zIu`pDy2b z=Ip%>yo~nQ#ZbZ;x-Ym?AOHk_01yBIKmZ5;0U!VbfB+Bx0&5NdjW2NgtDl~J;A?;Q z=6U!6DnEdZE2zKEpD)l+Y-rptLihq3Mmi3xIoxrDbb}{QE^FznYJ&jRgushO_BWY)x zQ+dL?x6)O&#C}`ys;z#xM0?LI^tLZ6zCa^ABgq%|QOEZlygK%&FM=;XQNafY00AHX z1b_e#00KY&2mk>f00e-*sz-p1Ry4_Rf%KMb?#1I(66fPo+P4+dMjgW(6|gpPnL-~$AJ z01yBIKmZ5;0U!VbfB+Bx0v88?$)=dGuRAi+$_Vbc>=~cqF8K43>E0}u{zD^&Quijp zawd+9BxLTS!oEM08XGjBBUpht0@}xKmVAMekN1Ck=iA3};0s)wM-h7k0zd!=00AHX z1b_e#00KY&2mk>fu*?w9_yX_T@#f00e*l5C8%|00=w-2%J0695W0f^73QMBh9T=iVph|)!fn8s!(e*VUZT@ zkS3;7r2`tztNEZMMpL(@MpGk$sWE>7HkUQ&gzTZzaEinx8ypxL95|HX&S>RIsZe$; z*FNKlBZnKLDRa1U=F^STL{{I3tx(F^d4C6d$xn7mC+(tDsOH@q4S`l+=_I1sFhAK` zv0NqRN;5g$PDB_ro}*NCYqMxMG9|~gs*YwyM?jN@$W|+9mxOh*3jPsfq&9vCw^Yho znRK4~DOHOCHSG}jT+w!{be34kd1tBbgXgH&h0moc+C^=9ef5}K{x~u00KY&2mk>f00e*l5C8%|00;nqXCDDN_aBqv z0_AHzd?3>H!skOr@a*3hoBq$AJJEPSvmuT;q^{8iJk(gnck(nW;VRAB4b|Gz@ zwkr&3?bkX@)uiVX@+PreLMmVqca9Dn9vD5AxFdCpt0&TBD)z||sS1;@Bu0*mCq{_2 zB5sN^YLR?_S8RLWoqzU{^{)kAVC}w)apgb&2mk>f00e*l5C8%|00;m9Ah4zo(D(vB z-*wHK|6%5ix6Q*BXjKrR{sfEW3$(0m<&&K79ZV#2TSE8_PTED+ zDy9oI<#JGRi#PQx$_$wnCpmK5MlvJ=dUO zHKxor!52t~X-GO(>3`UyWR0TNcQ){I>JyxZQ;0Z)K|(-iltaWR^mX#!3#d*67sg+J z_VMGAFYx65Y5LCWr`mr9e1XNkh_NLQ00KY&2mk>f00e*l5C8%|00;nq6@-As7kK2a z$6xrO&mI2gJbZ!m%Joqv#YOW4+FEW7;S039j;zK92mk>f00e*l5LjUd+}Rd2dV3?s zxUcf5e9pBk$39iHiy7O|f3DY^mG#6V6^-sDTbi>s#A8N(f8?ye_DScttxT!t+Gkwr z{#@R6YS*-Bd#+6v^D63e@6gCNRWhsA&541d<41-@$i5DzM#i~bmF+7`t*XxU(oD`= z(r|j(QWYDbd1cAvv^zznmg^-`Uv!czPg@#FCk~}<9XL8Xp4b~V!51hMEgHDM=RNqd z_J~IilwuRHI(H~n2o0?G@sf{t1c*nF%bp>XIpPt}Cq#c-Xf?fB;t{mbCWqt;oNWE< z*Ip7YeYu^k+(`f60|bBo5C8%|00;m9AOHk_01yBIKmZ7=Vg%^i|9Uwt@Z;3>r`z7% z_5Wd9U=`nSTpADn0zd!=00AHX1b_e#00KY&2mk>e0Zm8nz^mdP{OuRK^H=845wKwc zu?rf{V9`2)^|7zl(GidYe1HHD00KY&2mpZ#hQP%7sIjv@@__F{m$~1fr1x5;eS57T zoyaRm**cd$DG2r^bOd7w=m-#}aCGSK!054r=aA+r7!;bmCK6GVD3Yu_ml&m7DHY1D zMfEiPF10;!0RZ!^3n~Oc^6A8Au}hi{Iszs!;xJJCj$>8qLg}>4gWnOPgqnxv2=VCT za-gteCDNdu>>CThcTg5>R$yz~Jk#(Uyzst*w2$8|`2yd2AUB)4(%c5$!3)+5!;XLe z5C8%|00;m9AOHk_01yBIKmZ6VX9P69z#n}1o#lbgfAl%?@C7=Q3!*~^i{=Y#h@P#> z7l@vXy+=6?7J&c|00KZ@jUX_aY>ye8osqM>%xTU(Z5LgK|J|TD%JFp}E^@-Jt!92f z%xWu>Vd^a1yz{)$K+h^x3*IbILVCXO2_JS&mOEXhws2v#akXiROzH$v2mk>f00e*l5C8%|00;m9 zAh6aEpmYBna$KPQs~>p!lkOEKpd(o8#RAt41b_e#00KY&2mk>f00e*l5C8&e1OZJ) z@Y!2Vyy|n8eRShIIs!Ff00fo?0+SsvRiWHNw+!@Ok9Mxrwn})Is(U}N)p=iv*G4EO*6AOHk_KwSiK8)L>kGKs&bW)hz`-&u67nNQ7cs+k#- zv-mQfGL6rYn0Mapgg0Gnf-j)58sIyq&e==m2jUc_5T~%>B2FRV6p|@l_zqg3kp?*( z$4a{v;uH>eOdJ`UGn9-I&cXp-Aamj46w*HaCdn6g+s8iqme2h3e;)u}pl%Z!2|xe{ z00AHX1b_e#00KY&2mk>f00dSO0vcbS?KQuYZW;UcQrWp$itx7ueK%szT_ zZfGnqa&&kYd;wkqRs!qD;Q7q+f-g`hO3}Hl=m%e5A?1kLA_zrm zSR_l9Tu!@FWXd%}*~*e>yfl(5B-);;HgPC*>%h_B@x&>s z;HCw!fq*tPXr4RJ95W0f^73Pzj|H=?aH2JC72#D5xgGQqKC=mb0r(4e1_Iyf00e*l5C8%|00;m9AOHk_zy(1-;|sj$nz#Mh zM~`g(`8<4q&B~ECkmW`51uktmeja>*rsK`*ER~~T5eNW*m59Jh&m}RVrzbMo&L?E3 zp*R=0GjDOec&RoVsw9Z9P%eF^Q@+7@8KP$NW`6m;lDVu&r#BC!hEqhvHaIXgIB+P% zeQ24ZdC`^gJ0nNN+4Otd+;?fz80v{Mut_%OR6gh0R=Vnz*l$ZYA*)~cu^D^;#3Nwy zLA-#v#I?bjJd}ltm%Lg{Bwt@BW$irOhJ9%1=IcF!2XDPMI~+HAH$;tto%Kp9e+;aC z{@pRLK5Fdjk38VdA7}2j=)5tbQD`3j?cy;U8ab4@msmrev0RZCe1TARYqj=aQ}J_E zKHv**-8G-FA~iHe%=Z8{PsL)!O@!;P-7l*&eu5>Z-RVQYHfpIYs5Kd7k#&-C^IVpM zKmlJsy!3cIqZ_Q(R6~08RFlj?4OoS0-p$de$O_8fu-XuybN`#=xWEI?zoO%*GmnkHcW|}cW?T;t00KY&2mk>f00e*l z5C8%|00;nqPy{p`!P&3xSa;}~_a*1i5nQJ1se>#pT1T*@@kQsUBWQe4(>CR(SOfyA z0)d%5n`1_AZ)A20r`1p8iYIf$NlC5Oe{Rv~^?KqnMX^7yC2HK&TaUEt>L*2L_WFv; zpd+x0t^?meO6wIu4@O{Tq+a_})h=d;8(Xzt&L-PqMrUW_EN36`y!`J5?K$A<;5%6F zk>vP5M^Gv1E{P!}MjH4j7EOtPqvJ=0Mo5V}oEnj$4nk6gj({@o&EqXmW1kV34l?~c zdOqX%x7OqNd)XA0zqbxL0#3M|ON>&klnP~+Dcc0ApL~VbR4RIjIrBkBkVsHBPsd7U zvo;Yb%8#fTxY~l}sMv+lX+MvaV>0JjzOf)fpWhe013ejW3K6G}^k$Zoj$jMzUP->d z&ZocRPP~81kD()26`f981P}lMKmZ5;0U!VbfB+Bx0zd!=0D<`spmYD1$#H=@_n-U6 zr{DRGP0$g{2OH9X01yBIKmZ5;0U!VbfB+Bx0zd!=tO^7)9l=k2>yQ5HcV7FJm(Qak z=v1zpx)Ux+N6<`n!o3YUI}Wt}OZ=zpAC5m9zozvIEw5|2IrjDF+1PucUCr-pzLCZw zpgMv^vynzt#0Lm07X%I(QDdyH9)s5{mGV|5ozDwd0AbY!)@+520PzTz)4O1M6UJdN zo6eU=Tymdi&(bXFZf_>;xji+SV%FW1$via10x0A*#*BTPk(o^%omcFRZevl~ZvJ~y z4WBodFZ8Ip6P_KuIoT02t|y1;s5ulRS38JDfOrI1^Uk&?6-V(H@FJWCDH=>968O1Z z(}V;Plf`tw-c7bNXK#qdjQ;+}S%d4XXkpW0ConOJwx&(nb8R|w1eqzu@{iZl3T(CD zLHi7Uo&3zW(a;ejNbN1T=E`?4P7bG!`;icWS!J{mHKK(yY=@3uJat=YltY*)Ij&W8 zbjAQh))@YN6D(7zvRFhUqm~0Y0--vQ1+clMf{-aPq6n=d3HHi zfB+Bx0zd!=00AHX1b_e#00KY&2wYSIw$i=Jae;q+Wa91J$pd515nNQvv2!2*1b_e# z00KY&2mk>f00e*l5C8(p1p%rF=#=9E#S=aK126cmPgA~t(eOMPE8yV`cej7Lt*>oe z{MGU6S|4wDwB`2LlhMbbuZZ?Ef2jH9rbnAHjqhu$G`xglr=KM=tIs)?#f-kb$RnMc zF&JQ8`!paKfoznXtLn}aOz+R-ZL6Gir#yK4?b21ZWM%DQ&a<7J z@4RW|bl$4iX{S_Vd-V5~bF4z9>>Y+Ih`q(lrMmpDxUdHME{z&PJ#`frwkIzj;tT)B z=9Ll7;Pj@Lv7eCb%^=yHltUpC;FS#G5-7q2M)j_VOVGO^Y8>pWS5SlwqMv_vAc%qb zw(!&+UOnVh>2Y&nebm_5A9=tlqHgAXi{1iu8#G3Kdkv3N=9MIKoztHbcM^Jn)EJZe zICC{7*!xGk(CNFvyGQ)BroNu)B~#|J|2FYD*Ejt~pb z8|FYykoCCFW;ALXFzVGh3@-9wqNv5r9cYdjh7ox=m(8%1>`zp0n$pZ6+7+)kz;3P* z34`B$!8TT#gMokpYSUG6ljkaL2w^}WhxC9KqqsTQL_~<)k(pMnW{{;wss!ZkCF%+G zG)9fV?t0IZJcvTDUt`Cwih@Hlv)NpD%l^7ft8yq;4;?)=U0^kcAArm`Chll++8D2EN z7to%R3*GYuUtq2I4}vd1Y8hU)5FQjEl1Z)@9m?YC3#F``m+fqY2?f3Yp@KQ^A5828 zU%;Vebo7Cc6c;BcW+=&2{O&~1D{TS&EAR!fYy`-wfapTK%1LDMli3h}RUmBET$vDM zD=dRQnUA3aS;_0JpUPkWe+TGe1*|x$cR^29wgz87eV=+%D-LQ#qi$<+M?8bh-}Xzj zQk{s0A+Tq12b70~ZWuS06<^?TbzC6Y)wpiQiJRXEe*uaLK0p8n00AHX1b_e#00KY& z2mk>f00dS&0#p;wCHVq>czCvQ=+m#>&G`cV(Xin!H@suR!S=7U|Kj=&u79xYi*2uJ zc|*%RvHw{0sNe#D01yBIKmZ7=as+Z)nVru}vnMZgGnPk)V+%^C)yqSy2K?M?E;eBC zll1mwE?IR2?;&jhi_We3b5#1=m7WIgA$SkXZsCSqQ@J8>y_yuUlU@Di7G1%oCoXdp zAGn0z651BE1Y@r_Ief+n@oLoZEEo_urDpEWk`FV5pHuuW+yT|$=O zFQ5Q|#WjS$l3Tj)7l6M2iGY1ZzQlZELdB4ez1Y^;J0BK;YNv0`*Z6{@7VsN%E$ZbL z<^d;7Wfk|g#K6(2~lcC@M{qjCgdO-xkaV1 zEY&1K6p$MAY5fzGbTKnUEdWAk{eH4S>-V?z4Fp2B_LG&Z;V;17nO=qbY{&sthra;x z5R`m@_ka2W`Qu}c{~P5Cw8wt6E?pLSe9o`%^ zpF*`5x!OUTLc}RVoI=DYbP=a;T;-f_LbDV=+e$2wumEpH^k4zi7|4Tp6Anj(nVfhl?)vLtKRduqU~4}yHGl9d$&>xr>I8{2vq_= zN5JGfPNQaNAq&0mve2HC8YUMnv$bJ*pd&~mPTLi#mP#Z-#Bl<*GK~O2gUKp20qMN4 zIE9*y;Jfet%5UEG(w{t^>IgQ(cFmz9Ac^<@0U!VbfB+C!n+RB!Gn)UjH$*}l`#2vs zNb~OwqxlQ!FjZCuz4~~P2^~S+QcMrG!gmn9gQTzOR5Kak5uo&NW!qPFa=qxm{i3^D zf$t!E2Z>ry^QEHAS6ou_&Zx<_ z);)-zBe*y*j7f8j&i!{w9l>|L`i`T?NACMRbOdX&p^K{q0zd!=00AHX1b_e#00KY& z2mpaKhk&Ld_}H(PUpw0JM?aiLN3dN%X){@djz9qfi)#o0=m?-A@TVL$V=e$X0_X^! zBY=*;qph=e0j)JtpKLYa5m3s5#`=ejpj;)gh|)>B=^aFswhOCmF{y|X_dIiMpTp+WeAPKgUr0gx2yC_nvB zYHZM)$*+qU-QAIgdRd@MnNNO0N6^sFLiA}Wg0ei zFuq<_y!z7AitSYMo)XqyPg)Uf)oTO#>luIClNb8yX?$WUYZr+!j+~iju6cq&k3hUv zo@FtY&J!tU+96syx|g_la9h+E>x(onBBygIFtQay-s%sop~K?rMGhSS39w1D6RfFS zOc(6X&<9?sx#Uq)=m?-AAP+rs1WJ_lfPqhlqtBkrF{8IP0v!Q#1Vq2EDX3qd?|6$E z2=SK3rkXK4Az$$Fg{l{x6%Qil2rinA;0oH%l{$j0ogcLS^Lv-vOZ^2JHqt-%00AHX z1b_e#00KY&2mk>f00e*l5C8(J7y&x@v0aV}ymj;^=RVgl`vUk2tl~S4O9KKx00;m9 zAOHk_01yBIKmZ5;0U+Qbp!o~@>34>9eCfyyd*|^N*x_&9u!StcUqAr_i)#phB{O4Z zRvgLiz?P_SS8qKQ_WZ2Io=ajzPfujFo$==tLttg`SvL(voI=DYq;$zcso~UkDls@P zHaKu7#ia=(7Gu>eW^AiiEz}AbcpgT*wB}G@)W%lg8|s0;eD#DED3Yo=bV+jDTo9dd zVtv%u*&lhpqm#Os`&p1l7HBe4DzfMB{#@R6+G{AKGA|PhR4YYG%b#Ss$iZI#{sQn9 zxEFB>E3C5e#s9ftt$Bb{g7NCFRCQ~!XwrW83nUUW2x6vGD3Gr-38zqGHV9lJXGWvO z0i$l~j8xeUQJT=N*kn`8*w-DIY4zR&Qt>Zc1LW`Kn)iTAkvZx6K(2$oK-3uQu6GM0 zN<^MWLaGoErbBzr%iLe!Iseje^3U&kmreZzE@>*v>o3q$Xuf6*^#XCJKmZ6_Xar`S z+Z{7@?u^XtXCnp0YIf2Vv4hm*gr>09Qj&_-8&#y!SEL#|S~YXxV!63OLeqW`YtZQ3 zFWzwB$CU?(oBOYb8h7lh_YzRg(&|@#?SQ|)I7bxz0*F&s%-Y1LAP}sPv|j^j5T`H$ ze*sc8!(RaY0;j220I4Dr*WZ~HG35Yn;tS_Zyr2Q`*<^dn=O&Bp8&Kr%q)i|2EH8q+VIj;fYf00e*l5C8%|00;m9AOHk_z^X@pY65o1ae)_Xestz9t{(j>_zSH1 z`;H3)0zd!=00AHX1b_e#00KY&2mk>fKoQXV1)j?g5+Oi!}MIcZdeSInmKrJ@K1bV-e3uO?$?G$1o^&+UYtmXOS~ zp|QjW300HZNThzI(}qmgzW2ZYD7q1uvm1*z+U(rXUXNX zI~6>Ll1wA5lVo|?-f0|4-8yh|cs#K;Zk}i*;ZTjpOruvNu@kc=$DkC+E zw32X=RMyNlqq1gF8Y`}Oyd`SvGa}Q0y|Y9+OY*T@wbnU;pUpptzs@`riy1eObKf4^ zJ6Gni;A(9DE%o-VWK@nI*5okmo8ydQ@2T;Ic6A;-Xxq$V9%hBlCPjtj=zmpGoB7 z$-4cC$V7L;likuuyJ!_iJlb5DC|=+%KprvgSy8KV{ZUdJ0yvJkfdIRA!L8vha7XGG zN2}JW#|vA`GwAB8kW!z`IputMTGYmVdDfqrkPY?6g=UDGdm2}rzrfqR_wmX{o~kCO zzrg0kBj@EW(0HWj1#74$h)V?m3q@cizddGjbwwW9!x|gBN_WK9m0E*CtPE*#$j09@ z(qS^x968W!?NEPxCY{fF*TM>+Xa!W=l9jcKIh)!o$)`fLf=TOMbcuLw znlYWXDt6i-=SlY-HxF)$8e@I+%4ZN;Vh|L#H#CF~GYYaUj~cuB)J{>x$~jgcQw}QQ zyK6fxGArw^1cdZSz87<%lO5nezh9KGcq1oxfNfz1;8{Zt;5C)Z+*Z%TA+&T zknQ+`=_P2}ai=&Z_hQ?cn09Tl`FszYaE?HB&O%^kpBfJ_RBX3-?6-o5vZU-RoDdH(u2jf_bH=Steikvf9WFTN_f z|0A3J0{#LN6?}jI5C8%|00;m9AOHk_01yBIKmZ7=dIYE@phu1iT=mXZ-TCO#?;3)? zz^cFRxIiEP1b_e#00KY&2mk>f00e*l5C8%c0nJ}vV*MRY{nMvP|22=lz*P!#23dx` zfC2~>*AN0rX2#C!*&H)^dn2=3I5T!CS0wb(NfD!Ga#$CPjSlEFxCV_wBQNvXiCOie(j35?RlC!M#>_2f?%?ZrvHz$Zp_zWT<0 zEDckCfi3HPa^C&|Br85ZVC5q)z9VY%bwx^EqgkrqX|q!-UscmuRx{BSv-s^bli@F* z=piLo@E2fG>2p1-qZ8Dy2YUkox=wz?-j+TRzv8AI z7C9=vGNv3bcW~k64i+>Zj)?}fzL|5Pfpp~P-2YW_T;MzRd~4SouN=J&I)ato#l;l> z0U!VbfB+Bx0zd!=00AHX1b_e#I1dCg9lmI)a_bez%fk=m-=*u(*a0 zfQ|rh3Vl(*X3Pa#xVZof@1OVZ{(`1Wpd)ZCrjiI@s>%spg>sodoWcIjB@@RECf=L>JRnd%5GYxuW?=m`F8 zMfL{IwqMEQ-4EZzitJRWbkefV*qJH~oZ|$3?$io!AThKY`_wY!ri8XMXmBGX%owd| zJ&}wW6?y&uV{RokIcZlc83jq(6)zBkhgzBTV}L2@5-;opWqXs5>yp!^5Z>%FB#d#U zl;w0h?+W>zgE5C>L#rOMj>kbNr>FC!G(DLAiV^XSyd*7!oSi(ps4V0G_-T-hX%-ot zOxdkYp9yRnH=!fo0CKXwg*b)&Q^Q{g5 zm_5@49RaOgbQ-V!m?KVM8F329TalFm{s?VFoI)Z9CE=)YVJ~LHDIE2iOfp<)Kd-j! zN(DNC6=Pup9RYdBol9!;s-hu5-k8N~I*&Mo=7I*qG0~v*uk?-(ZFYH;XWS%xc{=yM zQ|btQ_|O+CH$Cy?2N9=mMUHadq=5hs00KY&2mk>f00e*l5C8%|00=A;0Zm8n#OH4s z{m_PYpO{BSaJ6!fPO=OgfdU8?*AN2G5kN-(9RZ!)V3zh4v5x1H8XN0Pb}-*~l8yRv z@~qOHb9X{o)?3AD!NlX;386Q4g^Q^MfB8vxmyu4p@ijan$3wms^O;Kp)-3gQtkpL^&CcrYI7QOdl`NejuLVFDbhUoO$!a|`V= z&BP)x!!#o^LtJm6sRMMaz&ee(uBQp+`i0aH9PGX|`Pkom@7Jl0z-X9Vn2uofLiPvk zo|v(#H!{=gIm0vFK6M-p5csdId8>Ij=_@UeJIOqYS%Z|Y@l5ClD3w=Zk@!S%=m^db z!9<~u6TKd>jCcfzqa#Ci9ZmTiIz@J1#?8J&)EMZh$E}x$A|3&B1ke#=%BCr zKFQt5p(D^?fsP;p9RZadRWljVyr#8>_|(-aLPv1f$_s@I9RYL%bc$i#xq}4_h-0GR zyeAq+PoB>GUoCY6|DOEtlTVayJb-uv7jldP`vL+$00;m9AOHk_01yBIKmZ5;0U)q! z5zur5zkcR_zvA!B=FB`gf?dkhTuzpuBTxXr;u=B#Is)hjpd)~ez;`?oK4+&1CYC#0 zX7;Edd@K@1on$Dcxqqtfwx|Qus>0axyx47v6^NS2KLA+X4AY{5Y%DSH!{H1R6V98(Ktznt#s=2 zP--|eo=OZ3j13MPO7T6GE2To2)HLKJB)JoTJ&Ggy*EwfCyO`x@__@?sM!k9xd6ZhJ zbkZ(bg=*f-l?k(@!ZM7e28Q`baF=Now7@5OX!LvGHmzsTa%4)5YgHYOy&pJ4(D<4q zYdc_sVaCnMl&VF6nwEpB1kzc8gt$WT6_Nuw0>={14=tWvaSc9Gh(}?Lz zS44Z7Kh%74)1yt9#`iT=8eY=yJi4cbCHIuzISj5KsfWQ8R4Nm9Dpw@&B_?^u3ZhL4 ztN>Tgb!gK_;B%?ohVv6dOHRs&L<>r3zNyVJp?;sEQI;tcUDCZHrIj@UWlW5?iFkz< z&SzjjonCMS)mHqRg9#WP!1w^h2kMOvn9-??+$1Pmpt zJ2KPiNw#GVU-tUt@8%lGwoH*Z=Nuo{(-<`dyX!qu-mZM%{TdrkSQh>QBqAM)N6SWm;ga!Tr@E4#jHq03;WX_-xnE6*(Wz?P_SS8qKwSU}(qqIl@JBxdyVL}uH$fYT@WFDD_u zA{~*TAGmP(0Z0PQTN1FKX%pxNpdWyKpq_pJq5y~jRM*tl`x$0Ww^mM+ICjKuz!B~g{ z7*n49p(zQe?dDu&=m;1(8Zyukj0~p6Bmr&?*8tzcNyCqqtYS4gX*1s_ng|^MbOg{5 zSd8z_JQTw;5nigf0CWVz zYmK<@6|?Dlsc46~`rLzvaiFbk#RmhB%eNd zFEmckf;d_9BxR&ZZ7=*FEV-O^r-BDjk}2bvB+Jv5q&X7N?$&{$!{dp)aq~oL%;+;B zGmYL{7Cn2%ny93UnJKm$ud%06v(S2o{Z3BiT(OyzcDVz&dAucR>@!sBO}2MGR2kc} zwayXzZ2nRFb>^v9%(#i1`}V-O3+r-bmd5tqQg8pZ<50x_eR`B5h_#4QSj)6ToWeu` zIs)+w$`Aodj6(n&fkN+*m|A|=1=3qto;m`LFYwW~{C(@Omp}GKUq`UMH}<@?&iL=e zUl10L06Ky*cBV=#xt)+!25mOTSN41@jZ!JkgRJq`wpu$uZEbLl%Uo9Sh(~~U1UVjf zw{9uo?Yud-^a^cBZ~5{@DdG|E4gquoYf?uLJKI2q!yCfl5!_}(jpO_3+HcT$o<&*^ zB+gPkTkE@Tk+oafzPRqgB-p`Bv)?INWVC}TgTDTB|5wVG2jn;(qsM7ekHdZMgWGMZ z?S5q}o|X2x>Kw=O&^O7UJ~`HR-q_T}BOp6CXY}<&9_i%fBmp#o=WB@b6(a+I+%-W< z>HC^~ShcCXut!t3lEJw1l_Al?Fi{2HTVUuwj4aShB=W2uAe|nRr)AQvJz1(u%gy-? zMA}Nw5xnT~n6Yc$d6isR66cB4QKwY#xF2SrlOO9mN-sUuQcJM2m5j2GOY_OtB(8`j zlnItUdc@1ao*8e8IUXA?kGVugA5u~M(#6ve{7U39!cX59d1PnkBS|3$gGGNd!|yR3 zQ2x;KNIrgbpjHUEB30Wuxfk2k#I$RZxIVJSQ9DS;_eM0fflcPyB3rGbX&=Wb$gn~4 zZL!9LKC4kjpz#I1_b1aQ{@dwy?3#x!a1Ct~iBC8A246s;f$z120Qds=oNFt?q3|8t zPc(d{*T)jwKQaI>XaIc0B{i+ZnvAr`$X6=SfWQ~9Nvx?2T7Qp&6gn;&?BVg25gird z!>_ch#quaUzj?>Z9Ggf6iy1Q4TP@T!!}uZCIkEUn-XUZ=jb}(tk_+*=kAA1HP|DhQ zuLe&|9d@{zW;Qwmh_mjz&7{Av}dUuyLJlN3jiS-{{@3#F{+iTjc zYJF$xRLk$TRALXs#-mR+eW&T+rk#x+Yl~R7mXLsPs5r@J5vki8126zYTU829y;9ZQw*K;tG{;4 zJhwY$?A#fd-Oq4R)70gJhM1O;jMM6vkK|CI6|MR;C4n+%#7|*Px*iFz;=e)yez^R& z@*t$j-!@m3?^Gu&K7J&xJh*22?3pgsQaabeu0EI^{C$OnLNGP7rL;6O`02aTWh!?F zD-~JW$y9PHk#z)C1ShyU7l;*c!H8C1Fo;Kuw{1PT7O$1Gv~12P=hM^P__W$mO;;wX z1v&~JvK{&o%e*hKbc&Hld-c+HFuQl}_QKKP5FHn2*hv520|bBo5C8%|00;m9AOHk_ z01yBIKmZ7=Vg#rr;2JqDaQAnISacMvR2mk>f00e*l5C8%|00;m9 zAOHk>1T=qvU;2yx_xGh<>u3y zVg~#LDEV-sU@ZGVdIcAn>A;CZU$IXRdjH)CRk?2>9)Zg0guej%1&$C^5eYt`NZ$~T zz-D$Jh)3Y5S19Y7X+Ly76Zi|HM)`x|>x?s{YEfu@gy4$jKs*A(Bj6=Le`-P=tJUi- zV9;)yfGX5fdCKy0zd!=00AHX1b_e#00KZ@4I{9XUb`F@ z=zG(_{*imn#i1iu!zBWj4g`Pz5C8%|00;m9AOHk_01yBIYYBnN>BY)%fsbGQ%U`*^ zz4RfB3#_FgfNKQ;KmZ5;0U!VbfB+Bx0zd!=0D(1(Ko`AsIWBO=ukLaOf9o~B-QIRp z!v+?ouzqyH#;W}9f}@8xh4~x}Z%qRli4WDbaLo&1i;Q~FpAv^sw+IYpRseT&b6y~yLNIdXDA?G?)wU{Fj+Nl6stVwzba3vO* zdEZr0V^?qFfm|_bpP}1Nl}aZqDuiYW_8B``T~%sY)rI?XGzVdfDkq@XD}lu1xa% z(PQ<~W3{Qr;sNNww%ZnVES`OiV|fAX$l)44*+&kyNj)4pP%&Mw!;W})*b%)g<~XRA zhaU9s@qP6om4+SE>JM8>2+)m9#=d=#M|QH|p^-dk@uNjz z39(H}rMwa=Q0`BbMqUQlIiDnVgdUH5{L-9ByY^(MGA&cowyk$ty+nUI^d(klUt;NT z3b(1_0!Len|M$Q@wT*x;aKXnqutOjK1b_e#00KY&2mk>f00e*l5C8(p5dj)kz>8D( z#*cjAsjpu9`frL8rEv!6xB=A~P#*&3QAob=0Rlh(2mk>f00e*l5C8%|00;m9AOHkb z2Lf80!mt1ETU(1?|9HcB#wn!Z2HVL$#3@`IWdT>QPy`UC5OE3-r;r9Fv}6E6PMt-Z zLZSn6r^`&u#8{>}E0pM*NCryFrSwjp*;y!M?R*I1(-YUQG;N1*vv)((IM`W_f-AVp z{rtOQVtv%u*{{fd+|2##=CK=?DHUB>psBLTX%Ars^SqQ9T$^9&jm$gSqDF6TnlOdyr3|#)F?iTPJbe(GoJ7Y$FS7fHk8vxdw1f`3h7@s{lGIZC`RAOl4 zQ0m?UdG40x<`99zK zU%cg&P3GGo8)#w7e~jhOm&heqU9CHnvPNH+ou~A{^jjFjsMO2N2z%77k{PRt2BDW~ zF5P!f^B4GyD>nYYuZ=&yEJipQ$v6B3R^)IGP8tXR0U!VbfB+Bx0zd!=00AHX1c1PK zA)xsST>0&L{`QxzcmM1>{RQZ_L4y2)zrcAxjZCW!0r(5RUjY6B@E7pI9SJhVX=)z; ze}VJ_u_=JRKq#k&1;-VP!w^1?8auaMaz0n2l$rX|YjN{LE19G+A~TI1`-Lg;t%*vy zn3-bB@fz-nnuX0wQ4xP~l5m9hW>(te%3||)OVrqBM5Y6K_l3D^SFLr9;AiuX;;%DL z#bU-yQ$+VUJ2p`u` z1b>@iGAa_FCR_Qs=$vB}GG(zN_9gZfHxKTL8e@I+ z1jxZ+ZS@D&z+XT$OJK@>3K5-&3fKT78FaEnFweGM8Kd^;@D~XB_`+Y{jB30==RSqP zAN~S0o)#P#Ybxzbg_%`wI};hQV7KsJVA;*Mx&Ml&amUVjm0z)%os^COR=@gd$INrP zW5&*%k=gyMt)Ql<%L%QGprs_^v>ukV!IIkr-pp;tBtJhc_1LC~q{`nmSC#KnCoJx@ z&D%Xze{c=_1@0B9=4ZoSpz%xa7l6M2Ys9f<9eoLk#me*-m@uQpuD-~FJ~Js}@h}F# zX7<)v?vuf00e*l5Lh+{X#N7jU;1d}hcD}CJx_lDI&QFo{DZ&1vbmi&k!KVE_zS>a0R95- z7l6M&ju;6@GJtt!Ta*%Tjf00e*l5C8%|00=x=2x$HSAOGOj{<{0Gvky~$ zflcS(FRn@;T~fO@)Z!LkD!i#-D$0 zzn&S-d+jKHz5Z68uZGecgXmu3Wf00e*l5Lkr>X#N6k+xqnON00v~vH*X9D+wm>7g&V_ z1DA9j2*6(e{sQn9fWH9z1>i3bP=_-S?_B%}_zS>afKISd`hmw*g1RN8;q+Rq# zubMqTrsTL*)$y6M6hin5@M07<&1lp(VAPB20)K(v^A^Uz_E|-Qg;a5Eroa#1&@N`Z zWO)nrG)9fV?s~UCnud_zGKAJlXi^UCJ-5)l#!M^{GfXowGsJy)GE;UTZJo9&ESvUg zonS@q5PXi7CIaw@?L020N@w9$oi3LNFTIYx0M!wAe1X-6!Q50u{(C+&(Q>mIG`DKt0G z5y*I<8amJsg!fYB?dLu_Is&42{3zlSp6lUF$v|YoU|hp1^yXwBcW6Xs_G~PgAa*L07K64)r)%sB5$_v%HJK>b7m5d!2 z9h3UtT~k$}WZY#!N02>Z5kZ7sQb_deUUaW2w{?!%x=FnJ6FKK`Q5eAdsWPk<`<_-+csQYJ6f zdSA3t%#+zXzf~YURyjHqSz%fH$$Tz7*U12SumE8wqh|qMfXrI+*=P>)Bs2FZ6v$WF zwa6`_IMcfTz5vG|Q1~<2G;7%CWX>t))6*6ooAJxD{?vqQs6Q_J7OXCg^M`Cr<~f6nBC>WX*-?|RZ(rn*ouOR{dfc$>46SPse!9!Eg8{yP!lMl>iQHTe zzJro`tkVPL=L_6$^xCgJ_VAN;p9fz+P7Ys17Qh#fXyAKoAppJr_yXVyfG+^P0Qdrd z+1`1_QQ$A2&c?R$W zZcB}-lLG>``TPYMWITeGtbf7ZJ^AUczn$_0E^Rm;zQFp)RuZvg@gML7G>!|c6llQ~ zgXtQ*MNdOW!j&765PX4B>7+%Y#nI+qAmm`uiz0_Og>?+6z!#8Y09q%qPe^M3e1WyV z7ihh&;ib=>zreoTQDdm5-X!N_C0(AfiiCUZSpCY6ZeohSoTd(Ln~NeAbO#_-RRKqU z?XzdP7~K;70&d!^dQNqI6Y65dDU1xlUtmf80<(vDV@6L;6xF>{!b{&qp?ZQKN30DJ*DHKUMkmhLY=;}Ck| z0uO#^=EEXa zQ+VnR_NTrXrx(n}1?afJ<>Vic?KBwVA3i_;2mk>f00e*l5C8%|00;m9AOHk_!0JIj zi%0Opzirw2hQIy44fFU5^eUIXlPtquKmi1cYX|}O3&39h{sQn9fWH9z1>i4$cm$GT zUPlQnA`D26PoA5x+9h#Zb^1g+0uGQyyU&yy*Qz>xLVkQ^1eP&)1B(Q;6SfQd@Fn31411F{A4Af z0GBktU%&}diPU+j;4hGwvI}X?#XQM8Do)!Khdc;g$*tAaq|e)5;A1y#y2`odoj;`h z0-MjA))B{DymsHfmCj146tTmT4DMp7RF9VsKz=aNtmiKZCrf00e*l5C8%|00;m9AOHk_01#O22xvNjW6%HlH#~Q9-$&-r5$skj>T0qK9f1M} z7S|90&=EjK0388z1ke#cM*tlGbObtosm2u_Is(G}a!V)eqR;Zz==X?Ih&Y7~rN2W* zU^|*RK>xK)3(}#d2?fT5)DgVt+n=~;=P$kYDAf^cS%8jUJsVwEOn(qM0_X_H%M>~S z=m;{<5tQ;4W5aO)s>Y31g{O#9h&Y9*0m9iHAGl>WmB^F|g`6AKk`irh=m?-AV3hAG z^yXwB>Y->*Dm9Sg{wp2ah1El=T1U|Eja3_`Fnevx*wGW2+2j$osqp4hQPI=v4%OYz zKz;$;4cW|0+;e+sG?k!n{)Wc9D16WnKu3_^vMlHbf`SO6=J_Jp36`lylmhf23vO{i z;}p`l|J_nYaLs=|H}me-|MAD6BUsEB2ettMKmZ5;0U!VbfB+Bx0zd!=00AJd;t0UZH!1ke$bpd+A>p|q$2h)3Y2C-Sz?3W%>OH9k0W z1Uq*|X7@9kiq-6-&BZv5vJ4#obOc(>lCHWXD{B{XEY6(N+tm1>@0C##in(;&s@Q3V zME;`nQ`{u&-B&CZ9l?=3EZoMV%KAS^ekip6z8YFGQ3lXFLE1lEXF^9n?lB$JkR^hb z1FD1YKK^S;iBKYfZq#fkvd|ESUgS8wPsAfYJOZi=2&w{}WgP*X`|p!Ff=3?u$jomy z{P7<`N3gh24r~PkfB+Bx0zd!=00AHX1b_e#00KZ@g(0Bn2$J{w_?1ueeCKQP=m@S= zt}#iLp(9WL!QvW106GHb2%sZ?jsQ9W=m?-AfQ~?$Ojhka`P?w#5kN=a1ss^Dq>Gs; zEA3j)5kN;kI!!aNNX#(J$jlIoe{MGU6S|4wDwB`2LlhMbbuZZ?Ef2jH9rbnAHjqhu$M1D-N z)6bH7O6Q!*Vn$zIPLN&^{4MDg+?qL<8fvjiD{toYy=a?Vb{J+0DPII^e>&-i zWnxS%H4}e9WYVrZS*lFS6qP)iS*)_);I^nS))#4DY%=FmpvUF}+=s3H;F|5TXSx{l z=X!X-3~Uk14|n5x$NBACIxF$OmZ))8Z@qixPUVWEBuxr}tkoY_aoNnC%`v05H!{10 zKQwy&K<+IX3ptQj^TaIeNy(IoF6lPPCr&;gadY3LQDdm5?gjguZE~^xkIgeZm&A;o zp2%!FzfeC($#toIfqtH6>f%msiW&PmBQqv@6lrsrhY+wFH(ku8^QEHAS6ouV?ySj3 zd7gY_l6_h3blH{$&u+C+q`?cQ$usGfhC%ye8osqM>ta$LX{O<;>Q1EpN5HU)md5z5;iqX`q#AJJ9Fg2E- zsZKJNHRoY?K92MKwjaCdk4-k}-z&I_fi zo#!VeHstHQyT#J99mdUx^-*JIf8+u0{<)d^EqWd7O4)OJ#WK_KmW88Y3Evd zHf`FTYtustf#j8|4TOQC<41-@$i5DzMg;ESGHcOQP5Wu4Ig18`*b+BYyGQ&cvgC5w zof5Y;P-s{(rza=mY0Fxcl*C&Hjt-9}_QuTo2iL}nWO`%O>G;=L1glJVNxtYne5 z+DYo-Xi^m0$)<{!mhXP%11jGM^0Zx8O>W--lJ z#m4sEQg8oCM&$@%Z7xfy9C{V(Lr=j>d6;yC}FaRG#a`iGp*j! zB})-)uF$7K{%)>$ykv^ZNgpn`E*X5L_B2L~!R~s`l-!K;OZao?G|lAK#fX zF4xQNM(z2MYeOHg@Mo*`eHy4-^{$xq)bY}r%{k?KdRkQ9eyLV2o!r@w4fThHW{8{1 zVqAcr80 zvD$I>hVO59?fS`9v*j!6BW>@EAEx_g`8@r*&=33t7CQ=1nXDG*M4eX~`=zpCJH-0M zOAsZKmt^k!;^bazTNBf+O*XIJn&4ZAn6kR?;pBLTVM{+0C~F`~~1I0Dl4a z3#8#Mz=IC<%;dMnjIOT8Lwi^U82$p%HNfgud;^>vt@kxtZPfJ_i0+ND7RfU67wGsz z!?)>qt%;HR+57ggq1rsxi2_yvN_cRTr0-~4nK0>Wk31&yAD#m zK*L7*2Ol5+1b_e#00KY&2mk>f00e*l5C8%|U=<^v`3pSx?pvPvhl5?;p2uHckAesF zWre?h0tgn@5CTh9&8$2Dz)}?tD?$jcNR|-J`P}uz*ef`NHo%sAHaxi;qNWyScOcP zu9F|h``eu;=c^>BkagOwI7Dy3HZl+Hn#&#{NHZepMq1)B>3m*@*RLt;B+}ci$V`_f z6cg-Yt6Izvd9(PH6qL=QBSUu`O_58KJS9ChZK=sEL_>JDSYb`2ohkFatD?rPUPYih zRVtliT2HoMpRt89U{{SS&C5v-63CtOxCMWHRS0QP;;zgHekSf!%cN09CsJ95Go%kWpOJEV{#n)$(7FFTQb+Kj!gas(vj2R|V~A5o-`e;90U!VbfB+Bx0zd!=00AHX1b_e# zSoH{KI)cx<>`TZ0^Pb6j=Ft)CRZzKxEJH`20D{FegaC8|fv6XO=msH?6QCm?W}%2f zK<5_)@4;iENN;);hX6VPm3-upXguPE$0Ug_EMx<81ke#64gqyV4vRwo9RYL%&=Ckb zeQEK(#5e@d5h&C*iK!BHf%KP_xsJfO{qvU``(Ho!6{;h+Y(YAL*0&=b0dxd=!->Qm z&)93r`Vo})7KlfHcm#+?psE{4|4(D#Es)9w9YKP`Q6Z#!+p5@UhiG*ag^%9J4geiD z$9F`HzAlAKEd@4o07EQaRYRv%Gtog0@!N~p*O!PI16}o^G|8>|#R7B$t6WErqNC?a z(h-baSIhZ#CtZcizqh8463#!#66E}QR{JJ&1a%{gdLYS~nS6W7sD+0&fQ|qC0P{sm7yb`bN_p#j-cmfpZ-qc z#w$Jo9RYo7;{ybM01yBIKmZ5;0U!VbfB+Bx0zhEZBcSOBKJfGR+uWbOZ_@SX@I0Kt})_0dd(8&X1cBj{xxq*d!3QaB`>1%$QLle()(EGC@>yEgH9& zP7l!xe0_mJK*lZ5cayG7pgo=WPWnVh-2K@pDt@d#)U(jI2D1WC&AT!pAyDHY1D z<%f)~*`pw2dQl!&spWsPBlCR38edLK`x*UeNUxqm4nNr~owSQqp_+Gd<$TVruneQA zfnmOLZZOL-`L597nd3PK$E#c=mqYjCWzlkEN{(w)9p4O>9>YIGHsE>7&OqCNKcSl` zRf{gmAf18vNkB&c9RV*10tXr|g?#3HTxf>4xeDVEbU!!uMCHNP?`S7oJEP$f4ISMZ zo^1cW?Vo8cx7`>2N&NNkWUM>-_2{W+d-J=R?51lQ|EjUvxIOZb$W&xA$-aC(cU{jo zb_I_XLI`w(xutOI`fKPQJWG&cC;46`XnUhWhX+QFCGJQa3v*NV42b0uM7|{*N`2cY zjtzjPz^zV--IBw8{7TE!j1Tz8Afs&tQ4an#1?uAiw+yFhXofXb z(41gc50XN`{*A_9(D#mUEuS4mVwg$OujNT{DeA?G?49b6R4 zP_CuMQ;ETWvB7~uDZjLkxJWcQR#>N<2i%fEK0TOL+}wXf)VO13y;iF#zz9UZSp%{S z(vhcg|NT-&@P&Q78y1Nuz$dde)^HQ} zdNu<>v(ZU4G4CyC*}D^nN088ox(Y)#S0G&ZbfH{3`41fdRSmF01RX(Q0)Mzi5=oK&njCjvM?$U(?m>?xjDWWA=YvYfO)(nYV0#2 z3R{Wo-6!C(UA5LZf}hPlioec06^j`+k#pZ3ICnv?x2U*=?Z2ho{%yyhkq2l-$uv&SanQ?Sqx5Ds6iXggLqOB5A?*+9NDEdtL`u?wZsejY7H$g`r##q?wXIz5nI z+tXxD6Y!q2`pL@Hanp=OjRQu#S#bVb_p`6qWK+!8*BzN@^`0&%T#@=7`5W;F)|QUo z3etn?q`f%F7x?1nU1N_YZu=ipN6^{uXhX;84G(X)yZzg3eQoRFuZ~~W`gqHuEw{&> zj6N29MYN~+L(MlgJ=&CMd|zWF^5e({8y+W{EV-w2&bf@!G&{p+nqYr;6}k8J-!)Yw zkzs%G$*o zdrQp6K&2VedFhi*_YyY`Y>66o_13M=r*cI?_?;9w_K@g*dp5_6-rmUU7XHxa`2)cN zw`lh*kXUou==miUO=xB-%LxDOKyX8~TAI_80PzYDuMpz{_2LySpnrwXhOi`9$wLXx*!aMLh4*VL zz~M|R5;IIQGBd=xUzsVpkhV_S6*{)*XusBJO?W*`wBW^d-iVgkhUa5|=`u9|$x`=( zK;xWr|GU(2fls~gyKi~T@1OW$d&6VIU*Jr``Fjg&_;-@Mf&HU9T;%8AzNj(QSFa7o z#mUUBhYfK_xw60J`VCL=P>}E!h@6YD(#1iuvy--?EMBXXDfS^yd&Zh9T1?AJ=1G-&NxII=UK=xZ^h9Phc|*4(H~a<2 zFweG-g3166DX6@5BPCWTsk{cvrzd*9jw0$^5V*y6C(3#F3t09U zTZGfSy5smg-qS}GKz!}fu!<3&UIEw3aeD!F3%!qPx1G<7XW|ivP6z!|{jX*R+12<#jDL$G#pt8+%W*tNFdnH#Qw_jx@fg zX?iGW>%arz*3zMR)j&oBHa(*D{$d_1z;7Ra_Q%^3RsW@1AGPG zD*#`CdcFcM3xHX`N;V5vfG@@~<}0wqYyuW+qd+<{Ewn@PZ2Jq4Q|O`{?9R>f5BcZm z2)^-)lfwt!RE|;|!RE&I!FRAq6&YNjD#Rn~2NOv#<%l91Nh~bFG_f(~A{4eCU0A}S zXHtPALS)O_XzJpRR3*SNb4if$HrJ4#%u`Rs7&v0E+MT`$zxbcAnb$T(F zaNdIn7$3m+0LBOEjSnoKe}$n03?;1Op@e5_d|<&H<~25;@NAC@$UZ3Z7tnkM|0eeK zt3UV3m;8A<@$cK%_@0K2Pc*%*<7JKS>9{T2fv|CVsZJ&{S(C6M}eDSm>_sPEv+ecdr*=g!DOjm$iSk1FxeEOj}d zb(gi2WSovsE#omSgvyWw@)-}6F=0lHU44-Uz0yuh{0FmGYKq z2Iv{snYko$|Cwo458^oq29INe9mmTZdMGayzJnx?9k1IMCh#3(RUdo@=?eh9gFP{0 zS8qhAhdehywgBHjTDu-f4X4Ia39W(UR&tZ@9dt=g#+H$$SVL1(wOW{2K6dMw%*D;| z9Z{pND^l{_ezJc=t@p(8RW&a?H50up;&+m6L}o6{zC_d*=&IKdlUw(Tg`S!G_L$Mt z6?te6YekCH;_FJS?I>1;ct1<)J9WM^#H3uDBCT@*lby=s>P7b*%v@yO!9@qpTXJN% zC6anc5BfQ@8!i0>KHs|GsrUWn(L3NfNKwHD2mk>f00e*l5C8%|00;m9AOHk_z^X@J zAH703F7S!Ye|_=~{-N(Ed%KJ=1 z2mk>f00e-*N%2Rj9e9 zN)?w!dJgbTd3wQiob;s4cM{^)ldigC58@bg(=EG@&gJW|e?vB#sHBS-8LHaXo-sCX zy|B}9bID>!#N3ujSkGc1A1Re+oj>I#0?e7ZPUm2WHdR;k%|o;Qef4O4bbdv}${HMs;VsJOhm=H_}? zL*DMrJm7Zwj$Hx{XD>?D_9a^$zRh3q9)YglC6uPIknM>&c-yY7RwJ zjn0Mh8-#@*Z*uU)gm(j2D@E(0#?1v;Gs15WeuMBEtmiif6G4~=u4EIz1^8t?V}65c z%sz0z_KKvxwEW@`u$Y6AFYu0^zv($2{6WWklrPW``_(!50wft9AOHk_01yBIK;R-E zaNgZQ$eHv<7Y?Py22Jn;?75gS z4NHM@ctyb$uNBqA_`og0DKQbu5<;e7_yYboI$4s1lUFU^3k2x}NuMu3=l=K0ae=$P@R<+& zpuKSe`~@yTBM-X-0zd!=00AHX1b_e#00KY&2mk>fu>26vbOcX*{7dccKKf|)JUW6K zmCM*emZ2k10KwuKLI64f=m_jHu24;EKD{Ys>?b69Gf1-cyC4=`U>mE%o-VWc05? zZl24MDu-SLKLbXgfsOz=0_X_DQz0G{r@7|wk}2{*rw^B0mkd5r&=Dv?TZxj@FPCWV zd70}7tcUJDG1&1ZBUDGQG1fPaj(}vq2M7QGAOHk_z*eFprMlCIzFtWEnaF1rRK*Aq1c!fQ|q<0y;8nQ9>``5eOqYKY|1$ zn}^WANt~jhD_P_$1E1z75KlHQypposcMPoAA>t80M=+kcEj8-dYC%W9Y9k_NfQ~>^ zND8-`Rv`QnQZLy>=m?-AfQ~@$)O?i@d1B^$Txf>4xeDVEe8(M{{PO0Le?@f!o1$Nx zS4Tjy-~$AJ01yBIKwudoaO}CYWPdKP)(HGJg^~S5nED#BKVNS`M3m)|UM*fn zK%%dZCo^tqpvJ4%80tgn@5CYH)WH9kQg5%CBRj{xxq<_c<2u9OO8*K)~ANK$S>3D3|Gq(*tw?8j`+l&VF6 znjoU^9MBO!M<94=&=K_B^3rcL|DpNWzL}vPJ<%ThvxZBXUw9rmg60=S&#j?;ATAXM z00AIy-U!Uz_&gq8t&8=MREjl^uU5O}xmr)DHhuB&)i{6KV#IAtET_g-QxE7QX)8-u=8M^CeDyf{*?u55TGj0w(KWg05A8BAF z?4rX+eELi5x22vYN753EYq3MRD~FC?vlu|o5#(Ga>AMuLplmnoj~a(}oe#o}4z9Cr z_Qo4xGz!DnJvHUpQE!a{9f7X>kDCYgMUAn(xl#930}^m8umI6_-9*ij|AQ*RmL(V!R-39@!H$dU_(0e$bhsb&~wx zbzPCT!Z>}k8Z@5A4>!Z|CFyo%_S%@SqbD-6N!=q+0Vq4%9kxR%6bSB+tTPk${QvEp zU2Icj9L85RdRPU;h@2=+t7z6Elwy_N-mJhQH?KTM^c&u$#>e{vJv_$kmHwN)i zV@ym;@Wzj*H)=33UTLBxCKwW8@J4PlMsJK4crCu4=e(!qtQ%n$mOTw@-Rax6?eDxj zU+?og|AUESA`Bk^d<3iFBN(8ExY9@P=H-pQ^}l=WFPbmVw3+_E4Fo^{1V8`;KmY_l z00ck)1V8`;K;RZ8Kxb6;$m;^%PTt;}ymIVAAj*1@`kvfZFaKWeF*L|WWJ~I7kjo-U zmIbq`%@@{bdRtrI%nqJ6!;6PnvVF75Hz}9;xFv-h#8a)tTl2TZFOn|gX;t8Sh7AXo zgOVFcGI^_9NSzjSgJ}cg3(&JTsTYX9bMc?)>*Tv)24FK7t|TRlCW3_y`mrxVwf3z()Wd0el4T5x_?P zAHmey?ny@;&yEfLu*|D)^5m8T%#Ca?{*QwDedS^AIXeeu> zbh}G*J2~>W{Y7MLe4O0U+@TDB@W|BU;X~u3ld;6Ov|saze$2PczE#R-@a|H0kv{Tv z=?C#EdrM61xva2(uR?dIQ#d;MOq7*ZtUCLqS>=F=t&ttx;l|rIhc30b?jNP%qsh%ZQ+R>Y@jY4Rt742NO{VAJ_D7t@foQ6Fvf3FRY*ObEszJ; zt#&l=?GUXODO=bbxwmGlDx_>fdl9(bN@rqM=*Y^`o-7J zZoU8?!A+dr;He-00w4eaAOHd&00JNY0w4eaAka7jTt0%qE3be5*!w?Sy8$0T5BaF@ z5j4*F#yee20`L*QM*trId<5_jz()Wd0iFKlQf0>s!2WLaPFvAPbodD9R3w`+l+%>z zG`oyuhmT+~aUhZ8v#sfpRWYlUGto;C!bboffvD`_{yK>)#si85nB410Olv3U!~N7e@u`cQne!DR0{NK7!Ws zO&jReO0}eaNU|zEWvU1aT(-x4`N+X87VjZ=)lY{24h}fMOPj?6P2e$`` z&TC~&5KVzHw@>5_ zhUj<5hD7eOizVc@eMpf^>`x>U^Q#0T2KI5C8!X z009sH0T2KI5CDN&kia_fne6KV#^1&D6Tkob=_ax;aL1ob/bundle` +- Method: POST +- Request Content-Type: application/json +- Response Content-Type: application/json + +Enrollment request body +{ + "extension": "101", + "public_key": "" +} + +Provisioning bundle response body +{ + "encrypted_key": "", + "iv": "", + "ciphertext": "", + "tag": "" +} + +The plaintext AES-GCM payload after decryption should be a JSON object like: +{ + "connect_string": "sip:101@pbx.example.com", + "transport": "tls", + "sip_verify_server": "yes", + "username": "101", + "password": "secret", + "display_name": "Extension 101", + "account_name": "Desk Phone", + "outbound1": "sip:pbx.example.com", + "outbound2": "", + "register": true, + "reg_int": 900, + "check_origin": true, + "media_enc": "", + "media_nat": "", + "stun_server": "", + "stun_user": "", + "stun_pass": "", + "rtcp_mux": false, + "rel100": false, + "dtmf_mode": 2, + "answer_mode": 0, + "auto_redirect": false, + "vm_uri": "", + "country_code": "", + "tel_provider": "", + "numeric_keypad": false, + "default_account": true, + "custom_params": "", + "client_cert": "", + "client_key": "", + "ca_certs": "" +} + +Python server example +- Requirements: python >= 3.10 +- pip install fastapi uvicorn pydantic + +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from cryptography.hazmat.primitives.asymmetric import padding +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.ciphers.aead import AESGCM +import base64 +import json + +app = FastAPI() + +class EnrollRequest(BaseModel): + extension: str + public_key: str + +class BundleResponse(BaseModel): + encrypted_key: str + iv: str + ciphertext: str + tag: str + +SERVER_RSA_PRIVATE_KEY_PEM = """-----BEGIN RSA PRIVATE KEY----- +... +-----END RSA PRIVATE KEY-----""" + +def server_private_key(): + return serialization.load_pem_private_key( + SERVER_RSA_PRIVATE_KEY_PEM.encode(), password=None + ) + +@app.post("/bundle", response_model=BundleResponse) +def bundle(req: EnrollRequest): + pub = serialization.load_der_public_key(base64.b64decode(req.public_key)) + aes_key = AESGCM.generate_key(bit_length=256) + aesgcm = AESGCM(aes_key) + iv = b"012345678901" # replace with os.urandom(12) in production + payload = { + "connect_string": f"sip:{req.extension}@pbx.example.com", + "transport": "tls", + "sip_verify_server": "yes", + "username": req.extension, + "password": "secret", + "client_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + "client_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----", + "ca_certs": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + } + plaintext = json.dumps(payload).encode("utf-8") + encrypted = aesgcm.encrypt(iv, plaintext, None) + encrypted_key = server_private_key().encrypt( + aes_key, + padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None), + ) + ciphertext = encrypted[:-16] + tag = encrypted[-16:] + return BundleResponse( + encrypted_key=base64.b64encode(encrypted_key).decode(), + iv=base64.b64encode(iv).decode(), + ciphertext=base64.b64encode(ciphertext).decode(), + tag=base64.b64encode(tag).decode(), + ) + +Example baresip URI +baresip://provision?endpoint=https://pbx.example.com&extension=101 + +Security notes +- Always serve over HTTPS. +- Keep SERVER_RSA_PRIVATE_KEY_PEM secret and offline from the app. +- Treat the bundle URL as a secret; short expiry and single-use are recommended.