#!/usr/bin/perl use Config; use FileHandle; use MDK::Common; use POSIX; use Carp; Config->import; my ($arch) = $Config{archname} =~ /(.*?)-/; my $default_append = ''; my $default_acpi = ''; my $default_vga = "vga=788 splash quiet"; my $timeout = 150; my $lib = $arch eq 'x86_64' ? 'lib64' : 'lib'; my $isolinux_bin = '/usr/lib/syslinux/isolinux-' . ($arch eq 'x86_64' ? 'x86_64' : 'i586') . '.bin'; my $tmp_mnt = '/tmp/drakx_mnt'; my $tmp_initrd = '/tmp/drakx_initrd'; my $sudo; if ($>) { $sudo = "sudo"; $ENV{PATH} = "/sbin:/usr/sbin:$ENV{PATH}"; } sub __ { print @_, "\n"; system(@_) } sub _ { __ @_; $? and croak "'" . join(' ', @_) . "failed ($?)\n" } sub mke2fs { my ($f) = @_; _ "/sbin/mke2fs -q -m 0 -F -s 1 $f"; _ "/sbin/tune2fs -c 0 -U clear -T 1970010101 $f"; } _ "mkdir -p $tmp_mnt"; mkdir "images"; my @kernels = chomp_(cat_('all.kernels/.list')); my @all_images = ( if_($arch =~ /i.86/, 'isolinux', 'boot.iso', 'all.img', 'hd_grub.img'), if_($arch =~ /x86_64/, 'isolinux', 'boot.iso', 'all.img', 'hd_grub.img'), if_($arch =~ /ia64/, 'all.img'), if_($arch =~ /ppc/, 'all.img'), ); my @images = @ARGV ? @ARGV : map { "images/$_" } @all_images; foreach my $img (@images) { my ($type, $I, $extension) = $img =~ m!([^/]*)(64)?\.([^.]*)$!; if ($img =~ /hd_grub/) { hd_grub($img); } elsif ($img =~ /isolinux/) { isolinux(\@kernels); if (my ($tftpboot) = grep { -e $_ } qw(/tftpboot /var/lib/tftpboot)) { system("/bin/cp -f isolinux/alt0/* $tftpboot"); } } elsif ($img =~ /boot.iso/) { boot_iso($img, \@kernels); } elsif ($extension eq 'rdz') { initrd($type, $I, "$img-$_") foreach @kernels; } elsif ($extension eq 'img') { print STDERR "calling boot_img_$arch for $img\n"; $::{"boot_img_$arch"}->($type, $I, "$img-$_", "all.kernels/$_/vmlinuz") foreach @kernels; rename("$img-$kernels[0]", $img); } else { die "unknown image $img"; } } sub syslinux_color { "0" . { default => '7', blue => '9', green => 'a', red => 'c', yellow => 'e', white => 'f', }->{$_[0]} || die "unknown color $_[0]\n"; } sub syslinux_msg { my ($msg_xml_file, @more_text) = @_; require XML::Parser; sub xml_tree2syslinux { my ($current_color, $tree) = @_; my (undef, @l) = @$tree; join('', map { my ($type, $val) = @$_; if ($type eq '0') { $val; } else { syslinux_color($type) . xml_tree2syslinux($type, $val) . syslinux_color($current_color); } } group_by2(@l)); } print "parsing $msg_xml_file\n"; my $tree = XML::Parser->new(Style => 'Tree')->parsefile($msg_xml_file); $tree->[0] eq 'document' or die "bad file $msg_xml_file\n"; my $text = xml_tree2syslinux('default', $tree->[1]); pack("C*", 0x0E, 0x80, 0x03, 0x00) . " " . $text . join('', @more_text) . "\n" . syslinux_color('red') . "[F1-Help] [F2-Advanced Help]" . syslinux_color('default') . "\n"; } sub syslinux_cfg { my ($entries, $b_gfxboot) = @_; my $default = 'linux'; my $header = <{append} =~ s/\s+/ /g; "label $_->{label}\n" . " kernel $_->{kernel}\n" . ($_->{initrd} ? " append initrd=$_->{initrd} $_->{append}\n" : ''); } @$entries; $header . ($b_gfxboot ? $header_gfxboot : $header_non_gfxboot) . join('', @l); } sub initrd { my ($type, $I, $img) = @_; my $stage1_root = $ENV{USE_LOCAL_STAGE1} ? "../mdk-stage1" : "/usr/$lib/drakx-installer-binaries"; my ($ext) = $img =~ /rdz-(.*)/ or die "bad initrd name ($img)"; _ "rm -rf $tmp_initrd"; mkdir_p("$tmp_initrd$_") foreach qw(/etc /firmware /lib /modules /sbin /tmp /var); symlink "../modules", "$tmp_initrd/lib/modules"; symlink "../firmware", "$tmp_initrd/lib/firmware"; symlink "/proc/mounts", "$tmp_initrd/etc/mtab"; symlink "../tmp", "$tmp_initrd/var/run"; _ "install -D /usr/share/terminfo/l/linux $tmp_initrd/usr/share/terminfo/l/linux"; foreach ('pcitable', 'usbtable') { _ "install -D /usr/share/ldetect-lst/$_.gz $tmp_initrd/usr/share/ldetect-lst/$_.gz"; } _ "install -D /usr/share/pci.ids $tmp_initrd/usr/share/pci.ids"; foreach ("dkms-modules.alias", "fallback-modules.alias", "/lib/module-init-tools/ldetect-lst-modules.alias") { my $file = m!^/! ? $_ : "/usr/share/ldetect-lst/$_"; _ "install -D $file $tmp_initrd$file"; } foreach my $firm (glob_("all.kernels$I/$ext/firmware/*")) { my $dest=$firm; $dest =~ s|all.kernels$I/$ext/||; _ "cp -a $firm $tmp_initrd/$dest"; } output("$tmp_initrd/hotplug", q{#!/bin/sh if [ "$SUBSYSTEM" = firmware ] && [ "$ACTION" = add ] && [ -n "$FIRMWARE" ] ; then if [ ! -e /sys$DEVPATH/loading ]; then exit 1 fi if [ -e "/lib/firmware/$FIRMWARE" ]; then echo 1 > /sys$DEVPATH/loading cat "/lib/firmware/$FIRMWARE" > /sys$DEVPATH/data echo 0 > /sys$DEVPATH/loading exit 0 fi echo -1 > /sys$DEVPATH/loading exit 1 fi }); _ "chmod 755 $tmp_initrd/hotplug"; symlink "../hotplug", "$tmp_initrd/sbin/hotplug"; _ "install $stage1_root/init $tmp_initrd/"; _ "install $stage1_root/stage1 $tmp_initrd/sbin/"; foreach ('pppd', 'pppoe') { _ "install /usr/sbin/${_}-diet $tmp_initrd/sbin/$_"; } if ($arch !~ /ppc|ia64/) { mkdir_p("$tmp_initrd/etc/pcmcia"); _ "cp -a /etc/pcmcia/config.opts $tmp_initrd/etc/pcmcia"; } { my $modz = "all.kernels$I/$ext"; mkdir_p("$tmp_initrd/modules/$ext"); __ "tar xC $tmp_initrd/modules/$ext -f $modz/${type}_modules.tar"; _ "cp -f $modz/modules.$_ $tmp_initrd/modules/$ext" foreach qw(order builtin); substInFile { s,.*/,, } "$tmp_initrd/modules/$ext/modules.order"; _ "depmod -b $tmp_initrd $ext"; # depmod keeps only available modules in modules.alias, but we want them all _ "cp -f $modz/modules.alias $modz/modules.description $tmp_initrd/modules/$ext"; } mkdir_p("$tmp_initrd/$_") foreach qw(dev proc sys var/tmp tmp/stage2); # ka deploy need some files in all.rdz if ($ENV{DEBUGSTAGE1} || $ENV{BUILD_KA}) { symlink("/sbin", "$tmp_initrd/bin"); cp_af("/bin/busybox.static", "$tmp_initrd/sbin/busybox"); my @funct = map { /functions:/ .. /^$/ ? do { s/\s//g; split /,/ } : () } `busybox.static`; shift @funct; symlink('busybox', $tmp_initrd . "/sbin/$_") foreach @funct; } if ($ENV{BUILD_KA}) { mkdir_p("$tmp_initrd/ka"); cp_af("/usr/bin/ka-d-client", "$tmp_initrd/ka/ka-d-client"); } _ "(cd $tmp_initrd; find . | cpio -o -c --quiet) | xz --check=crc32 --lzma2=dict=512KiB > $img"; _ "rm -rf $tmp_initrd"; } sub entries_append { my ($type) = @_; my $automatic = $type =~ /cdrom/ ? 'automatic=method:cdrom ' : ''; $automatic .= 'changedisk ' if $type =~ /changedisk/; my @simple_entries = ( linux => $default_vga, vgalo => "vga=785", vgahi => "vga=791", text => "text", # patch => "patch $default_vga", rescue => "rescue", ); my @entries = ( (map { $_->[0] => "$automatic$default_acpi $_->[1]" } group_by2(@simple_entries)), noacpi => "$automatic$default_vga acpi=off", # restore => "$automatic$default_vga restore", ); map { { label => $_->[0], append => join(' ', grep { $_ } $default_append, $_->[1]) } } group_by2(@entries); } sub syslinux_cfg_all { my ($type, $b_gfxboot) = @_; syslinux_cfg([ (map { { kernel => 'alt0/vmlinuz', initrd => 'alt0/all.rdz', %$_ }; } entries_append($type)), (map_index { { label => "alt$::i", kernel => "alt$::i/vmlinuz", initrd => "alt$::i/all.rdz", append => join(' ', grep { $_ } $default_append, $default_acpi, $default_vga) }; } @kernels), { label => 'memtest', kernel => 'memtest' }, ], $b_gfxboot); } sub remove_ending_zero { my ($img) = @_; _(q(perl -0777 -pi -e 's/\0+$//' ) . $img); } sub boot_img_i386 { my ($type, $I, $img, $kernel) = @_; _ "rm -rf $tmp_mnt"; mkdir $tmp_mnt; _ "cat $kernel > $tmp_mnt/vmlinuz"; output("$tmp_mnt/help.msg", syslinux_msg('help.msg.xml')); output("$tmp_mnt/advanced.msg", syslinux_msg('advanced.msg.xml')); (my $rdz = $img) =~ s/\.img/.rdz/; (my $initrd_type = $type) =~ s/-changedisk//; initrd($initrd_type, $I, $rdz); my $short_type = substr($type, 0, 8); output("$tmp_mnt/syslinux.cfg", syslinux_cfg([ map { { kernel => 'vmlinuz', initrd => "$short_type.rdz", %$_ }; } entries_append($type) ])); _ "cp -f $rdz $tmp_mnt/$short_type.rdz"; unlink $rdz; # mtools wants the image to be a power of 32 my $size = max(ceil(chomp_(`du -s -k $tmp_mnt`) / 32) * 32 + 128, 1440); _ "dd if=/dev/zero of=$img bs=1k count=$size"; _ "/sbin/mkdosfs $img"; _ "mcopy -i $img $tmp_mnt/* ::"; _ "syslinux $img"; _ "rm -rf $tmp_mnt"; } # alias to x86 variant, slightly bigger with images though sub boot_img_x86_64 { &boot_img_i386 } sub boot_img_alpha { my ($type, $I, $img) = @_; __ "$sudo umount $tmp_mnt 2>/dev/null"; _ "dd if=/dev/zero of=$img bs=1k count=1440"; mke2fs($img); _ "/sbin/e2writeboot $img /boot/bootlx"; _ "$sudo mount -t ext2 $img $tmp_mnt -o loop"; _ "cp -f vmlinux.gz $tmp_mnt"; -f "$type.rdz" ? _ "cp -f $type.rdz $tmp_mnt" : initrd($type, $I, "$tmp_mnt/$type.rdz"); mkdir "$tmp_mnt/etc", 0777; output("$tmp_mnt/etc/aboot.conf", "0:vmlinux.gz initrd=$type.rdz rw $default_append $type 1:vmlinux.gz initrd=$type.rdz rw $default_append text $type "); _ "sync"; _ "df $tmp_mnt"; } sub boot_img_ia64 { my ($type, $_I, $img, $kernel) = @_; my $rdz = $img; $rdz =~ s/\.img/.rdz/; __ "$sudo umount $tmp_mnt 2>/dev/null"; _ "dd if=/dev/zero of=$img bs=1k count=16384"; _ "mkdosfs $img"; _ "$sudo mount -t vfat $img $tmp_mnt -o loop,umask=000"; _ "$sudo cp -f $kernel $tmp_mnt/vmlinux"; _ "cp -f $rdz $tmp_mnt/$type.rdz"; _ "$sudo cp -f tools/ia64/elilo.efi $tmp_mnt"; output("$tmp_mnt/elilo.conf", qq( prompt timeout=50 image=vmlinux label=linux initrd=$type.rdz append=" ramdisk_size=120000" read-only image=vmlinux label=rescue initrd=$type.rdz append=" rescue ramdisk_size=120000" ")); _ "sync"; _ "df $tmp_mnt"; } sub boot_img_sparc { my ($type, $I, $_img) = @_; if ($type =~ /^live(.*)/) { #- hack to produce directly into /export the needed file for cdrom boot. my $dir = "/export"; my $boot = "boot"; #- non-absolute pathname only! _ "mkdir -p $dir/$boot"; _ "cp -f /boot/cd.b /boot/second.b $dir/$boot"; _ "cp -f vmlinux$1 $dir/$boot/vmlinux$1"; -f "live$1.rdz" ? _ "cp -f live$1.rdz $dir/$boot" : initrd($type, $I, "$dir/$boot/live$1.rdz"); output("$dir/$boot/silo.conf", qq( partition=1 default=linux timeout=100 read-write message=/$boot/boot.msg image="cat /$boot/boot.msg" label=1 single-key image="cat /$boot/general.msg" label=2 single-key image="cat /$boot/expert.msg" label=3 single-key image="cat /$boot/rescue.msg" label=4 single-key image="cat /$boot/kickit.msg" label=5 single-key image="cat /$boot/param.msg" label=6 single-key image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=linux alias=install initrd=/$boot/live.rdz append="ramdisk_size=128000" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=text initrd=/$boot/live.rdz append="ramdisk_size=128000 text" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=expert initrd=/$boot/live.rdz append="ramdisk_size=128000 expert" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=ks initrd=/$boot/live.rdz append="ramdisk_size=128000 ks" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=rescue initrd=/$boot/live.rdz append="ramdisk_size=128000 rescue" image[sun4u]=/$boot/vmlinux64 label=linux alias=install initrd=/$boot/live64.rdz append="ramdisk_size=128000" image[sun4u]=/$boot/vmlinux64 label=text initrd=/$boot/live64.rdz append="ramdisk_size=128000 text" image[sun4u]=/$boot/vmlinux64 label=expert initrd=/$boot/live64.rdz append="ramdisk_size=128000 expert" image[sun4u]=/$boot/vmlinux64 label=ks initrd=/$boot/live64.rdz append="ramdisk_size=128000 ks" image[sun4u]=/$boot/vmlinux64 label=rescue initrd=/$boot/live64.rdz append="ramdisk_size=128000 rescue" ")); output("$dir/$boot/README", " To Build a Bootable CD-ROM, try: genisoimage -R -o t.iso -s /$boot/silo.conf /export "); } elsif ($type =~ /^tftprd(.*)/) { my $dir = "/export"; my $boot = "images"; my $setarch = $1 ? "sparc64" : "sparc32"; _ "mkdir -p $dir/$boot"; -f "$type.rdz" or initrd($type, $I, "$type.rdz"); _ "cp -f vmlinux$1.aout $dir/$boot/$type.img"; _ "$setarch kernel$1/src/arch/sparc$1/boot/piggyback $dir/$boot/$type.img kernel$1/boot/System.map $type.rdz"; } elsif ($type =~ /^tftp(.*)/) { my $dir = "/export"; my $boot = "images"; _ "mkdir -p $dir/$boot"; _ "cp -f vmlinux$1.aout $dir/$boot/$type.img"; } else { my $dir = "floppy"; __ "$sudo umount $tmp_mnt 2>/dev/null"; _ "rm -rf $dir"; _ "mkdir -p $dir"; _ "cp -f /boot/fd.b /boot/second.b $dir"; _ "cp -f vmlinuz$I $dir/vmlinux$I.gz"; -f "$type.rdz" ? _ "cp -f $type.rdz $dir" : initrd($type, $I, "$dir/$type.rdz"); output("$dir/boot.msg", " Welcome to Mageia $ENV{DISTRIB_VERSION} Press to install or upgrade a system 7mMageia7m "); output("$dir/silo.conf", qq( partition=1 default=linux timeout=100 read-write message=/boot.msg image=/vmlinux$I.gz label=linux initrd=/$type.rdz append="ramdisk_size=128000 $type" ")); _ "genromfs -d $dir -f /dev/ram -A 2048,/.. -a 512 -V 'DrakX boot disk'"; _ "$sudo mount -t romfs /dev/ram $tmp_mnt"; _ "silo -r $tmp_mnt -F -i /fd.b -b /second.b -C /silo.conf"; _ "$sudo umount $tmp_mnt"; _ "dd if=/dev/ram of=$type.img bs=1440k count=1"; _ "sync"; _ "$sudo mount -t romfs /dev/ram $tmp_mnt"; _ "df $tmp_mnt"; } } sub boot_img_ppc { my ($_type, $I, $_img, $_kernel) = @_; foreach (glob("all.kernels/*")) { my $ext = basename($_); if ($ext =~ /legacy/) { initrd("all", $I, "images/all.rdz-$ext"); _ "mv images/all.rdz-$ext images/all.rdz-legacy"; _ "cp $_/vmlinuz images/vmlinux-legacy"; } elsif ($ext =~ /2.6/) { initrd("all", $I, "images/all.rdz-$ext"); _ "mv images/all.rdz-$ext images/all.rdz"; _ "cp $_/vmlinuz images/vmlinux"; } } _ "cp -f /usr/lib/yaboot/yaboot images/yaboot"; output("images/ofboot.b", ' MacRISC Mageia PPC bootloader " screen" output load-base release-load-area dev screen " "(0000000000aa00aa0000aaaaaa0000aa00aaaa5500aaaaaa)" drop 0 8 set-colors " "(5555555555ff55ff5555ffffff5555ff55ffffff55ffffff)" drop 8 8 set-colors device-end 3 to foreground-color 0 to background-color " "(0C)" fb8-write drop " Booting Mageia PPC..." fb8-write drop 100 ms boot cd:,\boot\yaboot 1010 000000000000F8FEACF6000000000000 0000000000F5FFFFFEFEF50000000000 00000000002BFAFEFAFCF70000000000 0000000000F65D5857812B0000000000 0000000000F5350B2F88560000000000 0000000000F6335708F8FE0000000000 00000000005600F600F5FD8100000000 00000000F9F8000000F5FAFFF8000000 000000008100F5F50000F6FEFE000000 000000F8F700F500F50000FCFFF70000 00000088F70000F50000F5FCFF2B0000 0000002F582A00F5000008ADE02C0000 00090B0A35A62B0000002D3B350A0000 000A0A0B0B3BF60000505E0B0A0B0A00 002E350B0B2F87FAFCF45F0B2E090000 00000007335FF82BF72B575907000000 000000000000ACFFFF81000000000000 000000000081FFFFFFFF810000000000 0000000000FBFFFFFFFFAC0000000000 000000000081DFDFDFFFFB0000000000 000000000081DD5F83FFFD0000000000 000000000081DDDF5EACFF0000000000 0000000000FDF981F981FFFF00000000 00000000FFACF9F9F981FFFFAC000000 00000000FFF98181F9F981FFFF000000 000000ACACF981F981F9F9FFFFAC0000 000000FFACF9F981F9F981FFFFFB0000 00000083DFFBF981F9F95EFFFFFC0000 005F5F5FDDFFFBF9F9F983DDDD5F0000 005F5F5F5FDD81F9F9E7DF5F5F5F5F00 0083DD5F5F83FFFFFFFFDF5F835F0000 000000FBDDDFACFBACFBDFDFFB000000 000000000000FFFFFFFF000000000000 0000000000FFFFFFFFFFFF0000000000 0000000000FFFFFFFFFFFF0000000000 0000000000FFFFFFFFFFFF0000000000 0000000000FFFFFFFFFFFF0000000000 0000000000FFFFFFFFFFFF0000000000 0000000000FFFFFFFFFFFFFF00000000 00000000FFFFFFFFFFFFFFFFFF000000 00000000FFFFFFFFFFFFFFFFFF000000 000000FFFFFFFFFFFFFFFFFFFFFF0000 000000FFFFFFFFFFFFFFFFFFFFFF0000 000000FFFFFFFFFFFFFFFFFFFFFF0000 00FFFFFFFFFFFFFFFFFFFFFFFFFF0000 00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00 00FFFFFFFFFFFFFFFFFFFFFFFFFF0000 000000FFFFFFFFFFFFFFFFFFFF000000 '); output("images/yaboot.conf", ' init-message = "\nWelcome to Mageia PPC!\nHit for boot options.\n\n" timeout = 150 device=cd: default = install-gui message=/boot/yaboot.msg image = /boot/vmlinux label = install-gui initrd = /boot/all.gz initrd-size = 34000 append = " ramdisk_size=128000" image = /boot/vmlinux-power4 label = install-gui-power4 initrd = /boot/all-power4.gz initrd-size = 34000 append = " ramdisk_size=128000" image = /boot/vmlinux label = install-text initrd = /boot/all.gz initrd-size = 34000 append = " text ramdisk_size=128000" image = /boot/vmlinux-power4 label = install-text-power4 initrd = /boot/all-power4.gz initrd-size = 34000 append = " text ramdisk_size=128000" image = /boot/vmlinux label = install-gui-old initrd = /boot/all.gz initrd-size = 34000 append = " gui-old ramdisk_size=128000" image = /boot/vmlinux-power4 label = install-gui-old-power4 initrd = /boot/all-power4.gz initrd-size = 34000 append = " gui-old ramdisk_size=128000" image = enet:0,vmlinux label = install-net initrd = enet:0,all.gz initrd-size = 34000 append = " ramdisk_size=128000" image = enet:0,vmlinux-power4 label = install-net-power4 initrd = enet:0,all-power4.gz initrd-size = 34000 append = " ramdisk_size=128000" image = enet:0,vmlinux label = install-net-text initrd = enet:0,all.gz initrd-size = 34000 append = " text ramdisk_size=128000" image = enet:0,vmlinux-power4 label = install-net-text-power4 initrd = enet:0,all-power4.gz initrd-size = 34000 append = " text ramdisk_size=128000" image = /boot/vmlinux label = rescue initrd = /boot/all.gz initrd-size = 34000 append = " rescue ramdisk_size=128000" image = /boot/vmlinux-power4 label = rescue-power4 initrd = /boot/all-power4.gz initrd-size = 34000 append = " rescue ramdisk_size=128000" image = enet:0,vmlinux label = rescue-net initrd = enet:0,all.gz initrd-size = 34000 append = " rescue ramdisk_size=128000" image = enet:0,vmlinux-power4 label = rescue-net-power4 initrd = enet:0,all-power4.gz initrd-size = 34000 append = " rescue ramdisk_size=128000" '); output("images/yaboot.msg", ' Thanks for choosing Mageia PPC. The following is a short explanation of the various options for booting the install CD. All options ending with "-power4" use the BOOT kernel for ppc 9xx and POWER4. The default syntax with no suffix uses the BOOT kernel for ppc 6xx 7xx and 7xxx. The default if you just hit enter is "install-gui". install-gui: uses Xorg fbdev mode install-text: text based install install-net: allows you to use a minimal boot CD, pulling the rest of the install from a network server install-net-text: text mode network install rescue: boots the rescue image rescue-net: boots the rescue image from a network server '); } sub VERSION { my ($kernels) = @_; map { "$_\n" } $ENV{DISTRIB_DESCR}, scalar gmtime(), '', @$kernels; } sub syslinux_all_files { my ($dir, $kernels) = @_; eval { rm_rf($dir) }; mkdir_p($dir); @$kernels or die "syslinux_all_files: no kernel\n"; $default_vga =~ /788/ or die 'we rely on vga=788 for bootsplash'; each_index { mkdir "$dir/alt$::i", 0777; _ "cp all.kernels/$_/vmlinuz $dir/alt$::i"; initrd('all', '', "images/all.rdz-$_"); rename("images/all.rdz-$_", "$dir/alt$::i/all.rdz"); } @$kernels; _ "install -m 644 -D /boot/memtest* $dir/memtest"; output("$dir/help.msg", syslinux_msg('help.msg.xml')); output("$dir/advanced.msg", syslinux_msg('advanced.msg.xml', "\nYou can choose the following kernels :\n", map_index { " o " . syslinux_color('white') . "alt$::i" . syslinux_color('default') . " is kernel $_\n" } @$kernels)); } sub isolinux { my ($kernels) = @_; syslinux_all_files('isolinux', $kernels); _ "cp $isolinux_bin isolinux/isolinux.bin"; _ "cp /usr/lib/syslinux/gfxboot.c32 isolinux/gfxboot.c32"; output("isolinux/isolinux.cfg", syslinux_cfg_all('cdrom', 1)); xbox_stage1() if arch() =~ /i.86/; } sub xbox_stage1() { my $xbox_kernel = find { /xbox/ } all('all.kernels') or return; my $dir = 'isolinux/xbox'; eval { rm_rf($dir) }; mkdir_p($dir); _ "cp all.kernels/$xbox_kernel/vmlinuz $dir"; initrd('all', '', "images/all.rdz-$xbox_kernel"); rename("images/all.rdz-$xbox_kernel", "$dir/initrd"); _ "cp /usr/share/cromwell/xromwell-installer.xbe $dir/default.xbe"; output("$dir/linuxboot.cfg", < until you reach "HELP END" pause . pause Please see http://qa.mandriva.com/hd_grub.cgi for a friendlier solution pause . pause To specify the location where Mageia is copied, pause choose "Mageia Install", and press "e". pause Then change "root (hd0,0)". FYI: pause - (hd0,0) is the first partition on first bios hard drive (usually hda1) pause - (hd0,4) is the first extended partition (usually hda5) pause - (hd1,0) is the first partition on second bios hard drive pause Replace /cauldron to suit the directory containing Mageia pause . pause HELP END EOF _ "/sbin/mkdosfs $img"; _ "mcopy -i $img $tmp_mnt/* ::"; _ "rm -rf $tmp_mnt"; output($mapfile, "(fd0) $img\n"); open(my $G, "| grub --device-map=$mapfile --batch"); print $G <RU?].8G9?P8 ƭAEF_atU >YLi :gOZ4[wM^8Pf0hG;ϪCskrZ"rJ]bǪlẊkp鸾 Ѷny!fA˝+C\A1y*d K'Q^XK? ϛ]C.\gPKn5P}%5w^5tۦس`CxFA#ߖjkZPxծaE z>|'FI& 5`NKE㬴!ގڗd-M X}M§G@{v0CCkqӐe r~X-7M_2dvЏhd\cUVmht KXCk^\d[q$-qr92 IPNzK6.}\sȎ,"P n#\05s2BVu?+pZTޭ@ef߿2S}{Zn#=G{0k0V"?d jaGB6cŞRHt2>JI' F0>J.hѠBR(uKzok unLbb~:hKq18BqdWq'ùh鈉 ]sE'8PBpR%y"Ca MW{n/IpʁrS!8Q x{#{)(ag_].B%҄\Zp5jkFw-:#2wxڵھ߮-oH|XPvō#D:%sJ/nR2Zk+u#jn{L7 D6ZBM+z&̺QhyǤ?64i q{:MxWjqeODR։!-G'|r?GoD2߂+#ܣfaEQ0aaڹ*yw :r0~xз2ovt|y>Wv%%_@[Jd'PyƁ n$#tEmg䨭-뚬*O6 6FYRLt6Wж+ tX]yt[4+pY0ڌSVFL|1U6jcixXk7ieQTq8rO!u {wiQ;|$w`zi&HV;J0r_w 2VyjpCTHi&k11ZƝTʋfvtNQr7B g[+W]_*!Y(V& s71k#k M/ڢ%C ֭B7 _1JPien|zߊt 2TpݙB"dM*} !+ RPK5L^*s$w*ICǒ=?%.]/{;4xeP.d<YGhb}9(NrYG|Z) n b xXW!V^t72i48|Z< b9T(#USJeI 7.V|&h#*M+ƣ>v(Pe_ o#akP&WLL*$oK¶~I;\ +^O5@W~މzgԼ3`+B¯#xWwMrn)rŶ 2zABŸm'Ju{GFz/ 7l]=@%̰hW^u=s)gK!(Hn g"97K?C *GZ𭨍s&4Lu%R +$3j(o _-25d{NZI x|b77!Irg 1iϻ17| :;4.lveۈ kq=$fnk:yt6mȑR5{$"~m>5;[%.?U5bjc:f?zTaqg^ԏD4FmY 7' .zvLwU/(sZWM;,⠥ʖF-6FdayOZZ^015k7= G!CN5&mt~,_"*_br)(Zl0s$NX=+IXh]L[Bv_^rIZjyI~V*F?2Q,~8{m}b``G|y"Qom=Ry"OD@P^Q_ 9DrP|'y#`K؄uq1bkES `pj}On>M59J~q50C>&W2&%IA N?^p)gH}-Ջģ9_DߏkI\FW/T^%H#^`DJa pc,ab4K&9T7Y>RLpdz4}^<-DZ3fD/1Vܠc&r1=qW̕e0;d웂 $)gu3Sjr[%"iWըOu|h׆[!Ζl$/w3Qf@$_5/y24Pq 5$Y95E\޾k5 rЛ0;4=[#Tv-Er%)x&R9wwlo'YSДmp+!uOq”4x qL=1FX:כ?\OCh.w nԼ(e% ,z%Rrg%C!O,~g-d fU l>CG> ֳ4p S%6ۋI p9h6(X R+8K*+3qn47.]4ݲRMG >O^jSͤ{ cVF} Ro@p|':# D0?q^= ъ[1`=|F|k=BzKHs01@f~w i߉; tePt !>=&8`* }ҟj ou*bK#3nLv tn#zy־^О>hbLӫt,>; , CA]ߴXJrt%8`+[o) [')㞡c,ZF$K3eO-b CQ a]sω$ {Xyԑt(TZ77i&```Ad괅;:T ^=iHHTzIf'tB-?IivG4h%S$.a9g_p#S oS++Nz`HtAi4hbXJ>:x RMO`oO?w*BH|6'eo^*aӜEQ| S0 4;EҾ/+ɉ)!'^sya{D3G<$-zN/ a# ~p}(a^ (ʻ7B?/qP7JGزK"ebɲGffr ȼtizq4b?ܦO0L`kw<[kic|CC? $7BK  yG&$<֩+Lq*M$ ؝_tv4'?~87M,1(ij8bn5*sHsvsEw{MvI8t~\j4/8)`1xˡ&A", ȕ#8}`7|٦܇~,`m6u5}q?Mþ!up +W.RFE AC !4jqQ%l'6q[',\-W k0a%6da/F3]#+ ^[;.r*tA/I-h,p_3xt"z**NގVY%XDDz?jYVEޏɣW=Eزf!mD61Oax5S_q+Vr@>Ԭ}s uL-QPiw&R(&tji[4:WL2-tB:}8ЀƬ_~5b5!4+gEBvP3&a46,&$4csgn 1 Ug'I/=h Jr2qiDYxyq3r7*9ßZ!h3c+=JpӞkŗ'ftGɟv__C } Pc!".C R/- )ej|(~9z^;'R> =rjGAYYɍe* w^P`B ؔGAӐċ,tAFi8z^j =1 {nإ D[ޅGhw|+ '񷢑j tA$5< һ ngF:B;^›yy~>152xX3v؍8(5y9!-2}1$ DG6Q 8ef4ٛy à=3dܪԅ DysC *(DXqbg+=BdcPwUf5 Bò]7R<[L|jd !9 K.ĄlBLoL@/OﭔBwt `S/+A4ǎԭ;3tɥX'WÇ%^\[qNtXv Ecd]6=a@!bZB$topTvΙ?18YYc$U, OO>1۬VBּ̗qaaTl(֬UzX?d[箶a!18}hq"΄֘ /QO*M cc  h:ⵍj@hI5ʌz ҂@:^bf4Ί @0?cAM?Dzg| {PH\ЇyJpR%e3f+c j$ qw\,[fa K-^i[鲃lOyάy! PI]'Ї  @ԌK(ŇVLjiƤo#{YR`8č ̲$|i%Y(Ձevi&+.߈OFy'Yl\. Td*7O#o3;p:HB2λMr 3`|CC 97Z gAJY^,&# GZp{(=Wfq^ =vO\ ߛ=fa|Kf(WwnB4]T/Y.m+AZIzPstj PR҅{Wu.dR\EI4Uѧ-1*k3h-\l\JBQ#\e4,u86(sl\0t=i(yg.ύD< FC`1S JEL=08b9K}qLn %.@lj ˵, ,WVrzTσ>8h*9u3 Λg2Gv F2شuzrUK'p4-ucUJM.s0;4, re$KX$QytJbJvrPoB|FSӆdb `Χv(6%O+X r\;A}[jB&;eIuMFUbwFO Dő y896# =G+TNxNPn sZzBeu2sK4$ھ߬HRh tCM7 3Cu-:w0гP9h'̽"4f$_ݵk xIe6~^&5?Vt!|%6MHEZ^~ԁ윋~q-ð&֫rM$x ԙϳUUg.s$[4/ϊ#m['Y ma%6o :}p>e(/ C)gж[?:ץo%.bF6*}c̉ M\- fi8 ѬX># yy qޙ\N\f|8K.aN]=5PQx/:?4/)۞ =~ 4uQ`A_F}fh;d'e;w9T4@XMW< !|DOia doE͑w5dp6:gcB?MOrw5 !v(͠C,*4ՏrcD&e%xJMP3|,$]aHlR/ 03=g/Š ~F_apVoCC*$𦭦.P~F>6$3x"<%bii".pVGFfTL=äIk;qw+&I CvNs&9;;uG7H:V'3v7#|y(aQ=m-5;!-gIyt^&rIV#R8C;n^ۉ?fő%p}A*pHHK[l(56wCTz̳0ԚG|iHSODz|Ct)^,%TW/?sx`S&TBʭUB<'Ktu ^7$V]heoVU@G'Oq`&匃}a];ݹXmj8],ql 3F*E{bB;67$ g ? l9buJ =9EmIfP.:2,Ջ|`JupMhR7t]VݻGv"'!Բ3dhҟ X"jWW ɻ*АHVv;,GO֩B)NtW @P[cP库W@36 1޴_Uj2}2EC+Br:Et܎ȱrfcJVC P-L:Aa`kV=tiyY’WͰ,STX~h@2jbɊ6s *-4Z|lהoYM2QR8(GGaEu`7)v v`RrXzP -]J Hf Y+4,| Aޥ!>yzb\6TV0$aQ?hPXkEbG?;Qx'l>F#b2P7X6Z 9VKr RF;{)a G@Qrm>u)RkWcsܯ]VWtuHmQ4k>9h>N1fߡ #?X6CHV6蜦Gw[I5e?~Y(?'Ŷp9Vef+ꅶ˱^I@T"P60e<*gP.ZJP"S8^j ,.9| _-nP)ˤn`9nj2[o0 H 7n[$PH$d!]1n MbOYZ`>Uww }yOg̈W&>N|ߖM(˹zL܉g"47j_LB9i4""r+ƿ%?Cf*#F 0ENcOjɑ:j2m3)WpJa,е^W~A?I_1ńt5G8~bJv)jkYkY|)k)0{Ķj3">œR`ݐasWY\7&w8ߖЪX7k~5E`إRl61UBBBׇ ۺ3D%ZW}AcA$krbxJY6ӻ b.a}w"d2c3/gO^|!vH)S*j|ܝXu~(rTگPRq4q`K\}u )CHOHM).RśBm [`;"3"Yu>Q';D3r6*,HG/6xAm,F3x@6hMeƉKR=w?,A廔u @4,%RlwlSX@^'.D1SBzB ۚ<~@=j-t[8qUyxz83Wl3vo$~ʎaԺ J&a%Y]y:֮@H(bNP=~:ˬ,^c=+QGFGp[ ]5MglrF>}Pa]5&It/۹^MڟuwODsKk <!oqw'YxlWoQU#v.'2t֑xySOTr, qh[XB-t]Z z$xXm91y9ĺ.(Ml*%Ӵ_1IAioG+Q4/CfN7\V {lJ$(9Mۥ!ǔ8%y\OF嵷W=_RfD1jNklfdܾZÐH6ܣVK[-5Rw4|T^\)=ه5 ˒%'3hwԇ~@p˱?"ikk1R4pb`#M]X$$O.}7y%? gWfϽY*zzF~4rjyZPΏ&wM0-zev߸}vXoll|]dz-t9fy,/{ ,.ձ,υBJxxN7P2˺L"cny֮_뀙btkw@/)e!.N$sea?ls h^1}7\لB=[?WLޗմ_rIa:O/IrSG C|*ԌL hɡQ$KOuBSJSVpmynkP [{'&Dv}_.wFiGm85HD[> sJK*,I)Gx1FM\+W8Z[:k3c#y8a5vMP_H!!%:֡ TSlgd9BXAD5#5GP,$Ѭj |N3=z,9փnS5rrR+4CAl~`ц&Rt8lzY:c2-Wd4%U4^;$;5%ƃ4E<,.]hdv~Z|XgO#iǀBVWa{ԉw.;Vg\Bg9&zf׺@K4`>3{-Ԉ !e"xKꄝWY =~#ZRDdm@MnSgS KԼHddJ!gp"obL<m ݪv5w>&-ƻ(sgk̑vο$U~nxFm+YHh@ٖ HV y#:jIJ _29qfb6RI xbkeH8&iզ(_Gx W|iG# v +E롭Tz#mF#uQ(LjLn-iNphlNDn33G=$n0aK/:ɳSދ\:Npze;I[{  ؀. ȻejM$Q} r4WC3+t*L,b3/Tc9x^ n#ghVѐ]$Y4 E-ۆLćp,υR{ҳ>tj37hӦV><0mߍ~Iκ^.ѩ *ˀ}V.Kkk6QL泄L,ͷ)OskxX[!,nn|8RG4nӵ!8L;GGRH>Zc@#֛a]Zn\'Ȧ~mP)b=Y5>X @k:fR5Vך)uyY*JB=Nj潨+RydW#Yak{֮a)%">^igLzgX}lB@;&5h!1X: 0 &tbѳ[NSnɪEC붛N>P{.ŵYxɢ% Аg<(JEjP54Y׬a\ W1XQbx**9֡T~~(fSD!p! NJw;4/edy%6e^E4x 峕2:A #m {fd)]FOm[H(j}G(AEѬ"~ ŤQW:Uoy3}|bq IBfk$f'L='vߍ69b)Tm}Pٍi5 b4xmqjδi$dp_}N}/|[B7Ro+kKC?dq" S>0d;흵`s .'n (}XH(&$ֆpȸT-j D M+3\ ַA9vk{3ȓnY[LjQ#&X9 h?fyIa?&/`'$ٳoij8HFpF_U'j)V􆓥bފ4P|w.hKYJg'}ҁFܓnCq_;lGE=JNk 7EB2j))-h*ՂܝY)*R*g?'v־!D`{ʚMo\F꾿#W(oҳGu=yN_ e3uRJ]g|_ &*$uQ*hst" @&6a^MiCQQV*2p"]%@}(iЖ//Ȥ4+ V3BvXoCc6L$w`jYu)`}؊XsS˴0 %1*BQ2^JIiE%7 "'Apu%Jbl`\e)AL<.5`TIswyOd55?rb>ceC1uh M,քv!RZ1m0=f+W3ALȳ1`xD$q~N,A7ð+Wfx4WUBųQh*RS3)28Xe[MچTs\Ae_Fn<#Oa|<"H.Q_@ DCrG]Ǜ)[$;"Ј]GrG"]N{RŽHcն\tn!M2W\)>g1}QKOżAyLȸcQ;JS]q,նLPB&n݂$gS@P ) RR'-rn0(@8TY'筏zo;UsЂ^.GCE@AU%E&kZ /X45T/$*3rDc4 w73Hj|<x3Lа~@<Ƃ4Qh0TV=R+a):! 5^]6P XA/VaoS<0uOm^!C:Ȭrv>z۪C5i]@:uHpo2 2)OiFMḘ7&X]&G#>-S<$ȩĄ!D)<t6 @^|M\m\:+#ofP1:ԐR%U? |]9͎%XVzu$2g X$hs@%тXPI~P>r*p3@iolev"(s/jŚ#fQ>~,ˀ_2S_!;]v.zAi.WcԱ4HXQ(C \*Z=| >|l gX=;\Z˺ ZyM5΁t"rY0k8A硳C$Z$Y1W?I[a: [;w?J<|&:μ&jHY;!el:H̲ J'_; 8g.tdϚ{DH4]J fzIonK)'"iM_\0 NrixlTNs+.-3KܼkV⹂^-|žF] 3II#L$M,}Ħ|/Q(prghU&L*U(H8w%j2r| $[ dh+>呣P >Y=8ȴփ}{=, !O-#Y{1SLMA_o"*{Fc]īϠ0a,'oAs'4'CV]?ac$mNe!Z8h6dLExc5Y@ oNxГ>9QLf^ȴ6 ]zNѐ=צ !jT:v|aZ_+h\=Zh jHY!nxG{v s3R\9&\ܚkTMj#o nUPMgo"Z a"+dC@ʍ|g\V8Z2@ے=r=B lz%M& CEݯPBZq4l9R\!9W@E5"}Mt>wۉklXj \=MWDOvZ  ph 獳ګ[X ` "lt)ҧVzd=La0 Xawc l(.\7z@RJ{Mںx$`6ҒSd Za]-UFky(_WJwzAV Uztt@)K5&5Vz]EێGKDnpӦg@y`:afZ7moB7vul`lG͟'|* zqoXP2≢YۀpSv:J:}ӍG(XdaCksSiZ.ŤGѰ=MTTzcŮ-.\l*=c8uq [E?*r"[V`,^;9y9|v տoL eZ"CP 2ybP~inp̻~HΠ4'bHoLg.NIcR% Q_5\zM_jt`iq2p.ْ\i_hճ#='dSVAѹҴRƢo#]IOMKU5ͶhHeʯ̪N*^=wL. 9QvUbg!4@TS*#~*n ]u~9H҈؃1/*n /clL`U'.\ <Xi 3dXkS3ᄻ»<\go/衷 @۫f[ Q`V-b&}ۥiчlR I(}Oڿ!$W!%qυiiXoB3cm9&N (Ϧ|EZm 4kj-Q75h#ĴyMscXvHxNgy#c㸸DNQ; BVM]9=f 1j{sow&r4JFRlbC!rȌ0Lu}7I]EUnܘY΁|7{@?sxL6*y{vKV=D'{-Ǯ\`ZElƪrFľe%j6*ٙD|$k@5ƚPtD|NQʎt:DQr Z (! $<>A,r䆭94lsCDҐQ6"X+$jw}\wBG'aQ}ӴjFU3D%HGamg?[&$W'#wtPpsxBY_VtuJF#s%LNv7 <]@ X _s'>xBB!i  avDQF8h01[p'x@D˼/Lu!ŤU[ 1QD9Ug4 Uɸ,8).^8``˛1,!M~w[YoMY!c:'Lk(Y"nkfUϓY0CUU%Gy|}sD|glMa$VvN+A'IOt6^遐N}8%!^DX٘=m;]Du[mm,7fAsP`۲/kJÔsh0{>eR71&j@ ^5=6`}$cG8Rqcax3sJh I*$|b]@5$.HDv6.zocyuuU:0V+0/* x/πPՄ;Yu)Y]ڌ S.DW]5FGz 0'.$6CZ |:O-_?A[cDԑGwp.ș!'_ce &ptMi*"Wc$ϡӲ8qiَ8_DkAO$ \xgP}:7LdضU@( fS `iԕBE.5` _+vڰ`ݩ4?!auA0j%VyYLL=1i7uwĄdK3~ta 1tj_ShpvUэ'(sQ]01j\FC6f|lg"d ]0&PwDw s2a里,FC#N$0g-4y,>ݪuFD-qnLZ*Z-#gXudlB9UʔU*58zF{zo8kB;)H/E›|`JZXXb>>F2G(yL9ӅSdBvM8֕h yU|Q$/Zn%mE1cD'F}q` *NJiٻuZnAz(оbC_]AdH, }xRCy}̦?Q5y)W&!) kf Ue>$"?,6`m޹ݮdMhRE?D{=&f3,5 F21Z7' t2QA ucZ˴nS %g +*5k)| noޞhy?W>ĎWz vc V<#`Цb/?1> OGn :$PdBC;|]o1̚]]Ǣ*?ƫsGAjGFJX܈9z6Ӹ ^>4ݷ/6NJZQ{5 .MUZ)F)4e> $Wc^b/f<$Kqz q\ш mKKȴKr6?"sgaSgP/pE 4$:x6xѶa3ֹP6E'Z׉R}˓˖(>el9G'x@I K." SW fxzK* +WVcS)ʁQC7ATJ_DfEj>sxmqǥ3Bdԣ1g'8wF!I TAy`# #к;g в_(tEaXu?4dhiT4j^_l1痶儕ȣ/{UnJzK`'C,5W5d@b;G*YyPe::*;\V^fwP8] &\9}ъ-:6 <)G*߳\I1/iKx#ހMuYy$54@9m 2,ƍ]S%dG,čvr[ݽ6"q@쉒i?ǯl*pA(;(2 Fً+gx}(-/ B9!DFunen gGEٍ`׫)KxsuޫԷ ɘku%]A6Eњ݇+idfj. l|/8m74ʕt<场,ռM1/پ3SNiI>sm ! |kzNF3;V5[)[kAԅ͏ZGHG1٧,yc,mr*s;'xK{: wU3n}ɟm jFX#!:і")6rSdF  HT \>d5#]!7I %.HKf'3PAPFvyI)P:װz!%XX 0yd#0{nW,$LV?ǵԒ$6*$W H ~\;XkJ)Sܞ1N1r>;BFN(Sl+*#or6'PUF3.UdLjet(~ϗ|/jD:Æ  lȠ)fqqKsXyey v<,4>b@0Δ2h߼đ!^ӀLO@ېw+MFzuEupGv"R~xdjԽs?3`2cJaXBm?%NvjE5BBE˾ JK45v.aMS(f}8"b%e^o?FQ!TNO9V?* yR~-O!-\#l '}b!yF˂&7 Jeۙ]^[SJ@JAJVw,*}ޗ:aYCC.7Qd=ė:rnBQ3r"ujt9fo;Zt"R}v/hp<)*YwG3?ef+eN;BuNUaQk*^!ѳRbq$+-SXX|xw ~8^ҋշ W(^δr~gbn#WSTf*R51/^ ݩ\-3Z-71JfpDWFIDئ~@[C]"^"מ=qKz1MJ޴!信01[\ {Y4}t) ZEg\gk^Q.[\筂/rM:{C,m"8ĕ,0`)FS3_B& p{#z]9i;)znlp3.`8[+2[SbT]bܪJ/e҄wCS7< &L } {cMc ߘ,;~Qޫ-sA 6ixwT[j<1#͙O]rGL2 *T8ap&Zx'.+Lo`]nןԐƝR j7+zа$fڸ巯>(ݱC.*v++~\  íop0ІxhxSon:^^XvQrӅnG>Nb7{飫3$~?໮@;+c#&| ~lbH</M5LQm<}V5g=3FIty=(¶t}+սM>\x3:ȁk עVҞ1m hqá\[ې?vxNhLP!}W CdAWFG 2}p:N􌜿9ő f.l<_O&=9S&t;vp5)->butF>+&9m%O4Op b bYߠ5 QPbI1)F;8Ýu X9.JFL5)F~=C( WR%d:kg}XI}0p>Ҏ8 h~?NLޥ`m޸6GzG, '@4_:pm ? )-4 S'D*ԳEs|pA+ ;DZ_JeۆG'ρ̟G`N*oKmSqugUpo!vuUfgzZmFoO^Mv*偳m2&$$x&( 0I;-dT櫕dBD0mƀNR`BJ|1]srWrQ/OH׭7Pc1imv5rĽ;Ge#kPx#NG_hI;"ciyџOy cwKsFs D:ftp;,Ps(.|-Ҩ-e|㳋e))څFoc|JXJXm{vc.uӼ"H ),_\tiq"+J+4a7{h1t})WnѶ& PדJ*M¬,Oiֈ.{j,$3ɛ#!xL&^H=w՗%wB"ڧbn~tEDPnn*{22FFw{| 7\֕)>|1?FC{3}1_]CL,E3 9@%^bTІ$.pl bIu@ҦS-p3@F=+ӜJUq'^WU/>RV!(Fp96']]y'M4b&<vHS"L0a%T9hxpFg^k|:oDFly={ m ƭ҉kj[RdV }^P q&d;jE D"B:j*%*m~ל3Eg\Ƣa[4.8Ls q"lsv d?.XؓP`bbfGƬJ(KEZq4SZ kc{?3 kڿ㑠Q0k.w&ϊHھ᫼4$OD PedN5 ? &Y+-:F$ ?dpB4ǧ:Y/Q]2g9?i mQUͰ ~T{#AaM6j#A!kAcP*S("d[yZv}yXDșԆKh:u#=M? ?8tP,6R:,$#0m}g|6#T$хcZgo0sOKQؒ0eb-\&8 1e{?m/O2u *"^kD$_oQO?|oȰtf~q6[mQ3k_jGW@3nƹ;q<#x|e)Io!وP\Jl B~LJJi\2Z")u,'{-_z qnYh?b= L"*qop1)˼!+pL rP{v|9'\gB[t.|@G E'q7ٚ Nް27/ c>t~ʔ>|. 05PGZV ^?=DpB*6,u79]]e$ Fvn m3gHNQ1z=bT<)֗3yI"]2RgjjԏWA}O7,XnL-g:=G='O(OEg9m'{tdq׉ d*tOܡEdݐ缺zT䢒C- s+g7{󝄖|Ob/M*Q̔e|Qkf;;펐݌÷[͗+nʏ f4K*N|ln@Д% +O羖yel~]2q}ztᖳOB5j0EN7)e+LI8<0,]hq,#! JNl䫾SgAfܻ *?q@*+<|Gx6VUp]"x~YB|N|bPM~P.W޲%_z'6N3@igoj܁oY.!™\