Newer
Older
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
zkSBf39KW~u#39sEA4j9|;Z-~l)u7uC;AgHWf-t)jkA$!I46H89R@!Qw>~*}*0RjW^
z=|At5074pTcAZWfDG6xDlIXe!yHM=SL?ZzFT@r-xxuuMQRz1)!0-C34oQNw>qvB!$
zldA*^UC=Oe_xQQJF(l&o+zyiK?ueyWWOz0fi}Sk96aqL`udU)c<|$%oUSanQzi@{?
z#v1Sjb7_!)JaczX3*(Q12pS&0HLrxjqfjjb>g!|DzGM&tG*XQNTfl~`lg?m(aupqJ
z8Zw}n0c|!K_Iroi^?3vW^okNT671HBK!V$~qf^hj#5kq~aX=fb(Z9|j8kjA%#03^H
zKCFXw0q(}P3Ez31oS=e{AeUY#-O<%%3lGuldfBtmSOfqp_Udb5?(Ar17+_DOBVZ=C
ziuR)jg#3`B?ry4_GRLCNr}&sHS3*P<aN%cK^>9@9fu7|ZgFWlHqxt~oKLp*HNiKOy
zpecX0D~+aHVo>rD2MmMrK5Y6Cpw&h0lfA|Kz?P&GH=sckG80$?crCigT9)q%zd{+e
zbv)L#xhi?+ZOa_${#zCe&>{`UZ4X0?HJac%tCw%#0h+aN4GfS}V4F(1*Aaix<$D@0
z+}(Rn70b2^N<P>#i=YSHR=WU4=w&r<4b0M4Xh&v+8!-rO>IMXs^dM@>2|h~MUF&#~
z{8T8H_5SM*Z+U_CPGYp=iW8drqEw9lH2mgO1S9doL2uI<Ut$sUQ3+Bpe3&O-bOte6
zg(TEx8#n+$%s^f|c+8`q4tT6K;5YK8GeN)*EsAA|jT?cA5M@Pzz7vc@jA%3WMxd6a
zM9(`iS%U(xQ&jUN{hHc${vs3M%w_^`C&oHXkZfjfpn@+tlX@&(220i<GX&Bpe*XZG
z#{dL>LoIXoWb=j?Z&OclDQDuk5e~&jZ$L~l+1~&hE#in4&FPW02A;)k#GM*swfMvR
zlf&oiv97S79}^3Inh}2+GH;fJ1MfgvHj7{X0C>0R#0?E9Qur=?rZ5Jc4+s3P06>N{
z9AQJ517;-_4vP?p;xlM=D>^fahyyp*2GqY~Pa&#fyfunOwsgWz)d0hxrKH&RBl-X@
zuBqs~GwJ}uBIs)Y5%VD;I$F^f{Gk&t{XnwZ0*36hALX-2mBGkM7!=?X9<E5pAS)aZ
z1TguJs-_rgcDt(W_)I6q`T?lV<TI){52pFNqWWh(T#y!T;m2HhGG~Yc>O*x)^g>`Z
zQKM~xDp>;pTZA*Y0E@QkZ}`Q^&o1|=(`_f)l|}(vqHId*dE0~rfHyXIelpbQM&Iq*
z$v*FAEdZ!`kf>`XV<w<5;M!^E-mamH+MWwLb4F6~b8IYa5s%75SlYha*=+%qbyaQ_
z3d=z#iJ7p5+fX)VeZnELHdby1dEH_F5OoJ?HF)I=A{7wRK=76vsH?&t)fv(y2}6uP
zKm~0HsEMaI%ESbDIC^#~LbXE?_^=nbCEiaenP7O+P|jQz<38ci(*+D|;xBETn`AK7
zF>M+&2DU9AKs~cM(#?tag4{wsw>c@VGpr!^6aCnDuIPPhdV|6L0Q2t#Fs=Up_x-S@
z@K@D;{A7+~sc9(@OKr`%t%88)2A-ry$2JlI1NA|=Cin!P=-_Q~r|;5<l>kX0_4;NF
zny?>XuxCx%2$fA<L(DOHd6JKT+=Gdph-r*%h%DN?s81nuR(e7gHWvT`PpYpevjfdh
z9m!WW_88R@0o~mJ@JXXjFoN<1uYQvLDXJNz<{?=t^M~Vn&12aKYl|TK3o$WVfqz%5
zq)lxfFoXyEfY;n(J-`UHA<BAF56{d3Akt_qDCilcff2hSGy<|So3J~j0+Vb+3LEdt
z*qm`fEafEs0J>nOXMv>poonj3rdR+gudC)rxMYH7w}gP!*<hx_wKz$b`)zh#@{IsC
zn_XAIzR_9_Mb!SWrOUrfg>SM5S4y%O5jV&ywTQsjO)|#4$BmY)7P2O2@YfI!MXcGp
zZnwr((>)53q;DL(k;+BJF3k<(KG%^dfJc&ZcK3be+`+)(&FlT;kU07v!Fx}(NFD=j
z3vxOhlIpjs@61yq&@IT2(*4Kg4Wt-IwaT_dlJgPLMg*4pL#G*{nv!8MJ_?I;P}b}w
z5X&ylCiQ10RuD@)G>mlXSZk>OaUtl8+q#zrIv^s)O#c8~wakyR3#e1-pmc_DEr1P;
zN)a_qrAi|PuW|l^Uv9SKR~Q}wRT%1t&X9})W~!&^&g$U|5C-DC3j!=9uKQR5KU^rK
zPLa6CAcv<=8k+WNH=$<`VDA{k=;+}wroochHz6azvjRmOff}*vhI~ww6aw6ye6^+c
z%_bj%eb%a4+NqK71Ux&3G}aN{l|29*+lt*rjmB=n5%s~M#+*+kbS4PxsRo&!511hG
zWsrx$8#gCXrks)wO8#A}`r$AA&;tFg{$+72*fjAu#_Q$)0_<}C0M12$1ZKLyIU>%k
z<B>4dJUTYNYpag304~GFdMFGk0yg0Utx^J=$bYPn_$Y{rw43sq#s&?7ukjUV&(#T_
z05^L~+)NSyiD$?e5w#>NCbLc^eL;<|o)2g4955gePWO@NVujv7CHOu{bk0bd0p6>D
z?Sl%#0O7dRAfP~5f}g;L;Wv5A-s@~~6Ko`d4r*jxB?alg*nkCJai{bzoo@&G&F^>v
zhm@bf{{UhA<*pJOkb_KGX>eJ^cNbv?P0)w#Xffym<BO&D{NvI80D3__i}rfBlojxJ
zYySW)175&iUW1I6M0=VklL%y&TQ?&-ui_<1L|hIp-58gchk=867SuhQcMO4wY3#Y|
zPAu0Kkla!PTZE1SVoM_DWhg-#bQY-#1VgSA&}`Ox3`+PwLfb;+UC0*{H=w}EBAYGk
zOS0mZPy*4TJqMI~Q4&XPT>*PDbny)54uHh0)~DGqYnYP19NN)m=2!>-^or#)m*LCf
zgbD_URGKtx{*q`KG{TOIA0?9fq@c24nIali5qO$<{U)S5HlKCdq17YE{{Tc89J&B8
zSLe}I5lt|}mg~apMcfFi3N5{5+r02uoGSLXdhIjXLJ$OjSON+R+PNylo?NLx&EE;e
z8oUGvOn|1a3%%D8VVG6V2rQT9F*w+R(G>QKKsSlN#sd}Mwqk!fyXA%*Q8tSf!SP^I
z_!s5>0O!WAQJ&Cf!g>Sb){s?&nUE1;4k$OcyIeGY05Ny=;&M0(QHZdWN23PT+ZF`i
z>!)|BOz4N4Ff?;}P<I_NjSvQyC|nmkXvA~CCT@`e6-A?PIqjjs2K(J>_`_&M!hu+>
z<wsREV;)V|CrK8nfq$a~YXhdnnDPDIEN`$P*u1(A@A+H^XliP>GSrmaaxMP=fQvdm
zo-fU7oq)Rt?^xLnx{4CO(Ki8*<6NY%8(}PyTOfu@(lpi}5_O8Z^VQG-vXihAKuh|S
z&8Ke+1^y|3*r^@3f}!V}%do60%kdC_sB(lNdgo1)g$R3&XmQeHw7@h()An1Z&nu90
zH>Q;m$QBY{s!;&TsSc69&LCi+Bv$d2_eNHgbc1?UqcqK3Ko^k+flSJBG~Gv-{kC9n
zT?ea_`%piVOZ=1ly#Bdl4!&`s1m<7+5^OV25qNQ(Z=3-q-JauFpj*rpPWirRtH_Ui
zQgf($j70s64Mm3rou+9|Kr-h|*-EHva!{~?uqR_0oonXSA~Xl|fmXNY?Iz5zTcToU
zJXsEFu=Yl|Xv!rurfOa*Kq5_h;@<;LGNZ@_QQE&v_UMXp`+#dw7Pot@F7gnjOrzIg
z1rbVPTId0`O!dwl6C`<&7b)?Kz6+mRiY3V8X}4nglg@+^hv|R1%S;vVFp*5)f^C3l
z3_P*e4EX-|25<mnJ<^~KbvuEVLWu8DmZ}#Sjl^NFc+-lh-t#6HoW=p0Po7T*02aYS
zrPH1m<^Yh1R4HP1iiRQVY#BAM@>`=uRI~uQZzS;D)H$qW9zsLbnxPRy*U;s3fM3!*
z+~D=jf9X?~u8<y@U5GdVg!t_#8xWftaT;=pdy=Y(4A)Z@4NDXa6L3#qWX%BM1Z{AR
zutAnriu)-jb_(90uei%$Kn*zRQE+D59pW<pRdXe`6!RwHFne-yt4H(m7f~2XT4gxt
zv1w`8;TkjoX%-IKa=e8Dja#<d(mBLI3L2l5M3lECdhb9cqHj(v&6>#!<wx+3uDEX;
z`G|C-*eGuwnEs+Zv%f#a0Rq4oqHECOnqr`X4XxSJNj5EV#jzL^HUu9*o#BcNnmKxV
z0zji3#C<Xf%{~`E&WDu&!V9KFaYniP@hA}3a3t;3V@*|`&k!(|43oT#k;A#53A_7e
zFXj_vz=B0J=(1Z}f&%as0wIUP^T~dI8)|T~WBYX1<KTp#9&|(Z+^H4;L=uKH@tV%C
zNC`&EwyR$H<3IwN-oP=)+AC$C3y9Z94~raEV4+*TL@d0cre>jt2BLqMUH$yT3W5*p
zBt7nJVnB3v$iTB@IfM6?QU(jH>9or)!XE<Z;q;nX25<l;nu##k(DB3HQ5q2sWg3M`
zsEHBs;<P{tu2&rY05BzaZo6v&cOHe1>1b|X2U!nMhBJeOXB0x34?X6jSrW*S3R^@t
zn9I09Rw@hIjOz8+XBtVw7BFmYQ!nL#R}s;LWRYs4dC3u#yP7cU=CWgrBc=zw^SR;P
z5DL>37j@BGkW2ssxAM<N2Ir@E9V#b)_p$Sm=(Zho?gBeV*_D`-Ss)^$DA}{PNvHsU
zG>~igNB050<^oqFHaMM_Hm|Y-xKDsm9iVfm3^BdY^Io3xwvhW;0;6G8BA8z>jG(~R
zx$~lygc}Q?xCz8ipd*C`$e?Ja%S6&6#K9a+COX#I>ROo$z|l@j+u!x{E1jJH7P%Jn
zT6Xe+*$O6hJ|&MocI3Sf54=K!f=wTn0+bdts5J`<&Lnq$m1DtR1e89@mK>lVPVIji
z=+=s>0a{ta>0b$4M5ZvZ14uX<6~hei;t;gOLFjM9OP7d0eCj;_b6VeAzy*sFiSlm)
zx#3L#yG2FO?brRuU;=tdZj5n}rKel(6ig@&wqNxD3ovY2av}~G?}Qx=kB3wV)qqJ4
zNY$5&b@fp613}1;@ZHS5q~J_w6O0KZH>ai`5Bv^8U~b$d<k%_tr%GB)dWpFJ0#5}h
zDzJ=bZUm5JYdC4OA5Gn9F#{1~SC5IU;>YC;TJW{H`t%Q*Ur<7BZGj~D7HX8=TmAO`
z0C_w(!@?fg1S3D*$c)GqoPVR{3qlaqHMAK}9IsBp@VwOK0LExVM!&q2WB^Zvw*|#4
zIj-O=uj?A3l;Zq!l4Rhvs_ZzS{=gOY3<$Xx+eR=k<o<)Hy!E;ZB9>Y&%MM~wJup|)
z{9{piXR#zg8}t0_yf8=8McuxFJfyVxVHi;iAn|Yg#~Ol85Kj9GcAIdR)cpX^qqLv{
zvJYIlE?%Et(rbt@Cf7Je4&#<-yOrvnEkuEPoEKp|b4jQ{jXE{zx)10@0VWQ(j+N9|
z*9eh>IxX)@DZbNeVt@@*hq+*%<S<7dhJ>I<pB;?>w@Zi_Xr{)sHQkYGtCUgSn$Kf)
zydROm36fQ7K-*3@`9Qh#VL%J~8Wje*`G$$cJeQB7CaeHa)cq&NWq__@kkSW*?(1F|
ziUPVE;93RlaD1S!eX0)nU%B$YkbZijt<)j8Us(tC<*?TNkC`3Wo+E{{>@!6%Yt;ZS
z7eiQZuJDRs3u#%~*nmQ;%^B$n5y%2kTwr(54hCqTpA|8%<{*wO4ZlFm^FG}Jh9ayK
zv>g|N2PjY>DvY61{n?+z0Mqx_NNqh^7|d+!(yI~H@yqV8rjAP44!~n<6hjuoDCN@L
zPS9a8rPz>0_3Xjm$V9A}*}r9(x4IxGL&Lbn4lyDPHK~BZKoOt0-2VX11mJMKzm)0x
zV_b#>611tu-o4L^bPt6809z?FH;fe!fXi=6o%7CT@DxZCpVMA0o?!RM2MeNrNGCw5
zj2vNyb3Ajq4vv5ZY6z!iBWe`i;{?p10zbFX<P<^y)iqdL*+$j=X^?JOe<T#b<B{V+
z2?cf-rmKz`3Lz^a;KBfvc+io+rrl+N5h*5o*gza6Iw8OI_K)I1R$pxi-G3P|Ov#Qy
z?+)(KxKZ7pZ_{CS=H~nu5hl;rj-pKdt9V1%C=RVq*{n^X_`?nc_m<p9c!8^J2By5)
zXfRmfe;%-E(^STnXgMK*Ji8b6COLpW(Jgc)yNl`l0Q~;&AuYnBTV@zMuiG`tFb2X2
zO;(&yt#8?c>S42cFpPyhAmK5R5akq?RU7rg^ArW0=BY0<I=P(K$OoOpk!+BOZMXqn
zG@drS+A>i|ik66{aFgmLzGMZS%{~hYU546)Bl`rYqyGRIao7cTZIFh&KXYovU|QJ>
zeoq`l6d~mRMLv`WZ!x<97wOt#Nb(`A9N7f|EBa3Bbq@xC2@zX#s;jGtX%2$hfInN(
z_GFYY5+>m%A2C*n7A-+uj|i^A;X}uW1!~k(gk?=eUxYOXQ-4{#nlKEI1(_#S(^c39
zR5!>mFIbUZt?N>Q2tiYBno~yGlJ6*6ue~&FO3O7{!2;a0rqN{z${C~^+L#?^LO#wg
zh%VJcAt314S*j!y5{0IBMe`p5AU?;uWty^Gw53Q3ZA#D`5m#ysu{)sXI$|12LkQZ*
zEzqJWN&?GF7{JQT!c~2(l{5wirY40_jWs4L6h%PyuAMp0b9{Y(Y`f>Bk{+|=&I39+
zOWZ)fq=5C=gB9+(g!Tsm(cZwu`qnMpVAo0EWgR-+Ep+sTHNWhB;kM=@OZkzf?f(E6
z?+6hHgo8sHRoY<jMheABn|R%1TO<N)6k5`+Wi^l!#0gTl13-FEUUss<JJ*QElQQur
z0m-_Jb=xv=aH9{F#y*bXjEn$d$)ne*SU<$b;)h;1r4Z<T#vH5>mc&g>IwPzqGy-?*
z1ELz)ERM`%MyY1nyTzz(0XKncpYPn!5)k)&(Z1I~ns;;`<lX&0-w>FLD+a1ieg6PA
zlSkN7Pa#lET{41i(hCSu0X0C%zqz|&dD_UB3SB5j>NA!TKqLx^Y7Op%#_2N+4XM2p
zf1EXUfIEbwMHcSxU??iG`<zH1fa<x>@(}=t5oGs~FGdIWIpC;>9nvK^*jcRgWH>}x
zI)cIK#extWpKrd~xAEE2FkA=)XH4VO*drsMEL4`<Gh?7ofZs?1jGNG9b5bdva4wTo
zcBUiw0O#_TWxK}=BO(agkch4On+u=uZNQaw?IabN&Zg)VmjSzK9Rb)MpfF{2?__#3
z274@kDF#Il5>9Gn{cH_f1)Xi&5!mMQqGC)P8NArhCsqQtDqps5R4!{_$O`KxhUfK(
zU;rMXh{4@Cv;opV_mzsvM7h@^LIjU#1o)ESyw?*F9x`kwCf7l{Z6JX*2th09G*%=C
z5L`{5sKlEQ2O4i^FG|Y-o5wKK=+F!$KuF%5M-%dpU+@Mkqr5buIgKoS%Pasj<V}Ex
zFOy)g33qdvOoCjz(Wsj?OTK+bQqu!`2);<AS(tURRJUzYpv}Dz5(365+V^hYaR8^%
zp}~S(u}5@5`1frrT?#{NxdZ*6D^Wf1LHhwbd*|3gFEChv*Gy%6w>A-3tQ3V<lc%u9
zdB+x^cCClC{%{enM8}}0*3;%MFoALUP2sMWw+yftA&~kD#n;@0C<7aET56@4)w3ZV
zeXpy}#n>wl-=qo8l3v_dO!Rm-m-lv+rfii-FQdJ&9_e?Uec%)Droq`PP2=MrZmAao
zyDGrdIEtiU(1@D%3EVPK%)&rDbQ)h&pyNW40iHXC(JsI?EHkMO6TI59dZiUk*-z3p
z`@^T)KK2~9qp#~Gnvj%k0Q8IY>j(1?HFxMMvmY2OwV)zz$wd5SBkGa@z`l}?jKimR
zV0+YIQdtz?)7t};&erYT>tb{WDgzW49=l4yM1b%a<bG=bv}nKtJdhv>UbHfs{_(HC
zjbqRj&0TXGV}K(Su&$6x9pP5M2+;VVC-P@CID=c4?_#hUlWG_gn$<Kz_#DDB2q%90
ztdt+~32borA)>9~sTIu=G6&`|9L@)tZjS+}m)%c3a=}Dl0B%ri4UGv*Pl-?g4Pt^Q
z&&bQlFpeR#+N!Xg<=&70EETQN&v}pB3=3Kcf=zaIvnL@OZ?JWu2k0&8k|4)@jBSqh
zMEVO(5QAq)P2LG6pl@o(xdA^kXZFxaVdFOzrDVC<H4yf}M<&#f&SVk*tOBfGzRCdn
zLRiUV*&*y$Yk)|R097yzU4UTSfeTceUuA~gvq#>?vax!q?7Nw!S0E{?$eUW+kj%{T
zL1=-CkppJ>3~#_d-)IBO0aI8Urc=CMsVu!yoE;G&U70pCud|o3uq^56K`ZdlS~r+s
z`jW3miRANW0|{yp5gK%k5C>>14U2pbU1^Yxg08e8(G*JBi6CK~;zvLzZ9_Is68``n
zp?S9W%+M3MJfu-4Ti`^l@nMG2lIU4{ta=u3L>2&n`ul5I`v7=o@Dhim^)e|~jl&hN
zm)D=pQn3neKVLsp`r>#54;wg;5bpk&zrg{j!ihf-o0zyjhdXTnFk95-w>QELhJs=k
zAIxc9XMv^k%jU~8MLmJ?ootF~Q<mYr(;@W<*IL=Uoa8}<Y5<Wnds%K20PTG52zBfg
zEBFvj4pmqpd3I%};vj&KWu{=$#&ZS{w`<#IKb5Hb>oM2g<uph-ylyf&qSCzL6FLWP
z)fzn(9uUrN*gKZ+1u7OEn1k43@2*WYB<?-52tAi;`s@7R>I6X>rioS6H%P>UmJyUN
zyrZmSm>87+^Qvb2JO-4uXI#+Wf`5Yt?@yS(fN9DGX?Nd0kuTbSEmH++N|hzW6`%~Z
z@HMyVzUUiP2L8>+QQtFt*cRJlKqjX=&N_jFssMvjBkPX9U4QA^XPN>APJ?y2*<9}#
z7-HF81qZ5u@@%1&36ntz;3k%b*Q|yX6xw7p@&ueHGWg>g2KG+?YhF39>^TCQx?sqy
zAuTtQcN5uwG|yre5rtDUh0t8Ij!_@To1!S1h@5b4uVJ>ELjnok)vUA;y20hZrsma!
zhDZle;RY>90HA)Z^*zAv@DL>V@{aLi>MDw{H>du2yqMsnTwL#BP`V)~%zwWzPuS8X
z_W{}#cOZmE>M*g;aEgSY8Yh!BbKNrYeMV@v1jp{!oVrpJdqsKxK7(CatMzU@hyMT=
zX(3YAc3tRknL(D{90uwS7-yuzdAvbr-uG`mXA}kinlNKdy_u{q8J@=BfbAyoZ|PKp
z<e;e?+n5lVG0Y-Z(<~^6CZLx>+<S^FsNC7kkg8et4ZEv#hp(XyANH+{lg!5Ogf2ch
zO2a}_eFRJrS4Mup7({kFpec<qC$h!~ayvo`9pX1FYS*wt5&*_d`A_mq=RS!AuT;C}
zHLls?1Pk)lL4tdJV&c4VR~R4t^u|nxC^Qm4qkL94`)HwoLgmx3{{Uwd?Sv!_^>>{V
z@*LzqBRim03PZfcaAPb(dx8P~0C>Mt0cmj}c0==nG6-52&}ypk5@$I;M>C?dRA&I?
z1EUN#O#(Ht2Fsi0ARW8&-Mh_`S@J<Y6Qn_mIySdq0M%Xs1WlJ&^xtTp+P~)6%s0On
zBE1KftYM~Cu>$Q@u?|0c#adw{%|`Ysrrm<1B@nIC3n5~_nFl%$oJZs1?%*)alTbk%
zRIIwa?s^)4!%1qS`!1X|N{J554tctV+!45-v<}mDgA;3zu5DJ{u{Qn7w2UevlVK1Y
z>$nm65Z8a-5@_=^BkT*&A;;(R!Ak)PV8Vpec<v}A81okVIxY5$`3AgBG*V1iuX39h
z{YYT_m9)G#A_#ibKTkNY0Ki4QM(j%qUWupZJ>^Ed_W}DPHF=6Ebp!`adlG;lW{Pm_
zh1QBs5RL_jg*)5iR{Br@g)3F?qWF#tRnQxv_7#VhHr#-aDw+)&ug(ob(Y=6bCg##G
zj%~ga+@dzM)6X46A-2K}lxhmacAH`?P)k-`)I2#b;)w>YZpa|=b&osfma<8()p(;c
zoXIqy30=a%)XRxM4Z&fZ6-%4g%ha$Z^NY%=8!M)z1r%5UG)#`2K*u0Qzs~CYrX5fs
zh*JUwlxuMxc%mI-pkQ-dVlD&=cX_ZnGNFFhP~KCi<m87FiVO~oz#)Ajyz2mwX<7gZ
zX)0yNxDY34;w_a&?hc*;Ua&(_-)(@56@cgVBHe|b+)uRtIx5Ya?h-CNU;uj8X=EhT
z5W~vG7<+6@98kWH-^3uwED(3_s5n9S2Q7hhgLHs1aD>5WBvJVU{P979uz+L)GWvLL
zIW9ysK82}6N7nt3l5!Ys?WX{MtO4&`{JiPyp-<*JD;?;aYh1^p%|kn?si-FP_ZD3!
z1kHfbp9G!N5e;NW&O(<?6F4ENY!~JK00%bLga9F2l_vBK9teoWY4_JR!WbtyffNuZ
z*3A=M>S?Kj_8@BJr{|lLb{k01u}07aVvt+`JF5xZS=@RjDZ(}-#`#=AiU8D?n{<8w
z;A1Oxp|_3%RrzuM00IO6W>0KUXB*^#1zC>R=SI2IePO+lzJITwx&;Z}8r7iw@PtT&
z*5B`b4gwHBQ@aQIoZCzo{AsUs3Fa-~5IJO_Zu6hQ4oaZ$Vi2&l;KbVxPEi6oL`fSC
zaAO_QC^cC99w(-<L0|)WZ>V}*Y?vCTM#r|U-}ZkPN1y?s?xD*a%Qb`6i~+jA_WbX;
zx{N@_Rr9-Y(Rd5vR#6M=1{|glEh+S(+7+^0vZ;j0xedA~$uzCx!3cuzRcz8kO=O-3
znjSAe=-_~={XPExLHI&VW!?0=l$Pd-UJk_)n*M42vZsg&X&0unnoXU*>8nl={^p=R
zx7E@rkdB?|{a`n9-To%)zrj#e&2I#Z0AgztxF*tj8wC&ozgVh<${58x0j={kbHHY<
zfC(?kG+S?a=)>j20RR^7&WA`2Y<n1hJD|IE&M>T&F&{hQ9clKdhQ}~&JIi^i((G6G
z%r?w}5>iR7RmC8<Qiip6)*MO;5I07P6a{|N@aTv7Iufd|HMs;LIIR;#mNfuw%QbMu
zpDaL#{$3hVh#b`vN)@OghHfY#F=YVNPUkbcV}jPwy3PpkArVr)ji`G>x=Kh18n!N#
zvtQ1KpoR+W-snS06vg<Z5Ij74>3_!s0t6O!xImxAS5&~Jt!(d2RBIgy#6Is=!5@s8
z1(YJ0L|1Yie2gtLKrYTW1f5U|K{EiCs>m9{M^|jrfbljZTwn{5jKGLb(H~o_Ah`?u
z!K25DRMDJsPVNFb+)d#`1H}D89&L?)Z%XcMe}(8$iRt|P&54N;P1Y>%DNH`u$P|l>
zO6-9QUtn3XPxKG>mahagq`eOD^Ws!S>?Ga7GFf?oI2FJJgr!I5Gzb(r(GFm>Y>?Dt
zE$I9S91r2V3)F*Pj;jO|Cc9_flwuxvqjl}p0lEN9>G-G)MwY^?7#vTPaIv-pLnvV)
zeX9JHRNh)RWGd10;xEzn1fLKe$MHHoXCQ<^7-;|i6p-rH@CGb1HCR6PlO<>`ITnWZ
z`97XR03I7mp9YKOmUuAN&XVvDQ@M*U!hjAV{{R?Qp!@~S?32y93OY4H9|!P%X?@2x
z*uG5gr2TCEeUQQkx^8qA-sk<GNP{D<?KCW7r~;2^!cjjzuk=LAkd#!QXn=Cyre>yS
zWfx$(k3i3ioCo6C`n!R{ot!WMKK62glf7%N0q!c`0ylmeqDW~y1F&wON&05HAPXU9
zr3n%IaN|M(i>wNFsXW=vm==T0_3OPi)E3agF4bweF?Q->(gqyEq7Xsr6@=t~A=K0W
zU(!=zIRGoYs)7npi-kx4H9PFFx4e~tksQ(iTB_RpR@VpSFsDYdbbXN<Fhc4>wWEDd
zQm$Kp0HZ7^u7tlfVzRVEgh;I@)gLfWP>O95cDynDhTXyug*z_Ins>HiL%Rf~$f%>F
z8iKnsFG@|)2q1LhifL6i<iH!9WbDf)?g6N3Ew`}I46?fds-2`L(j~r)N+cjO97JjA
zdI%L{4hW3uP)ZTr3o-zF=ZB$`G~*Xog}iEEULk&%$m{{qJ}ENsnq2jqm^Xh(_X~$Y
z0u73(3c#`(u>?KXN;fQ+r9BZ0cjBR32b@(lGQO9#;*{FD$hwmx_EqwQu?Mo?%{8G^
z<A}tvbz&k{NXQ|!8xw^d3X~Zj)HaEx`Y|zp=-6XXH2z|xe$aM79jDi#VF<<U!oy8(
z=1Ih9ySvGlx4mFY6L8?WDW2(5h#SInOjM*NHj>A8%zPpcKtiBsh2ElH<QoVd=$J$k
z=mQV;{{V~{PqY=^T3T`Z{Kcqj3c-%6b!B$N+<;Pidm4VB)?y8MQii99?4ADrp#CEO
zfudD!qNkV|Aj7$&S3v5GAZD(x2f7S*{FI*^@i79WGK-}*6iJTx7*gfUsTjzZ=uv7P
z_@}&vwUBNMS!B{nH$kG-f|Ex9#Z*Wq6VZ;2w9yRqAmcWhp1nWq%t$Eke)C`BHkrgS
zZp#QfHG7D~h6CHFlFHP(Fuwz!PMS$hX-dlFO#vKRf`hnp^G=f;A?w&1ak$&Y00d88
zl>J)~@tdFn1kP1NcLCiP3t9;2U#4UoP1IhxfFTJ}Yz@Z7=4x;P`2i?R6MK9|b%7&|
zu#=s-7-C#g*N7sE)Y;7lFK7v+bR~4vCCP`FQ`ElDvf_t%wH+WvvMz78_{Ln!7a8uG
zcfWQf@F-LDArBw(pfWu02n>4+(SQfmopaI+c}oa)pzi_j`4D&hOZb?)b`bM3whdGJ
znQ(-IkT?2MQ%ZLWD>%AZ5n=O3S+EcTbY<c)e;H}40iD4<rO-bZ04xBdD+msZ&{>73
z;160=oO!c7*$^SP;?&!V$7qfTMWSJ^_6QGjJAg%0CC7`8b?({G4y?8-S@xK8?gAuG
zi*>C~ywZ<sCHBDYe(F{S5)OccCp_aO3Y8XzcM;8CI`-DOBmg3?rx2cQDJEdyQ+hix
zGkP2XK&5{9nR*nXTIvJ=J~RYMI~pm6s2E=+fv_`eSio?|C*89BLO(Jd@drBC0VU2c
ziu0*;fljRCpP4Dn!KIntM$HqR9Cn_df@*c?dtTymB7x4Me#^e~b1hH;0T=WV7p9BN
zlOPfF4z1A%w>p6&OjN63Ww3WwHg%v~=R>_apEL5xz<3_@{!E0H2t;K|+z#*VQph__
zDiI;LBiGc*+(YF>kxF)&n3#}+iSt0__^UA7>qE<(`5v<L{{W;M2Rj!{?;iG_S^RL)
z0Dl-`CcEG<3C4JuyO_znqBYdC@q51_O(272W9Tgp@kit*8evm&47y8%BIybVelltM
zjHHNj0VUS+Uhh~FQ(1q&KjQ=*upDuPsX|xgN$)mR0iAyjGr#DFv}VE<1@U--jgl~R
z3{;9|*BTTEZUck(w!fH=_y83kIIFvKADFy=1n?CtL!q7b1P2f#B|o9H*e>RI5)ixW
z-B7OO)<ecaxz-DNt_j?Wa04Jvf-0c7nCom2xXA!t86q(<qJRVL7n7r7QF~tj^n+ih
z%ISPWqBsWm;n6+Zls8C+7@aBLd|_#UA5xdu;WMF~^eFCojo<ZwIt(^Rqz%{Q*EF_>
zTVB%arMid?4{YSUH2T``2j+M<1V3SRlis+HfoiTFnM+_&G?$plQ^sb?cp>RG#wxvJ
zxGDL_>b%$Zz@Pw6=~`3WOFU^oZ~#?ziRpRhqV_@t7PF`oT>*?sFN*EXuzEUAZbQ;A
zm>car#de*S2kIatqkQa-K*)pOXPDimr{~yVTlN5u{b>AX+8~?CA@BHw7{UHvkgx#{
z{w6tJ*vojx9QKam4RIm*f(<nXYU3Q_34^+6zs2Mg0suSstqUkkMcy<32?YXG5*O9L
z9Yb>G-4(nJe>g=*0{a;VY2yvtBGEBr-q1~vUR`TQfTisw_+6>|%SR0T;~GGrtZk^*
zs=K%#eu7wC4Io{LL<X~b!$X?Uy%(cdr8Kal43HfYp|7<k2t1X-#G*ac47-5*w*;Ik
zr@1rE$b;QUvPBy=q;))Da+MG=Z8qHwP~t$=lnPxtSL@+XS_GCA<741H%<<o#ATR_4
zjoh6)Z~|P~+EK^Bl7T5*!lQbEY67tY(|5fHf8~Mz0mBe}KSL&N#J$gdNT+H@n49sC
zDeoCl<qKU}5uXrYguQ|tK!wN*gZKn+e-!mBai$AF)5qWYj#c*%*ealPwwA+KXGj18
zs)n1-m^ofp1l`RPEU9-QG~krGpeXEM)OpH;A+#PkyEgVf5I7N{W}3Yh;+Rccl$(5s
z?BPD+9^i(&TD#+azUP@n05NHJI`AJrjh#4);iw0CEj<#=lW}slqXIc;#sly^1n+e@
z=}!m|K;RkkvQ)<+3<SGAM{KYa7}^*GXu{h&wyiJXo)pc>4e{OA9XJp!hREE{O|^mQ
z0RWN*4q$G+0Do`(nK?QQlr8qVuf9!!a3UC2+Fktj96Cr4$OyO4P}7T&9h5<M&^!ve
zW_8g-9++to&i3~&OAv!c6k!0p?^*iLC?H!CLa&AZJ}`&l0@}M&EmFFL2mug3b&%9B
z>4H%Fs`8pW(9IE&Bfu9_NnEoC!}?(rBMm1tG8bt?g<e<^m$nqipoYBtY=j%Fm_J=2
zI8>_itJUOPjgTMU(uF*$;qx>6P%m}U*#76`3y?4)mv{TkU?33*D5$F@u0uU(rmQr6
zSCd&`)r5()s_QJ%S>q)UFeCP89Mv-IDF;_`F7M0m&8-OsV{WHq+qt2LCqiDkPo(8*
zhQo+VO2i5gBKvTnkSKG35CWgM-TfgBP;RUqsJy52e`XJ&m@h~9SBYKj0$hngvBc?k
z8^-|-f?eOkJ=r+O06|6#_v{7nOO({aJ#@ENf0z;Y<I<vVH~JU<0PA6Q*I2`ixF`Y;
zQ0jCkrB1wHR1ygrBOa?|hORt(HDsp0cnct7Nl<jUmvID|lYn4AQD8B1`RmXrDfewz
z<#sV5isQSb{lP#aPK0(o`}wo);0Rsdwi=hU)SW>OQQbNR_e%U3#C(Zus8)hF=qjR_
zAzj_Ec+i1_5TZoWuur9~K_JlsTIfZS>-i204JYtF_F_og1RNTn{I>r9K^@ovYFi?Z
z@mx{tL6ZKpOS1C@I$*t1-xqoN?gs84+Cu=XX9^N(Dagcjnp`{#btIW01v;ZP4<Afb
z7?=XO-`d!kQHE5CL^djPrMF0j-J@nd+)oNh**AnLP5{&E_&TSGhB<&%?4a0wlELXg
zux)0RYg&^M48f@q0YPsk*c{+N)Y1O{(-=hoBWHiCp>)6jcW(H9IYA---oG9DC~Hh^
z-{t{dUAZ<pmjMM196MG9wN?PAA;W8}1x>*_Fkk`#J`E<~_S&lg%s?0tMc$Fuammz>
zucE<9wspcq4uyl1cizk)mX0q&*VUzXcpAE9paL;CfVpod$rP~!Pf@-fH=(VrkP&rJ
z_fh2Obe8}~9o8)aoq?SqWIhF3U^}7H9sz(Rx5z6ahXE0p1rQR529YMPp21+FS2s7Q
zKPF105Qga;H(E@@#t1hZtu}Wi)r4e#8D`4H@0Bn=qlq>hzO+Kh>rB|C0P|!CRvV7Y
zA`I9Rg5Hn5w^43<QYop5E}!UxYjlg@-qs>fA_&4*03)m2z-x)<%D5mckf0~6JiDE1
z;{|419cCMio`Q6LSw1d5njo9a*LRz}W-OoqNFgOJgur5!49EjWy}R)-di5X%j&TgW
z>}EJ?<E>7^U5kGV3jY8?60i$!h_mK3azJcN(D-oM+;S`c>Ma0`p#Di$8M>4n1aEzv
zO?<@{Lfcb_CLTR?#_AXXemJnBp}8eg0I|>TocsLdw44A#y0;F7Qp~dkBIW>f=FYW^
zg$p|Q&4f!&0uS>5Dz1rrMQE3Nm3;|ODX{YK{NY9r+8tVhr$EoQ5d~r(Mh@Kpcj?75
zZkzppYUG5CkmxV*yo@z{6G!k6zRQd_5)@yW9p9k%U;>c-0jxzu1nG_o20YkAi&;wx
z`p~h!Ql8}1O@2%mA(Y?Xes}v<D!mX7^1$hV3<mCuyW@i&kagzxOFh#jPT(9v+7j5d
z;oW3^&<eFZyWtNwP$ZDr?T<={T^AXl5Lpc|Uq)w2vE`Jb2CJ#2^NEtGkTY*(A&7D2
zSk)iMFaZ!D@*pRAzSTW_>_BdPZt2x^x7<|(p{42CFk~UQv!(!lZW6Dyu3a=bUJyG$
zunivr3SF2-F~Cc}VqRy%e<9+)GBK_Ah#4DD@u}y4V+O-T@za1YwT0|e(kT>1pXA)>
z+$PHx@Zao;Oh`x}zBJ&!^TQV>fIMGfm-Wlkm;~+$LKI7PK*?D{Zsx%H(XN;o-3Teq
z282B><6fr$1b$tv%Nk<%*u~VRwI_z{k#evhqS)T1OI^#UWEdK=DL|wcy9oq_>O?|r
zek?S|86xN=f5Nzm6Cf8p1WdiX>MO!X34gQ|Y8>g35<$jP5U_RL&F+N+!TE0uso)^W
zr>KRkjSyt-xw_Z;h&fYjAOQ37l#{_xzKMbE&DUWFp{T?HYMa%iz#Myfpt4L*DzLLQ
zL7;Cv^ylXB$j`!@<8%#}Z<&0ELT=#$t{AZB&zSyro{BngCg^06hr~hnmj|2%%TLam
z&n(<S?!eN2YHKB+5K?tfk=Nhit~fRo{{St&uJb*mRL<Q@wDpQBfo0J;N#Y?M6CEHP
z8t5$`nrTU%xkv<7hUt2iucdaZz#Uo!*66$*Vn8IaD2XbjPPty-Mz^k;sm?EfMd*e~
z8@NlL&`eBBf{F+Rk*HsgX;XzoHHCGdDCN{-5O2g-)N{vylnH=nMx+o=^K>{e&}c#p
z-JPG~QF`1ML#g9Y<k4%QZ5}9c&TLSBFXMoCTLVhFIc(_l9Dh>+=Gl3|Sz^R^?tb8B
z+&}|aM^3EXJ1Qap0bf-E^~6-dhpcI9jo%pdvtslm8r2VE-Vfk0dw`1HP}OeQlr(w0
zq1fB&*pTdr9-grJqmkni7fGmfp=N_`DRBKcG2qbaPKc9ZiB&QIQvU$688?M!palfn
zQ)P8`z8I+5ij7?#x@8Tg8Z2}q)Tjl~$dJI6SSEvbq<P$=F|4gF`n$`JR@w&!Gc^i3
ztL{*NOMv{r-F9H5{v7hFkk1fN4mI$pTu8)19l1RPD7|oqfDLHYJ^-c%7-iX*T)?%2
zMo>)8p%Vd&kGsRZ1UAbGKvlDNM*`?IO%7RtRuKTy6QlnC?4R~bf)+rw!{*`fzcGw_
z2EMxMu+}bRQxJ1~-2+Q|&@O87gdh|n14Bkgf}$Q;<wqmrRXtFn+D(Ya2J9Qk@6zJI
ziR@E1bZa~q5(Bwz#Rx_D^zZ~Vcc4{I)GT5Xdi@#Tp?cwu!#IY}oR{V8o?xh2Z%xJ$
ztI`{0Ctv{j)o$Y?Ti>__s8j;qH;;EVos1w$RmWc75YWH_l`FSP4jK&`$}PI3f^7iS
zFH`)4!%-vXFTd9FisAug-L*}(2gz880n;aCK@IGfdQ*VMO0NBS$L)JykKiDTSHE1x
zSj-{nDVkpw=(n&0o^?*{_7j+~+8AV+X6XvY@C%LuQt&`YMcg%3RfGYlZMmX&Y%sGC
zf{jm209o6rLVp1EW?T7$%9+uu5ic;Y@+W5)(h&O*v*F9DgA^tL9K0v~`d3UnjBYM8
z1JIC7j6b>nXD=;XU*|S9P82ksaV>nw`v@JV*{?gT59$Ghh{^=T^1GRI;Dhb`5I{b!
za@)ZIg{1WswfJEvaRqk+H%`01=QJ0>FGSG)0Gt(YjSwEi2T%!V&7Ein#J|q-T4WHa
z#KKAc0JJMDh#+Mhmg==#Q!4~jaTW+VO&rvjwGCqEh6i*Ad}zrCMu|!r#$7hS=8Og%
z1ZnSG<gfr3t(NL{rD<9jze_;BiI5@i59H!qCV@|XGj~CQVNtha168rWxI_Uh+NAu7
ziRLb3Ftn|BF0BJ-RuY#S61R8sGtCqMsIs%w;M`-}0>fTdLB2O@kuX3fRXQITo?^&{
z(jgz=?-SD?^#?xo9wU{s$Y&!;3DPFX5*tecqmlU=-s8R4Ap1e7zri;QGhC8ogMp!G
zlfwifZTh`GaxN$bds-6>9`)P;E<xt;S_L6)*0<gSLQ=pSgeeYcw<sR4*ea`Iex?$D
zQ5(13C-Z_s;zCaiDwT+~6zH%(F8T9K2ge~d%y1pIw)~7Ry%2;bE7sFf<E6sVz!dZX
zPTk+)ILIgfgYKS)tmzr9TmZD-EkkN29^z1!D7g$1qY2Zf5LS>hWwO;5E6MsfW10{y
z*DntkQ2DhvZJOb4%meuP8Uwp_9$!hqp4BF<*r8??yA%!ULqDvHPE~bQuGC-*#b7{g
zih*bp=XqlCZw!1*pig}HG9U9GcF|O48lT>2KM3sT(6Ll@jxHOLFs^-SD>kT#%bF-U
z7fT)|qkG?jx)uzt+6bk;Mmc@x1daWq)`>#6RJdY)T1JX3vtH0PCsPR}uY*%3Z4hmT
z?}4Egcxu4I=C8GG`>J5Ef)Odwp>NLdy`w-pMS(UtE>wQlgevDDH)?LJ!L4Kp5wMF3
z@la&XI+6~&*aYug^A_46ORSrWr}zq`DI5bVk0#W*Zt_41Kz2F!%Ws)r{{ZE{fA9Rz
zAW*3l>4X#nKvUNfcLdz1Nbj+GLo}ZfFg@7;tNj(i+@aA($QiIvXSr9V0(WpCh!B5M
z65({#EOkjuJ-J(i1AQ1G4QY5eJz`7J2ZkL;TH$}y1X$_m&D9&#FD0(EJPYl($mho$
zTh8>b(Gs<ggqwElZqq@l?Z>1-A_x~@0ugKg!mMbTUke8BX8p(%Kqr8v5e?KpN{2I*
zN~VW-IdJL3Qn&sINj4?q<H_+TdZ8)0KgJQIz$g`ZMWNh{Rfdm_B6d|rBfHrqB}*U?
zDZ3;GyV-(50vcS41pB7BmlJ?elZ9|XP8SGN3NI!!g%}p0NZ>Sr*R9Q`x;e1p10EkN
z0a^b54r2-e1>HrXAW5u^bVKQ~77U}aSkJgR!14!TbUjoRtiXohhJv;-HG(%!0UJMo
zg52i_5Dox@O92_Z>5_DXuiV<ZVKt{H-Vj_=GS*)=e79fbA({a1li#_1poDq|j;M>*
z+;6CWJ%k^f#FGyH0D$-(LuysECh|-8PIvB=?9DEJy0S2w#2vdKk^caOCiV45gKHHO
z32XtjHkxbtGBG%c$S?}By}YGTLiPoPAKzrmMgUcXnnf$>F-))qV64)34_)BT@(?;0
z=mcQXVORUPJAvOUXgc*qZ_4)>LI?@L2~XD{kP&t~{*M0uc2hc?0B$wVP_=8RGPW>)
zh$gDCDkA<0h=>~RmzTtv&V*1H-hvE%%a&`1DkDJHQB%v%k1*`EWGEow=Fbcu7>FBO
zJgS&u0NhsgS+2XHmlp<{ciCb^*|V&qz6%i|D1im7H$)WDP;_E#^OqEhx3~>CTZo*I
zgr(S?3si*i>y?&()pKzh4>TWuP$8|Vhedat`ITMmQ#k=)g%X%uZ&YH_s(4!ug?YLW
zR_LLHn~-vn&eBA_OqADGj<9ayGy!N+vXq-Ds>bZ|o!*tgJO2PdPgxaFtY<??#Rj5C
zssmOdI69O=0!_K9I%yAjP`#(o;5g~hP;4h|CD5&?f*{DaAZnx(<5`CgU_qfbNXN%F
zv>J5V<XKsed3vi*7rI(lx0~H?iSd&l?oDh5LqDj41iC5>ZP&Pe)0TqF0lb`hn@Q@A
zY6`j&Sum0grGF1>zs?rBAnJmL@sF252Q7r2@;rodu#!U|x=X*G=&kiK8Id0`!~{dB
zy~t}*RPoLeDg=N${KXMeUtNwrzP#plSHKrWUSpsp)j$3I^fvOsucZ^sPNn7*3Lg~K
ze8iRM2`}UTU}g?)CMWnXHIJKey)@z$f)jm!w3b%CpA?*i5#ZlXp9~^G0E1EESZ*){
zlz=nV1i*MK5na8}{keh`*oR)R;K!PMSUC{obO&jp!a%^VfDKD_=EBH~!P@YJMbZ#T
zZZ=3GT@Q>I{^mdKg9Bd@U*yek*bB=BZ-p4yF~-7UUXDXf(K_NA#0bq-c8%D1u6p(Z
zjX}^vp=Jb|0Kbu?dX+HWDgbz!y!Ais*D(TnQtH*Xf=7W*)POB0C3EArL1+N=K#)i^
zD@>6b6eA1ue;bDVaZ<<yPrkJuE9NVsltHbB>;cm%t*i)~kP<7Yn*m@AQwF_fCfg=R
zK&N3g-%QmlUTOiL`oR~z85lI&Sad>aQ6!x*t3j9cH9AgV9B(Z~=Uq`n<z6_E;^s0$
znpnofn^7ZXn5NOV8lNzzv>2%V%lNM#Gz?!IlHU!(B#4y~k@^uS)W-9a`_7m4!^tq5
zDFc9MD7L!}oZ6@MpdDZ)MFSkN!qF3bE@?=JmGiUb-Bs;8sk@cT<tuuKG$8nOtA>1?
zDvDLebiv*Cfbe=tjvSZ3bI03m@Mgk30!kuJn88lwrttPulqE-6$?2*s91tuisVa%H
zAcTC{*sj4tg&@FqP?PkpIA@iHXy)Z%(a|GDn}-a*=E(*L4B`>=%%bBvfrQ+FoisGz
z1PUc;8!CYq`H`j$C5GR*^LdkVV;O|ikLmp6vG68(^Qz9B8BK+uEx@2gB&KTagi#bj
zO1o0kh6qkDUG21>x}Ud82ps~V`8(hE*E=N#A+;p#@EM>Y0p{8z`^M40zZDLcbWhVb
z3KcYcV~q&`p>K-^@EYjB#ir(T+6s%WreF576nc^2)TypSo>0TnmFHR<>zvb4HKhEd
z^S^_TN)!>jfI4L)S9gd4xBmcio1@9No*-Iqbw_E8#a${-*EFr}fHC#aLsq^&f1la8
zH!)4xF4Ti8<C0>4bP&}r7B;gTq=0Veo{SrPiu@pKE{6KMd&O0ExI;Q12oygodw;eD
ztY{6+&~$^k%FhHmBnTZMleDwg00o`lghfPAFfUCQ5?$@~6H(rY6#!I;?416x#%c8=
zIBabaeqdK(7(uXtaTG1*IvA6vEf`iu**Irl2xHF#00GgEg$y89HJhf#I{8v6zwhDq
zId`E!9Y7&I#HM`8=HNx&ML?#l<cfl{Hc?a)lfHUT+6JH(Pc-*dUu6);sc67iuK~ry
zfOVkTW)9N?(}uS-<z7E0y1m^f22w(`1Gea81r0STy#$-fOA9SJRnZl|IGzx`#7s8Y
z%{0Lv7A1Z9%FP@pCb5Y!s^0P`3=LR7Y<XFd98|50V_OHsoo<AORXf7l>Z>8#KB%Le
z043a3x}POK$l|uiZpb>u$@Z*r{%ShXncPY4Z#20PQ4Ve*-PX+B)P&zHX0wU7B+`o4
z>^oMl*tq;H=?`W6K;af5oduO&8z4<FX=yq}H*yjm8SjvYql06gTy;Vj0AvDgTf|<l
zk8R~+2e--kTWCzWpJDkIumi+Sj##=OvhVsfKGI_8(q>xl=^B(18|vYv_1B?Ke(5(f
zDCiSu1P-NPbz}x!I3g>aiWyIogSQ2K2wS=tI(P?%C)<hJe-<PS4y^W#A*|tN`_Zry
z59y)x<}Vwp6?>{xVZ3>TyfA}^QQEef(Z=`42-vE#8C13`nL#xdX(j0!B<_Hkqf5F$
zNJEHgkQKN6zPJ6yqyqywL|rI5=JYw%aWGf3GNIpdn}I+Xn%#s2s-0HVAln4feHaU9
zJD$L!A5fwgYQn2#6wt5OORxUtEr`DjKZm!Q$B+md?hul_+NN9F5x#l}=6uV;z%}>#
z(GKDVfJHrBMUCzI-2A`aI^IMPw-p&+7+i@y6q5{Y?)$fMJlrr2gl<jYpsus<I*2C`
z5>o7PN$?K*WVrHG^<IXcv_d1;yVe+02!+S6MM4JHxY@KA14{#>0xFGH9N`eBvQn5y
zukI#cC}7dLp<CLe`gM>(B+X`MsE@H#n-HT=OL`!i9vET{R5j1QS^@Auq^wqBH3H|5
zz5s<Q3Ae#J!r=@mV>L8>99xHW9)`O=yD%&SZ|*Q++Pz<h=6Vgr8eVrpE5RrZm)5(x
zF>!K&<)2EQH~<C>a3Z@dvV+NTOf%gF^qo!SggSP&l|qXBc$kQIOfy}eFK#Z!a~WOq
z9LM$Y#)D&v3IJa?)(cR=Flh}qA_B2e3gh^g!=Q9~OQ}%>U_BQGjw)8M4g#Dq&E!cC
zgK+`z6_e@4_I4^Biuq^_E!JF~^Inl%oTAlEL}8$s3LnfW(B6p5pDkktKf2m*9{wuh
z8F*!;6YCPtlu+7(Rs7J3Ri@xZalbMR_AU194j1g3LRvCM20wBiy-hff5quc!U}=vf
zz)ImJN3!pC<!>&Ci1Pj8#(WN42Km6UlzKeaZH*9tCj{{I<{<S*I<XMerF%WYGU62T
z^pKkxT+&~ZrkPp*AK;H<J^*#ain~pn)t0pIhxMU)Li%9YE6~j?owh%qZHHs!IiMv9
z>s?~j@*cAX%yjV~hOrH1l4G_8u~l#bpnNGf3Swb@48$G2DnLTND8v{6I7v}^6Bu=N
zC97Xx6-erp04aVciqob40J~fN0J5PoOOOGCtagThN<LibT!edRU*FdBltrM0^WVC1
zECZxF5s~qH4x#wK0w^(lpZa8%-~`K14b5vl>jCR0{sOb>+!knII!1sFw6N{5+ibw-
zQ%OOa6m^c=C@h`tM&W5(>Dz#z;!9j5{O$mYK$=REY>I<MJs3fJ1rguen=+`d5^?ET
z+799?e_0%Whxa09F!0Wkla4fcAKRxO3_1P3%9+tM1gy0!mrLBK79cHtP4>t`)JTee
zCjNlrAX=rdG9gk%;Y519Kr2vKZLn%GaO7M9l0xRxA|n;XJ;btrG=PIeN2CQ@Nb7D7
zP#}Ar_YQL-@YU%S7jkB8F2FWW5a?C6780<4Btqv53YLjlBq@D2fEp2@O_0Xp_B?NI
zw`iDB?T;qgIu>i#BSLB`bhDU)t%BN^T!nTyeo9y2fM#Q>yV>-rt`&H`>YW?VT{xkI
z*bu~zyENeH*gsVO>gc#24AEE-K(4egM)^m85&^@)G+UI=inMuOCXB$F5-GJAU@Zw<
zAHob0eEM3&S1$@J0`Et-`T?FUOsiUE`zj)}u$1H^@dRYm;(g0T3Iqh?+UFDugJ>D8
z6@5M7uviB+od8SAuYuaSWOGy~q!E{rrfeha3wm^W_Pfx~u<jT@kZOJG(^HlL1q4AE
zb#kD-`Ws=OI}3{TeEF1%jQ~BwB_&>;xX7UfWTVmp5h(J|8{pO+ieEeF^WlSX$I<gW
zqH-JqL&MFtDzYeAmw`PV9&;EGlo%to;E2eNxgJP^iPv!x>};<Q<`YhSCJKXlZ=jCb
zJ4dsRuFptUu8v$beIhEd1}|D%e3t2qTcQjj8|78oc3Yae0u2k@`~Ltx95q<n8KdaU
zuou~b)s%O;P0GZcoV&mPZ5>u_saD2Z=*Ust;1frtJC;DVc`Q^rJ_>L(6fO;jC?YR3
z{{XB10Ow&B9@=Nm?=`vNN}K4>>EgH+@*5ipWeVk|$cF$B;4c-ak9f@T!jLaI@A{By
ziTvn6Jg#AuJ1*Gpit+54z@}(3#1g-4ez_)Wc>t`-v?#v#^g84d&Pz%3VapFBjAT(-
zAk#8D;SMuyKHR<%$C5A_H5g*)rEHx*F%Qd_5m4+5l)exq+}hX2onc@qp>g)<YeoBX
zw{cWNRZ>teOZssJOvbJ5f*}z~_89A@E=g3Y6KPAPJZxz9n2;KQe}EAj4}qG9`>s~)
z4uzW~b_MT{TAjq)2#DUK&}AHq>(@vMu8z7n24SW=6J((Z<p%V{Wr%uj(!B6FY!(7(
zqz>Zb9hQ<liGU*Ja(WU1-dUli1IJq+l8b&FwA&d{Lv3znOV(O=5z0L;15ZH|Y-pfG
zIs}-|6T=!1XJNOPGxtHgq$+?4XXxLN5~yzvdKe961tp5aNdh6PHX1rsRLwnCpROiD
z><JAYWO01=qe-sv6Ky^sq$xY0t-w3r8d*)SdvG^2v@RI2!Ei*2xdTQs=}ui`5mmr)
z&2A4Cp^&=hh-jFlXaEGPNQE!ioNDjDOA5Mi$p*K0yX0U5ugqnNA8>;#3lTEcZuEL9
zfzqJ?0I$7y^Z3LX;0+Wut5^JYc~I<1O~ryEVSKo0M2f_bOMKM@Kz?*uhq0DB##UYN
z0Ank+PY7$19v6rv_~I3)(YW=1fTIgHEXRAq0faK2L3&t`37zU0hY(nq)FZ61s&O3g
z-Sz~eTsu_T8`E3M@MbTRU?CN*33g0)N~W08TJVO<W#On0sz!5-4{m-S`-qN>zpLcf
zl4T<$ADv`Uz0)T>Aq!^hp?n8XuLYn1lfI=Nvp@RWd-2RPzkdG!VeXh1>_S)&L5iq9
zt;w<>K;;`|<kp?qTx4w6eQgH%cUAt4;W7p6)27(eaGmlPUAycJQ;#PAf-d!0>F8ty
z3Lb&{Q4~f7%d-LFQMI0oXMFJk$z1l%cOhSZ9qxw2(m7{P03_-=q4wQFksLr{p3g0k
z#4>Qzve$EhqPFQ|$+)B(tfC18<2PeGhVnrXybZusinpMKPB3gc6-R}U5DtyQyp~MU
zAwWS@&b|pEkXW&^xvmtFo7WI1#hZ1Aa!D%&kb0@pmJJ=z<LPHcEzRd+sA(w>4HqgM
zW<7fP3Vtl4Id2qxcu9@|;3C9nfjj>Ivs#^M#<a0^^h@+9_J25?6oq}fTz2e4(8uKU
z!Z3QX0q<_b#mA0S;satPr+CzUA<v&A6vJHJhZPMKdvF|(z<L5<Hi*yI={lIi-{qu@
zh=ad!Gvz>qEK<VlCe+~4H(tkkCJu_p2+%zQN{u*lGcpPQdwa3$e9Hi(0HTyr)5~Yg
zV=_`aDB$miW$Dp^#g)(7MQ2Q`Is!zl)9Ip-t>N)<5aCtW90lO+QgEc~iv-<?y?^`2
zN&-{PY!_ns^b*zB89&!^x|YNw7Cl~j2I|F#Pk9U$Af||qf(R!EIKZ%g<^&0gTj;L0
z?<mIx0N?ko7~$D+1;VFxUJKj}ZYS6gdiaJ*o9k{3%wQ*D%g}^%b5u4-+H8P`n!!Ug
znFu=8R4p)AVUs?<KD5Ml)Y>D0m4G5I)pcw^cBUs7GnXetuU$!nh?qnQJ7mf(Zh5hS
zD>l})j<}{iq(k@Q-J+H^@r=Qk4pFi1aD1Z3=KxirVt4hBVQwbVlJ4egM^IO0(<kHp
zagR|5omfPpaxl~VfezcEuG~8e1B^kI+VM7|4Wjk9LCy|zQ8s-wu8k;?>3R};Mu^Rg
zlMEUc=S^yhu4GDr6UaXXkk@w?au^4vyC!dj-pH3O!a{_Xba}coFSpbj(i+W~2j&Xs
z5ZEl*pearBFz*9T5EtjEt&5b`CK}E3d)$PXwhRCb{WZYVW*m^nA%|2D!f1d=hG|$A
z@y(Pt^!JTz7%dGH1|IaI#CSjk&+#i%sPcu)0DEr6YG1mJa_LhSfEnoL@%RBKH*^-e
z{L&SM2*xgfIcP_j{NcJvtU7o}3*CPh!TAt2Ytm$|=)p;WE7zN>fK7+IOfE(NLd8Kx
zpc5tV76Zsw%~Co98W6g=offDKR(zOug)QdWdk>XE8KO*rd$cp#vjl2#Czb^E9TW?c
z#UMMu2pL4G8Cw*Or67on0E~9v7zEC@BC8@Ojr(a=l9(l0zy-%N`HR)kA=_yMb%=lf
z5A4AgpriG@Q2=P1kc)_N!ySS(L{b5nsGOfK2k&s|h7@8M4deH9*vs_LM-{^|?v7{<
zjuxLT#qx(sy0alVh!Is)fdOFDt}JC(3^+FCo8K=eLkkKTq>xr>hQgC@N9&23sV^fT
z+7bwAbg@K9DTX4N3I)O;6L7Nxuvj*$6`C7^ZA)L^fZfvofe5hXFQgzE!V*#Ger-qk
z2l_HwPK_nb)e?fXlypQJ>yTUkb1ky4)T~^llV}(WR=M44oZ4_;T;DxSjoK{6Da-<W
z;0vY`+djSM1lhOqHk&t!X9O(gT0QMi948R4;>(B{r(M@UI2bU$cx_=bp{E)kRC%2X
zT@x9O>M4Vra0zjiMG?3{O*E^wVoY-V6<p+n)ynr-;@u{GPd|)V5P;O>yQQS1hD!z@
zPrIKR5CuwNivpmwYgOOHnAmU+CF?koY6sSCWD0F4+B7}&(-Miw3RYn$!%BY`qm&Vh
z0E$Mx+askkXd0?@p&Gx25${AJN{#2L8&tT5a0$pL+Bf&{d}W*hqe>06t2VP6veFyZ
zi6U7-%TtM>u@T7mdEaGgh_b{Kd^4WKzQ+nv9Bm7Nnb)#ih=arde0TG^)6L@Z(hI|y
z*`^kMSOscG;nbktnx46|phF11NSa}z0mn3f4JZctQcMX%nDzOqm`iDl%Yi8&odJzO
zUbIzRnG6*dWip4o&J-;Hxgxg+zjmpk909|xS(|-n1x!tZ!>Ng`k?p$79fCapLswKZ
zv=;yf$&_?5GNSFI-cLFZtCkz*9>=Uk+Cn6dekx4`T#8>%Vm|62VbwZ;T#ywy`#{R&
zyvhDaDh{z`wikyjAsBY*QRrlPxg<&fVB2n<&u@-c)L?EAF@7vl3o@Pq8~0{(MR~n~
zncAcs1EO45Xw$dWHw52v%Xb3GG7Pa*(_?T^K_8){_g+3TZ0)X?_6j3_4H(?PfKWEm
z=Y?-`O~YvB$TVhTWcYEo{{Sv#KA3g}rR1Vqvw>pNYvsXw1u8TxHxpvE*>+`aavsi=
z(0?J3gpDTs){raxyvCCvn@j@*+vQEW$7w_##7DZPD1!inAQd7104UbVVExwwH-}3N
zxh5=E)bl1D+I3w}QfQTHuZ}zUh0PR`Ai6qXGN{RqYn>I$XtnfpbHNiK(mLuDgn$@W
zAwf%c8zx6~(J%%DyQ)gmJ(lH?&Ih{rY|=ei6t!MKECH#g`H&grqLuj^ByfZdgcOj_
z8l&+X>@^s)zTvPmodLCEA-XS5=?YOCA6)=BKFBW_OhOm{tw_RJA~xu?{LDjTuzA{R
zNF_S}gnrRI?4(C{FXaHS+5Y?9;Wyh$4b=d6^^@I0as?VbgGwI(Qw{YHqi0J1y6;Au
zrhq|$Hvt;s5=BAgh;6C{?xkydCQ~~hHPx%3_3K9wDkM7Ul>Y#<9xi+bvlA;Vx4?~|
ziQ1(S)^co+pS9(vC;(~Ok4pHqY{dTn>A)vU`x9;*6UGiHo$=e(t|U5O3;afaruUY)
znE*hP9T3Gwv|i`uh$R<=E)#IJh&#YI6JTUs^3LFqf&h~4_o=&6+|k*D_WE24ot|gV
zjtz6g0FkY%AnYjX=?+RwPGqF?_8Htd-~Rw}ZAignq->37n;W@ZkO5&N1l(8>IsIa$
zA3{Oz6yhjIKw@fj@e4wiMgl+pm(?i^-q~L?$sf5J)#<A3!vO695Dwh!<@<A0`~tg7
zg54nn-fQ*(1pNVOC!m@*=pfPi$5;9Jn~F#=jE}yqx>PaAloif)C8sZ1%?XDz-8xKf
znsW{~Kw5%nJ#NK~nMx1>iNzt>gWcgQK@I@5XxhQc4>%!JKB&H;J>;L*4=4mQwSQLI
z&B`5-qd1$<?2M$eP=F<uv3?TJPZLvLTTqcKbjunmmDJ6yb~JwUF`{UhQ{=dL^5UZ4
z!LqJEGU`h-bQFMXJk*dEV(*N{u&4qRCF?=<9Ka8F1L+hrRB{~N&M}@7QG;}mvjP?X
zZ+m_`S`s2rs|!NGQ6N@dJAs$`;9(`%CXqaHjX48NH&AHz`pw!=z%aI~l~8(Fo2h`8
zb>6*$VoEasq!8=XMS8zx030sJC&hNY{xN=%0s!aZHHY!XGqVof;P>=R*A2})0aC_)
zj1S|1I)9<vM1HG~Xh2y&-AvZYlT=#N%^sw)E(yqTFprBy=4Ha1r+kPIn-LQ*F+wv!
zEDIxq<%YgU1XxOcA1PNi!eo0YH9@aP<G2Q>L5yD%L`99p;CFG;1`6Zss_4lMK>P@P
zw{E+efFTWe(;17K@X2RH5EjsiBUFE>1%!suTn$Usw~lKFZ6m*_?F5F`F71R4l`Pl_
z`WNN~9w86S-MVb?P31bX(V8ff{rI0uQkq32?FeW)C+<Y}5uzst$JNh<fxtt4gFk5B
z%und!2orS|Z}i62nUQA2>+C>$Kul14Y2V{Cro<rkDhdh&=CZmn2BJF(oe4F4cH4lg
zH9>~X5>mj@fE2(1XJRyEk$E@)U|tFk1#$}krI`ll)Ftnon88p3*{&n+E#X3{#4(z5
z2Z_GHh0Bm%3t$|ki{CqN@(P;WZ%s|;3Y38xA=D>421#FF&<g$YgMOanWiS_25_ofn
zVmGA#R4>~&(zF4>qd*Sl2$tP#Bij;TC)-6;>-SNQ!ee&zl@NPq(9V>aPqgrFnqHf&
zgM=0Lv0^bMu)<3L;>Rlh1%{E!3XCqnzwHXG%IZQlkG|1}rKcQ#2rKoB&@~6y4Rk`c
zoK*@Wcsm1f5HzFlthjRcf#DFPl5N-Znt6J7fvH-hlV3fzHrETlf?!l<^JCdOh=N=e
z4ZaQS814`t-cP@60kv|UFa$%ns(X|<WDtVki4nv;0oa+o0ZeZPQX*^|9gqi&a4E31
zi)@}sEbSjhKKX8v$^aC#jN)<EyuncG07Me0u$Sa!QkWteR^-Ce^u?8XHKR2jAn{FO
ztJ47+6kzE@o8jM#4UI<t<=cBK6>|U^9{EqI5k=nCzzl&C4f_!g^-lRnY{V0q2>_;W
zYcdF}%lxz~akIt%slXRhL*;IDPCkyI@@O`&q-45-1aiS9s;nca6rf6aco4*q@OP#M
d006pt9ZfrtNd(CVFqn;*C2E>PF8dCD|Jn4?QgQ$Q
literal 0
HcmV?d00001
diff --git a/docs/package/rectangle-example.svg b/docs/package/rectangle-example.svg
new file mode 100644
index 00000000..74d52968
--- /dev/null
+++ b/docs/package/rectangle-example.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd">
+<svg width="13cm" height="9cm" viewBox="348 138 253 169" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g>
+ <rect style="fill: #ffffff" x="389" y="164" width="158" height="115"/>
+ <rect style="fill: none; fill-opacity:0; stroke-width: 1; stroke: #000000" x="389" y="164" width="158" height="115"/>
+ </g>
+ <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="348" y="150">
+ <tspan x="348" y="150">53.22,</tspan>
+ <tspan x="348" y="166">8.09 #</tspan>
+ </text>
+ <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="545" y="288">
+ <tspan x="545" y="288"># 53.36,</tspan>
+ <tspan x="545" y="304"> 8.32</tspan>
+ </text>
+</svg>
diff --git a/package/gluon-hoodselector/Makefile b/package/gluon-hoodselector/Makefile
new file mode 100644
index 00000000..d6207a0f
--- /dev/null
+++ b/package/gluon-hoodselector/Makefile
@@ -0,0 +1,26 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-hoodselector
+
+GLUON_VERSION = 3
+PKG_VERSION:=2
+
+include ../gluon.mk
+
+define Package/gluon-hoodselector
+ TITLE:=Automatically sortes nodes into network hoods.
+ DEPENDS:=+gluon-site +gluon-mesh-batman-adv-15 +gluon-mesh-vpn-core +micrond +libjson-c +luaposix +luabitop @GLUON_MULTIDOMAIN
+ CONFLICTS:=+gluon-config-mode-domain-select
+endef
+
+define Package/gluon-hoodselector/description
+ This is the hoodselector. The hoodselector is one of the main components for
+ splitting a layer 2 mesh network into seperated network segments (hoods).
+ The job of the hoodselector is to automatically detect in which hood
+ the node is located based on geo settings or by scanning its environment.
+ Based on this information the hoodselector should select a hood from a
+ list of known hoods (hoodlist) and adjust VPN, wireless and mesh on lan
+ configuration based on the settings given for the selected hood.
+endef
+
+$(eval $(call BuildPackageGluon,gluon-hoodselector))
diff --git a/package/gluon-hoodselector/check_site.lua b/package/gluon-hoodselector/check_site.lua
new file mode 100644
index 00000000..6396a67d
--- /dev/null
+++ b/package/gluon-hoodselector/check_site.lua
@@ -0,0 +1,35 @@
+function need_nil(path)
+ need(path, function(val)
+ if val == nil then
+ return true
+ end
+ return false
+ end, true, "The default domain should not contain shapes")
+ return nil
+end
+
+--Need to check if not default domain and does the default not contain shapes
+if this_domain() ~= need_string(in_site({'default_domain'})) then
+ local no_shapes = true
+ for _,shape in ipairs(need_table(in_domain({'hoodselector', 'shapes'}))) do
+ no_shapes = false
+ if #shape >= 2 then
+ for _, pos in ipairs(shape) do
+ if pos.lat == nil or not ( pos.lat < 90.0 and pos.lat > -90.0 ) then
+ need(in_domain({'hoodselector', 'shapes'}), function(err) return false end, true, "lat must match a range +/-90.0")
+ end
+ if pos.lon == nil or not ( pos.lon < 180.0 and pos.lon > -180.0 ) then
+ need(in_domain({'hoodselector', 'shapes'}), function(err) return false end, true, "lon must match a range +/-180.0")
+ end
+ end
+ end
+ if #shape < 2 then
+ need(in_domain({'hoodselector', 'shapes'}), function(err) return false end, true, "needs to have at least 2 coordinates for rectangular shapes.")
+ end
+ end
+ if no_shapes then
+ need(in_domain({'hoodselector', 'shapes'}), function(err) return false end, true, "no shapes are defined in domainss")
+ end
+else -- ente by default domain
+ need_nil(in_domain({'hoodselector', 'shapes'}))
+end
diff --git a/package/gluon-hoodselector/files/usr/lib/micron.d/hoodselector b/package/gluon-hoodselector/files/usr/lib/micron.d/hoodselector
new file mode 100644
index 00000000..6e793151
--- /dev/null
+++ b/package/gluon-hoodselector/files/usr/lib/micron.d/hoodselector
@@ -0,0 +1 @@
+*/2 * * * * /usr/sbin/hoodselector
diff --git a/package/gluon-hoodselector/luasrc/usr/lib/lua/hoodselector/util.lua b/package/gluon-hoodselector/luasrc/usr/lib/lua/hoodselector/util.lua
new file mode 100644
--- /dev/null
+++ b/package/gluon-hoodselector/luasrc/usr/lib/lua/hoodselector/util.lua
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
+local unistd = require('posix.unistd')
+local util = require 'gluon.util'
+local json = require 'jsonc'
+local uci = require('simple-uci').cursor()
+local site = require 'gluon.site'
+local logger = require('posix.syslog')
+local M = {}
+
+function M.log(msg)
+ io.stdout:write(msg..'\n')
+ logger.openlog(msg, logger.LOG_PID)
+end
+
+function M.get_domains()
+ local list = {}
+ for _, domain_path in ipairs(util.glob('/lib/gluon/domains/*.json')) do
+ table.insert(list, {
+ domain_code = domain_path:match('([^/]+)%.json$'),
+ domain = assert(json.load(domain_path)),
+ })
+ end
+ return list
+end
+
+-- Return the default domain from the domain list.
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
+-- This method can return the following data:
+-- * default domain
+-- * nil if no default domain has been defined
+function M.get_default_domain(jdomains)
+ for _, domain in pairs(jdomains) do
+ if domain.domain_code == site.default_domain() then
+ return domain
+ end
+ end
+ return nil
+end
+
+-- Get Geoposition.
+-- This method can return the following data:
+-- * table {lat, lon}
+-- * nil for no position
+function M.get_geolocation()
+ return {
+ lat = tonumber(uci:get('gluon-node-info', uci:get_first('gluon-node-info', 'location'), 'latitude')),
+ lon = tonumber(uci:get('gluon-node-info', uci:get_first('gluon-node-info', 'location'), 'longitude'))
+ }
+end
+
+-- Source with pseudocode: https://de.wikipedia.org/wiki/Punkt-in-Polygon-Test_nach_Jordan
+-- see also https://en.wikipedia.org/wiki/Point_in_polygon
+-- parameters: points A = (x_a,y_a), B = (x_b,y_b), C = (x_c,y_c)
+-- return value: −1 if the ray from A to the right bisects the edge [BC] (the lower vortex of [BC]
+-- is not seen as part of [BC]);
+-- 0 if A is on [BC];
+-- +1 else
+function M.cross_prod_test(x_a,y_a,x_b,y_b,x_c,y_c)
+ if y_a == y_b and y_b == y_c then
+ if (x_b <= x_a and x_a <= x_c) or (x_c <= x_a and x_a <= x_b) then
+ return 0
+ end
+ return 1
+ end
+ if not ((y_a == y_b) and (x_a == x_b)) then
+ if y_b > y_c then
+ -- swap b and c
+ local h = x_b
+ x_b = x_c
+ x_c = h
+ h = y_b
+ y_b = y_c
+ y_c = h
+ end
+ if (y_a <= y_b) or (y_a > y_c) then
+ return 1
+ end
+ local delta = (x_b-x_a) * (y_c-y_a) - (y_b-y_a) * (x_c-x_a)
+ if delta > 0 then
+ return 1
+ elseif delta < 0 then
+ return -1
+ end
+ end
+ return 0
+end
+
+-- Source with pseudocode: https://de.wikipedia.org/wiki/Punkt-in-Polygon-Test_nach_Jordan
+-- see also: https://en.wikipedia.org/wiki/Point_in_polygon
+-- let P be a 2D Polygon and Q a 2D Point
+-- return value: +1 if Q within P;
+-- −1 if Q outside of P;
+-- 0 if Q on an edge of P
+function M.point_in_polygon(poly, point)
+ local t = -1
+ for i=1,#poly-1 do
+ t = t * M.cross_prod_test(point.lon,point.lat,poly[i].lon,poly[i].lat,poly[i+1].lon,poly[i+1].lat)
+ if t == 0 then break end
+ end
+ return t
+end
+
+-- Return domain from the domain list based on geo position or nil if no geo based domain could be
+-- determined. First check if an area has > 2 points and is hence a polygon. Else assume it is a
+-- rectangular box defined by two points (south-west and north-east). Furthermore keep record of
+-- how many nested shapes we are in, e.g. a polyon with holes.
+function M.get_domain_by_geo(jdomains,geo)
+ for _, domain in pairs(jdomains) do
+ if domain.domain_code ~= site.default_domain() then
+ local nesting = 1
+ for _, area in pairs(domain.domain.hoodselector.shapes) do
+ if #area > 2 then
+ if (M.point_in_polygon(area,geo) == 1) then
+ nesting = nesting * (-1)
+ end
+ else
+ if ( geo.lat >= area[1].lat and geo.lat < area[2].lat and geo.lon >= area[1].lon and geo.lon < area[2].lon ) then
+ nesting = nesting * (-1)
+ end
+ end
+ end
+ if nesting == -1 then return domain end
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
+ end
+ end
+ return nil
+end
+
+function M.set_domain_config(domain)
+ if uci:get('gluon', 'core', 'domain') ~= domain.domain_code then
+ uci:set('gluon', 'core', 'domain', domain.domain_code)
+ uci:commit('gluon')
+ os.execute('gluon-reconfigure')
+ M.log('Set domain "'..domain.domain.domain_names[domain.domain_code]..'"')
+ return true
+ end
+ return false
+end
+
+function M.restart_services()
+ local proc_tbl = {
+ "fastd",
+ "tunneldigger",
+ "network",
+ "gluon-respondd",
+ }
+
+ if unistd.access("/etc/init.d/"..proc, "x") == 0 then
+ print(proc.." restarting ...")
+ os.execute("/etc/init.d/"..proc.." restart")
+ end
+ end
+end
+
+return M
diff --git a/package/gluon-hoodselector/luasrc/usr/sbin/hoodselector b/package/gluon-hoodselector/luasrc/usr/sbin/hoodselector
new file mode 100755
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
--- /dev/null
+++ b/package/gluon-hoodselector/luasrc/usr/sbin/hoodselector
@@ -0,0 +1,56 @@
+#!/usr/bin/lua
+
+local bit = require('bit')
+local unistd = require('posix.unistd')
+local fcntl = require('posix.fcntl')
+local hoodutil = require('hoodselector.util')
+
+-- PID file to ensure the hoodselector isn't running parallel
+local lockfile = '/var/lock/hoodselector.lock'
+local lockfd, err = fcntl.open(lockfile, bit.bor(fcntl.O_WRONLY, fcntl.O_CREAT), 384) -- mode 0600
+
+if not lockfd then
+ hoodutil.log(err, '\n')
+ os.exit(1)
+end
+
+local ok, _ = fcntl.fcntl(lockfd, fcntl.F_SETLK, {
+ l_start = 0,
+ l_len = 0,
+ l_type = fcntl.F_WRLCK,
+ l_whence = unistd.SEEK_SET,
+})
+
+if not ok then
+ io.stderr:write(string.format(
+ "Unable to lock file %s. Make sure there is no other instance of the hoodselector running.\n",
+ lockfile
+ ))
+ os.exit(1)
+end
+
+-- geolocation mode
+-- If we have a location we will try to select the domain corresponding to this location.
+-- If no domain for the location has been defined or if we can't determine the node's location,
+-- we will select the default domain as last fallback instance.
+local geo = hoodutil.get_geolocation()
+if geo.lat ~= nil and geo.lon ~= nil then
+ io.stdout:write('Position found. Enter "geolocation mode" ...\n')
+ local jdomains = hoodutil.get_domains()
+ local geo_base_domain = hoodutil.get_domain_by_geo(jdomains, geo)
+ if geo_base_domain ~= nil then
+ if hoodutil.set_domain_config(geo_base_domain) then
+ hoodutil.restart_services()
+ hoodutil.log('Domain set by geolocation mode.\n')
+ end
+ return
+ end
+ io.stdout:write('No domain has been defined for the current position. Continue with default domain mode\n')
+ io.stdout:write('No position found. Continue with default domain mode\n')