summaryrefslogtreecommitdiffstats
path: root/perl-install/detect_devices.pm
blob: a8c2d2d395b77f64aac212a1e279abda5e707280 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
package detect_devices; # $Id$

use diagnostics;
use strict;
use vars qw($pcitable_addons $usbtable_addons);

#-######################################################################################
#- misc imports
#-######################################################################################
use log;
use common;
use devices;
use run_program;
use c;

#-#####################################################################################
#- Globals
#-#####################################################################################
my @netdevices = map { my $l = $_; map { "$l$_" } (0..3) } qw(eth tr fddi plip);
my %serialprobe;

#-######################################################################################
#- Functions
#-######################################################################################
sub dev_is_devfs() { -e "/dev/.devfsd" } #- no $::prefix, returns false during install and that's nice :)


sub get() {
    #- Detect the default BIOS boot harddrive is kind of tricky. We may have IDE,
    #- SCSI and RAID devices on the same machine. From what I see so far, the default
    #- BIOS boot harddrive will be
    #- 1. The first IDE device if IDE exists. Or
    #- 2. The first SCSI device if SCSI exists. Or
    #- 3. The first RAID device if RAID exists.

    getIDE(), getSCSI(), getDAC960(), getCompaqSmartArray(), getATARAID();
}
sub hds()         { grep { $_->{media_type} eq 'hd' && !isRemovableDrive($_) } get() }
sub tapes()       { grep { $_->{media_type} eq 'tape' } get() }
sub cdroms()      { grep { $_->{media_type} eq 'cdrom' } get() }
sub burners()     { grep { isBurner($_) } cdroms() }
sub dvdroms()     { grep { isDvdDrive($_) } cdroms() }
sub raw_zips()    { grep { member($_->{media_type}, 'fd', 'hd') && isZipDrive($_) } get() }
#-sub jazzs     { grep { member($_->{media_type}, 'fd', 'hd') && isJazzDrive($_) } get() }
sub ls120s()      { grep { member($_->{media_type}, 'fd', 'hd') && isLS120Drive($_) } get() }
sub zips()        {
    map { 
	$_->{device} .= 4; 
	$_->{devfs_device} = $_->{devfs_prefix} . '/part4'; 
	$_;
    } raw_zips();
}

sub cdroms__faking_ide_scsi() { grep { $_->{media_type} eq 'cdrom' } cdroms_and_zips__faking_ide_scsi() }
sub cdroms_and_zips__faking_ide_scsi() {
    my @l = grep { $_->{media_type} eq 'cdrom' || member($_->{media_type}, 'fd', 'hd') && isZipDrive($_) } get();

    if (my @l_need_fake = grep { !$::isStandalone && $_->{bus} eq 'ide' && !($_->{media_type} eq 'cdrom' && !isBurner($_)) } @l) {
	require modules;
	modules::add_probeall('scsi_hostadapter', 'ide-scsi');

	my $nb_cdrom = 1 + max(-1, map { $_->{device} =~ /scd(\d+)/ } @l);
	my $nb_zip = 1 + max(-1, map { if_($_->{device} =~ /sd(\w+)/, ord($1) - ord('a')) } getSCSI());
	my $scsi_hostadapters = modules::get_probeall('scsi_hostadapter');
	my $devfs_host = find_index { $_ eq 'ide-scsi' } @$scsi_hostadapters;
	my $devfs_id = 0;

	foreach my $e (@l_need_fake) {
	    $e->{devfs_prefix} = sprintf('scsi/host%d/bus0/target%d/lun0', $devfs_host, $devfs_id++);
	    my $faked;
	    if ($e->{media_type} eq 'cdrom') {
		$faked = "scd" . $nb_cdrom++;
		log::l("IDEBurner: $e->{device} => $faked and $e->{devfs_prefix}");
	    } else {
		$faked = "sd" . chr(ord('a') + $nb_zip++);
		log::l("IDE Zip: $e->{device} => $faked and $e->{devfs_prefix}");
	    }
	    $e->{device} = $faked;
	}
	get_devfs_devices(@l_need_fake);
    }
    foreach (@l) {
	$_->{device} .= 4 if $_->{media_type} ne 'cdrom';
	$_->{devfs_device} = $_->{devfs_prefix} . '/' . ($_->{media_type} eq 'cdrom' ? 'cd' : 'part4');
    }
    @l;
}

sub floppies() {
    require modules;
    eval { modules::load("floppy") };
    my @fds = $@ ? () : map {
	my $info = (!dev_is_devfs() || -e "/dev/fd$_") && c::floppy_info(devices::make("fd$_"));
	if_($info && $info ne '(null)', { device => "fd$_", devfs_device => "floppy/$_", media_type => 'fd', info => $info })
    } qw(0 1);

    my @ide = ls120s() and eval { modules::load("ide-floppy") };

    eval { modules::load("usb-storage") } if usbStorage();
    my @scsi = grep { $_->{media_type} eq 'fd' } getSCSI();
    @ide, @scsi, @fds;
}
sub floppies_dev() { map { $_->{device} } floppies() }
sub floppy() { first(floppies_dev()) }
#- example ls120, model = "LS-120 SLIM 02 UHD Floppy"

sub removables() {
    floppies(), cdroms_and_zips__faking_ide_scsi();
}

sub get_sys_cdrom_info {
    my (@drives) = @_;

    my @drives_order;
    foreach (cat_("/proc/sys/dev/cdrom/info")) {
	my ($t, $l) = split ':';
	my @l;
	@l = split(' ', $l) if $l;
	if ($t eq 'drive name') {
	    @drives_order = map {
		s/^sr/scd/;
		my $dev = $_;
		find { $_->{device} eq $dev } @drives;
	    } @l;
	} else {
	    my $capacity;
	    if ($t eq 'Can write CD-R') {
		$capacity = 'burner';
	    } elsif ($t eq 'Can read DVD') {
		$capacity = 'DVD';
	    }
	    if ($capacity) {
		each_index {
		    ($drives_order[$::i] || {})->{capacity} .= "$capacity " if $_;
		} @l;
	    }
	}
    }
}

sub get_usb_storage_info {
    my (@l) = @_;

    my %usbs = map {
	my $s = cat_(glob_("$_/*"));
	my ($host) = $s =~ /^\s*Host scsi(\d+):/m; #-#
	my ($vendor_name) = $s =~ /^\s*Vendor: (.*)/m;
	my ($vendor, $id) = $s =~ /^\s*GUID: (....)(....)/m;
	if_(defined $host, $host => { vendor_name => $vendor_name, usb_vendor => hex $vendor, usb_id => hex $id });
    } glob_('/proc/scsi/usb-storage-*') or return;

    #- only the entries matching the following conditions can be usb-storage devices
    @l = grep { $_->{channel} == 0 && $_->{id} == 0 && $_->{lun} == 0 } @l;
    my %l; push @{$l{$_->{host}}}, $_ foreach @l;

    my @informed;
    foreach my $host (keys %usbs) {
	my @choices = @{$l{$host} || []} or log::l("weird, host$host from /proc/scsi/usb-storage-*/* is not in /proc/scsi/scsi"), next;
	if (@choices > 1) {
	    @choices = grep { $_->{info} =~ /^\Q$usbs{$host}{vendor_name}/ } @choices;
	    @choices or log::l("weird, can't find the good entry host$host from /proc/scsi/usb-storage-*/* in /proc/scsi/scsi"), next;
	    @choices == 1 or log::l("argh, can't determine the good entry host$host from /proc/scsi/usb-storage-*/* in /proc/scsi/scsi"), next
	}
	add2hash($choices[0], $usbs{$host});
	push @informed, $choices[0];
    }
    @informed or return;

    foreach my $usb (usb_probe()) {
	if (my $e = find { $_->{usb_vendor} == $usb->{vendor} && $_->{usb_id} == $usb->{id} } @informed) {
	    $e->{"usb_$_"} = $usb->{$_} foreach keys %$usb;
	}
    }
}

sub get_devfs_devices {
    my (@l) = @_;

    my %h = (cdrom => 'cd', hd => 'disc');

    foreach (@l) {
	my $t = $h{$_->{media_type}} or next;
	$_->{devfs_device} = $_->{devfs_prefix} . '/' . $t;
    }
}

sub isBurner { 
    my ($e) = @_;
    $e->{capacity} =~ /burner/ and return 1;
      
    #- do not work for SCSI
    my $f = tryOpen($e->{device}); #- SCSI burner are not detected this way.
    $f && c::isBurner(fileno($f));
}
sub isDvdDrive {
    my ($e) = @_;
    $e->{capacity} =~ /DVD/ || $e->{info} =~ /DVD/ and return 1;

    #- do not work for SCSI
    my $f = tryOpen($e->{device});
    $f && c::isDvdDrive(fileno($f));
}
sub isZipDrive { $_[0]{info} =~ /ZIP\s+\d+/ } #- accept ZIP 100, untested for bigger ZIP drive.
sub isJazzDrive { $_[0]{info} =~ /\bJAZZ?\b/i } #- accept "iomega jaz 1GB"
sub isLS120Drive { $_[0]{info} =~ /LS-?120|144MB/ }
sub isRemovableUsb { $_[0]{usb_media_type} && index($_[0]{usb_media_type}, 'Mass Storage|') == 0 && usb2removable($_[0]) }
sub isFloppyUsb { $_[0]{usb_driver} && $_[0]{usb_driver} eq 'Removable:floppy' }
sub isRemovableDrive { 
    my ($e) = @_;
    isZipDrive($e) || isLS120Drive($e) || $e->{media_type} && $e->{media_type} eq 'fd' || isRemovableUsb($e) || $e->{usb_media_type} && index($e->{usb_media_type}, 'Mass Storage|Floppy (UFI)') == 0;
}

sub getSCSI() {
    my $err = sub { log::l("ERROR: unexpected line in /proc/scsi/scsi: $_[0]") };

    my ($first, @l) = common::join_lines(cat_("/proc/scsi/scsi")) or return;
    $first =~ /^Attached devices:/ or $err->($first);

    @l = map_index {
	my ($host, $channel, $id, $lun) = m/^Host: scsi(\d+) Channel: (\d+) Id: (\d+) Lun: (\d+)/ or $err->($_);
	my ($vendor, $model) = /^\s*Vendor:\s*(.*?)\s+Model:\s*(.*?)\s+Rev:/m or $err->($_);
	my ($type) = /^\s*Type:\s*(.*)/m or $err->($_);
	{ info => "$vendor $model", host => $host, channel => $channel, id => $id, lun => $lun, 
	  device => "sg$::i", devfs_prefix => sprintf('scsi/host%d/bus%d/target%d/lun%d', $host, $channel, $id, $lun),
          raw_type => $type, bus => 'SCSI' };
    } @l;

    get_usb_storage_info(@l);

    each_index {
	my $dev = "sd" . chr($::i + ord('a'));
	put_in_hash $_, { device => $dev, media_type => isFloppyUsb($_) ? 'fd' : 'hd' };
    } grep { $_->{raw_type} =~ /Direct-Access|Optical Device/ } @l;

    each_index {
	put_in_hash $_, { device => "st$::i", media_type => 'tape' };
    } grep { $_->{raw_type} =~ /Sequential-Access/ } @l;

    each_index {
	put_in_hash $_, { device => "scd$::i", media_type => 'cdrom' };
    } grep { $_->{raw_type} =~ /CD-ROM|WORM/ } @l;

    # Old hp scanners report themselves as "Processor"s
    # (see linux/include/scsi/scsi.h and sans-find-scanner.1)
    each_index {
	put_in_hash $_, { media_type => 'scanner' };
    } grep { $_->{raw_type} =~ /Scanner/ || $_->{raw_type} =~ /Processor / } @l;

    get_devfs_devices(@l);
    get_sys_cdrom_info(@l);
    @l;
}

my %eide_hds = (
    "ASUS" => "Asus",
    "CD-ROM CDU" => "Sony",
    "CD-ROM Drive/F5D" => "ASUSTeK",
    "Compaq" => "Compaq",
    "CONNER" => "Conner Peripherals",
    "IBM" => "IBM",
    "FUJITSU" => "Fujitsu",
    "HITACHI" => "Hitachi",
    "Lite-On" => "Lite-On Technology Corp.",
    "LTN" => "Lite-On Technology Corp.",
    "IOMEGA" => "Iomega",
    "MAXTOR" => "Maxtor",
    "Maxtor" => "Maxtor",
    "Micropolis" => "Micropolis",
    "Pioneer" => "Pioneer",
    "PLEXTOR" => "Plextor",
    "QUANTUM" => "Quantum", 
    "SAMSUNG" => "Samsung",
    "Seagate " => "Seagate Technology",
    "ST3" => "Seagate Technology",
    "TEAC" => "Teac",
    "TOSHIBA" => "Toshiba",
    "WDC" => "Western Digital Corp.",
);


sub getIDE() {
    my @idi;

    #- what about a system with absolutely no IDE on it, like some sparc machine.
    -e "/proc/ide" or return ();

    #- Great. 2.2 kernel, things are much easier and less error prone.
    foreach my $d (sort @{[glob_('/proc/ide/hd*')]}) {
	cat_("$d/driver") =~ /ide-scsi/ and next; #- already appears in /proc/scsi/scsi
	my $t = chomp_(cat_("$d/media"));
	my $type = ${{ disk => 'hd', cdrom => 'cdrom', tape => 'tape', floppy => 'fd' }}{$t} or next;
	my $info = chomp_(cat_("$d/model")) || "(none)";

	my $num = ord(($d =~ /(.)$/)[0]) - ord 'a';
	my ($vendor, $model) = map { 
	    if_($info =~ /^$_(-|\s)*(.*)/, $eide_hds{$_}, $2);
	} keys %eide_hds;

	my ($channel, $id) = ($num / 2, $num % 2);
	my $devfs_prefix = sprintf('ide/host0/bus%d/target%d/lun0', $channel, $id);

	push @idi, { media_type => $type, device => basename($d), 
		     devfs_prefix => $devfs_prefix,
		     info => $info, channel => $channel, id => $id, bus => 'ide', 
		     if_($vendor, Vendor => $vendor), if_($model, Model => $model) };
    }
    get_devfs_devices(@idi);
    get_sys_cdrom_info(@idi);
    @idi;
}

sub getCompaqSmartArray() {
    my (@idi, $f);

    foreach ('array/ida', 'cpqarray/ida', 'cciss/cciss') {
	my $prefix = "/proc/driver/$_"; #- kernel 2.4 places it here
	$prefix = "/proc/$_" if !-e "${prefix}0"; #- kernel 2.2

	my ($name) = m|/(.*)|;
	for (my $i = 0; -r ($f = "${prefix}$i"); $i++) {
	    foreach (cat_($f)) {
		if (my ($device) = m|^\s*($name/.*?):|) {
		    push @idi, { device => $device, prefix => $device . 'p', info => "Compaq RAID logical disk",
				 media_type => 'hd', bus => 'ida' };
		}
	    }
	}
    }
    @idi;
}

sub getDAC960() {
    my %idi;

    #- We are looking for lines of this format:DAC960#0:
    #- /dev/rd/c0d0: RAID-7, Online, 17928192 blocks, Write Thru0123456790123456789012
    foreach (syslog()) {
	my ($device, $info) = m|/dev/(rd/.*?): (.*?),| or next;
	$idi{$device} = { info => $info, media_type => 'hd', device => $device, prefix => $device . 'p', bus => 'dac960' };
    }
    values %idi;
}

sub getATARAID() {
    my %l;
    foreach (syslog()) {
	my ($device) = m|^\s*(ataraid/d\d+):| or next;
	$l{$device} = { info => 'ATARAID block device', media_type => 'hd', device => $device, prefix => $device . 'p', bus => 'ataraid' };
	log::l("ATARAID: $device");
    }
    values %l;
}


# cpu_name : arch() =~ /^alpha/ ? "cpu	" :
# arch() =~ /^ppc/ ? "processor" : "vendor_id"

# cpu_model : arch() =~ /^alpha/ ? "cpu model" :
# arch() =~ /^ppc/ ? "cpu  " : "model name"

# cpu_freq = arch() =~ /^alpha/ ? "cycle frequency [Hz]" :
# arch() =~ /^ppc/ ? "clock" : "cpu MHz"

sub getCPUs() { 
    my (@cpus, $cpu);
    foreach (cat_("/proc/cpuinfo")) {
	   if (/^processor/) { # ix86 specific
		  push @cpus, $cpu if $cpu;
		  $cpu = {};
	   }
	   $cpu->{$1} = $2 if /^([^\t]+).*:\s(.*)$/;
    }
    push @cpus, $cpu;
    @cpus;
}

sub getSoundDevices() {
    (arch() =~ /ppc/ ? \&modules::load_category : \&modules::probe_category)->('multimedia/sound');
}

sub isTVcard { $_[0]{driver} =~ /bttv|saa7134/ }

sub getTVcards() { 
    grep { isTVcard($_) } detect_devices::probeall();
}

sub getSerialModem {
    my ($modem, $o_mouse) = @_;
    my $mouse = $o_mouse || {};
    $mouse->{device} = readlink "/dev/mouse";
    my $serdev = arch() =~ /ppc/ ? "macserial" : "serial";
    eval { modules::load($serdev) };

    probeSerialDevices();
    foreach ('modem', map { "ttyS$_" } (0..7)) {
	next if $mouse->{device} =~ /$_/;
	next unless -e "/dev/$_";
	hasModem("/dev/$_") and $modem->{device} = $_, last;
    }

    #- add an alias for macserial on PPC
    modules::add_alias('serial', $serdev) if arch() =~ /ppc/ && $modem->{device};
    my @devs = pcmcia_probe();
    foreach (@devs) { $_->{type} =~ /serial/ and $modem->{device} = $_->{device} }
    $modem;
}

sub getModem() {
    my @pci_modems = grep { $_->{driver} =~ /www.linmodems.org/ } probeall();
    getSerialModem({}), @pci_modems;
}

sub getSpeedtouch() {
    grep { $_->{description} eq 'Alcatel|USB ADSL Modem (Speed Touch)' } probeall();
}
sub getSagem() {
    grep { $_->{description} eq 'Analog Devices Inc.|USB ADSL modem' } probeall();
}

sub getNet() {
    grep { !(($::isStandalone || $::live) && /plip/) && c::hasNetDevice($_) } @netdevices;
}

#sub getISDN() {
#    mapgrep(sub {member (($_[0] =~ /\s*(\w*):/), @netdevices), $1 }, split(/\n/, cat_("/proc/net/dev")));
#}

$pcitable_addons = <<'EOF';
# add here lines conforming the pcitable format (0xXXXX\t0xXXXX\t"\w+"\t".*")
EOF

$usbtable_addons = <<'EOF';
# add here lines conforming the usbtable format (0xXXXX\t0xXXXX\t"\w+"\t".*")
EOF

sub install_addons {
    my ($prefix) = @_;

    #- this test means install_addons can only be called after ldetect-lst has been installed.
    if (-d "$prefix/usr/share/ldetect-lst") {
	my $update = 0;
	foreach ([ 'pcitable.d', $pcitable_addons ], [ 'usbtable.d', $usbtable_addons ]) {
	    my ($dir, $str) = @$_;
	    -d "$prefix/usr/share/ldetect-lst/$dir" && $str =~ /^[^#]/m and $update = 1 and
	      output "$prefix/usr/share/ldetect-lst/$dir/95drakx.lst", $str;
	}
	$update and run_program::rooted($prefix, "/usr/sbin/update-ldetect-lst");
    }
}

sub add_addons {
    my ($addons, @l) = @_;

    foreach (split "\n", $addons) {
	/^\s/ and die "bad detect_devices::probeall_addons line \"$_\"";
	s/^#.*//;
	s/"(.*?)"/$1/g;
	next if /^$/;
	my ($vendor, $id, $driver, $description) = split("\t", $_, 4) or die "bad detect_devices::probeall_addons line \"$_\"";
	foreach (@l) {
	    $_->{vendor} == hex $vendor && $_->{id} == hex $id or next;
	    put_in_hash($_, { driver => $driver, description => $description });
	}
    }
    @l;
}

sub pci_probe() {
    add_addons($pcitable_addons, map {
	my %l;
	@l{qw(vendor id subvendor subid pci_bus pci_device pci_function media_type driver description)} = split "\t";
	$l{$_} = hex $l{$_} foreach qw(vendor id subvendor subid);
	$l{bus} = 'PCI';
	\%l
    } c::pci_probe());
}

sub usb_probe() {
    -e "/proc/bus/usb/devices" or return;

    add_addons($usbtable_addons, map {
	my %l;
	@l{qw(vendor id media_type driver description pci_bus pci_device)} = split "\t";
	$l{$_} = hex $l{$_} foreach qw(vendor id);
	$l{bus} = 'USB';
	\%l
    } c::usb_probe());
}

sub firewire_probe() {
    my ($e, @l);
    foreach (cat_('/proc/bus/ieee1394/devices')) {
	if (m!Vendor/Model ID: (.*) \[(\w+)\] / (.*) \[(\w+)\]!) {
	    push @l, $e = { 
			   vendor => hex($2), id => hex($4), 
			   description => join('|', $1, $3),
			   bus => 'Firewire',
			  };
	} elsif (/Software Specifier ID: (\w+)/) {
	    $e->{specifier_id} = hex $1;
	} elsif (/Software Version: (\w+)/) {
	    $e->{specifier_version} = hex $1;	    
	}
    }
    foreach (@l) {
	if ($e->{specifier_id} == 0x00609e && $e->{specifier_version} == 0x010483) {
	    add2hash($_, { driver => 'sbp2', description => "Generic Firewire Storage Controller" });
	}
    }
    @l;
}

sub pcmcia_probe() {
    -e '/var/run/stab' || -e '/var/lib/pcmcia/stab' or return ();

    my (@devs, $desc);
    foreach (cat_('/var/run/stab'), cat_('/var/lib/pcmcia/stab')) {
	if (/^Socket\s+\d+:\s+(.*)/) {
	    $desc = $1;
	} else {
	    my (undef, $type, $module, undef, $device) = split;
	    push @devs, { description => $desc, driver => $module, type => $type, device => $device };
	}
    }
    @devs;
}

# pcmcia_probe provides field "device", used in network.pm
# => probeall with $probe_type is unsafe
sub probeall() {
    return if $::noauto;

    require sbus_probing::main;
    pci_probe(), usb_probe(), firewire_probe(), pcmcia_probe(), sbus_probing::main::probe();
}
sub matching_desc {
    my ($regexp) = @_;
    grep { $_->{description} =~ /$regexp/i } probeall();
}
sub stringlist() { 
    map {
	sprintf("%-16s: %s%s%s", 
		$_->{driver} || 'unknown', 
		$_->{description} eq '(null)' ? sprintf("Vendor=0x%04x Device=0x%04x", $_->{vendor}, $_->{id}) : $_->{description},
		$_->{media_type} ? sprintf(" [%s]", $_->{media_type}) : '',
		$_->{subid} && $_->{subid} != 0xffff ? sprintf(" SubVendor=0x%04x SubDevice=0x%04x", $_->{subvendor}, $_->{subid}) : '',
	       )
    } probeall(); 
}

sub tryOpen($) {
    my $F;
    sysopen $F, devices::make($_[0]), c::O_NONBLOCK() and $F;
}

sub tryWrite($) {
    my $F;
    sysopen $F, devices::make($_[0]), 1 | c::O_NONBLOCK() and $F;
}

sub syslog() {
    -r "/tmp/syslog" and return map { /<\d+>(.*)/ } cat_("/tmp/syslog");
    my $LD_LOADER = $ENV{LD_LOADER} || "";
    `$LD_LOADER /bin/dmesg`;
}

sub get_mac_model() {
    my $mac_model = cat_("/proc/device-tree/model") || die "Can't open /proc/device-tree/model";
    log::l("Mac model: $mac_model");
    $mac_model;	
}

sub get_mac_generation() {
    my $generation = cat_("/proc/cpuinfo") || die "Can't open /proc/cpuinfo";
    my @genarray = split(/\n/, $generation);
    my $count = 0;
    while ($count <= @genarray) {
	if ($genarray[$count] =~ /pmac-generation/) {
	    @genarray = split(/:/, $genarray[$count]);
	    return $genarray[1];
	}
	$count++;
    }
    return "Unknown Generation";	
}

sub hasSMP() { !$::testing && c::detectSMP() }
sub hasPCMCIA() { $::o->{pcmcia} } #- because /proc/pcmcia seems not to be present on 2.4 at least (or use /var/run/stab)

#- try to detect a laptop, we assume pcmcia service is an indication of a laptop or
#- the following regexp to match graphics card apparently only used for such systems.
sub isLaptop() {
    hasPCMCIA() || (matching_desc('C&T.*655[45]\d') || matching_desc('C&T.*68554') ||
		    matching_desc('Neomagic.*Magic(Media|Graph)') ||
		    matching_desc('ViRGE.MX') || matching_desc('S3.*Savage.*[IM]X') ||
		    matching_desc('ATI.*(Mobility|LT)'))
                || cat_('/proc/cpuinfo') =~ /\bmobile\b/i;
}

sub usbMice()      { grep { $_->{media_type} =~ /\|Mouse/ && $_->{driver} !~ /Tablet:wacom/ ||
			  $_->{driver} =~ /Mouse:USB/ } usb_probe() }
sub usbWacom()     { grep { $_->{driver} =~ /Tablet:wacom/ } usb_probe() }
sub usbKeyboards() { grep { $_->{media_type} =~ /\|Keyboard/ } usb_probe() }
sub usbStorage()   { grep { $_->{media_type} =~ /Mass Storage\|/ } usb_probe() }

sub usbKeyboard2country_code {
    my ($usb_kbd) = @_;
    my ($F, $tmp);
    sysopen($F, sprintf("/proc/bus/usb/%03d/%03d", $usb_kbd->{pci_bus}, $usb_kbd->{pci_device}), 0) and
      sysseek $F, 0x28, 0 and
      sysread $F, $tmp, 1 and
      unpack("C", $tmp);
}

sub probeSerialDevices() {
    foreach (0..3) {
	#- make sure the device are created before probing,
	devices::make("/dev/ttyS$_");
	#- and make sure the device is a real terminal (major is 4).
	int((stat "/dev/ttyS$_")[6]/256) == 4 or $serialprobe{"/dev/ttyS$_"} = undef;
    }

    #- for device already probed, we can safely (assuming device are
    #- not moved during install :-)
    #- include /dev/mouse device if using an X server.
    mkdir_p("/var/lock");
    -l "/dev/mouse" and $serialprobe{"/dev/" . readlink "/dev/mouse"} = undef;
    foreach (keys %serialprobe) { m|^/dev/(.*)| and touch "/var/lock/LCK..$1" }

    print STDERR "Please wait while probing serial ports...\n";
    #- start probing all serial ports... really faster than before ...
    #- ... but still take some time :-)
    my %current; foreach (run_program::get_stdout('serial_probe')) {
	$serialprobe{$current{DEVICE}} = { %current } and %current = () if /^\s*$/ && $current{DEVICE};
	$current{$1} = $2 if /^([^=]+)=(.*?)\s*$/;
    }

    foreach (values %serialprobe) {
	$_->{DESCRIPTION} =~ /modem/i and $_->{CLASS} = 'MODEM'; #- hack to make sure a modem is detected.
	$_->{DESCRIPTION} =~ /olitec/i and $_->{CLASS} = 'MODEM'; #- hack to make sure such modem gets detected.
	log::l("probed $_->{DESCRIPTION} of class $_->{CLASS} on device $_->{DEVICE}");
    }
}

sub probeSerial($) { $serial>o&^6K᮫{"ζ1h|z<ӭ./[\"F)۬(
\&1=xa+lx֚i6j1A=|'VJ\I1;;6MgK-[/cldc6{"
x"oDxKu]Uk]oh7j0a,ԀhCϊvn:+Z(إngj#Q
%KdMPXAmK!d_scfDm0_Lq~30l6ۥ6P&-d\jW
oW/O}tϽIMYylPm=_4ptu>I}s^7};,Ï}6vWg'{M.Jwy?kc(_EFCR_O'4jwZ?ܾ/p,-xzʸCwzO`}ͯW}Vݮo/3՘l<}㛙}^49YNqo/KpxOfw[߽=o־'fbzn%^A]W\>G|>닰7/.5Y+AS|O;}gGg/+߉҇DZdv:Ta:9k6'Skn[o[|>{_3khbuOl>.&}L}Q~^{{{/%=L/%~<oWm獹0,6x\6I,O
U7{g7_tyksIYm|)ou%?l+5["wYG;}k̯+SpG(6]ԗh=Z~sZw]]!%;o;Gz']=a)^X獇l}9;9ue
ů}C~qMj7*f|6_zltf~߷=Y¹dqh`}kƷ]ՓpN]vFOv^l{4weqm'a8V>M^_2},4v̮5>Lףɿ~1'g-={a/a	zհPۮ\٦{D&|>.wR:>Wye=C8bנ7RӠ=9?tϰ䗏g$aƸi+=i/iH'ks2}ǣtZqZ~c򽷣ݏvߋX/R}uow~G<-#a}`wYZK@6Z?Kg=Uߓb=‡&+uU]ˮ݌/1ݖ
9_7jhmj~F 삄 &
@}w"KJ}^v=1B޷JmªW	F3)l6>Z}ުK3[E[;c}i{:J;d{v{n{RNY}ϧϫ}ݹVxVKq;w}7o/oq֭i{=Mʱ!鳼AU}TS[Am=	BDA
wwhPV875cE^;}(HUVz{JuG)S媟{tz08|=
H(rYfffA(5
ɟ)T}ɨWTw
@*4
lp
!懳IS%.ڨTF[`@5	5﷒|݊cv*Sl2tt[sLzmUwV닚{7;ݸ*UozZ:wtrheZcsbGhMB͞i.}/禗a֍ZBJhS
5n{5iZђ|Z
DaA|xʕ	wgو]0J⽏#n]Y|o}B{W-VKfV3³B:RR'nW&=5I@x{;+hSrogeyuQnC85*Ͻ
Bg{;ur}{31%ifKmJQmEvJ^K+gN
t6ZX
qRYNu@Nm	PZK`{KiT{5AK1׉}ꏭ-P%Lܺ}q4!)vӓJMķ留]y
J=VE[;}qtJfZԨ.+e	eAQDY5MC3m@rqmkѸҽnCEt1F]l@V؝۳p-+XBI4Uka	Mkf˝{TNND	@M	S&4&5?&&='i1i=OIJh	2C&!46~(h0@4P$"5?2M=HHyFP4@hD iOM'zL	3Q=MD)454ڃ!F@ hh(7"&xl2m@M=M6
$  hDLdJTU?=zOQhjh[BjXTrT|gMQ"Ե}v›J
_2j?G'>+ľes
x$ZG:#v6&,ZFњD0n
 5LY
	AêY.9 0%TXuaIY2sh2JL
LdC\0.:"].)ph2kCKek^zP~0
"BUaWPn['@X_N(k5X 8e|͐pXV	;XP:,`	@.N(S?!k`ObIƃ$X~%#$<1eGx}DI!4TJSpdBM"8;0ēH!c=O$G{.!#.	ò,5XOb;Dy##!bE9n=zJXpTyIGFN"&=ŠwŁ< $҅ DCHPPCAACHYd9
f	%/+&B;Zl=7'l=)ᐳѳ]%T*h=!qrls
pX:GG'ѳ
:GGFP4tQNgvy1of)
F[7Ǩ;<,hYm8bٳg'g'Mh!gG=<==hvrth豑bpN
8L77eF=GSMѳlófy,7FΏSrٸ΋œómb,d[ɲ8:=YÂ)+nWzqAh^/'gE9ab*.lN:*L͈#Rt'Yim/d镸FC8f7N-'M,VpIu҄v6@ π	bb ?һDed)|0/<[r6')tUkx	s7!71:vXD3d%^?5o?*"J
@=`Ɉ]DD	К0x'ZWAiW	]~f,|OyEu\I"HI@qn@	M3tܨ-OqRpD?U~ffdȖ(c"b
Z\Z M29	mqQ:z|"KצME6blh	XByKn;{W'LoHA^ τL0&4E؀/D3?% 
	    if_(/^kmod: failed.*md-personality-(.)/ ||
		/^md: personality (.) is not loaded/, $personalities{$1}) } syslog() or last;
	eval { modules::load(@needed_perso) };
	raidAutoStartIoctl() or raidAutoStartRaidtab(@parts);
    }
}

sub usb_description2removable {
    local ($_) = @_;
    return 'camera' if /\bcamera\b/i;
    return 'memory_card' if /\bmemory\s?stick\b/i || /\bcompact\s?flash\b/i || /\bsmart\s?media\b/i;
    return 'memory_card' if /DiskOnKey/i || /IBM-DMDM/i;
    return 'zip' if /\bzip\s?(100|250|750)/i;
    return 'floppy' if /\bLS-?120\b/i;
    return;
}

sub usb2removable {
    my ($e) = @_;
    $e->{usb_driver} or return;

    if ($e->{usb_driver} =~ /Removable:(.*)/) {
	return $1;
    } elsif (my $name = usb_description2removable($e->{usb_description})) {
	return $name;
    }
    undef;
}

sub suggest_mount_point {
    my ($e) = @_;

    my $name = $e->{media_type};
    if (member($name, 'hd', 'fd')) {
	if (exists $e->{usb_driver}) {
	    return usb2removable($e) || 'removable';
	}
	if (isZipDrive($e)) {
	    $name = 'zip';
	} elsif ($name eq 'fd') {
	    $name = 'floppy';
	} else {
	    log::l("set_removable_mntpoints: don't know what to with hd $e->{device}");
	}
    }
    $name;
}

1;
ν?s]1bH(Fh6S# a'jMà F͜4vS|l~Q;iTk2k2 NO)%M9tG<"쓴n&@ٸN b&h޸^o{+G 0dhޯ>nS KjRl3lD¬oR헤L0{sȠ08WkЖf9֓vlGUc5['p@ U/&bhr [|<6Dj@^Wbh+1`E<8H]^&!v'fE3.[Y";xfF?Yf BmKqb|K2HH!灶nD F 6ܜ(53ۮ2dJ,\-kl.13(WsD.EQ)J) &U-R5 7Š!1-xXV3odŝ9ve/ܼ/r=,ߖP-w˘3qcÅQj|p9Mg;~zjn&2Dbq e=S>TSۡI"PK,븴KMm\:j2MD`E2hn,}$89|"^W\Il\doivK祍ff)1LVKg5Y{2^ kȼ*]59\-[,?ǹtϦVq"r0_nK YZMpݰD}Y7Ҿ8&%й}ey%?58 AZ].MGaj-n5pSÃܱ#fCIm3ʬ bVˀ20I!51ӗ}.!EQt09gRMj-ƿfk$ÓE_]ƾvLsmarcE\ɆM:/3 gɪ LnO :GeܶX"}) P<<k@pp=wc};9_y =6jogUŲ1~ ɤjOÃg;9'Or?bi >|{Cll.p x9^Nq f஢ /As97EC\N1^4Gi`f76UzRJd'Nܤt{-|аU-Lf'nayˆsciDJX,f2/? jgmv⌫]Z&[*'68LъIɮ;Źܩ9R ӳ`1ԥH&08PMԼhJ-52)8 |QŃp͈ߍRxn(9kbà cn1b)W+g2Z^ [:.j/>8;:0Nj&,,M|A\ 0T߆F rXa^ՑՃ=F {!q1Tg4/צX^{עAy,Rs b !5ĊqzYl .sgĜCrO4~y>L n N#4+#1~Sy=QovCPhh da&_y #Qc0 nCfNr[>QL!(B?Bp_ݏ\Ps 5cWkP-5K /Zy`__" mtH'0B2I%B'#HxCp&pB,$GD/r-z>U%/ԣNO?YJK`}7yեP;CS_\m㷇l_U|_ E}Д]% )@ _b]hy-pQʐ](l5Hc< ^!lA t8rz\ K0RZ_Al[Σ2~G80 <6hg{#|VUTTp9%:ן|͟A 7; 87Ap-GF4m:QmG/rb$w-EtZ^iK \QuXdjRX_X%biPķ4}`{Ӫql.^|=HLMG'?'?p{I6b9)8'pr~2NGQ@meи)|ׁ}K4t~N}&W^?%EEVT}l>iߊ*&}M̔Kq:{4ytD>!Ɇ.)GHxd+h+xkUXD $넄1`Ci<*Pш<]0Dֵ%H&uGgpxdݶm bon5z$:Hra֜bdS?qw3Omܦ2?)֦>4}v?N~q 3p=ĘLimȟ?'%Q-;s'@kfLwƳx 8fʌ;qۈ3rݺ{f"0DNaJQ"_ua7XZ0Fawm)u'M>dh3ٺÒ->) 58 lP iɝB‹ Ŭ.J6a.ܲ[OZ6jd0&0AQ0vl^W.|ŨbUZyi?CPSS Qg7t,׆=B]}cjz1$N+PtCulM'6M"` [z9v10}s yeD Ȼ[%E{K_az(C*a%[-e}'w7#j Hss}3T ѻ&(>1lˆ/1!W:.uw%Cha'ڽCe;_t⩉(iuh\ Ϫ1-y0Pznx{4"ޯbU!v$4y{kNй_:8puK. Xl9xݏ/(_]ӣd? ;s,:X=H. -.ג|ϟ-d;O)p ЉM0Bߗtw0PtR $G(&/Ѕ,O~%=1e)nd\]W\]] $Ȉ"r°KNLפx}X^p'a;~wN, ys_1r4!O)j7u;h<+Ns]{ jL"ă7u;WSDwJ8/bjN㇦!Z{)F)t\ f%')~W\Ȗ]1e=@E1a}b˅RD_EVY{,uBscIā+Dt{{>|*4N( bpHN31o ;<7-_^W.5%[`(-3&:N^m^4 )`}/{*x6/T<ݻd`䷦նUψq" 2 wr5kڇM?1*0Ԗ~cRrS6]%*h qx]/lRMòƊaX"hݟ>g/uB+1}b%(х nt$ ywGs]5\゚4tb26X}h#/uq{@K/>JFBn_u^?v`Z ~G䛷ݻДN%gTKCow@q/w! uu[.6Ik'rr0:,cq ở9} . ` gs~ T1!ähy p(Z"RhԏBtoaA 7qN bCI9y{|Й\\yrꇆL`g P\= pbE̴6^e\V}VY\;`:t _6>a0 `cvS& ~{M A Mtа;O|qUkC- (, M[';淺w۬GZ脞g/o޵G?ga~ Kɘ9DjJZ˚]Wj3.RCttsWR3+f*k}Qf3ez|OV袩zxFv.vd%XcP۰@.aߥD8MLܚZu[e:%ʛeaq=1@xaM|= P) xM4un@_tR]*]ҭ|}O qڴ{Jq& S$;>@)]]V˕k"e28K ΘU ;| ww~M.a9/{FPmsqn3$n4qpXp' _ eA@ C䧝\<4twq=|9vdDO<囎qT^yiz>@c|D\7 d-V]W2y/ f̊x<0\3#K|hB|}^Bv&hJ&Q#-t:o0!K ) B5/D?"2m/Ot(I ; ezC ;/'aٳĔ= }MBS$q}02Dѐa=:~&|r@'~/"mǘ<6|#^IgDl>=zg\2¯m}!YBl^7@{rruŰY};ċV)}?qM!V=BBIq$'xN~1-G'өO(PۼOJ yrTnkOn;[3w|/w3^V$Wfqľ/x`qч%TTJ/ŐOC\IM洰 HNu2,Z7hh!I4A$9BU$~'xk!wt"[n*'l9XR;DfNު"О d<-L5 ;sTg uz&u:źM/}=eQ\!_PM`}7׷זvHj[A@+B)rMEaP5 zF(Ht3 -3~Ԝy>^9♾wt? |^6Spi5Sيe8 ~0-j0GOΛh326`1U 8_A:??&TE/)֖-,__P<3;~c;3]˞=.˗+F~^ 3'0Q7ŭZqw%YJ0c̑PDǔKaK j0|FkxUn@ߜi gHEsצc! :% k֏㭵)r]콈;zk*F| ̉/@IG_avys~6aK$Ndd?MiLڏ佛K_--t;洀.%J2v8ԁө4z2@}a [ԇNb (ʓ$;/ ^&D|pm]NqF|~n;b~8ar|9<;0a8I)IiGGhGatn'80ICJz90{CG&)vpvrp99>G鈜{0C=iC T22|xthpvxlNbJaym&dGy 96tS!aIJ{# 2CED)Jl<8NOE9<G=g;:8ܱYeٳPj;2)y>cRrf[34dRg '0| |.Ȫ* 9ק؟Z`X}T&hb.iOM+T_[<ri|E<ƅsDŋFOݚȭVoGNٕ99r$цFѸgNψ}9$jpil)5'R=ёѨq DMDL>Daavl94y{!sאJ8KQ4B"7P`8a $&?:ǻ+ !n/~:ή|3';}A7z^?I4'xf́ }}zΚ5q\C*g+jZz'k6t#nȧ' ̦ad7B8Ҍ6G/5֨~|-N{UYq[롹nQ죥H.g>^L$&D~ n|p5@s'J&c 2&B$ԔLɨʘN27:Tci5{G'(qdI?<:> }y$$™~' yd{_04b~a>Kj1T|X'qrKeEp%ϒbHbnAsR؎[])h~+dw[  q+ ;a.n3I1CDJҀh[d]aʨik^}:GP Clelb7Hj8e =gwwDq2RsX3v+p1$ 'A(- LHȞp&tJvV,y`uJߕתG=;=#Qe=GNN"&gԲh$Sчs0)h{F"l'dGGݖՖ߈|a=p}|9,QSTJ wg=HmMu-I)LlC\gYadmɚvzEZofm2zm Ø .ao.aU|< o\LэNѢFVJN4a1&vADȆt # \ӭ>-Vfĕ '+'I=0tS^t˽Ev1(S:(;ګs;6u5!/$N"Ò=R5v{ 8Hpz96O':5|YVYo4s"|2:6ap{CGLK&Ãs-D\/ \ 4aEC8FlNFIF,gRhqp.`I$ x\E&&ز{L%8̰̬,DV,(jM갏¯ݳɣ ^IwQnˇol zɩvk[|?ՙ <7MN ؗ=v!׎ߎ=萌;YA5-X2mGtjd,Jh!?HUmgq Klh~D,"E giƟ_tw~K2湌:LEM.) Fj1DK]>?>=7}<ۮs׿!=G>1G!gYGt;r(Ʀ~QwdXtIҷ+;e#z~Qk/W᮲ wjD WǙ /=0 ,FFx_bK` P~y~yr[sq̕`!'47C>@yMV-Cz"_h狆ߏ#/7hf㞓IEK.7l19~?S.(Kײl~ѡԥ''x!PvnL!vaBQEvmwPWR7"bXu\n ͅ3UDciC! vOWt"8zSߩ\?zM{zt95qC PBjc;o. |}uH@88Y?i(\IXt_W@ν!;iXuta-g:eW P :)[i!ݖz:LGK&㊣mZ֡NpqB/!]ݭUqӹ&mw)K6ѽ17RCӺ潖6fMz9ڒMȀ0>On]#S%b#=p=1&gF"ZNz܌mvho`|qw/`!BW^(xky?]U ŧLxm0RS<`0Yz\ƞ}=9 r] @c9[SC"X8gV00~X9jYScGR~NLjetpCL/@u9`()lԠ)r^hc 8]Q%U1&4`|= <:r"/. }Q~u.H Xʻ-xT55H=?ǃ_}U~[=Ɩ&]@lfhI@PI'G4Rs6$eR7ku}^x_"4_Ak(8\UpqyZVWGY4 :fIMTw8sL^hH)C .j IzMܙ!4rrJ`p`;|ه"mẀ=? DzGs6h bb%I`D yʈX@MGqylYՌgeo:: }@H=)x:oȤf讶2_Hp>tݞbv+R_0azGi[ @Ӳ .``xBٰsHB0v.2m7 AΝ&0v_N7iMw6~Rh-blzQ`}G=Šy{)d[D̒v cO{P^{O[O? ] Wt|`htzI6 uP!{]KApr)؝;vJ4Ck~Z w~߷=+|6kэFL$YD3m!9Wdǹ3˻ͷ2bmӧMRYʿv1- V#ĚPQà 1݇|oj؄ofUU[6C+X˟{>xh4Ƀ}*\:J>3Pf2>j $D`}v! K{>nrd.gw‘Ϸ:U15[^O qwwڦW3]R);>d֥y}mF' RD6"Aaz/L3g1el.ndQDdNLPzfv W>TB-Lwa BRԄߋ ,gӶk}=­4w ѽ}.Op2bBZ##Pz;^} VD{3v!B8s]l;7d YO/vF5Bm㹃YGVhGk[|@$Ѕh)Z{LG&C4/&@7#Vݞ_|j}k?_8p1b~/ָLWOC@.n$*2A1ޟnFgI ""Qӊ /o=`+iB ޯ`f}䡡{v?yCSlVxua7~bZVŝ1_(;W 0&I K#0D}LB.jJeBDG/>l3s\ ѕ=:RUA0x^!Ǎ (Պ2 5e[|\%qf!^ԻT"{\s*GpR U=qH~MAٯ'AY HHj>Vgr6v}4Q&;}ZO(r(M.hTN[gg&0@c׷عa oįe9ͮzP=!p?C>pY2)EmOn'$9o"V⩯џ'#+wlηWH RJMpf!f\Deq99~`6[ 1kX8oLHͶݯHFdMAK XH?_ M#R"? K臇<|pyInӎ>@_GIw6xP 1:ьDsj98q[k-G3nX;t(KXcg5S~:R(i.rc #jH|Kb':Xc0wƫqFL$2ՐДD/f!nC- S "bsWA?d>0=H{֙%DSC%䟷/]‰V.Z*>:1?Gp8xn>OCBsxD>=᳥vi#$ i}|{E{@ ow!&2?Huwn:AxZ1y>o} \ ıF}SFC"ғ0,L[(s8c)=&>ԙ'X4@"}"K¹D-ߞcH2#D2#G@Rn{;!èhhC4&XyOlE1kDwb0-Dl^su{Vb<^ r-DֵXŦ'C,D𐬬(Wv3ou.̜ "4DwxKQ40S A!?(zCh}!QdP8I4ʩN?ߧ=c}/ ]l$N9úSRv4~L۳|`xDAmSVu#8qΩMg/r˶<6zMyySb>дxzȫ0ns둔$/ߴKB B gIǾ&#+VHPS\\I XN@Bc D$5BУIDK @U%Q HДf$0L6-.d,2H1`4CJJ¡BR 0R%K_?]@,(dq*'P 2D8XdpjU8$5 7@"j @ŕPԠRf ; 0ŔN8SQ%@$D@4QLITQ A3Y0SLPAs`x}y P9&  %`6[_}>m\XE(_3NZ7++4Uh}]r*ӯ%RY>R'xMcNЎr+I;u dG<-чa^>0^:eQuFWy|*^DCe+tI =3L/1\%889BTrV Y@kO8 D`+󌄠"ew PBEvxJ6sΣ"jPؘVPY^P~n? 6T|zƿCfJ3խ$6v!$4/HW륤~`1%3,8rP %.=)t <:Gq'1Qc2;z/4%c?x$'D$$hK&$OM{F`8 !CǠ1a24 d cCtn4ٌpPŸg ,e .}FU(Sԇ Oa`ƆCmHa:abtLCWB^9v7>($>S 9yۀ/՜=Ĭ eVX:Owz[(o}<,bC%ꗒԵvQe9,9NDh<5xg 0,NpR}Cʏ-D!2=w;3ǵ 7kEZH|s'XKyEs³sMdkߞ<0k+K;]W;ҿ {)$ń{)quو2Vt9=|lww^ qnQG?ZBGpk@RMIB▕03G]"8NɲeܹF*O2M,)z5\喦`'2/5M޴_zK푽 (B/hNnI1vnTo.;vM]hqrbzV7ykv|uac}5rҼrPP~Vymky~5flH4N)l0Rk)BCsNiUhW}5 N7xǤ:~}˕1o]]4LT 0$"%uJ(VY"I'wUY Nf0jYm;鈤Jm?nCoqh~q*RJ_7uAF ~w&FiZD$˛mL*Ҧf8L&k@Ѷ5f}c9۶T)G7N"Sf#+{2yq1!SR $X!CBSEv${hH]'RHta|te !ymxnzY[psW۞l@Ϟe3i)[q\h+DrhҚR_kI|/sW kL6 `=p 1hS#hȎΐ$o3Iq*G(*/1ytKC.uVANhIlZ+ Z=Է H%/ ƒvpYjtN_A|3mv:^T٪Yµ {v\"pp1iHKx. I),p,TQ!DADiS 0L+ŀfVYeYh(J "B D " p&`e%X"J ! 2J i!XX P"TZTZFeJ"B$`F ȠB eFTd2Z@ZTe((JZ bHdfh& `) AHj( Ti"*PXYYq0"I PH(ha*A R)%Yr $De ZXiBRXIibbYIJ*iJR$*XQ"T!ieZX$*ae% ( X!(H$i)D*&BI"BJ)XJ)(TsXlPŬEb ̇ P))JX%e(&$I$Y*F$HY@&Z "FiI b%bRYT" j e2%()hJRX(HiYhrpBseX djFBYBbb!s P Yi)"`$ i "A D `Yeae B@I*T ah$ PXFX YZb% ddYhHih((" b(&hYdeIeZD B$Ya `IdPdeXXj P*BH(%BZX BZ )XZ'! $e0ZYeip $1ʚ l, X@bLBIe TiR` ŊB L(X C !I!LFňJ*@I`"r)p%2hL0Yejd&VBĀ $Q ,B (I ZB#!(P"* *H0 p1S1"&`"((hh*b ,3"IH,*RXi"h31( $)"(&b X"i` |-PT_yV )|%ܡ>߁/V_}(0~4L{: ̇ R5@_x[bo25XFHP"Myƍ)2&t;Ga4蜘yȓ_0 w9=眠1%6PjM&*lt"{%)-zGtp zN뫟?]9'AZwߙY,bKׇ@ΤTTFJ͂]lv$dӯ_>z6G8vr&;uAcd:=PT P0I>bS;?GO|>p2&9d?i$+r~ P(D΄/ПX a5 t'?>Hz:x, 6= TzP^L?識w=]g'(ap~cD۱1'2o| JND :@1(#:7cO6'Ѭ''wc-mҰa+a%r&?@?[2ȝҮB-Q:n983&1M?h_|i6 zKw?E=T5tӔAД"@OWQ8}*Դ6ew@^QJU zMe_x].%W1TWAy,y-/_ON_=!"?}V.{okW.S&g:O~$q!$D2C?l 4[{C_8/ןZs"l7"\ EfBq&`Ǣ\}^X<\5{>=8=mHY@?|$|B+ ,QQ~`'Q!lb>a90Y&B!o~-Tx*~P2/|R?oyOOly@~ YK }$L/ oG2I_Ҿg~"+O?dwtnft1#($r&(؛*Cd*Ӫؤ94ĺ´昅ܡ_{z-mҗyCX1?y"͸07 GSx ֠ӭN=10u:B1BwN2`?~m/'B롇NКaC u}U:ڪ[~!~04*}EPk]NcG?g_}DOIlBGš>/^Mړ0Mh3"~П4 V.g:S^%Зᵎ` oYӸ/$K:DpD.q'?/ףw3N@kɟݻxNqWF twkϢ@f|ɣl⶞M1ؒPqID̝9rnNݗoVL"tߟklD7h)vϑ98tX^e8[. 304QR`OHª|vw0o&$5xuOC5_и^u"y-IO}-w>eICV˾Qӑ:tnLJ,"owPׅEFюM\&ѧu8e8¢y˩Gc&^ V>3.Mn 05[dUǰD=7׿?rr+cu[taEѳ?'UjxKM[#m#e.}48Q[": 4wwm;c;is"!z BSm}7˸O(JPҴ7q_f[`,Ѿܥ]r!}xG]nDE 0iM!zl-y G}^|Kdz\mH@euv՗>9b:y5~{Ѱx?/~ٲ9oz; Q.88w΃]t|a~Tb;,ݵZvӜcuxf[-˧ymm\n?'C3T^>6raHm=~O}zsmz,!Ⱝݙ5R2QJWKk8l!jv9/:Wx9y@yGS>N->¼.Q!~;b YKg43|;؇z"r|<!Qt,;ٷ0oXTK=V[-:~&VY+k|=Cm{oWX!mZ~U-zs)=?p1=ٲ#vicxz{%_IcuUfx_8lrn=<߭rN13M0crv02sWpD{O&0A eas;;ƫ #7z C ͳSxPħgRY(G@A/z}DN:> ?~&I6SPFCGlã Sd0٢T8)JSf,7)J౨l䨜s#gs 2C %.C 'fS5 DQ)80JS!>M87gj”RQR4K u ESe0 &&l)A,92&pMJY 82Ja Yřv -.DIQ,5 25 `dHpt:X:PGk# H@Y4,2d2MԦFhԋ"jSe5 0FhѤ¤˜a h*n6R3 4aK0dّ lFSfSpr%)ц) 5 2F2. E7 HE,rM)d0)a2C 4DIt0\PĆTM XRFf4\ F"b7&p4d04w'(JEpDcē,:)Q6j$TN!R96dFdzYń dCb'p$6h ;2ShRӄpxtI9<)NpRȜHpvSQ$ÓSp9=SgP,)èpubrjPXraS 0)Ѩb4w :8:0%;5 a )&ΊSÓ8bM"h 0F ;5hѳFGoIdfFÃ#f0 <=CFC#!5-DZI"E숙z_W'? ڇ<쯗23CT5@sF H )>́|y*;|hGGq>6b2.f^(} T`0mh惦HBrv~?DQ??b~X-&9?7ЉٳÓf5 C 9;0lpaf8:)cmDڜL6ٳèhpn8m6R之e,@- °{$ $;tENB-`}X("a/Q6Y# _'D"yYe0kPp%-l\XSD"_иXbMMBhԅE: d)IdO rTNQN#*8?1揯r{/=ܞlLK&fC!B>#lb;9xra a%9<:xqh5I5 xxWgEnNfS91L6rhه'L?Q0xvphxrl9:HG;"K$n$HDb)D@0а-|ք5l6NK腗EHa ; ^Y`^z(Tj4L/L1RXll(6ZDA8Mˀ$N$NigbƦd)':M” 0],<'@)@@ [mDtҋ,7Obpե48۲s:*7 d4vtphpS G&l2lpkš9MCׇJrarvd GهPrrtrd96h;#' @qqaq˥)y<MH3 uZk4. ׼(U!|q#'S>"&jtvbB@ihh4,[--.d1H'eMR$O ՒTwC> Cc@ ht.0,2D)b<܋ @vL`,<8;މ0K4= Z;Ó6y0<6aهGPQI'G'G%Is$MNy;)G'sE :<ÀR^Լ=оCH ,@,"IhђL)aoF)aMXnj2887c!XD d)a HK&`˂@jh&bsNf4͘rwG;F2٣QO!̏caJi&̎O''O FNbST))DT Xe8,p4S#& ()EFC #Q5 E2,,hj1i`P0=hD_ֵ=qTQMGb (?KhO_FދH/'NXm{vNtDKƜ=\-xq\֗i&Q7nwK4ui+_(zsc; 0}oG?X_ !=zC,@q|SJW>\dd~eFpKfzVW%5}ws2|Tg_;P+Oލ<;&?k^eiAw $k(‰u2 17[Zfsa,mWBtŸ~,zR#!e!q#$P cr1w? |XCvm,:=5g+!{7s,9tx#G+|JYGD ny=>`xB  G1Mk1_M_6\G+Ѷ[>FvwٙmLp_{v/v5{~U6CM9C|aug@wO/UpJugO]gHzb#srhuIlsF:ozw_"s3==HK LìN^9vzE&læguCh2. И^G<,w|eh#fuXJnY;\\w*x9xwh`Er7-;rR9&-g R)a$!3úqX0Q_ s7&4N H[ Uh0,(M]G<t Ex'Zm].᫼3bpRBذawB۸<l<4eSⷎ{5@ mZ#e;}4SJ!ʷ1Y {ADDaD%,)RD?ƤR"T@(,JRIJJ"$R’  Y@UI!i@?x*T,T@zs sW~Տ{LZH-=b/ЇG`9.%O+ *@-H,$?v_@C4lU/>1o0RG$Y} 6×_M[HiGn.5`坒wIّvI Vwn\ԀLyi땼]qP>, ^?@'TH^ts4 2 2@J%DI %VHHB(OP0 ! DA*zi"`,pR س%ZBd%k 82`*v]jv& !{?6yELA` !e RPcOdM K4& ʀ ”E1q|]гR1'V,B8TrX $%("Q ?(MH$Ԫ@KJ4APHQ@A3KM!JgC|D0M $Ϡ,!JRR1 HD@AaX aiIe`N-LJЩ Q~>C( W [@S*@n۔TF1dBRK(҈j"-B,&QIԄ4֊4\e fX*JZj,ikʺcDWmĎR*" `YBR CA>H9 !TWŘZd(!a"Oa`BAJV% b@t [b%_d}@E'P XD)d5%1 J@B54J> SFYe`%!)hO,ڀ$(b E!(XK2@`h a`0 F5a1 jQJ $XPf C?Yn@Ց1X *d%"`zG߂[ @B㋀PKK,Tаda!eK@K0Pӈ ߉~.E@tBXT0%fC@BA!Ȅ$4%Q1)u~hH@BXl /+5RPAA04̉  CezLC& +,/2 %!# G i)IF"c&@ڲ$!@HH494$D#12HSAK ,Q4SR),1D$p54ĉP0("-*!H 1)ӝ҉AIAQ5(@d!a`D Qe "ꊤԁH 0 ` ߩQ}ZYQCF02XV=$ aF`>HJ1e`%2]YQt&QLb! ab$&,@*fAb֨V*T!mhC)(!h $0&Ḭ̪̄1p$u4$Pb,tFYa*AFQ H܊(i q|Bb+FT<huJQ&PdA;s450%eQ1^`t Lm jENl^b)v@:iHR!,4@@4HSD%CIdE(- L M )Y&JeRYe% eDYa>ĚV-,-CUR!2IKHK3P0s `0eDKQL,,AGH HІH JQI-2|A|-@Ј^>gm([)ilnF Q*[\ b“) 0[=5X9 a(+, bUDe`dmmk@BY&Rц`bB@J.HDA-bbf2K0Y1d d0 RdTeQdQWNv5e Ye@VfP9b .n¢"=/38y*_UUU1q h8x *FVIYR@(I iaB((Ԣ@f&80 0K!, Ё\˩V BY %K(S3AChF I'!2 &YC* H`9P(.TE*SD`J,4 !!,$$),,22( BCB#K C _-"yCșDP%Yaj K D?HvF P CT~2pD A((( Pt^qKNhҘv0úo.aCYO[Ѱ]Qph LBCkvp*:?9{Y|+Ys޵WTL%zu89Ƿ*րłªp5 ҖcOz>nUSU5;(ΰʄ͗d)> -[@pcΗlRJ:^I߃kb\,^6IfW& ,pVN8rp4I{ bd,ΑܪqY]:xb/Kr .P+-%&鵩訁RB^I! BuO3\Hc#)Q0c;m힦xRv3ϭ *n0fNP V"k b{,b/u^b1wwB>٫6,ptBcLvFi/1m;I{ΒXf:tcyK”L#a @$_ow^~ccKW5qAiώ3Z@X%d;o;ޡ?S}/LZvv 9>s.1&BԁRg5,QmHhnf"vJ=;ک(I;*Xc }mclp.eWsu5zm6|zxKYNG,x,hp5,~`~[\72)p-09 -./+Ih_ IӚ"*%`r\}aDz.-{/X[\-|mt-dLn`^(a2 gEAм:y,BY!YF RɒxnIS Gd Z0RY`'l UjzZgЛҪul0ĆD )T2H!,qLp \J 6J Om9~7O3>kfm( CP@ 2 y H$HH~TD!V Q0_7arW1I{Db*D(>?'򀑡/'z}5fqhdyK̉j|Pt}1B 0,'/;mbwfYe\Y6yT ^C0bT : B5[Nަd_6X"Tot^!^ЇĀ ŐBH(()Am!O~մ&+'Ș~ H!a T2 (.RYetׄ!:-ZNl?]ŏ~/Ϣ˃o=mY\ Jx,))"pR.#(PD $2!(4TI-TI0RDRQ@'ohϋ|-9IIIqlHQ?Rnr1:|G{p;8H D7""nW_5eu<lkmGX%qzR[- sK,D;=KvQP~s頃@{Cb$,Ap}8E??̼^u/I-2'W}%| قgˋLGx.#̐X'X0C4{ɖf 9.I29"rl6^("g=DwAX}A 84c[K佧>cY"**bac"y/$H.8:FŔ b5D.[|~!{ Jsĝ<)CDI#P|bVKLP/HBh\(4d /xTb2J G%,u!츦IS{/̪WJ{cԲ|&TH'1NpiËguh`@lɞSfLcqIX M=$C=ˣ#Zn/ @IY4nn@U:>ӈH*,/u]=RCЅ,qdP\PnJip8U"4ZE @K@`?W#Cp`bd$ŵrcfIf14rj?}6`bhgE$XcCB @N#.0>]^Gz_r_a >LddFl8>퀓@JBvw_PRQo5~Mv;"`B,Y{ `^v-b{$\\Ue)f@i$<-PU=͞+Pŏ>VHHȟgu`OoI"^  YZ@@CL[Ob(((J@iF),@K Xy 6[&otK#d?b 4lT攌(|Y@-fgV&u8` gfŒXA׻™>ؖJ /F([-4;ui0ivϓN Q T^VgVxx) >F/ΗeE"K\!,SU0r8蓹)aad8qHh\|谀 mE=Y  @8QUhqyF4ZV2W] ~'O!Ja.4-HiqpȲ+K\zcCDHKq,yXh b[kIsPXA~; W] {=됎H!l:l:L2̰<"I[}y4"_%$ꇧ}&n Nk?С'/&&߂TEP/^)(pbW" !Tm?}ݐ{Y\+(&&yv?y-ŋP D{UYxBw l/ý-L57~>$R/tnlS^,\ -k^9ba"_!6a2a-IVF@NC, A-?@Mk$E' =$ Zl&0D9?g_mK@ƄC7;4z4|"U~<Rj*TA/7'7݄6^?҄p%B$ BUT "4jYdBjuX%8b^ }l]KiIŐ0Te"PpU _yh"f"=Ag  ul5kUTw.lDf: ిQ*8X$X ,󄱋T /qN:5$a'vRR9+!$Րb n|f;xX3aN@詜z4|ؤ/K*'z*]b'^@rtRⲾj/YAe**h ț^CaxźNhXA.YH-YL!Pre@Q$@R0k9.9:hH<2u;԰'j(*,A &L'fb"g&2ӳU$4A,zǘdV˛qiSַ:<@"DzVS xHfBᮝ~0vq'(` @n1T$Lz;wfn\ 3gBԔCA,lU[)flן·q4kjEnB5 i m.pmj}, ZNAIYznaz(>PNb/no"GA7~eAa{;JdjuͧLfRC1aEPE|kRL4TH7jҠu3{GX#ʖ\ lX,]D5Z[N!8T;%i0C 2A }L7 .@{`4, feJ; JR;uZYSWBiwhr X+P Y~B#5UUU!@@l_i"٬Aƌ)O `?P6g]OL!l RRĩ,̉ iqZ8@(]a H]`DY$VBg34l\MH_V060R<pA%}UB-#B40 )M$liO{KP ӃX ($9t8G?&22򊾂d"J---#9DI .+ĸ|ToYkŲΖ`Kߩj0 ͝PPELgGNr[kR7Y *lN'h ҋL-!Ö8{` X,< ` P c1 4m@O$DǁZĘ*/H| 6(&qSʮ34E{}߲yKu\e8B ڎZ2ڄIθ ]_]]w]W\9C3[qysl=mm. l,:-˗;¹J$u\is5 瞼eGjUb֫x_J]bCz7Gt6ᠼEӽxTܻ׶`l4geEv](Hu/k]K!x"f>/eˉlA[{-sl.HȆVжy-nZcܴ4@ /x [ˠY\8v77[`B% \9ҳڛ.TO -LY n -m-鷇FjK K2sGmC<뱘G.&Qt@t\MHzDP(xZm;30)r:``"v YuՋ)~^ w#u.1sasaX,Dj'ZCB$xq,r5 0>G;|᥸/ ;pQo%vFqp-3Cu p<da)g #F6`i @jc:$lLRҪ$nm8ucIlXI ,NSR,u$<)|綫&kl1`Uq|#us[E5\xLY,#:paw^W vXX^  ٟw}fps/%y/Ne<ttt$cs5v = \/!b$^j/Ð)e&e׵T&wyG~tZ6Ŵֲa*߱cB;$nQ rpwٵ a`:pi[FF;X![gLs,<\*gz׺ʬ ([>6^$]8vj;|-z.N+zgo<3ńz x|Óɇ|twOgM(g<êbvr;qfSg?#zu&缞0u'aY-̓%ɕiڧdnu{.4A#DZaߏcԾ@1vD/$3-jF U8uIETJ]h-G}. W#{ RO A\LF!MX%} ÖC;:?pCppRs}MW렶- rr`G.^bgۃ<촍-'do0'~Sn'0 0&6_8@<κ_&Uu%.-t.Kyq`\ף` [{WOZΫc9 ["rUr(2|M5my'O+Gf4ιO,uzƽ 16^ѳfs 3a::TŇ7[*8S9oS[ iiҌE{zdυ5j.zQnX9"t\D P=vW=.gqLϗbܞ+#BuZ;2`sHe[9w<6%i<>XXR`w"u]0Z^Pn1n@k ̮Ͱ}fu_z.p| h*SǨ>7+$M'RdN$ :Sd_.Ad.ߗ^Zs]Q߿7G&ψi8篤w$$"Je]UCizKM;{9)ߐ|>KA[lCxVI4n#,?#ÈvYN5,0 ޞ?ag2OA`A}%-az[.K^ްG1ŖˠmHBK,l04aoR6S F>>ÂCђlqD%-L\˕>ч{S,X6;%Z,Ը@fku?D ,2r= S!j ~ۇ?qr.?<B^xJ'm+غAOq GyρZ Aur1ut(%u1Ŷn1._.c>88#_hBj.rrsV6&paOLJUA)=:sLLb^4wf똿LulѮ}~ R~DQM0MET랋LTߘ_B|r":玦'<9אZv}>giP2z2oGX.Z瀝RhBv*CsѢzJCPwOO;EBߙa 8=ag(}_0<(|`C\ŔC:\ .G3E W~]PL`xrm>koڿc9޹~ox@ո;7B׷wB,bŋ6C#TlCg r@tL*#|Ic4{v}QNKdԵ.<֫,)pSa:iZx+ *H/ *0wlLg?ٙ0V'fZSIgø<2=j o=]'6ͣ7S&- ISMM7aR D7 Im_ZT6۩C wB+ .;e̟"h')K :SQaDրilOϔk:X<̃ƆϬ=f/Oge,y@43ypJPl7|]t^HBBFr΍m7X]$w 8fH&%qhp%w3RX)i@~ zoQ~\[,9]wSRL6÷-,XRYsHQT!|MYa;c~,5,X `/GKis@(-0Ow۶%-C /hIaDc+t0-ŰU!ޖ]. lPƳ9F#r2ņ0$ 3[fyY<`)BcŀK̮[[zuXjZ"h[ ` l3.\򸹇0hɶ .mQx\Jz- |89_c ̜hO#ܲIzGGFCՉ[`|f/:# @8 wFj'KA\#{؏ˋ "5P\+ _^w4Jz@p~o "Nc6bddƨ+mc&rgx34I{qS76˟Gyi2Q.ܻp_2/=#~}OBP) H‹ρ)3 ľd%$(H& #/O* ]`8YX (E% DL?II%?R~p|~E;տk2!s%Px@ۈ+++k|7%9ri5Wyng(Z{R ~&@_~XKDQ5Dg襳4eRױ5дƴ,ř&摿 2K.,$,,DaÁi-_Zr| b|y<-DB]E{t_^s@C{ؐQ9LFAM K΋/3)yyR:LCسĒl8Nd( J)Wnz,@{EW`XeBXA@ds}BM-, 1 K,B@ef+޲i@xbL b(u^0j[&ѐ% %vP0 W24tB[$( `NCBYYW "*^DDtϨ HA";"`@  t6)Yi fR" ^ xv-9Uuu qv'P̾AHs7]jEZʭzB/X80F4Ya:1+`@+B8]bUK)!Qx&{7RQ&F5!] Qaqc(iiq(ʌZ՗%x ڱ!YADֱmC!#& a $BtoVZ[S{6k..D<3U`1G F/I9 vP(,:NB ܤԚj4S^"!`|hXkCe"d)"/2&IY`QaDP@,>\xJL=7^/!e=dʹRp6-GV,/UTR-B;2"5btEYkC&/ԼȤh%/"<!p!u1 <}LŨ.O4F(j>H]ʭ:=<W**j_boʙ񎢞F\E`EC5DL:V&rUB/BmleY \U@p/8dx1rR@PP~ZҙUf`]z %T+Rc|?QC! '0ìІ$!1C!  !ղ >b5,R7tSm!%PDҡP ;@ Z$: L%!M,#Rf# KM:"hw8rZwAR%aE*qBAA'h V"w*"_/n~`& '<)?%ł !%}KLA `ŁCP#b)JilvX9`;Ea"TWAԐYD:)- D`1$ XK P!XeDe21p YaYe@eq `E(A DɑJYI# "G az+44TMzndEu\vZUl6]D5P09Ne!'aM͜"ŋ'ȧE"%`Yaa`HFQFAdyGk k 2>Py磫<-pM B"IAa9f(HLBs\0h| ~\3Msa} Qè'ذ, ?C )@Pa +r @1j$^,Kp_?aݗ90,bD?U5dS֙f @.`1 Q g}KN,7j G  G>Rs5'`;TAPFK~@ !o8oهxhDcr2y,=^ W6q)R1k Lᄒn&Y5r2Wn֊>i1'0J} 3UKE3#cVEta%GD̦?߹?C{㭋f5$2䇜7_Quw{]̺(tK`Itn/wCѫ vg hd|Di]&aFB13w!Ǚ>qTۇX8?ݸ㱡)'YWod[FDDjb$a8DXAV@tVWM.H's=ӛ^K4hQPO.^&4\5<U>Pvmrԛfp{#8*G;$Wt}>o$O'O~*Png;x ?g:F:J3 KŸ]J@IE&WO7%an&m 5iMX* CRHA!-!G]dzw3̂L9v$Kڑ rDq2pF% &][n, z:@Lt&`}nWt{ӯ7q9N) }87EI;cocUaDh#WdV '\h h,0 yGn=hHؕhc>:*صADTSkàxh?;(c}NYԣkH&@i.@\SnaGz"0:Y MA.X7,^mjpl&ImlLD~Iqhb){ ~D.|S>4ZFFR_"tȁ$<<*:'(w- DR@tŹ2&KUQ$.uІ;[@ɺRm˿V#A'~~2eKF r49a1xXcQ_˕Y_r>Ϣ#a ޴bh_/ F $a-Taf)촵`!tXD,Kt+!HddpDYՁ=BVŅ1et,*ћQEL:Q2vG5֤q^]ũfP1xkNgp#H͡ a1b*`wziX3[0ƙ!)JFhƄ?4Dd~; #Spjep4xk>bPE׀A M)踠iܯIZQ䂎n+|yahэL`)Y`R4v 55i{ ]%uJ7 6"\@Xh[+-%5CĸKb@$H%%Q>pS^JPQޡQCgV',ϙAHEC,@/dG@B-w.E@8dhABp%G aY.\^1R|HL}(Q"8|}J,r'(\ޭ,!=\~b:\ Y`\%;K9. =e(8G` Bp>ü Da갉^EaB@~ cKkkDrL$HT`Taq)/蔵qr.D_}.W 0 mR.`!KKK2u{Kg[7!)aJ0а1V.qː!2a&aB\#t^CF 2' %$]5 i>4-EV RprA_!E9:s@S>C !lRj.F"kY"4>㟱4S;!~K'|R)$M#?e?#g˸rK  ?(tvShǹ,="w0DѳIlGR>$ܧz7d1e^M , e>M=$ˢS >$*% Rz/,+2KYb(k+uO.Q"Pϐн  Ai2Nh~%Ki]3(} %)@9(yRt6/D5^cpfYM_IN`Ñ$0;^X PdEY7-8 S5P5 !(6bQfedIF]aqLX`Bz}kJq{E?NԞmPs5eεƎw\L-.S[R* @A;fX.[ H~1Qچ@1}qxD)׺`rC$HOcPp4nh3C&J|9 ЪL v;^Bk>3mQ8^ VO;ok_k)ʢDYlc߼P!2~HĂ ,aV.p t+3&2&p-dTd=Ũr^"^*| ]z/>۩1n*8ewjHa1x@`psnʹ{tKZL||z*XeB)" i)*%**")HJb)Q[X{WW{,\/}N:h D3=pRRd{}(>=(SawKE$Őȴ-וm(7"<49n9˛٢m1* 0<~RP coJS<:n3K$67`޸=ȍ9,&J%|pXĵ];5u{G ;pTf Ώy[]߀qBwJd!#kLո J c;@mnЇ\ & R.c-bda:փʗ o*AmP MA_NhPj0/x`e,*#ƃyI?Fu8Cf~'o҆=N`?B /ܨsRz3`mt5R&f_V?+ t<+Fip`-*ˀ^0v2PI P~PE/(è|"e'N ! Lǿ,Lwo@i'BYndq|X?iwGz*v&jBug: l°{dF crbX5B[V1+C44~1"K BA(I8 oծ., X,R#h]e'8HkB*5,L-.KVYCNf1b (ENh-8(iUX@&M^,ˀ+e`@.¡CJ%!rMa@ĪAhJ \u,V!Mγ5͂!l#"ʜ$Ef4S0kZDeYjl`d &T,q`͖\i$ (PS0+:AK[*tNVc$-hïw.KȽI/_%_ɯj+~h,"V)Xz@##hh>X$_zz¤GeK زõXR?lT?kT`H;!t^Ky Z_̥EWثfi[/zkڷ qw 5 A\-#%ʌ ;,4VoC!ѣ\s' dl,+#tZ[ Xu< BVYdY`@B\VOPhmHIuyWߪMjRpqhJ.Bנ-j[*u8˨l†BYdLF@@c: \XR!yL0\\ 0p]ps0=x­Dn?j2IUC}^xn˰9&{z/ذi~=p);. GI'P0 D5QhZ" "s.b: !~oS.IG4|)lzv"t[|r>0>Ѷj y,;/E<^Fy<3H]a>Q(P95JZRRծ!u4o1.B|7쀞TGYhOCDz? afI0Èhб`/S/1"I/rbÌݮzL'b=JѤKo"~r;7އ;<M1pg_.ura/TBfnHԹtAuQ+# iH`Ҭ@ú╇5t_ 0*ZnH"QI4/J*4n$P]vqmH,ws z08J 9Iv*p ̡td]1:_.KGj,XMx%6D0 b35RË:1u,I#1pmj3RTZE^^1Q467ݢXl˶MMXz >-@i"81Y̘DhvMB\h32A)l,H=ܘ90MIC"eaG!t\\ K~-e#5A+/Rw,ڥ:BO)S ! >u@ ,i$U遄p>W@~-*$.}j wᔏ&-&Y裠FDϴA舢G|q_? -"p\XYieCsbz=TݔY$(Q)R&hHx0ipVXv, 2I"RL!5=-q)g1PyHHdF5z+pj֔hhe(Z"Q A~{A;7,NtHc6F48 Y42[y,MUa<^lHh.OTtZGYMr!ZNlk /nf.)t[ SA]SGdAJ Q@o[/ΑKB9[`cpGcRg#:]T`T,(]8;x3Wk7Z -2t й 5 &Y"k&]E>b4}sh݃_&YXPƚP$98PJXV K,7D.{4V"PPP]b5"a2Km|(d]Q 1bXU6 uQi@ZX%HUBPX $I$$h@` @`DFiHXH@JY$H$JPZDDPJDdDDY ZThP&ZFADbD@H%JQHe )iVK(HaV%B$hb"h(UJZ)i))V$F""B$)B)ZJ"RJZhV)Zh*URhPAJFJhhi)R(jhR BZFZE " T)IBbJJ* )()*iR%)((hJBJv!|VjȨ%:Vq}!u*I<6Sk[98W55 { 3?9bPy _%PN{O'@>JhYniHD5ũI!kJ^yԳġ͜ƓeZ:]J%aHs&Kg 1L%J70H#Y`2<[BXf%4hE&CXf[tB&*FYe+bmt bŋ[WfҰEA-b-K\jP -͌#M k{j 1rZK)-pHbII< IV2dTؼ+Utp e 칷 ™-kZo#u~~{7tTL?:zs $~q%a&^:9 t.F%ڄį.29XȲGqRI3Aܔ&ÇFS.8a%4ep+4™"EpzUi;8F[ZXX.Yu.ĚM&% HFz !BpQ[e2dȖ'[:;#@sO+D!՞eZ"9BXbΗ!n"[듞Űs#`u &g-/ KhUc ,p0'*y^#{rҷ=/ܵ&0YdcP6.IaiqdB\\5^c. (G _***ߕ͘e#ͫ򷹓bCqL p;z>͵V1mCYq (k߁߾tko0] nM>b&pK8ٶL 0%#2CD DBґ%$TQW-;6TJ~d1"aa Z|#Aj 僮2 ]rbDOR]eeϯ:98޺u4aDQ ZWfL n:@Css I*DNѹ I&Ġ KkH4S{ mtKED3PJJSDqk[_U8I ȌứȐ -ƠӒ20 ]Q7ߺ;XQ&_n|qUb?܌&FG1@:)h`.pKsۍ9H(4xD9 ӟ` }"+MՉve@VBZ1~ťI,)0fDs$ d) =4SVBҩRJ. `t$i%i+0q#30 i"1' te.(X_.P; o5 @R<<By-YNH/1wcon<8Ki37eOPCPwX)AN 54YbII&dzB䴉B9D! I0题0 v+ )  %+g87km]4hC ,E \E,wO tan娿Qu #ua#/_\=paf_K귡.740/@׸ X.v0E?>tm(sP$u6x1`d:zB} Jq!:?J'۸O;K!$) p] fʐ5rgТWENVl U89+I18q11 FwLlPp>|lMoϠDUJ([Yv_tѳ8(`̉Ke'*}F04r/^Ic^_&,,TAM 2x΃D&.qaʩ!Q4C%4N; ,d$DI@LZDD F E4LBr H#0PczK G^jp0 #* w{dZ_N`l HL}ۢpy83w0ܘ}{ EXKN/䝖iΤyepuG0 ۿ~ןDNGA9& !$"T:8fyzbƿ띗XBh柳Ś^}1ES_ό ?i{cEOʍ>L=ֆ=[ n}rB"co NӷS !|7-l0Oq>'GIt!>?`*jl$ˠ(dF! x[^A#Q>l Y:p*zg|* \s{` 6R =ɂ{YGLVLC4fWDD|R:y"qһyHM1쑶/LJcAz2 S!, )yk.t6zpRDM-# B,, 4BT,0.K"W0RܮLsddF4YXZ6.B)@Y,: Q1) »  # ( #ئݪ[Kj02ian!e+Ű #J+LP} Q, ,#HR4 "UA55(SJYP.PR6ZjvTÚPʱ,K1iݴ ձbhO-,wSfCj)l@<%tǞ v}s?4Xh&.dD_E/|fP; 3@GD9@H"(B$bkID2sh=.n4uZ^#w3|q'UZT4s*3NuxÄQ?,"B0E K;BΣ]^Yf|X>c2lnntgBO$5-tENY̍oc6ʹݠe; M0k6 VÑ᭥AiIh'.FQ=_-cpJ .9Ö4҅"dFI )'07N )S |LBx=Eű5L- ^fX$X. xA 3':3_uBf)s\{סeܗKnح8(6ؾ/sb.F + fN 78\9g@)啀&{f/C[spɩtdØY5 .ah-l^2V@Mp c fG]ʲ fF\!Qry f .R eݚ*luZUaYx:e(ཱmi Q'aQG5L:4:K 6kŋ15:SY\FOa-vgy'R}n2mDto.a 7 `]He]܅w<1!$ aGza@g¯RTrYB1 %cS=8pDA]WE4ztXp/q6+ꏋBm^fy> :ixEg48ƲB:I t4$#{N*ֽ-ltzА K*rҵ)]y;eV"y]YRC+92a,hf6 IP0lBp6/Crs5BT4Ip (wzq1t_u wSu5?E܇ , cZL$fA̰ý&_  @b" !Ŭ O``Q5^RRHThX2 .CB00Бa- Ay4 HX`JGjhXZk + GQfX%~<}<%bm0|"!(yr\#abŀEƔydM!Y|),+. >4<B[.kYq]w.E,R1}֐>G e@ CbAId kޭj5w]ע2谚C]o%],J7KiV͠>$d ܁tKH!H0UR0*J#02ƀt,Ha4XX e"VZ3CRG!gTl#pSLu8eI D["}.]a0oea]`B TYUTE!4bZx@xG.q5\y AHYBU?)*R*!*p\ h԰N+rHcʤE$vxrV,-Hvp74 "(ZYx$8_P1`"W)dO*^U|Z9 g*j * `P1m"it 2a a .y7w֧1e)9Zjjsg)rFPYqC`, [RXVH0v#%pKQ,=WZt_1[;Y(j@b!d&j%P`$ Kt¹NfH^TC( mC go J'ԊBPQ)@}?3{`;#x--/w5/qs }X* D0\z( ..BԐ$䢔3s( 2! }繜*P% ŗ*Z@Ƃ)j$@ }g;VGvm3K8}ņ{I)Np`2bGGqaS$,>xX[mӸb: JI8)$/ƺ"|y*20p© gW46E!omKf(6,"L(a&3 +2;P LzX43&nCIr,@*uQ;@ 14S*>hlN#kuCk qM`,ሔ 6J J4JY. oKXP1LvHT':'e:VYX[1&$ ׾ }yl0,d[{rKl0,Ye%٣BB1k!q$IXY`\ӡqד,\[_.y:җ4(X.MtK-K{,>$eN:OȒ@_>fG%X"(H"} I>g&DC"UO^0@R$)lrQ5hٰQ (ȡL %orweycxhU>,XfpMb @R DC.,}hAn,[!)~a$Wv#Y$ajeºF5-1bҒ='?[}d袛x]A(Xd h^M"L)S');1P>{,hQ4XSRQ,)!26dXwV Uw2 "L T}eDF Wg~R$H{+V,SE=;ܯAHN*lH/~Ʋ!ZYhRl\@,CW!$%% @ĢTP5֣Ku1]@DU BPigc<+&0Y& 0S0d),0aaD K "H,RS! bN6$B"PAe 7\?LR1:@?܈d zS,~/֑ՔN׺L_Gqe0Qş<;CE),Dx|ЀiʔOZT>"1 XR–$n'ȡN ̧t#hJR蔺a1Rkr(`đKAΎpɶz3@quXsjBjx-hnw@{@D~ 2(!I]4 !@}@t @+* 0>I&@A+puE ԔRRH&.SA3-(6bȄ 'LqgV. 77\~'TpTiue؛'c A[a!`BX"ڐ!&h Mrj@|P"~HKH' J BzD ,vj]fةqi14ىĄQҪBy|_ ;b"@J,#,2E(_g}S]pf 01d̡dpDPԾRp)}D$D-l4=I,PCe]"`j:|BtI:z$  (hba4sX`A5hlC}2@k!h$9s8jEru٥@4N /wOZҵ,$Q(6} PCYx/u1dYjK[`qqi`7"b2w0t("$mkXAD]WyHF"N2UIrlnley3wqY c Z^:I4en61ݬıF [(fya(ЦbasTDK䴲n KnlUJ- gD&`Œd hC0wIs Q՜T2L V5Th8K"`f!\L ^ bDi1t⮸ @,gt.EB+Uz#'ӓytB:XFRhN]51IM, D@A18ٜ0:#0B& %388ZUBik(2J lR?mFe-XR Z8rIf֮W( (C\,n4 q XT6!?#58]ȃkB'f,˓FKT KY@m#E&!0l%iCt! s#O+eMf]{XSjd|JK!Ō38JfT2 b_ ;D2˦HbMiKi@pPK@%5-nqΎd2Z$B!`XQŁq1_ʨ0(:h0[1hitZH@څ-,m0#zNUJcAv[7]đ iiiLDjMGAh%#JR) .@d-)$BD)D-ኜ. B֌C&FXP fNIj\6HkX(XdjSvL:Hds!6ŲdBңEUBP4,H @16`3Ǯy 9%LXKW +ܭVҭfkYfkXWNwÈhܣ6bQFf1 JaHd.xu߳ =Ɓ"a̜:kEz,v-Co0v,yD ,QЌӑlՌ.x,_.\* %s?QF(gk `Cв'=?gzPĈPzt&Pm(N51f#5,It?dJ:} îj|ev`9 ib$s1r(V ۻ+6p#!Pb^x3!9$HK, )#{w^ cB,,~w.!% D>\!HXTRY)H""@eFXe ehJDPYRc/+΍ K!\!҉DK/\}ּO,0G;-D޻v%괉Kh(s04KdHi]8ʃHy ~4k9[q}N=ˈg-dU2@&Zh 1j,IB^GtfTn)U Kx[ X`ai("(VX*Z0@>+"?\ORNR ,,>il%łd>TaaѳEB`p\U m`sƁв8{%n=2 ! džhdz"ZTF-M6٦w4DjpJO۴@8Xsn.c ,_{Uto뛅JŊ0ܽJ m,HWYR& ,^ (a4Q%BBҫ,XƕR'^x'jX``ߣ_X5ZYLHjv19v (j"ȟI{@R+$:X9JSKdR'ٙeO0H`aT a2( /BCdL&>KBt+Ѻh.^ aBĢ?al[gvY7L{NܠK2)<Ո=` UO(Q:JA ȍN N`PʰA@O.& i[\Hp-P ,CCvOAc H,1 KB qŋZ)J,*ūt )@ K!,p)kW"Q*!'?/H &$r:r4lE]NPޖ`&@]ir;E7đPX(#[ȧȞIΓC`,{?Q} bAJwX E[h(=hHXH!tO )„`Ap5ZԉJTAP R ,KQ {uC>JxJ>B+ U peDDXVEq% h1aTŕiZ h8z"us8ɑ2Ԡiehр0[FTH@#'?1i%ZnV"UH,F!1c5HаXR6d$ ȠKI>~4C`MqM)$"_DDS=!fF0P:dYP)DriI}$S%?v:9kB_ԴXJn)dس, ] Pӆ R "fLzؽ]=I8JyMt `S_v:m*`ꑕNb$4MzI(g~GE, N z9O!bY|m]7ϖ;c?mVdXe6\?Yh`)༏%7llŲw\w.:GԒ”蝚i~+إzQ/qEޙ3ZW=1$w'QFE6m|UXbb%ҧu<˭|l3:Cb=Cih!8[Uc7P.р;(]P[ݡ@H qZ W+y~tx480)MH,|)Y pUhea*N\Z۞ <82{Ba'ˣ}q0S) ,.dDTKrxI0mcEnziѨg'C&Ia6ms0S DSqL99TF:92"AM:5 Cl?~I=QGJ[xdj痎_n..JKYz-(/0qW]V r]{`=w-;r"O(eh\st/mz&*Tgir0Slfo{GDH96}00r˨iqGY pa֤M7fYHCr%@E Vˢ700_eв춭GYmY=( ϑq8[z}#iTq[_9zξGaw_3Gq)0+ `vԅmXI5 pU8 AeQ*L˝qP*gt1&ĻY xA AIݷ+-_c$qc"1jEZDA#1Z5SpEO#_.m0+;0E1fK%Ql:Idz]BE=(9{-uЉ@> /rЉE:U?v}rF s< @ nh5Hts$8?Dv~z}f  Hf-h[땝R\0XhXzl Ń tdy=0zYsgJ0a[((4i ‘<Ѐ8@sa/~ Gq0q[dGrf&~Oz JD%5f2PU ^.׏ RbVE`F~PUKx 菒{94r$OУAD8D"dZhdaP#|_bK@t<"!XX!`C-Aj--*fR ŠBuj%$0Lqvnm I#QssF5e/kz[]6ϥrEXҩj&TFdbl g`4)p%$ߎ2[G*@Ct)G-;@ AכFDb{ð" # D h:seC0ǖ5p{SYUsy#> l@P,Ks*c,HU (]=NWfg[ "0%7PEл A $#W.1sli SYE )B!O qb$2t(ae&  aklM4I4PL2 LO2 MzgJd~TZΥh*`US.e c.KߨΑȁQV";Y=I' S;X4(pE@.'ntP`%rHq{C伮W\`Jw/y,Lz-3cz8(WWf듑3I&3 l>V9ls-BfUe& [/| \!x8j%Vy.Ch F4$mʑ,T,ϭ[/ 3yѨ{I.d3xr}ڑ9:<6::.`-˸ `rƖ˚pPMV$X(Q&ѝ~f #w`LuE6*7dniG!f8v7E-)wHtHZXQdC!hrZ@3x;xwn7H|kN"K^ؤ0%EPΜNHd5#bL٩j+ ZҠˆ< 0S>hb򁡍E]*/ ӞT&+SFo8혵dž4xR|\9[e82&)qa65;7HV7 g~͹k*ÌM}x\ˡ`w ޶ᖙM˭*]bLiW\t .( a I<MMցA.mAvbK`ur"ĥd`ߖ bW]P<61+4BZ. *KE(gvoZk°U,Izj^37iŵMs9v% JLH}UiQ,(>&b/|.u;\C jMх  - C m_ :,@0kŗxfq1<,@wD&P p;Ȉ`I`BE C%Ϭí4VMmҥu.ҹuEh~H D?pæ8mr4̱{d9-lsZ&b)@lFnP,f# |< Nفm 0#e1`X r Ѻq$I>Ri S3 ȗkVM3)T:@t8šEuK#k&DAN ``3WⰨj1A DEE@2(1eU@!eR^K (*& E(?*:a({L@L{)x2|]\Zs׼kN3q !$SVaE[h8>#8tblld n})NEqnWM&~n=DdM XEX s@&C?1=tG2tHsJRIJTS bTLX:NAFd93(eTD 6d" Vhc0PBVj!!4hdW@yC'BN H29׺1x:ٕhQ>mfBΝTuQXTn;_R9Bb<"~:NM@oND0r\]wXs@ɸYoir`,U( tE"URۧ+. H/D6s U+?!1^,&ږa,Dj!œ=)UX* d Ǚmp_ߩQ{(df`AP.\GhF}; ""u ,CUX,)츇- A(aVJihEY3 (r(13 @/ = S,e\` r& "Z-"b>( =vJa'=;0F# 0A.h^UxDB&њ 1l1 %!mO#ٙADڎqlOfc;0Dl Ly#6Y$Q_E_&d.dg(a]59́H ;̅3"h?-;S>DT3 ޡGP [ N5AqKRp;RˈݨHd@ͽ ,ANJ#"O.%0'u/N1ws#*C_x?yG23 `僯B^P J` k@ Ln%tW6*o_cxreG ;^siOlPx@'؍ךcU+k9GqC>it ~qGEf,Th9pc3R^3a /u2a`,^XjBŲCXAMw\ID@b xTW;]wOC6Ib!` ZoFm LgfU` ;[8宁vۖ'+&׹7=<' QqAwNV1q~wGJϡ2CffiBDj%c-#akW&dN "sc$cWm{G:3.!.d~^zVdww7>su.s7H:,ߖAlvݍCÝLoA$݉ϞwTiyvߘQiΖsn{ e8ykQHv;RaHZp,Cڱk7S ƘX  y6%aB#qIpv,/+LLbw:?b(,l~M~a ;[a;!ߚ$JRRdRs)e 6Hr. ZF "#u"x-*"?}qϊxʒ{AG01WH,-/w0_NQmtT{.ڬꍔ> @`+ȦATV5I"mxSd Nl%j!?j:+UC!nY.z-? nX:Weݕ0 xVF.oP.g,(-Q(xOiJ4X8uҔ܎WAS P]&S h> \Z\8%ٛ"Z"ԭXwGFE:e ].{X(XP2/P/`b5t}9PzIbEH%J@diDE[ 1RdEr\VV_a>Hy`pQASzSԇX  f'%4X"s $!LX{8+L'KE<[x=9Ŕ'EyAuD8~/*9,,dQdOcZ] DŅ@$T$_IZsףXS`=^#@!P4ջ%cAnGZV]It`xO6KYo`3뎦eY(f!B iAKL>AރB;$"I wŀ#dCZ YPqKi)0BfMom[Q[6d 1(',x}$  1N۪Yq06څ(TlV")B(hD3td&[bC0 vʗ/73go{B*$ŕe`?ɧ^b rcKCU )#i&0N4R WJDxB˪Ɨ`q{)dN1%)pѤM2.)QbŰZ""`OKƨF!h([ Z0 .鰨*GQ+fZ辫Y';jT6~-T8O_L:;񮔢 FoȽM~_A$4R:-eB@!(ifZJi6" Q`٬6# ki*&R2B&IPAh{ .Rj({䋐䎐=zN#%ITNybXtK v:Q+=^p1i$%1p5>h jUɺ"C}VT{Ϙ2}⚐^:B< 1(2VJX$(" ʚ *S!ˆ&y/pu液%.[ZUC &Gk?-*#wE[&*D'L#pdEN"!K"IJ#$0X D$ ( e9HT2-QZ #hYMwJK!$zdPXSФ JPX$H{oƎp< {f4SRHQF\Z^>=h^I5}@zHA!{X(~ZP*8ŭfi$-u;BJ (L!hTk0R@Cq]|habeyŖ*XUf4AmpGIam-B 8E3,-f.$YthPSGSIOAQEllJ$]t1P/UBYTyz ~U˹a^(g9Y}U" oAPrkutM@H@ԓFNaI$i#ۨwOE﫣I,S=ÔIR$F$~}"7|lz:E#/ϙ̝FS)>fu<%ó;=g$ԑRü89,QΗ ȢU"?ʗGEt^@6&KeGbek땭9<]4LjF[$>ed4|gGh}M_C9)o '~aH`,]Qaybp X`)ദu1%XvH V󕽌ŎUXݫ5"#UL.-o ҾZLc9|-kmwuzYz) >@mdBs8SejΝlDs4ACْ·Y~x+Rl.3SsdOyNjr2l‰iQtܳ[(BpB( n>0$h  , MP<"Pa' IIFGZ3RKL-`jB9ԐpF!x0XڅK"DϷb,l2F 3 KNT(3XIlK1au嘟ph^p(pn 9sxr0s!_>_+F9( げ9 k[и>P0LH~`J,C^mt2G|"zrjD҈u\yD ;<;N] 8*JM:N X!H\ T 8$Ax_s3fO`u=|hk&{<ȊRqjV !9 r5a$ty)̉QBknO"R|A=K|_:fF)5@n! \@⅋qGZzO`HF٦0 FJ5OQ'w9{C )L g鎴^"|ǎc{ F4ӍY6QzahMTMg0 F{tE}Г%AMs "6C3gJV•ra2H @ŖEI4dJ VŁQEhA D3 |{8񇩔eߩg;ݢOi#Uӫ}0|V<'kU$$)|s.jU}nze332&Flzi"!A!i1"F9 :7tyg[9笺MS[;%yg$ (ӱ%x/<y%>؛6䁟Pmq(9ݿ_W >kV 6xQf?c3 Fo:0F5z\#‘JP?L2PU!߀]<(>ry=Ϲ>:s{;H{2\7GsOOM#H[4{0Snl˜-O2QͺL8JӐȍ+Ml0C38[D?MLmÀ<|Dɓ h+w[_Ʊ. 00'n1ǀCTʂc =CT̺/`7mcwM;}3'G!t c"!}@^7C;]6A uAۏy!cFM,cˑxJ;sՂk˽!u#$<Ю sͶZ:dsiI[Gϸ.KKr@dr-$ۻ;>r8 i}jt˹,0VE8H`/C/~}@>Nw]mf@|tQNʂ*ֆ`H܁A]! @ " t|wr,e`("^mCǾȸt1"1,LSB33ZQN<+oseiug0v6G!^_#bg˶!bG4vLHe#+Oq}Oe)iT$$O1 u {{*#Cڦoh9egcpTg=V7.Q>_>RzC#٤P0|-GpHA{q[3)Ha*|`wpҦD7&!Bߤd);$)$2w`y`.P_5 \ Y!P4ӗG3{zLfAyDXQGo[{H.fzvJ]b?l[Y|+.1de5 _UIQBA1{ 7{?%n38hƆ},M'@>dk]&lw'<0`|fu#?;=AQBWXC_4E"HXT!$RyxB`T9@BȲ@qH1$j<><yyFRǗ'<^s!ETU.C%BMR)'C i$q}ŀkN =>.wHu0ɤ)EQ}o0bmK6)̢Xœ_eIJ*<\  eF/h5$~T"jk) N'^6hzdO.2?dN< y<>I3FCK_Vc}c\XjIJ,(ɨ (L0:]x4ሀ^7L-DFLI@z20mAq){̗umG:-1,ic9FO8qth+#F4& CIbu ĢN놻n|nUHFCNbNF!M#j,-@mk!LZܨ?~% `L|[C,23+MGh4B?M$aҞ%<%8Pmb!fLjb2 \;3Dn-)*pZ6 Šh*(L&%.P.CXy=TB,H=3 %. f{Db!;ruGQ #Cعm{A=Avڇ2o *Cp nd9ѓ`nwh"ł 9W1ӑi0%%&Pʟɂt:"?l$OXGgs(<(}PK YIG{"4Q,DXL!P>8)Rw]ȴ&/{wBBԸIA#`!ϯYǭWc$߶f kk@ѳ?Q+]6RwLɡkg pX28X|jIWds8Uks9ժsMW~[[~OsMcCec}0iDtg/fRYVpf엶&;83ֵRS0;w]SP/PZ; duuNx\ A0#a:!@m[(b!7%6$ snw`P~bۺ5+h[- mߞ/P=$ Lp;C1kZ 0,Ȯ`=C^8,73g]l܀F8-YT #vODekf[}af1f@<$5y߳C*ڇ$Ŋ8) Q2Ld dh[;% lFӤZB,ĉ2058E}G.EKBZ-X3ʟBT'x|vLOS0yzB>w[ 4U{D\saшgLliˢjȤPh1$T6<RXJi PHٸM>56sӪN@p±'n 200VzR L7[5`7l{Z2Aϸq {ift5HbC2'lwp4)UvZ}^$L镊OgP&Ciֶ]X7 ®+j8,=` j'\{GfJ+Ť/S.`"ȁs{q0aBa6/򉰂 R|hŻ(]VD2?.A4翥7]C~ 1X)ɤxrt_Tx =u@Jd9L†)wӵNc9 tyw =>3q݈7~x S= N2GX(ݞϞ(吕 N1](,{iXk卙J )0v˖Vq9/:%^d8FN`܎qoN3]ͱ{߷~:5kNt11Ѹַֻ8ٶgQw$r5p6vNΣCWjl48i͍e/bFPes̬)Ѷ5H aQmc%虰0A0t.k.L!H1k$yCågF|4GI9Coɨe6`7Hd$#!!TDkh2''(""Y(S3k1Pz'L٧nzpax+S #IkxeyvNmm(P2xDGN͔,)Ds\9c8S&STst;iC[#/a)2Q^.&)wI{ Lڤr9!#}Nm qztl> T&X%@hKwnPt-N-Y~kr}