summaryrefslogtreecommitdiffstats
path: root/perl-install/bootloader.pm
blob: f6e24975c517ae5265ae0b436e508ce7e518b549 (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
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
package bootloader; # $Id$

use diagnostics;
use strict;
use vars qw(%vga_modes);

#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use partition_table qw(:types);
use log;
use any;
use fsedit;
use devices;
use loopback;
use detect_devices;
use partition_table::raw;
use run_program;
use modules;


%vga_modes = (
'ask' => "Ask at boot",
'normal' => "Normal",
'0x0f01' => "80x50",
'0x0f02' => "80x43",
'0x0f03' => "80x28",
'0x0f05' => "80x30",
'0x0f06' => "80x34",
'0x0f07' => "80x60",
'0x0122' => "100x30",
 785 => "640x480 in 16 bits (FrameBuffer only)",
 788 => "800x600 in 16 bits (FrameBuffer only)",
 791 => "1024x768 in 16 bits (FrameBuffer only)",
 794 => "1280x1024 in 16 bits (FrameBuffer only)",
);

#-#####################################################################################
#- Functions
#-#####################################################################################

sub get {
    my ($kernel, $bootloader) = @_;
    $_->{kernel_or_dev} && $_->{kernel_or_dev} eq $kernel and return $_ foreach @{$bootloader->{entries}};
    undef;
}
sub get_label {
    my ($label, $bootloader) = @_;
    $_->{label} && substr($_->{label}, 0, 15) eq substr($label, 0, 15) and return $_ foreach @{$bootloader->{entries}};
    undef;
}

sub mkinitrd {
    my ($kernelVersion, $initrdImage) = @_;

    $::testing || -e "$::prefix/$initrdImage" and return 1;

    my $loop_boot = loopback::prepare_boot();

    modules::load('loop');
    if (!run_program::rooted($::prefix, "mkinitrd", "-v", "-f", $initrdImage, "--ifneeded", $kernelVersion)) {
	unlink("$::prefix/$initrdImage");
	die "mkinitrd failed";
    }
    loopback::save_boot($loop_boot);

    -e "$::prefix/$initrdImage";
}

sub mkbootdisk {
    my ($kernelVersion, $dev, $append) = @_;

    modules::load(if_(arch() =~ /sparc/, 'romfs'), 'loop', 'vfat');
    my @l = if_($append, '--appendargs', $append);
    run_program::rooted_or_die($::prefix, 'mkbootdisk', '--noprompt', @l, '--device', "/dev/$dev", $kernelVersion);
}

sub read() {
    my $file = sprintf("/etc/%s.conf", arch() =~ /sparc/ ? 'silo' : arch() =~ /ppc/ ? 'yaboot' : 'lilo');
    my $global = 1;
    my ($e, $v, $f);
    my %b;
    foreach (cat_("$::prefix$file")) {
	next if /^\s*#/ || /^\s*$/;
	($_, $v) = /^\s*([^=\s]+)\s*(?:=\s*(.*?))?\s*$/ or log::l("unknown line in lilo.conf: $_"), next;

	if (/^(image|other)$/) {
	    if (arch() =~ /ppc/) {
		$v =~ s/hd:\d+,//g;
	    }   
	    push @{$b{entries}}, $e = { type => $_, kernel_or_dev => $v };
	    $global = 0;
	} elsif ($global) {
	    if ($_ eq 'disk' && $v =~ /(\S+)\s+bios\s*=\s*(\S+)/) {
		$b{bios}{$1} = $2;
	    } elsif ($_ eq 'bios') {
		$b{bios}{$b{disk}} = $v;
	    } elsif ($_ eq 'init-message') {
		$v =~ s/\\n//g; 
		$v =~ s/"//g;
		$b{'init-message'} = $v;
	    } else {
		$b{$_} = $v || 1;
	    }
	} else {
	    if ((/map-drive/ .. /to/) && /to/) {
		$e->{mapdrive}{$e->{'map-drive'}} = $v;
	    } else {
		if (arch() =~ /ppc/) {
		    $v =~ s/hd:\d+,//g;
		    $v =~ s/"//g;
		}
		$e->{$_} = $v || 1 if !member($_, 'read-only');
	    }
	}
    }
    if (arch() !~ /ppc/) {
	delete $b{timeout} unless $b{prompt};
	$_->{append} =~ s/^\s*"?(.*?)"?\s*$/$1/ foreach \%b, @{$b{entries}};
	$b{timeout} = $b{timeout} / 10 if $b{timeout};
	$b{message} = cat_("$::prefix$b{message}") if $b{message};
    }

    #- cleanup duplicate labels (in case file is corrupted)
    my %seen;
    @{$b{entries}} = grep { !$seen{$_->{label}}++ } @{$b{entries}};

    \%b;
}

sub suggest_onmbr {
    my ($hds) = @_;
    
    my $type = partition_table::raw::typeOfMBR($hds->[0]{device});
    !$type || member($type, qw(dos dummy lilo grub empty)), !$type;
}

sub same_entries {
    my ($a, $b) = @_;

    foreach (uniq(keys %$a, keys %$b)) {
	if ($_ eq 'label') {
	    next;
	} elsif ($_ eq 'append') {
	    next if join(' ', sort split(' ', $a->{$_})) eq join(' ', sort split(' ', $b->{$_}))
	} else {
	    next if $a->{$_} eq $b->{$_};

	    my ($inode_a, $inode_b) = map { (stat "$::prefix$_")[1] } ($a->{$_}, $b->{$_});
	    next if $inode_a && $inode_b && $inode_a == $inode_b;
	}

	log::l("entries $a->{label} don't have same $_: $a->{$_} ne $b->{$_}");
	return;
    }
    1;
}

sub add_entry {
    my ($bootloader, $v) = @_;

    my $to_add = $v;
    foreach my $label ($v->{label}, map { 'old' . $_ . '_' . $v->{label} } ('', 2..10)) {
	my $conflicting = get_label($label, $bootloader);

	$to_add->{label} = $label;

	if ($conflicting) {
	    #- replacing $conflicting with $to_add
	    @{$bootloader->{entries}} = map { $_ == $conflicting ? $to_add : $_ } @{$bootloader->{entries}};
	} else {
	    #- we have found an unused label
	    push @{$bootloader->{entries}}, $to_add;
	}

	if (!$conflicting || same_entries($conflicting, $to_add)) {
	    log::l("current labels: " . join(" ", map { $_->{label} } @{$bootloader->{entries}}));
	    return $v;
	}
	$to_add = $conflicting;
    }
    die 'add_entry';
}

sub add_kernel {
    my ($lilo, $version, $ext, $root, $v) = @_;

    #- new versions of yaboot don't handle symlinks
    my $ppcext = $ext;
    if (arch() =~ /ppc/) {
	$ext = "-$version";
    }

    log::l("adding vmlinuz$ext as vmlinuz-$version");
    -e "$::prefix/boot/vmlinuz-$version" or log::l("unable to find kernel image $::prefix/boot/vmlinuz-$version"), return;
    my $image = "/boot/vmlinuz" . ($ext ne "-$version" &&
				   symlinkf("vmlinuz-$version", "$::prefix/boot/vmlinuz$ext") ? $ext : "-$version");

    my $initrd = "/boot/initrd-$version.img";
    mkinitrd($version, $initrd) or undef $initrd;
    if ($initrd && $ext ne "-$version") {
	$initrd = "/boot/initrd$ext.img";
	symlinkf("initrd-$version.img", "$::prefix$initrd") or cp_af("$::prefix/boot/initrd-$version.img", "$::prefix$initrd");
    }

    my $label = $ext =~ /-(default)/ ? $1 : ($ext =~ /\d\./ ? sanitize_ver("linux$ext") : "linux$ext");

    #- more yaboot concessions - PPC
    if (arch() =~ /ppc/) {
	$label = $ppcext =~ /-(default)/ ? $1 : "linux$ppcext";
    }

    add2hash($v,
	     {
	      type => 'image',
	      root => "/dev/$root",
	      label => $label,
	      kernel_or_dev => $image,
	      initrd => $initrd,
	      append => $lilo->{perImageAppend},
	     });
    add_entry($lilo, $v);
}

sub duplicate_kernel_entry {
    my ($bootloader, $new_label) = @_;

    get_label($new_label, $bootloader) and return;

    my $entry = { %{ get_label('linux', $bootloader) }, label => $new_label };
    add_entry($bootloader, $entry);
}

sub unpack_append {
    my ($s) = @_;
    my @l = split(' ', $s);
    [ grep { !/=/ } @l ], [ map { if_(/(.*?)=(.*)/, [$1, $2]) } @l ];
}
sub pack_append {
    my ($simple, $dict) = @_;
    join(' ', @$simple, map { "$_->[0]=$_->[1]" } @$dict);
}

sub append__mem_is_memsize { $_[0] =~ /^\d+[kM]?$/i }

sub get_append {
    my ($b, $key) = @_;
    my (undef, $dict) = unpack_append($b->{perImageAppend});
    my @l = map { $_->[1] } grep { $_->[0] eq $key } @$dict;

    #- suppose we want the memsize
    @l = grep { append__mem_is_memsize($_) } @l if $key eq 'mem';

    log::l("more than one $key in $b->{perImageAppend}") if @l > 1;
    $l[0];
}
sub add_append {
    my ($b, $key, $val) = @_;

    foreach (\$b->{perImageAppend}, map { \$_->{append} } grep { $_->{type} eq 'image' } @{$b->{entries}}) {
	my ($simple, $dict) = unpack_append($$_);
	@$dict = grep { $_->[0] ne $key || $key eq 'mem' && append__mem_is_memsize($_->[1]) != append__mem_is_memsize($val) } @$dict;
	push @$dict, [ $key, $val ] if $val;
	$$_ = pack_append($simple, $dict);
	log::l("add_append: $$_");
    }
}
sub may_append {
    my ($b, $key, $val) = @_;
    add_append($b, $key, $val) if !get_append($b, $key);
}

sub configure_entry {
    my ($entry) = @_;
    if ($entry->{type} eq 'image') {
	my $specific_version;
	$entry->{kernel_or_dev} =~ /vmlinu.-(.*)/ and $specific_version = $1;
	readlink("$::prefix/$entry->{kernel_or_dev}") =~ /vmlinu.-(.*)/ and $specific_version = $1;

	if ($specific_version) {
	    $entry->{initrd} or $entry->{initrd} = "/boot/initrd-$specific_version.img";
	    mkinitrd($specific_version, $entry->{initrd}) or undef $entry->{initrd};
	}
    }
    $entry;
}

sub dev2prompath { #- SPARC only
    my ($dev) = @_;
    my ($wd, $num) = $dev =~ /^(.*\D)(\d*)$/;
    require c;
    $dev = c::disk2PromPath($wd) and $dev = $dev =~ /^sd\(/ ? "$dev$num" : "$dev;$num";
    $dev;
}

sub get_kernels_and_labels() {
    my $dir = "$::prefix/boot";
    my @l = grep { /^vmlinuz-/ } all($dir);
    my @kernels = grep { ! -l "$dir/$_" } @l;

    my @preferred = ('', 'secure', 'enterprise', 'smp');
    my %weights = map_index { $_ => $::i } @preferred;
    
    require pkgs;
    @kernels = 
      sort { c::rpmvercmp($b->[1], $a->[1]) || $weights{$a->[2]} <=> $weights{$b->[2]} } 
      grep { -d "$::prefix/lib/modules/$_->[0]" }
      map {
	  if (my ($version, $ext) = /vmlinuz-((?:[\-.\d]*(?:mdk)?)*)(.*)/) {
	      [ "$version$ext", $version, $ext ];
	  } else {
	      log::l("non recognised kernel name $_");
	      ();
	  }
      } @kernels;

    my %majors;
    foreach (@kernels) {
	push @{$majors{$1}}, $_ if $_->[1] =~ /^(2\.\d+)/
    }
    while (my ($major, $l) = each %majors) {
	$l->[0][1] = $major if @$l == 1;
    }

    my %labels;
    foreach (@kernels) {
	my ($complete_version, $version, $ext) = @$_;
	my $label = '';
	if (exists $labels{$label}) {
	    $label = "-$ext";
	    if (!$ext || $labels{$label}) {
		$label = "-$version$ext";
	    }
	}
	$labels{$label} = $complete_version;
    }
    %labels;
}

# sanitize_ver: long function when it could be shorter but we are sure
#		to catch everything and can be readable if we want to
#		add new scheme name.
# DUPLICATED from /usr/share/loader/common.pm
my $mdksub = "smp|enterprise|secure|linus|mosix|BOOT|custom";

sub sanitize_ver {
    my $string = shift;
    my $return;
    (my $ehad, my $chtaim, my $chaloch, my $arba, my $hamesh, my $chech); #where that names come from ;)

    $string =~ m|([^-]+)-([^-]+)(-([^-]+))?(-([^-]*))?|;
    $ehad = $1; $chtaim = $2; $chaloch = $3; $arba = $4; $hamesh = $5; $chech = $6;

    if ($chtaim =~ m|mdk| and $chech =~ m|mdk(${mdksub})|) { #new mdk with mdksub
	my $s = $1;
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)\.(\d+)mdk|;
	$return = "$1$2$3-$4$s";
    } elsif ($chtaim =~ m|mdk$|) { #new mdk
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)\.(\d+)mdk$|;
	$return = "$1$2$3-$4";
    } elsif ($chaloch =~ m|(\d+)mdk(${mdksub})$|) { #old mdk with mdksub
	my $s = "$1$2";
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)|;
	$return = "$1$2$3-$s";
    } elsif ($chaloch =~ m|(\d+)mdk$|) { #old mdk
	my $s = $1;
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)|;
	$return = "$1$2$3-$s";
    } elsif (not defined($chaloch)) { #linus/marcelo vanilla
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)$|;
	$return = "$1$2$3";
    } else { #a pre ac vanilla or whatever with EXTRAVERSION
	$chtaim =~ m|^(\d+)\.(\d+)\.(\d+)$|;
	$return = "$1$2$3${chaloch}";
    }
    $return =~ s|\.||g; $return =~ s|mdk||; $return =~ s|secure|sec|; $return =~ s|enterprise|ent|;
    return $return;
}

sub suggest {
    my ($lilo, $hds, $fstab, %options) = @_;
    my $root_part = fsedit::get_root($fstab);
    my $root = isLoopback($root_part) ? "loop7" : $root_part->{device};
    my $boot = fsedit::get_root($fstab, 'boot')->{device};
    my $partition = first($boot =~ /\D*(\d*)/);
    #- PPC xfs module requires enlarged initrd
    my $xfsroot = isThisFs("xfs", $root_part);

    require c; c::initSilo() if arch() =~ /sparc/;

    my ($onmbr, $unsafe) = $lilo->{crushMbr} ? (1, 0) : suggest_onmbr($hds);
    add2hash_($lilo, arch() =~ /sparc/ ?
	{
	 entries => [],
	 timeout => 10,
	 use_partition => 0, #- we should almost always have a whole disk partition.
	 root          => "/dev/$root",
	 partition     => $partition || 1,
	 boot          => $root eq $boot && "/boot", #- this helps for getting default partition for silo.
	} : arch() =~ /ppc/ ?
	{
	 defaultos => "linux",
	 entries => [],
	 'init-message' => "Welcome to Mandrake Linux!",
	 delay => 30,	#- OpenFirmware delay
	 timeout => 50,
	 enableofboot => 1,
	 enablecdboot => 1,
	 useboot => $boot,
	 xfsroot => $xfsroot,
	} :
	{
	 bootUnsafe => $unsafe,
	 entries => [],
	 timeout => $onmbr && 10,
	 nowarn => 1,
	   if_(arch() !~ /ia64/,
	 boot => "/dev/" . ($onmbr ? $hds->[0]{device} : fsedit::get_root($fstab, 'boot')->{device}),
	 map => "/boot/map",
         ),
	});

    if (!$lilo->{message} || $lilo->{message} eq "1") {
	$lilo->{message} = join('', cat_("$::prefix/boot/message"));
	if (!$lilo->{message}) {
	    my $msg_en =
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
N_("Welcome to %s the operating system chooser!

Choose an operating system in the list above or
wait %d seconds for default boot.

");
	    my $msg = translate($msg_en);
	    #- use the english version if more than 20% of 8bits chars
	    $msg = $msg_en if int(grep { $_ & 0x80 } unpack "c*", $msg) / length($msg) > 0.2;
	    $lilo->{message} = sprintf $msg, arch() =~ /sparc/ ? "SILO" : "LILO", $lilo->{timeout};
	}
    }

    add2hash_($lilo, { memsize => $1 }) if cat_("/proc/cmdline") =~ /\bmem=(\d+[KkMm]?)(?:\s.*)?$/;
    if (my ($s, $port, $speed) = cat_("/proc/cmdline") =~ /console=(ttyS(\d),(\d+)\S*)/) {
	log::l("serial console $s $port $speed");
	add_append($lilo, 'console' => $s);
	any::set_login_serial_console($port, $speed);
    }

    my %labels = get_kernels_and_labels();
    $labels{''} or die "no kernel installed";

    while (my ($ext, $version) = each %labels) {
	my $entry = add_kernel($lilo, $version, $ext, $root,
	       {
		if_($options{vga_fb} && $ext eq '', vga => $options{vga_fb}), #- using framebuffer
	       });
	$entry->{append} .= " quiet" if $options{vga_fb} && $version !~ /smp|enterprise/ && $options{quiet};

	if ($options{vga_fb} && $ext eq '') {
	    add_kernel($lilo, $version, $ext, $root, { label => 'linux-nonfb' });
	}
    }

    #- remove existing libsafe, don't care if the previous one was modified by the user?
    @{$lilo->{entries}} = grep { $_->{label} ne 'failsafe' } @{$lilo->{entries}};

    my $failsafe = add_kernel($lilo, $labels{''}, '', $root, { label => 'failsafe' });
    $failsafe->{append} =~ s/devfs=mount/devfs=nomount/;
    $failsafe->{append} .= " failsafe";

    if (arch() =~ /sparc/) {
	#- search for SunOS, it could be a really better approach to take into account
	#- partition type for mounting point.
	my $sunos = 0;
	foreach (@$hds) {
	    foreach (@{$_->{primary}{normal}}) {
		my $path = $_->{device} =~ m|^/| && $_->{device} !~ m|^/dev/| ? $_->{device} : dev2prompath($_->{device});
		add_entry($lilo,
			  {
			   type => 'other',
			   kernel_or_dev => $path,
			   label => "sunos"   . ($sunos++ ? $sunos : ''),
			  }) if $path && isSunOS($_) && type2name($_->{type}) =~ /root/i;
	    }
	}
    } elsif (arch() =~ /ppc/) {
	#- if we identified a MacOS partition earlier - add it
	if (defined $partition_table::mac::macos_part) {
	    add_entry($lilo,
		      {
		       label => "macos",
		       kernel_or_dev => $partition_table::mac::macos_part
		      });
	}
    } elsif (arch() !~ /ia64/) {
	#- search for dos (or windows) boot partition. Don't look in extended partitions!
	my %nbs;
	foreach (@$hds) {
	    foreach (@{$_->{primary}{normal}}) {
		isNT($_) || isFat($_) or next;
		my $from_magic = { type => fsedit::typeOfPart($_->{device}) };
		isNT($from_magic) || isFat($from_magic) or next;
		my $label = isNT($_) ? 'NT' : isDos($_) ? 'dos' : 'windows';
		add_entry($lilo,
			  {
			   type => 'other',
			   kernel_or_dev => "/dev/$_->{device}",
			   label => $label . ($nbs{$label}++ ? $nbs{$label} : ''),
			     if_($_->{device} =~ /[1-4]$/, 
			   table => "/dev/$_->{rootDevice}"
				),
			   unsafe => 1
			  })
	    }
	}
    }
    foreach ('secure', 'enterprise', 'smp') {
	if (get_label("linux-$_", $lilo)) {
	    $lilo->{default} ||= "linux-$_";
	    last;
	}
    }
    $lilo->{default} ||= "linux";

    my %l = (
	     yaboot => to_bool(arch() =~ /ppc/),
	     silo => to_bool(arch() =~ /sparc/),
	     lilo => to_bool(arch() !~ /sparc|ppc/) && !isLoopback(fsedit::get_root($fstab)),
	     grub => to_bool(arch() !~ /sparc|ppc/ && !isRAID(fsedit::get_root($fstab))),
	     loadlin => to_bool(arch() !~ /sparc|ppc/) && -e "/initrd/loopfs/lnx4win",
	    );
    unless ($lilo->{methods}) {
	$lilo->{methods} ||= { map { $_ => 1 } grep { $l{$_} } keys %l };
	if ($lilo->{methods}{lilo} && -e "$::prefix/boot/message-graphic") {
	    $lilo->{methods}{lilo} = "lilo-graphic";
	    exists $lilo->{methods}{grub} and $lilo->{methods}{grub} = undef;
	}
    }
}

sub suggest_floppy {
    my ($bootloader) = @_;

    my $floppy = detect_devices::floppy() or return;
    $floppy eq 'fd0' or log::l("suggest_floppy: not adding $floppy"), return;

    add_entry($bootloader,
      {
       type => 'other',
       kernel_or_dev => '/dev/fd0',
       label => 'floppy',
       unsafe => 1
      });
}

sub keytable {
    my ($f) = @_;
    $f or return;

    if ($f !~ /\.klt$/) {
	my $file = "/boot/$f.klt";
	run_program::rooted($::prefix, "keytab-lilo.pl", ">", $file, $f) or return;
	$f = $file;
    }
    -r "$::prefix/$f" && $f;
}

sub has_profiles { to_bool(get_label("office", $b)) }
sub set_profiles {
    my ($b, $want_profiles) = @_;

    my $office = get_label("office", $b);
    if ($want_profiles xor $office) {
	my $e = get_label("linux", $b);
	if ($want_profiles) {
	    push @{$b->{entries}}, { %$e, label => "office", append => "$e->{append} prof=Office" };
	    $e->{append} .= " prof=Home";
	} else {
	    # remove profiles
	    $e->{append} =~ s/\s*prof=\w+//;
	    @{$b->{entries}} = grep { $_ != $office } @{$b->{entries}};
	}
    }

}

sub get_of_dev {
    my ($unix_dev) = @_;
    my $of_dev;
    run_program::rooted_or_die($::prefix, "/usr/sbin/ofpath", ">", \$of_dev, $unix_dev);
    chomp($of_dev);
    log::l("OF Device: $of_dev");
    $of_dev;
}

sub install_yaboot {
    my ($lilo, $fstab, $hds) = @_;
    $lilo->{prompt} = $lilo->{timeout};

    if ($lilo->{message}) {
	local *F;
	open F, ">$::prefix/boot/message" and print F $lilo->{message} or $lilo->{message} = 0;
    }
    {
        local $\ = "\n";
	my $f = "$::prefix/etc/yaboot.conf";
	local *F;
	open F, ">$f" or die "cannot create yaboot config file: $f";
	log::l("writing yaboot config to $f");

	print F "#yaboot.conf - generated by DrakX";
	print F "init-message=\"\\n$lilo->{'init-message'}\\n\"" if $lilo->{'init-message'};

	if ($lilo->{boot}) {
	    print F "boot=$lilo->{boot}";
	    my $of_dev = get_of_dev($lilo->{boot});
	    print F "ofboot=$of_dev";
	} else {
	    die "no bootstrap partition defined."
	}
	
	$lilo->{$_} and print F "$_=$lilo->{$_}" foreach qw(delay timeout);
	print F "install=/usr/lib/yaboot/yaboot";
	print F "magicboot=/usr/lib/yaboot/ofboot";
	$lilo->{$_} and print F $_ foreach qw(enablecdboot enableofboot);
	$lilo->{$_} and print F "$_=$lilo->{$_}" foreach qw(defaultos default);
	#- print F "nonvram";
	my $boot = "/dev/" . $lilo->{useboot} if $lilo->{useboot};
		
	foreach (@{$lilo->{entries}}) {

	    if ($_->{type} eq "image") {
		my $of_dev = '';
		if (($boot !~ /$_->{root}/) && $boot) {
		    $of_dev = get_of_dev($boot);
		    print F "$_->{type}=$of_dev," . substr($_->{kernel_or_dev}, 5);
		} else {
		    $of_dev = get_of_dev($_->{root});    			
		    print F "$_->{type}=$of_dev,$_->{kernel_or_dev}";
		}
		print F "\tlabel=", substr($_->{label}, 0, 15); #- lilo doesn't handle more than 15 char long labels
		print F "\troot=$_->{root}";
		if (($boot !~ /$_->{root}/) && $boot) {
		    print F "\tinitrd=$of_dev," . substr($_->{initrd}, 5) if $_->{initrd};
		} else {
		    print F "\tinitrd=$of_dev,$_->{initrd}" if $_->{initrd};
		}
		#- xfs module on PPC requires larger initrd - say 6MB?
		print F "\tinitrd-size=6144" if $lilo->{xfsroot};
		print F "\tappend=\" $_->{append}\"" if $_->{append};
		print F "\tread-write" if $_->{'read-write'};
		print F "\tread-only" if !$_->{'read-write'};
	    } else {
		my $of_dev = get_of_dev($_->{kernel_or_dev});
		print F "$_->{label}=$of_dev";		
	    }
	}
    }
    log::l("Installing boot loader...");
    my $f = "$::prefix/tmp/of_boot_dev";
    my $of_dev = get_of_dev($lilo->{boot});
    output($f, "$of_dev\n");  
    $::testing and return;
    if (defined $install_steps_interactive::new_bootstrap) {
	run_program::run("hformat", "$lilo->{boot}") or die "hformat failed";
    }	
    run_program::rooted_or_die($::prefix, "/usr/sbin/ybin", "2>", "/tmp/.error");
    unlink "$::prefix/tmp/.error";	
}

sub install_silo {
    my ($silo, $fstab) = @_;
    my $boot = fsedit::get_root($fstab, 'boot')->{device};
    my ($wd, $num) = $boot =~ /^(.*\D)(\d*)$/;

    #- setup boot promvars for.
    require c;
    if ($boot =~ /^md/) {
	#- get all mbr devices according to /boot are listed,
	#- then join all zero based partition translated to prom with ';'.
	#- keep bootdev with the first of above.
	log::l("/boot is present on raid partition which is not currently supported for promvars");
    } else {
	if (!$silo->{use_partition}) {
	    foreach (@$fstab) {
		if (!$_->{start} && $_->{device} =~ /$wd/) {
		    $boot = $_->{device};
		    log::l("found a zero based partition in $wd as $boot");
		    last;
		}
	    }
	}
	$silo->{bootalias} = c::disk2PromPath($boot);
	$silo->{bootdev} = $silo->{bootalias};
        log::l("preparing promvars for device=$boot");
    }
    c::hasAliases() or log::l("clearing promvars alias as non supported"), $silo->{bootalias} = '';

    if ($silo->{message}) {
	local *F;
	open F, ">$::prefix/boot/message" and print F $silo->{message} or $silo->{message} = 0;
    }
    {
        local $\ = "\n";
	my $f = "$::prefix/boot/silo.conf"; #- always write the silo.conf file in /boot ...
	symlinkf "../boot/silo.conf", "$::prefix/etc/silo.conf"; #- ... and make a symlink from /etc.
	local *F;
	open F, ">$f" or die "cannot create silo config file: $f";
	log::l("writing silo config to $f");

	$silo->{$_} and print F "$_=$silo->{$_}" foreach qw(partition root default append);
	$silo->{$_} and print F $_ foreach qw(restricted);
	print F "password=", $silo->{password} if $silo->{restricted} && $silo->{password}; #- also done by msec
	print F "timeout=", round(10 * $silo->{timeout}) if $silo->{timeout};
	print F "message=$silo->{boot}/message" if $silo->{message};

	foreach (@{$silo->{entries}}) { #-my ($v, $e) = each %{$silo->{entries}}) {
	    my $type = "$_->{type}=$_->{kernel_or_dev}"; $type =~ s|/boot|$silo->{boot}|;
	    print F $type;
	    print F "\tlabel=$_->{label}";

	    if ($_->{type} eq "image") {
		my $initrd = $_->{initrd}; $initrd =~ s|/boot|$silo->{boot}|;
		print F "\tpartition=$_->{partition}" if $_->{partition};
		print F "\troot=$_->{root}" if $_->{root};
		print F "\tinitrd=$initrd" if $_->{initrd};
		print F "\tappend=\"$1\"" if $_->{append} =~ /^\s*"?(.*?)"?\s*$/;
		print F "\tread-write" if $_->{'read-write'};
		print F "\tread-only" if !$_->{'read-write'};
	    }
	}
    }
    log::l("Installing boot loader...");
    $::testing and return;
    run_program::rooted($::prefix, "silo", "2>", "/tmp/.error", $silo->{use_partition} ? ("-t") : ()) or 
        run_program::rooted_or_die($::prefix, "silo", "2>", "/tmp/.error", "-p", "2", $silo->{use_partition} ? ("-t") : ());
    unlink "$::prefix/tmp/.error";

    #- try writing in the prom.
    log::l("setting promvars alias=$silo->{bootalias} bootdev=$silo->{bootdev}");
    require c;
    c::setPromVars($silo->{bootalias}, $silo->{bootdev});
}

sub make_label_lilo_compatible {
    my ($label) = @_; 
    $label = substr($label, 0, 15); #- lilo doesn't handle more than 15 char long labels
    $label =~ s/\s/_/g; #- lilo doesn't like spaces
    $label;
}

sub write_lilo_conf {
    my ($lilo, $fstab, $hds) = @_;
    $lilo->{prompt} = $lilo->{timeout};

    my $file2fullname = sub {
	my ($file) = @_;
	if (arch() =~ /ia64/) {
	    (my $part, $file) = fsedit::file2part($fstab, $file);
	    my %hds = map_index { $_ => "hd$::i" } map { $_->{device} } 
	      sort { isFat($b) <=> isFat($a) || $a->{device} cmp $b->{device} } fsedit::get_fstab(@$hds);
	    $hds->{$part->{device}} . ":" . $file;
	} else {
	    $file
	}
    };

    my %bios2dev = map_index { $::i => $_ } dev2bios($hds, $lilo->{first_hd_device} || $lilo->{boot});
    my %dev2bios = reverse %bios2dev;

    if (is_empty_hash_ref($lilo->{bios} ||= {})) {
	my $dev = $hds->[0]{device};
	if ($dev2bios{$dev}) {
	    log::l("Since we're booting on $bios2dev{0}, make it bios=0x80, whereas $dev is now " . (0x80 + $dev2bios{$dev}));
	    $lilo->{bios}{"/dev/$bios2dev{0}"} = '0x80';
	    $lilo->{bios}{"/dev/$dev"} = sprintf("0x%x", 0x80 + $dev2bios{$dev});
	}
	foreach (0 .. 3) {
	    my ($letter) = $bios2dev{$_} =~ /hd([^ac])/; #- at least hda and hdc are handled correctly :-/
	    next if $lilo->{bios}{"/dev/$bios2dev{$_}"} || !$letter;
	    next if 
	      $_ > 0	     #- always print if first disk is hdb, hdd, hde...
		&& $bios2dev{$_ - 1} eq "hd" . chr(ord($letter) - 1);
	    #- no need to help lilo with hdb (resp. hdd, hdf...)
	    log::l("Helping lilo: $bios2dev{$_} must be " . (0x80 + $_));
	    $lilo->{bios}{"/dev/$bios2dev{$_}"} = sprintf("0x%x", 0x80 + $_);
	}
    }

    {
        local $\ = "\n";
	my $f = arch() =~ /ia64/ ? "$::prefix/boot/efi/elilo.conf" : "$::prefix/etc/lilo.conf";

	local *F;
	open F, ">$f" or die "cannot create lilo config file: $f";
	log::l("writing lilo config to $f");

	chmod 0600, $f if $lilo->{password};

	#- normalize: RESTRICTED is only valid if PASSWORD is set
	delete $lilo->{restricted} if !$lilo->{password};

	local $lilo->{default} = make_label_lilo_compatible($lilo->{default});
	$lilo->{$_} and print F "$_=$lilo->{$_}" foreach qw(boot map install vga default keytable);
	$lilo->{$_} and print F $_ foreach qw(linear geometric compact prompt nowarn restricted);
	print F "append=\"$lilo->{append}\"" if $lilo->{append};
 	print F "password=", $lilo->{password} if $lilo->{password}; #- also done by msec
	print F "timeout=", round(10 * $lilo->{timeout}) if $lilo->{timeout};
	print F "serial=", $1 if get_append($lilo, 'console') =~ /ttyS(.*)/;

	print F "message=/boot/message" if arch() !~ /ia64/;
	print F "menu-scheme=wb:bw:wb:bw" if arch() !~ /ia64/;

	print F "ignore-table" if grep { $_->{unsafe} && $_->{table} } @{$lilo->{entries}};

	while (my ($dev, $bios) = each %{$lilo->{bios}}) {
	    print F "disk=$dev bios=$bios";
	}

	foreach (@{$lilo->{entries}}) {
	    print F "$_->{type}=", $file2fullname->($_->{kernel_or_dev});
	    print F "\tlabel=", make_label_lilo_compatible($_->{label});

	    if ($_->{type} eq "image") {		
		print F "\troot=$_->{root}" if $_->{root};
		print F "\tinitrd=", $file2fullname->($_->{initrd}) if $_->{initrd};
		print F "\tappend=\"$_->{append}\"" if $_->{append};
		print F "\tvga=$_->{vga}" if $_->{vga};
		print F "\tread-write" if $_->{'read-write'};
		print F "\tread-only" if !$_->{'read-write'};
	    } else {
		print F "\ttable=$_->{table}" if $_->{table};
		print F "\tunsafe" if $_->{unsafe} && !$_->{table};
		
		if (my ($dev) = $_->{table} =~ m|/dev/(.*)|) {
		    if ($dev2bios{$dev}) {
			#- boot off the nth drive, so reverse the BIOS maps
			my $nb = sprintf("0x%x", 0x80 + $dev2bios{$dev});
			$_->{mapdrive} ||= { '0x80' => $nb, $nb => '0x80' }; 
		    }
		}
		while (my ($from, $to) = each %{$_->{mapdrive} || {}}) {
		    print F "\tmap-drive=$from";
		    print F "\t   to=$to";
		}
	    }
	}
    }
}

sub install_lilo {
    my ($lilo, $fstab, $hds) = @_;

    $lilo->{install} = 'text' if $lilo->{methods}{lilo} eq 'lilo-text';
    output("$::prefix/boot/message-text", $lilo->{message}) if $lilo->{message};
    symlinkf "message-" . ($lilo->{methods}{lilo} eq 'lilo-graphic' ? 'graphic' : 'text'), "$::prefix/boot/message";

    write_lilo_conf($lilo, $fstab, $hds);

    log::l("Installing boot loader...");
    $::testing and return;
    run_program::rooted_or_die($::prefix, "lilo", "2>", "/tmp/.error") if arch() !~ /ia64/;
    unlink "$::prefix/tmp/.error";
}

sub dev2bios {
    my ($hds, $where) = @_;
    $where =~ s|/dev/||;
    my @dev = map { $_->{device} } @$hds;
    member($where, @dev) or ($where) = @dev; #- if not on mbr, 

    s/h(d[e-g])/x$1/ foreach $where, @dev; #- emulates ultra66 as xd_

    my $start = substr($where, 0, 2);

    my $translate = sub {
	$_ eq $where ? "aaa" : #- if exact match, value it first
	  /^$start(.*)/ ? "ad$1" : #- if same class (ide/scsi/ultra66), value it before other classes
	    $_;
    };
    @dev = map { $_->[0] }
           sort { $a->[1] cmp $b->[1] }
	   map { [ $_, &$translate ] } @dev;

    s/x(d.)/h$1/ foreach @dev; #- switch back;

    @dev;
}

sub dev2grub {
    my ($dev, $dev2bios) = @_;
    $dev =~ m|^(/dev/)?(...)(.*)$| or die "dev2grub (bad device $dev), caller is " . join(":", caller());
    my $grub = $dev2bios->{$2} or die "dev2grub ($2)";
    "($grub" . ($3 && "," . ($3 - 1)) . ")";
}

sub write_grub_config {
    my ($lilo, $fstab, $hds) = @_;
    my %dev2bios = (
      (map_index { $_ => "fd$::i" } detect_devices::floppies_dev()),
      (map_index { $_ => "hd$::i" } dev2bios($hds, $lilo->{first_hd_device} || $lilo->{boot})),
    );

    {
	my %bios2dev = reverse %dev2bios;
	output "$::prefix/boot/grub/device.map", 
	  join '', map { "($_) /dev/$bios2dev{$_}\n" } sort keys %bios2dev;
    }
    my $bootIsReiser = isThisFs("reiserfs", fsedit::get_root($fstab, 'boot'));
    my $file2grub = sub {
	my ($part, $file) = fsedit::file2part($fstab, $_[0], 'keep_simple_symlinks');
	dev2grub($part->{device}, \%dev2bios) . $file;
    };
    {
        local $\ = "\n";
	my $f = "$::prefix/boot/grub/menu.lst";
	local *F;
	open F, ">$f" or die "cannot create grub config file: $f";
	log::l("writing grub config to $f");

	$lilo->{$_} and print F "$_ $lilo->{$_}" foreach qw(timeout);

	print F "color black/cyan yellow/cyan";
	print F "i18n ", $file2grub->("/boot/grub/messages");
	print F "keytable ", $file2grub->($lilo->{keytable}) if $lilo->{keytable};
	print F "serial --unit=$1 --speed=$2\nterminal --timeout=" . ($lilo->{timeout} || 0) . " console serial" if get_append($lilo, 'console') =~ /ttyS(\d),(\d+)/;

	#- since we use notail in reiserfs, altconfigfile is broken :-(
	unless ($bootIsReiser) {
	    print F "altconfigfile ", $file2grub->(my $once = "/boot/grub/menu.once");
	    output "$::prefix$once", " " x 100;
	}

	each_index {
	    print F "default $::i" if $_->{label} eq $lilo->{default};
	} @{$lilo->{entries}};

	foreach (@{$lilo->{entries}}) {
	    print F "\ntitle $_->{label}";

	    if ($_->{type} eq "image") {
		my $vga = $_->{vga} || $lilo->{vga};
		printf F "kernel %s root=%s %s%s%s\n",
		  $file2grub->($_->{kernel_or_dev}),
		  $_->{root} =~ /loop7/ ? "707" : $_->{root}, #- special to workaround bug in kernel (see #ifdef CONFIG_BLK_DEV_LOOP)
		  $_->{append},
		  $_->{'read-write'} && " rw",
		  $vga && $vga ne "normal" && " vga=$vga";
		print F "initrd ", $file2grub->($_->{initrd}) if $_->{initrd};
	    } else {
		print F "root ", dev2grub($_->{kernel_or_dev}, \%dev2bios);
		if ($_->{kernel_or_dev} !~ /fd/) {
		    #- boot off the second drive, so reverse the BIOS maps
		    $_->{mapdrive} ||= { '0x80' => '0x81', '0x81' => '0x80' } 
		      if $_->{table} && ($lilo->{first_hd_device} || $lilo->{boot}) !~ /$_->{table}/;
	    
		    map_each { print F "map ($::b) ($::a)" } %{$_->{mapdrive} || {}};

		    print F "makeactive";
		}
		print F "chainloader +1";
	    }
	}
    }
    my $hd = fsedit::get_root($fstab, 'boot')->{rootDevice};

    my $dev = dev2grub($lilo->{first_hd_device} || $lilo->{boot}, \%dev2bios);
    my ($s1, $s2, $m) = map { $file2grub->("/boot/grub/$_") } qw(stage1 stage2 menu.lst);
    my $f = "/boot/grub/install.sh";
    output "$::prefix$f",
"grub --device-map=/boot/grub/device.map --batch <<EOF
install $s1 d $dev $s2 p $m
quit
EOF
";

     output "$::prefix/boot/grub/messages", map { substr(translate($_) . "\n", 0, 78) } ( #- ensure the translated messages are not too big the hard way
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
#-PO: and keep them smaller than 79 chars long
N_("Welcome to GRUB the operating system chooser!"),
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
#-PO: and keep them smaller than 79 chars long
N_("Use the %c and %c keys for selecting which entry is highlighted."),
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
#-PO: and keep them smaller than 79 chars long
N_("Press enter to boot the selected OS, \'e\' to edit the"),
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
#-PO: and keep them smaller than 79 chars long
N_("commands before booting, or \'c\' for a command-line."),
#-PO: these messages will be displayed at boot time in the BIOS, use only ASCII (7bit)
#-PO: and keep them smaller than 79 chars long
N_("The highlighted entry will be booted automatically in %d seconds."),
);
   
    my $e = "$::prefix/boot/.enough_space";
    output $e, 1; -s $e or die N("not enough room in /boot");
    unlink $e;
    $f;
}

sub install_grub {
    my ($lilo, $fstab, $hds) = @_;

    my $f = write_grub_config($lilo, $fstab, $hds);

    log::l("Installing boot loader...");
    $::testing and return;
    symlink "$::prefix/boot", "/boot";
    run_program::run_or_die("sh", $f);
    unlink "$::prefix/tmp/.error.grub", "/boot";
}

sub lnx4win_file { 
    my $lilo = shift;
    map { local $_ = $_; s,/,\\,g; "$lilo->{boot_drive}:\\lnx4win$_" } @_;
}

sub loadlin_cmd {
    my ($lilo) = @_;
    my $e = get_label("linux", $lilo) || first(grep { $_->{type} eq "image" } @{$lilo->{entries}});

    cp_af("$::prefix$e->{kernel_or_dev}", "$::prefix/boot/vmlinuz") unless -e "$::prefix/boot/vmlinuz";
    cp_af("$::prefix$e->{initrd}", "$::prefix/boot/initrd.img") unless -e "$::prefix/boot/initrd.img";

    $e->{label}, sprintf"%s %s initrd=%s root=%s $e->{append}", 
      lnx4win_file($lilo, "/loadlin.exe", "/boot/vmlinuz", "/boot/initrd.img"),
	$e->{root} =~ /loop7/ ? "0707" : $e->{root}; #- special to workaround bug in kernel (see #ifdef CONFIG_BLK_DEV_LOOP)
}

sub install_loadlin {
    my ($lilo, $fstab) = @_;

    my $boot;
    ($boot) = grep { $lilo->{boot} eq "/dev/$_->{device}" } @$fstab;
    ($boot) = grep { loopback::carryRootLoopback($_) } @$fstab if !$boot || !$boot->{device_windobe};
    ($boot) = grep { isFat($_) } @$fstab if !$boot || !$boot->{device_windobe};
    log::l("loadlin device is $boot->{device} (windobe $boot->{device_windobe})");
    $lilo->{boot_drive} = $boot->{device_windobe};

    my ($winpart) = grep { $_->{device_windobe} eq 'C' } @$fstab;
    log::l("winpart is $winpart->{device}");
    my $winhandle = any::inspect($winpart, $::prefix, 'rw');
    my $windrive = $winhandle->{dir};
    log::l("windrive is $windrive");

    my ($label, $cmd) = loadlin_cmd($lilo);

    #install_loadlin_config_sys($lilo, $windrive, $label, $cmd);
    #install_loadlin_desktop($lilo, $windrive);

    output "/initrd/loopfs/lnx4win/linux.bat", unix2dos(
'@echo off
echo Mandrake Linux
smartdrv /C
' . "$cmd\n");

}

sub install_loadlin_config_sys {
    my ($lilo, $windrive, $label, $cmd) = @_;

    my $config_sys = "$windrive/config.sys";
    local $_ = cat_($config_sys);
    output "$windrive/config.mdk", $_ if $_;
    
    my $timeout = $lilo->{timeout} || 1;

    $_ = "
[Menu]
menuitem=Windows
menudefault=Windows,$timeout

[Windows]
" . $_ if !/^\Q[Menu]/m;

    #- remove existing entry
    s/^menuitem=$label\s*//mi;    
    s/\n\[$label\].*?(\n\[|$)/$1/si;

    #- add entry
    s/(.*\nmenuitem=[^\n]*)/$1\nmenuitem=$label/s;

    $_ .= "
[$label]
shell=$cmd
";
    output $config_sys, unix2dos($_);
}

sub install_loadlin_desktop {
    my ($lilo, $windrive) = @_;
    my $windir = lc(cat_("$windrive/msdos.sys") =~ /^WinDir=.:\\(\S+)/m ? $1 : "windows");

#-PO: "Desktop" and "Start Menu" are the name of the directories found in c:\windows
#-PO: so you may need to put them in English or in a different language if MS-windows doesn't exist in your language
    foreach (N_("Desktop"),
#-PO: "Desktop" and "Start Menu" are the name of the directories found in c:\windows 
	     N_("Start Menu")) {
        my $d = "$windrive/$windir/" . translate($_);
        -d $d or $d = "$windrive/$windir/$_";
        -d $d or log::l("can't find windows $d directory"), next;
        output "$d/Linux4Win.url", unix2dos(sprintf 
q([InternetShortcut]
URL=file:\lnx4win\lnx4win.exe
WorkingDirectory=%s
IconFile=%s
IconIndex=0
), lnx4win_file($lilo, "/", "/lnx4win.ico"));
    }
}


sub install {
    my ($lilo, $fstab, $hds) = @_;

    if (my ($p) = grep { $lilo->{boot} eq "/dev/$_->{device}" } @$fstab) {
	die N("You can't install the bootloader on a %s partition\n", partition_table::type2fs($p))
	  if isThisFs('xfs', $p);
    }
    $lilo->{keytable} = keytable($lilo->{keytable});

    if (exists $lilo->{methods}{grub}) {
	#- when lilo is selected, we don't try to install grub. 
	#- just create the config file in case it may be useful
	eval { write_grub_config($lilo, $fstab, $hds) };
    }

    my %l = grep_each { $::b } %{$lilo->{methods}};
    my @rcs = map {
	c::is_secure_file('/tmp/.error') or die "can't ensure a safe /tmp/.error";
	my $f = $bootloader::{"install_$_"} or die "unknown bootloader method $_";
	eval { $f->(@_) };
	$@;
    } reverse sort keys %l; #- reverse sort for having grub installed after lilo if both are there.
    
    return if grep { !$_ } @rcs; #- at least one worked?
    die first(map { $_ } @rcs);
}

1;
dݕqBeszY;GiVY#]Q6bKL1n2/Z6O +Xa\)kE~J._GUG G,?@[JZ%Ů𿏮dUGq~o#HzEQωBo&( _ytRI-#=>G*<䯱&O[Ug]LmC"O3:O7Y"׭/}`7!BD|'T|Z2=u4uhY[P/ b; ޖ9<<NЭ!-/XhHGa@,TEw߰\F3y}!Qjh_j"4=3]˞ 5;PWe}Ikw99E9܇0+CE)5`;JVZ3Ek3pbHM d f}Oqo8^>X)Zp6 Ka0`.'U( =K'U.}o[J+ ,اޕDjM }DRJuF^SEɱ"XZ'zX-i~6Do򐡝c#ȋB8eU+8,`u8dpv ZlhklA6{}9V5siM`*~^bSa0-i뷷eK[F`thxc> 0elkBZ$N*q&aM\W9+աУ QφʺGQlm6CR܍K+E-1p} ۷_n֧w !3! "! Zf^$z{W,=`q}M v2s,V4{wdLHoqڒɾәBxͻɎ!A;g 7h 'JfJM\48eYqVvDoè2ݺq)6l7l7nj* >4·$#ǬO{idӞW8GݠJFEe}(&M&'pwCzo6cffqs{ {k)<>Awhډ T>ЈpOЛC̗—ߊ&]?A1?T"nCHsv`a!3X;%UrUE+w)瓐%QYF姉-iG3w]PoV|]70MFKZt;J&Mq}g}5a3g@Y7{\~;|}.i8. 3u }T!oLBAذ[,֌!߆ON$*` ʰqu5P1LQ/.PEtN~d;*FЬL4R!qtսi:8#nWɁ(UzF˴0fyFQ]i}Y3bn V,2c6MGf Dkxlh:~;C+o43xI1\ ʢ?"oyeM9JeEpdrݦ "b/!@tpT kf{"<_̣(l=|En6gZ7I?1#/4bڥw=,QQ&LۉPKy}@BoUa9a=JID^a}u#E J乺dݯP`6ka3JqtR0T$OǢ"oJ\R+bU :zܭ'L66o\w֝܌2*&Y$jvp%BhҀq̺t3T)ߗ!&"+ 7D.#\quQ8?,!sPuCY2 *6O9I/ǰܴ|# V9Ocϟ ~n1@&EwW9,$M#TA^[h1/b- _tg=bF5*2^|q[-ף 1"}?e6&9cz{V'ţ2"_8bqlB,*DqpxÊ(&$~쇵I:Ci"8ن*Uz0n6r'v69uуKgqu$?3 ; b7m]Ҥ*iЛȴ/B8Ù+6=(H nZJLtmՆqm̌\Z`Br!-ݹ%Ql~;gN>7D'c'\ 'N l4jvmBtPt_TtֱJ]uuw(|Փ0eKLKQ9Sm0]~Y$9[áR^d#pqKZzI49pARſL蜟h5:q-eVVZ^)h@4^5@I9CFʴg+p-2@8g^uNQF5W%Z+5t\6Œq+ClW< B#yyJٓ idq%E~zN+M0h)ʪTMd:q.>ܲ5}/@,K\3~jmS:BRUOvAB۟LL N@(o}5VoOr jAS"g<9)2kJWhh` u ʽD6J >vxm*!`p€@)Qc8Vw5N8_gPtΓ#aHW D:Eέ# JwQ!I hS~zwA<  ^w TS~wRjxH5^$ eP7YQ(bUL(_d"ވO̷ 7;p9r|X4N 2 Y@_̂ d@ժ1*WYDdA`MUt\D X!znxHb0SU ib;iN7M ~#GFR$MŨ8(ӵ`> ;R TXwگR@1*_Jx#.Mu7[ܥ}ڥ%Œ&{MԩFe͕/м!$񿤟Czt/L%TԒ# -XQDݫp}+vsT ⿠J[NVX<8K N/}p[n/lY)q6Qǫ{sNFwpޖZO~]\M00lChK!:{9-~|:Dcc%Y+,& Le0͔9|p6qe"?{sD(R P=v=uo#O;4Nڕ N ]uw[Xx\'^& _uAqtBIȮx{KTt4]?;gzt[ȓ$d&Pŗ)یlb؂$-}wVSAv2Hs xUW=۞S+>,dεC5lʪcK+2>d'^+E0؍CRtҬ/Τ<:Q:vhW抖4J;[J(Mj ؃~C͚(/o_ܶf9l/k;TO֡`"_ Z Y>چ8# wg6 >R,̦p6>4?VX$W>E?L¹Ք_V:Wިۜp ިxW>|e>;D pRXޓL{*vגI8kaMnFr #;L$SG}:]ny.#a.I6>3R,|~2w'̔ry&"<Ȟ&?w$S lxw^uL# Y9G˳GˏtM:o _5PMˋd鎡9)YAwGnDt#7xc*y)_{;/ˁB](RI{e?.t/[G8Y4sxWT%\G=IP)(ޫj@#-d&m)Xk x>n]*Km gd2Q8 H^6c7TzpHh<*{986v-%jWASТ5jOPv#͍4R+v|C!$ݗMiT Z#LZ؝u2KFKK6 68pqhB8N,!ː̔} %ΒbbVg@9~Cɝ#>Q%cd=c:-sll r',qsXyHX^sstN۰((S |mĞK_bՀ]=_6QI"PWیS1jEvu0S|2sa܎B7 QAEŽ0lN\HS^DZW'3?X[[fRrBYCa6еv_oRWQ2etnUxF:BG3E<߃㐮x].q{4;2#2s2_!OsrzCLVvӄ\"FW>ʫTqJj RBA 9E`Vqsi"GpU9O J[N<^}܋ĈwB\kDbw\ytɬx*&~JW:=?U1*@&lY/n@I#hȹj V#}]">jGrkx3:1,w~bX#)(ۆ(bx]k25BpdjҜW\\uc%kV^FSB Fc ;[5Xa-PH^;%)oڲ)Wq ׄe74Y]}Ci,FHdK|eM:{r"P(# [f|opr[ s<)C,&Q*u#}o0񼵾2.;Oi0Vt`|zpR^Cjav~Nmh e0Z-tŮb<@xyՌIIRYT٠R,[#.gވ p>I?KiD+Xht>9\catbO>x,{ddRzr:b0Rq@!ξ<6nI +hj7ʙphK&inLh04yRx(\G%9 *a ߌ Uk@ VQZ*54vM{d;+<ӕX` 3UA9 |K'9Katg e saɀ Fő7my'<5ק5g5mbeBB7Ht(\ҟ>r\k埂,ki"'bY"[a_@F% "jíAhe3t>L|ۋ?J,X_~zm6\>W-amIo c@l/^4Miȍy eg1{]z/uڃۏHZ4"=NnDI}aRti͵ч#& qW~Xe|᛺dn#A"6V~ɱ\lS팟!Gԅ v1 z !qAǕ1 j,ii<0bh>XRŵnupOȝwJd"9KG&2Sb\ DoԱ"c8E:cO3p,7+ʘ ˗vE_ԥyuV|F<1Ψ70r0WцN;:B pU;hc |s2S !Yds{1)OjJ"%g $yK!H|[݅"յJ1̉3T9;Ğ)O):ߑ@0jU23KΉBiv LGFo~Η2Lt%s@&-ZGmK˻J7UJRm18qlZsI]&H쾡HEsӴ#&7wk2HM] &2nv͞3k2UVpWC0lo0+YdÒrPpMq[aGtgɇuwR Lz=#pK(#W Ǜjq?r UAWv壾K8%9V~rз]ˆUWD5Ta19M+#>'A g4!]ok mk#hoZS^3_:V?fs}DVGwh_\ 4D"ΐ'5"тpoJ8SkQHVГSAY'kg8GWH^I2 fe_Sty6[s V/NJ>6_hӗS Ie âBXO$O(wT;%ңB;h/+_ mX4եK&yߩ(2p:1D+^,Mx }(mN ]J mwCq=NiQاMSzT(`ϯNϪ(Vݚ1IDVc5>8p61Q ck(( F{fb|'# xϲHVGE5"? ]moݢa?1}YGy^wHuG),g> .4Fǽu/N6GκJB] CӐ{n/<F*s,QÐ^Q:fV`p[JW=`1Nf1{+D\Q Jzt0 ijZuQfN@";{x}N&,n@5A|>鏜 Rv[ ati>GIn:CT؀K^Al7 ww}Y>Ud8W31=)\\fޢLiģYAŧSANtpDžX|6S Mm% %4&Ժ\>00WCb`\?T [ |}aThf•3cDq%$yYE&IowɎM9–D􍺡WJr ml?o ~Vo;FVz~˻oT30`<#\7q&".Td~@X chhJhHJU Q,{ f=i?HUJǝ0'+@rMbgxywiq&ZzBh80o~7;9]..z!"L9kz{5]z7Ǵ6zNzO =rmݲ!)3Z`$\f9hF'MA)|< RB`*/^I`d]5Ej , /P[J bY-|JtYMb 4Cy:wL}':zHF~@K?,^_bhc)d}g↺_1oݪ\\q^ #%@suQ, wnQ:=Nw%Xy:HЬ!p6zdc\?pN3[W&n":8ᴃ?Qvk L*dP w}h#$;H*.+4 ZRA}Ґ ^ Y1;)AxAPbJOW:xڲCۥĆrn0ǡKx,fjM;)pi]gdaOwv"^&;#ުah {ၴ?EM$PDV rٽA$_$wBQUw0fibBJ[u 3,Ou*a]#P8B?Q~]mMsu_bއ+pzjoK?{?"JD) dSCzYHl!#Uꎀ[t+8eiRO=y^*޲=Z+?N6\ғ=U6&c1yʟv0 IE4 w1AcpY| >pΌS6Y,@1R5ZxMJS% a.c EBDb7.Rd] b<+X~qjJ۸ H϶\/Y mE\=[,7P4R'o 'C><`P>~Xoc9?c4޸Lև=Q`&zdrޛȭs-4&؅*yFu;2]dK)s?GQ9Gq :vPY%3L7qUHt9ago%K{|uc CWˊ߫ĕ'A1h3g A5h ǩ>ui$N: 1RY%: R[ndPHeV԰T[Z+ly~#ƆNkƇ8#¯R{F6jyx_з%m"LT]"$UмV!~6G6>۔?+z)@'dGSƏFTF6 !9l.&=○IlgoÆY!WCMKbru+wwb(Iחv1-{*,8o7a iu%4MN`eŹŧDӌl 7ouq.qu*cqfVXѕS'BBᾊ&*('kM)0f \ZDJmRcPԻSݬ$YZ5BSC)d~Wmwq/aϧ(ܗƼā3ɭUJ%4jxPpFjFc^/gmM=^4 aWR5[ilTR2Hez^X>tHPm]ב`uLً#ARb0Zhr7y)ӂeVb]>iG,&|>n8b?Q 3 _9c)BbGsŦ0,} e_sΗy^ k`߳"PD[Cґ3 >BSj"$k+7mw_e|n`AM3۲i}&<0tD#X 2 P>Zp;((J`|AY싹{U뇙v_ɦkO<#+)O<kuF9]_tұsU[z/6qb:_ot[e5EM>?p(rv:t{H7d5'Vjfc"s|ȗ)c0Hym1'rEMDVX* g*Z[u|0⭓l mQR$.=dBGaD<,Ԣ∧5  0LTkc{xL;MLuѸ|uLRAqJ~s[n\WNPi.W7KVq8I>e+$M3M"s.w&J-Vk$ # Loh 퓳0 p' @RdYCM*ҰGgZ ?w'#?/;FtwOQXm&ޗ [qoYwUHLEmv]vedD񋤄jP a#f!/>9 %d g}i;IYwfpk[d/^}/p0r$s$;85槔ێ5NiU"J\Y6o㽺~w4 <.xX?;onZ$I.3hVͿP`*1:a k|[-A (X^cr3njdsH;oi.&uO =8-sdXR>o?r4Kω5gos[bgܖ%2gpE9@ӾӸ:Y2C|li־BhOd0NuTr\@OjqbXNH1Ȫ^ Y"L٥ScrV`{0_UW$Q_aϫQŻٓZ들6f 22TD0WGαE- h0H-=XTo'$z >WbOhǛ4hi,pz SV1[zHm?;";z! DŽ:.}c'饵*]0̎'#5ayZWl'&ysܩ7ujWe %T(U?6~Vcm?|ʽ<&ye?ej͜e(YzҡQJ,踞ԇ.?C4o$-F^ڍnern:c=}人VΕ" 4= %DE$^r],F4;ć4?AY E314` th;# {w[bb|j_Pzzw՟`CWq؇˶|Fv|첞UwT nEr< bϫ!R;=]ص-FƬB^ ;%"YCwH;_b%{@ a d-iPfV"/c`3Br;SUpKf0>NhZ;\SEpH$F]d(*Sҭ?hX&9`?Oz 'Z A:lkD4wRaޜ9VS8BOl^ydr(룦,mo,[[g~1H-~I̠(M|Xa>$Z#p/n &I8gg6+2*HѠ̢`Tm/'c p5Mn(} /䴻fe,篮zaO}kYY"ƨicQMsnuxipV&ZIΙRG#V ФZ C 3dG+ a"߹H-.~ҠG=$CIwnϤSKX,T68Fʁ2n(kE$Ox_`/S1w`S?&r7ǃ5>BT4ai0ma|ygUYb:"dOxoYeUX#űyP^GDy ~H OQҀ_yM!-҃ H3bmPFӾHn춣9dˑ[X_c x⌤IkD0`j3tDmWޡw*Uۦ c 2w۞oFq ! bޥaߥ;Za]b>膘8|pETpQ>Pŀl{_;EK>鹿D|=vBi.RO1Q _x"!%̪U8q@jŶa:["sZ)E1Zsqًv8 [En ԍ}f3kqYÉm|L#P6̕*Iih/ 7Yv&m ~]!$Vs(l\"ӡԺ(o{HGx>%~gI q*tJ=CZU gͰy{?IzJ:?ӱhxR?FM]D3cRMP ؠgfAjٵos>)۔kx8ԢDg4@c~ti-\v51knjkz` ,zrY,NP!eŁYf 9-ٳ+5 Fq8YalS5Gp=Jѥά=|=1%aņVT&hS>aif!&OAHUau n-BK4@T|˲5O쐉W؊PH)‚[~:d- /ƅᗢ %#lRFPNu b{٧_ l1j܇,UٕGf`m@:gRaomMoo':(_` o |#8WL݋HQ(BCxv861o>c?-N8+ԁIt.hb+g_vnQo~"qOyw^5SQ z&ͬzcMhYqaܭTӎjEfR3t2H/RUM?S*r79۠ @n[@8Ut\V5hGltTЖw`pF[S@+-7[x=8ܛoYbݟM)1Ҟqh5%-ֽfy UEoFX|,F8xw뵤̟xh|b;<`!Rv4AAg\7<1ds1K\ZqRW!˴!IbǛQ0^z珦 kSO6.iIblv{s=vK%}z#p8 '' {zoEтw7\aP$H(d]GH߸q}tgyBL"h]|gnBVErً|j4#iLA,,RAw9Sn) =BDQmaF;3$WN(t:PKg?ʝn{ m]l20e]|h= " # X쁨cabXaɜ9J% ^F:f^"k^G*= OJrPP;;|a#gk5=G<;&yt*)o3m?(%7^ì$Iuˡ 8 lB-ÜiS~필;ێAI|+9%=VD%2 \;*Ig/"6cR`.kP:1@eeYIoS\$Òk[pq}]բGl6T7C͘OƇ2#;-E[Efq4*><4e *]8DBDdo3恠>,uЩF)֌φ 'goƹ>=a :)ᦐ-W)WdUIʭHOHw33RӖLߝS% դ vڼ(S{>lDf(,Ⱦg>U꾪{VU6Mw]:otrj[?yAiud oeߺ$;'Údʽсݪ@8x!醥jQw&g gs4ow|^k%`J4UNTft^Q^Ɵzq{LOO^E_{>+^Dn⫕(BH"rx[ ^AR'yJ\@3e( &>3wAX"Fr_:'O*m5*)T&yA[@xn4y5:u_Ns3ztjdH :c& V}l/R>!~hP L^/2 v>铅D+bkJFNЮlJyX _mQgo3EÎj* VLq`Cd}=cM@|3[ˑ6''" f>LIrDMZ=GP)oC|tDT ܵݤtIhmʂ)zՒlzDݠUY95rɳQų6-:D' S k4ǭ;pe%ݳT8@-L~eڟr8 5@DiAtma{:+YɪfL 0[ iW8o` ` a (>?bd.~Bv݃Wmj/pVhR9l8+&|4VƢ /JVlKNeFm+r_¾j ~7?rrP7Gx/Nt)KnY b-{K!n e_G3Xi{]y&T l.uᴦ=ZRڌ{i x:85c B?4D)q"8oؿH˳yo}NlYno%z ˋD3L73q*cif#9ˣGp {!BWM~-voR!D5a_r~DPW{Xvէ!.Mw\zbXEﭧnXR޺^#9V>Z+6&+6tE(PUj38@\DĮ#ay8Ԓz#BGoI|{ćKi~{&|7|r3xEYM MDE!+S4nMd2m=1bmLL*p]ۘ$.\/x/ǔ xP."rmZs| qpi1q~LAOKfə=y=|x੎rkH)d>ψ9{*Yw݁9 2^ᵇZQ|ulUSʌ]S2/r@Sa{w=mJ+j)?W)W"!Yw#5p ORA vw؝|~yIc)˶(*\g4D?LŃƁ\CW[B೛Lסjm7[_%%&JiYW1z_ }jA7WiĹH=Vt!3 ׵bmA>t+C<@O\ͽMx >dU)z8i&_J.vq =4TviAy?qT_TC0nZp8!-x!^5.y}Z2.6HgqR7X$.,Rڔ݂"1Ļᶱ3UJ:A+ S={/V+Wҳ1&;JDAg 6!+;Jj&/ QgɣS.dum.k/nsARWi@nY'qjEke /l*-OGP48K-7rdz:T8hQ}Pwe/5]FT/=K+88Z,3W!':oɊG|J mk0 [_MGZNO_ \y?0xF/<\_֘0Yo=KHanxN4 ~$Jcx{L[45O?Uc+@G[00)6S'A,Ev]whaU@3'Tmu$uN0.ĘlSy,@͌@̵%\O(c>h_G_7ҡ!@c),@:~JXw^R8x[IJ3gև {=' Z CxrYyy%a gQZK*YyW qe :FRZK͐q<+Eȣ&HDp OHM~8O܆e>bU`~0SDN{ nQ3qO6^~q8Ќaoy_iwT]WaDxA[ONJ2re]܈Á<2i- i?ξ\#*l,`{LrגܑD &!:.,ZSݞQbVFԕy&_9MmVGS?]dz֦& \–6Eb% 1ᡯ覺o{VjtqG A) rWK|py_o}J\n!#PX*"vW'px$ŪԓGK0T]` 5ue+VUi Yz5sQ&?҂a2F7=~l$52'p7';,S5E%Zl*¢텼8M& Q OihE1^F{!~I#9J`P}8ȷʟʴ!CqVvV/ L6~kHe,z~|ZV?Qכ Ԡ(0RfWh[?d.N*dG-\RAV],#S ~cʔV%ꨌ, hDo>m^! 0ӫj^LGpլGMWiO|!E̗1uBc(b<ø.Ml ҥӐ6/mtE& z\7uxr:;t<K+ QRmn~ $yH{nEX)xf"ZJ.f-v"FbTf'G@-fө-X#80:}4Ё^H#`A5QNdhBe弋10mmbxV7+R|Q ew WA)MSҎ;+tIcR2?f B4.LB 5];i$ P=ѻcygYE*bBAj4!m<Zw| !n`ͽ f#^ 2!Gԗwk22Ɔd93S`^X(?a3pfpE0dRHCg7 |uĉ|#cgp Hv4++m&䩇W "-=W6Uw(F5<3.Q Px|- Ĺ _Z'I_KC `0hSÕw@ϖW^Bo##A*BgvMGK]lUh:Î7o~}S²ƀ 2勨%{aB栶4ңQ:/oedKҷ9OP6˚:¼Dmd7Q)OϷ58'OnWDluuN9w*rVx^Vj0E9iJȏPF#~*5~l[*5]i JGB~bkyȖgz6-MoX:K"sO`YtLJeݱT[JC@>q2 bc78` |ʌj  2ɍ]y>)@Ȫn8` Q?;Ra`(q(QxKr) :W@w˰o/&$=#zm3`GIOZ@ 6@-I ͅ:ܜhҝ!ے>+-(;ʝKI)BPC59{07(GYvB*9JQ9Z$~x?]1k(f{罱f *LM;['y抷d[@1%hpMzឬ)-po==iw@'Rn%|gRTDun(zcbVya t;?fu ˃SsQq><✺{Y(79K̛)rlV4F{֋jiB%c8B9xk3^}Q싡mK]Ŝ vX*b5n=oU?c뿭V:XY٫d=` >{3 /qۜR/5Z}MÖ˘w31L@: 'T6t=MZ 1cį8-$8@SMuTƔ9MW)DYf4u;Wb~1TDT;F#6k4Cm@Od6c&6u9IJb )g+kʡzf֪M4@`d4j7;!ǙGFo2w⺵!t6AݯNĆ1+xM/FLoJ6Zb!5 vϿz羦c*+@ 2_xάk]($V ̥=Jb xeL B_/I&ݾo(4OH/\Bw\N3Q60-5 jm] QCk&umtѯ҆yBBU4C3KӧgKqt%<99)#!?=)H- ;7M/nMyl-yb6wf]ɮjl9ǎOrh=UcPc7FcM*PJc'+|=γ/iuPPOx*4]c|p3)Kqcl8_tVjhK n`PJ? I)P2:dy wHcͳxȋQGY.`=&OK GEo)]z@X"kvSf&}YÇQ|Jyysj쨹+%fi3[eHYB4+@>?|>]355;X;J,K)7fEA?ȶ'c ubhxV =i|P.uC~ktXc= q"Ӎ ]JчGkli+-<05|KWk&OEQrKgT QK\.S$7LR^Y8_Z?FT?WnpKjC>%7r~]oo#['Mw[gcr`69=Rb(f c}#S"U>LiMN@GHq,Ddz/hFg"q>{*4|C݅FG@VS0QH7+XbtD5\oOM7s$GfyuĬ`]h`ߕ%AQ'yÇv{~ ח/4 qKXy,uLÝv)9cDtQ;9|ەwG.A_u(,C;Ts_g8UHE^R/ MnG=m7KfDsA%_7jV@p~I bONّ`tuv$8Oy>|rjH$# T羙'UO$֛šdz^n(țԠ -W6/G1CH.%DI)=&mM~"^X41 eZQyJ|Cm.燔tauQHdGAf/.)U]K݄..ntYcM W"-ؗtKcz+nωeP%~R(+NHՋpfBuZ 'KX.}r'rtCę]/ ކUB4.~mEA 'bwwDs^mD\ C1,uȧAՈ HE%g=@~y8>;~Ž>zs/GO[WyFAjP> i~KBM K R~@Ne_m궀ԌؔBa zPTx燾ZFYJh[|X9ַQ]R{8^NXg &bZ-~]TvݯVɲP1cq܏'bsԠ I]C_|g~[%pU9bA^Oܐxg3TumOgHPL"ѕK f)L(q"DLW:a>0?.e?si=!381ɍ/RXfb3F=5 w 7Ήn bcL&qTy6!Z#&3ϷFchC|-+lOA!- Em˳L;c}d\I[1>l4("Q2NسN/sqt!nN 9`VR ((x0":--J PqXuMXOFϽ`4ц };/X1hbַ8H'~cw YESEiynCK5g7+3F=vAw'cp7l޺85 wԗI! 7BE]/dXuBS ,Kԗ'= TpX|DKޙQnf֞A ^2hazUՀ*U% e,?g_Lg#X$agW:K퓬v>&Vr8-\ Q;4:tRk}'=sܧ @;+m\ NOHaD>P!: Cƣӯ-ٳVGMsF\I\ .c>=W4u3Yi죥?#ULAm紌J~^+_o/w >~V҅,Xi[DIe=0L'WC-iPnl :4,a㷖e|ec65kjH4L)jjB0O@Jri^-yWPo2QGe̦uqĨ{ Cq$Id| Ha+kmSQSD,$[._6!ֽjsq {iz ٘SFv@,i`׆z*p=k:>2p*PZ>fP m4p[ud4ަ0}wn&($dZaԊ&|8eȗ?"v6'Kk*c\@9:z_ H{>v: C.e|}D iwmiDvS[wBa%q4b&n#:֕깞-en,9x7 6hi7^cJ4~Oߠ}5827(B] WN(QϏnMtR'vo! ԻLN^5ᆱq KwQd|of ȗv^U \ꐤ޲6_'1kWX&ԚqqX"mݗ =t|Lw7 w9.=ʓ4ճފ}`:QÞU1&+?Ģ X@>iJ{s,MabZѼDuB؂vōvT#j$+ʱ#GYmLs|ࢸ/A+0{N.#IZLw)q೦L}S'ɟQV+HDsil c#M|hh2;P~uQ@'@*x@%|nB<\"E1`kiFE EX~H6 ݣf˔Dlq=Oaq(=9 4X5k'5U%tc&|;R vJRr >0Cȁ3e.蒴q _)q|hG=/Qj_d:߃k} ẃO2ORɷ_~ax.C{_aT[Grh$ʆrsR2m`X4)4 qA(sU[pbX};L[j kdj:={`"bT=n7]33hyhUvww؛@Fd!QOQ)ӹtA1> Qɷ̭nF+fQ_inTEE]\1da&v^w}XI즷+νZmPΙޏvPOYCOL}^LM*8;H|fVo"@  @*5tt Ἕ`N|9u]@֍A;XMG x8mʩ847^ e9=YM$ōuذʼn;)n $~h4+\Vxի7Zأe RZ.lG!@d'7%{OJ[]{gK7eBΞllg9Go-`K`h6╠jtc5:BQPd|ܐ7Y:5K$-/^p,:!<&}U њGY*H#p7ba#Oj#"2zND~?$]_`Pq+.NɰleS0Ht+.u@E7̾҂:Ҙ,o酂/ݸr `v@{0g˞DuHI|"\|xj,gNFQ,YR8G%H=GuCQj _4ZD/t Y?3F~m$FK&AnQk~k >y'ey6ڼÐzk[cx8>f FBR,녀V耵%ޮ BU \<cm!LY"Ч@7/rJrbȬOWrh_.#[Յ::+ W"=~`SM@RQ;9[86l0mh:Ϙ]Bd{_h՗٣*Fr_7Ii [˼eD&H7Egh fⷯDM]- -7gYYuUnGuVc^y,~A0l/~{o ^a qTP^Ђc'3z%`;80c4r@QR'3)}FOTƪ$"}Y-={ )iWQR!~ސyJA!ٗk: @Lqћ%6 @,nb\yj"wq\%J&pX*INaD]R{~5r"H4V&)IFy%EgEL((|*Ox.- Op\o?D O6!"uN9m2У޺~o5F([oDzQir͆垦p%+󉒌6Pg=1T-m `lpdv&c=^K07VY-䤰 TJNg~AoiQQRS'z^"IE-,~7pk .j6tg;14;=dh- 7ŕ_WNý.k' ch'v?(+6=Gv3ٙ"0 dGU͊=պՅۮZ^r$ܾQ5E{8l=|W-O7 9fCAݣNwkLCIQӏ2+WCC]$񖁟 nzYnDGLǘhF|6A~R1lI wpF˨\-3p$ԧƅd [6_Dsg+2j kFOD # ?0&u=<(xa%xĈ3EW`zbͻ&=hT\~E#ɪY7fkMŒS(k9 a£zn W\aWP{n4>pN糺*rC:(;a[:C?d2 ƏzI6 D8=X7R}v~gHŨDTO'%DL1'a4wܲy:maSH~H㑚4UL!l n6-G51[<.,&2smsi Oc&IS g!GOYʤCH`?4LGPNJ ɴ%qzbh案Mt-fNdW U0 Jp5|R7hr!vϠ(3˿ _gD0!/~}+kO&Ř]01v#wRjŸiEQ|P{~5O*ůy@}(i_߿XiF6 H5Vf]pf(U"*?e/9f>"EBE!́EfE.l+)vϫv>W1%yZbr^;E!ir^{ "E!vc<.jPSRdP} Ek `F)sq@3]om}гx%RZ,] ]Ͷ_Vɴ.jACM9r5/c#BUs_Z(Ӧ1 ZNI(B]'pjEIʒh!h-yNU4 j3p' )"d fgqȻZ$6sKZ d6j:*73ORXDطt<%<,6HIM~Css)@KS?ZiLpe$WL* "O{n4/_]m>@:(HTfFNek(-S:>~T?v&ނl!+=B Va?u3sIǁ@|#ww+_%*Qn3vӖzDguAm3Ԛby1r5*cǿ[IGymdjo-: R0_ŋIj ^ww&f\Pi5Vi-f}PK 鱐yjuRbC絀ף4k0lHϨt%k&SMFWHLS\N9f[4ȿ5z@j%~b;w~8C Cn R:| K%;jGٙNޕfݰΟ=7%B zayXZzs6uƟZaSJ޾zdGBذSKV,gpJcJ| 龔Z3Zm0 耬Aի!!\h]\#Ut ":νb53 KZsE1Xl-'_Xv+50aR3 hͲЅ>ӮܐƷPYqmlB_ıySXJ $B@5.^*qC#^AMIuf}3l8upSܠ`\ִZ\`܌DY'"[.k6%~o=uJ-SØV*$Lw` ;(B)wHhx)yfqe/Vz7r7N9> pdDg Ĵ/nK3hfz0ˤow+D</ q]_ج/zƞs(JxuWIq:Pk[ѿjQ}jiv>E?^AF7RAB /WG Y)D%irfU duC*CJs )8i߃8TǩۤT(sW)Gķ֟_Q^~dX[D4\?8O(׼yA5`5MVDYrZg`ze&)M!xVjl[٠UJv'o["naE{ޢy&W &pVw|Q<CڵP& ̡ⴗiɲ&NH*2 =]ji "u3Ta4CJE_72 fCD60Ңsd@"!@!) qsZ5~e}p4$\JY)"-BCulb/GnMftTW1}MWغ"jR)UWඟ2nVn!*qc=mSbw; (vpD޵S> 'Hy9&dm‹jl+dF[4Fr6X'X,0#K9öʦu 19 vɮR+tcLs IiA5ԩ r5`9$"ĝFX_nGTk4\mQ:{ 4#kePLA9_oM5iY:?yFgC⇣WMX j/ sT ~v>^+1nRK+)dr*|;{XD>8(ZBt extx H r(II(f- #tTKoٴ_{5٨bŖܐLoZ*$FǷTW?"(|KyzhS*[r -^Cq$K>l_tG dޚ ?x is7h~UEn) a7T#l' 9&pE;\@D.Rm:HuY[Qw*8z/q@F07)EU6JPUXؿ r%MSY-\BPO?=oIg{~] 1*'Ffxr)Pp,t>N$NAi~5D/e(fwO{$ XFJkUi6NkKt{|‡̠,OUd[('/5_6hvW5DL,f +TxhޑBb.jRxUN(}7\\ y%Pfn:LUyg7mzH™sݱ2)W$ t~0bsݼL Iܛ$iGLB*I:,iOG&#޻2tG]e& ј7Jk}Sk$H2R~'Oʂ`Uw`4a@[cg{"HqַD%rz "wu[Z8etvXQW|(1ԨR{U% mJ ߬NV3 Y29Uz" e.B?G*,Ge=ytoLf>OUw8=2`a ZDRd؞h_&3mJhºa/[g:@~RL!!QFr#n?$uY'bb:w}&`04- l鞱;BL`3\DŪvzuF}B>e zdLm龎8F-5ζf}UXa8RÃY %5/_IW_-!I&LwRţ,#mSx\w?^=X#)>[hv4k _lG"i8pK ci!oy뵙{μ}DdP LI4.YLj@a*ӬT΄[_֩tJZm˜*wYę^fYnj%6`, bA7޼!PTZ{Ivx)wqi3;HV}q( ^ЪO 7ٚr˲*noM@ #,.3O5Ͻ XɆlQe>p+,XXP!.\G=%i]YQGPCeΞ+mJcgwd@`奈`$ZZB]ĝ*r#άϛA%8Vak0Q}=0yE&s$ QvEHWgY;r-zD2SvbO˦<(s,~߸Uw>߅#4E0(vP&WET$R J Xڣ\]LA/d/jT~L~/bd cɱ?Hj/JśSgjW2GNSeIkuqĜGempqc3r|tV%j0A5g9I Ғ3'wi{PVIQ)3mB7=| _)ϲfd{W@Դti[U ty/ Le3#FHq6%ϻ _ޯ?~1jB|~Z ssXZs+ @AX0Q{;Y軠*|3oݐa'WpW!N9Β.Y'Ե& QiP5١m@0I'@,g8r~EFVJ2giZ+ D/.(N ,7&%dz`(jZ,D<3@[Ȱ-rHN([B0:d…7cM5zᜨ""_6(ܪiY99e=®o/*&lI$:pHz㷤Ms$^":ɋ/sM ?8̌@zݰs:sɩ/=Niߞ2wPQ.㭸[3#T$,>7:tI{;1bS.e}jt{YvLL"mpQyLv@_7 Bk/h_}vW wݓKH޴%CWbKzyi-*7՟ Plx;dF,5!30Op:YMQwX/[2. vkut/qu u ׏lhZ*y%#*9T:lY V >ϊ 4\=Ws+^iCk151HNv&tf ysč#G$ ܖNb[UWwg1U|Pn1ܗpqÅ׋+n%(Ĺ]Bݹqݔ{U0;Z6&K;G%**Of¨@ ю]B#GuyKOq4/7ȔOV,UQyy=#  dJ3㗰\.(P #U=jRA|}UQENn ,[Mو~2Z3[/UG,On둌$0as1r& P+zg_j8vANRw҅:AV$STYh{ג"WN(AyЁE 5WӜ:pܳgYFљ.;Buu`n1E&r}SiB,oa)Ln m.#e9me _Tl\v4cuwy#Q(9u\ʐxb_zZ$ v~@4F9*uIY%rR^,?>c2X ,,()d}p0J8a_ ob.˲_z`9ACKuM3A7FoĨMs_ZXK4;o_7t!?dپT&Aten, HWo mq~ mg)Y~s:ʙ*Ioq]͑RΗAfqAΑ^Y!@haS6k1j+p!=aZ Ch0A3,] Ɇiϱxݍ #r{诶LobCS0zL-ͻ9؝h_p0"@R2TtC,s5;FS=f\0H?#f emM,0ȷq4Yاfԛ&-NWz c~-An| & hI+y*u4uX̿#wCܿ^zM]!ƭrɵU|T# &Å_k]7JӐ{Ej2dc[JJ$WdUȣ,  Qju_@h(~ ir@zcs6]@Zi| KXCbڔ >Y 4r `H&p^IWXW *˵Am#^ [l(+ȓJ^| ^tY{5TN;ɢDD[] g:zX+>;}(h\ d-e))]!6pF7UIh "LB=c, 0[,pq&6/ПPoIIxir)\*4"5T e}MWux` `ӱOٮ /T[޷`0u;j$b)NWGs.p̙D $ vjv |~~r8lkם+f\ 4Xԕq#q?W(3~Vh(_Wâfw3pdqUY^agf $q.scҜ&y+dsN_Pus,[-h5󮛅>!6iplF1C|\;* ,hCgkTwb[} qVBj=%eZG \)I㏤݀ۆ$%rW31zB{K(]V8Z8EM~µYFWzEw60=dbejP*_pGO.xͤ΃tdžy  {-3r!@/6ynz0}IR:d?b>AYEyb#gS}/OXBU._xEH} fY!S~ߖLkF=ARO6s%_!Wْk!*8˱nɠ.ؼCb$Z}o:@I,|Acw84{z?5_zZ M.s^8'p; ;՟ IJ}ldZ; $Vbi-mn#p0ti:="gR A#{p[ #?>pd N)o>FQK#eűqdG;I1 4y>ŸG~;zP&rʡTRbA]T{l:żdWvVE_#p{" (Əo7jqI9@ds.R&.;9o85J,$Jφ|Kw_^+ ~g͛1{Xu^52;_Kz~Z(P @f}R.GJK`tpx}' ɚ—N]o8Ta+ht qfR&DcYZ͓\Ka\+Ur|*|LFA`"50zUt }[iNrUrb̐G#'t<;^oYȔHAɮfFNLa~͞$ H';V;"l)D,$d@PF/id%9{mekhKrm;s!O%FhX\$VR$p7 :=?(5:8ZK`;pEJuq< $& 5xCo6gY |$DH"[[,gMQxW["_/1gnc+ʛ^*Cky".X'F5"7!A8%#B$/dϥo'u',a_taarsbH;87^0BvʅrC:!0^2Iəĺէ`HvN>5ԆQs/p,gHn0S_۩[;K&=b4jITzC[U ''66u3Z{:p<|&jGGWq {WH@^N0{m xNkjğtٱ=CYN !9HHT &G,dFoL1: 2ybeƫܟ3|< WNʗ4E,ԅ.=뒞bN@~x숌TsYl-= -0<u jA89-h}/|`\a)4ȚGp/QeCN0T.4>J 7 Qc1R*-aIm)+7QA#$a{Ã6+8P>Qn"m{^ڬd@ 5>?No񘨰\#H8t0֫,GL{u?>! 9@IU1wL%Ȕ,n,u3E}#iw-a^y6}+V~߰׵1iY2GRz(ۮ=19>C$x.K*ס -^7=JSQb9^;ʟS"=ZM/Sf{*:RG@;;]OO~yM*-teFT?ZVqA3@ڈmL˓qRB:ZfkU٣SS0)79m4ڹ "n!a>WSO)~ wBx8xNߘO~n>R|.Nƫ؟߉#4+=s8M`_/#xtSvd:Lo!,ٜ JJVIm1!# K=`R ]c}:m#dP#TWVxZHg_цqX$>4oYTp;z}1ը ɽ,J?j&|aeH˓mlBGJ\ mZIQzW%@~-S0 LBN1Fmzwh^)1U ʃ 4J쎢7GYB6tWv{k;T))} ~u갱kj2h67?I[a½R?<WƉdȓh%&)Vvr+;Lj1gfÌDEf@8."ùPwx?8XqL\lvŒ[^weAА9-D^M%:Q 9r;+bD3&,J8~ƈ0^zLVt{2+a{12ݵg,Vs9U:=G[f\K XI" lgvjrdqs8(t:Do/ {p nH̡1J$ZCJK)Y(bb7v ~qⶂ!-xRD?Oj}1jQh)Kg\۪^EMFN]jOo!Ua5_I)|,N&2P5Q3jCQ5Y clzKuXt ZUl nfT5)B8IFaɏfdPaD]{$OZ7V:=L4\2 &81Z *0y+Mäsp2a}Cf`;(鎀Ўzn.?56>|R6p܄h<~G|YrbOI!dfmR8#-.S91Ti5d:YlK/{-rL/.V!ׂYk$\:ih!$"ʃ,\Ջ4jN0vYsЇ,,] !8[Гi=I)o,p:mcRO?e\6>Bs"DJiqc Jk8 sQ?(D&B50H<?82aų'BZ9&}+lBy)& G!G(ҔSx^cGZ@q3y8鮘Ŝ<0wI`3$Mcyw 'OtkGb+a{S3*)h>~F%{ _L@&L_IHu`3n茟ă6mEqL+շJ]:^~H('Zu٥)S l#®4;㷉\м!N}mϼ# _&ejO9#mxtG[ŃxR^ d̃jxcѯDhxخ#JUsJ63>&rR ͺk,2f`=7\r|Z_R7k~J% Z~abegj/\1V T)BȎW)"d7E-J{vV# `ǰI{݁T]s]0+w4XVvScCؙ@Y(C?eaQGF g3ˏc$D(@/6 E{Iv;9rnҽ,hMxR6QDGmqL=]Hҕo;c^jHXPbNôbcScNCp0(;'֖.H6 cmq۸60ŒvDhl>sS܂S-sq h1bIMzy\S-y%e*e35 KzA8@ޫc11S&:n(bEk*.Ù;Ip΄iShjcFm{qGQ&]%XM-sJACUѬX|ذS%*'4@~xQ(m+2p;I`ֲ8RC~'Uf攱 )SӁ?x."(/Lr5?"sHk#<~GԋrQ^[{vuVmKWrw>ψ0] rK!D{uk i~2 0{"$Y+cnv^C:0VpX14uUYc0 h3 K:5|w/#ZEђHזr(26(URDPF\A{ jX%W=RjzDDtN5:)5XQmpA:pb%ur}|ܓЂYiclDimI|Ij!o|" #*9)TX6Hd]Jyuf|.N-R) sv%ź6BLRQLO`<;YA' Z"j,kqcJ#U(5*ڲ:"&̪~ B&_EhjmkR׵ޜcUP5c垼f '>1ňWr_V;v-`flN3/^3}"C٬0e _i1}]WY&{fAI(]{ %M\X'_JlKzaȽ'=JuMqM%i g:7X":@,{e+ /rmڵ#qaS$:f]6'JVGUٰL(. K&˓gU)˒s&:$q'lժGOD;!v#x1JhK_`(eڔH6B fYt8fX'Q%zitcY L;h dg+,ʕJ f٥̑xM0fI"i&980b@d7[5֏ 4 i :uJB猃Т!;JlhEE(@WlH1~< JEO\FECi?$`73ax(;acb|biUм1y'PV$E[bLncgk,6ԛJ{7U֭$iJ JZ!A_|`j'-]$ j+ksdi%U?J楂O\:?i!)0zyj5r@P+[!M9Ϊڊ{CA:&73cSB_ĢLu]0;%?js=zU 7W\e3<_.`>Bډ æR$M )%-J1NO}sXIv2rq?Kz * ]k'ŽYa4yw%K;zW`s?{o-Eі&C!гg o5Gw¨X As!.4tkq9zh X 4f?&(Q so䩂܀xaљ uK =ZC i}b@m:Madť"gc)QwQ$p}uf u %JUqU(9cRYKH5VxXgJ3q( &W"\&V%G~ZM`~=o'J^ʒ^5c{9*RkPgӸE3 }{G&2BS}jo  sv weCE݌GN0hL(xyJm-rc@cH\f4&pe2}zI J[Ub'R4k2SIaD4f$!5ڶgacGo0{K;jGQ$"f|lwBqHљ3ݙԂXN)Ee)Qȩ:u&3 \6Q@樂lpl[!oBq%X볝Vu-Z^eը{6V+A\}^,_6uC& ZO_%r<OlHp b_*t!Z+IFua15>^ ]aըޖ#8(sس9PxUk`]21*f7so43K@So~QP/\ܐ#@TIh*BtwP_;{Sj!{V6~88SNSXpnb6w =˹Sc7^`/؛ ; kҎBxF;cg k{+}3ne~XX >X\a J%K??Ġ!C%x'&^܅c*s&l4A*xV߻>fԷVC jQöK WMF?2+`D |M>O#hI1ևꃬS~]DR*/|#E8x /:>WҔK+M@(ӌv-s*k#ħ<ˀx2IXz(U旣ePU.H1.uG2tOC^ϯ(*@/ ,!m,aI5\4(& /6v+OM k{a&~#bk{ Bc0iW* `G;1ֱK^-(À"Jq` ][-_!*4bem#M,W1sr`P6D9BNN+}cǾ·;֬E5 0i4=<+<nzlh2E{*K\Otg\s)!ǭOnr!Qx c~&@'{qAN||԰DN˚RVi07Dt@u00L5G*%qQbd]Fֵ8+Uf.tjBc=Gבψ7 |\\ tR|-8;ZW Yp Bkw^tlwR̃ѮٮO~s%n[zNhj%IȗG3ѪAEyh`|V4s#L-e^] =g%ڼ-ڎPPi,be&ť 3JazQ-?;ku>U99~(J}v .\?+18S*&[ǕӃ ̣~k4<fEjIPLT8-ƶmNa9STJ-9K ܟoLrNK٪Jڃ=b1Z:?zp`y7΋Bs8$Q:Qpju]eAߎ5gD{a5p]JX( P A(r/`~M|Ը(a?XmMXnp ށRAjF7AJ'FkTl{H|&( ϳPw;k僖;<-۲߈\cqr[ԝq۫A!C +QԀO ҁԶǩq@7$ nbwZȬ9#/<HnX2FڐuZJ`fp.߰ 2GoU%RIpNe4|]8$|nf7.נ^&'P0TwCt͔AK$b:"#s6a6u[(bj)bٙܮ &'30|NgWFzA]hUx6.EamѬxcYQŦexJm3a˩ ꟻܥ3Jԁ<&*4- ݪڏMC6VWMQN}f3ia- 4?T҂3^P2NzGcy%5_3DxSVJz Dsr4YdRm%ςO!}O .-enq{ضjQAf fYeQC ${,cNĢrÁbB)5oqZ9y)k6،s|(橄\k÷K쬥H& X>@Gf z@Vǖ\E,J|X_o%(ZMJyE>`X;?BCb uYgljt=&,{f?>*@8Kj4f~6 nӞm-B#vl\OϾLsN,'di.D_g>庌-v{H*ZSznҢJyOMڕM9`>$mz[C^7L3|lx$>{eƱEf3vz}ga$>mGGUT_?υE<9d\Cdbwtr.W=kT97XP+| RwɠX;(kup9, #h*XH DOB#xfwAۉ=^LrAK@ֱLW۸aTEStP@s U+Kj YN\7>EXsиIL:L[гFK[x G" B\#Seųz=(t[iz(HHVVL8݂u[D7z$95*G*^x%PÉ^T\y}'0/h3ApmD6ZCDXwAT>'X57C/fa˧X3p`"X(h^4mI=g!F^W! UVӛ5.e~zd]byF$Jn *]/J`ʿ*ʥ k%!'D1NOs9=BeE_v1gbM 1.8BSS~AIP+O;_sx*O ,8%dOXtFqӠyH:y [ ( GDDZOA}E 8Lt:fSY:9t2xMů%6sn̿>Á) Ze³ּSCZ)~"Q#e!+bwNՌ J2-z'mݗJ m>5{-cSuOөrhj-\˷]\Ԣ`Ԋ}ϗc; +IAYgpDdKcޖ'l󋶚0JP?( ؋tݻCm;Rv?EMV'pnm!aֆvv8qCa i/ RpƵy{nr .D9Ό\oIJO9(?Mn 20yЛT`U=<ņ4<+qkrA!"HvA茕mIU~ZL0pJE!"\ލƴ! g=ez%Wf.еTf[f_xf7j(xcG5^c&vRZ(D9NL/PiQ-?!:b~g@9Gw>T[#hˆZH:V>LB&ys8j@yf_@p`CG=upA >}Z~ľF7GpKCkt qNr[,=dzU Pnq 5$M.վU;PR %$8ghfΈ>Lb;h3ws $Ĝ|;i/ķ2ǘhgќ.nv9p£$}\q5fAˁƻ7t~r^I?ۼ ` U\6ϛpKzE\hdX7'։H,WL|vG{NaH~ {)V:m esEg>AxtxlI^ L]QT"Z9$kn_f'!4;ZkstznM%%#а[ǯ|d*/Vi(|CVv"}-)t:ݻd!Ƹfws wp}8)8.8/ &3:FρJfOCbo=LY%t=p“j[>ag EVc܇qe=OAO(Fz|4y#6KMO)Q {V!1k`vk%KF[LFHon sn PJt'K(͗cT!Llm5$)ʽ+WM22PcTͻMj͂Tc$y"9)@To Ԭ䅃GH|zt,Rh`kӺ jtM Q+z^irY%ȗղ{[f>7W-r{JK|Wo)N^jê}ϣ?=@9dFTsl"$/tI _oTh<:ۻ(Jv*1)JP,>RdbWM'a6GVϰJAɸ:'N8_qCcð X/I3Hz[2""3˺6=Xh v5W1)AcC6OM A pzxD9 #LJ2BxĈ駰^CIjt2? "j 4#Ps s6֬BCp*?0Gu2fX PSeu$[!+)+4F$wN{ mOudp>sb[1\{u1 1)G"ꎼF \($wf'^fO{ Lwz{p>3-Ƨ<^Oν&oӓh#D^% x7cM)lX(<ne8 Ҭ_0'61,~L&p"B%9֟ذ 䀒vT2}Y'Sӈ"wS a2 {xwWV9R&Hst@t|iED/G1!$IbTU4z4EV0\,F{j?d i6doQơ]9S/.M ,X/>wn1*K^W_J'\^ AjBSdKF}Qpg{}-HIo tobvy^*E^W Li1qG%mDT0$LgtUl7/~VMjX$Eެ/@ʦU-?rNIcʝfF[ wJ"V;NɖHjWBtkuH>lFvx7YӍ6wG6Ie#9h) ⪽q>BMگaP >w[vѣnɁQ5_6a:QG&'р!_=|;hV:\)VH4[7E]R{$z'fDhQ}VֵɌc^Ёl6Sƅ7\ccLW?x@69A"}߰ΕD|zblvy}SjfIrꫨpydX _| m}ͅOȱcomĉfD)&8q*7M꡻N>o[C['j{K?SJ6a! T)<߶:pw~;OrAiCcIaAwݵlYlJL/c#ᇃ#XѭȠS,G-mwl0£n.>y%=}r/2sɉ] q>ڞك Vr`4O3a{e΂ P:,hppu*BQ}_|" S9$ 5Kĵ?ql(T *Ij?dtׯ5;XmC3R0\PN="@ cZ0d{RjuXR ,c٠Mx ("k$ Ɉ$W8& H.1Nv $^\`/E뗗Fv~` ݎW#0KZڗ$WsUF / ATD,}UQ$”} %B %y 32;xdU S[}Dv+mڧjtrDSmぜh.?q~ aԻ]TI 8 `jKuAm=4/mގz+x|c>L߸Ӎlm'Xw' t 7ʸLzM_g _zU"B!!wr&_]0tܻ0pw ^zF^js~d5gt1^.|ݿ<7Uᬧ/(MLY[S5nKk{P=r˲L9Ycǃ͜s̝`lĆ[C ?1[v;:7[sBA?ڂGTtl0xO59P aM+!cflK~_ , uF-BBXfi\uz)0Y ;Q+mEeG1,Zȵ;r9+BB}%Xgkg$E_C3nTٙ8#.;EBfG{J.q#-QV&h3$l@ !D;.3AWٱk@F~EO+-V+suDXDžүs ܳ\(隸]Եb1ͲN{$@M83@R.ܰݪk!m0xe.urM%֨$q|!G.Ld^n99vDZߧ v "$]֜A*Ч[>&%4&v:rN}b5C]u;"MNMl njqNr`—QE'(!1`"neRh8G e_}b~;^~$; YC!qEDޙUa@WgJ 70 ̓,@tP-<$Xg *0*Zn며)&^umrfan_)mi*XjG=T꾜7megQ Z,dqI8Јt}Bhٟbbǯ0% zW*yi.AQMPyv-%)@S~' pՌr̮PfCj@TA>G/GB-WH'w{/8 à8k:BG԰HUS zjGt;?6krvyv.+n:&2S5g}4h+c?W@>N${e.XMV%&Yq@S|#u]tͰ{[XNCtNnccGV@itU! L&O4UvA(J1t.a !$sFh#A2; <З'ĶM70Mm@ V ]bJAҹǔh=pW%F^gxsۄ~(,6n+  tHo9YOvˉq#)^z_,\00;C@ yp?6|dE~͘]Ӹ`?א -O נсk0C5s&,t# S9` dL`Lik2b'>R2Es/BܡTlb=O|Fv.3y\Ƙ]pV0F6ƴz+^s *=Na-+K,;''%j}i"tcN5fHԆJk7W]y](~4s$XEV>6C[tMoQ9pLA3D"rq^u%(b?|jc(9zLC6k+4+ ܎M7(GQ6 mjo0Cş9 Q5u6ux@ti\/HZr>RcX.wVPr 5sm)! N0L`O%%,{}N{OA=B\bV9몖cbĘSحٺϾ*'C3]N5 (qRJ  Fn/X?0Iyˈ#.*sHɀ4٦ǐ>OcZ !Tz:Mn"ly,l`)_Vko"0=t&*VwnEWIĽv~[yfBOkY ̱K !ldSuu9{ -3IemЈmN?%[F覆"J˨C!2c4yP9Ut<7`hCS])A%Q}A0Bi CU ^=?Z\#w*xMt: 1CR4Fgᣆ[/X!Kj1 u,v8Voq||iR!4tHF$%OlW[+t`ح^X-`i E脧X0N4eAv5~,+^ m_&!SSl&0+9ZNk$Rrw,e\ly%>7ճVtd:ONڒr"s(wzq;vs)_BɐֱdCl SgD]-K̳'Z;j11WP].l.L19kN7Q̏KmP<dsA\VהBsYÆHAQ6[Ci56H WBaQJʦ{< 2"!Qw3s^ҶGْмu%VmMFy9DEDYPą9ϖ%C"YrN,O6~z27oSzI!^Gmd/GӤ#$FvYFV B O8'蠄/.X`J( kWAIdxצ4s>覛̕:O0P2POw,9/x>+F G>zbakITUΥ+A&L)1:wk \sH!l'G<3Ơ;Be%eNlC 8Dps.Xg9ݕvpO j^qq 9dFm6F+bn!L)9@x_;[:DL>g4%^yH zWyj_X>rv`ײɤ]eKgct$ti3ŔB폍칲.fvȓsرdh76lQpfMбFf:Aa7λ,&8Êli Y~cei ~+>PԹ𳠆C蚿Ќg RN%K2x9i 6z]Ѷll6 !8V`7"S߄MUm6sRoւK W'jWҸE*ɊƓ_N/>HAk;{|{>Usg-["ȿ6& =wH8o0ijBl% kV3ʎDr6ym̭^`U!$]H|,\"H ߯R%і%C^ЩQt3r)h-Ol#$B^7v Nɼ瓢+-;*L4=0deond -ob EJ/miB`5yMx8[w. V~N㓧 ̭rTNw76JR1b=eu:+2~emc3DNJz0"CF٠^jX9uPe(*o>mi REbQw}_i̷N̐ J`)۟x%Vvwyu tEE5^6 'f({(˶!a _Md`7|~$X"w}+>_`./*o(DxD;bD3 6;bc2W۩!_[m` v<ԖkV"]2l4,/I:tۚD} v._Wn $=FDx o-/0a.F:ܱ;~| R@=3g( ,*ovl&ּӯ!o9:đ,Bd[D%[%VJByHoե]L} ] %Er,[$xR`BBONq> ;}|qMc3fc%P ĺ6n$ Mm/ ͣNT2 L;PR>09NPëq50%Yl VqAwK4u_43gS PhW*ax S!(\S.*T,!wپIZ;&D?>5GMGP*ec"mw[QߞX_Wj'BƳ97kƋK7ǔƔӉ*7{5GaHvEӋ\bx)*.:_q;Izǟm*-s] $=w\g{TOIiBS$L3H|U`?r-|]a;gGAu*o#8tlݺhx v$,RԎdO3nҵ}Ńa̧ᚁVԍ'QV[lsS{DpZXh _(@ Kwκ^eY!d\^Q m]=[rR`M\+Y]Զ 4a g/ @Cu~|ЎT׻ `镁 )Q=fF xOlVu Ef GY9ڽ"0ҌtN`ܶbv3irjʬ%\>C[I%$ʟv 2Vty#\utfW?;\Y9$*N, -X8g04؇o H.N{QTipoqm)\7l!ima[DKs_ٰi taDO3"Pqw,Rr1b3U' ,SS~Kihjz$L9)[Vjj4!voVrV4"}wБr(P}je`xPcC3]K? ʚk2RY~iOk8GϜv qҎc.p*PxO޴]մ!H$n 1VQKDvQq6'WoK0t*|O6$R|DG U29T?._v T%y0kYkLY"E%,VW[jְY397&oyaXvrc1;~s?j>ζS~>F"?FG}W̚HsO&:u=6]E-]vGq:qGwbJz4[[bأ`t}! af,ӷ8p?HgoP|Yc,KCbM,4_g\H|%su2bّ5:3VqSd=ώxH2!@39+;u#825Qd*:`͒8K$5.BQ!hha[lxXXbn'JN%LS>9 o Z>Oф@ڍla.3{f aS•)!·$z$^yDžAdpy^yEV{n͸S 3y!U`G1bq"2͒T}>\,fuc\VCB[.>k՚a~;:Fi|! 8ԟpn;=A><-[6ͨ轃J^wr11NF|# ^i B'( `Bp~/Qkc8$'Ϻ}VQ~++$ZKQDJO;Z(Ia.mkgʃ*WVF2n;P9dc3o/jCZJir.k{ly0 а. !0 䯽9DA|s@,1h⎖嵝'jvcRcZyC1cBR>_jPZ3lE|~CuVFa/d2 3tMHg=]}$Ncٵ:yROJ 壎%aYتEAZt۪{aP(ф!P!h`΃/ RXFAbysq? ޱfRN/|VSWʲNRNbb796*v~/K뛔dz =Vá޹l u͋U6y9Fs|{P%T8ܢ ݮe T}:i4L?H`9J?Ppz 갩O/߻k0N5(@xK<,$+0˕}yT4lɈ'Pt.V6؇rfvMl@\Hj8J kF룺!krb?a.' O{wǓ|F qb-Z87|ëA~zECO3?g` .Є~V>C05|bw%0g=t? ߧXJ'Vw镆fȮ+/@zm2uP+6Mydg`'^rhz.yŭ~Ɔm/ j-#Iۼ7)bl~cD}BX F Sσ/)"B!Uq15Чg 2: ްrr^c Ԡ,y4ym Erp1EXW-\;y ub1ߓa;δd+mcgT/1}ɬ>O''^.rVdQܮ'j7ڊRr3W\HQCrNLbGS,HTSC9Ҏp@8FlXz4PNF0Xٶw[aBgZ^’':hrdYbwBUk(НEG3h[[EXO KoXygKIdP$\Z5o7êhKԆqc*.M/gctxO'+߂0 q}'g mY?cSqVڭQ jnu$Ff_ITP/!¡w<[3WČa/v"|,tmLF`;` >\Κw-AdZ!Q;ZX]ĆeԆPPngHkw=u*L]]tFPI _. LK*ϺC&! m|X( 'c$D $^}`},pX;Orɜٌ+[Fr:0/@[J$ܓNQ<<7FZl&ii9z}1%&jo$HJ񬸎=TUg䑏k&fm*3]U@A*ڈSeP=V^ʼK]}V6[SkomHvJZ[ wR N`Ya%Cw S@I('zz"b˾ŕf*^(" ?A DV[#E&W-;u}%5MHAdUIlK9*<R='څBg&vh0CMd9懔zF*ǭ,@V)1Paj SŊʺw(U~vJ8/#Ձj1eD`lGZhnҟ2[[$?#Wi_rط޴J8WPZV?cH5ۊSN+G0DRa e[ >@J-ڊm]xv| = ,δDW݃\r\؊ZunkN/sE$_~fe_Nv;|\e.yo~ D{7FGѓ^ UJs?+{$TU3|AVyVp|K vʕ:J:^]dW-Xʬ 酯Q0 ,*픓ݴdPjl&~j\ؖ|g DXӱ lt#Z%m <@DNr'Ax|nbJ= aڝ_Oy1m> <1^Tk>woB0$Ռb_2Gny .?m49o_ӵ*CYI:)s!4K.Ajz&E_-IPZ*ذyDDB au/&ĸ侻r8n,f겯fYn{Htb@JS܌#m62-&\kT/o҃X2Lr)EEU~squpI {zl/9#?|nN&)7]GKOR$+F >κ7ɤ~DLnv/&S9y/Z5}CoZrq!/c9!:TMRֲ]5MT2s~#E WU+gI`0 - qc =S "Xn~Ϡn]ִ$gv̩#4f@2T[ŎX"TXMꠟU9rЀC-|/ަmev e2,hq,,d_mRۼ;s]u]NqXkMDMmCRk5q>:΋$Dqm<>i.MqAhK3]bޙ%$u9RۡJ[¯ |EQ%ƴk> &a NAZ?pԗd}î刌'7vtmDΠxIZ2N9n;m9vBY3al\)h=A:h$Lzp̎wZWvsj'YOEǪ[a,:l V'*|;&Ƶzu)K@e,CbLrN\ `TP=68rO ԝ[L~t]uB@ L[T- FuM}[GZ8'M ,܆,:~}'*t*lˀTqu"1_Ϣ rKvџm*֦o|<Ư(0HDSxSeܻ6RZxCKB˨Q@Jm K1}VŪHecqa7 eSe'I5)g?'ay41և-h{ +x!Q*k@XR_pi -%"U)qty@a bw|^PlM,jlq-BMVpdP8ĶfT,**Qk)vH ͲjL10( Yc8#$}{M+ӐJw]_aL^!6 DaPF%B؋~{`7 ַC@LgiKU܍!03%4J}ԙ&tҩ??HHEAq%h!L,smvdG[xhj@ir>yuXd'ӵya?2Jf+Pأy=~b+h[l0c?O}`-l6NM{wNJ޼uD_j腕7L./acsqKnz"}Z~MȈ獣,Y*-qs|o)S#ާJ -(?2_t#XzyWGYe9(_2ӷ[g%Ґ&U0eN> @HTV Gj@R#"h?=Z@(]ZH,0Ml[_LbmFw=Oρg( AD}h̒t웬ZƵHeO! h5}5h4PT)@hqs'†gF#X} M`7: ._!¦1GK屛3/v뇟_>cZ=C<ǴRp،~-5~+p|wQ}ee$[Mg"`55Qʮ7u۷}pr@XLb+ GVRGi8MHRuv yOֽ :i >tв,Ni2v($k2[A H\Y,IC3$i#Kl񖁼G-ץ! ]e N_FHs䱞#S^&vO9<_וG'>W]2+A`դޤ&ClmIߖH(V&|U^*\?UHza7C׋wkv{jWt6fa3}M^_Ԑ}Ǟqx?:GKϪ> NZb@ dLԉy/]SKC7hO? z:p)G*W } $A L  260a`ρ s6 Cpa]ZmEV%RwMG;*.=1/5wi:mz ʊ^XӳoJZcOZ̙{AN-"2uʲ>_5Ñunx#ˋkndT[j+KF3JxCPM&}} +UjHNU|!?6XH JOFG^#6LjߪE$`"Y/ďշψ0`):R~\b#y2&%~-3>ʺFc2g/~h;N["V^D;(4j(6B9[W.fDlw܋-ܨi_4qZ.qqsmltޞG:6'Mmƽ grI껩|l@ݩp@POB}o^O@}X4 HYlIR'0 &ujZzk9q~wlneedؔ"!2Nٶ. z6COQ/y@Bo>)Lea b*3ҵpvow8<ޑ(Cﶊ%'o r(R}ԝ̋~+>_qCWxl9P[;shz1b~i^L2Z?TŽ^a1޶9<;xQkJH4 y\LlҞEMt0 wЭ]9W87"0 :BoF2>Nj!QYL Vgt-(ŘX[g_t_lbęipp8.rHnC޲1RyzB©9iqޜsUu-i/j|؅h,EyUm\月[5@pa} a}8F9Mkcz8wWIp\ g԰Tq ):'5 6X wnJ-ƒ NGC3'!@G>O&LKJ’N֘n$&wsDm`ric[4cxϮN $b]r ob;e0g'_,jSj]*#Hzz]?PyOW1n!٫=\&FMb$7SCSk;m24"BAQœ">^RfN G"{]:Tmz ew2w @գ:~I'AE@}A"౰`]qr˝R3U?o=jR%ݽoY:8)i;J7 5WE1gC!' Z{c) ?q'cvڶA:bN1Qa-Ȭ riќ0dq[pq~~?\ß ޴bb!1jʹs^g1?YCKw%bpEe#U=(ycYURvԥ$tiِ|w D>Nnh_tam,$6:08•)4 gӟ񩒋.7:wcv+OdyH À,$ƷT'+y1]SEA՜U:?eN. IfkѾ[ETyaS-F'.Vmn>od}ŷ4.Y?5$4h4%[řLjC~i0CrA58;oQDi u!5_CsfpaSHb鲵<|c&ѧpkuڞM1kOG ?q0ݐ ǖD0'Le&3@sLkBNd3 IPne1wx;SA;hd:?2w%`!W_v%#H0auym[E5#Z?*oiW\Zlg{t`M`V,ݤ#a aktqcsdZ( 8m z#bpVݣ7}SJx5T%ՄvnacXe 'DʧF#}n`uRhU$JEHXVJG-bmq3D)쓈OO wPtȌ~Sy"߼]t ^e ;)ge5piʇpY4D4vlX޵:|;IZ '=T L7!g#/I3lE"In3Hm eUG00`J#0}E5ȒM]vvߌW\qv5|QCJbf䠺eh**N;_F#pۓAnFcꕾ*_}"6Yf(]u%P8ہٙn:1֔VCɒ0JYhɻ9].ûn|ኜ Id떙ϙniN5N’1hZ0q&9':T#Ltots#DLBiVb;wg^%5yrƨ^G|Tƍ~kJ::nM\x9o1x4'k645GA߱'ˢaY0}!OO'+#)վ=qu}SdrH⴯B̅AqVXxguI/d,aM[. Ӱo8M\4 %s?0a ?0R8fDGq^Fe$bu1toX?wrtշ9q{t Jo ;ZNIF* PF*4o ްhag7* *U'[Gڿe,w88;8im%),_0aulQ$rxح>GɥQ4C{@ܛanMK͇RW]\.m4u3 ._Y`.5ɹF 392"P=ޚwzv~Um%݉/?z}X4-?rcDͣN*&<%sh=5d:laֲ.vFzt(2a!"catxI{M}Kޒư)PNoDEٚTpE .g5%DjZPWMC˜B#l@ ,yBˊAP xb\<ו%ތ;;b;ǦAI@|Rj + c]+W'qSNĩUw@pFmp򡱮 Ϣ"b-#JdL8M Z !:*{2  Jn:bH{+ҌI-?!7Ww[4wT֢ e/=M_m-f\Ʌȇ0[XJ]eO3TY\/ ֒!P/0sMX,JfklN*AҮ' k$zt_֨`2>O2\LF#ш"TW{c)Q0`]ILFu/%/!(})l$ct1wz IrW,wwNsxU"0#xxlcFih!~UǏ5!EwMfrI(`Sk6=r?(?(qP֟u'siCuP'e1L*L|RkSX(goȭ٦sdb GVG~05zx'i֕3Pu"00}xS(3.\&M>;[SޏX~*,tI}yUEPw|2=ꐚtSnRw|`E;cykC&C m>v7 f m&ˇ{w-ކqKSjŋbLMxB25P8_AA.vD8Giy :dl͝h).h)4eHءCm\zVnLq((-:wIy!ğxwUX-o- =Yk桞3qBA9jWh#'| -ElmF"gg+W%(Q.4/fRYl u~;E8):g +W;0WD9:'W=WAVmD"2=#]+@+DlN'48M-c4e{6 n, w-Pd3)~ R|vyJ7+kBfqD$k*wcy@tŰ 02 .HD AO w-S軃\La&$Xtg~ʥ$Ñ$t6 ^ - >74̸n4h+8],1͂NY-d ӆrgHYxBe0ozܚkgW"ƙڇX}^!y8Z2|dN0w5:{%g 5\ӯy(!T|H$"pxYwpHƲm/7hKgzYx3x* vv.qzy}C1\F(yDeby)guAB\O?@5XO|ۛc>º vIg轖micҿߝp._d&OZ 'xE Ԫu]L4)|Sy@qׇΌȉS5{P%QC_TW{,fnܱd[ݻKPHn-wRɏ6PUҀ-(@c{E]2x6K4k{,<8Є&e|4DT2 Hz֓]]V<ؗկUsR"dCJL͔(@Mr:sБova\ ҢH2E!&4K W':H%7S) c)IH PǷ3z^[Lh#߼˼LD; R `PugUI!Fy'{МxN0B=Lb A% +JJXf@˰E< z. ғF(_ŵ'"Q Urh0!] `Y1nwv;@a_'VT oH3#h7rsP_v@ `<=䅌ADI).ozil'kp6K(n&4`ܴU,~lWtQDl,c#Pˆx?߮@xeY]=AT`Z7G[ z?ZfWRUHR/6S:$>b2;E]5oŰaWAM玉[l_̰y$ "#66@gRKV ښ_ m2x9N 1Vf񬷕*>޸\v)aH{GLQ—5oM##ƆZs+aX$c~B@!<-}w& J8::=†w:nQV/ $=[qwV>YD`3i.6slP-~IV(6Ui& ) T /%\7&FW|}(7b+Nn4tɫ B ZjWHXQ74q>#HV?yb"b@O1k jZ 9\{^x`=|ߜu6 5&eYxY_}R 'f|&~a_G9M!bE@f4Fz}1`y:]MLV0V67; ǏmbjNֽ;i۴ to|e)fRA^K~ӊ/L3Yw;$Wߓc/tJn1:Dm dmqnK#֨.q(p\԰>x;o &ݫTh^:roO*BZNu?j/dG)kK39+QHJut0 ' "} h:0TG҈G˦_/],qޙ_f\>d9h}I0!oj^aLLG05kMŜۺɵi// Vvަ: UVAѺ9$EĢ%E0<8>EӨS/x;|~37Rh}pwʳ0V{ŸoMr 6I3TzE뭰Ab(0hq 'mcT׋61U#IYP)) WB:}>^c*}Ա?gRGɹBlkոG "Cwz `%\F3^|1յVHfl:2,ՏDc\}DiP+Н I* Cpw:ٱ?RO>rYnG4w*7蹐Z=Vsb4R#Y,%+ z$ƭ ngcJ A*J6NKԨ8=NۂUtybYwfl**/x‡ڛs-%ZBFKI'eE5!)p&BE~XA3x]9ϔ}<'T)xɤp0MꉬD.c++#rMIX'_Td[m0JZ0OE>-t{8)'2匤 <<|s<.0j3WA]Z0ۮgE6j`*+"#x,NFZX}OVk620%dg Ol6YH1 {-'H,}y}d\ǾGTDHXV@hEѢ۳וz L<_T% 2Yl =p+g_6,5VϛxiB>0zLu8y|g/w:4~4K.eTK&DZqOD|ܢ},Lh @~Kң>-fc@@>wYAcOGou;@鏎s b%_8 XJWQ.[t˟7W )aWSౡ\e-{oXgO؈o0V>lAxjoZC+yxSTEEh78sH72 ŬnLC߇yp2%*=^ɳaF@|WqoܣuY.Pk FFs4E 3͚Y/"SZrRO| LyG>GQcˊlw (^K0_S(V0J3SͼQСvDX WERR.K~WY$(zŰg;shE;ۑ+B,䆲 1Th bݪ4LvvH \<Q1 tm-&Viw7^@T t m\Y z@_Ka| @4Ka//MChV~훒xd8U'W@r&#J:[>GxQ^PK_eY)*RYxp Ff:lDDjJZx!Ȧ??s\-&t90b],SEY\GCVt`!+סW ~9Tِ^qݍN,l$Q,[CZ%QA9d[8n5;14 +EE`MeC7)IOuU>0өz%NjKkvlf/ެZ6cS !$l:t 6ew@IA*4B]%uu4UAbS{Dʪ1NOg.PR a?_UE,)}NkTx ȈiA6Qoʒ/?6uTNƜ9">9m̑YRv<|֦ϖ=NKVbo{:|ZȨwg2P``N?vqH! WdYup<Xo5M?'K~N|MwU:~~w0cyoq78Bkpfプ;ꦖ}?FZ FbSCl'nU1c =lb,Q#z0:UXzi:=ʧg|c3y׃m/I[+Ҡеa\Dvp 9[DZ![rD_:e\=z=m|2)9%Whmlkk.USî*""5g"YVϴ̀J^_7an=5ܓ+C813FyXaMOAvM#@}{+Vv=7- kϊbƶ5 pQNk]";y2-}6J{~w@I9 ۣ9~\-e *i KtT&WvqDIpv iemb`qHK_t.JW09Ek>Z!ag^cB$ī%ezXخ&G;+'9)<~Mw0 F QiV~L<(M&mɘb(b3~C|6퐀} &|ң&D@\z*D@?(IM AUS%-0TuZ]K7v]i:H!ݽǫC d.m9tIV_c'E Ot\Xv@̕Uk(C' 'p1.Cd B̝Qc[{4u(TN[ǘtr$<}>&J<jlb6mIJ+t!x7'˪&Gdw$k#j~8b4g` *nFY[ӗk<75G&P#>jl2^ۍnx[[OAn'UYn q# pOxqPkmNz+jngUhg !PN)8I^r<,+͙?;}jf `OWqMS*H3/i(8aw:|2#%;C=69Hc{wI49q'ƶ3ŚAv>7?L(#ڙgA{Xz6A'!fFrx0ߣclտ8ې0oG G4Pliik{(vۥ&S1;UR`qJtyNOUե'ivS4ExR;R3) 7*bNG0pt!oxjy\ Jm=ӵWzf #Ap[%d PI+(қ,UÒRLS$Oywe^]C!u ɳ1qk?E,J[FkR Rř8'@H^߻IbX!es7%3xI8:Jd^KG NV&m+ ?^t{#[AHFbV-`,.-DlQ9yo/U&I;6UQ.šO=6ܮVKIZE$Dj+@4)|H{jo#IpP\ω[w,KȩPRՃZlo`[vLD3`"2"ogҜUQ`Cj Lm*RlG/2]'C45LL!`כHEQGSQuA:LMĆ4NcG_̬<]DG$MWc4WOTY./`ϳB XiCj֑R)u*9=irYFmyCwծ(sJ
S <%REfS0-˪tw;liegy̶/_j~vG;Rp"YRm6mr0aryVp{z<7wEDO߅MoqaF9Zf=v_ðx|܊mo[!'>;2?QpC|Lt"4$$?XJ(dlNL5m#Pws!wWfTP:@}0b̖QyP;|IpfmqSN?uI+qbvRCA<+Jh[*\l"X*˯SFWB%`(E!i(?DP$YXr8퐃SZ^Y'JWy{2f>R|fw7F~k5y(WqdQmpQ##ULv[gCt)iKc\\϶Khs#4KJ@0O*,@+gbJՔbU>UϥNQK2.Q̴"-f(:k+TA@<7b,yg:=3@ Dz#k(D;ҁT@-Yogf{<*)i ")߁jxbHԔR1ò4}yDw8pt3&'J6<}/\bMD$CO>#B5( 7zV^TUZ We_}JZd!݅gh7q^;xJ~͡ƙ|nXكQj  Bߵ4kur96WCݪl!nz$m ޴F2?sg̝H#i?AƱ@H.5 '>dkQݘ0xBJ ~4Ms! OEF\ؐ=I\&Lm R-F9>D$0>tz(a,ušI1pjiexlB6$a!oaQgHx*3|!Hnq6Gڣ(r (k#sۅrMzFϑ۷缣fTI8 w)c#gG\Z o:WH /XW1Y"^q`4AòYNf,UJU~ߖhjffť%7hx9n&ݢ%Z#:1ȿխ5G 0K*A}o}r'g#.?~fh-N56X6~ы (+jdqBJ#EDxzk¸Q>آKQ:;tBUbe,kkkw[%繡߮`Bz@i#/U}mp]DSiݓ ^Pp)VpWc "Deh?`pe%3HǓ,ϲ7BM!lTU*I2IzJ7|'TʞCc[Ͱcs LC(a$[`=I K\z<[Ul .jsmַeBc^.rrH;];kSB`mSKC'X[KξDn+=1L6R $$X3kGǥ^9֝iE]: }S?L 09 g0"rKلҺd|ѵe Ӎ\>݌'7#4߅7/.ӣ)[z,(בcC2y !iy2Vpvgؠ*YnްdTB cۍMN3֡/HK/~ȿrpXMKyOGNj߯ VJ6R_66acsL)$,} MR-:m QbO$wQz.+^B/lKI dϬ$K}[xUIVǮݘe*gN/ug8djVE/q9q}Wvět>X?4y!nc06nA{9b݉VXrǥ_.6=,i UKb"Y8$:9rX/kߟ/Tq[Ɖ<!5 KܳEAL(vGgbVsFcϦ--&muT.46Ҁ`S(O naͪQ:~DΗtdefuh9b|1le -qZhR1T&cЇI.>3xym975dE#P'h8I< Nft 1]8Urf`Dfx-e\׻a~ &+կ8DwqL>2 CϵNg4ou,/6j,;iۇ{ج :wE2C+#v>~X=|bՉ ]#^`T='XhwsG.r(6Qq49Zw4yIN{1.zK@?%Kʈ; #+ 抡\ӧېOc'&!Ir֥_/Yu-Y' [L@d_(l%7:$">hl-CH='шӻ}!F؇{N&Fgh4KTf$0 ɋ5${w CY58%| .lV#=u Hk[^B&=E%Gq!3TY-*]`xg7h}Ev5; I{L*T^o&LXarVڏ~![)0gtSL[mݾ]hl?l ~ V$w^B Δ2 o)ˊA;)d~xm!Ms 1T{4) PD[IA[@aU8IS)j8ɅbO]~Uc靳nEGmR Y'aj|?PU:RM?hWVO5f E׮ d<?c*)!DaĮL6'RTuc4q<u.gHWl|Vw Yj%4C?/h @G[/f}GA uz&=R(7C%`%s/U\5s5?qh1']$=JM%ZR/75w8!R\e z~ $ۓV\!9q箱-1"p;D=v#uC@ZeQ^&lVoW3:q| gbkfķ^jidh:ۍ$b|ס^P7$8G6ؾ 9d~:VsO_FAϿFDcl|.gO&7>?cQu+sGEնyj\lYs*Gbvجk7"??t.sje@ؠЗ$"`58M17nXn/Q"5q,s}h~Zdߘȕu=0[&b-tyz'a }B}- KBX(4z m6 [S fu 4u 6'[0M"P7] ƽK?:Uv(dCNѐM?]M1,MEof3,UmMbۮY<}I8VYte*}L$`tF|NjD }*yGRg)Q43ǠbI{`j Nme[>fA}cr4GǤ5!D+s^˱ ޥ$gh*Pnς9¶_0#\ j)9|ta H|t vLImKÚ 1Ӆ~$ŸGZCfĦO5d5&d 9Z ef?p'l.1,]O'g27ODB )@ȱԌx{4Zެ l\ȑDgNXM'97f]>Y>?+7Ͱ>!I:b<#rD*"YHCyq IF]h@DY,xH7Q=]yQfU8MrY?a.vrXB* m p"`;׺@W3;0 GMB,Mʏ*V[ȅߓՓr8c35kȺZLd)4ѻFɒP-{{4){#ri 윦 V"ňWq-QƘRKJ#?E ܧ~`ݟLk9)7X Dܣ@Żt[+<=FJW)&Wra~ol;jj"aV$)#tdKc]9{[ h![I К2eta$J#2Qf^^ޠ>5+{W\ɉ%8 Q|jmrE yԆʠ@d=-˓,aÐ斶/I}#?TkesY2~d ߍ?_>:&Y cPFX/y{LlHR>>n:86lbo#{P %yb%ݓfkTR>s1kM;PvSYGNeD%;tW:BFq3Ft* X62yQ^M S_RּgRˀSs;*fOڱ}FOi<+tXJb2ȒqisxD=4mQ|`S(oPXNww®n.QADܮ _ʠQ3R %97)xAaSvJRxE. /(8:Rc6W: J3(&*mZCcZۋoq6Ո{ 3@3?92rMisҢ)ccZh#[F(Fh&NǷ,><#0L=3LE5u{dg6>TPB܏lPng1%' \%ICx&M9w]BjHmbFFjjxAIn$ :ulA`1jlvbpZGA!.^.L">s_5_}-ǃR+>pP(nQ$hc0|h1`o4|8z8 qEc$P"@{{ YD9[OzJfվ4)Uڿ6=0Y8֨.$"3%Acb(ٌʫL\jb"sRrŸ:kDTHM*oqr<#=p'kr e"ŷH v6=U%Ä_IóuuLSGo"L*~w&18>8uʎR"!ܿܓbz8QX*"j&Og4 xѤֵ; ?I4!9=F!Qm?&z#_wZ`50haE?‚qH"$?L&/®*ԈcOJx".r?^sn8p2AyGm|en:jX Rθx%r.R9%Be`Uz%`dnle(X9"UJ# Ew@0H֌+g!Az\XEhd&ѩFC CAn'K,`qP(jR;& UF9~(3t9!VhD92޴_i^{ XF,HAu;saqT0D){,pů  *Yy I^Zb {fdN3}`Y l*Et:M{8v3Д9rqwM7$e̺Jq0~1|潤Vob,_Ƴ+0jg/ heY֊s&5 s :;%14?jnꒅs);\r8½%&i4s( 픁e-yzr)!QI5̫~rN̡WBhԤ.$zŰ!woE9G&ߖP*(x`8[)ۈ=0op/NO,pS1_ɮg` +Z65ʱ~@;u~|]bZ]2$n\ )UVtXB{O%8K="XC.g4UBSQ"ޣz~c@\aYѝ go(Wf ǞQ^j cU>t{ՕOXnic^2dj3zϵ'gh8 "ft:J6fgm;v#T<#%-U-ǒW"'&=2zK߳67߰jGܳqqW/)[⭙yanKbqU qƌ(lփ4q9Wpԯ}ϟ`I5cbkqAwv8᳣6`߁^{&ӿpŸN03n0J`U[ TM*!_ 8`-w0D~EUkAh‡Y+ WɥH942*ҷ?rT6; POy Ʌ/EPUf=AzsY7^Q&=pD,~jNg#s,mH&lxS( A3 \[.,SA)vE^< Y@Yy^0'IVIBJC%钉q켄٣$[0:Lw~̎fhM M2Qh 6J" =S$4>,Z;F菣ݡUh7T7§T7#EHxxbQwlQ|n?ut2{ݍbW&ސ)]F)ࢣ,EőS15`cצf"^@f*@Sz$?_Wf#Ҕ24KD["gܸv?I]ɽO[*QH289ų5JDohq=)J[p͂66PA$&?ph#dLHB7קmZ9YgQhԗADhf;sX^7> Zi䁃e=V@fqC+ 闌  Gi+ И(&qI4 ۃ013G /]p,8Jv/ZQLd сvܖFB@v2U =QU6k>,dB-cHsffTQlAk |D3ewCղ߲߰8dC`y%.2h7{I3I1(W6U`Y(6L3ܮn'΁_ިjYm}utmd &ĝmOUf6AM.° aO%:ȅE0Ax™knF\nOѽ׼9ҷJp%[\ jٜsadl=WlnND z{凪)bP~?%lj^\ ̚Ͷҝ^ɐJi2|dB,5WZ~Oewc! Q^oT&st<Xt1@[e!j =ͥtf׬\jݕ2EWpa`]_.0{i6rh!W֤:YĞꄋKE=Gǒ(U P@ ,Yt3] ك?8x!>DmNep4 4@o/1%P}DŽ r&'H{(z՚Wɰ)vb>R]h^DoSz$e J fC~ ԜMZTst vN6@8 %e՟OEHծMܴ5aYM3rPr'EV M?q/XuOu5PrF#y&ϥ%)@?Zm@ݰAbbr 2ţZLYw KPϛ98glPv ^ dxlg97ÉogqaxumnSݭ^g4)"`^GYn7X. ]y,gWACBO>J|j^ZPvN!#US8~"M/1HfaVSl(Pq72<<) Dޞ ba%PJ%[0Ċt#^a8L䋬&V;Y;[>7@Ņ \6HOggM쥨9~#`Ddk gI|i 'OOATn] TlvK+t)?ޕ6;VWFfTLHÀRuy$axKRsA"s@h1u%tDN53⎵8ѹ8#U(xG*MJDŽ׃Y8Fpl@ iV-] Ol.s88wm%~#XF)|΃s3(`KDlpj , DMJ%{K%kB䡡 Eŋ+;J"Ր8lH}G=,.ۮ(o圎'NʹӋ]~i[Fۆ 'kRXT9B17lkŅ2W2 ‰)3n^yc 9G+rm~@w qQlto[ xPCkA~vU2߼zuLJ`Nezyk!ym+-86KhWtJgn=TnVu9qIro@ŲT٠jT$B}W9p2E"{f 50],ZL ^w-XD2;aRF;. 4L0HdY#ۘ?H;&"7 rgOU6 tV̒s!1pIt. 5Fh9+$Qh9x ^n_C/B.=4HpGԄ͗L-@sj|6t2&E8Ý@r /YiSA- `PM!sVSOA!`IXFpdQLsA˚01XZ{]]km0.-ndȎLXs?^.椯w\3AFd-uHZ]mB I9W`MV|紜\1 !\w3215T˼Xuhaԍ;/wYe[9ݫ^ȶΡq)0qͫ7 =w1G5;{:4cP~6!PCetJ{Mb263zZ{S.CASmUV -~Q#Lɳ&>_ޑDG%)f"+u4r 6Я:4{xN2=NsU]%ͱ(ϺQ%_7;nwv3S$blGnmwf媆6J<{eIٮZUh-S_m8r`Aշ.)y4 ڛh/H#?p󓞫\7^PT ђu C..S7- =Rd94'oDm̂P۪>Z ZCB~WoԺBlfb޺fpR}_\sc(ESaўL7:=)=) fyLIuP> %jRȍxv'q/0x\Vj88ݿ.)> Id\⋖wʄJv2Cl#~~ʹ/q+ *5<zPXbV^!6)+) %Y\* +뽝w*mLI)IZBnL=&i@ Tg;ŵEv[{);P i%:qʦ_u.*uD:ӸBE^ U8Tŧ#UEb\xR+hKou$%DdwEJ4vL4q35003 vϝ~vGR8v*:yIqwF bQ[A͗ϵK*n>38*ђ'EJ&Ӟ^ݝ^2'gdWFaprJ]*^kC@D\48]z+?s[nC~H!-8k RTQzEx \s Bת>XQczO d|l}K5uYIJ9N#UvJˌp&r![ -r_Ԇ',-'J@በGEBUCfc:2`bzUCwL>˺egO ~=Rn.gUTlr*#3'w%Ə{ti=m%\bX>؀Sw.~Nak^`LON;:&oSWHa9clX4k7 vhqAUȬ]+7v/*c$3WyǾ}&iDxk(.,!9R{}j ~"C\g)+ ~!iJUu8h.K7ΙIñ}9v+&o!٬B |}}XzX6ǠBX҉FeݕCō86DUʡBج&|Kvl84޿N!0@'1P(K5u7JsaH*:K}̻l52yG&}W6wf/yDsWIڇrhUiX2Bnk&sm7=oM5`A^%&71ԭM9pC%s<,-9ȼbvFK^N{gs>"6SJۈRɒe5iqQC,aՉ@Zbvt|:m)zQ%o帷'+D9@VHws ΂ t?wo$dgE*/6.rЊkXxF[4DE6{ϣ_%?%'};R6M8+5hJbdߵB}nlR"Q0w#@}ӖD&Ĉ4D_Eky@ Q׃kaY͛:sTp[krJ =fP Қ~T3өH.M$HU?Wrlj[szL'a8c }MOA~+*/πIJ_n˕?sa*PJE iEy gBA5 %%/y:Yk`SƦ pTI="Wa‹uӌS8d%a1?ɶfpLmΥq;8XO~iM.09;oLI,.S,|XHv)ө?H{C PX zV#A(ܠ b~kJ:F "/L8%8X^Tၑ>wT3 g\y! *RٚYw  .E^ Xp^Q9"?NqN0w+枙Ob=W7޿CJ4.fbFY OYCb21_ys^bO!tCU3??= "阋y#BkԪ)OU}8װ~YT|X7k@sYx`9=Gmw|QDhSg<%r'S0=UN%^ToDSXm9,;3<̆&_ZjP30gZ#O{e?*V7^HI I"6`APAF9F !ۼ~ۧ]=3qtãLZ)GEP 4CA9J]pb" OP?;3C5RWntkd\АZv:ܭKR$fuͨ"}55v1;lnϭh#J.KOI*A mw[6S[ M"j ,,7JO+ rw4T]d=:/OINk }UD}"BT(i4:a38ʼ˫au<qAkHF>G]=p*-+d;IuLkuh"k@UW ?dhktɫU |zB^Kj, ?aT׿['R8qnfG/l; ki(_l/w^uAUWL=[JIܚ6`JCoɩ Y>glʵiOs ^M^lkr`Uθ Q+p] J߭"+Q)! $t_fCŒ1N1$&.)v 3yBZvM,A(Q|1v?vݲem|,C>j :>m.&\ YGOYL@]*NAA%F[**eK8 @5*dId9exUjȄq&Ⱦ!Vy.& Λ,T jO <%v-?toQwZ,sUt07ET4%el3$qNn4Kryw[ kV5*uI3<$]TDm2w,mo+(4$znʳhbP(|+#͕PCh,&zm-&g%RB>X CчkRZ|Dp,B6ӡ!B'(S׸z]HS՜mx{3;$N+W̲Mk]}RH}Rc @NCGon ȍ}a Wy FՏǾpeɒT v30]'v񖯗FĦ[TJ @hZO1LsfE`>i=,0jS~/f 7|7Ss{h!c .=m”T'T|&hM'-@$xĻ~j-R1{*t.5}8I 8cDƩӏY-OTz]@TWP! nvʯgaEs H;'\K移kߦ]5#\D!1s1UGI̞:+0FnFκ"^X咲ߔh#3Z.'yDsQXREq` "f4 uf,CWs 2uÙW1fer&H+QA^JVVpGV 4&GuX La:^:퇱$kji(gfT9Yq;`n5izGa:7%UI\ǵBDp=]{{!S\y|wiT1yH6~n&]<) 9Ud^GNŌW7L2va9+jgýV B9J'MVJ2 | !<C-wbtm;Y4{f'G~#T9RR]Vz3JkF<9K<= ƥ)ѳ<:b}+7ttm&6W70X%'<&;d^Zբ繰Mkq _0u dMKX"٩WP|֗霥ѧcQ9Kb(Wô8.? G=mGE g>%jfBm"L[C2w`ĉ{fV;trh "j~zP:h뀺nPW8<ߞYr3iǰJynmF| l`y}J]YeQƠĴ^]Pkv$k ha=%~Z<x^IA+4/Ar0J.Vʷ( kbrb`Ar8!|2 W!Yw ?7/\|1Y-+xjY#֊pt\B7ڰcSfls`}@ut߿ wĒ)>tEMK{޵l!a{a-K~$Y,# 0?X:e<(T7<++aB:Ά+7ΞJc&Vk5k?obwOX*x6FR;S33~z VȞˎ'f0|(1U ZȓMgPطdU'e4mʔHCAI3oNN g^c,IAv ,DԓAqO1^G($cw4ے%[nѪxh lS斵q#m3ƦY ctNա -ʧPtsM<<7d&,M4N?- >w-ȅ}y8Nz[hq=C 5pb8/ ܡҳi^l\~3'D'E4dBU f:GeRM6JE@2 DU??`_ES-M] d؜R],.|KXiֹf(Xe]0 ~g*48[>- gjXa͋EmX)pٜ*L10ע/V~I)z}$ ̮qigCv\  /\CmavS@`D f1r^/l}7@š6q<߇[FhNx !%ErvQBN7n!O*>ŭhT-C5<)[K'yrk5id{:YVs&$ FO) ]@>@K* lX#AU׿MtYQsPr{Uh5`[-cO [J%\I楾مp@p:w5 Y!+b6¯Evn8xL>' /Kg1"m!X=;DmCDI&3 L3>EGjMýCToX\wvujCq&nk햡~8{K&'k闡qA+O o ?oAcyJp %` jepYޫ^|JK$WVSe RQlkfEr ^˼»꠪Mj^n 8nj1|BU'_,6~=9%C$?20e(%'R1SߍWOVeF*nbMI3rW$N̎CXbIn%^1cgvVqKnz9jLzmx#Su;j Z'YAB#ԷxUO˾&q͹ь(OE eGdAW6c*dnE0Ő.Ѵ=zeYJl# wӭV]8HC-<Bpsގ|ntXԿvtJ$E:r[(W=@xWe,q|iy_FX@H;+o:QEȆy&gA^j[bUQBivv{6WLY23I1ܭp Qw8[:А d\Z`_u+.Fbйm\dzIT% $=v 2} ݭMCx'/0uz9j!qeIXMX|E=DB8n_H_G6-G9RpMݾ"n )gD!BF?;qC_"Mj+j힭 i6:4!#{Luys iJylW?JCu!a.=t3 lLs f@[{Hu)ុUW\:UaQ6 "͙N:\RLs<4- A~ ^ nVh2'\8&CH^ 871fk &&뱙'ҞW1K.|65)>0IV=wnXu~)ipf 1OHt]tEVڍJBtR\;{"I~++1޽ j*sC %O,3Q˓[S"WhxƗ >+*6r"&*fpLHKxۆw;m51Rz*H_ʭ*LO%Q()z%a:>X_]X3v",6s IĔ Y%HsdWR> 1kͨ, ׊a6$ [pg2l>zRvʔz`{ bLckFtlC\JHoT<n"7N\*>czZjsfɾhkosLDxce\|Ch=# _38Ih0DHRK,x\9g3^vywwoPO'鸏 ڀΒumTЅ@d'?et|sczᆯ,}aC?5P9@n8T$ziIOzvsJE*jk ʵ*λrin M>lJ:\j FֹNy֬5_ `x5#oCt PjR够Nc` gΰLݬdf1^&'Y@Z,4-b/Xy6 ^s!! kN4ӒvfpM nҶ&\gԣ475wO*$>OrMHMos1FIl6\%"R. ¥뷾nf 'wx0}1}' 0´JS)3z`fN͙մ2lYTv]q@iʬ|=3!U6:uf* &Ŷ\=K(:w<[q6Q!Ψtcd1~#mNS%MZs@gԖQ#GWpsCXuBQ'_B6u OEjSAVGd78P5<,V1N/X`y4]ͱhە(!~kY>3Bc׉qd%``<\1jG~/#kmmx "“qeBC]w&B,t8)iPs(Hgo9Bn<mF(`#[ś i%NjnAM<&4؆.2!~j@ݸzeaV$ WɞHP$?Re컡 'xJqglL[3gw۬!^ yx_Vl)(Xfd lcu-v:3֟$߲ XSPcƏr6]>}bC Ŋ~ut*y*:Hѯ!au E*n6tsR'?q,a }f+:*H _ ۘnGBqf-bNy5(3JPK|F ɧswT_'M7@mȍ{bk 8lQ:~8{A]u[;wCBc.\ erG.d3UmhcIpl/ZRQ J^Υ 0+nI['@z3oA0Y:Hat>%HA $)W$z.3i6l \M*yPq}sEMyU+Cj0NeݓE̕[..rRĭ>;`jCL,FR4;]"kvH HˎPAjw^7-X436Y`Dɤ;%±Etts{;zd0ngT졄ͶJV YTN49Lγalt@(J#?8x-Lf-l3Mۨ >A9p~ aq]ƌD6Hq`M>-[/t LR[;U2}Ri7 5Gy< jipQX(>je ߤԓnxg){8=yaD#ېTkC{. s" 8޴W%9yM$ޯxYveVXjEY}M鷬}_%|_@ˉx8"S'ns$zxedQ3:5re6.P$k b= sܓ'DFl x dX9,,t ܏RN2Fx^^7+5- JZ@DT&[7{3sv6X#\EM%VK7/ ikdEDd{>1hé Ns5Q>>* : ?ufH;b4hZTY,pH enXfxK"tntpk0:)[iBѮOKaij*jHĎ2H!,~Yw{h) lcaB Ư~.Ia}cNӷ0d;"HCeL)0~ 9 /*"jt кV( $( 7~ftU1:/(a% )-O_v;8-|X 3ċck[x0f"pph"dl*akt잋NaBI~vWj)k:fɸuy*EDPhKEV5J$ "ⳓGtUIr!yBe62㞶i/D2#gZ!d48{u"i^U+n7]չl75œ  !]PkBzPM4?Z8k2@aֱ|}Pcg- %s_ S|ʓqsxFߦO#dbFy+xήn'%rm1B-EΟD"#OjAgc9" .r `_bu۾"+\J@5 Nc{[(|Ro7(BTEqN“0PeGOR$Z<_S]v}U(p;ЄL="f} lP%OP2T%y2/Yz ׉< Au's ` SI+l622G+Qcx{mW/!r'4['b`ھybӀ8Oz/b^'?5;=V$yV<0 ;D8@zS.qq$Y̧jeWrɠ<T@LL$uٳ :3`ڠaU\wߵĂ ،cA.g<ۧŰ6'C?ߨ}U( ̔Mz5jSi褨6Xρ@1-{lq*X݈ױ؜͌33X5DFb]|!’Nn?1?P,2(G6UL rYn0 ûW/cl]N0X3c5Y%C\qdîvxZpΒZ^:q͔OM _t9ƿ;`g_#gLg23:qϭ6: daV'"㕩Tۊzns2Gaa_Sٌq՞v'4B[./ EHs@Mܼgv CoOuB]3N-7' r ו4KucMYk{JDGx9-g5e&8 T2 S g@P314-bB-6'X|4K00O2syQO^*NU0K* Vn*]wy;6vϩxYtP"0p{XQ\v9F]f&>qvGk?> 0NT_f-X]&܊VͷvH\?@gsW.Wr6!2T=NW2`%_G2cr7c#6C_+[Itib[\fo`)ɞuOJԂx $> |B>TN$1Doϙm ߺeIw<`"U`N`srCkRHa}~л >+;ζAه~ mmH]T%z+%Rh{n"N`nGoX VQɫA8·z_3ڲ%-wsv`{4\VGL17+&Fr۬ ;g z;"~ 0biQچ_f˘yRO J(k^.lg7=9$yw0,f~U>A/$[YTB Lk?R/1룒6@>ƻqUae[Vb?Ə4!vj)g pI9b~@UzW[v).iұl.-QroTqTFfmT-rnSwm~}_q%Lu]dP}UOx{]0ؾE*Xd%ez P \zL:$H xmNJY5nId,K?E, c1sƙ%<.WQq(F@E/{qir>RR;0N%wtZDgQVxkmJX9FF~,[K3iy@o!`i dbȖ&˯ +kQI+~Җ~pPEX b!Mh6bRZpAl%pY#BG|qė{mZn5zhքz ]k8MC%w ^7KT}9/~]6# >(1b7Q%O>Ҩ[2YwҢNh} m)lZ SI4=R+s iRX۫XFԺȐxo{[*sPe(Y~ǎ ۳enR\VH5BY ;_WeMG_I|'[4hwȲ ̀庬3~ɂjN_3[?76Իh8[,ZPU}5KаbŖ^ur*¬8@h6[nܤw~{A{Mޚ#Urgd=j .)Vd[дks ~,և/1Phb4Rܿf}u)~pKEmη' djj'lI6^()L]La mQ=s/ LnLe&DZȒcאΔ`q)E]"O,g1QЯs