From e392e222a83ee04ee25c00e26dfad5f47ffa69b8 Mon Sep 17 00:00:00 2001 From: mingchen Date: Wed, 27 Jun 2007 16:55:27 +0000 Subject: [PATCH] *Added some missing files I forgot to add...OpenSim.sln should compile now --- OpenSim.suo | Bin 303104 -> 0 bytes .../Local/CommunicationsLocal.cs | 61 +++++ .../Local/LocalBackEndServices.cs | 209 +++++++++++++++ .../Communications/Local/LocalUserServices.cs | 118 +++++++++ ...OpenSim.Region.Communications.Local.csproj | 128 +++++++++ .../Local/Properties/AssemblyInfo.cs | 35 +++ .../Communications/OGS1/GridCommsManager.cs | 18 ++ .../Communications/OGS1/OGS1GridServices.cs | 248 ++++++++++++++++++ .../Communications/OGS1/OGSInterSimComms.cs | 70 +++++ .../Communications/OGS1/OGSUserServices.cs | 25 ++ .../OpenSim.Region.Communications.OGS1.csproj | 149 +++++++++++ .../OGS1/Properties/AssemblyInfo.cs | 35 +++ 12 files changed, 1096 insertions(+) delete mode 100644 OpenSim.suo create mode 100644 OpenSim/Region/Communications/Local/CommunicationsLocal.cs create mode 100644 OpenSim/Region/Communications/Local/LocalBackEndServices.cs create mode 100644 OpenSim/Region/Communications/Local/LocalUserServices.cs create mode 100644 OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj create mode 100644 OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs create mode 100644 OpenSim/Region/Communications/OGS1/GridCommsManager.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGS1GridServices.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGSInterSimComms.cs create mode 100644 OpenSim/Region/Communications/OGS1/OGSUserServices.cs create mode 100644 OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj create mode 100644 OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs diff --git a/OpenSim.suo b/OpenSim.suo deleted file mode 100644 index 1d9597c221a42848110056b10f99cbb30fb89f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303104 zcmeHw3w#|{dFROFMF_7X1V}<~LVyrr#gb*&Ngza$Wyis>O=KqlM1n2Jk3_bNB-=4| zC{PHH@(h&H(z3itDbOyDZlP@3B`wiyWQ??yRfD7v2BU=|37Cwopa`% zJC8dv_v%V#^!qgT&diX1y0*nGS1GWHe1Z)M|1b87}8{lTZcEAq6PQZ%*w*bZf zy8ycZw*qbh+zxm#;3a^U0>%L^1Ka_)6Yz4t9>89}1Yi;{1=t7J4>$lg2)GMyH((lY z2yhrM12_VB1z;912bc#O1snq$2iyaAC4ggm66aHZdjYQk`~=|DfLrjU8T@iJT7DSk z*@!bZ|8W7ZM$nsMpLV?Z)I&e_tOKn}2&kd}|j*U=F>z4Lv=F_V333Dbz`>vtQGW%cE62kH-U?J9*0oDyzA{_ijRI zdogPJ@yBv+Lw)9f4F~Wot8D&$bqnoZh2L>*^5A?-0%-u}KcC_J=Y7t9o@M^C%^Yve z|K#sw{u5`D^PjZk62Q{|s{xk+E(1IR!1+(wKpG(PpR|DU|G9v?^Ph7rIsaM5HM17!-C5sOUjZnkjrbhEJ#ITX<#$^mGc(%;D-G+?~WsJcy@H z;7WhP{XVQTYt#y)U%)x_I)JW+rfU09`X0P%HC7b9iFF&t3UUy2Bh{M&>_aVAW5po# zIf|#J@oh}id=l4Y@NFZ0GlEZt@Hd0{ZNT@fpc|t&AH$pYoit+__xIturtf*{k)%Jv zs>k+#A|63$2T|TUYS#R?0`!k<2TG}<`IF`j=|AT(k7W6z{}bq`BPf^c=Xj(Y&x+|E zX%;Jx_N?6Fm<#<&md}wQo{XVvVh`(*cA)$omP>k>w|uS@m-OhjHZT7K#&a)f!BxNc zA?;_`Jeogg?r{Fgw`%c_cug)uj_i5BCy77Fqs+DByVAa&0j{(s9t(NyYabst_Xm%B ze?hJjSNMp1{c=?Bi2$yL_I0jZR|B|?+1JIT$lkj*=!bGh0)`DV)=RT?`%9v zUYQ5y`#j2=#jGRsGn7&|!zs+cc|`$9i%6kuigYc?=ljTWC``;SBU<9qF1Td%8;3;5wvKCU3|4ja$?>iU3I{2S*uiE%0Sk8HH z1a;xe<7^-gz`mbyf7e3J0MITzR5iQt+zw~i1cV#5xTx>+DEVYUe zsj@z0M}$~90^WKU7`qW;WBNS(lZ=F%^Nh&Cg3OUBORZu=s;p1h5gEl;tiv4X!r-|_Mld@zVNK`yzOHQ}Qe~-Cj7XLB$v+~L zoo|NRHm&4*SCSLi)RvvJyfUE1X$W&@J^lu3r)ty~`0J*%L#*Lh%5HQLG?qA2Mcsre zukMY#u(y_%T&t{4eoRS9(Haxj(<1=NZUeDRM6X$9E%SYnbxqF2*0(B4tztx~tWVhy z837$#kMS6W^g0Ug^}g?#jD(zvjYyTHRxu(~)~D=<41&{G3tG8W&60L$cd9J4iV>-@ zK4nK_2=juPHqDiwaQYf7?CRLQ+7l)V}A4l z)?t>c!`ZiH_^!$NA?IT2NR_2lF(Osgr|gJOA3cCIeE@TWqvGp*-!&NtITss|Dod?m zM5?S$*%9f-D#H5oLE;!}+lW+IY84|=Wqrzy$a*yrqo7>W@6<1uYTIU&rB*Q_Ro18M zh>-8wtmerkrQz{WDBm@qR&p*zwW=(&iV>-@K4nM5w#56T`XQ__wA9mzupVdM`1r2L zSjoBAm{nP76=POqeaem*bv~Rw8?efdEA#cf@0yH+oQsV}m8DiOB30I>{D^G8XbfX^ z^s7-uC!y(ZiqryW8J**>8+~;@Ur+c+WrGLsxMe zW6{Qa=l{+lzjMj95C6jCul~#>Ke(pZllu95|1Sr9U!zt_9r(aCri(&9dN za`Hb9dL>VSqPx*MQ_<~T*N&{&zqg}%Bzk91z5CXmzJEl0i2wD!h;f;RRYV>mcHGDy z9c8pX_KHsW)pI5>1|WHzv2u)MOJ2VS*RJwhr;o1hI)Bgj*W`Qnysuow+A&@r`8>;I zOr7?p*S6IO^gd&a*vI-huB7&lyk9dM)i9vU|?%qcK%O(%IR?{<#_@pWCBL-i|xRf$5vkD#~DdZd`dYPvD9l z*N?|fx%ikjQf(0L-;Tayq{A3Sf#b5T=0RBHmjETs4!wsqDcfZIdbeP=?6wRl^ca-^TNJvD9R9M%GSlwNgLZ& zI->&^IUsE(MLkdu1DnkZMl5npGwzhMXg_F@TiT^4?O)>3I!y<5V?HwKWRIdjlZ)~A z+OMWr)E62MABew!%%$@^HsK0mtJ4m~|47+9r#&n8{wqFwkP9-7B==)V*Y~sjUySm5@DO8d@|Mq7 zr8xX*G0(v^v~>>a;uz)uDI{|cFe)r-1X^kTc_^RMhR0^eB$U}{*BZg9u|`?8s4-rH zZ}iYyhgf;>MB9a$9aZ(zzh-WaRXvPAmobp*X=i)m1y!1MqG| zYj&Z>Nii7hdk;o{yZ~d)033Atsvs`k8?JD^8eVBh*N-+`#bK@Ka@Xj>&DtY(b3f@h5i@7y?(u^soidJaJ z&Txm)itQD&g4s$KF>Gpld#<*?x5nLOebR`@)%jWylc|$wZ5GIu8uieK>Ojl3IdhbkQ9VqnQznfN#z!nxG>b#0MCgj4>+n5j2ZHzsKS3w7?1ao{{>j#S_ zl&v%!HSZp;pe>Y3`Ci&FjE>Wkv8`Ykvv`})j8lS=tbpd7GfYI8bz~NEQ)}yKjq>%}T`l(tMe&gdyH%H3gUl^8p*aLXINSfiIm6o36*M{RyXTaW1p2VxzJPZ>|e8%JUEwH zk-V}vFJg1DHydlEsu0(rbv~i-y}j_>$jkR!o~x#L-e|X`+L8Bb(DIJF`)j+F)l!f= zt7u*dlJ+jU1$C~T%*vX?;Uq;ca;;sf_Gn^Y=*+AiR}?KH8%>T~)1{#;_07R#Pp8pd zqnl;hg!;Bu7ytCk(MZ?n+oRGt^>BMFjmOW%o>9n(wB%E#d>Fie#v{9)tHFmHYKw{eKV}Wzg57I2CK;8R+pTJcG8=CTV};ZxY@gKYsn)^t;%C%B4%W?wkGg znXB%9{8GHSb( zew8*f+HpCnhibu&U9j8HH=R1x(O4fokMHFD=2ac&9Vq^?E_InzziZrgq?PvC^{{FD zR;72GvHD?sE&aeUxdQ;T+HA4u_Z_vA$9A!wT`l(*Mw?o2y$=ZMK_6!OD%V!pN2r@M zb>-C0(v5l^MmWr&rA|!H&N$b-1>cIxu@WEj4$?*zh9QJf;+wl8gK5HPW5N zwZo4WTVbnrJ@`2jZ>Xj1cK;7y=F`4651p!xexaR@@k*v2>aPX8#kn)X0a!ou{xs|* z?we+6v8k567{Zv-??7{~v>DLurKux(M(+{fdb)FD3`bZcjWlymBy-ltrUMM-(f3AQVMo}si%Jq7xSrpJGjVbc zD3v=}&#Ps$?Ac&wbt640t}idMR&kDKF9+(5O#Gt3-E8^4EWg58LtS$tUAU>1k?>=t zZ8s+;XU7H_d%94pdN};8PPD05Yvzu{RMKgLY?N=?6_=!Q!fWsvA9?+A)*!dR1t8Bk^!RIdyaj z?}8mM=`AWFVr+0Yc%jiTT;JNYU>Yz70k|K#Z~hL(7Wn& z@AjyRjwD#YsFes-Fgq@-F~gW^88UKMu!1FdkbM42!3wqoGO>=u(<_o+TNSKewmy44 zk$;XWMLpWDW}^|TU^>$xbE}%@(O?CmhHEy??bc}3ub-PV+)S{71uGbR6_{_r=68b? zOj}89uh(D&qX(X*-olLpE11od*)u3u!J6gQaJAnOi%OdX?G#n#2Q<=GJ1jZD3g(yS z@?;DPRxs)Z#^HrSOFr}6WMwHU9`_%tV2zpTG~NX(SRO0brcoVD_t&4j<@Z6X7mvqb zn-50Q-Ht2eHL+YFn&p#7YLNU{S<>F1_4Y>~fvLR9afI8;x~}Hk8Kp-GB(_OfHPW&- zH}j!sh8x052wM8Aq^HSE>rBniR(!7;bJMWW&L3pQ6%4hZUX2=T9aUmWKQC-UJzDio zZBHMG=eBsXHTKc=HuTX}P);pB>XnWe8*ntH@Yt#-`ObJ%2k z2wa@_VCeW`+C2jom$gTqZFvk_9Ak^vV|jFQ?bmD8v5o~Ut_W8l(zNNdz{P1#q5(hYtQ)FF9{dJ^G6=7wWQU=ype}8IbHMXMa^##n$U-L-NhVa z)nq%Wx^|YfGp=VhNJ6-*Ts8H;s_s$8Q=D6k|fTs6Ln}N_1pBgn_{=FuqZ|=QnkTb;otB=bri9Nn2`+Bg1%0g@5@IM zT^bpvh2SCO2*OgQ7Q(%~_sY*Q4fNu1EyA8@zrcgt2Fg2*9Y*PYK@W0j zh4(?~>5aA{qtmV?J)Ot?)qWd$XV-nMR)GgYCn)}=vtto>uzt+owSe{bPe0YhI3ag_ z7U97}qxk%_Ykth}mg6h2MzI>daYL;)!6G#Px>QuRD8JM6eo@Q#p=TVVU3d)Du1?Fy zoy@DOrKNd{>)Q?X;j7T6!tu6ZA8s7;GW>5fnXMb^G`=|2&9zFKYr`(B;VG`Yt7c!J zwBBeI^Hcvg2)}1)N4tV(BRVPD+FU`ES`qub)c2=TGKqS~x39PT?#`~`c1?_)w*7i7 zYDnshkzh+Xjwhq)y%MX&4=nSbfP2-N+$}rA*E@P;d?PzM!vd#VC#T#^o;tQ~U+daR z;erF-HV^BuEfoa5O>o2T&w+0Xd|S0zN7o)1_%`ZIgcb+B&B%uuPXgaorN&?P>2k0# zi-vRUP1_%Wu(NpF^;qpQc?YhfQ|>(8Z6*sctuMA8)Oe(|v-vch&EL}-zbByqjU!Gb zy1EsXhO~;dWi+ID##+xqLE0i-n>Vx#BQ$>7IB%@7)z}Z3_mr7kt?=YaO{*9p zi?Vy0J;a697uBdVr(R}F4|JaS9-8;mN}}_x0j|9k z@RNYo0bUQd5AX)S8v$1}-!+>7|d<5`IfR6%x8SpW{#{r)J{0iV#0skKG zNx-K7p9Xve@N0no0QhylX91rB{089jfd2^iO~7vfejD&dfG+?Z1pF@Gk%fhYFXH^4 z0lxY0?%kK-Hz-`yRPivkH9i(X*xSrk~i4LH}%yTh@Od*GyI+(KS>1{3b z+=4NlfX6j=l|KN?o`inh_Ezf4>~Znt$wRH&=zXySa7EDT{t!GvM=%;|ktt;`zpIub}bC; zYzGa{bEsQ6-tzP0G3a{V{E-pi{1NCT-PsjrfN*_9b!RpQ#hm|v<70%rmT&^cXJbd; z_yWgA>TnP-k5h}3LU<2S=Q`F@zJIxC-O8_I((8fa+XK0DDiVuYZ|oT&`5I+quM0Z^ z$0t4CN-lBoW47*9taZe09_8mr5spu^s24ov@a?*M{r|G3X)Wq*d@Zj<6)#>l{wtq0 z)%ROs|6yoH^y<7Aw;Ag!U(!W&?oN#>rCs5@ThX|tk7?`N_zks=ysy@?o?N)s*IEmm z<&If#wPyARMuIs|$(?jUOGvs!npLd^#OA?`geDvS%L|%B(NJbdvpH{Sv!60GqbQATBfAmxZN9_(0AG8SEFa;oa@bvGkM0<*JoPl z2@$T@+UMn}qplan%EWWjA?X*Fr8-4hFUQ=^Gpn6}77PMljAEde}<5gvy^~sl=Sa0o-4pQB=tyN?D`B?q(X**<{C+8JBkMz!} zX?Ca})oq4vLtF_ zSv%u;bwkeDXQA&zCeE^Urj1MM67af8M^E-JowxAD__^IsX<5r5e?pb~oz215p-<-f z$rUfhc+D!up}6&=j?pTv{qKa-*{%G5=wEs6CeL=^oqvL9_rt~}YR`~z(n(f6x_w7B)beUuhov}9{&Nsw_}yFr3{F8Whe^r8}^ zf7Du+B@G8Tt8@$V&`TZ#2F>F?uO#uPQ7_@E(Rg$#e#;0lt-s)|ulvwuBUe7JCY%~k z(K&iH+^Xiqag;iQ>;YS?(no44-R8lD5VwCs)n)>7Quc*z%v(@i7vmoRe@|!$d_s-& z9C}4l3+5J}UoAa`Nn1D8)Ia_@NvU;>iqUXTchyltQ2Y?5>vJQ{%+0!vGEvfR<&731~bRHnKWe2uU=5o1JMb!=8>ZH zB1^>{jOiX|=D8L&wqi4O#Mz9$bx|Mo&Kxe8OQqTou<3vsaiL|reo&JUB zmEKH!F(7J!96D=zUqw@>>_ODFOBR*-zmib&y_EJy(J!lb@r= z>owy3+8(JoC~$E*P&?NCynW?z4t8JFNeeDOLHQ|&U90wTe^1Y>XF3;Y*Su4!o-g*N zwRO~PO()j8Gf@FMmWJye57OYJtY2pR%B|5wvO;u|wUqQ&bgM)>%u zW|E*+HTvEypx^1*375OfYX|es%%E50syL37lzNt=jWKDfPUnbal{R{-pjTZRb!&d@ zY(0ss_sg%P(R|w+uxpbPIHj2f^vm zOEY|awf=OSw4B+}YtRlv`l&eofs}*SDlQwRP*!?{#SF zY}^r@4~kMp5nt9#_(i)gTy$g2HFjIuSR1@fI$OFfnn}}!?TTqqFStwLDVW5r#X>ua<<@8Tok37O z-LIM0t&i;-?NwnySo)+tnIWYwFe*EN!T&~CLp zPv0KKGG#37F+PSFPPh5GXJ%jjx`FkGL2P|YKhnyWE`(!6_W)K4-`~AhdE8aB+t*&- zobJUMJPVOa(qOqXye`V!_BrkyVX~MjWsFU7vjbSA4=bmCotADXj`15?q2nujj2Yrs zJ-1wbP5xLI%YuAXFJ`DDLED2-rL!87P%?$0odm6((Jn)qyOO6qBT};bq!QrIi!M67 zuO+$vi@BVpLTl5Mc&a7qi0?kVt2X^lVwzJ;yX+O9VI_`1~P@bgenEHsiRxK@4 zwu%G46L0{d!_iCE4HdzGqw(0c4+GZ0XSj7ba94~2)gal87S38NZ8i0HV&O4tTxNBMKF+nr8dcbu^9|Ik{@6tzW~+ zG4ds3u5Xme@DwX`j9eOe2xF!bG1kTB=cjqA8f+e?FptRb3}fx)c>psiefF5UGTY>w z&HIcZ;V44_$q(xQ9_`Aazw22x9=o^L*Q%s>Qw?>{b`V{jo?qkfEG7@b`Yz4+)soJ1 zk*}3e)93858?o#{#`4ri18Hs+I}x|>Gu9;Yt18FS){WWrD*yGvsGUht?rK!(8s#!H zG}t8Rrt2R|n`5EuL@GV#u!g5H*% z{^Y(emMQb}DD(hF7BvCX2UJ39waH@&i;O1ZRJ}FsESog`xS5!^fKB3eJF!q5RSTES z<&?apD;!1G3O9N+N=$RGa8)<0lrMf-eh;!J;{L5?^ypeJKiu(XHJmAC&<56f7DGWn zZbD6+NicL=g!kdf8l{Ng^ZF^5Rb7K$lUZey=^WU>q&lDvViwuILEPD{7^5jLYpspK zh^kX#7C@VQ&#3OX*Wg2Hj*+r;JlR2Lj(hkQmJ> zqfwX}n^?UU^*6Ir=BTs<52=G~X-6b=h>mo#)vSaVf%5ZYx#nQz{^a7%URC@h*ESQq z(0T-B@MR~}AHr&>RX0`gB}wkkj+k_r^2d$)%86;$1#7j5$3C?pDU)bo9sr1;@h2 zyD{pnnNio6V<~HB!>mL(k(X;Ujz-aCsMq}k>t%D!+$XPjjZ8h{({9yAvx>L$)rZkN z(UQX)=6;?n)k}T}gT127pc>yen~VxSik^mY?<-YqbG3zl7GHuNp#1(4df&I=JF;No;6StIiM zTDCKaad&@9$$HMcU&XCRGz0TdH$Z!g!St;}Wk+Ja>@o1x^Zsp+M=mP?;l?lk`Ps`Br~bF#Wh zJ-Bn%TMO31?ek`wi~oA|-X#(A%w_9ja`U9oA{%S7_+9G4-c_ofir0x_H4)v7@JKrO zH{(2>ikj8Kdm8-JQdH8I+KAQENP*TpFsWo7wF+Nquj{oSOg@qj6bg)Z@_y z<*1mS|28r#M}u-KW&VST7Sl8;IiDo*Xu#c!W__;U~S%q+{+S(&%u zb~0lu?KPBvO#b;(%Jy^ua`Fi9XE*L6-3;WIjqs1@SB}(7NJF`X#~FZKc*78$9#vQP zbRV8ri~rZfpX6!v0E@H^U!E(uy|8dCK8mH%t!Gk?T@608ZnrF(^~%N4YIGsAfbT#L zwtueXnb9scORaNyJ%zdzqXS86q4A~Bd~LOR5$5-#DYlPZCwVlHH>zwKEj!sgfQQsU zJZ>+3RJjX$C&rFCX@UEgd$iM_?*s_x!hP5<#2nbC=c)cIw8GneQ+P8w-z39n#WwMM}CVl=Xc#Ta4F4D!cxN;+)#5LxHU+Q9j)~3?+0T?(zJjzctKnHq0wq4 zD`l|G+^u{h`eC(N3s{f;)EjNURa-LYjjG5rU5t~eWA9>eN?N0^e5^Bq%bk_{+cA@Z zO=acTREXUI-J}cQZsNj$wXO?EuHb?Dnu7-l`IszEnZSMNehS=|toSS4HzsgjRqn~P zv~+HP`(hl6_G9ez?6!u*SRIr-JE5U%rsZROI_YIce-odaN9^VyoR>b2jerB&IdI0_ zx9hw5{~bt3LM`O&_*$hF((g-eN5y4%6EwcTuZ?_J*VVi`wUVS#!V{O%O8Q2&b>8@f zHjIC^cGA#+W)`VpTKvX7q9&i&c^bW|IKN4Y+H1cz+L++q(Wr6L_$+(|M~D6n=@iy@ z-*B8||55Qtm3PT#cUEImwl&PUr13e~PTWvO`!PCrq-1*|a@>qJ;&q5t7)6xWZbUru zXzrP~u%I3&;F%ajwjHc>EsT$9hSlbP%F!m;n8rQ|t4%VRpqK>S2{}bph_Kou*Oai@ z%s}hfo_)=IQs=kc@rNH#^gsT0<>R%~Igan?JW(;OSuE(uY!B{RvLsLcTl~`Jo~~^{ zcS@mlUbS*kXtPmnoi`Y26D~BXxp;^Sx2YcKQnAP>K`K3fNHJ#XOiFTGr#sCjT$PC{ zB9$7fyED2Ck(SKwM19_DbSI>M8N|vl`z-fGcV%C}gU-sU?Zv_>CCU0m=&2a{qN9qR zsH0Q3+e{a4a~*j-4Y>Q;D!`)vrvXj}oB=os@aKR>1I`9K25=7Gv4F<`9uIf|;E8~9 z0p|hE2RsRI0pQ7irvRP`xDap=;9|hj0G9xs4ppfad_N z1UwgT6<`gZ7jQLTEuat34_F5n0IUZL0yY3P03fLj130J{LY0k;Bf1KbXHG2kVDmjY%1 zcL44Lyd1Cxuoo~1m;g)x_5t<-4gwAU?gHEmmpyo~gWXgcJ3QbGv4 z3^UVox6Y%!l@i1vA_QKhT#QbABeYz38Hpa+_?d5i0SLHw{3;BNwA;TBSITHm{Mn<@ z^(D+O#tm7ygTvv)ynlZE$j&8NzwXq2T#4Rn%?9rqXOYwdseE}NPLrF~nY{lC@V$Dx zGyabB5jEd-KzhCl(k0g@6Nj>`4Rx49narJb1SRV%mds?zn#t80Bc1J%`8_0m7<*`Q z8)|2ID4D68k=Qdx#+2&eIfX*F?%{|RMu<4ht)RTxLBm4r6u~ z1a}CdBYQzfescCy*s`U7K}(J!2a%?9 z+!a~b4&QxenMkum#s_^9h3 zdVDj=;r<1~z$deUrGIK%--Of1Pl2*2Tk%||RnL9yvmx}r=(2rO0uQQ#)G~h`WK&`G zLH1K|;fhwbpI^EZ#V4`Qw_5`#Tr=LwZb7vihM!x#ut1#+uWQ$`jx~{^o!ygmEn27G zz7fj5B5_yQ?3(r>!iahgt`5!CIJ-5~j=Z0@%scY#ukBjaNt-Y5^lNj9Zr7^4(nXcN zlC9&g+cQaC!{pgb-qBo$4~JWOqdg9t;6ctr1?-#x@{(F{b(yo~hxph8d$FM_$yL^HAnjOPgS}WN7k!MV&&WgPgS~hb zJ6i{PF}3AI_34z1+pE!`&OqCkg1xwVcVo`Bs@PVhDlHZEd+X4R8~m(xAAzcEMs`26 zuGuW7oi}|I?8Ql2rT%`e(v5aPS8L-(Io+rIraEmB2AhJtINb^y?8Rv|UeQEf3Qoh- z_%-)44EADw-)IX~uot)LCF5IPU5l?^Yp@q5=c=tQqyM%Y8PnU~U#~GW*o$osIkCl2 z%IgFV670p>5Er)-es40%WkhUyu|)B|_>zMkmis(k|70D-Ka0=lK6>uVX|!wUSb{z9 zq@03wbsH?c6Y!y&hIP`uGmN{`q%e|h3UQ+J)yvu;)O|y5p?7QD;t`ZNgZS;}*bnz} z|Ip(rqP13rfw(oJDr$HzdL_;h{Vf#Re*d$8ed&}~VuZ9W?Ib+^??g$=f4Cj~=eyufzix3Y zu-_asWcD7u?ZBc zZ})0FhL^XmIJpE(B|9;X&q3+7k18XrbS?_cFdjh~D&{?F%PM)Zr!EEG*5_fYg3L|ds9IZYXID78*8-;YzwL$6aSy)v8NecU2lvd7ocIk}YmsVzFqUcs#I%9-{r>$O>F8q(! z++*Y_kzv!F5&jx;W9J@ob zL*strfsKDdv5>od!;b(RJ` zZf7_6sb7n+5NV|z4ZMpFt!v?TbOdYc+NbMIDc|qvNFAvGpMh?k+Hd+~>s%=5HU#mV zZO3Y7d`qhJP~t9*>2^u6-}}8B>C z4xd&dWdy#HyAA3nTJAi|*?S05;c-Zbv|!}ZZn>i-@?zjS{Z=4ZS?a>>z;~WddFr{3 zw24#n^O1q?Y<14J&UcCr`8)pkyI+>M!1E)qM*9wYPS@4AGFZ}wJh@*?vz=tJwAgvy zlh9npnMWqNx)qj&x{ETY44}_j(@^Ih>(;f>o7#pEZfi#2bH?2snfcoIJ9nx!n^BW# z=$@&8HnrK_w!SH&0e?njErpxcvd&>-V4|*lzv_E(S}vzV4q&P1jf>`@aB*x6vRaM7 z!`|0IgK70-F7WLRdJ}46@7dAV??Fc_64uZnR@XB=Ny(Nn#&JcDxL2+_G9o)vi;X5T zN;=k}Bh zSF7df1>Ub_8NK7iv4Tz^&&N@44An^|fn(MCzqqu&`9A04i5<}c$2uL61`qR_2h%kF|kg^<~|VjCnG*1IL=}H@!(& zq>|F&a^zS=D}LkUpSm36ZSnZ^Cuu+LVO%Mr6(5c6QMSD!Di1byz|(Q4`uh;{R7bqm z658z@^Y8u^{Ibi&1y)m=rK+Vq4P!Nh{+?PK#VA@>V1B1&+Udrz=uN!AekVUC53Y;b zaIt;{O1~L7MQ&5J^J!?dbm^kg>Sq6G`d_7wooK#Y z+g#H77sJ7@NDj&o#YW$SWc(9R+V-@ffSQBK@DNDUEG7oc8Cs~DP$`cYhBU8?zI#*& zq&7Jc@5a_%r~Ah!NahgX!@aW?xMFY9F$pycLl}8(_8X1Ib>LAM9Qs(#Nnj1}v|s&S2YgD$9CNog z4!Ii$QE4@ap4^E(qY{fo$1Fvb`-Wc68>*xiN1P3h#(@p2FPR`y-^Oe8jr2O$tXroS zpA2KIXuN-I$TQa55QbaA98&ZAgu>W;z=}FYyxbb`6^uEg5ks#aLi$bDEvnXHT=gb8!Yn&oNlvD1N9IoHVqvhJip+Tp;iyP@j#sv!74 zZi1~nrvBH74Q1y4{lJA0Q29;3g<)_c>wppI7+~%e#|15<90jd38@gnTJDpF+e^F(6 zSh<#REUFx3J@=Efvbn@VsPAC_H|i3nlR8%IaFhyV zS!!eV?lA9^qknSj-0ym8!)Y}SDZ|gzJ|oM_N3M(gSQ#nV_bJ(ZZKdmCBVD9A)$j}C zjnWk%Iz5#8n{un7kCxgz4C^FR^Z?f2c}P9>{rYC7wJvJLQ5O|Oul&x_Z=$V;o*j<^ zP_MrbA5ly$u!ZILUw#})aJB2={TR|TWs%$INrlHq^gzMi`v!Uh#H`uQ))Zg202TVs z*~0S5^K%Wm>yjKs(La6j_im*|*R;HO417E5FD;RF2(r=wPWC_FD7t&(?tqv*kL7@i z0%1S;Y95OO+4FT!cV!)yMXP$)PxM3LIqP}ee=Xo6@q_8*(|(UFyU6xN>>~(;=<-ZZno&xYlFQ1-B>4&tRW%EdXTHn1NCn^6xMf2}4@J|>- z3ZeTU{@4s+6#e!WAN{hYqGVl9)|58cI?88uNaC`ths=s6T=n$#p6-;-Sftn1(0!Lsn-j2vS(hm@An^Y=}rE4zhfoqpN@aDkfa~PKSqQyYe-)Fdo!MWcl_G) z^4G>sH9w*JMU2W@{@d_6&H)~2<*x^ZW*x1R{{UV}8ptEP{9NttxeD*O43M||KaFQU z2;jkpQdvjHE|Dn_{JasX0GSf|zRadC9ytA4dU2cC?8cYd-#8C_J8|<}`wHSO^IREY z6X(_hXo#CNX&&#C>r&q*|Hj|{3Hyohg%>&XE|+`httIPkjADA-C50HrJAK!;qn-1M zk-#^ijfbI3qfjnN6yVc8yy793me^_~osGxN7?Os6129`;9j&ZC@4-udE`D)(`CM7k z50+0V^;|$+{C_W=y)S-kTKWCpfU*vje>EO5^C0UNQS?4Ml4t%?P|7-3{%SmQ10Zkv zKY(YY|L>~>e}_OvD9TW2JFZmKRNGR~NYmd5&-{GVzwX8jl)tsUt zlPmdFfH6Tt(JS8c*T4BFr><gB}-+9tVeOssCI?u&shsz0_lqh@lVd)?5#AxO@e z3pf1vZslq<1AaxkV}TprdHA~X(F&K|?SLQc7`S;i>ZBa~6HPWb>_&$Wqc^Y}TTI=3 zoYlpDfAXhUcQXR%+2G6dzp0_v6po@LE~iQfDDAF!hs==YO^tk;>y2pxz9`Oo6V7@* zNM?X?{l6`h{?Mr@>mdE>#Y2p6&r5%P6VHAmesLQ8>xau^*1_^Q^F{!9%l}V!R_I@P z`StLBzk~8W3gD4e{<@s{muKQV?5Vu%|Ic{#tpFaPnM=b^d-m;Ca{cV0RFkwledX&n z-ErXD0IySmNO*U=Ci${Oujjnc+&dEA|nVV|4NI*)2P{^im?Eta1b z|GtDuyeqCqdilBLf8p|fA7$r}Kl^La|NjBXKbE8Y{fe)MA8c|W{bRo~7CCSKKa6Lk z{jaVae`UQEhu)+%?NxvDv+rFM*Iu{4>{KM7Ce5=pQP{`$w?tv{pd80f?n98~Vd(y!nB$H}kWgnp$I z!`4s^qa;9CYzsi+2C;*yq(4W&t7;g3xBlka4q)3|7?laMMB0!>e;KZlb%6fBNj8dJ z5Vtq$dEWmofIR$PUrzo<`dQD!>>7L%k30}Rme&4(ob4}K{-2=iU&~QGgW9qV(tno+ z$ofST{Wm=F_V}^?{aau7D>4Ss23}6)9-`KLkIFW}yVM$8gR`bv?=OkJZZMeP=V%Qz zVPgJ(w_#X0hOLkX_cwy!k3aD7zjz|*Yg%Yqmdfc5@zj1WE?fUJ{HK3T*1`ENJ#52m$$ zeNOu?wWQ>x^S1vrc$PNcst##;-tz5o^W-4V@#PHOA@<3QW_G^P5miL_T2sPZ@%2so49-sd7!fXQmy*ST!OOSoYD`Cd-yf_$`$4cmUhoI9P72WSuYQ9L{7 z<#aq+jZlAjCQ$b=t2*3xSgcv}u~?%*+4#JEO5{a7JZtc4dV)@4VCI0T3@)a(7kx81 ze0}h5X87G8?rc{BJO$q82tHAM8G&CJWk2f7Ippb@D2;&0pto#El2T+j9d7kHbm|kA zqF($drTfaZYd7<^Gxid_?xov{X?O304-zG_a(JWrA|1zl(H61_yPA>l$bUWQH9&5+ z(=snLyXW?3o}^o-jc+83-r-LVsnj#{|GC3zITJ+-+%8hxG4>awx0sd_RuX_+jh zT9ed%i~Msj21V(8QG9GA4vRKL9NK}|#L4?U*-p;1Wz*%Qo$M=&SDlz6d11L?ExTG^(*Rl@E%F)j5NxK%+_LZN{%iCA( zuUSi>XLZhG+Mkkr=2Afuw>&3Zr#Oc8tn7?P%c`GGzav%UobD9QNZ*_Ey65FW?ba*} z{yw{H>9o&yRj_S>>8;O47iZH}?re;rci1slW88Fv_844`FM5>_pLc&GLbk6&9u6nz zVMgB=zdww(v`+&uP1U7UtMirwwoASviXI7l?_jZiTgb#MTG*J&g8X#6~y+*+cA)bF>Bstb4L+sU)!dcZ%30SsTY7d^L}S~@)*Q(=i|(qe+VR^ z>^P3k_3@0h7rgdf)f$(iG?B(n8tUBYeQtqYq|T^7U4-TW4`Jk(oq*9w_DGTLu!c)TmsO>|3EL*^>n0spXYHAGuXS2m zSI+upx1?U(1xwPacXiq_;XbOI5syPXo9oeVb8)_u=NpQy8<(PVcRly(f6~?nzWi3jIH zCusSZDBG@?U7w}N6FntSV{%XF+?3s>PI6IM`by$Jx%HHzX?xS)t6DFTn$S^r(NIG2 zXC;(%?N0n!>t~i~gsriku_fXg@8h12bx~W=G{kPU$=-(D?~)eH%}DaG8Gq|w&tzng zvHqoh5}Tl$wUji~HN7~5bRU%Dnd^qK|2#bMx8cfOuWZ!`%1f$5klD7J`j#4%>=D32 z>LA_gc3Q&~UenVg6^a|FR```gg`TeZq;+a$_gp7tXfxg@xth`^^;_@w!;eUPdA<^C z3hjzNkIzec4Rs~Dq=wdAZ@4SY0hNj8c6^!!-$hTz?7c$dSJW{xr>T5*-=cM^lJ4o2 zkG}W(FT<|+fzX3ij}_@bV^@{FT;9I8f>l|4)Vf9WwJQV{)AK!Zy?)IK=?TFpAEgq` zZDpQwOZL?ddXvyNSg*H?!^07t<;3N) zP13GT@MluK%){l>x5Xu>l|_ZBlr5Go<#{S*Xi;i~pQwY>suQz1kJLpzmX@+jptF0G z6jCgnjMBP^C%X>sp>Axq%J{D%(fqMxX}hpcx6~M0rgsw%KS5L9q<>1%6I4bm@Un+t zpJ1lfRwdKG%ZiLHI2CwVn==c%EHf+L4&F8JvYoTT23}Tk9eM-;FY9I$5XvpwfE~>^ zD;=lg%fQRplDBltQs!kPGHK&yzWoKMFVEw5YYW2t_}tAF1Yd5MEbiC$8^3knZJ~FR z=bGC)-KqJ%5@RWnlAA50HGFAZ&;OcbiB)D7IqrpFzA=7_(Ho44=S~S4mq;_;vjX~I z4sGV{fJYX+?{(kEHTIR>$7CAVc^uwm+)-o_pAW&u;h6F*VMZC#Yj0kmy|z{1l=Rz; zaX&HVkKH>zu>yL>%&i^J3c33=a$fz^3g`phymB#wdE?w&McFs^u7JKV_~GuYvXXIw zeIm4DGiV31$8-0{6BcEC#j?Z=cduXKz$=$!I}O%zP4&SdS0iqy#p_l8 zKFnF1v!)QP2E+8m^2CEttccv*ejc-+86K=Gt-~nvQlyyk=ovHmD?zg63PJw)AliOV z^@3^tN{}slw7}K6=ty_Ym3z=fx_88ba{rR2mg0lE33{~wNCQT@MogEhwtt6ssGjVa zwz&~GNzbrd7`a*eNj@X3L84_idB=DkYaf>pWQQF^M%&HEa?AX-=@FpjuEc=KS;vAd zeO-*;O0qwFIltV@0XF{VzUzk#b_6+g`&5SDwI%!Rp0343U*DzW`)KURYI9DlEKd>A zvO4_LI++zgJfEo3SWX`N-Px|@xrgkTENkkauBBtP?8vNn?b)-BINk}LdK(v)*ShWI zZL)Dx)5&Ucb>7i6_-~%#=g&TT zX4Xl)yO)hGA~|e;v^5GCLME9q+^&%Yi6HF)ai2e`DjnRC-I;G%TA3~Vk_+r6@~G{zWX6wiaQC|@pa95&GpN0z4wgQ%F6Ow3h`2Q9HNUM z{)mZ{;MHX)afp}ld3c6+spXg>!C*aC5dZ972|kUcACmt6y|71xcqzv0`=TRyk<%{3 zOG&Iuh?iQbySTWT{A8X#pRAhXt__9gb#f4dc&S;?29w#NksgG2DQZ3F4Pi%0EYCO@ zTW8uVPA0@lNlXMi6qY9*gm@{^M0*Vh@lqjPO7>nJk6f*b_K*wlQmf-ESlnrER_TGK zp!KD$a}v=o^nKcgJ8KYgcM#{}@l!KuX9RktFe+~io@Lz9wAw?cA8&E*_eJYfWX&M% zY{!$_9eWIKpm+8Zd=(Gi6Zgl~^S4=ikG;4e^UuVee-`JTi$8Net6zve z|2v%DAAkNJ&L4_D|02%Z42xxb6z5-#KYtwOPsE>p73Y5+fBqECpN>EO8qWVA{`^^- zKNo-gJkI|y{`^}w|91TO3phU*fBs#ZzZif1J)9qkKYtnLuf(6fiu2dv&tH$ve~9xR z#h<@{^B>2b|0~Ylia&oF=Rb`<{~6AI9)JEW&fkka|7Cnev)g*qJ)eC3Lax_KqsMTF zmm|F^zCU(jPlk9o-IFd=PtSbF+WByFNP5>Vj{`YKS_MKoOPUeC;YVRF0_Sl)iYxQ@&nrn5d>llJ$py%IAIF<#kz8mT&okZa zA^e8smI>Uq)6>m>C7(mNe3$;TAHO>YW}m9ZStSyXffp6qDb(pCOgDo-5e619tZ1V` z6CGl-23LqcgSfU)1>6tCV!;3iOv>wk4s$bs=#EYWyqKi)NTXl96EiCk`ih9N; zIfm-^V0TBzg_LFHp(dh5oefdML~vmN#Z~@?`-2hh?i_dpJ4ak(&uDl7P%e)&9x{tJES?83(?@> zzqWg6Ij;1aZP~qI_d@r^8u_^1{A;)`)~K~N+P%5FW}aX7n|J29zqWg6IcrBkyktI& zZI$toozNVe352$_x1w|)7u!j#aftAf=stZO8$p!c&KF;D@WVoZc)tD_de6O2^UJu-m_*UW}@pO+;E7yyst;fRBqoTdo zyaQ_ac_mF#IZyu>VvWv+-iO*`9jl{NJ?G(}O96CT$a+tN_9Obi~SqICv9X7I_=lvT17vw0vpATmoQvTEMT;BGN;@M}#A zfd1PO8x%!)Bt{y8ViaBR**CrP^weHzj*I6m`~FMAGhZY?6usteFS<5wf35`l+pTzx zSw;UE4cbxkn~(nP*V1QcbNu^JNq!-1{oUBS*u^`t{uH6wH{sWL*1v(pQks82`HL$? z-t}(>UUycG^>=;qVi)hQ{TJceQvrF)--Tya=O~{#h^&LkOE$f%Z<6!WP>Mc+Khqyk%i}*AuU{M`_Dj;iES-J~!S5A5`5zxR_Xm%Be}P_Fm*D&A z80_n~w0PLpmplJv9Q!DzX~#O@=;q*YTvnb*(j!|#SX6g7taOOY^o?4kp$4|o`fx6t z1lD68&P!VY6}!0hm>?ay6V8=0m}}a%d;m_1w$Hn?Y^uvzHU|nafp#56>m;Jg*Dh)W z^@z2@|9+F=Z1#A2xDz%e8+W_MTj7Pu9hmtUs0BHQKII6%QuVFYhWJK$d0Ea$wHtj_ zIG)-Mvs&-l?!gV0L-70iBt4a@^I4VksC)V=|6HQqLH?)lusW9Cs!01rp4Bt%fG&%! z(k)9{J&XHWt^~@P*JsJ4+cu7L56#F=V~cwWc9tJI2LodJ+;AUQ>Z0~24xgh%de#X} zty{f;Y+spf%7*8dOT0xrTDr+oAZQB8#ajnW0VVU!W_!uzb!_>#vn!Kb zlTNHZcKO}IspOYe?Dnk$ewFPFngZIv#9Ok_m&w*5>Anh@f;?KcpefLtT=!`TXysjL z$A1SYEYs$f;rDMY`HnK>SNYo_x$?5Pr=ThF>F9%|$W90&Yi!UImCx>_SDodcDcUru zqpH>%`O^_<-Q;-5Gj&uIb3!g{JG-kRb-mc=>1OMRntMh_4v4BEROEeb^wcNLexHh- zVph%2tK#)UPS+l#=Gr`eubL<+>0jzUpMXB5myC%%I)w;{!|-`qjlSO*?Z$nio>IxF z*5iL4fXS))agE0rfL(aQ5S|`YSNL=vo>+_j*TtXYY4re$w2rgzS+CuU(3nNZ=2%#u zm#^qO-FjA!gRSd3yMM0%8?*Av|J}fht*}OL-x_+!z6idM^nN%Ir)Z;H;td$Pl{J5d z;3Y^~DyXO8C*B@r)klHcUXWBb^R$kBO zbt|8T<^Cm)H{#hStMOjMh0_Oc9u$Ih+`UNiNXnpB9SH1;UYniFreN1&x%yak+FlX# z`8p47D>-w!$JXOYT%Gd#TW)kRq}wli8{eE+T{m*O3T+weAc zSTMt8RUR+)J6+GKGY-99d0uh<;?TQx_MrUUSIv9Zcwk9CcY_DkwZH|@7S`i|<@Q+X zURdv1kyuL)tQmON(EEz{jCDS=Y|Yu*R%CD4xRy^da@UgYC-F4#X9^(YGHZw}BTE(m|GklDYJ!epX>;(hYUS~ha(E?^sY6!F#xa(9rs8+YKdv5OI=Mg|RXcaXb_?NcSZVs?%P+bsX8qU!zDda*k_GzKu{t$AqV@1@qgGG4c0Fw*VKQQ)E8 z9dHWNK=Pfe)ZW+(syMB@*k-NXcsNR z1HImsk`$sn@eU)`4?XhsV-1*Ug11A9ZK`KBCFLP%LrO2~DKw^GG#0Zgpp=WOwe+v=nI1<1v0|G|I;8PI5p+ zbR6B31*BiiGG?V42mdjJe01E+ygKbfkQlQyLGHQ~Bt~*`qCpE1WAV5S;o~|`uK( zkQhf{WgLfAjNFs$osiF}t9kV_@9w2QdzPcbD0vQUy!=y_gS;;uS6~6%GCVf&T3qR7 ztN3VikHW|!(AMh6WWB$k{yqdP=@H;<<2Ao^`wgKtAg>!M^~=BhL6xszY2*<&4Wl!K z@n+g2>)EwSszQf4u$~d;7|0{ms~G z<~Gc-S!EN`truOu?2;dU@$Ps1t9sSGRA%?95wwljEe^w;#*CMHU>Ek~eA@(Cunw}p zHHe-XM&>u4_pUa%KEGXw7M5H!7qm92db`tcyH9aeji7~A@@(dv_U zdKfwL`tg4QV%#>A?8&8~lUh!3;kI_*P}gFrn`dc6&Flk;TeQ6*G)@j8x^goxa|AYv zVa#*iO!i&#&+hK^)_40%^HE1ZAXam8INf?>5Iwb;7L zc=C1V%|4vjr@lGqyXK##-Am(|aWLdo=>0{%+9c011U`jp1GU5DWB=~x8ce($zCzo; zG4Dj{?OqWY6`~mP%@~oImJ^p)Jj3zIlX@=2Oi#+6&FD`v2@0=J2YG^(Ky^bLsBLKx zs>|7yjY%=8DE@IdOKul(+rfvAGgQy^67SOb}v10+ny%r`sh*i zukBvytV~NQcG4r3^86l$qho!!!gRvJCe1?JN&Q}yk1qSGyLoxG(8uEw8+ed!6VTLiT)>ll0lwH<0CI)G2itD$`fT{+qB|GHb{ zsG3##<{rkc`CG<}`>zkEv*&N(Ermd5?%Ik&y z$y!)+`T_J3J)v4Th1U1N#?vSpvmZMp8?$UFf2HcK*nUlwgGHEgH0i?@EW*WNc3k@2 zoP!M(VY4QRH>FQoWYef_un3!$SrH)U&bh775 z_^vOklFN(dhkH)K9iR_O$u$6yrZO%nrxNOUKiiQmSna@e0b{69R=9n>x46L)r*bW= zoHCk?*r!+$+mtnqH>5d=&VYfLQ?;jhg)T$#{2YiL88l(Dbj?mhr{GRHgfSSwLe8z2 z#jRyjeO`nAbm|*~tIJ0G4dOn{^@F(HkMDHkSdY(x>eu&TT>JXh4Xhu`j}wciu=wE= zaDtdHjCSxmP|DG!5hrYRJg-8}r~D)vdIY^ZgTRlXBTKf?Fo+DSAVY0JaWn?#?|X2a zp*XrMS8Z0u_>~#ENsQfqa$y|8j9!mFVve{!rGJvA(ii9L0Y5?N-l@!~Mu zICHBTDLodACAtCtXPQnm%95Ab82ui`s5(cstTD>RST&BBJxgsD$8@?|-AEhZP$;O+ zHQyHIj$*7S!0P|U6jo{n&3dq)%sl;Sz=0fsdvP3~c+KD!s(&Wih6#Ph7?hU>TU=%r zKYXPXTp)RCoU}f_tfU|4Mz9bg0KK%YFR?rXk3ecvf=3{wc^~GbEfs?O?7{B!z-iX% zMycE9fs_4fyO&(4)JU~S7OnBEt!<(ER#%J zGG>vw=S}d`9#aeXG4)>yN>Rj}3C`;2=4fU&!%Fk~_2Y@W_>K9#wATHBf+J8AGkU@P zi!d&pb%IHA39EsO(lZpwy6pHGEX8EVr9#VGw;57k?g=|x)C z=WLnXG%&3j8d*!btCzAoIFYi{8F@kvZXKF|b=Y&Fby?sTWP$2T&sn+wKap~$chXSf z`;G3+YIJd0^Ohu>)Gr+Y(X4CS%8c247_;h9D`bsX%sB0U?R#GFP|R0AZct}_pjEjK ze_6+6(W)M?)bpJ6Jnv5fo)w!G(#v0)`8t#zU4p0Ry_>gu$_W?eD1Uu{_Fq|`{JZe% zeE=S5?eB-`HS1ve`P3DFyzQs$ocn_C@Nwl=-~Y~?Tt)dl9+5{XQ$NPPz)8#c{=Q>p t-7Z+Ddo54SByxy^&490ceBj(4Jo5d8*vb}>hkLH)IxeXr`Ftza|3A}6@E`yH diff --git a/OpenSim/Region/Communications/Local/CommunicationsLocal.cs b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs new file mode 100644 index 0000000000..c98cd111cc --- /dev/null +++ b/OpenSim/Region/Communications/Local/CommunicationsLocal.cs @@ -0,0 +1,61 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Framework; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Types; +using OpenSim.Framework.Communications; + + +namespace OpenSim.Region.Communications.Local +{ + public class CommunicationsLocal : CommunicationsManager + { + public LocalBackEndServices SandBoxServices = new LocalBackEndServices(); + public LocalUserServices UserServices; + + public CommunicationsLocal(NetworkServersInfo serversInfo) + : base(serversInfo) + { + UserServices = new LocalUserServices(this , serversInfo.DefaultHomeLocX, serversInfo.DefaultHomeLocY); + UserServices.AddPlugin("OpenGrid.Framework.Data.DB4o.dll"); + UserServer = UserServices; + GridServer = SandBoxServices; + InterRegion = SandBoxServices; + } + + internal void InformRegionOfLogin(ulong regionHandle, Login login) + { + this.SandBoxServices.AddNewSession(regionHandle, login); + } + } +} diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs new file mode 100644 index 0000000000..ae47890744 --- /dev/null +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -0,0 +1,209 @@ +/* +* Copyright (c) Contributors, http://www.openmetaverse.org/ +* See CONTRIBUTORS.TXT for a full list of copyright holders. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the OpenSim Project nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using libsecondlife; +using OpenSim.Framework.Types; +using OpenSim.Framework; +using OpenSim.Framework.Communications; + +namespace OpenSim.Region.Communications.Local +{ + + public class LocalBackEndServices : IGridServices, IInterRegionCommunications + { + protected Dictionary regions = new Dictionary(); + protected Dictionary regionHosts = new Dictionary(); + + public LocalBackEndServices() + { + + } + + /// + /// Register a region method with the BackEnd Services. + /// + /// + /// + public RegionCommsListener RegisterRegion(RegionInfo regionInfo, GridInfo gridInfo) + { + //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); + if (!this.regions.ContainsKey((uint)regionInfo.RegionHandle)) + { + //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); + this.regions.Add(regionInfo.RegionHandle, regionInfo); + RegionCommsListener regionHost = new RegionCommsListener(); + this.regionHosts.Add(regionInfo.RegionHandle, regionHost); + + return regionHost; + } + + //already in our list of regions so for now lets return null + return null; + } + + /// + /// + /// + /// + public List RequestNeighbours(RegionInfo regionInfo) + { + // Console.WriteLine("Finding Neighbours to " + regionInfo.RegionHandle); + List neighbours = new List(); + + foreach (RegionInfo reg in this.regions.Values) + { + // Console.WriteLine("CommsManager- RequestNeighbours() checking region " + reg.RegionLocX + " , "+ reg.RegionLocY); + if (reg.RegionHandle != regionInfo.RegionHandle) + { + //Console.WriteLine("CommsManager- RequestNeighbours() - found a different region in list, checking location"); + if ((reg.RegionLocX > (regionInfo.RegionLocX - 2)) && (reg.RegionLocX < (regionInfo.RegionLocX + 2))) + { + if ((reg.RegionLocY > (regionInfo.RegionLocY - 2)) && (reg.RegionLocY < (regionInfo.RegionLocY + 2))) + { + neighbours.Add(reg); + } + } + } + } + return neighbours; + } + + /// + /// + /// + /// + /// + public RegionInfo RequestNeighbourInfo(ulong regionHandle) + { + if (this.regions.ContainsKey(regionHandle)) + { + return this.regions[regionHandle]; + } + return null; + } + + /// + /// + /// + /// + /// + /// + /// + /// + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + List mapBlocks = new List(); + foreach(RegionInfo regInfo in this.regions.Values) + { + if (((regInfo.RegionLocX >= minX) && (regInfo.RegionLocX <= maxX)) && ((regInfo.RegionLocY >= minY) && (regInfo.RegionLocY <= maxY))) + { + MapBlockData map = new MapBlockData(); + map.Name = regInfo.RegionName; + map.X = (ushort)regInfo.RegionLocX; + map.Y = (ushort)regInfo.RegionLocY; + map.WaterHeight =(byte) regInfo.estateSettings.waterHeight; + map.MapImageId = regInfo.estateSettings.terrainImageID; //new LLUUID("00000000-0000-0000-9999-000000000007"); + map.Agents = 1; + map.RegionFlags = 72458694; + map.Access = 13; + mapBlocks.Add(map); + } + } + return mapBlocks; + } + + /// + /// + /// + /// + /// + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) //should change from agentCircuitData + { + //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); + if (this.regionHosts.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect child agent"); + this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + return false; + } + + /// + /// + /// + /// + /// + /// + /// + public bool ExpectAvatarCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position) + { + if (this.regionHosts.ContainsKey(regionHandle)) + { + // Console.WriteLine("CommsManager- Informing a region to expect avatar crossing"); + this.regionHosts[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + return false; + } + + /// + /// Is a Sandbox mode method, used by the local Login server to inform a region of a connection user/session + /// + /// + /// + /// + public bool AddNewSession(ulong regionHandle, Login loginData) + { + //Console.WriteLine(" comms manager been told to expect new user"); + AgentCircuitData agent = new AgentCircuitData(); + agent.AgentID = loginData.Agent; + agent.firstname = loginData.First; + agent.lastname = loginData.Last; + agent.SessionID = loginData.Session; + agent.SecureSessionID = loginData.SecureSession; + agent.circuitcode = loginData.CircuitCode; + agent.BaseFolder = loginData.BaseFolder; + agent.InventoryFolder = loginData.InventoryFolder; + agent.startpos = new LLVector3(128, 128, 70); + agent.CapsPath = loginData.CapsPath; + + if (this.regionHosts.ContainsKey(regionHandle)) + { + this.regionHosts[regionHandle].TriggerExpectUser(regionHandle, agent); + return true; + } + + // region not found + return false; + } + } +} + diff --git a/OpenSim/Region/Communications/Local/LocalUserServices.cs b/OpenSim/Region/Communications/Local/LocalUserServices.cs new file mode 100644 index 0000000000..1eb574c053 --- /dev/null +++ b/OpenSim/Region/Communications/Local/LocalUserServices.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +using OpenSim.Framework.Communications; +//using OpenSim.Framework.User; +using OpenSim.Framework.UserManagement; +using OpenSim.Framework.Data; +using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; + +using libsecondlife; + +namespace OpenSim.Region.Communications.Local +{ + public class LocalUserServices : UserManagerBase, IUserServices + { + private CommunicationsLocal m_Parent; + + private uint defaultHomeX ; + private uint defaultHomeY; + public LocalUserServices(CommunicationsLocal parent, uint defHomeX, uint defHomeY) + { + m_Parent = parent; + defaultHomeX = defHomeX; + defaultHomeY = defHomeY; + } + + public UserProfileData GetUserProfile(string firstName, string lastName) + { + return GetUserProfile(firstName + " " + lastName); + } + + public UserProfileData GetUserProfile(string name) + { + return this.getUserProfile(name); + } + public UserProfileData GetUserProfile(LLUUID avatarID) + { + return this.getUserProfile(avatarID); + } + + /// + /// + /// + /// + public override string GetMessage() + { + return "Welcome to OpenSim"; + } + + public override UserProfileData GetTheUser(string firstname, string lastname) + { + UserProfileData profile = getUserProfile(firstname, lastname); + if (profile != null) + { + + return profile; + } + + //no current user account so make one + Console.WriteLine("No User account found so creating a new one "); + this.AddUserProfile(firstname, lastname, "test", defaultHomeX, defaultHomeY); + + profile = getUserProfile(firstname, lastname); + + return profile; + } + + public override bool AuthenticateUser(ref UserProfileData profile, string password) + { + //for now we will accept any password in sandbox mode + Console.WriteLine("authorising user"); + return true; + } + + public override void CustomiseResponse(ref LoginResponse response, ref UserProfileData theUser) + { + ulong currentRegion = theUser.currentAgent.currentHandle; + RegionInfo reg = m_Parent.GridServer.RequestNeighbourInfo(currentRegion); + + + if (reg != null) + { + response.Home = "{'region_handle':[r" + (reg.RegionLocX * 256).ToString() + ",r" + (reg.RegionLocY * 256).ToString() + "], " + + "'position':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "], " + + "'look_at':[r" + theUser.homeLocation.X.ToString() + ",r" + theUser.homeLocation.Y.ToString() + ",r" + theUser.homeLocation.Z.ToString() + "]}"; + string capsPath = Util.GetRandomCapsPath(); + response.SimAddress = reg.CommsIPListenAddr; + response.SimPort = (Int32)reg.CommsIPListenPort; + response.RegionX = reg.RegionLocX ; + response.RegionY = reg.RegionLocY ; + response.SeedCapability = "http://" + reg.CommsIPListenAddr + ":" + "9000" + "/CAPS/" + capsPath + "0000/"; + theUser.currentAgent.currentRegion = reg.SimUUID; + theUser.currentAgent.currentHandle = reg.RegionHandle; + + Login _login = new Login(); + //copy data to login object + _login.First = response.Firstname; + _login.Last = response.Lastname; + _login.Agent = response.AgentID; + _login.Session = response.SessionID; + _login.SecureSession = response.SecureSessionID; + _login.CircuitCode = (uint)response.CircuitCode; + _login.CapsPath = capsPath; + + m_Parent.InformRegionOfLogin(currentRegion, _login); + } + else + { + Console.WriteLine("not found region " + currentRegion); + } + + } + + } +} diff --git a/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj new file mode 100644 index 0000000000..1a20965363 --- /dev/null +++ b/OpenSim/Region/Communications/Local/OpenSim.Region.Communications.Local.csproj @@ -0,0 +1,128 @@ + + + Local + 8.0.50727 + 2.0 + {EB3A1BA8-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + + OpenSim.Region.Communications.Local + JScript + Grid + IE50 + false + Library + + + OpenSim.Region.Communications.Local + + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + + False + 285212672 + False + + + TRACE + + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + + ..\..\..\bin\libsecondlife.dll + False + + + System.dll + False + + + System.Xml.dll + False + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.UserManagement + {586E2916-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + \ No newline at end of file diff --git a/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..1eb7107e10 --- /dev/null +++ b/OpenSim/Region/Communications/Local/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenSim.Region.Communications.Local")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenSim.Region.Communications.Local")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fb173926-bd0a-4cd0-bb45-185b2f72ddfb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Region/Communications/OGS1/GridCommsManager.cs b/OpenSim/Region/Communications/OGS1/GridCommsManager.cs new file mode 100644 index 0000000000..77848fa7d1 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/GridCommsManager.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Framework.Types; +using OpenSim.Framework.Communications; +namespace OpenSim.Region.Communications.OGS1 +{ + public class GridCommsManager : CommunicationsManager + { + private OGS1GridServices gridInterComms = new OGS1GridServices(); + public GridCommsManager(NetworkServersInfo serversInfo) :base(serversInfo) + { + GridServer = gridInterComms; + InterRegion = gridInterComms; + UserServer = new OGSUserServices(); + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs new file mode 100644 index 0000000000..5f0c80cc40 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.Text; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting.Channels.Tcp; + +using OpenSim.Framework.Servers; +using OpenSim.Framework; +using OpenSim.Framework.Types; +using OpenSim.Framework.Communications; + +using Nwc.XmlRpc; +using libsecondlife; + +namespace OpenSim.Region.Communications.OGS1 +{ + public class OGS1GridServices : IGridServices, IInterRegionCommunications + { + public Dictionary listeners = new Dictionary(); + public GridInfo grid; + public BaseHttpServer httpListener; + private bool initialised = false; + + public RegionCommsListener RegisterRegion(RegionInfo regionInfo, GridInfo gridInfo) + { + Hashtable GridParams = new Hashtable(); + + grid = gridInfo; + + // Login / Authentication + GridParams["authkey"] = gridInfo.GridServerSendKey; + GridParams["UUID"] = regionInfo.SimUUID.ToStringHyphenated(); + GridParams["sim_ip"] = regionInfo.CommsExternalAddress; + GridParams["sim_port"] = regionInfo.CommsIPListenPort.ToString(); + + // Package into an XMLRPC Request + ArrayList SendParams = new ArrayList(); + SendParams.Add(GridParams); + + // Send Request + XmlRpcRequest GridReq = new XmlRpcRequest("simulator_login", SendParams); + XmlRpcResponse GridResp = GridReq.Send(gridInfo.GridServerURI, 3000); + Hashtable GridRespData = (Hashtable)GridResp.Value; + Hashtable griddatahash = GridRespData; + + // Process Response + if (GridRespData.ContainsKey("error")) + { + string errorstring = (string)GridRespData["error"]; + OpenSim.Framework.Console.MainLog.Instance.Error("Unable to connect to grid: " + errorstring); + return null; + } + + if (!this.listeners.ContainsKey(regionInfo.RegionHandle)) + { + // initialised = true; + httpListener = new BaseHttpServer(regionInfo.CommsIPListenPort); + httpListener.AddXmlRPCHandler("expect_user", this.ExpectUser); + httpListener.Start(); + } + + // Initialise the background listeners + listeners[regionInfo.RegionHandle] = new RegionCommsListener(); + + return listeners[regionInfo.RegionHandle]; + } + + public List RequestNeighbours(RegionInfo regionInfo) + { + Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1); + + List neighbours = new List(); + + foreach (Hashtable n in (Hashtable)respData.Values) + { + RegionInfo neighbour = new RegionInfo(); + + //OGS1 + neighbour.RegionHandle = (ulong)n["regionhandle"]; + neighbour.RegionLocX = (uint)n["x"]; + neighbour.RegionLocY = (uint)n["y"]; + neighbour.RegionName = (string)n["name"]; + + //OGS1+ + neighbour.CommsIPListenAddr = (string)n["sim_ip"]; + neighbour.CommsIPListenPort = (int)n["sim_port"]; + neighbour.CommsExternalAddress = (string)n["sim_uri"]; + neighbour.SimUUID = (string)n["uuid"]; + + neighbours.Add(neighbour); + } + + return neighbours; + } + + public RegionInfo RequestNeighbourInfo(ulong regionHandle) + { + OpenSim.Framework.Console.MainLog.Instance.Warn("Unimplemented - RequestNeighbourInfo()"); + return null; + } + + public List RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY) + { + Hashtable respData = MapBlockQuery(minX, minY, maxX, maxY); + + List neighbours = new List(); + + foreach (Hashtable n in (Hashtable)respData.Values) + { + MapBlockData neighbour = new MapBlockData(); + + neighbour.X = (ushort)n["x"]; + neighbour.Y = (ushort)n["y"]; + + neighbour.Name = (string)n["name"]; + neighbour.Access = (byte)n["access"]; + neighbour.RegionFlags = (uint)n["region-flags"]; + neighbour.WaterHeight = (byte)n["water-height"]; + neighbour.MapImageId = (string)n["map-image-id"]; + + neighbours.Add(neighbour); + } + + return neighbours; + } + + /// + /// Performs a XML-RPC query against the grid server returning mapblock information in the specified coordinates + /// + /// REDUNDANT - OGS1 is to be phased out in favour of OGS2 + /// Minimum X value + /// Minimum Y value + /// Maximum X value + /// Maximum Y value + /// Hashtable of hashtables containing map data elements + private Hashtable MapBlockQuery(int minX, int minY, int maxX, int maxY) + { + Hashtable param = new Hashtable(); + param["xmin"] = minX; + param["ymin"] = minY; + param["xmax"] = maxX; + param["ymax"] = maxY; + IList parameters = new ArrayList(); + parameters.Add(param); + XmlRpcRequest req = new XmlRpcRequest("map_block", parameters); + XmlRpcResponse resp = req.Send(grid.GridServerURI, 3000); + Hashtable respData = (Hashtable)resp.Value; + return respData; + } + + // Grid Request Processing + public XmlRpcResponse ExpectUser(XmlRpcRequest request) + { + Hashtable requestData = (Hashtable)request.Params[0]; + AgentCircuitData agentData = new AgentCircuitData(); + agentData.SessionID = new LLUUID((string)requestData["session_id"]); + agentData.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]); + agentData.firstname = (string)requestData["firstname"]; + agentData.lastname = (string)requestData["lastname"]; + agentData.AgentID = new LLUUID((string)requestData["agent_id"]); + agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); + if (requestData.ContainsKey("child_agent") && requestData["child_agent"].Equals("1")) + { + agentData.child = true; + } + else + { + agentData.startpos = new LLVector3(Convert.ToUInt32(requestData["startpos_x"]), Convert.ToUInt32(requestData["startpos_y"]), Convert.ToUInt32(requestData["startpos_z"])); + agentData.child = false; + + } + + if (listeners.ContainsKey((ulong)requestData["regionhandle"])) + { + this.listeners[(ulong)requestData["regionhandle"]].TriggerExpectUser((ulong)requestData["regionhandle"], agentData); + } + else + { + OpenSim.Framework.Console.MainLog.Instance.Error("ExpectUser() - Unknown region " + ((ulong)requestData["regionhandle"]).ToString()); + } + + return new XmlRpcResponse(); + } + + #region InterRegion Comms + private void StartRemoting() + { + TcpChannel ch = new TcpChannel(8895); + ChannelServices.RegisterChannel(ch); + + WellKnownServiceTypeEntry wellType = new WellKnownServiceTypeEntry( Type.GetType("OGS1InterRegionRemoting"), "InterRegions", WellKnownObjectMode.Singleton); + RemotingConfiguration.RegisterWellKnownServiceType(wellType); + InterRegionSingleton.Instance.OnArrival += this.IncomingArrival; + InterRegionSingleton.Instance.OnChildAgent += this.IncomingChildAgent; + } + + #region Methods called by regions in this instance + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + //TODO need to see if we know about where this region is and use .net remoting + // to inform it. + return false; + } + + public bool ExpectAvatarCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + //TODO need to see if we know about where this region is and use .net remoting + // to inform it. + return false; + } + #endregion + + #region Methods triggered by calls from external instances + public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectUser(regionHandle, agentData); + return true; + } + return false; + } + + public bool IncomingArrival(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position) + { + if (this.listeners.ContainsKey(regionHandle)) + { + this.listeners[regionHandle].TriggerExpectAvatarCrossing(regionHandle, agentID, position); + return true; + } + return false; + } + #endregion + #endregion + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGSInterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGSInterSimComms.cs new file mode 100644 index 0000000000..51b33e9d8a --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGSInterSimComms.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Framework.Types; +using OpenSim.Framework.Communications; +namespace OpenSim.Region.Communications.OGS1 +{ + public delegate bool InformRegionChild(ulong regionHandle, AgentCircuitData agentData); + public delegate bool ExpectArrival(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position); + + public sealed class InterRegionSingleton + { + static readonly InterRegionSingleton instance = new InterRegionSingleton(); + + public event InformRegionChild OnChildAgent; + public event ExpectArrival OnArrival; + + static InterRegionSingleton() + { + } + + InterRegionSingleton() + { + } + + public static InterRegionSingleton Instance + { + get + { + return instance; + } + } + + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + if (OnChildAgent != null) + { + return OnChildAgent(regionHandle, agentData); + } + return false; + } + + public bool ExpectAvatarCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position) + { + if (OnArrival != null) + { + return OnArrival(regionHandle, agentID, position); + } + return false; + } + } + + public class OGS1InterRegionRemoting : MarshalByRefObject + { + + public OGS1InterRegionRemoting() + { + } + + public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) + { + return InterRegionSingleton.Instance.InformRegionOfChildAgent(regionHandle, agentData); + } + + public bool ExpectAvatarCrossing(ulong regionHandle, libsecondlife.LLUUID agentID, libsecondlife.LLVector3 position) + { + return InterRegionSingleton.Instance.ExpectAvatarCrossing(regionHandle, agentID, position); + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OGSUserServices.cs b/OpenSim/Region/Communications/OGS1/OGSUserServices.cs new file mode 100644 index 0000000000..012774d240 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OGSUserServices.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Data; +using libsecondlife; + +namespace OpenSim.Region.Communications.OGS1 +{ + public class OGSUserServices :IUserServices + { + public UserProfileData GetUserProfile(string firstName, string lastName) + { + return null; + } + public UserProfileData GetUserProfile(string name) + { + return null; + } + public UserProfileData GetUserProfile(LLUUID avatarID) + { + return null; + } + } +} diff --git a/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj new file mode 100644 index 0000000000..4bda6c950a --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/OpenSim.Region.Communications.OGS1.csproj @@ -0,0 +1,149 @@ + + + Local + 8.0.50727 + 2.0 + {6109024D-0000-0000-0000-000000000000} + Debug + AnyCPU + + + + + OpenSim.Region.Communications.OGS1 + JScript + Grid + IE50 + false + Library + + + OpenSim.Region.Communications.OGS1 + + + + + + + False + 285212672 + False + + + TRACE;DEBUG + + + True + 4096 + False + ..\..\..\bin\ + False + False + False + 4 + + + + + False + 285212672 + False + + + TRACE + + + False + 4096 + True + ..\..\..\..\bin\ + False + False + False + 4 + + + + + + False + ..\..\..\..\bin\libsecondlife.dll + + + System.dll + False + + + System.Data.dll + False + + + System.Runtime.Remoting.dll + False + + + System.Xml.dll + False + + + False + ..\..\..\..\bin\XMLRPC.dll + + + + + OpenSim.Framework + {8ACA2445-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Communications + {CB52B7E7-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Console + {A7CD0630-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Data + {36B72A9B-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + OpenSim.Framework.Servers + {2CC71860-0000-0000-0000-000000000000} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + False + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + \ No newline at end of file diff --git a/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..0c6f9658a1 --- /dev/null +++ b/OpenSim/Region/Communications/OGS1/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OpenGrid.Framework.Communications.OGS1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OpenGrid.Framework.Communications.OGS1")] +[assembly: AssemblyCopyright("Copyright © 2007")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a8b2b39b-c83b-41e2-b0b5-7ccfc1fddae7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]