refit-0.14/0000755000175000017500000000000011363100615012101 5ustar julienjulienrefit-0.14/build.bat0000644000175000017500000000032310633422241013667 0ustar julienjulien@echo off echo Configuring EFI build environment... set SDK_BUILD_ENV=bios32 set SDK_INSTALL_DIR=%CD%\.. set EFI_APPLICATION_COMPATIBILITY=EFI_APP_110 set EFI_DEBUG=NO nmake -C -S -f refit.mak -nologo %1 refit-0.14/build64.bat0000644000175000017500000000032210633422241014040 0ustar julienjulien@echo off echo Configuring EFI build environment... set SDK_BUILD_ENV=em64t set SDK_INSTALL_DIR=%CD%\.. set EFI_APPLICATION_COMPATIBILITY=EFI_APP_110 set EFI_DEBUG=NO nmake -C -S -f refit.mak -nologo %1 refit-0.14/BUILDING.txt0000644000175000017500000000666211076141731014056 0ustar julienjulien Building rEFIt ================ There are three different build environments that you can use to build the rEFIt EFI components. The recommended (and traditional) way is with Intel's EFI Application Toolkit. This environment is used to build the released binaries, and it is the only one guaranteed to work. It may also be possible to build rEFIt with gnu-efi on Linux, and with the newly developed cross-platform 'efironment' package. The Mac OS X components are built with Xcode. The Xcode project file also contains targets to do a test-build for some of the EFI components, but this will not generate working EFI binaries. With the EFI Application Toolkit ---------------------------------- Older versions of the EFI Application Toolkit (1.10.*) are available directly from Intel at . Newer versions (2.0.*) are maintained at TianoCore, and can be downloaded at . Both work, but the latest release from TianoCore is recommended; only the TianoCore versions allow building of 64-bit binaries for current Mac models. After installing the Toolkit, copy the outer 'refit' directory with the source into the Toolkit's root directory. To build rEFIt and its tools, open a command prompt window that has the paths set for the Visual Studio tools. (Visual Studio installs a Start Menu item for this.) Then change to the 'refit' directory (the one where this BUILDING.txt file is), and run the appropriate sequence of scripts to build 32-bit, 64-bit or "fat" 32/64-bit binaries. * Plain 32-bit binaries: Run 'build.bat'. The resulting binaries are copied to each source directory, and are named like 'refit_bios32.efi'. Rename them as needed. * Plain 64-bit binaries: Run 'build64.bat'. The resulting binaries are copied to each source directory, and are named like 'refit_em64t.efi'. Rename them as needed. * Fat 32/64-bit binaries: These are required if you want rEFIt to work on all Apple Mac models. First run 'build.bat', then 'build64.bat'. You should now have two versions of each binary. Then run 'gluerefit.sh'. (You'll probably have to run this from Mac OS X or Linux, it's a shell script that runs a Python script. Sorry.) This creates the fat binaries in the main refit directory (where you're running the script from). To build all rEFIt components as part of a complete Toolkit build, edit the main 'makefile' appropriately. With gnu-efi -------------- You can use gnu-efi 3.0a or later to build rEFIt on a Linux system. After unpacking the source distribution, check the 'Make.common' file and make sure the paths to the compiler and gnu-efi libraries are correct. (It should work out-of-the-box on a Debian system.) To build refit.efi, first run 'make' in the 'libeg' directory, then run 'make' in the 'refit' directory. With efironment ----------------- As a third alternative, you can use the cross-platform 'efironment' build environment. The development of efironment was sparked out of frustration with both gnu-efi and Intel's various build environments (EFI Application Toolkit, TianoCore). The goal is to have a single, up-to-date package that compiles with Visual Studio on Windows as well as gcc on Linux (and with some limitations, on Mac OS X). A current snapshot is available from the rEFIt project's Subversion repository. After setting up efironment, you can use the 'mkefi' command to build first libeg, the refit.efi itself. EOF refit-0.14/dbounce/0000755000175000017500000000000011363100432013515 5ustar julienjulienrefit-0.14/dbounce/dbounce.c0000644000175000017500000003750510557120251015317 0ustar julienjulien/* * dbounce/dbounce.c * Driver loader * * Loads all drivers from \efi\tools\drivers, then launches * \efi\refit\refit.efi. Both paths are searched for on all * available volumes if necessary. * * Copyright (c) 2006-2007 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efilib.h" #include "efiConsoleControl.h" // Paths to search for. You can override these from the compiler command // line to build dbounce for a different loader. #ifndef DRIVER_DIR #define DRIVER_DIR L"\\efi\\tools\\drivers" #endif #ifndef CHAINLOADER #define CHAINLOADER L"\\efi\\refit\\refit.efi" #endif #ifndef FALLBACKSHELL #define FALLBACKSHELL L"\\efi\\tools\\shell.efi" #endif EFI_GUID gEfiConsoleControlProtocolGuid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; EFI_HANDLE SelfImageHandle; EFI_LOADED_IMAGE *SelfLoadedImage; // // Console stuff // static BOOLEAN CheckError(IN EFI_STATUS Status, IN CHAR16 *where) { CHAR16 ErrorName[64]; if (!EFI_ERROR(Status)) return FALSE; StatusToString(ErrorName, Status); //ST->ConOut->SetAttribute(ST->ConOut, ATTR_ERROR); Print(L"Error: %s %s\n", ErrorName, where); //ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); return TRUE; } static EFI_STATUS WaitForKeyOrReset(VOID) { EFI_STATUS Status; EFI_INPUT_KEY key; UINTN index; for(;;) { Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key); if (Status == EFI_NOT_READY) BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index); else break; } if (!EFI_ERROR(Status)) { if (key.ScanCode == SCAN_ESC) RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); } return Status; } // // directory iteration // typedef struct { EFI_STATUS LastStatus; EFI_FILE *DirHandle; BOOLEAN CloseDirHandle; EFI_FILE_INFO *LastFileInfo; } REFIT_DIR_ITER; EFI_STATUS DirNextEntry(IN EFI_FILE *Directory, IN OUT EFI_FILE_INFO **DirEntry, IN UINTN FilterMode) { EFI_STATUS Status; VOID *Buffer; UINTN LastBufferSize, BufferSize; INTN IterCount; for (;;) { // free pointer from last call if (*DirEntry != NULL) { FreePool(*DirEntry); *DirEntry = NULL; } // read next directory entry LastBufferSize = BufferSize = 256; Buffer = AllocatePool(BufferSize); for (IterCount = 0; ; IterCount++) { Status = Directory->Read(Directory, &BufferSize, Buffer); if (Status != EFI_BUFFER_TOO_SMALL || IterCount >= 4) break; if (BufferSize <= LastBufferSize) { Print(L"FS Driver requests bad buffer size %d (was %d), using %d instead\n", BufferSize, LastBufferSize, LastBufferSize * 2); BufferSize = LastBufferSize * 2; } Buffer = ReallocatePool(Buffer, LastBufferSize, BufferSize); LastBufferSize = BufferSize; } if (EFI_ERROR(Status)) { FreePool(Buffer); break; } // check for end of listing if (BufferSize == 0) { // end of directory listing FreePool(Buffer); break; } // entry is ready to be returned *DirEntry = (EFI_FILE_INFO *)Buffer; // filter results if (FilterMode == 1) { // only return directories if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY)) break; } else if (FilterMode == 2) { // only return files if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY) == 0) break; } else // no filter or unknown filter -> return everything break; } return Status; } VOID DirIterOpen(IN EFI_FILE *BaseDir, IN CHAR16 *RelativePath OPTIONAL, OUT REFIT_DIR_ITER *DirIter) { if (RelativePath == NULL) { DirIter->LastStatus = EFI_SUCCESS; DirIter->DirHandle = BaseDir; DirIter->CloseDirHandle = FALSE; } else { DirIter->LastStatus = BaseDir->Open(BaseDir, &(DirIter->DirHandle), RelativePath, EFI_FILE_MODE_READ, 0); DirIter->CloseDirHandle = EFI_ERROR(DirIter->LastStatus) ? FALSE : TRUE; } DirIter->LastFileInfo = NULL; } BOOLEAN DirIterNext(IN OUT REFIT_DIR_ITER *DirIter, IN UINTN FilterMode, IN CHAR16 *FilePattern OPTIONAL, OUT EFI_FILE_INFO **DirEntry) { if (DirIter->LastFileInfo != NULL) { FreePool(DirIter->LastFileInfo); DirIter->LastFileInfo = NULL; } if (EFI_ERROR(DirIter->LastStatus)) return FALSE; // stop iteration for (;;) { DirIter->LastStatus = DirNextEntry(DirIter->DirHandle, &(DirIter->LastFileInfo), FilterMode); if (EFI_ERROR(DirIter->LastStatus)) return FALSE; if (DirIter->LastFileInfo == NULL) // end of listing return FALSE; if (FilePattern != NULL) { if ((DirIter->LastFileInfo->Attribute & EFI_FILE_DIRECTORY)) break; if (MetaiMatch(DirIter->LastFileInfo->FileName, FilePattern)) break; // else continue loop } else break; } *DirEntry = DirIter->LastFileInfo; return TRUE; } EFI_STATUS DirIterClose(IN OUT REFIT_DIR_ITER *DirIter) { if (DirIter->LastFileInfo != NULL) { FreePool(DirIter->LastFileInfo); DirIter->LastFileInfo = NULL; } if (DirIter->CloseDirHandle) DirIter->DirHandle->Close(DirIter->DirHandle); return DirIter->LastStatus; } // // file name manipulation // CHAR16 * Basename(IN CHAR16 *Path) { CHAR16 *FileName; UINTN i; FileName = Path; if (Path != NULL) { for (i = StrLen(Path); i > 0; i--) { if (Path[i-1] == '\\' || Path[i-1] == '/') { FileName = Path + i; break; } } } return FileName; } // // run an EFI binary // static EFI_STATUS RunImage(IN EFI_HANDLE DeviceHandle, IN CHAR16 *FilePath) { EFI_STATUS Status; EFI_DEVICE_PATH *DevicePath; EFI_HANDLE LoaderHandle; CHAR16 *FileName; FileName = Basename(FilePath); Print(L"Loading %s...\n", FileName); // make a full device path for the image file DevicePath = FileDevicePath(DeviceHandle, FilePath); // load the image into memory Status = BS->LoadImage(FALSE, SelfImageHandle, DevicePath, NULL, 0, &LoaderHandle); FreePool(DevicePath); if (EFI_ERROR(Status)) return Status; // start it! BS->StartImage(LoaderHandle, NULL, NULL); return EFI_SUCCESS; } // // driver loading // static EFI_STATUS LoadAllDrivers(IN EFI_HANDLE DeviceHandle, IN EFI_FILE *RootDir, IN CHAR16 *DirPath) { EFI_STATUS Status; REFIT_DIR_ITER DirIter; EFI_FILE_INFO *DirEntry; CHAR16 FilePath[256]; CHAR16 ErrorMsg[256]; // look through contents of the directory DirIterOpen(RootDir, DirPath, &DirIter); while (DirIterNext(&DirIter, 2, L"*.EFI", &DirEntry)) { if (DirEntry->FileName[0] == '.') continue; // skip this SPrint(FilePath, 255, L"%s\\%s", DirPath, DirEntry->FileName); Status = RunImage(DeviceHandle, FilePath); SPrint(ErrorMsg, 255, L"while loading %s", DirEntry->FileName); CheckError(Status, ErrorMsg); } Status = DirIterClose(&DirIter); if (Status != EFI_NOT_FOUND) { SPrint(ErrorMsg, 255, L"while scanning for drivers"); CheckError(Status, ErrorMsg); return Status; } return EFI_SUCCESS; } static EFI_STATUS ConnectAllDriversToAllControllers(VOID) { EFI_STATUS Status; UINTN AllHandleCount; EFI_HANDLE *AllHandleBuffer; UINTN Index; UINTN HandleCount; EFI_HANDLE *HandleBuffer; UINT32 *HandleType; UINTN HandleIndex; BOOLEAN Parent; BOOLEAN Device; Status = LibLocateHandle(AllHandles, NULL, NULL, &AllHandleCount, &AllHandleBuffer); if (EFI_ERROR(Status)) return Status; for (Index = 0; Index < AllHandleCount; Index++) { // // Scan the handle database // Status = LibScanHandleDatabase(NULL, NULL, AllHandleBuffer[Index], NULL, &HandleCount, &HandleBuffer, &HandleType); if (EFI_ERROR (Status)) goto Done; Device = TRUE; if (HandleType[Index] & EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE) Device = FALSE; if (HandleType[Index] & EFI_HANDLE_TYPE_IMAGE_HANDLE) Device = FALSE; if (Device) { Parent = FALSE; for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { if (HandleType[HandleIndex] & EFI_HANDLE_TYPE_PARENT_HANDLE) Parent = TRUE; } if (!Parent) { if (HandleType[Index] & EFI_HANDLE_TYPE_DEVICE_HANDLE) { Status = BS->ConnectController(AllHandleBuffer[Index], NULL, NULL, TRUE); } } } FreePool (HandleBuffer); FreePool (HandleType); } Done: FreePool (AllHandleBuffer); return Status; } // // volume searching // static EFI_STATUS CheckVolumeForPath(IN EFI_HANDLE VolumeDeviceHandle, IN CHAR16 *Path, OUT EFI_FILE **RootDirOut) { EFI_STATUS Status; EFI_FILE *RootDir; EFI_FILE *TestFile; // open volume RootDir = LibOpenRoot(VolumeDeviceHandle); if (RootDir == NULL) { Print(L"Can't open volume.\n"); return EFI_NOT_FOUND; } // try to open path Status = RootDir->Open(RootDir, &TestFile, Path, EFI_FILE_MODE_READ, 0); if (EFI_ERROR(Status)) { RootDir->Close(RootDir); return Status; } TestFile->Close(TestFile); *RootDirOut = RootDir; return EFI_SUCCESS; } static EFI_STATUS FindVolumeWithPath(IN CHAR16 *Path, OUT EFI_HANDLE *DeviceHandle, OUT EFI_FILE **RootDir) { EFI_STATUS Status; UINTN HandleCount = 0; UINTN HandleIndex; EFI_HANDLE *Handles; // try our volume first Status = CheckVolumeForPath(SelfLoadedImage->DeviceHandle, Path, RootDir); if (!EFI_ERROR(Status)) { *DeviceHandle = SelfLoadedImage->DeviceHandle; return Status; } // iterate over all volumes Status = LibLocateHandle(ByProtocol, &FileSystemProtocol, NULL, &HandleCount, &Handles); if (CheckError(Status, L"while listing all file systems")) return Status; for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { // try this device Status = CheckVolumeForPath(Handles[HandleIndex], Path, RootDir); if (!EFI_ERROR(Status)) { *DeviceHandle = Handles[HandleIndex]; FreePool(Handles); return Status; } } FreePool(Handles); return EFI_NOT_FOUND; } EFI_STATUS EFIAPI DBounceMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; EFI_CONSOLE_CONTROL_SCREEN_MODE currentMode; EFI_HANDLE DeviceHandle; EFI_FILE *RootDir; SelfImageHandle = ImageHandle; InitializeLib(ImageHandle, SystemTable); // switch to text mode if (BS->LocateProtocol(&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl) == EFI_SUCCESS) { ConsoleControl->GetMode(ConsoleControl, ¤tMode, NULL, NULL); if (currentMode == EfiConsoleControlScreenGraphics) ConsoleControl->SetMode(ConsoleControl, EfiConsoleControlScreenText); } // get loaded image protocol for ourselves if (BS->HandleProtocol(SelfImageHandle, &LoadedImageProtocol, (VOID*)&SelfLoadedImage) != EFI_SUCCESS) { Print(L"Can not retrieve a LoadedImageProtocol handle for ImageHandle\n"); return EFI_NOT_FOUND; } // load all drivers from drivers directory Status = FindVolumeWithPath(DRIVER_DIR, &DeviceHandle, &RootDir); if (EFI_ERROR(Status)) { Print(L"Warning: Can't find a volume containing '" DRIVER_DIR L"'.\n"); } else { Status = LoadAllDrivers(DeviceHandle, RootDir, DRIVER_DIR); RootDir->Close(RootDir); Status = ConnectAllDriversToAllControllers(); } // load chainloaded loader Status = FindVolumeWithPath(CHAINLOADER, &DeviceHandle, &RootDir); if (EFI_ERROR(Status)) { Print(L"Error: Can't find a volume containing '" CHAINLOADER L"'.\n"); } else { RootDir->Close(RootDir); Status = RunImage(DeviceHandle, CHAINLOADER); CheckError(Status, L"while loading '" CHAINLOADER L"'.\n"); // NOTE: The loader is not supposed to return to us if // it succeeds in loading an OS. } // fall back to the EFI shell Status = FindVolumeWithPath(FALLBACKSHELL, &DeviceHandle, &RootDir); if (EFI_ERROR(Status)) { Print(L"Error: Can't find a volume containing '" FALLBACKSHELL L"'.\n"); } else { RootDir->Close(RootDir); Print(L"\nPress ESC to reboot or any other key to start the EFI Shell.\n\n"); WaitForKeyOrReset(); Status = RunImage(DeviceHandle, FALLBACKSHELL); CheckError(Status, L"while loading '" FALLBACKSHELL L"'.\n"); } Print(L"\nPress ESC to reboot or any other key to return control to the firmware.\n\n"); WaitForKeyOrReset(); return Status; } refit-0.14/dbounce/dbounce.mak0000644000175000017500000000235110633422241015633 0ustar julienjulien# # dbounce/dbounce.mak # Build control file for the driver loader # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = dbounce IMAGE_ENTRY_POINT = DBounceMain # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/dumpfv/0000755000175000017500000000000011363100432013377 5ustar julienjulienrefit-0.14/dumpfv/dumpfv.c0000644000175000017500000000526210475076666015101 0ustar julienjulien/* * dumpfv/dumpfv.c * Dump the firmware image from ROM to disk. * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efilib.h" #include // // main function // EFI_STATUS EFIAPI efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; VOID * fw_rom_ptr; VOID * fw_ptr; UINT32 fw_len; InitializeLib(ImageHandle, SystemTable); // firmware location in ROM fw_rom_ptr = (void *)0xffe00000; fw_len = 0x200000; // make a copy in RAM Print(L"Copying Firmware to RAM...\n"); fw_ptr = AllocatePool(fw_len); if (fw_ptr == NULL) { Print(L"Out of memory!\n"); return EFI_OUT_OF_RESOURCES; } CopyMem(fw_ptr, fw_rom_ptr, fw_len); // save to file on the ESP Print(L"Saving Firmware to firmware.fd on ESP...\n"); Status = egSaveFile(NULL, L"firmware.fd", fw_ptr, fw_len); if (EFI_ERROR(Status)) { Print(L"Error egSaveFile: %x\n", Status); return Status; } Print(L"Done.\n"); return EFI_SUCCESS; } refit-0.14/dumpfv/dumpfv.mak0000644000175000017500000000252010633422241015375 0ustar julienjulien# # dumpfv/dumpfv.mak # Build control file for the firmware dumper # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = dumpfv IMAGE_ENTRY_POINT = efi_main # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) \ -I $(SDK_INSTALL_DIR)\refit\libeg $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib \ $(SDK_BUILD_DIR)\refit\libeg\libeg.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/dumpprot/0000755000175000017500000000000011363100432013750 5ustar julienjulienrefit-0.14/dumpprot/dumpprot.c0000644000175000017500000003201511161477243016004 0ustar julienjulien/* * dumpprot.c * Dump all handles and protocols * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efilib.h" #include "efiUgaDraw.h" #include "efiUgaIo.h" #include "efiConsoleControl.h" // // helper functions // static VOID MyGuidToString(OUT CHAR16 *Buffer, IN EFI_GUID *Guid) { SPrint (Buffer, 0, L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", (UINTN)Guid->Data1, (UINTN)Guid->Data2, (UINTN)Guid->Data3, (UINTN)Guid->Data4[0], (UINTN)Guid->Data4[1], (UINTN)Guid->Data4[2], (UINTN)Guid->Data4[3], (UINTN)Guid->Data4[4], (UINTN)Guid->Data4[5], (UINTN)Guid->Data4[6], (UINTN)Guid->Data4[7] ); } static CHAR16 * MyDevicePathToStr(IN EFI_DEVICE_PATH *DevicePath) { CHAR16 GuidBuffer[64]; if (DevicePathType(DevicePath) == MEDIA_DEVICE_PATH && DevicePathSubType(DevicePath) == 6) { MyGuidToString(GuidBuffer, (EFI_GUID *)( (CHAR8 *)DevicePath + 4 )); return PoolPrint(L"FVFile(%s)", GuidBuffer); } else { return DevicePathToStr(DevicePath); } } // // protocol investigators // // TODO: UGADraw, TextOut VOID InvLoadedImage(IN EFI_HANDLE Handle, IN VOID *ProtocolInterface) { EFI_LOADED_IMAGE *LoadedImage = (EFI_LOADED_IMAGE *)ProtocolInterface; EFI_STATUS Status; EFI_DEVICE_PATH *DevicePath; Status = BS->HandleProtocol(LoadedImage->DeviceHandle, &DevicePathProtocol, (VOID **) &DevicePath); if (!EFI_ERROR(Status)) Print(L" Device \"%s\"", MyDevicePathToStr(DevicePath)); Print(L" File \"%s\"", MyDevicePathToStr(LoadedImage->FilePath)); } VOID InvDevPath(IN EFI_HANDLE Handle, IN VOID *ProtocolInterface) { EFI_DEVICE_PATH *DevicePath = (EFI_DEVICE_PATH *)ProtocolInterface; Print(L" %s", MyDevicePathToStr(DevicePath)); } VOID InvComponentName(IN EFI_HANDLE Handle, IN VOID *ProtocolInterface) { EFI_COMPONENT_NAME_PROTOCOL *CompName = (EFI_COMPONENT_NAME_PROTOCOL *)ProtocolInterface; EFI_STATUS Status; CHAR16 *DriverName; Status = CompName->GetDriverName(CompName, "eng", &DriverName); if (!EFI_ERROR(Status)) Print(L" \"%s\"", DriverName); else Print(L" (%R)", Status); } // // protocol information // typedef VOID (*INVESTIGATE)(IN EFI_HANDLE Handle, IN VOID *ProtocolInterface); typedef struct { EFI_GUID ID; CHAR16 *Name; INVESTIGATE InvestigateFunc; } PROTOCOL_INFO; PROTOCOL_INFO KnownProtocols[] = { { LOADED_IMAGE_PROTOCOL, L"LoadedImage", InvLoadedImage }, { DEVICE_PATH_PROTOCOL, L"DevPath", InvDevPath }, { EFI_COMPONENT_NAME_PROTOCOL_GUID, L"ComponentName", InvComponentName }, { {0,0,0,0,0,0,0,0,0,0,0}, NULL, NULL }, }; #include "protocols.h" // // Extract firmware device path(s) from handle database // static VOID ExtractFirmwareDevicePaths(EFI_DEVICE_PATH **PathList, UINTN MaxPaths) { EFI_STATUS Status; UINTN HandleCount = 0; UINTN HandleIndex; EFI_HANDLE *Handles; EFI_HANDLE Handle; UINTN PathCount = 0; UINTN PathIndex; EFI_LOADED_IMAGE *LoadedImage; EFI_DEVICE_PATH *DevicePath; BOOLEAN Seen; MaxPaths--; // leave space for the terminating NULL pointer PathList[PathCount] = NULL; // makes it okay to return early without results // get all LoadedImage handles Status = LibLocateHandle(ByProtocol, &LoadedImageProtocol, NULL, &HandleCount, &Handles); if (EFI_ERROR(Status)) { Print(L"Error: Can't get list of handles with LoadedImage protocol.\n"); return; } for (HandleIndex = 0; HandleIndex < HandleCount && PathCount < MaxPaths; HandleIndex++) { Handle = Handles[HandleIndex]; Status = BS->HandleProtocol(Handle, &LoadedImageProtocol, (VOID **) &LoadedImage); if (EFI_ERROR(Status)) { Print(L"Warning: Can't get LoadedImage protocol.\n"); continue; } Status = BS->HandleProtocol(LoadedImage->DeviceHandle, &DevicePathProtocol, (VOID **) &DevicePath); if (EFI_ERROR(Status)) { //Print(L"Warning: Can't get device path for image.\n"); continue; } // Check if we have this device path in the list already Seen = FALSE; for (PathIndex = 0; PathIndex < PathCount; PathIndex++) { if (DevicePathSize(DevicePath) != DevicePathSize(PathList[PathIndex])) continue; if (CompareMem(DevicePath, PathList[PathIndex], DevicePathSize(DevicePath)) == 0) { Seen = TRUE; break; } } if (Seen) continue; // Found a new device path! Print(L"Device \"%s\"\n", DevicePathToStr(DevicePath)); PathList[PathCount++] = DuplicateDevicePath(DevicePath); } FreePool(Handles); PathList[PathCount] = NULL; } static UINT8 LegacyLoaderMediaPathData[] = { 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; EFI_DEVICE_PATH *LegacyLoaderMediaPath = (EFI_DEVICE_PATH *)LegacyLoaderMediaPathData; static VOID ExtractLegacyLoaderPaths(EFI_DEVICE_PATH **PathList, UINTN MaxPaths) { EFI_STATUS Status; UINTN HandleCount = 0; UINTN HandleIndex; EFI_HANDLE *Handles; EFI_HANDLE Handle; UINTN PathCount = 0; UINTN PathIndex; EFI_LOADED_IMAGE *LoadedImage; EFI_DEVICE_PATH *DevicePath; BOOLEAN Seen; MaxPaths--; // leave space for the terminating NULL pointer PathList[PathCount] = NULL; // makes it okay to return early without results // get all LoadedImage handles Status = LibLocateHandle(ByProtocol, &LoadedImageProtocol, NULL, &HandleCount, &Handles); if (EFI_ERROR(Status)) { Print(L"Error: Can't get list of handles with LoadedImage protocol.\n"); return; } for (HandleIndex = 0; HandleIndex < HandleCount && PathCount < MaxPaths; HandleIndex++) { Handle = Handles[HandleIndex]; Status = BS->HandleProtocol(Handle, &LoadedImageProtocol, (VOID **) &LoadedImage); if (EFI_ERROR(Status)) { Print(L"Warning: Can't get LoadedImage protocol.\n"); continue; } Status = BS->HandleProtocol(LoadedImage->DeviceHandle, &DevicePathProtocol, (VOID **) &DevicePath); if (EFI_ERROR(Status)) { //Print(L"Warning: Can't get device path for image.\n"); continue; } // Only grab memory range nodes if (DevicePathType(DevicePath) != HARDWARE_DEVICE_PATH || DevicePathSubType(DevicePath) != HW_MEMMAP_DP) continue; // Check if we have this device path in the list already // WARNING: This assumes the first node in the device path is unique! Seen = FALSE; for (PathIndex = 0; PathIndex < PathCount; PathIndex++) { if (DevicePathNodeLength(DevicePath) != DevicePathNodeLength(PathList[PathIndex])) continue; if (CompareMem(DevicePath, PathList[PathIndex], DevicePathNodeLength(DevicePath)) == 0) { Seen = TRUE; break; } } if (Seen) continue; // Found a new device path! Print(L"Device \"%s\"\n", DevicePathToStr(DevicePath)); PathList[PathCount++] = AppendDevicePath(DevicePath, LegacyLoaderMediaPath); } FreePool(Handles); PathList[PathCount] = NULL; } // // main function // EFI_STATUS EFIAPI efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; UINTN Index, PIndex, IIndex; UINTN HandleCount; EFI_HANDLE *HandleBuffer; EFI_HANDLE Handle; UINTN ProtocolCount; EFI_GUID **ProtocolBuffer; EFI_GUID *ProtocolID; VOID *ProtocolInterface; CHAR16 GUIDBuf[64]; BOOLEAN Found; EFI_DEVICE_PATH *FirmwareDevicePaths[16]; InitializeLib(ImageHandle, SystemTable); Status = LibLocateHandle (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { Status = EFI_NOT_FOUND; return Status; } for (Index = 0; Index < HandleCount; Index++) { Handle = HandleBuffer[Index]; #if defined(EFI64) || defined(EFIX64) Print(L"Handle %02x @ %016x\n", Index, (UINT64)Handle); #else Print(L"Handle %02x @ %08x\n", Index, (UINT32)Handle); #endif Status = BS->ProtocolsPerHandle(Handle, &ProtocolBuffer, &ProtocolCount); if (EFI_ERROR(Status)) { Print(L" Error: %R\n", Status); continue; } for (PIndex = 0; PIndex < ProtocolCount; PIndex++) { ProtocolID = ProtocolBuffer[PIndex]; MyGuidToString(GUIDBuf, ProtocolID); Print(L" %s", GUIDBuf); Found = FALSE; for (IIndex = 0; KnownProtocols[IIndex].Name && !Found; IIndex++) { if (CompareMem(ProtocolID, &(KnownProtocols[IIndex].ID), sizeof(EFI_GUID)) == 0) { Print(L" %s", KnownProtocols[IIndex].Name); if (KnownProtocols[IIndex].InvestigateFunc) { Status = BS->HandleProtocol(Handle, ProtocolID, &ProtocolInterface); if (EFI_ERROR(Status)) { Print(L" (%R)", Status); } else { (KnownProtocols[IIndex].InvestigateFunc)(Handle, ProtocolInterface); } } Found = TRUE; } } for (IIndex = 0; MoreKnownProtocols[IIndex].Name && !Found; IIndex++) { if (CompareMem(ProtocolID, &(MoreKnownProtocols[IIndex].ID), sizeof(EFI_GUID)) == 0) { Print(L" %s", MoreKnownProtocols[IIndex].Name); Found = TRUE; } } Print(L"\n"); } FreePool(ProtocolBuffer); } FreePool (HandleBuffer); Print(L"\nDiscovered firmware image device paths:\n"); ExtractFirmwareDevicePaths(FirmwareDevicePaths, 16); for (Index = 0; FirmwareDevicePaths[Index]; Index++) { Print(L"Device path #%d:\n", Index+1); Print(L"%s\n", MyDevicePathToStr(FirmwareDevicePaths[Index])); DumpHex(2, 0, DevicePathSize(FirmwareDevicePaths[Index]), FirmwareDevicePaths[Index]); } Print(L"\nDiscovered legacy loader device paths:\n"); ExtractLegacyLoaderPaths(FirmwareDevicePaths, 16); for (Index = 0; FirmwareDevicePaths[Index]; Index++) { Print(L"Device path #%d:\n", Index+1); Print(L"%s\n", MyDevicePathToStr(FirmwareDevicePaths[Index])); DumpHex(2, 0, DevicePathSize(FirmwareDevicePaths[Index]), FirmwareDevicePaths[Index]); } return EFI_SUCCESS; } refit-0.14/dumpprot/dumpprot.mak0000644000175000017500000000235210633422241016322 0ustar julienjulien# # dumpprot/dumpprot.mak # Build control file for the elilo launcher # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = dumpprot IMAGE_ENTRY_POINT = efi_main # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/dumpprot/dumpprot.mkefi0000644000175000017500000000015410421744377016657 0ustar julienjulien# # mkefi control file for dumpprot # name dumpprot type app entrypoint efi_main source dumpprot.c # EOF refit-0.14/dumpprot/mkprot.py0000755000175000017500000000425210425732542015657 0ustar julienjulien#!/usr/bin/env python # # mkprot.py # import string, re output = """/* protocols.h generated by mkprot.py from protocols.txt */ PROTOCOL_INFO MoreKnownProtocols[] = { """ re_empty = re.compile(r"\s*$") re_comment = re.compile(r"\s*#.*$") re_namesplit = re.compile(r"(\S+)\s+(\S.*?)\s*$") re_guid1 = re.compile(r"0x([0-9a-f]{1,8}),\s*0x([0-9a-f]{1,4}),\s*0x([0-9a-f]{1,4}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2}),\s*0x([0-9a-f]{1,2})", re.I) re_guid2 = re.compile(r"([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})", re.I) f = file("protocols.txt", "r") for line in f: if re_empty.match(line) is not None: continue if re_comment.match(line) is not None: continue match = re_namesplit.match(line) if match is None: print "Skipping line '%s'" % line continue name = match.group(1) value = match.group(2) guid_v = None match = re_guid1.match(value) if match is not None: guid_v = list(match.groups()) match = re_guid2.match(value) if match is not None: m4 = match.group(4) m5 = match.group(5) guid_v = [ match.group(1), match.group(2), match.group(3), m4[0:2], m4[2:4], m5[0:2], m5[2:4], m5[4:6], m5[6:8], m5[8:10], m5[10:12] ] if guid_v is None: print "Didn't recognize line '%s'" % line continue guid_v[0] = guid_v[0].zfill(8) guid_v[1] = guid_v[1].zfill(4) guid_v[2] = guid_v[2].zfill(4) guid_v[3] = guid_v[3].zfill(2) guid_v[4] = guid_v[4].zfill(2) guid_v[5] = guid_v[5].zfill(2) guid_v[6] = guid_v[6].zfill(2) guid_v[7] = guid_v[7].zfill(2) guid_v[8] = guid_v[8].zfill(2) guid_v[9] = guid_v[9].zfill(2) guid_v[10] = guid_v[10].zfill(2) guid_c = "0x%s, 0x%s, 0x%s, { 0x%s, 0x%s, 0x%s, 0x%s,\n 0x%s, 0x%s, 0x%s, 0x%s }" % tuple(guid_v) output = output + """ { { %s }, L"%s", NULL }, """ % (guid_c, name) f.close() output = output + """ { {0,0,0,0,0,0,0,0,0,0,0}, NULL, NULL }, }; """ f = file("protocols.h", "w") f.write(output) f.close() # EOF refit-0.14/dumpprot/protocols.h0000644000175000017500000003635610425740307016173 0ustar julienjulien/* protocols.h generated by mkprot.py from protocols.txt */ PROTOCOL_INFO MoreKnownProtocols[] = { { { 0x5B1B31A1, 0x9562, 0x11d2, { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }, L"LoadedImage", NULL }, { { 0x09576e91, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"DevicePath", NULL }, { { 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } }, L"DriverBinding", NULL }, { { 0x6b30c738, 0xa391, 0x11d4, { 0x9a, 0x3b, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"PlatformDriverOverride", NULL }, { { 0x3bc1b285, 0x8a15, 0x4a82, { 0xaa, 0xbf, 0x4d, 0x7d, 0x13, 0xfb, 0x32, 0x65 } }, L"BusSpecificDriverOverride", NULL }, { { 0x107a772b, 0xd5e1, 0x11d4, { 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"DriverConfiguration", NULL }, { { 0x0784924f, 0xe296, 0x11d4, { 0x9a, 0x49, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"DriverDiagnostics", NULL }, { { 0x107a772c, 0xd5e1, 0x11d4, { 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"ComponentName", NULL }, { { 0x387477c1, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"SimpleInput", NULL }, { { 0x387477c2, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"SimpleTextOutput", NULL }, { { 0x982c298b, 0xf4fa, 0x41cb, { 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } }, L"UGADraw", NULL }, { { 0x61a4d49e, 0x6f68, 0x4f1b, { 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0x0b, 0x07, 0xa2 } }, L"UGAIO", NULL }, { { 0x31878c87, 0x0b75, 0x11d5, { 0x9a, 0x4f, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"SimplePointer", NULL }, { { 0xBB25CF6F, 0xF1D4, 0x11D2, { 0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD } }, L"SerialIO", NULL }, { { 0x56EC3091, 0x954C, 0x11d2, { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }, L"LoadFile", NULL }, { { 0x964e5b22, 0x6459, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"SimpleFileSystem", NULL }, { { 0xCE345171, 0xBA0B, 0x11d2, { 0x8e, 0x4F, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"DiskIO", NULL }, { { 0x964e5b21, 0x6459, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"BlockIO", NULL }, { { 0x1d85cd7f, 0xf43d, 0x11d2, { 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"UnicodeCollation", NULL }, { { 0x4cf5b200, 0x68b8, 0x4ca5, { 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a } }, L"PCIIO", NULL }, { { 0x2f707ebb, 0x4a1a, 0x11d4, { 0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"PCIRootBridgeIO", NULL }, { { 0xa59e8fcf, 0xbda0, 0x43bb, { 0x90, 0xb1, 0xd3, 0x73, 0x2e, 0xca, 0xa8, 0x77 } }, L"SCSIPassThru", NULL }, { { 0xF5089266, 0x1AA0, 0x4953, { 0x97, 0xD8, 0x56, 0x2F, 0x8A, 0x73, 0xB5, 0x19 } }, L"USBHostController", NULL }, { { 0x2B2F68D6, 0x0CD2, 0x44cf, { 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 } }, L"USBIO", NULL }, { { 0xA19832B9, 0xAC25, 0x11D3, { 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"SimpleNetwork", NULL }, { { 0xE18541CD, 0xF755, 0x4f73, { 0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29 } }, L"NetworkInterfaceIdentifier", NULL }, { { 0x03C4E603, 0xAC28, 0x11d3, { 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }, L"PxeBaseCode", NULL }, { { 0x245DCA21, 0xFB7B, 0x11d3, { 0x8F, 0x01, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } }, L"PxeBaseCodeCallback", NULL }, { { 0x0b64aab0, 0x5429, 0x11d4, { 0x98, 0x16, 0x00, 0xa0, 0xc9, 0x1f, 0xad, 0xcf } }, L"BIS", NULL }, { { 0x2755590C, 0x6F3C, 0x42FA, { 0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } }, L"DebugSupport", NULL }, { { 0xEBA4E8D2, 0x3858, 0x41EC, { 0xA2, 0x81, 0x26, 0x47, 0xBA, 0x96, 0x60, 0xD0 } }, L"DebugPort", NULL }, { { 0xd8117cfe, 0x94a6, 0x11d4, { 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"Decompress", NULL }, { { 0xaf6ac311, 0x84c3, 0x11d2, { 0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"DeviceIO", NULL }, { { 0x13AC6DD1, 0x73D0, 0x11D4, { 0xB0, 0x6B, 0x00, 0xAA, 0x00, 0xBD, 0x6D, 0xE7 } }, L"EBCInterpreter", NULL }, { { 0x665E3FF6, 0x46CC, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }, L"BDSArch", NULL }, { { 0x26baccb1, 0x6f42, 0x11d4, { 0xbc, 0xe7, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"CPUArch", NULL }, { { 0x26baccb2, 0x6f42, 0x11d4, { 0xbc, 0xe7, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"MetronomeArch", NULL }, { { 0x1da97072, 0xbddc, 0x4b30, { 0x99, 0xf1, 0x72, 0xa0, 0xb5, 0x6f, 0xff, 0x2a } }, L"MonotonicCounterArch", NULL }, { { 0x27CFAC87, 0x46CC, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }, L"RealTimeClockArch", NULL }, { { 0x27CFAC88, 0x46CC, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }, L"ResetArch", NULL }, { { 0x96d08253, 0x8483, 0x11d4, { 0xbc, 0xf1, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"RuntimeArch", NULL }, { { 0xA46423E3, 0x4617, 0x49f1, { 0xB9, 0xFF, 0xD1, 0xBF, 0xA9, 0x11, 0x58, 0x39 } }, L"SecurityArch", NULL }, { { 0xd98e3ea3, 0x6f39, 0x4be4, { 0x82, 0xce, 0x5a, 0x89, 0x0c, 0xcb, 0x2c, 0x95 } }, L"StatusCodeArch", NULL }, { { 0x26baccb3, 0x6f42, 0x11d4, { 0xbc, 0xe7, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"TimerArch", NULL }, { { 0x1e5668e2, 0x8481, 0x11d4, { 0xbc, 0xf1, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"VariableArch", NULL }, { { 0x6441f818, 0x6362, 0x4e44, { 0xb5, 0x70, 0x7d, 0xba, 0x31, 0xdd, 0x24, 0x53 } }, L"VariableWriteArch", NULL }, { { 0x665E3FF5, 0x46CC, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }, L"WatchdogTimerArch", NULL }, { { 0x470e1529, 0xb79e, 0x4e32, { 0xa0, 0xfe, 0x6a, 0x15, 0x6d, 0x29, 0xf9, 0xb2 } }, L"BootScriptSave", NULL }, { { 0xae80d021, 0x618e, 0x11d4, { 0xbc, 0xd7, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"DataHub", NULL }, { { 0xdbff9d55, 0x89b7, 0x46da, { 0xbd, 0xdf, 0x67, 0x7d, 0x3d, 0xc0, 0x24, 0x1d } }, L"ACPISupport", NULL }, { { 0x125f2de1, 0xfb85, 0x440c, { 0xa5, 0x4c, 0x4d, 0x99, 0x35, 0x8a, 0x8d, 0x38 } }, L"ACPIS3Save", NULL }, { { 0xB0732526, 0x38c8, 0x4b40, { 0x88, 0x77, 0x61, 0xc7, 0xb0, 0x6a, 0xac, 0x45 } }, L"CPUIO", NULL }, { { 0xaa0e8bc1, 0xdabc, 0x46b0, { 0xa8, 0x44, 0x37, 0xb8, 0x16, 0x9b, 0x2b, 0xea } }, L"PCIHotPlugInit", NULL }, { { 0xa1e37052, 0x80d9, 0x4e65, { 0xa3, 0x17, 0x3e, 0x9a, 0x55, 0xc4, 0x3e, 0xc9 } }, L"IDEControllerInit", NULL }, { { 0xCF8034BE, 0x6768, 0x4d8b, { 0xB7, 0x39, 0x7C, 0xCE, 0x68, 0x3A, 0x9F, 0xBE } }, L"PCIHostBridgeResAlloc", NULL }, { { 0x07d75280, 0x27d4, 0x4d69, { 0x90, 0xd0, 0x56, 0x43, 0xe2, 0x38, 0xb3, 0x41 } }, L"PCIPlatform", NULL }, { { 0xeb23f55a, 0x7863, 0x4ac2, { 0x8d, 0x3d, 0x95, 0x65, 0x35, 0xde, 0x03, 0x75 } }, L"IncompatiblePCIDeviceSupport", NULL }, { { 0x377c66a3, 0x8fe7, 0x4ee8, { 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b } }, L"PlatformIDEInit", NULL }, { { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d } }, L"LegacyBIOS", NULL }, { { 0x783658a3, 0x4172, 0x4421, { 0xa2, 0x99, 0xe0, 0x09, 0x07, 0x9c, 0x0c, 0xb4 } }, L"LegacyBIOSPlatform", NULL }, { { 0x0fc9013a, 0x0568, 0x4ba9, { 0x9b, 0x7e, 0xc9, 0xc3, 0x90, 0xa6, 0x60, 0x9b } }, L"LegacyRegion", NULL }, { { 0x38321dba, 0x4fe0, 0x4e17, { 0x8a, 0xec, 0x41, 0x30, 0x55, 0xea, 0xed, 0xc1 } }, L"Legacy8259", NULL }, { { 0x31ce593d, 0x108a, 0x485d, { 0xad, 0xb2, 0x78, 0xf2, 0x1f, 0x29, 0x66, 0xbe } }, L"LegacyInterrupt", NULL }, { { 0x389F751F, 0x1838, 0x4388, { 0x83, 0x90, 0xCD, 0x81, 0x54, 0xBD, 0x27, 0xF8 } }, L"FirmwareVolume", NULL }, { { 0x448F5DA4, 0x6DD7, 0x4FE1, { 0x93, 0x07, 0x69, 0x22, 0x41, 0x92, 0x21, 0x5D } }, L"SectionExtraction", NULL }, { { 0xDE28BC59, 0x6228, 0x41BD, { 0xBD, 0xF6, 0xA3, 0xB9, 0xAD, 0xB5, 0x8D, 0xA1 } }, L"FVBlock", NULL }, { { 0xcd361957, 0xafbe, 0x425e, { 0xa3, 0x58, 0x5f, 0x58, 0x89, 0xcf, 0xfe, 0x7b } }, L"HII", NULL }, { { 0xf3e4543d, 0xcf35, 0x6cef, { 0x35, 0xc4, 0x4f, 0xe6, 0x34, 0x4d, 0xfc, 0x54 } }, L"FormCallback", NULL }, { { 0xe5a1333e, 0xe1b4, 0x4d55, { 0xce, 0xeb, 0x35, 0xc3, 0xef, 0x13, 0x34, 0x43 } }, L"FormBrowser", NULL }, { { 0xe49d33ed, 0x513d, 0x4634, { 0xb6, 0x98, 0x6f, 0x55, 0xaa, 0x75, 0x1c, 0x1b } }, L"SMBUSHostController", NULL }, { { 0x1390954D, 0xda95, 0x4227, { 0x93, 0x28, 0x72, 0x82, 0xc2, 0x17, 0xda, 0xa8 } }, L"SMMBase", NULL }, { { 0x3792095a, 0xe309, 0x4c1e, { 0xaa, 0x01, 0x85, 0xf5, 0x65, 0x5a, 0x17, 0xf1 } }, L"SMMAccess", NULL }, { { 0x8d12e231, 0xc667, 0x4fd1, { 0x98, 0xf2, 0x24, 0x49, 0xa7, 0xe7, 0xb2, 0xe5 } }, L"SMMControl", NULL }, { { 0xe541b773, 0xdd11, 0x420c, { 0xb0, 0x26, 0xdf, 0x99, 0x36, 0x53, 0xf8, 0xbf } }, L"SMMSoftwareDispatch", NULL }, { { 0x14fc52be, 0x01dc, 0x426c, { 0x91, 0xae, 0xa2, 0x3c, 0x3e, 0x22, 0x0a, 0xe8 } }, L"SMMSxDispatch", NULL }, { { 0x9cca03fc, 0x4c9e, 0x4a19, { 0x9b, 0x06, 0xed, 0x7b, 0x47, 0x9b, 0xde, 0x55 } }, L"SMMPeriodicTimerDispatch", NULL }, { { 0xa05b6ffd, 0x87af, 0x4e42, { 0x95, 0xc9, 0x62, 0x28, 0xb6, 0x3c, 0xf3, 0xf3 } }, L"SMMUSBDispatch", NULL }, { { 0xe0744b81, 0x9513, 0x49cd, { 0x8c, 0xea, 0xe9, 0x24, 0x5e, 0x70, 0x39, 0xda } }, L"SMMGPIDispatch", NULL }, { { 0x78965b98, 0xb0bf, 0x449e, { 0x8b, 0x22, 0xd2, 0x91, 0x4e, 0x49, 0x8a, 0x98 } }, L"SMMStandbyButtonDispatch", NULL }, { { 0xb709efa0, 0x47a6, 0x4b41, { 0xb9, 0x31, 0x12, 0xec, 0xe7, 0xa8, 0xee, 0x56 } }, L"SMMPowerButtonDispatch", NULL }, { { 0xf42f7782, 0x012e, 0x4c12, { 0x99, 0x56, 0x49, 0xf9, 0x43, 0x04, 0xf7, 0x21 } }, L"ConsoleControl", NULL }, { { 0x9a44198e, 0xa4a2, 0x44e6, { 0x8a, 0x1f, 0x39, 0xbe, 0xfd, 0xac, 0x89, 0x6f } }, L"CustomizedDecompress", NULL }, { { 0xbe499c92, 0x7d4b, 0x11d4, { 0xbc, 0xee, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }, L"DebugAssert", NULL }, { { 0x4c8a2451, 0xc207, 0x405b, { 0x96, 0x94, 0x99, 0xea, 0x13, 0x25, 0x13, 0x41 } }, L"DebugMask", NULL }, { { 0xd432a67f, 0x14dc, 0x484b, { 0xb3, 0xbb, 0x3f, 0x02, 0x91, 0x84, 0x93, 0x27 } }, L"DiskInfo", NULL }, { { 0x170e13c0, 0xbf1b, 0x4218, { 0x87, 0x1d, 0x2a, 0xbd, 0xc6, 0xf8, 0x87, 0xbc } }, L"OEMBadging", NULL }, { { 0xde0ee9a4, 0x3c7a, 0x44f2, { 0xb7, 0x8b, 0xe3, 0xcc, 0xd6, 0x9c, 0x3a, 0xf7 } }, L"ExtendedSALBootService", NULL }, { { 0x3f557189, 0x8dae, 0x45ae, { 0xa0, 0xb3, 0x2b, 0x99, 0xca, 0x7a, 0xa7, 0xa0 } }, L"FaultTolerantWriteLite", NULL }, { { 0x7aa35a69, 0x506c, 0x444f, { 0xa7, 0xaf, 0x69, 0x4b, 0xf5, 0x6f, 0x71, 0xc8 } }, L"FirmwareVolumeDispatch", NULL }, { { 0x53a4c71b, 0xb581, 0x4170, { 0x91, 0xb3, 0x8d, 0xb8, 0x7a, 0x4b, 0x5c, 0x46 } }, L"FVBlockExtension", NULL }, { { 0x309de7f1, 0x7f5e, 0x4ace, { 0xb4, 0x9c, 0x53, 0x1b, 0xe5, 0xaa, 0x95, 0xef } }, L"GenericMemoryTest", NULL }, { { 0xFC1BCDB0, 0x7D31, 0x49aa, { 0x93, 0x6A, 0xA4, 0x60, 0x0D, 0x9D, 0xD0, 0x83 } }, L"CRC32GuidedSectionExtraction", NULL }, { { 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } }, L"ISA_ACPI", NULL }, { { 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"ISAIO", NULL }, { { 0x5cb5c776, 0x60d5, 0x45ee, { 0x88, 0x3c, 0x45, 0x27, 0x08, 0xcd, 0x74, 0x3f } }, L"LoadPE32Image", NULL }, { { 0x19cb87ab, 0x2cb9, 0x4665, { 0x83, 0x60, 0xdd, 0xcf, 0x60, 0x54, 0xf7, 0x9d } }, L"PCIHotPlugRequest", NULL }, { { 0xFFECFFFF, 0x923C, 0x14d2, { 0x9E, 0x3F, 0x22, 0xA0, 0xC9, 0x69, 0x56, 0x3B } }, L"Performance", NULL }, { { 0x0859ba18, 0x7dd7, 0x4ed7, { 0xa8, 0x8e, 0x10, 0x9c, 0x63, 0x91, 0x7b, 0xdd } }, L"PlatformMemTest", NULL }, { { 0xdf2d868e, 0x32fc, 0x4cf0, { 0x8e, 0x6b, 0xff, 0xd9, 0x5d, 0x13, 0x43, 0xd0 } }, L"Print", NULL }, { { 0x03c4e624, 0xac28, 0x11d3, { 0x9a, 0x2d, 0x00, 0x90, 0x29, 0x3f, 0xc1, 0x4d } }, L"PxeDhcp4", NULL }, { { 0xc1544c01, 0x92a4, 0x4198, { 0x8a, 0x84, 0x77, 0x85, 0x83, 0xc2, 0x36, 0x21 } }, L"PxeDhcp4Callback", NULL }, { { 0x403cd195, 0xf233, 0x48ec, { 0x84, 0x55, 0xb2, 0xe5, 0x2f, 0x1d, 0x9e, 0x02 } }, L"SCSIIO", NULL }, { { 0x78E4D245, 0xCD4D, 0x4a05, { 0xA2, 0xBA, 0x47, 0x43, 0xE8, 0x6C, 0xFC, 0xAB } }, L"SecurityPolicy", NULL }, { { 0x02b3d5f2, 0xac28, 0x11d3, { 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"Tcp", NULL }, { { 0xe84cf29c, 0x191f, 0x4eae, { 0x96, 0xe1, 0xf4, 0x6a, 0xec, 0xea, 0xea, 0x0b } }, L"TianoDecompress", NULL }, { { 0xa45b3a0d, 0x2e55, 0x4c03, { 0xad, 0x9c, 0x27, 0xd4, 0x82, 0x0b, 0x50, 0x7e } }, L"UGASplash", NULL }, { { 0x2B2F68DA, 0x0CD2, 0x44cf, { 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 } }, L"USB_ATAPI", NULL }, { { 0xf088cd91, 0xa046, 0x11d2, { 0x8e, 0x42, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"VariableStore", NULL }, { { 0x745d377a, 0xb988, 0x47b2, { 0xb1, 0x8f, 0xbb, 0xc8, 0x0d, 0xc5, 0x66, 0x98 } }, L"VirtualMemoryAccess", NULL }, { { 0xf496922d, 0x172f, 0x4bbc, { 0xa1, 0xeb, 0x0e, 0xeb, 0x94, 0x9c, 0x34, 0x86 } }, L"AlternateFVBlock*", NULL }, { { 0xd3b36f2b, 0xd551, 0x11d4, { 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"ConsoleInDevice*", NULL }, { { 0xd3b36f2c, 0xd551, 0x11d4, { 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"ConsoleOutDevice*", NULL }, { { 0xe451dcbe, 0x96a1, 0x4729, { 0xa5, 0xcf, 0x6b, 0x9c, 0x2c, 0xff, 0x47, 0xfd } }, L"PrimaryConsoleInDevice*", NULL }, { { 0x62bdf38a, 0xe3d5, 0x492c, { 0x95, 0x0c, 0x23, 0xa7, 0xf6, 0x6e, 0x67, 0x2e } }, L"PrimaryConsoleOutDevice*", NULL }, { { 0x5a68191b, 0x9b97, 0x4752, { 0x99, 0x46, 0xe3, 0x6a, 0x5d, 0xa9, 0x42, 0xb1 } }, L"PrimaryStandardErrorDevice*", NULL }, { { 0xd3b36f2d, 0xd551, 0x11d4, { 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }, L"StandardErrorDevice*", NULL }, { { 0x47c7b223, 0xc42a, 0x11d2, { 0x8e, 0x57, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"ShellInterface", NULL }, { { 0x47c7b221, 0xc42a, 0x11d2, { 0x8e, 0x57, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } }, L"ShellEnvInterface", NULL }, { { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } }, L"PartType_EFISystem*", NULL }, { { 0x024dee41, 0x33e7, 0x11d3, { 0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f } }, L"PartType_LegacyMBR*", NULL }, { {0,0,0,0,0,0,0,0,0,0,0}, NULL, NULL }, }; refit-0.14/dumpprot/protocols.txt0000644000175000017500000002754410425740307016562 0ustar julienjulien# # dumpprot/protocols.txt # ### from EFI 1.10 specification LoadedImage 0x5B1B31A1,0x9562,0x11d2,0x8E,0x3F,0x00,0xA0,0xC9,0x69,0x72,0x3B DevicePath 09576e91-6d3f-11d2-8e39-00a0c969723b DriverBinding 0x18A031AB,0xB443,0x4D1A,0xA5,0xC0,0x0C,0x09,0x26,0x1E,0x9F,0x71 PlatformDriverOverride 0x6b30c738,0xa391,0x11d4,0x9a,0x3b,0x00,0x90,0x27,0x3f,0xc1,0x4d BusSpecificDriverOverride 0x3bc1b285,0x8a15,0x4a82,0xaa,0xbf,0x4d,0x7d,0x13,0xfb,0x32,0x65 DriverConfiguration 0x107a772b,0xd5e1,0x11d4,0x9a,0x46,0x0,0x90,0x27,0x3f,0xc1,0x4d DriverDiagnostics 0x0784924f,0xe296,0x11d4,0x9a,0x49,0x0,0x90,0x27,0x3f,0xc1,0x4d ComponentName 0x107a772c,0xd5e1,0x11d4,0x9a,0x46,0x0,0x90,0x27,0x3f,0xc1,0x4d SimpleInput 387477c1-69c7-11d2-8e39-00a0c969723b SimpleTextOutput 387477c2-69c7-11d2-8e39-00a0c969723b UGADraw 0x982c298b,0xf4fa,0x41cb,0xb8,0x38,0x77,0xaa,0x68,0x8f,0xb8,0x39 UGAIO 0x61a4d49e, 0x6f68, 0x4f1b, 0xb9,0x22,0xa8,0x6e,0xed,0xb,0x7,0xa2 SimplePointer 0x31878c87,0xb75,0x11d5,0x9a,0x4f,0x0,0x90,0x27,0x3f,0xc1,0x4d SerialIO BB25CF6F-F1D4-11D2-9A0C-0090273FC1FD LoadFile 56EC3091-954C-11d2-8E3F-00A0C969723B SimpleFileSystem 964e5b22-6459-11d2-8e39-00a0c969723b DiskIO CE345171-BA0B-11d2-8e4F-00a0c969723b BlockIO 964e5b21-6459-11d2-8e39-00a0c969723b UnicodeCollation 1d85cd7f-f43d-11d2-9a0c-0090273fc14d PCIIO 0x4cf5b200,0x68b8,0x4ca5,0x9e,0xec,0xb2,0x3e,0x3f,0x50,0x2,0x9a PCIRootBridgeIO 0x2f707ebb, 0x4a1a, 0x11d4, 0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d SCSIPassThru 0xa59e8fcf,0xbda0,0x43bb,0x90,0xb1,0xd3,0x73,0x2e,0xca,0xa8,0x77 USBHostController 0xF5089266,0x1AA0,0x4953,0x97,0xD8,0x56,0x2F,0x8A,0x73,0xB5,0x19 USBIO 0x2B2F68D6,0x0CD2,0x44cf,0x8E,0x8B,0xBB,0xA2,0x0B,0x1B,0x5B,0x75 SimpleNetwork A19832B9-AC25-11D3-9A2D-0090273fc14d NetworkInterfaceIdentifier E18541CD-F755-4f73-928D-643C8A79B229 PxeBaseCode 03C4E603-AC28-11d3-9A2D-0090273FC14D PxeBaseCodeCallback 245DCA21-FB7B-11d3-8F01-00A0C969723B BIS 0x0b64aab0,0x5429,0x11d4,0x98,0x16,0x00,0xa0,0xc9,0x1f,0xad,0xcf DebugSupport 0x2755590C,0x6F3C,0x42FA,0x9E,0xA4,0xA3,0xBA,0x54,0x3C,0xDA,0x25 DebugPort 0xEBA4E8D2,0x3858,0x41EC,0xA2,0x81,0x26,0x47,0xBA,0x96,0x60,0xD0 Decompress 0xd8117cfe,0x94a6,0x11d4,0x9a,0x3a,0x0,0x90,0x27,0x3f,0xc1,0x4d DeviceIO af6ac311-84c3-11d2-8e3c-00a0c969723b EBCInterpreter 0x13AC6DD1,0x73D0,0x11D4,0xB0,0x6B,0x00,0xAA,0x00,0xBD,0x6D,0xE7 ### from Tiano specification documents BDSArch 0x665E3FF6,0x46CC,0x11d4,0x9A,0x38,0x00,0x90,0x27,0x3F,0xC1,0x4D CPUArch 0x26baccb1,0x6f42,0x11d4,0xbc,0xe7,0x0,0x80,0xc7,0x3c,0x88,0x81 MetronomeArch 0x26baccb2,0x6f42,0x11d4,0xbc,0xe7,0x0,0x80,0xc7,0x3c,0x88,0x81 MonotonicCounterArch 0x1da97072,0xbddc,0x4b30,0x99,0xf1,0x72,0xa0,0xb5,0x6f,0xff,0x2a RealTimeClockArch 0x27CFAC87,0x46CC,0x11d4,0x9A,0x38,0x00,0x90,0x27,0x3F,0xC1,0x4D ResetArch 0x27CFAC88,0x46CC,0x11d4,0x9A,0x38,0x00,0x90,0x27,0x3F,0xC1,0x4D RuntimeArch 0x96d08253,0x8483,0x11d4,0xbc,0xf1,0x0,0x80,0xc7, 0x3c,0x88,0x81 SecurityArch 0xA46423E3,0x4617,0x49f1,0xB9,0xFF,0xD1,0xBF,0xA9,0x11,0x58,0x39 StatusCodeArch 0xd98e3ea3,0x6f39,0x4be4,0x82,0xce,0x5a,0x89,0xc,0xcb,0x2c,0x95 TimerArch 0x26baccb3,0x6f42,0x11d4,0xbc,0xe7,0x0,0x80,0xc7,0x3c,0x88,0x81 VariableArch 0x1e5668e2,0x8481,0x11d4,0xbc,0xf1,0x0,0x80,0xc7,0x3c,0x88,0x81 VariableWriteArch 0x6441f818,0x6362,0x4e44,0xb5,0x70,0x7d,0xba,0x31,0xdd,0x24,0x53 WatchdogTimerArch 0x665E3FF5,0x46CC,0x11d4,0x9A,0x38,0x00,0x90,0x27,0x3F,0xC1,0x4D BootScriptSave 0x470e1529, 0xb79e, 0x4e32, 0xa0, 0xfe, 0x6a, 0x15, 0x6d, 0x29, 0xf9, 0xb2 DataHub 0xae80d021, 0x618e, 0x11d4, 0xbc, 0xd7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 ACPISupport 0xdbff9d55, 0x89b7, 0x46da, 0xbd, 0xdf, 0x67, 0x7d, 0x3d, 0xc0, 0x24, 0x1d ACPIS3Save 0x125f2de1,0xfb85, 0x440c,0xa5,0x4c,0x4d,0x99,0x35, 0x8a,0x8d,0x38 CPUIO 0xB0732526, 0x38c8, 0x4b40, 0x88, 0x77, 0x61, 0xc7, 0xb0, 0x6a, 0xac, 0x45 PCIHotPlugInit 0xaa0e8bc1, 0xdabc, 0x46b0, 0xa8, 0x44, 0x37, 0xb8, 0x16, 0x9b, 0x2b, 0xea IDEControllerInit 0xa1e37052, 0x80d9, 0x4e65, 0xa3, 0x17, 0x3e, 0x9a, 0x55, 0xc4, 0x3e, 0xc9 PCIHostBridgeResAlloc 0xCF8034BE,0x6768,0x4d8b,0xB7,0x39,0x7C,0xCE,0x68,0x3A,0x9F,0xBE PCIPlatform 0x7d75280, 0x27d4, 0x4d69, 0x90, 0xd0, 0x56, 0x43, 0xe2, 0x38, 0xb3, 0x41 IncompatiblePCIDeviceSupport 0xeb23f55a, 0x7863, 0x4ac2, 0x8d, 0x3d, 0x95, 0x65, 0x35, 0xde, 0x3, 0x75 PlatformIDEInit 0x377c66a3, 0x8fe7, 0x4ee8, 0x85, 0xb8, 0xf1, 0xa2, 0x82, 0x56, 0x9e, 0x3b LegacyBIOS 0xdb9a1e3d, 0x45cb, 0x4abb, 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d LegacyBIOSPlatform 0x783658a3, 0x4172, 0x4421, 0xa2, 0x99, 0xe0, 0x09, 0x07, 0x9c, 0x0c, 0xb4 LegacyRegion 0xfc9013a, 0x568, 0x4ba9, 0x9b, 0x7e, 0xc9, 0xc3, 0x90, 0xa6, 0x60, 0x9b Legacy8259 0x38321dba, 0x4fe0, 0x4e17, 0x8a, 0xec, 0x41, 0x30, 0x55, 0xea, 0xed, 0xc1 LegacyInterrupt 0x31ce593d, 0x108a, 0x485d, 0xad, 0xb2, 0x78, 0xf2, 0x1f, 0x29, 0x66, 0xbe FirmwareVolume 0x389F751F, 0x1838, 0x4388, 0x83, 0x90, 0xCD, 0x81, 0x54, 0xBD, 0x27, 0xF8 SectionExtraction 0x448F5DA4, 0x6DD7, 0x4FE1, 0x93, 0x07, 0x69, 0x22, 0x41, 0x92, 0x21, 0x5D FVBlock 0xDE28BC59, 0x6228, 0x41BD, 0xBD, 0xF6, 0xA3, 0xB9, 0xAD, 0xB5, 0x8D, 0xA1 HII 0xcd361957, 0xafbe, 0x425e, 0xa3, 0x58, 0x5f, 0x58, 0x89, 0xcf, 0xfe, 0x7b FormCallback 0xf3e4543d, 0xcf35, 0x6cef, 0x35, 0xc4, 0x4f, 0xe6, 0x34, 0x4d, 0xfc, 0x54 FormBrowser 0xe5a1333e, 0xe1b4, 0x4d55, 0xce, 0xeb, 0x35, 0xc3, 0xef, 0x13, 0x34, 0x43 SMBUSHostController 0xe49d33ed, 0x513d, 0x4634, 0xb6, 0x98, 0x6f, 0x55, 0xaa, 0x75, 0x1c, 0x1b SMMBase 0x1390954D,0xda95,0x4227,0x93,0x28,0x72, 0x82,0xc2, 0x17,0xda,0xa8 SMMAccess 0x3792095a, 0xe309, 0x4c1e, 0xaa, 0x01, 0x85, 0xf5, 0x65, 0x5a, 0x17, 0xf1 SMMControl 0x8d12e231,0xc667,0x4fd1,0x98,0xf2,0x24, 0x49,0xa7, 0xe7,0xb2,0xe5 SMMSoftwareDispatch 0xe541b773,0xdd11,0x420c,0xb0,0x26,0xdf, 0x99,0x36,0x53, 0xf8,0xbf SMMSxDispatch 0x14fc52be, 0x1dc, 0x426c, 0x91, 0xae, 0xa2, 0x3c, 0x3e, 0x22, 0xa, 0xe8 SMMPeriodicTimerDispatch 0x9cca03fc, 0x4c9e, 0x4a19, 0x9b, 0x6, 0xed, 0x7b, 0x47, 0x9b, 0xde, 0x55 SMMUSBDispatch 0xa05b6ffd, 0x87af, 0x4e42, 0x95, 0xc9, 0x62, 0x28, 0xb6, 0x3c, 0xf3, 0xf3 SMMGPIDispatch 0xe0744b81, 0x9513, 0x49cd, 0x8c, 0xea, 0xe9, 0x24, 0x5e, 0x70, 0x39, 0xda SMMStandbyButtonDispatch 0x78965b98, 0xb0bf, 0x449e, 0x8b, 0x22, 0xd2, 0x91, 0x4e, 0x49, 0x8a, 0x98 SMMPowerButtonDispatch 0xb709efa0, 0x47a6, 0x4b41, 0xb9, 0x31, 0x12, 0xec, 0xe7, 0xa8, 0xee, 0x56 ### from Tiano code (not specified) # from Edk/Foundation/Protocol ConsoleControl 0xf42f7782, 0x12e, 0x4c12, 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21 CustomizedDecompress 0x9a44198e, 0xa4a2, 0x44e6, 0x8a, 0x1f, 0x39, 0xbe, 0xfd, 0xac, 0x89, 0x6f DebugAssert 0xbe499c92, 0x7d4b, 0x11d4, 0xbc, 0xee, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 DebugMask 0x4c8a2451, 0xc207, 0x405b, 0x96, 0x94, 0x99, 0xea, 0x13, 0x25, 0x13, 0x41 DiskInfo 0xd432a67f, 0x14dc, 0x484b, 0xb3, 0xbb, 0x3f, 0x2, 0x91, 0x84, 0x93, 0x27 OEMBadging 0x170e13c0, 0xbf1b, 0x4218, 0x87, 0x1d, 0x2a, 0xbd, 0xc6, 0xf8, 0x87, 0xbc ExtendedSALBootService 0xde0ee9a4,0x3c7a,0x44f2,0xb7,0x8b,0xe3,0xcc,0xd6,0x9c,0x3a,0xf7 # (more extended SAL stuff) FaultTolerantWriteLite 0x3f557189, 0x8dae, 0x45ae, 0xa0, 0xb3, 0x2b, 0x99, 0xca, 0x7a, 0xa7, 0xa0 FirmwareVolumeDispatch 0x7aa35a69, 0x506c, 0x444f, 0xa7, 0xaf, 0x69, 0x4b, 0xf5, 0x6f, 0x71, 0xc8 FVBlockExtension 0x53a4c71b, 0xb581, 0x4170, 0x91, 0xb3, 0x8d, 0xb8, 0x7a, 0x4b, 0x5c, 0x46 GenericMemoryTest 0x309de7f1, 0x7f5e, 0x4ace, 0xb4, 0x9c, 0x53, 0x1b, 0xe5, 0xaa, 0x95, 0xef CRC32GuidedSectionExtraction 0xFC1BCDB0, 0x7D31, 0x49aa, 0x93, 0x6A, 0xA4, 0x60, 0x0D, 0x9D, 0xD0, 0x83 ISA_ACPI 0x64a892dc, 0x5561, 0x4536, 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 ISAIO 0x7ee2bd44, 0x3da0, 0x11d4, 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d LoadPE32Image 0x5cb5c776,0x60d5,0x45ee,0x88,0x3c,0x45,0x27, 0x8,0xcd,0x74,0x3f PCIHotPlugRequest 0x19cb87ab,0x2cb9,0x4665,0x83,0x60,0xdd,0xcf,0x60,0x54,0xf7,0x9d Performance 0xFFECFFFF, 0x923C, 0x14d2, 0x9E, 0x3F, 0x22, 0xA0, 0xC9, 0x69, 0x56, 0x3B PlatformMemTest 0x859ba18, 0x7dd7, 0x4ed7, 0xa8, 0x8e, 0x10, 0x9c, 0x63, 0x91, 0x7b, 0xdd Print 0xdf2d868e, 0x32fc, 0x4cf0, 0x8e, 0x6b, 0xff, 0xd9, 0x5d, 0x13, 0x43, 0xd0 PxeDhcp4 0x03c4e624, 0xac28, 0x11d3, 0x9a, 0x2d, 0x00, 0x90, 0x29, 0x3f, 0xc1, 0x4d PxeDhcp4Callback 0xc1544c01, 0x92a4, 0x4198, 0x8a, 0x84, 0x77, 0x85, 0x83, 0xc2, 0x36, 0x21 SCSIIO 0x403cd195, 0xf233, 0x48ec, 0x84, 0x55, 0xb2, 0xe5, 0x2f, 0x1d, 0x9e, 0x2 SecurityPolicy 0x78E4D245, 0xCD4D, 0x4a05, 0xA2, 0xBA, 0x47, 0x43, 0xE8, 0x6C, 0xFC, 0xAB Tcp 0x02b3d5f2, 0xac28, 0x11d3, 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d TianoDecompress 0xe84cf29c, 0x191f, 0x4eae, 0x96, 0xe1, 0xf4, 0x6a, 0xec, 0xea, 0xea, 0x0b UGASplash 0xa45b3a0d, 0x2e55, 0x4c03, 0xad, 0x9c, 0x27, 0xd4, 0x82, 0xb, 0x50, 0x7e USB_ATAPI 0x2B2F68DA, 0x0CD2, 0x44cf, 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 VariableStore 0xf088cd91, 0xa046, 0x11d2, 0x8e, 0x42, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b VirtualMemoryAccess 0x745d377a, 0xb988, 0x47b2, 0xb1, 0x8f, 0xbb, 0xc8, 0xd, 0xc5, 0x66, 0x98 # from Edk/Foundation/Guid AlternateFVBlock* 0xf496922d, 0x172f, 0x4bbc, 0xa1, 0xeb, 0xe, 0xeb, 0x94, 0x9c, 0x34, 0x86 ConsoleInDevice* 0xd3b36f2b, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d ConsoleOutDevice* 0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d PrimaryConsoleInDevice* 0xe451dcbe, 0x96a1, 0x4729, 0xa5, 0xcf, 0x6b, 0x9c, 0x2c, 0xff, 0x47, 0xfd PrimaryConsoleOutDevice* 0x62bdf38a, 0xe3d5, 0x492c, 0x95, 0xc, 0x23, 0xa7, 0xf6, 0x6e, 0x67, 0x2e PrimaryStandardErrorDevice* 0x5a68191b, 0x9b97, 0x4752, 0x99, 0x46, 0xe3, 0x6a, 0x5d, 0xa9, 0x42, 0xb1 StandardErrorDevice* 0xd3b36f2d, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d # from shell ShellInterface 0x47c7b223, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b ShellEnvInterface 0x47c7b221, 0xc42a, 0x11d2, 0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b ### misc PartType_EFISystem* 0xc12a7328, 0xf81f, 0x11d2, 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b PartType_LegacyMBR* 0x024dee41, 0x33e7, 0x11d3, 0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f refit-0.14/ebounce/0000755000175000017500000000000011363100432013516 5ustar julienjulienrefit-0.14/ebounce/ebounce.c0000644000175000017500000001152410424641257015321 0ustar julienjulien/* * ebounce/ebounce.c * elilo launcher * * Switches to text mode, then launches e.efi or elilo.efi from the same * directory. * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efilib.h" #include "efiConsoleControl.h" EFI_GUID gEfiConsoleControlProtocolGuid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; CHAR16 *FileNames[] = { L"elilo.efi", L"e.efi", NULL }; EFI_STATUS EFIAPI EBounceMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; EFI_CONSOLE_CONTROL_SCREEN_MODE currentMode; EFI_LOADED_IMAGE *SelfLoadedImage; EFI_FILE *RootDir; EFI_FILE *BootFile; EFI_DEVICE_PATH *DevicePath; CHAR16 *DevicePathAsString; CHAR16 DirName[256]; CHAR16 FileName[256]; UINTN i, FileNameIndex; EFI_HANDLE LoaderHandle; InitializeLib(ImageHandle, SystemTable); // switch to text mode if (BS->LocateProtocol(&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl) == EFI_SUCCESS) { ConsoleControl->GetMode(ConsoleControl, ¤tMode, NULL, NULL); if (currentMode == EfiConsoleControlScreenGraphics) ConsoleControl->SetMode(ConsoleControl, EfiConsoleControlScreenText); } /// load elilo.efi or e.efi from the same directory // get loaded image protocol for ourselves if (BS->HandleProtocol(ImageHandle, &LoadedImageProtocol, (VOID*)&SelfLoadedImage) != EFI_SUCCESS) { Print(L"Can not retrieve a LoadedImageProtocol handle for ImageHandle\n"); return EFI_NOT_FOUND; } // open volume RootDir = LibOpenRoot(SelfLoadedImage->DeviceHandle); if (RootDir == NULL) { Print(L"Can't open volume.\n"); return EFI_NOT_FOUND; } // find the current directory DevicePathAsString = DevicePathToStr(SelfLoadedImage->FilePath); if (DevicePathAsString != NULL) { StrCpy(DirName, DevicePathAsString); FreePool(DevicePathAsString); for (i = StrLen(DirName) - 1; i > 0 && DirName[i] != '\\'; i--) ; DirName[i++] = '\\'; DirName[i] = 0; } else { StrCpy(DirName, L"\\"); } for (FileNameIndex = 0; FileNames[FileNameIndex]; FileNameIndex++) { // build full absolute path name StrCpy(FileName, DirName); StrCat(FileName, FileNames[FileNameIndex]); // check for presence of the file if (RootDir->Open(RootDir, &BootFile, FileName, EFI_FILE_MODE_READ, 0) != EFI_SUCCESS) continue; BootFile->Close(BootFile); // make a full device path for the image file DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, FileName); // load the image into memory Status = BS->LoadImage(FALSE, ImageHandle, DevicePath, NULL, 0, &LoaderHandle); FreePool(DevicePath); if (EFI_ERROR(Status)) { Print(L"Can not load the file %s\n", FileName); return Status; } // start it! BS->StartImage(LoaderHandle, NULL, NULL); // just in case we get control back... break; } return EFI_SUCCESS; } refit-0.14/ebounce/ebounce.mak0000644000175000017500000000231010416217376015642 0ustar julienjulien# # ebounce/ebounce.mak # Build control file for the elilo launcher # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = ebounce IMAGE_ENTRY_POINT = EBounceMain # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi . # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/fatglue.py0000755000175000017500000000543011070224636014114 0ustar julienjulien#!/usr/bin/python # # fatglue.py # Create Apple-style fat EFI binaries for x86 + x86_64 # # Copyright (c) 2007-2008 Christoph Pfisterer # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # * Neither the name of Christoph Pfisterer nor the names of the # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # import sys import os.path import struct def read_file(filename): f = open(filename, "rb") data = f.read() f.close() return data def glue(destfile, srcfile1, srcfile2=None): filedata1 = read_file(srcfile1) len_filedata1 = len(filedata1) if srcfile2 and not os.path.exists(srcfile2): print "+++ %s not found, ignoring" % srcfile2 srcfile2 = None if srcfile2: filedata2 = read_file(srcfile2) len_filedata2 = len(filedata2) header = (0x0ef1fab9, 2, 7, 3, 48, len_filedata1, 0, 0x01000007, 3, 48 + len_filedata1, len_filedata2, 0) headerdata = struct.pack("<12I", *header) else: filedata2 = "" header = (0x0ef1fab9, 1, 7, 3, 28, len_filedata1, 0) headerdata = struct.pack("<7I", *header) f = open(destfile, "wb") f.write(headerdata) f.write(filedata1) f.write(filedata2) f.close() def main(args): if len(args) >= 3: glue(args[0], args[1], args[2]) elif len(args) == 2: glue(args[0], args[1]) else: print "Usage: fatglue.py []" return 1 return 0 if __name__ == '__main__': sys.exit(main(sys.argv[1:])) # EOF refit-0.14/fs_ext2/0000755000175000017500000000000011363100432013450 5ustar julienjulienrefit-0.14/fs_ext2/dir.c0000644000175000017500000002363310450042636014410 0ustar julienjulien/* * fs_ext2/dir.c * EFI interface functions for directories * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #include "fs_ext2.h" #define DEBUG_LEVEL 0 // MAX_LINK_COUNT EFI_STATUS Ext2DirReadEntry(IN EXT2_INODE_HANDLE *InodeHandle, OUT struct ext2_dir_entry *DirEntry) { EFI_STATUS Status; UINTN BufferSize; while (1) { // read dir_entry header (fixed length) BufferSize = 8; Status = Ext2InodeHandleRead(InodeHandle, &BufferSize, DirEntry); if (EFI_ERROR(Status)) return Status; if (BufferSize < 8 || DirEntry->rec_len == 0) { // end of directory reached (or invalid entry) DirEntry->inode = 0; return EFI_SUCCESS; } if (DirEntry->rec_len < 8) return EFI_VOLUME_CORRUPTED; if (DirEntry->inode != 0) { // this entry is used if (DirEntry->rec_len < 8 + DirEntry->name_len) return EFI_VOLUME_CORRUPTED; break; } // valid, but unused entry, skip it InodeHandle->CurrentPosition += DirEntry->rec_len - 8; } // read file name (variable length) BufferSize = DirEntry->name_len; Status = Ext2InodeHandleRead(InodeHandle, &BufferSize, DirEntry->name); if (EFI_ERROR(Status)) return Status; if (BufferSize < DirEntry->name_len) return EFI_VOLUME_CORRUPTED; // skip any remaining padding InodeHandle->CurrentPosition += DirEntry->rec_len - (8 + DirEntry->name_len); return EFI_SUCCESS; } // // EFI_FILE Open for directories // EFI_STATUS EFIAPI Ext2DirOpen(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes) { EFI_STATUS Status; EXT2_FILE_DATA *File; EXT2_VOLUME_DATA *Volume; EXT2_INODE *BaseDirInode; EXT2_INODE_HANDLE CurrentInodeHandle; EXT2_INODE_HANDLE NextInodeHandle; struct ext2_dir_entry DirEntry; UINT32 NextInodeNo; CHAR16 *PathElement; CHAR16 *PathElementEnd; CHAR16 *NextPathElement; UINTN PathElementLength, i; BOOLEAN NamesEqual; #if DEBUG_LEVEL Print(L"Ext2DirOpen: '%s'\n", FileName); #endif File = EXT2_FILE_FROM_FILE_HANDLE(This); Volume = File->InodeHandle.Inode->Volume; if (OpenMode != EFI_FILE_MODE_READ) return EFI_WRITE_PROTECTED; // analyze start of path, pick starting point PathElement = FileName; if (*PathElement == '\\') { BaseDirInode = Volume->RootInode; while (*PathElement == '\\') PathElement++; } else BaseDirInode = File->InodeHandle.Inode; // open inode for directory reading Status = Ext2InodeHandleReopen(BaseDirInode, &CurrentInodeHandle); if (EFI_ERROR(Status)) return Status; // loop over the path // loop invariant: CurrentInodeHandle is an open, rewinded handle to the current inode for (; *PathElement != 0; PathElement = NextPathElement) { // parse next path element PathElementEnd = PathElement; while (*PathElementEnd != 0 && *PathElementEnd != '\\') PathElementEnd++; PathElementLength = PathElementEnd - PathElement; NextPathElement = PathElementEnd; while (*NextPathElement == '\\') NextPathElement++; // check that this actually is a directory if (!S_ISDIR(CurrentInodeHandle.Inode->RawInode->i_mode)) { #if DEBUG_LEVEL == 2 Print(L"Ext2DirOpen: NOT FOUND (not a directory)\n"); #endif Status = EFI_NOT_FOUND; goto bailout; } // check for . and .. NextInodeNo = 0; if (PathElementLength == 1 && PathElement[0] == '.') { NextInodeNo = CurrentInodeHandle.Inode->InodeNo; } else if (PathElementLength == 2 && PathElement[0] == '.' && PathElement[1] == '.') { if (CurrentInodeHandle.Inode->ParentDirInode == NULL) { // EFI spec says: there is no parent for the root // NOTE: the EFI shell relies on this! Status = EFI_NOT_FOUND; goto bailout; } NextInodeNo = CurrentInodeHandle.Inode->ParentDirInode->InodeNo; } // scan the directory for the file while (NextInodeNo == 0) { // read next entry Status = Ext2DirReadEntry(&CurrentInodeHandle, &DirEntry); if (EFI_ERROR(Status)) goto bailout; if (DirEntry.inode == 0) { // end of directory reached #if DEBUG_LEVEL == 2 Print(L"Ext2DirOpen: NOT FOUND (no match)\n"); #endif Status = EFI_NOT_FOUND; goto bailout; } // compare name if (DirEntry.name_len == PathElementLength) { NamesEqual = TRUE; for (i = 0; i < DirEntry.name_len; i++) { if (DirEntry.name[i] != PathElement[i]) { NamesEqual = FALSE; break; } } if (NamesEqual) NextInodeNo = DirEntry.inode; } } #if DEBUG_LEVEL == 2 Print(L"Ext2DirOpen: found inode %d\n", NextInodeNo); #endif // open the inode we found in the directory Status = Ext2InodeHandleOpen(Volume, NextInodeNo, CurrentInodeHandle.Inode, &DirEntry, &NextInodeHandle); if (EFI_ERROR(Status)) goto bailout; // TODO: resolve symbolic links somehow // close the previous inode handle and replace it with the new one Status = Ext2InodeHandleClose(&CurrentInodeHandle); CopyMem(&CurrentInodeHandle, &NextInodeHandle, sizeof(EXT2_INODE_HANDLE)); } // wrap the current inode into a file handle Status = Ext2FileFromInodeHandle(&CurrentInodeHandle, NewHandle); if (EFI_ERROR(Status)) return Status; // NOTE: file handle takes ownership of inode handle #if DEBUG_LEVEL == 2 Print(L"Ext2DirOpen: returning\n"); #endif return Status; bailout: Ext2InodeHandleClose(&CurrentInodeHandle); return Status; } // // EFI_FILE Read for directories // EFI_STATUS EFIAPI Ext2DirRead(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EXT2_FILE_DATA *File; EXT2_VOLUME_DATA *Volume; UINT64 SavedPosition; struct ext2_dir_entry DirEntry; EXT2_INODE *EntryInode; EFI_FILE_INFO *FileInfo; UINTN RequiredSize; #if DEBUG_LEVEL Print(L"Ext2DirRead...\n"); #endif File = EXT2_FILE_FROM_FILE_HANDLE(This); Volume = File->InodeHandle.Inode->Volume; // read the next dir_entry SavedPosition = File->InodeHandle.CurrentPosition; while (1) { Status = Ext2DirReadEntry(&File->InodeHandle, &DirEntry); if (EFI_ERROR(Status)) { File->InodeHandle.CurrentPosition = SavedPosition; return Status; } if (DirEntry.inode == 0) { // end of directory reached *BufferSize = 0; #if DEBUG_LEVEL Print(L"...no more entries\n"); #endif return EFI_SUCCESS; } // filter out . and .. if ((DirEntry.name_len == 1 && DirEntry.name[0] == '.') || (DirEntry.name_len == 2 && DirEntry.name[0] == '.' && DirEntry.name[1] == '.')) continue; break; } // open inode for the directory entry Status = Ext2InodeOpen(Volume, DirEntry.inode, File->InodeHandle.Inode, &DirEntry, &EntryInode); if (EFI_ERROR(Status)) return Status; // calculate structure size RequiredSize = SIZE_OF_EFI_FILE_INFO + StrSize(EntryInode->Name); // check buffer size if (*BufferSize < RequiredSize) { // push the entry back for now Ext2InodeClose(EntryInode); File->InodeHandle.CurrentPosition = SavedPosition; #if DEBUG_LEVEL Print(L"...BUFFER TOO SMALL\n"); #endif *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure ZeroMem(Buffer, RequiredSize); FileInfo = (EFI_FILE_INFO *)Buffer; FileInfo->Size = RequiredSize; Ext2InodeFillFileInfo(EntryInode, FileInfo); StrCpy(FileInfo->FileName, EntryInode->Name); Ext2InodeClose(EntryInode); // prepare for return *BufferSize = RequiredSize; #if DEBUG_LEVEL Print(L"...found '%s'\n", FileInfo->FileName); #endif return EFI_SUCCESS; } // // EFI_FILE SetPosition for directories // EFI_STATUS EFIAPI Ext2DirSetPosition(IN EFI_FILE *This, IN UINT64 Position) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (Position == 0) { File->InodeHandle.CurrentPosition = 0; return EFI_SUCCESS; } else { // directories can only rewind to the start return EFI_UNSUPPORTED; } } // // EFI_FILE GetPosition for directories // EFI_STATUS EFIAPI Ext2DirGetPosition(IN EFI_FILE *This, OUT UINT64 *Position) { // not defined for directories return EFI_UNSUPPORTED; } refit-0.14/fs_ext2/ext2_disk.h0000644000175000017500000003753610451150430015533 0ustar julienjulien/* * fs_ext2/ext2_disk.h * On-disk structures for ext2 * * Copyright (c) 2006 Christoph Pfisterer * Portions Copyright (c) 1991-2006 by various Linux kernel contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #ifndef _EXT2_DISK_H_ #define _EXT2_DISK_H_ // types, reuse EFI types typedef INT8 __s8; typedef UINT8 __u8; typedef INT16 __s16; typedef UINT16 __u16; typedef INT32 __s32; typedef UINT32 __u32; typedef INT64 __s64; typedef UINT64 __u64; typedef __u16 __le16; typedef __u32 __le32; typedef __u64 __le64; // // from Linux kernel, include/linux/fs.h // // base block size #define BLOCK_SIZE_BITS 10 #define BLOCK_SIZE (1<s_log_block_size) #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) #define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) #define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ EXT2_GOOD_OLD_INODE_SIZE : \ (s)->s_inode_size) #define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ EXT2_GOOD_OLD_FIRST_INO : \ (s)->s_first_ino) /* * Structure of a blocks group descriptor */ struct ext2_group_desc { __le32 bg_block_bitmap; /* Blocks bitmap block */ __le32 bg_inode_bitmap; /* Inodes bitmap block */ __le32 bg_inode_table; /* Inodes table block */ __le16 bg_free_blocks_count; /* Free blocks count */ __le16 bg_free_inodes_count; /* Free inodes count */ __le16 bg_used_dirs_count; /* Directories count */ __le16 bg_pad; __le32 bg_reserved[3]; }; /* * Macro-instructions used to manage group descriptors */ #define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) #define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) #define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) /* * Constants relative to the data blocks */ #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) /* * Inode flags */ #define EXT2_SECRM_FL 0x00000001 /* Secure deletion */ #define EXT2_UNRM_FL 0x00000002 /* Undelete */ #define EXT2_COMPR_FL 0x00000004 /* Compress file */ #define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */ #define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */ #define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */ #define EXT2_NODUMP_FL 0x00000040 /* do not dump file */ #define EXT2_NOATIME_FL 0x00000080 /* do not update atime */ /* Reserved for compression usage... */ #define EXT2_DIRTY_FL 0x00000100 #define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ #define EXT2_NOCOMP_FL 0x00000400 /* Don't compress */ #define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ /* End compression flags --- maybe not all used */ #define EXT2_BTREE_FL 0x00001000 /* btree format dir */ #define EXT2_INDEX_FL 0x00001000 /* hash-indexed directory */ #define EXT2_IMAGIC_FL 0x00002000 /* AFS directory */ #define EXT2_JOURNAL_DATA_FL 0x00004000 /* Reserved for ext3 */ #define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */ #define EXT2_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ #define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ #define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ #define EXT2_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ #define EXT2_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ /* * Structure of an inode on the disk */ struct ext2_inode { __le16 i_mode; /* 0: File mode */ __le16 i_uid; /* 2: Low 16 bits of Owner Uid */ __le32 i_size; /* 4: Size in bytes */ __le32 i_atime; /* 8: Access time */ __le32 i_ctime; /* 12: Creation time */ __le32 i_mtime; /* 16: Modification time */ __le32 i_dtime; /* 20: Deletion Time */ __le16 i_gid; /* 24: Low 16 bits of Group Id */ __le16 i_links_count; /* 26: Links count */ __le32 i_blocks; /* 28: Blocks count */ __le32 i_flags; /* 32: File flags */ union { struct { __le32 l_i_reserved1; } linux1; struct { __le32 h_i_translator; } hurd1; struct { __le32 m_i_reserved1; } masix1; } osd1; /* 36: OS dependent 1 */ __le32 i_block[EXT2_N_BLOCKS];/* 40: Pointers to blocks */ __le32 i_generation; /* 100: File version (for NFS) */ __le32 i_file_acl; /* 104: File ACL */ __le32 i_dir_acl; /* 108: Directory ACL */ __le32 i_faddr; /* 112: Fragment address */ union { struct { __u8 l_i_frag; /* 116: Fragment number */ __u8 l_i_fsize; /* 117: Fragment size */ __u16 i_pad1; __le16 l_i_uid_high; /* 120: these 2 fields */ __le16 l_i_gid_high; /* 122: were reserved2[0] */ __u32 l_i_reserved2; } linux2; struct { __u8 h_i_frag; /* Fragment number */ __u8 h_i_fsize; /* Fragment size */ __le16 h_i_mode_high; __le16 h_i_uid_high; __le16 h_i_gid_high; __le32 h_i_author; } hurd2; struct { __u8 m_i_frag; /* Fragment number */ __u8 m_i_fsize; /* Fragment size */ __u16 m_pad1; __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ }; #define i_size_high i_dir_acl /* * Structure of the super block */ struct ext2_super_block { __le32 s_inodes_count; /* Inodes count */ __le32 s_blocks_count; /* Blocks count */ __le32 s_r_blocks_count; /* Reserved blocks count */ __le32 s_free_blocks_count; /* Free blocks count */ __le32 s_free_inodes_count; /* Free inodes count */ __le32 s_first_data_block; /* First Data Block */ __le32 s_log_block_size; /* Block size */ __le32 s_log_frag_size; /* Fragment size */ __le32 s_blocks_per_group; /* # Blocks per group */ __le32 s_frags_per_group; /* # Fragments per group */ __le32 s_inodes_per_group; /* # Inodes per group */ __le32 s_mtime; /* Mount time */ __le32 s_wtime; /* Write time */ __le16 s_mnt_count; /* Mount count */ __le16 s_max_mnt_count; /* Maximal mount count */ __le16 s_magic; /* Magic signature */ __le16 s_state; /* File system state */ __le16 s_errors; /* Behaviour when detecting errors */ __le16 s_minor_rev_level; /* minor revision level */ __le32 s_lastcheck; /* time of last check */ __le32 s_checkinterval; /* max. time between checks */ __le32 s_creator_os; /* OS */ __le32 s_rev_level; /* Revision level */ __le16 s_def_resuid; /* Default uid for reserved blocks */ __le16 s_def_resgid; /* Default gid for reserved blocks */ /* * These fields are for EXT2_DYNAMIC_REV superblocks only. * * Note: the difference between the compatible feature set and * the incompatible feature set is that if there is a bit set * in the incompatible feature set that the kernel doesn't * know about, it should refuse to mount the filesystem. * * e2fsck's requirements are more strict; if it doesn't know * about a feature in either the compatible or incompatible * feature set, it must abort and not try to meddle with * things it doesn't understand... */ __le32 s_first_ino; /* First non-reserved inode */ __le16 s_inode_size; /* size of inode structure */ __le16 s_block_group_nr; /* block group # of this superblock */ __le32 s_feature_compat; /* compatible feature set */ __le32 s_feature_incompat; /* incompatible feature set */ __le32 s_feature_ro_compat; /* readonly-compatible feature set */ __u8 s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ __le32 s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only * happen if the EXT2_COMPAT_PREALLOC flag is on. */ __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ __u16 s_padding1; /* * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set. */ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ __u32 s_journal_inum; /* inode number of journal file */ __u32 s_journal_dev; /* device number of journal file */ __u32 s_last_orphan; /* start of list of inodes to delete */ __u32 s_hash_seed[4]; /* HTREE hash seed */ __u8 s_def_hash_version; /* Default hash version to use */ __u8 s_reserved_char_pad; __u16 s_reserved_word_pad; __le32 s_default_mount_opts; __le32 s_first_meta_bg; /* First metablock block group */ __u32 s_reserved[190]; /* Padding to the end of the block */ }; /* * Revision levels */ #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV #define EXT2_GOOD_OLD_INODE_SIZE 128 /* * Feature set definitions */ #define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) ) #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) #define EXT2_SET_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask) #define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask) #define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask) #define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask) #define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask) #define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask) #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008 #define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010 #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020 #define EXT2_FEATURE_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 #define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff /* #define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \ EXT2_FEATURE_INCOMPAT_META_BG) #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT2_FEATURE_RO_COMPAT_BTREE_DIR) #define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP #define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP */ /* * Structure of a directory entry */ #define EXT2_NAME_LEN 255 struct ext2_dir_entry { __le32 inode; /* Inode number */ __le16 rec_len; /* Directory entry length */ __u8 name_len; /* Name length */ __u8 file_type; char name[EXT2_NAME_LEN]; /* File name */ }; // NOTE: The original Linux kernel header defines ext2_dir_entry with the original // layout and ext2_dir_entry_2 with the revised layout. We simply use the revised one. /* * Ext2 directory file types. Only the low 3 bits are used. The * other bits are reserved for now. */ enum { EXT2_FT_UNKNOWN, EXT2_FT_REG_FILE, EXT2_FT_DIR, EXT2_FT_CHRDEV, EXT2_FT_BLKDEV, EXT2_FT_FIFO, EXT2_FT_SOCK, EXT2_FT_SYMLINK, EXT2_FT_MAX }; // // from Linux kernel, include/linux/stat.h // #define S_IFMT 00170000 #define S_IFSOCK 0140000 #define S_IFLNK 0120000 #define S_IFREG 0100000 #define S_IFBLK 0060000 #define S_IFDIR 0040000 #define S_IFCHR 0020000 #define S_IFIFO 0010000 #define S_ISUID 0004000 #define S_ISGID 0002000 #define S_ISVTX 0001000 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) #define S_IRWXU 00700 #define S_IRUSR 00400 #define S_IWUSR 00200 #define S_IXUSR 00100 #define S_IRWXG 00070 #define S_IRGRP 00040 #define S_IWGRP 00020 #define S_IXGRP 00010 #define S_IRWXO 00007 #define S_IROTH 00004 #define S_IWOTH 00002 #define S_IXOTH 00001 #endif refit-0.14/fs_ext2/file.c0000644000175000017500000003115610450144163014546 0ustar julienjulien/* * fs_ext2/file.c * EFI interface functions for files * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #include "fs_ext2.h" #define DEBUG_LEVEL 0 #define USE_DISPATCHERS 1 EFI_GUID gEfiFileInfoGuid = EFI_FILE_INFO_ID; EFI_GUID gEfiFileSystemInfoGuid = EFI_FILE_SYSTEM_INFO_ID; EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid = EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID; // // dispatching interface functions // #if USE_DISPATCHERS EFI_STATUS EFIAPI Ext2HandleOpen(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (File->Kind == EXT2_FILE_KIND_FILE) return Ext2FileOpen(This, NewHandle, FileName, OpenMode, Attributes); else if (File->Kind == EXT2_FILE_KIND_DIR) return Ext2DirOpen(This, NewHandle, FileName, OpenMode, Attributes); return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI Ext2HandleRead(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (File->Kind == EXT2_FILE_KIND_FILE) return Ext2FileRead(This, BufferSize, Buffer); else if (File->Kind == EXT2_FILE_KIND_DIR) return Ext2DirRead(This, BufferSize, Buffer); return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI Ext2HandleSetPosition(IN EFI_FILE *This, IN UINT64 Position) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (File->Kind == EXT2_FILE_KIND_FILE) return Ext2FileSetPosition(This, Position); else if (File->Kind == EXT2_FILE_KIND_DIR) return Ext2DirSetPosition(This, Position); return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI Ext2HandleGetPosition(IN EFI_FILE *This, OUT UINT64 *Position) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (File->Kind == EXT2_FILE_KIND_FILE) return Ext2FileGetPosition(This, Position); else if (File->Kind == EXT2_FILE_KIND_DIR) return Ext2DirGetPosition(This, Position); return EFI_UNSUPPORTED; } #endif // USE_DISPATCHERS // // wrap an open inode handle in a file object // EFI_STATUS Ext2FileFromInodeHandle(IN EXT2_INODE_HANDLE *InodeHandle, OUT EFI_FILE **NewFileHandle) { EFI_STATUS Status; EXT2_FILE_DATA *File; // allocate file structure File = AllocateZeroPool(sizeof(EXT2_FILE_DATA)); File->Signature = EXT2_FILE_DATA_SIGNATURE; // move the inode handle (the new object takes ownership) CopyMem(&File->InodeHandle, InodeHandle, sizeof(EXT2_INODE_HANDLE)); // check the type if (S_ISREG(File->InodeHandle.Inode->RawInode->i_mode)) { // regular file File->Kind = EXT2_FILE_KIND_FILE; File->FileHandle.Revision = EFI_FILE_HANDLE_REVISION; File->FileHandle.Open = Ext2FileOpen; File->FileHandle.Close = Ext2FileClose; File->FileHandle.Delete = Ext2FileDelete; File->FileHandle.Read = Ext2FileRead; File->FileHandle.Write = Ext2FileWrite; File->FileHandle.GetPosition = Ext2FileGetPosition; File->FileHandle.SetPosition = Ext2FileSetPosition; File->FileHandle.GetInfo = Ext2FileGetInfo; File->FileHandle.SetInfo = Ext2FileSetInfo; File->FileHandle.Flush = Ext2FileFlush; Status = EFI_SUCCESS; } else if (S_ISDIR(File->InodeHandle.Inode->RawInode->i_mode)) { // directory File->Kind = EXT2_FILE_KIND_DIR; File->FileHandle.Revision = EFI_FILE_HANDLE_REVISION; File->FileHandle.Open = Ext2DirOpen; File->FileHandle.Close = Ext2FileClose; File->FileHandle.Delete = Ext2FileDelete; File->FileHandle.Read = Ext2DirRead; File->FileHandle.Write = Ext2FileWrite; File->FileHandle.GetPosition = Ext2DirGetPosition; File->FileHandle.SetPosition = Ext2DirSetPosition; File->FileHandle.GetInfo = Ext2FileGetInfo; File->FileHandle.SetInfo = Ext2FileSetInfo; File->FileHandle.Flush = Ext2FileFlush; Status = EFI_SUCCESS; } else if (S_ISLNK(File->InodeHandle.Inode->RawInode->i_mode)) { // symbolic link Status = EFI_UNSUPPORTED; // TODO: read the target, look it up, recurse } else { // some kind of special file Status = EFI_UNSUPPORTED; } if (EFI_ERROR(Status)) { Ext2InodeHandleClose(&File->InodeHandle); FreePool(File); return Status; } #if USE_DISPATCHERS File->FileHandle.Open = Ext2HandleOpen; File->FileHandle.Read = Ext2HandleRead; File->FileHandle.GetPosition = Ext2HandleGetPosition; File->FileHandle.SetPosition = Ext2HandleSetPosition; #endif *NewFileHandle = &File->FileHandle; return EFI_SUCCESS; } // // EFI_FILE Open for files // EFI_STATUS EFIAPI Ext2FileOpen(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes) { // only supported for directories... return EFI_UNSUPPORTED; } // // EFI_FILE Close for files // EFI_STATUS EFIAPI Ext2FileClose(IN EFI_FILE *This) { EXT2_FILE_DATA *File; #if DEBUG_LEVEL Print(L"Ext2FileClose\n"); #endif File = EXT2_FILE_FROM_FILE_HANDLE(This); Ext2InodeHandleClose(&File->InodeHandle); FreePool(File); return EFI_SUCCESS; } // // EFI_FILE Delete for files and directories // EFI_STATUS EFIAPI Ext2FileDelete(IN EFI_FILE *This) { EFI_STATUS Status; Status = This->Close(This); // use the appropriate close method if (Status == EFI_SUCCESS) { // this driver is read-only Status = EFI_WARN_DELETE_FAILURE; } return Status; } // // EFI_FILE Read for files // EFI_STATUS EFIAPI Ext2FileRead(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EXT2_FILE_DATA *File; #if DEBUG_LEVEL Print(L"Ext2FileRead %d bytes\n", *BufferSize); #endif File = EXT2_FILE_FROM_FILE_HANDLE(This); Status = Ext2InodeHandleRead(&File->InodeHandle, BufferSize, Buffer); return Status; } // // EFI_FILE Write for files and directories // EFI_STATUS EFIAPI Ext2FileWrite(IN EFI_FILE *This, IN OUT UINTN *BufferSize, IN VOID *Buffer) { // this driver is read-only return EFI_WRITE_PROTECTED; } // // EFI_FILE SetPosition for files // EFI_STATUS EFIAPI Ext2FileSetPosition(IN EFI_FILE *This, IN UINT64 Position) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); if (Position == 0xFFFFFFFFFFFFFFFFULL) File->InodeHandle.CurrentPosition = File->InodeHandle.Inode->FileSize; else File->InodeHandle.CurrentPosition = Position; return EFI_SUCCESS; } // // EFI_FILE GetPosition for files // EFI_STATUS EFIAPI Ext2FileGetPosition(IN EFI_FILE *This, OUT UINT64 *Position) { EXT2_FILE_DATA *File; File = EXT2_FILE_FROM_FILE_HANDLE(This); *Position = File->InodeHandle.CurrentPosition; return EFI_SUCCESS; } // // EFI_FILE GetInfo for files and directories // EFI_STATUS EFIAPI Ext2FileGetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EXT2_FILE_DATA *File; EXT2_VOLUME_DATA *Volume; EFI_FILE_INFO *FileInfo; EFI_FILE_SYSTEM_INFO *FSInfo; CHAR8 *NamePtr; CHAR16 *DestNamePtr; UINTN i, RequiredSize; File = EXT2_FILE_FROM_FILE_HANDLE(This); Volume = File->InodeHandle.Inode->Volume; if (CompareGuid(InformationType, &gEfiFileInfoGuid) == 0) { #if DEBUG_LEVEL Print(L"Ext2FileGetInfo: FILE_INFO\n"); #endif RequiredSize = SIZE_OF_EFI_FILE_INFO + StrSize(File->InodeHandle.Inode->Name); // check buffer size if (*BufferSize < RequiredSize) { *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure FileInfo = (EFI_FILE_INFO *)Buffer; FileInfo->Size = RequiredSize; Ext2InodeFillFileInfo(File->InodeHandle.Inode, FileInfo); StrCpy(FileInfo->FileName, File->InodeHandle.Inode->Name); // prepare for return *BufferSize = RequiredSize; Status = EFI_SUCCESS; #if DEBUG_LEVEL Print(L"...returning '%s'\n", FileInfo->FileName); #endif } else if (CompareGuid(InformationType, &gEfiFileSystemInfoGuid) == 0) { #if DEBUG_LEVEL Print(L"Ext2FileGetInfo: FILE_SYSTEM_INFO\n"); #endif // TODO: store volume label in volume structure, readily converted // get volume label size, derive structure size NamePtr = (CHAR8 *)(Volume->SuperBlock) + 120; for (i = 0; i < 16; i++) if (NamePtr[i] == 0) break; RequiredSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + (i + 1) * sizeof(CHAR16); // check buffer size if (*BufferSize < RequiredSize) { *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure FSInfo = (EFI_FILE_SYSTEM_INFO *)Buffer; FSInfo->Size = RequiredSize; FSInfo->ReadOnly = TRUE; FSInfo->VolumeSize = (UINT64)Volume->SuperBlock->s_blocks_count * Volume->BlockSize; FSInfo->FreeSpace = (UINT64)Volume->SuperBlock->s_free_blocks_count * Volume->BlockSize; FSInfo->BlockSize = Volume->BlockSize; // copy volume label DestNamePtr = FSInfo->VolumeLabel; for (i = 0; i < 16; i++) { if (NamePtr[i] == 0) break; DestNamePtr[i] = NamePtr[i]; } DestNamePtr[i] = 0; // prepare for return *BufferSize = RequiredSize; Status = EFI_SUCCESS; } else if (CompareGuid(InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid) == 0) { #if DEBUG_LEVEL Print(L"Ext2FileGetInfo: FILE_SYSTEM_VOLUME_LABEL\n"); #endif // get volume label size, derive structure size NamePtr = (CHAR8 *)(Volume->SuperBlock) + 120; for (i = 0; i < 16; i++) if (NamePtr[i] == 0) break; RequiredSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + (i + 1) * sizeof(CHAR16); // check buffer size if (*BufferSize < RequiredSize) { *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // copy volume label DestNamePtr = ((EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *)Buffer)->VolumeLabel; for (i = 0; i < 16; i++) { if (NamePtr[i] == 0) break; DestNamePtr[i] = NamePtr[i]; } DestNamePtr[i] = 0; // prepare for return *BufferSize = RequiredSize; Status = EFI_SUCCESS; } else { Status = EFI_UNSUPPORTED; } return Status; } // // EFI_FILE SetInfo for files and directories // EFI_STATUS EFIAPI Ext2FileSetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer) { // this driver is read-only return EFI_WRITE_PROTECTED; } // // EFI_FILE Flush for files and directories // EFI_STATUS EFIAPI Ext2FileFlush(IN EFI_FILE *This) { // this driver is read-only return EFI_WRITE_PROTECTED; } refit-0.14/fs_ext2/fs_ext2.c0000644000175000017500000002715110450326723015205 0ustar julienjulien/* * fs_ext2/fs_ext2.c * Entry point and main EFI interface functions * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #include "fs_ext2.h" #define DEBUG_LEVEL 0 // functions EFI_STATUS EFIAPI Ext2DriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath); EFI_STATUS EFIAPI Ext2DriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath); EFI_STATUS EFIAPI Ext2DriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer); EFI_STATUS EFIAPI Ext2ComponentNameGetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName); EFI_STATUS EFIAPI Ext2ComponentNameGetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName); // interface structures EFI_DRIVER_BINDING_PROTOCOL gExt2DriverBinding = { Ext2DriverBindingSupported, Ext2DriverBindingStart, Ext2DriverBindingStop, 0x10, NULL, NULL }; EFI_COMPONENT_NAME_PROTOCOL gExt2ComponentName = { Ext2ComponentNameGetDriverName, Ext2ComponentNameGetControllerName, "eng" }; // // Ext2EntryPoint: Image entry point // // Installs the Driver Binding and Component Name protocols on the image's handle. // Mounting a file system is initiated through Driver Binding at the firmware's // request. // EFI_DRIVER_ENTRY_POINT (Ext2EntryPoint) EFI_STATUS EFIAPI Ext2EntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; InitializeLib(ImageHandle, SystemTable); // complete Driver Binding protocol instance gExt2DriverBinding.ImageHandle = ImageHandle; gExt2DriverBinding.DriverBindingHandle = ImageHandle; // install Driver Binding protocol Status = BS->InstallProtocolInterface(&gExt2DriverBinding.DriverBindingHandle, &DriverBindingProtocol, EFI_NATIVE_INTERFACE, &gExt2DriverBinding); if (EFI_ERROR (Status)) { return Status; } // install Component Name protocol Status = BS->InstallProtocolInterface(&gExt2DriverBinding.DriverBindingHandle, &ComponentNameProtocol, EFI_NATIVE_INTERFACE, &gExt2ComponentName); if (EFI_ERROR (Status)) { return Status; } return EFI_SUCCESS; } // // Driver Binding protocol interface functions // // Ext2DriverBindingSupported: Check if a "controller" is supported by this driver // EFI_STATUS EFIAPI Ext2DriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) { EFI_STATUS Status; EFI_DISK_IO *DiskIo; // we check for both DiskIO and BlockIO protocols // first, open DiskIO Status = BS->OpenProtocol(ControllerHandle, &DiskIoProtocol, (VOID **) &DiskIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER); if (EFI_ERROR(Status)) return Status; // we were just checking, close it again BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); // next, check BlockIO without actually opening it Status = BS->OpenProtocol(ControllerHandle, &BlockIoProtocol, NULL, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL); return Status; } // // Ext2DriverBindingStart: Start this driver on the given "controller" // EFI_STATUS EFIAPI Ext2DriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) { EFI_STATUS Status; EFI_BLOCK_IO *BlockIo; EFI_DISK_IO *DiskIo; EXT2_VOLUME_DATA *Volume; #if DEBUG_LEVEL Print(L"Ext2DriverBindingStart\n"); #endif // open consumed protocols Status = BS->OpenProtocol(ControllerHandle, &BlockIoProtocol, (VOID **) &BlockIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL); // NOTE: we only want to look at the MediaId if (EFI_ERROR(Status)) { Print(L"Ext2 ERROR: OpenProtocol(BlockIo) returned %x\n", Status); return Status; } Status = BS->OpenProtocol(ControllerHandle, &DiskIoProtocol, (VOID **) &DiskIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER); if (EFI_ERROR(Status)) { Print(L"Ext2 ERROR: OpenProtocol(DiskIo) returned %x\n", Status); return Status; } // allocate volume structure Volume = AllocateZeroPool(sizeof(EXT2_VOLUME_DATA)); Volume->Signature = EXT2_VOLUME_DATA_SIGNATURE; Volume->Handle = ControllerHandle; Volume->DiskIo = DiskIo; Volume->MediaId = BlockIo->Media->MediaId; // read the superblock Status = Ext2ReadSuper(Volume); if (!EFI_ERROR(Status)) { // register the SimpleFileSystem protocol Status = BS->InstallMultipleProtocolInterfaces(&ControllerHandle, &FileSystemProtocol, &Volume->FileSystem, NULL); if (EFI_ERROR(Status)) Print(L"Ext2 ERROR: InstallMultipleProtocolInterfaces returned %x\n", Status); } // on errors, close the opened protocols if (EFI_ERROR(Status)) { if (Volume->BlockBuffer != NULL) FreePool(Volume->BlockBuffer); if (Volume->SuperBlock != NULL) FreePool(Volume->SuperBlock); FreePool(Volume); BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); } return Status; } // // Ext2DriverBindingStop: Stop this driver on the given "controller" // EFI_STATUS EFIAPI Ext2DriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer) { EFI_STATUS Status; EFI_FILE_IO_INTERFACE *FileSystem; EXT2_VOLUME_DATA *Volume; #if DEBUG_LEVEL Print(L"Ext2DriverBindingStop\n"); #endif // get the installed SimpleFileSystem interface Status = BS->OpenProtocol(ControllerHandle, &FileSystemProtocol, (VOID **) &FileSystem, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) return EFI_UNSUPPORTED; // get private data structure Volume = EXT2_VOLUME_FROM_FILE_SYSTEM(FileSystem); // uninstall Simple File System protocol Status = BS->UninstallMultipleProtocolInterfaces(ControllerHandle, &FileSystemProtocol, &Volume->FileSystem, NULL); if (EFI_ERROR(Status)) { Print(L"Ext2 ERROR: UninstallMultipleProtocolInterfaces returned %x\n", Status); return Status; } #if DEBUG_LEVEL Print(L"Ext2DriverBindingStop: protocol uninstalled successfully\n"); #endif // release private data structure if (Volume->RootInode != NULL) Ext2InodeClose(Volume->RootInode); // TODO: can we be called with other inodes still open??? if (Volume->DirInodeList != NULL) Print(L"Ext2 WARNING: Driver stopped while files are open!\n"); if (Volume->BlockBuffer != NULL) FreePool(Volume->BlockBuffer); FreePool(Volume->SuperBlock); FreePool(Volume); // close the consumed protocols Status = BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); return Status; } // // Component Name protocol interface functions // EFI_STATUS EFIAPI Ext2ComponentNameGetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName) { if (Language == NULL || DriverName == NULL) return EFI_INVALID_PARAMETER; if (Language[0] == 'e' && Language[1] == 'n' && Language[2] == 'g' && Language[3] == 0) { *DriverName = L"Ext2 File System Driver"; return EFI_SUCCESS; } return EFI_UNSUPPORTED; } EFI_STATUS EFIAPI Ext2ComponentNameGetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName) { return EFI_UNSUPPORTED; } refit-0.14/fs_ext2/fs_ext2.h0000644000175000017500000001401710450326723015207 0ustar julienjulien/* * fs_ext2/fs_ext2.h * Global header for the ext2 driver * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #ifndef _FS_EXT2_H_ #define _FS_EXT2_H_ #include #include #include "ext2_disk.h" #define INVALID_BLOCK_NO (0xffffffffUL) // // private data structures // #define EXT2_VOLUME_DATA_SIGNATURE EFI_SIGNATURE_32 ('e', 'x', '2', 'V') #define EXT2_FILE_DATA_SIGNATURE EFI_SIGNATURE_32 ('e', 'x', '2', 'F') struct fs_ext2_inode; typedef struct { UINT64 Signature; EFI_FILE_IO_INTERFACE FileSystem; EFI_HANDLE Handle; EFI_DISK_IO *DiskIo; UINT32 MediaId; struct ext2_super_block *SuperBlock; UINT32 BlockSize; UINT32 IndBlockCount; UINT32 DIndBlockCount; UINT32 InodeSize; struct fs_ext2_inode *RootInode; struct fs_ext2_inode *DirInodeList; UINT32 BlockInBuffer; UINT8 *BlockBuffer; } EXT2_VOLUME_DATA; #define EXT2_VOLUME_FROM_FILE_SYSTEM(a) CR (a, EXT2_VOLUME_DATA, FileSystem, EXT2_VOLUME_DATA_SIGNATURE) typedef struct fs_ext2_inode { EXT2_VOLUME_DATA *Volume; UINT32 InodeNo; UINT32 RefCount; struct fs_ext2_inode *ParentDirInode; CHAR16 *Name; struct ext2_inode *RawInode; UINT64 FileSize; struct fs_ext2_inode *Next; struct fs_ext2_inode *Prev; } EXT2_INODE; typedef struct { EXT2_INODE *Inode; UINT64 CurrentPosition; UINT32 CurrentFileBlockNo; UINT32 CurrentVolBlockNo; } EXT2_INODE_HANDLE; typedef struct { UINT64 Signature; EFI_FILE FileHandle; EXT2_INODE_HANDLE InodeHandle; UINTN Kind; } EXT2_FILE_DATA; #define EXT2_FILE_KIND_FILE (0) #define EXT2_FILE_KIND_DIR (1) #define EXT2_FILE_FROM_FILE_HANDLE(a) CR (a, EXT2_FILE_DATA, FileHandle, EXT2_FILE_DATA_SIGNATURE) // // private functions // EFI_STATUS Ext2ReadSuper(IN EXT2_VOLUME_DATA *Volume); EFI_STATUS Ext2ReadBlock(IN EXT2_VOLUME_DATA *Volume, IN UINT32 BlockNo); EFI_STATUS Ext2InodeOpen(IN EXT2_VOLUME_DATA *Volume, IN UINT32 InodeNo, IN EXT2_INODE *ParentDirInode OPTIONAL, IN struct ext2_dir_entry *DirEntry OPTIONAL, OUT EXT2_INODE **NewInode); EFI_STATUS Ext2InodeClose(IN EXT2_INODE *Inode); VOID Ext2InodeFillFileInfo(IN EXT2_INODE *Inode, OUT EFI_FILE_INFO *FileInfo); EFI_STATUS Ext2InodeHandleOpen(IN EXT2_VOLUME_DATA *Volume, IN UINT32 InodeNo, IN EXT2_INODE *ParentDirInode OPTIONAL, IN struct ext2_dir_entry *DirEntry OPTIONAL, OUT EXT2_INODE_HANDLE *InodeHandle); EFI_STATUS Ext2InodeHandleReopen(IN EXT2_INODE *Inode, OUT EXT2_INODE_HANDLE *InodeHandle); EFI_STATUS Ext2InodeHandleClose(IN EXT2_INODE_HANDLE *InodeHandle); EFI_STATUS Ext2InodeHandleRead(IN EXT2_INODE_HANDLE *InodeHandle, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS Ext2FileFromInodeHandle(IN EXT2_INODE_HANDLE *InodeHandle, OUT EFI_FILE **NewFileHandle); EFI_STATUS EFIAPI Ext2FileOpen(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes); EFI_STATUS EFIAPI Ext2FileClose(IN EFI_FILE *This); EFI_STATUS EFIAPI Ext2FileDelete(IN EFI_FILE *This); EFI_STATUS EFIAPI Ext2FileRead(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS EFIAPI Ext2FileWrite(IN EFI_FILE *This, IN OUT UINTN *BufferSize, IN VOID *Buffer); EFI_STATUS EFIAPI Ext2FileSetPosition(IN EFI_FILE *This, IN UINT64 Position); EFI_STATUS EFIAPI Ext2FileGetPosition(IN EFI_FILE *This, OUT UINT64 *Position); EFI_STATUS EFIAPI Ext2FileGetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS EFIAPI Ext2FileSetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer); EFI_STATUS EFIAPI Ext2FileFlush(IN EFI_FILE *This); EFI_STATUS EFIAPI Ext2DirOpen(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes); EFI_STATUS EFIAPI Ext2DirRead(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS EFIAPI Ext2DirSetPosition(IN EFI_FILE *This, IN UINT64 Position); EFI_STATUS EFIAPI Ext2DirGetPosition(IN EFI_FILE *This, OUT UINT64 *Position); #endif refit-0.14/fs_ext2/fs_ext2.mak0000644000175000017500000000305210452421777015534 0ustar julienjulien# # fs_ext2/fs_ext2.mak # Build control file for the ext2 file system driver # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = fs_ext2 IMAGE_ENTRY_POINT = Ext2EntryPoint # # Globals needed by master.mak # TARGET_BS_DRIVER = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi . # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\fs_ext2.obj \ $(BUILD_DIR)\super.obj \ $(BUILD_DIR)\inode.obj \ $(BUILD_DIR)\file.obj \ $(BUILD_DIR)\dir.obj \ # # Source file dependencies # $(BUILD_DIR)\fs_ext2.obj : $(*B).c $(INC_DEPS) fs_ext2.h $(BUILD_DIR)\super.obj : $(*B).c $(INC_DEPS) fs_ext2.h $(BUILD_DIR)\inode.obj : $(*B).c $(INC_DEPS) fs_ext2.h $(BUILD_DIR)\file.obj : $(*B).c $(INC_DEPS) fs_ext2.h $(BUILD_DIR)\dir.obj : $(*B).c $(INC_DEPS) fs_ext2.h # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/fs_ext2/inode.c0000644000175000017500000003361410451426053014730 0ustar julienjulien/* * fs_ext2/inode.c * Shared functions for inode handling * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #include "fs_ext2.h" #define DEBUG_LEVEL 0 // // time conversion // // Adopted from public domain code in FreeBSD libc. // #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) #define MONSPERYEAR 12 #define EPOCH_YEAR 1970 #define EPOCH_WDAY TM_THURSDAY #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) #define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) static const int mon_lengths[2][MONSPERYEAR] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; static const int year_lengths[2] = { DAYSPERNYEAR, DAYSPERLYEAR }; VOID Ext2DecodeTime(OUT EFI_TIME *EfiTime, IN UINT32 UnixTime) { long days, rem; int y, newy, yleap; const int *ip; ZeroMem(EfiTime, sizeof(EFI_TIME)); days = UnixTime / SECSPERDAY; rem = UnixTime % SECSPERDAY; EfiTime->Hour = (int) (rem / SECSPERHOUR); rem = rem % SECSPERHOUR; EfiTime->Minute = (int) (rem / SECSPERMIN); EfiTime->Second = (int) (rem % SECSPERMIN); y = EPOCH_YEAR; while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) { newy = y + days / DAYSPERNYEAR; if (days < 0) --newy; days -= (newy - y) * DAYSPERNYEAR + LEAPS_THRU_END_OF(newy - 1) - LEAPS_THRU_END_OF(y - 1); y = newy; } EfiTime->Year = y; ip = mon_lengths[yleap]; for (EfiTime->Month = 0; days >= (long) ip[EfiTime->Month]; ++(EfiTime->Month)) days = days - (long) ip[EfiTime->Month]; EfiTime->Month++; // adjust range to EFI conventions EfiTime->Day = (int) (days + 1); } // // base inode functions // EFI_STATUS Ext2InodeOpen(IN EXT2_VOLUME_DATA *Volume, IN UINT32 InodeNo, IN EXT2_INODE *ParentDirInode OPTIONAL, IN struct ext2_dir_entry *DirEntry OPTIONAL, OUT EXT2_INODE **NewInode) { EFI_STATUS Status; EXT2_INODE *Inode; UINT32 GroupNo, GroupDescBlockNo, GroupDescIndex; struct ext2_group_desc *GroupDesc; UINT32 InodeNoInGroup, InodeBlockNo, InodeIndex; UINTN i; #if DEBUG_LEVEL Print(L"Ext2InodeOpen: %d\n", InodeNo); #endif // first check the volume's list of open directory inodes for (Inode = Volume->DirInodeList; Inode != NULL; Inode = Inode->Next) { if (Inode->InodeNo == InodeNo) { Inode->RefCount++; *NewInode = Inode; #if DEBUG_LEVEL Print(L"...found dir %d '%s', now %d refs\n", Inode->InodeNo, Inode->Name, Inode->RefCount); #endif return EFI_SUCCESS; } } // read the group descripter for the block group the inode belongs to GroupNo = (InodeNo - 1) / Volume->SuperBlock->s_inodes_per_group; GroupDescBlockNo = (Volume->SuperBlock->s_first_data_block + 1) + GroupNo / (Volume->BlockSize / sizeof(struct ext2_group_desc)); GroupDescIndex = GroupNo % (Volume->BlockSize / sizeof(struct ext2_group_desc)); Status = Ext2ReadBlock(Volume, GroupDescBlockNo); if (EFI_ERROR(Status)) return Status; GroupDesc = ((struct ext2_group_desc *)(Volume->BlockBuffer)) + GroupDescIndex; // TODO: in the future, read and keep the bg_inode_table field of all block // groups when mounting the file system (optimization) // read the inode block for the requested inode InodeNoInGroup = (InodeNo - 1) % Volume->SuperBlock->s_inodes_per_group; InodeBlockNo = GroupDesc->bg_inode_table + InodeNoInGroup / (Volume->BlockSize / Volume->InodeSize); InodeIndex = InodeNoInGroup % (Volume->BlockSize / Volume->InodeSize); Status = Ext2ReadBlock(Volume, InodeBlockNo); if (EFI_ERROR(Status)) return Status; // set up the inode structure Inode = AllocateZeroPool(sizeof(EXT2_INODE)); Inode->Volume = Volume; Inode->InodeNo = InodeNo; Inode->RefCount = 1; if (ParentDirInode != NULL) { ParentDirInode->RefCount++; Inode->ParentDirInode = ParentDirInode; #if DEBUG_LEVEL Print(L"...parent inode %d '%s', %d refs\n", ParentDirInode->InodeNo, ParentDirInode->Name, ParentDirInode->RefCount); #endif } // convert file name if (DirEntry != NULL) { Inode->Name = AllocatePool((DirEntry->name_len + 1) * sizeof(CHAR16)); for (i = 0; i < DirEntry->name_len; i++) Inode->Name[i] = DirEntry->name[i]; Inode->Name[i] = 0; } else Inode->Name = StrDuplicate(L""); // keep the raw inode structure around Inode->RawInode = AllocatePool(Volume->InodeSize); CopyMem(Inode->RawInode, Volume->BlockBuffer + InodeIndex * Volume->InodeSize, Volume->InodeSize); Inode->FileSize = Inode->RawInode->i_size; // TODO: check docs for 64-bit sized files if (S_ISDIR(Inode->RawInode->i_mode)) { // add to the volume's list of open directories if (Volume->DirInodeList != NULL) { Volume->DirInodeList->Prev = Inode; Inode->Next = Volume->DirInodeList; } Volume->DirInodeList = Inode; } *NewInode = Inode; #if DEBUG_LEVEL Print(L"...created inode %d '%s', %d refs\n", Inode->InodeNo, Inode->Name, Inode->RefCount); #endif return EFI_SUCCESS; } EFI_STATUS Ext2InodeClose(IN EXT2_INODE *Inode) { #if DEBUG_LEVEL Print(L"Ext2InodeClose: %d '%s', %d refs\n", Inode->InodeNo, Inode->Name, Inode->RefCount); #endif Inode->RefCount--; if (Inode->RefCount == 0) { if (Inode->ParentDirInode != NULL) Ext2InodeClose(Inode->ParentDirInode); if (S_ISDIR(Inode->RawInode->i_mode)) { // remove from the volume's list of open directories if (Inode->Next) Inode->Next->Prev = Inode->Prev; if (Inode->Prev) Inode->Prev->Next = Inode->Next; if (Inode->Volume->DirInodeList == Inode) Inode->Volume->DirInodeList = Inode->Next; } FreePool(Inode->RawInode); FreePool(Inode->Name); FreePool(Inode); } return EFI_SUCCESS; } VOID Ext2InodeFillFileInfo(IN EXT2_INODE *Inode, OUT EFI_FILE_INFO *FileInfo) { FileInfo->FileSize = Inode->FileSize; FileInfo->PhysicalSize = Inode->RawInode->i_blocks * 512; // very, very strange... Ext2DecodeTime(&FileInfo->CreateTime, Inode->RawInode->i_ctime); Ext2DecodeTime(&FileInfo->LastAccessTime, Inode->RawInode->i_atime); Ext2DecodeTime(&FileInfo->ModificationTime, Inode->RawInode->i_mtime); FileInfo->Attribute = 0; if (S_ISDIR(Inode->RawInode->i_mode)) FileInfo->Attribute |= EFI_FILE_DIRECTORY; if ((Inode->RawInode->i_mode & S_IWUSR) == 0) FileInfo->Attribute |= EFI_FILE_READ_ONLY; } // // inode handle functions // EFI_STATUS Ext2InodeHandleOpen(IN EXT2_VOLUME_DATA *Volume, IN UINT32 InodeNo, IN EXT2_INODE *ParentDirInode OPTIONAL, IN struct ext2_dir_entry *DirEntry OPTIONAL, OUT EXT2_INODE_HANDLE *InodeHandle) { EFI_STATUS Status; // open the actual inode Status = Ext2InodeOpen(Volume, InodeNo, ParentDirInode, DirEntry, &InodeHandle->Inode); if (EFI_ERROR(Status)) return Status; InodeHandle->CurrentPosition = 0; InodeHandle->CurrentFileBlockNo = INVALID_BLOCK_NO; return EFI_SUCCESS; } EFI_STATUS Ext2InodeHandleReopen(IN EXT2_INODE *Inode, OUT EXT2_INODE_HANDLE *InodeHandle) { InodeHandle->Inode = Inode; InodeHandle->CurrentPosition = 0; InodeHandle->CurrentFileBlockNo = INVALID_BLOCK_NO; Inode->RefCount++; #if DEBUG_LEVEL Print(L"Ext2InodeHandleReopen: %d '%s', now %d refs\n", Inode->InodeNo, Inode->Name, Inode->RefCount); #endif return EFI_SUCCESS; } EFI_STATUS Ext2InodeHandleClose(IN EXT2_INODE_HANDLE *InodeHandle) { Ext2InodeClose(InodeHandle->Inode); InodeHandle->Inode = NULL; // just for safety return EFI_SUCCESS; } EFI_STATUS Ext2InodeHandleMapBlock(IN EXT2_INODE_HANDLE *InodeHandle, IN UINT32 FileBlockNo) { EFI_STATUS Status; EXT2_VOLUME_DATA *Volume; UINT32 IndBlockNo; Volume = InodeHandle->Inode->Volume; // try direct block pointers in the inode if (FileBlockNo < EXT2_NDIR_BLOCKS) { InodeHandle->CurrentVolBlockNo = InodeHandle->Inode->RawInode->i_block[FileBlockNo]; return EFI_SUCCESS; } FileBlockNo -= EXT2_NDIR_BLOCKS; // try indirect block if (FileBlockNo < Volume->IndBlockCount) { // read the indirect block into buffer Status = Ext2ReadBlock(Volume, InodeHandle->Inode->RawInode->i_block[EXT2_IND_BLOCK]); if (EFI_ERROR(Status)) return Status; InodeHandle->CurrentVolBlockNo = ((__u32 *)Volume->BlockBuffer)[FileBlockNo]; return EFI_SUCCESS; } FileBlockNo -= Volume->IndBlockCount; // try double-indirect block if (FileBlockNo < Volume->DIndBlockCount) { // read the double-indirect block into buffer Status = Ext2ReadBlock(Volume, InodeHandle->Inode->RawInode->i_block[EXT2_DIND_BLOCK]); if (EFI_ERROR(Status)) return Status; IndBlockNo = ((__u32 *)Volume->BlockBuffer)[FileBlockNo / Volume->IndBlockCount]; // read the linked indirect block into buffer Status = Ext2ReadBlock(Volume, IndBlockNo); if (EFI_ERROR(Status)) return Status; InodeHandle->CurrentVolBlockNo = ((__u32 *)Volume->BlockBuffer)[FileBlockNo % Volume->IndBlockCount]; return EFI_SUCCESS; } FileBlockNo -= Volume->DIndBlockCount; // use the triple-indirect block // read the triple-indirect block into buffer Status = Ext2ReadBlock(Volume, InodeHandle->Inode->RawInode->i_block[EXT2_TIND_BLOCK]); if (EFI_ERROR(Status)) return Status; IndBlockNo = ((__u32 *)Volume->BlockBuffer)[FileBlockNo / Volume->DIndBlockCount]; // read the linked double-indirect block into buffer Status = Ext2ReadBlock(Volume, IndBlockNo); if (EFI_ERROR(Status)) return Status; IndBlockNo = ((__u32 *)Volume->BlockBuffer)[(FileBlockNo / Volume->IndBlockCount) % Volume->IndBlockCount]; // read the linked indirect block into buffer Status = Ext2ReadBlock(Volume, IndBlockNo); if (EFI_ERROR(Status)) return Status; InodeHandle->CurrentVolBlockNo = ((__u32 *)Volume->BlockBuffer)[FileBlockNo % Volume->IndBlockCount]; return EFI_SUCCESS; } EFI_STATUS Ext2InodeHandleRead(IN EXT2_INODE_HANDLE *InodeHandle, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EXT2_VOLUME_DATA *Volume; UINTN RemLength, CopyLength; UINT8 *RemBuffer; UINT32 Position; UINT32 FileBlockNo; //Print(L"Ext2InodeHandleRead %d bytes at %ld\n", *BufferSize, InodeHandle->CurrentPosition); Volume = InodeHandle->Inode->Volume; if (InodeHandle->CurrentPosition >= InodeHandle->Inode->FileSize) { // end of file reached *BufferSize = 0; return EFI_SUCCESS; } // NOTE: since ext2 only supports 32 bit file sizes, we can now assume CurrentPosition fits in 32 bits. // TODO: check how this code compiles on 64 bit archs // initialize loop variables RemBuffer = Buffer; RemLength = *BufferSize; Position = (UINT32)InodeHandle->CurrentPosition; // constrain read to file size if (RemLength > (InodeHandle->Inode->FileSize - Position)) RemLength = (UINTN)(InodeHandle->Inode->FileSize - Position); // the condition ensures this cast is okay while (RemLength > 0) { // find block number to read in the file's terms FileBlockNo = Position / Volume->BlockSize; // find corresponding disk block if (InodeHandle->CurrentFileBlockNo != FileBlockNo) { Status = Ext2InodeHandleMapBlock(InodeHandle, FileBlockNo); if (EFI_ERROR(Status)) { InodeHandle->CurrentFileBlockNo = INVALID_BLOCK_NO; return Status; } InodeHandle->CurrentFileBlockNo = FileBlockNo; } // load the data block Status = Ext2ReadBlock(Volume, InodeHandle->CurrentVolBlockNo); if (EFI_ERROR(Status)) return Status; // copy data to the buffer CopyLength = Volume->BlockSize - (Position & (Volume->BlockSize - 1)); if (CopyLength > RemLength) CopyLength = RemLength; CopyMem(RemBuffer, Volume->BlockBuffer + (Position & (Volume->BlockSize - 1)), CopyLength); // advance loop variables RemBuffer += CopyLength; RemLength -= CopyLength; Position += CopyLength; } // calculate bytes actually read *BufferSize = Position - (UINT32)InodeHandle->CurrentPosition; InodeHandle->CurrentPosition = Position; return EFI_SUCCESS; } refit-0.14/fs_ext2/LICENSE.txt0000644000175000017500000000151510447731507015314 0ustar julienjulien rEFIt ext2 Driver License =========================== Copyright (c) 2006 Christoph Pfisterer Portions Copyright (c) 1991-2006 by various Linux kernel contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. refit-0.14/fs_ext2/LICENSE_GPL.txt0000644000175000017500000004311010474603527016013 0ustar julienjulien GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. refit-0.14/fs_ext2/super.c0000644000175000017500000001203710451150430014755 0ustar julienjulien/* * fs_ext2/super.c * Per-volume functions, including SimpleFileSystem interface * * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * See LICENSE.txt for details about the copyright status of * the ext2 file system driver. */ #include "fs_ext2.h" #define DEBUG_LEVEL 0 // functions EFI_STATUS EFIAPI Ext2OpenVolume(IN EFI_FILE_IO_INTERFACE *This, OUT EFI_FILE **Root); // // read the superblock and setup the Simple File System interface // EFI_STATUS Ext2ReadSuper(IN EXT2_VOLUME_DATA *Volume) { EFI_STATUS Status; // NOTE: in the error case, the caller frees SuperBlock and BlockBuffer // read the superblock from disk Volume->SuperBlock = AllocatePool(sizeof(struct ext2_super_block)); Status = Volume->DiskIo->ReadDisk(Volume->DiskIo, Volume->MediaId, BLOCK_SIZE, sizeof(struct ext2_super_block), Volume->SuperBlock); if (EFI_ERROR(Status)) return Status; // check the superblock if (Volume->SuperBlock->s_magic != EXT2_SUPER_MAGIC) return EFI_UNSUPPORTED; if (Volume->SuperBlock->s_rev_level != EXT2_GOOD_OLD_REV && Volume->SuperBlock->s_rev_level != EXT2_DYNAMIC_REV) return EFI_UNSUPPORTED; if (Volume->SuperBlock->s_rev_level == EXT2_DYNAMIC_REV && (Volume->SuperBlock->s_feature_incompat & ~(EXT2_FEATURE_INCOMPAT_FILETYPE | EXT3_FEATURE_INCOMPAT_RECOVER))) return EFI_UNSUPPORTED; if (Volume->SuperBlock->s_rev_level == EXT2_DYNAMIC_REV && (Volume->SuperBlock->s_feature_incompat & EXT3_FEATURE_INCOMPAT_RECOVER)) Print(L"Ext2 WARNING: This ext3 file system needs recovery, trying to use it anyway.\n"); Volume->BlockSize = 1024 << Volume->SuperBlock->s_log_block_size; Volume->IndBlockCount = Volume->BlockSize / sizeof(__u32); Volume->DIndBlockCount = Volume->IndBlockCount * Volume->IndBlockCount; if (Volume->SuperBlock->s_rev_level == EXT2_GOOD_OLD_REV) { Volume->InodeSize = EXT2_GOOD_OLD_INODE_SIZE; #if DEBUG_LEVEL Print(L"Ext2ReadSuper: EXT2_GOOD_OLD_REV, %d byte inodes\n", Volume->InodeSize); #endif } else { Volume->InodeSize = Volume->SuperBlock->s_inode_size; #if DEBUG_LEVEL Print(L"Ext2ReadSuper: EXT2_DYNAMIC_REV, %d byte inodes\n", Volume->InodeSize); #endif } Volume->RootInode = NULL; Volume->DirInodeList = NULL; Volume->BlockBuffer = AllocatePool(Volume->BlockSize); Volume->BlockInBuffer = INVALID_BLOCK_NO; #if DEBUG_LEVEL Print(L"Ext2ReadSuper: successful, BlockSize %d\n", Volume->BlockSize); #endif // setup the SimpleFileSystem protocol Volume->FileSystem.Revision = EFI_FILE_IO_INTERFACE_REVISION; Volume->FileSystem.OpenVolume = Ext2OpenVolume; return EFI_SUCCESS; } // // Ext2OpenVolume // EFI_STATUS EFIAPI Ext2OpenVolume(IN EFI_FILE_IO_INTERFACE *This, OUT EFI_FILE **Root) { EFI_STATUS Status; EXT2_VOLUME_DATA *Volume; EXT2_INODE_HANDLE InodeHandle; #if DEBUG_LEVEL Print(L"Ext2OpenVolume\n"); #endif Volume = EXT2_VOLUME_FROM_FILE_SYSTEM(This); // open the root inode, keep it around until the FS is unmounted if (Volume->RootInode == NULL) { Status = Ext2InodeOpen(Volume, EXT2_ROOT_INO, NULL, NULL, &Volume->RootInode); if (EFI_ERROR(Status)) return Status; } // create a new inode handle Status = Ext2InodeHandleReopen(Volume->RootInode, &InodeHandle); if (EFI_ERROR(Status)) return Status; // wrap it in a file structure Status = Ext2FileFromInodeHandle(&InodeHandle, Root); // NOTE: file handle takes ownership of inode handle return Status; } // // read given block into the volume's block buffer // EFI_STATUS Ext2ReadBlock(IN EXT2_VOLUME_DATA *Volume, IN UINT32 BlockNo) { EFI_STATUS Status; // check buffer if (BlockNo == Volume->BlockInBuffer) return EFI_SUCCESS; #if DEBUG_LEVEL == 2 Print(L"Ext2ReadBlock: %d\n", BlockNo); #endif // remember buffer state Volume->BlockInBuffer = BlockNo; // special treatment for "holes" a.k.a. sparse files if (BlockNo == 0) { ZeroMem(Volume->BlockBuffer, Volume->BlockSize); return EFI_SUCCESS; } // read from disk Status = Volume->DiskIo->ReadDisk(Volume->DiskIo, Volume->MediaId, (UINT64)BlockNo * Volume->BlockSize, Volume->BlockSize, Volume->BlockBuffer); if (EFI_ERROR(Status)) { Volume->BlockInBuffer = INVALID_BLOCK_NO; return Status; } return EFI_SUCCESS; } refit-0.14/fs_ext2/TODO.txt0000644000175000017500000000161010450526377014774 0ustar julienjulien rEFIt ext2 Driver TODO ======================== Things that need attention: - Support symbolic links: EFI does not have a concept of symbolic links, so they should be resolved within the driver to look like hard links. - Map ctime/mtime/atime timestamps to the EFI_TIME structure. - Read the block group descriptors once when the file system is mounted and store the bg_inode_table field for all groups in the volume structure. (Eliminates one block read in Ext2InodeOpen.) - Check the feature flags in the superblock for DYNAMIC_REV volumes. - Disable the workarounds for . and .. in Ext2DirOpen. - Make the dispatchers in file.c permanent. - Cache more than one block in memory. (Should probably be limited to metadata blocks.) - Support indexed directories, at least by skipping the hash table blocks. - Maybe support forward slashes in addition to backslashes in Ext2DirOpen. EOF refit-0.14/fsw/0000755000175000017500000000000011363100432012675 5ustar julienjulienrefit-0.14/fsw/design.dox0000644000175000017500000001213010454203271014664 0ustar julienjulien/* * \file design.dox * Documentation title page with design information */ /** \mainpage File System Wrapper Documentation Welcome to the documentation for FSW. This doxygen-generated documentation is intended for developers that either want to integrate FSW into their own project or want to write additional file system drivers. \section goals Design Goals File System Wrapper wants to provide reusable, read-only file system drivers for a range of common file systems. Reusability is achieved through a common abstraction layer (called the "core"), which serves as the API for the host environment driver. Once the required glue code is written for a host environment, that host has access to all file system types implemented by FSW, with no code to be written per file system type. Why read-only? There are a range of reasons why FSW only provides read-only access: - Read-only drivers are much easier to write than read-write drivers. - Write access isn't easily abstracted in an OS-independent way because of more delicate buffer I/O handling requirements and features like journalling. - There is no risk of destroying data on the disk. - Having read access is much better than having no access at all. (Read-only drivers for several file systems can be written in the time it would take to develop a read-write driver for just one file system.) - Boot loaders only need read access in most cases. \section model Object and Data Model \subsection main_objects Main Objects There are three main "objects" that FSW works with: volume, dnode, and shandle. The fsw_volume structure keeps the information that applies to a file system volume as a whole. Most importantly, it keeps pointers to the host driver and file system driver dispatch tables, which are used by the core to call the appropriate functions. The fsw_dnode structure represents a "directory node", that is any file-like object in the file system: regular files, directories, symbolic links as well as special files like device nodes. When compared with Unix-style file systems, a dnode is very similar to an inode, but it retains some essential information from the directory: the canonical name and the parent directory. FSW requires that a dnode is uniquely identified by an integer number (currently 32 bit in size). Inode numbers can be used for this purpose, non-Unix file systems will have to come up with a unique number in some way. The fsw_shandle structure is used to access file data ("storage handle"). A dnode only represents the file as such and doesn't offer access to its data. An shandle is linked to a certain dnode, but there may be several shandles per dnode. The shandle stores a file position pointer (byte offset) that can be changed at will. With the current design, an shandle is also used for directory iteration, even if the file system stores directory information in a central tree structure. \subsection disk_access Disk Data Access Data on the disk is accessed in blocks, addressed by a sequential number starting at zero. The block size to use can be set by the file system driver. FSW supports two separate block sizes: the "physical block size" is used when accessing the disk, the "logical block size" is used when accessing a file's data. For most file systems, these two are identical, but there may be some where the file allocation block size is larger than the sector or block size used to store metadata. (FAT comes to mind as an example.) For accessing the actual file data, the file system driver doesn't handle the disk I/O, but merely returns information about the mapping from file logical blocks to disk physical blocks in the fsw_extent structure. This allows host OS buffer mechanisms to be used for file data. In special cases, like tail-packing, fragments or compressed file systems, the file system driver can return file data in an allocated buffer. \subsection data_hooks Data Extension Hooks File system specific data can be stored by extending the fsw_volume and fsw_dnode structures. The core code uses the structure sizes stored in the fsw_fstype_table to allocate memory for these structures. The fsw_shandle and fsw_extent structures are not designed to be extended. Host specific data must be stored in separate structures private to the host environment driver. The fsw_volume structure provides a host_data variable to store a pointer. The fsw_dnode structure has no such field, because it is assumed that all actions regarding dnodes are initiated on the host side and so the host-specific private structure is known. \section callconv Calling Conventions All functions that can fail return a status code in a fsw_status_t. This type is an integer. A boolean test yields true if there was an error and false if the function executed successfully, i.e. success is signalled by a 0 return value. Functions that return data do so either by filling a structure passed in by the caller, or by allocating a structure on the heap and returning a pointer through a double-indirect parameter. A returned object pointer is the last parameter in the parameter list. (More to be written about specific conventions for dnodes, shandles, strings.) */ refit-0.14/fsw/Doxyfile0000644000175000017500000002404610462670157014430 0ustar julienjulien# Doxyfile 1.4.7 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "File System Wrapper" PROJECT_NUMBER = 0.1 OUTPUT_DIRECTORY = doc CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- #INPUT = /Users/chrisp/efi_toolkit/refit/fsw INPUT = . FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.C \ *.CC \ *.C++ \ *.II \ *.I++ \ *.H \ *.HH \ *.H++ \ *.CS \ *.PHP \ *.PHP3 \ *.M \ *.MM \ *.PY RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = HOST_EFI HOST_POSIX EXPAND_AS_DEFINED = VOLSTRUCTNAME \ DNODESTRUCTNAME SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = /Applications/Graphviz.app/Contents/MacOS DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 1000 DOT_TRANSPARENT = YES DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO refit-0.14/fsw/fsw_base.h0000644000175000017500000000757610462654671014700 0ustar julienjulien/** * \file fsw_base.h * Base definitions switch. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_BASE_H_ #define _FSW_BASE_H_ #ifndef FSW_DEBUG_LEVEL /** * Global debugging level. Can be set locally for the scope of a single * file by defining the macro before fsw_base.h is included. */ #define FSW_DEBUG_LEVEL 1 #endif #ifdef HOST_EFI #include "fsw_efi_base.h" #endif #ifdef HOST_POSIX #include "fsw_posix_base.h" #endif // message printing #if FSW_DEBUG_LEVEL >= 1 #define FSW_MSG_ASSERT(params) FSW_MSGFUNC params #else #define FSW_MSG_ASSERT(params) #endif #if FSW_DEBUG_LEVEL >= 2 #define FSW_MSG_DEBUG(params) FSW_MSGFUNC params #else #define FSW_MSG_DEBUG(params) #endif #if FSW_DEBUG_LEVEL >= 3 #define FSW_MSG_DEBUGV(params) FSW_MSGFUNC params #else #define FSW_MSG_DEBUGV(params) #endif // Documentation for system-dependent defines /** * \typedef fsw_s8 * Signed 8-bit integer. */ /** * \typedef fsw_u8 * Unsigned 8-bit integer. */ /** * \typedef fsw_s16 * Signed 16-bit integer. */ /** * \typedef fsw_u16 * Unsigned 16-bit integer. */ /** * \typedef fsw_s32 * Signed 32-bit integer. */ /** * \typedef fsw_u32 * Unsigned 32-bit integer. */ /** * \typedef fsw_s64 * Signed 64-bit integer. */ /** * \typedef fsw_u64 * Unsigned 64-bit integer. */ /** * \def fsw_alloc(size,ptrptr) * Allocate memory on the heap. This function or macro allocates \a size * bytes of memory using host-specific methods. The address of the * allocated memory block is stored into the pointer variable pointed * to by \a ptrptr. A status code is returned; FSW_SUCCESS if the block * was allocated or FSW_OUT_OF_MEMORY if there is not enough memory * to allocated the requested block. */ /** * \def fsw_free(ptr) * Release allocated memory. This function or macro returns an allocated * memory block to the heap for reuse. Does not return a status. */ /** * \def fsw_memcpy(dest,src,size) * Copies a block of memory from \a src to \a dest. The two memory blocks * must not overlap, or the result of the operation will be undefined. * Does not return a status. */ /** * \def fsw_memeq(dest,src,size) * Compares two blocks of memory for equality. Returns boolean true if the * memory blocks are equal, boolean false if they are different. */ /** * \def fsw_memzero(dest,size) * Initializes a block of memory with zeros. Does not return a status. */ #endif refit-0.14/fsw/fsw_core.c0000644000175000017500000007764510545737654014722 0ustar julienjulien/** * \file fsw_core.c * Core file system wrapper abstraction layer code. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_core.h" // functions static void fsw_blockcache_free(struct fsw_volume *vol); #define MAX_CACHE_LEVEL (5) /** * Mount a volume with a given file system driver. This function is called by the * host driver to make a volume accessible. The file system driver to use is specified * by a pointer to its dispatch table. The file system driver will look at the * data on the volume to determine if it can read the format. If the volume is found * unsuitable, FSW_UNSUPPORTED is returned. * * If this function returns FSW_SUCCESS, *vol_out points at a valid volume data * structure. The caller must release it later by calling fsw_unmount. * * If this function returns an error status, the caller only needs to clean up its * own buffers that may have been allocated through the read_block interface. */ fsw_status_t fsw_mount(void *host_data, struct fsw_host_table *host_table, struct fsw_fstype_table *fstype_table, struct fsw_volume **vol_out) { fsw_status_t status; struct fsw_volume *vol; // allocate memory for the structure status = fsw_alloc_zero(fstype_table->volume_struct_size, (void **)&vol); if (status) return status; // initialize fields vol->phys_blocksize = 512; vol->log_blocksize = 512; vol->label.type = FSW_STRING_TYPE_EMPTY; vol->host_data = host_data; vol->host_table = host_table; vol->fstype_table = fstype_table; vol->host_string_type = host_table->native_string_type; // let the fs driver mount the file system status = vol->fstype_table->volume_mount(vol); if (status) goto errorexit; // TODO: anything else? *vol_out = vol; return FSW_SUCCESS; errorexit: fsw_unmount(vol); return status; } /** * Unmount a volume by releasing all memory associated with it. This function is * called by the host driver when a volume is no longer needed. It is also called * by the core after a failed mount to clean up any allocated memory. * * Note that all dnodes must have been released before calling this function. */ void fsw_unmount(struct fsw_volume *vol) { if (vol->root) fsw_dnode_release(vol->root); // TODO: check that no other dnodes are still around vol->fstype_table->volume_free(vol); fsw_blockcache_free(vol); fsw_strfree(&vol->label); fsw_free(vol); } /** * Get in-depth information on the volume. This function can be called by the host * driver to get additional information on the volume. */ fsw_status_t fsw_volume_stat(struct fsw_volume *vol, struct fsw_volume_stat *sb) { return vol->fstype_table->volume_stat(vol, sb); } /** * Set the physical and logical block sizes of the volume. This functions is called by * the file system driver to announce the block sizes it wants to use for accessing * the disk (physical) and for addressing file contents (logical). * Usually both sizes will be the same but there may be file systems that need to access * metadata at a smaller block size than the allocation unit for files. * * Calling this function causes the block cache to be dropped. All pointers returned * from fsw_block_get become invalid. This function should only be called while * mounting the file system, not as a part of file access operations. * * Both sizes are measured in bytes, must be powers of 2, and must not be smaller * than 512 bytes. The logical block size cannot be smaller than the physical block size. */ void fsw_set_blocksize(struct fsw_volume *vol, fsw_u32 phys_blocksize, fsw_u32 log_blocksize) { // TODO: Check the sizes. Both must be powers of 2. log_blocksize must not be smaller than // phys_blocksize. // drop core block cache if present fsw_blockcache_free(vol); // signal host driver to drop caches etc. vol->host_table->change_blocksize(vol, vol->phys_blocksize, vol->log_blocksize, phys_blocksize, log_blocksize); vol->phys_blocksize = phys_blocksize; vol->log_blocksize = log_blocksize; } /** * Get a block of data from the disk. This function is called by the file system driver * or by core functions. It calls through to the host driver's device access routine. * Given a physical block number, it reads the block into memory (or fetches it from the * block cache) and returns the address of the memory buffer. The caller should provide * an indication of how important the block is in the cache_level parameter. Blocks with * a low level are purged first. Some suggestions for cache levels: * * - 0: File data * - 1: Directory data, symlink data * - 2: File system metadata * - 3..5: File system metadata with a high rate of access * * If this function returns successfully, the returned data pointer is valid until the * caller calls fsw_block_release. */ fsw_status_t fsw_block_get(struct VOLSTRUCTNAME *vol, fsw_u32 phys_bno, fsw_u32 cache_level, void **buffer_out) { fsw_status_t status; fsw_u32 i, discard_level, new_bcache_size; struct fsw_blockcache *new_bcache; // TODO: allow the host driver to do its own caching; just call through if // the appropriate function pointers are set if (cache_level > MAX_CACHE_LEVEL) cache_level = MAX_CACHE_LEVEL; // check block cache for (i = 0; i < vol->bcache_size; i++) { if (vol->bcache[i].phys_bno == phys_bno) { // cache hit! if (vol->bcache[i].cache_level < cache_level) vol->bcache[i].cache_level = cache_level; // promote the entry vol->bcache[i].refcount++; *buffer_out = vol->bcache[i].data; return FSW_SUCCESS; } } // find a free entry in the cache table for (i = 0; i < vol->bcache_size; i++) { if (vol->bcache[i].phys_bno == FSW_INVALID_BNO) break; } if (i >= vol->bcache_size) { for (discard_level = 0; discard_level <= MAX_CACHE_LEVEL; discard_level++) { for (i = 0; i < vol->bcache_size; i++) { if (vol->bcache[i].refcount == 0 && vol->bcache[i].cache_level <= discard_level) break; } if (i < vol->bcache_size) break; } } if (i >= vol->bcache_size) { // enlarge / create the cache if (vol->bcache_size < 16) new_bcache_size = 16; else new_bcache_size = vol->bcache_size << 1; status = fsw_alloc(new_bcache_size * sizeof(struct fsw_blockcache), &new_bcache); if (status) return status; if (vol->bcache_size > 0) fsw_memcpy(new_bcache, vol->bcache, vol->bcache_size * sizeof(struct fsw_blockcache)); for (i = vol->bcache_size; i < new_bcache_size; i++) { new_bcache[i].refcount = 0; new_bcache[i].cache_level = 0; new_bcache[i].phys_bno = FSW_INVALID_BNO; new_bcache[i].data = NULL; } i = vol->bcache_size; // switch caches if (vol->bcache != NULL) fsw_free(vol->bcache); vol->bcache = new_bcache; vol->bcache_size = new_bcache_size; } vol->bcache[i].phys_bno = FSW_INVALID_BNO; // read the data if (vol->bcache[i].data == NULL) { status = fsw_alloc(vol->phys_blocksize, &vol->bcache[i].data); if (status) return status; } status = vol->host_table->read_block(vol, phys_bno, vol->bcache[i].data); if (status) return status; vol->bcache[i].phys_bno = phys_bno; vol->bcache[i].cache_level = cache_level; vol->bcache[i].refcount = 1; *buffer_out = vol->bcache[i].data; return FSW_SUCCESS; } /** * Releases a disk block. This function must be called to release disk blocks returned * from fsw_block_get. */ void fsw_block_release(struct VOLSTRUCTNAME *vol, fsw_u32 phys_bno, void *buffer) { fsw_u32 i; // TODO: allow the host driver to do its own caching; just call through if // the appropriate function pointers are set // update block cache for (i = 0; i < vol->bcache_size; i++) { if (vol->bcache[i].phys_bno == phys_bno && vol->bcache[i].refcount > 0) vol->bcache[i].refcount--; } } /** * Release the block cache. Called internally when changing block sizes and when * unmounting the volume. It frees all data occupied by the generic block cache. */ static void fsw_blockcache_free(struct fsw_volume *vol) { fsw_u32 i; for (i = 0; i < vol->bcache_size; i++) { if (vol->bcache[i].data != NULL) fsw_free(vol->bcache[i].data); } if (vol->bcache != NULL) { fsw_free(vol->bcache); vol->bcache = NULL; } vol->bcache_size = 0; } /** * Add a new dnode to the list of known dnodes. This internal function is used when a * dnode is created to add it to the dnode list that is used to search for existing * dnodes by id. */ static void fsw_dnode_register(struct fsw_volume *vol, struct fsw_dnode *dno) { dno->next = vol->dnode_head; if (vol->dnode_head != NULL) vol->dnode_head->prev = dno; dno->prev = NULL; vol->dnode_head = dno; } /** * Create a dnode representing the root directory. This function is called by the file system * driver while mounting the file system. The root directory is special because it has no parent * dnode, its name is defined to be empty, and its type is also fixed. Otherwise, this functions * behaves in the same way as fsw_dnode_create. */ fsw_status_t fsw_dnode_create_root(struct fsw_volume *vol, fsw_u32 dnode_id, struct fsw_dnode **dno_out) { fsw_status_t status; struct fsw_dnode *dno; // allocate memory for the structure status = fsw_alloc_zero(vol->fstype_table->dnode_struct_size, (void **)&dno); if (status) return status; // fill the structure dno->vol = vol; dno->parent = NULL; dno->dnode_id = dnode_id; dno->type = FSW_DNODE_TYPE_DIR; dno->refcount = 1; dno->name.type = FSW_STRING_TYPE_EMPTY; // TODO: instead, call a function to create an empty string in the native string type fsw_dnode_register(vol, dno); *dno_out = dno; return FSW_SUCCESS; } /** * Create a new dnode representing a file system object. This function is called by * the file system driver in response to directory lookup or read requests. Note that * if there already is a dnode with the given dnode_id on record, then no new object * is created. Instead, the existing dnode is returned and its reference count * increased. All other parameters are ignored in this case. * * The type passed into this function may be FSW_DNODE_TYPE_UNKNOWN. It is sufficient * to fill the type field during the dnode_fill call. * * The name parameter must describe a string with the object's name. A copy will be * stored in the dnode structure for future reference. The name will not be used to * shortcut directory lookups, but may be used to reconstruct paths. * * If the function returns successfully, *dno_out contains a pointer to the dnode * that must be released by the caller with fsw_dnode_release. */ fsw_status_t fsw_dnode_create(struct fsw_dnode *parent_dno, fsw_u32 dnode_id, int type, struct fsw_string *name, struct fsw_dnode **dno_out) { fsw_status_t status; struct fsw_volume *vol = parent_dno->vol; struct fsw_dnode *dno; // check if we already have a dnode with the same id for (dno = vol->dnode_head; dno; dno = dno->next) { if (dno->dnode_id == dnode_id) { fsw_dnode_retain(dno); *dno_out = dno; return FSW_SUCCESS; } } // allocate memory for the structure status = fsw_alloc_zero(vol->fstype_table->dnode_struct_size, (void **)&dno); if (status) return status; // fill the structure dno->vol = vol; dno->parent = parent_dno; fsw_dnode_retain(dno->parent); dno->dnode_id = dnode_id; dno->type = type; dno->refcount = 1; status = fsw_strdup_coerce(&dno->name, vol->host_table->native_string_type, name); if (status) { fsw_free(dno); return status; } fsw_dnode_register(vol, dno); *dno_out = dno; return FSW_SUCCESS; } /** * Increases the reference count of a dnode. This must be balanced with * fsw_dnode_release calls. Note that some dnode functions return a retained * dnode pointer to their caller. */ void fsw_dnode_retain(struct fsw_dnode *dno) { dno->refcount++; } /** * Release a dnode pointer, deallocating it if this was the last reference. * This function decrements the reference counter of the dnode. If the counter * reaches zero, the dnode is freed. Since the parent dnode is released * during that process, this function may cause it to be freed, too. */ void fsw_dnode_release(struct fsw_dnode *dno) { struct fsw_volume *vol = dno->vol; struct fsw_dnode *parent_dno; dno->refcount--; if (dno->refcount == 0) { parent_dno = dno->parent; // de-register from volume's list if (dno->next) dno->next->prev = dno->prev; if (dno->prev) dno->prev->next = dno->next; if (vol->dnode_head == dno) vol->dnode_head = dno->next; // run fstype-specific cleanup vol->fstype_table->dnode_free(vol, dno); fsw_strfree(&dno->name); fsw_free(dno); // release our pointer to the parent, possibly deallocating it, too if (parent_dno) fsw_dnode_release(parent_dno); } } /** * Get full information about a dnode from disk. This function is called by the host * driver as well as by the core functions. Some file systems defer reading full * information on a dnode until it is actually needed (i.e. separation between * directory and inode information). This function makes sure that all information * is available in the dnode structure. The following fields may not have a correct * value until fsw_dnode_fill has been called: * * type, size */ fsw_status_t fsw_dnode_fill(struct fsw_dnode *dno) { // TODO: check a flag right here, call fstype's dnode_fill only once per dnode return dno->vol->fstype_table->dnode_fill(dno->vol, dno); } /** * Get extended information about a dnode. This function can be called by the host * driver to get a full compliment of information about a dnode in addition to the * fields of the fsw_dnode structure itself. * * Some data requires host-specific conversion to be useful (i.e. timestamps) and * will be passed to callback functions instead of being written into the structure. * These callbacks must be filled in by the caller. */ fsw_status_t fsw_dnode_stat(struct fsw_dnode *dno, struct fsw_dnode_stat *sb) { fsw_status_t status; status = fsw_dnode_fill(dno); if (status) return status; sb->used_bytes = 0; status = dno->vol->fstype_table->dnode_stat(dno->vol, dno, sb); if (!status && !sb->used_bytes) sb->used_bytes = DivU64x32(dno->size + dno->vol->log_blocksize - 1, dno->vol->log_blocksize, NULL); return status; } /** * Lookup a directory entry by name. This function is called by the host driver. * Given a directory dnode and a file name, it looks up the named entry in the * directory. * * If the dnode is not a directory, the call will fail. The caller is responsible for * resolving symbolic links before calling this function. * * If the function returns FSW_SUCCESS, *child_dno_out points to the requested directory * entry. The caller must call fsw_dnode_release on it. */ fsw_status_t fsw_dnode_lookup(struct fsw_dnode *dno, struct fsw_string *lookup_name, struct fsw_dnode **child_dno_out) { fsw_status_t status; status = fsw_dnode_fill(dno); if (status) return status; if (dno->type != FSW_DNODE_TYPE_DIR) return FSW_UNSUPPORTED; return dno->vol->fstype_table->dir_lookup(dno->vol, dno, lookup_name, child_dno_out); } /** * Find a file system object by path. This function is called by the host driver. * Given a directory dnode and a relative or absolute path, it walks the directory * tree until it finds the target dnode. If an intermediate node turns out to be * a symlink, it is resolved automatically. If the target node is a symlink, it * is not resolved. * * If the function returns FSW_SUCCESS, *child_dno_out points to the requested directory * entry. The caller must call fsw_dnode_release on it. */ fsw_status_t fsw_dnode_lookup_path(struct fsw_dnode *dno, struct fsw_string *lookup_path, char separator, struct fsw_dnode **child_dno_out) { fsw_status_t status; struct fsw_volume *vol = dno->vol; struct fsw_dnode *child_dno = NULL; struct fsw_string lookup_name; struct fsw_string remaining_path; int root_if_empty; remaining_path = *lookup_path; fsw_dnode_retain(dno); // loop over the path for (root_if_empty = 1; fsw_strlen(&remaining_path) > 0; root_if_empty = 0) { // parse next path component fsw_strsplit(&lookup_name, &remaining_path, separator); FSW_MSG_DEBUG((FSW_MSGSTR("fsw_dnode_lookup_path: split into %d '%s' and %d '%s'\n"), lookup_name.len, lookup_name.data, remaining_path.len, remaining_path.data)); if (fsw_strlen(&lookup_name) == 0) { // empty path component if (root_if_empty) child_dno = vol->root; else child_dno = dno; fsw_dnode_retain(child_dno); } else { // do an actual directory lookup // ensure we have full information status = fsw_dnode_fill(dno); if (status) goto errorexit; // resolve symlink if necessary if (dno->type == FSW_DNODE_TYPE_SYMLINK) { status = fsw_dnode_resolve(dno, &child_dno); if (status) goto errorexit; // symlink target becomes the new dno fsw_dnode_release(dno); dno = child_dno; // is already retained child_dno = NULL; // ensure we have full information status = fsw_dnode_fill(dno); if (status) goto errorexit; } // make sure we operate on a directory if (dno->type != FSW_DNODE_TYPE_DIR) { return FSW_UNSUPPORTED; goto errorexit; } // check special paths if (fsw_streq_cstr(&lookup_name, ".")) { // self directory child_dno = dno; fsw_dnode_retain(child_dno); } else if (fsw_streq_cstr(&lookup_name, "..")) { // parent directory if (dno->parent == NULL) { // We cannot go up from the root directory. Caution: Certain apps like the EFI shell // rely on this behaviour! status = FSW_NOT_FOUND; goto errorexit; } child_dno = dno->parent; fsw_dnode_retain(child_dno); } else { // do an actual lookup status = vol->fstype_table->dir_lookup(vol, dno, &lookup_name, &child_dno); if (status) goto errorexit; } } // child_dno becomes the new dno fsw_dnode_release(dno); dno = child_dno; // is already retained child_dno = NULL; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_dnode_lookup_path: now at inode %d\n"), dno->dnode_id)); } *child_dno_out = dno; return FSW_SUCCESS; errorexit: FSW_MSG_DEBUG((FSW_MSGSTR("fsw_dnode_lookup_path: leaving with error %d\n"), status)); fsw_dnode_release(dno); if (child_dno != NULL) fsw_dnode_release(child_dno); return status; } /** * Get the next directory item in sequential order. This function is called by the * host driver to read the complete contents of a directory in sequential (file system * defined) order. Calling this function returns the next entry. Iteration state is * kept by a shandle on the directory's dnode. The caller must set up the shandle * when starting the iteration. * * When the end of the directory is reached, this function returns FSW_NOT_FOUND. * If the function returns FSW_SUCCESS, *child_dno_out points to the next directory * entry. The caller must call fsw_dnode_release on it. */ fsw_status_t fsw_dnode_dir_read(struct fsw_shandle *shand, struct fsw_dnode **child_dno_out) { fsw_status_t status; struct fsw_dnode *dno = shand->dnode; fsw_u64 saved_pos; if (dno->type != FSW_DNODE_TYPE_DIR) return FSW_UNSUPPORTED; saved_pos = shand->pos; status = dno->vol->fstype_table->dir_read(dno->vol, dno, shand, child_dno_out); if (status) shand->pos = saved_pos; return status; } /** * Read the target path of a symbolic link. This function is called by the host driver * to read the "content" of a symbolic link, that is the relative or absolute path * it points to. * * If the function returns FSW_SUCCESS, the string handle provided by the caller is * filled with a string in the host's preferred encoding. The caller is responsible * for calling fsw_strfree on the string. */ fsw_status_t fsw_dnode_readlink(struct fsw_dnode *dno, struct fsw_string *target_name) { fsw_status_t status; status = fsw_dnode_fill(dno); if (status) return status; if (dno->type != FSW_DNODE_TYPE_SYMLINK) return FSW_UNSUPPORTED; return dno->vol->fstype_table->readlink(dno->vol, dno, target_name); } /** * Read the target path of a symbolic link by accessing file data. This function can * be called by the file system driver if the file system stores the target path * as normal file data. This function will open an shandle, read the whole content * of the file into a buffer, and build a string from that. Currently the encoding * for the string is fixed as FSW_STRING_TYPE_ISO88591. * * If the function returns FSW_SUCCESS, the string handle provided by the caller is * filled with a string in the host's preferred encoding. The caller is responsible * for calling fsw_strfree on the string. */ fsw_status_t fsw_dnode_readlink_data(struct fsw_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; struct fsw_shandle shand; fsw_u32 buffer_size; char buffer[FSW_PATH_MAX]; struct fsw_string s; if (dno->size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = (int)dno->size; s.data = buffer; // open shandle and read the data status = fsw_shandle_open(dno, &shand); if (status) return status; buffer_size = (fsw_u32)s.size; status = fsw_shandle_read(&shand, &buffer_size, buffer); fsw_shandle_close(&shand); if (status) return status; if ((int)buffer_size < s.size) return FSW_VOLUME_CORRUPTED; status = fsw_strdup_coerce(link_target, dno->vol->host_string_type, &s); return status; } /** * Resolve a symbolic link. This function can be called by the host driver to make * sure the a dnode is fully resolved instead of pointing at a symlink. If the dnode * passed in is not a symlink, it is returned unmodified. * * Note that absolute paths will be resolved relative to the root directory of the * volume. If the host is an operating system with its own VFS layer, it should * resolve symlinks on its own. * * If the function returns FSW_SUCCESS, *target_dno_out points at a dnode that is * not a symlink. The caller is responsible for calling fsw_dnode_release on it. */ fsw_status_t fsw_dnode_resolve(struct fsw_dnode *dno, struct fsw_dnode **target_dno_out) { fsw_status_t status; struct fsw_string target_name; struct fsw_dnode *target_dno; fsw_dnode_retain(dno); while (1) { // get full information status = fsw_dnode_fill(dno); if (status) goto errorexit; if (dno->type != FSW_DNODE_TYPE_SYMLINK) { // found a non-symlink target, return it *target_dno_out = dno; return FSW_SUCCESS; } if (dno->parent == NULL) { // safety measure, cannot happen in theory status = FSW_NOT_FOUND; goto errorexit; } // read the link's target status = fsw_dnode_readlink(dno, &target_name); if (status) goto errorexit; // resolve it status = fsw_dnode_lookup_path(dno->parent, &target_name, '/', &target_dno); fsw_strfree(&target_name); if (status) goto errorexit; // target_dno becomes the new dno fsw_dnode_release(dno); dno = target_dno; // is already retained } errorexit: fsw_dnode_release(dno); return status; } /** * Set up a shandle (storage handle) to access a file's data. This function is called * by the host driver and by the core when they need to access a file's data. It is also * used in accessing the raw data of directories and symlinks if the file system uses * the same mechanisms for storing the data of those items. * * The storage for the fsw_shandle structure is provided by the caller. The dnode and pos * fields may be accessed, pos may also be written to to set the file pointer. The file's * data size is available as shand->dnode->size. * * If this function returns FSW_SUCCESS, the caller must call fsw_shandle_close to release * the dnode reference held by the shandle. */ fsw_status_t fsw_shandle_open(struct fsw_dnode *dno, struct fsw_shandle *shand) { fsw_status_t status; struct fsw_volume *vol = dno->vol; // read full dnode information into memory status = vol->fstype_table->dnode_fill(vol, dno); if (status) return status; // setup shandle fsw_dnode_retain(dno); shand->dnode = dno; shand->pos = 0; shand->extent.type = FSW_EXTENT_TYPE_INVALID; return FSW_SUCCESS; } /** * Close a shandle after accessing the dnode's data. This function is called by the host * driver or core functions when they are finished with accessing a file's data. It * releases the dnode reference and frees any buffers associated with the shandle itself. * The dnode is only released if this was the last reference using it. */ void fsw_shandle_close(struct fsw_shandle *shand) { if (shand->extent.type == FSW_EXTENT_TYPE_BUFFER) fsw_free(shand->extent.buffer); fsw_dnode_release(shand->dnode); } /** * Read data from a shandle (storage handle for a dnode). This function is called by the * host driver or internally when data is read from a file. TODO: more */ fsw_status_t fsw_shandle_read(struct fsw_shandle *shand, fsw_u32 *buffer_size_inout, void *buffer_in) { fsw_status_t status; struct fsw_dnode *dno = shand->dnode; struct fsw_volume *vol = dno->vol; fsw_u8 *buffer, *block_buffer; fsw_u32 buflen, copylen, pos; fsw_u32 log_bno, pos_in_extent, phys_bno, pos_in_physblock; fsw_u32 cache_level; if (shand->pos >= dno->size) { // already at EOF *buffer_size_inout = 0; return FSW_SUCCESS; } // initialize vars buffer = buffer_in; buflen = *buffer_size_inout; pos = (fsw_u32)shand->pos; cache_level = (dno->type != FSW_DNODE_TYPE_FILE) ? 1 : 0; // restrict read to file size if (buflen > dno->size - pos) buflen = (fsw_u32)(dno->size - pos); while (buflen > 0) { // get extent for the current logical block log_bno = pos / vol->log_blocksize; if (shand->extent.type == FSW_EXTENT_TYPE_INVALID || log_bno < shand->extent.log_start || log_bno >= shand->extent.log_start + shand->extent.log_count) { if (shand->extent.type == FSW_EXTENT_TYPE_BUFFER) fsw_free(shand->extent.buffer); // ask the file system for the proper extent shand->extent.log_start = log_bno; status = vol->fstype_table->get_extent(vol, dno, &shand->extent); if (status) { shand->extent.type = FSW_EXTENT_TYPE_INVALID; return status; } } pos_in_extent = pos - shand->extent.log_start * vol->log_blocksize; // dispatch by extent type if (shand->extent.type == FSW_EXTENT_TYPE_PHYSBLOCK) { // convert to physical block number and offset phys_bno = shand->extent.phys_start + pos_in_extent / vol->phys_blocksize; pos_in_physblock = pos_in_extent & (vol->phys_blocksize - 1); copylen = vol->phys_blocksize - pos_in_physblock; if (copylen > buflen) copylen = buflen; // get one physical block status = fsw_block_get(vol, phys_bno, cache_level, (void **)&block_buffer); if (status) return status; // copy data from it fsw_memcpy(buffer, block_buffer + pos_in_physblock, copylen); fsw_block_release(vol, phys_bno, block_buffer); } else if (shand->extent.type == FSW_EXTENT_TYPE_BUFFER) { copylen = shand->extent.log_count * vol->log_blocksize - pos_in_extent; if (copylen > buflen) copylen = buflen; fsw_memcpy(buffer, (fsw_u8 *)shand->extent.buffer + pos_in_extent, copylen); } else { // _SPARSE or _INVALID copylen = shand->extent.log_count * vol->log_blocksize - pos_in_extent; if (copylen > buflen) copylen = buflen; fsw_memzero(buffer, copylen); } buffer += copylen; buflen -= copylen; pos += copylen; } *buffer_size_inout = (fsw_u32)(pos - shand->pos); shand->pos = pos; return FSW_SUCCESS; } // EOF refit-0.14/fsw/fsw_core.h0000644000175000017500000004335510545737746014720 0ustar julienjulien/** * \file fsw_core.h * Core file system wrapper abstraction layer header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * Portions Copyright (c) The Regents of the University of California. * Portions Copyright (c) UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_CORE_H_ #define _FSW_CORE_H_ #include "fsw_base.h" /** Maximum size for a path, specifically symlink target paths. */ #define FSW_PATH_MAX (4096) /** Helper macro for token concatenation. */ #define FSW_CONCAT3(a,b,c) a##b##c /** Expands to the name of a fstype dispatch table (fsw_fstype_table) for a named file system type. */ #define FSW_FSTYPE_TABLE_NAME(t) FSW_CONCAT3(fsw_,t,_table) /** Indicates that the block cache entry is empty. */ #define FSW_INVALID_BNO (~0UL) // // Byte-swapping macros // /** * \name Byte Order Macros * Implements big endian vs. little endian awareness and conversion. */ /*@{*/ typedef fsw_u16 fsw_u16_le; typedef fsw_u16 fsw_u16_be; typedef fsw_u32 fsw_u32_le; typedef fsw_u32 fsw_u32_be; typedef fsw_u64 fsw_u64_le; typedef fsw_u64 fsw_u64_be; #define FSW_SWAPVALUE_U16(v) ((((fsw_u16)(v) & 0xff00) >> 8) | \ (((fsw_u16)(v) & 0x00ff) << 8)) #define FSW_SWAPVALUE_U32(v) ((((fsw_u32)(v) & 0xff000000UL) >> 24) | \ (((fsw_u32)(v) & 0x00ff0000UL) >> 8) | \ (((fsw_u32)(v) & 0x0000ff00UL) << 8) | \ (((fsw_u32)(v) & 0x000000ffUL) << 24)) #define FSW_SWAPVALUE_U64(v) ((((fsw_u64)(v) & 0xff00000000000000ULL) >> 56) | \ (((fsw_u64)(v) & 0x00ff000000000000ULL) >> 40) | \ (((fsw_u64)(v) & 0x0000ff0000000000ULL) >> 24) | \ (((fsw_u64)(v) & 0x000000ff00000000ULL) >> 8) | \ (((fsw_u64)(v) & 0x00000000ff000000ULL) << 8) | \ (((fsw_u64)(v) & 0x0000000000ff0000ULL) << 24) | \ (((fsw_u64)(v) & 0x000000000000ff00ULL) << 40) | \ (((fsw_u64)(v) & 0x00000000000000ffULL) << 56)) #ifdef FSW_LITTLE_ENDIAN #define fsw_u16_le_swap(v) (v) #define fsw_u16_be_swap(v) FSW_SWAPVALUE_U16(v) #define fsw_u32_le_swap(v) (v) #define fsw_u32_be_swap(v) FSW_SWAPVALUE_U32(v) #define fsw_u64_le_swap(v) (v) #define fsw_u64_be_swap(v) FSW_SWAPVALUE_U64(v) #define fsw_u16_le_sip(var) #define fsw_u16_be_sip(var) (var = FSW_SWAPVALUE_U16(var)) #define fsw_u32_le_sip(var) #define fsw_u32_be_sip(var) (var = FSW_SWAPVALUE_U32(var)) #define fsw_u64_le_sip(var) #define fsw_u64_be_sip(var) (var = FSW_SWAPVALUE_U64(var)) #else #ifdef FSW_BIG_ENDIAN #define fsw_u16_le_swap(v) FSW_SWAPVALUE_U16(v) #define fsw_u16_be_swap(v) (v) #define fsw_u32_le_swap(v) FSW_SWAPVALUE_U32(v) #define fsw_u32_be_swap(v) (v) #define fsw_u64_le_swap(v) FSW_SWAPVALUE_U64(v) #define fsw_u64_be_swap(v) (v) #define fsw_u16_le_sip(var) (var = FSW_SWAPVALUE_U16(var)) #define fsw_u16_be_sip(var) #define fsw_u32_le_sip(var) (var = FSW_SWAPVALUE_U32(var)) #define fsw_u32_be_sip(var) #define fsw_u64_le_sip(var) (var = FSW_SWAPVALUE_U64(var)) #define fsw_u64_be_sip(var) #else #fail Neither FSW_BIG_ENDIAN nor FSW_LITTLE_ENDIAN are defined #endif #endif /*@}*/ // // The following evil hack avoids a lot of casts between generic and fstype-specific // structures. // #ifndef VOLSTRUCTNAME #define VOLSTRUCTNAME fsw_volume #else struct VOLSTRUCTNAME; #endif #ifndef DNODESTRUCTNAME #define DNODESTRUCTNAME fsw_dnode #else struct DNODESTRUCTNAME; #endif /** * Status code type, returned from all functions that can fail. */ typedef int fsw_status_t; /** * Possible status codes. */ enum { FSW_SUCCESS, FSW_OUT_OF_MEMORY, FSW_IO_ERROR, FSW_UNSUPPORTED, FSW_NOT_FOUND, FSW_VOLUME_CORRUPTED, FSW_UNKNOWN_ERROR }; /** * Core: A string with explicit length and encoding information. */ struct fsw_string { int type; //!< Encoding of the string - empty, ISO-8859-1, UTF8, UTF16 int len; //!< Length in characters int size; //!< Total data size in bytes void *data; //!< Data pointer (may be NULL if type is EMPTY or len is zero) }; /** * Possible string types / encodings. In the case of FSW_STRING_TYPE_EMPTY, * all other members of the fsw_string structure may be invalid. */ enum { FSW_STRING_TYPE_EMPTY, FSW_STRING_TYPE_ISO88591, FSW_STRING_TYPE_UTF8, FSW_STRING_TYPE_UTF16, FSW_STRING_TYPE_UTF16_SWAPPED }; #ifdef FSW_LITTLE_ENDIAN #define FSW_STRING_TYPE_UTF16_LE FSW_STRING_TYPE_UTF16 #define FSW_STRING_TYPE_UTF16_BE FSW_STRING_TYPE_UTF16_SWAPPED #else #define FSW_STRING_TYPE_UTF16_LE FSW_STRING_TYPE_UTF16_SWAPPED #define FSW_STRING_TYPE_UTF16_BE FSW_STRING_TYPE_UTF16 #endif /** Static initializer for an empty string. */ #define FSW_STRING_INIT { FSW_STRING_TYPE_EMPTY, 0, 0, NULL } /* forward declarations */ struct fsw_dnode; struct fsw_host_table; struct fsw_fstype_table; struct fsw_blockcache { fsw_u32 refcount; //!< Reference count fsw_u32 cache_level; //!< Level of importance of this block fsw_u32 phys_bno; //!< Physical block number void *data; //!< Block data buffer }; /** * Core: Represents a mounted volume. */ struct fsw_volume { fsw_u32 phys_blocksize; //!< Block size for disk access / file system structures fsw_u32 log_blocksize; //!< Block size for logical file data struct DNODESTRUCTNAME *root; //!< Root directory dnode struct fsw_string label; //!< Volume label struct fsw_dnode *dnode_head; //!< List of all dnodes allocated for this volume struct fsw_blockcache *bcache; //!< Array of block cache entries fsw_u32 bcache_size; //!< Number of entries in the block cache array void *host_data; //!< Hook for a host-specific data structure struct fsw_host_table *host_table; //!< Dispatch table for host-specific functions struct fsw_fstype_table *fstype_table; //!< Dispatch table for file system specific functions int host_string_type; //!< String type used by the host environment }; /** * Core: Represents a "directory node" - a file, directory, symlink, whatever. */ struct fsw_dnode { fsw_u32 refcount; //!< Reference count struct VOLSTRUCTNAME *vol; //!< The volume this dnode belongs to struct DNODESTRUCTNAME *parent; //!< Parent directory dnode struct fsw_string name; //!< Name of this item in the parent directory fsw_u32 dnode_id; //!< Unique id number (usually the inode number) int type; //!< Type of the dnode - file, dir, symlink, special fsw_u64 size; //!< Data size in bytes struct fsw_dnode *next; //!< Doubly-linked list of all dnodes: previous dnode struct fsw_dnode *prev; //!< Doubly-linked list of all dnodes: next dnode }; /** * Possible dnode types. FSW_DNODE_TYPE_UNKNOWN may only be used before * fsw_dnode_fill has been called on the dnode. */ enum { FSW_DNODE_TYPE_UNKNOWN, FSW_DNODE_TYPE_FILE, FSW_DNODE_TYPE_DIR, FSW_DNODE_TYPE_SYMLINK, FSW_DNODE_TYPE_SPECIAL }; /** * Core: Stores the mapping of a region of a file to the data on disk. */ struct fsw_extent { int type; //!< Type of extent specification fsw_u32 log_start; //!< Starting logical block number fsw_u32 log_count; //!< Logical block count fsw_u32 phys_start; //!< Starting physical block number (for FSW_EXTENT_TYPE_PHYSBLOCK only) void *buffer; //!< Allocated buffer pointer (for FSW_EXTENT_TYPE_BUFFER only) }; /** * Possible extent representation types. FSW_EXTENT_TYPE_INVALID is for shandle's * internal use only, it must not be returned from a get_extent function. */ enum { FSW_EXTENT_TYPE_INVALID, FSW_EXTENT_TYPE_SPARSE, FSW_EXTENT_TYPE_PHYSBLOCK, FSW_EXTENT_TYPE_BUFFER }; /** * Core: An access structure to a dnode's raw data. There can be multiple * shandles per dnode, each of them has its own position pointer. */ struct fsw_shandle { struct fsw_dnode *dnode; //!< The dnode this handle reads data from fsw_u64 pos; //!< Current file pointer in bytes struct fsw_extent extent; //!< Current extent }; /** * Core: Used in gathering detailed information on a volume. */ struct fsw_volume_stat { fsw_u64 total_bytes; //!< Total size of data area size in bytes fsw_u64 free_bytes; //!< Bytes still available for storing file data }; /** * Core: Used in gathering detailed information on a dnode. */ struct fsw_dnode_stat { fsw_u64 used_bytes; //!< Bytes actually used by the file on disk void (*store_time_posix)(struct fsw_dnode_stat *sb, int which, fsw_u32 posix_time); //!< Callback for storing a Posix-style timestamp void (*store_attr_posix)(struct fsw_dnode_stat *sb, fsw_u16 posix_mode); //!< Callbock for storing a Posix-style file mode void *host_data; //!< Hook for a host-specific data structure }; /** * Type of the timestamp passed into store_time_posix. */ enum { FSW_DNODE_STAT_CTIME, FSW_DNODE_STAT_MTIME, FSW_DNODE_STAT_ATIME }; /** * Core: Function table for a host environment. */ struct fsw_host_table { int native_string_type; //!< String type used by the host environment void (*change_blocksize)(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize); fsw_status_t (*read_block)(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer); }; /** * Core: Function table for a file system driver. */ struct fsw_fstype_table { struct fsw_string name; //!< String giving the name of the file system fsw_u32 volume_struct_size; //!< Size for allocating the fsw_volume structure fsw_u32 dnode_struct_size; //!< Size for allocating the fsw_dnode structure fsw_status_t (*volume_mount)(struct VOLSTRUCTNAME *vol); void (*volume_free)(struct VOLSTRUCTNAME *vol); fsw_status_t (*volume_stat)(struct VOLSTRUCTNAME *vol, struct fsw_volume_stat *sb); fsw_status_t (*dnode_fill)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno); void (*dnode_free)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno); fsw_status_t (*dnode_stat)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno, struct fsw_dnode_stat *sb); fsw_status_t (*get_extent)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno, struct fsw_extent *extent); fsw_status_t (*dir_lookup)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno, struct fsw_string *lookup_name, struct DNODESTRUCTNAME **child_dno); fsw_status_t (*dir_read)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno, struct fsw_shandle *shand, struct DNODESTRUCTNAME **child_dno); fsw_status_t (*readlink)(struct VOLSTRUCTNAME *vol, struct DNODESTRUCTNAME *dno, struct fsw_string *link_target); }; /** * \name Volume Functions */ /*@{*/ fsw_status_t fsw_mount(void *host_data, struct fsw_host_table *host_table, struct fsw_fstype_table *fstype_table, struct fsw_volume **vol_out); void fsw_unmount(struct fsw_volume *vol); fsw_status_t fsw_volume_stat(struct fsw_volume *vol, struct fsw_volume_stat *sb); void fsw_set_blocksize(struct VOLSTRUCTNAME *vol, fsw_u32 phys_blocksize, fsw_u32 log_blocksize); fsw_status_t fsw_block_get(struct VOLSTRUCTNAME *vol, fsw_u32 phys_bno, fsw_u32 cache_level, void **buffer_out); void fsw_block_release(struct VOLSTRUCTNAME *vol, fsw_u32 phys_bno, void *buffer); /*@}*/ /** * \name dnode Functions */ /*@{*/ fsw_status_t fsw_dnode_create_root(struct VOLSTRUCTNAME *vol, fsw_u32 dnode_id, struct DNODESTRUCTNAME **dno_out); fsw_status_t fsw_dnode_create(struct DNODESTRUCTNAME *parent_dno, fsw_u32 dnode_id, int type, struct fsw_string *name, struct DNODESTRUCTNAME **dno_out); void fsw_dnode_retain(struct fsw_dnode *dno); void fsw_dnode_release(struct fsw_dnode *dno); fsw_status_t fsw_dnode_fill(struct fsw_dnode *dno); fsw_status_t fsw_dnode_stat(struct fsw_dnode *dno, struct fsw_dnode_stat *sb); fsw_status_t fsw_dnode_lookup(struct fsw_dnode *dno, struct fsw_string *lookup_name, struct fsw_dnode **child_dno_out); fsw_status_t fsw_dnode_lookup_path(struct fsw_dnode *dno, struct fsw_string *lookup_path, char separator, struct fsw_dnode **child_dno_out); fsw_status_t fsw_dnode_dir_read(struct fsw_shandle *shand, struct fsw_dnode **child_dno_out); fsw_status_t fsw_dnode_readlink(struct fsw_dnode *dno, struct fsw_string *link_target); fsw_status_t fsw_dnode_readlink_data(struct DNODESTRUCTNAME *dno, struct fsw_string *link_target); fsw_status_t fsw_dnode_resolve(struct fsw_dnode *dno, struct fsw_dnode **target_dno_out); /*@}*/ /** * \name shandle Functions */ /*@{*/ fsw_status_t fsw_shandle_open(struct DNODESTRUCTNAME *dno, struct fsw_shandle *shand); void fsw_shandle_close(struct fsw_shandle *shand); fsw_status_t fsw_shandle_read(struct fsw_shandle *shand, fsw_u32 *buffer_size_inout, void *buffer); /*@}*/ /** * \name Memory Functions */ /*@{*/ fsw_status_t fsw_alloc_zero(int len, void **ptr_out); fsw_status_t fsw_memdup(void **dest_out, void *src, int len); /*@}*/ /** * \name String Functions */ /*@{*/ int fsw_strlen(struct fsw_string *s); int fsw_streq(struct fsw_string *s1, struct fsw_string *s2); int fsw_streq_cstr(struct fsw_string *s1, const char *s2); fsw_status_t fsw_strdup_coerce(struct fsw_string *dest, int type, struct fsw_string *src); void fsw_strsplit(struct fsw_string *lookup_name, struct fsw_string *buffer, char separator); void fsw_strfree(struct fsw_string *s); /*@}*/ /** * \name Posix Mode Macros * These macros can be used globally to test fields and bits in * Posix-style modes. * * Taken from FreeBSD sys/stat.h. */ /*@{*/ #ifndef S_IRWXU #define S_ISUID 0004000 /* set user id on execution */ #define S_ISGID 0002000 /* set group id on execution */ #define S_ISTXT 0001000 /* sticky bit */ #define S_IRWXU 0000700 /* RWX mask for owner */ #define S_IRUSR 0000400 /* R for owner */ #define S_IWUSR 0000200 /* W for owner */ #define S_IXUSR 0000100 /* X for owner */ #define S_IRWXG 0000070 /* RWX mask for group */ #define S_IRGRP 0000040 /* R for group */ #define S_IWGRP 0000020 /* W for group */ #define S_IXGRP 0000010 /* X for group */ #define S_IRWXO 0000007 /* RWX mask for other */ #define S_IROTH 0000004 /* R for other */ #define S_IWOTH 0000002 /* W for other */ #define S_IXOTH 0000001 /* X for other */ #define S_IFMT 0170000 /* type of file mask */ #define S_IFIFO 0010000 /* named pipe (fifo) */ #define S_IFCHR 0020000 /* character special */ #define S_IFDIR 0040000 /* directory */ #define S_IFBLK 0060000 /* block special */ #define S_IFREG 0100000 /* regular */ #define S_IFLNK 0120000 /* symbolic link */ #define S_IFSOCK 0140000 /* socket */ #define S_ISVTX 0001000 /* save swapped text even after use */ #define S_IFWHT 0160000 /* whiteout */ #define S_ISDIR(m) (((m) & 0170000) == 0040000) /* directory */ #define S_ISCHR(m) (((m) & 0170000) == 0020000) /* char special */ #define S_ISBLK(m) (((m) & 0170000) == 0060000) /* block special */ #define S_ISREG(m) (((m) & 0170000) == 0100000) /* regular file */ #define S_ISFIFO(m) (((m) & 0170000) == 0010000) /* fifo or socket */ #define S_ISLNK(m) (((m) & 0170000) == 0120000) /* symbolic link */ #define S_ISSOCK(m) (((m) & 0170000) == 0140000) /* socket */ #define S_ISWHT(m) (((m) & 0170000) == 0160000) /* whiteout */ #define S_BLKSIZE 512 /* block size used in the stat struct */ #endif /*@}*/ #endif refit-0.14/fsw/fsw_efi.c0000644000175000017500000011177510463170331014504 0ustar julienjulien/** * \file fsw_efi.c * EFI host environment code. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_efi.h" #define DEBUG_LEVEL 0 #ifndef FSTYPE /** The file system type name to use. */ #define FSTYPE ext2 #endif /** Helper macro for stringification. */ #define FSW_EFI_STRINGIFY(x) L#x /** Expands to the EFI driver name given the file system type name. */ #define FSW_EFI_DRIVER_NAME(t) L"Fsw " FSW_EFI_STRINGIFY(t) L" File System Driver" // function prototypes EFI_STATUS EFIAPI fsw_efi_DriverBinding_Supported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath); EFI_STATUS EFIAPI fsw_efi_DriverBinding_Start(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath); EFI_STATUS EFIAPI fsw_efi_DriverBinding_Stop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer); EFI_STATUS EFIAPI fsw_efi_ComponentName_GetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName); EFI_STATUS EFIAPI fsw_efi_ComponentName_GetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName); void fsw_efi_change_blocksize(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize); fsw_status_t fsw_efi_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer); EFI_STATUS fsw_efi_map_status(fsw_status_t fsw_status, FSW_VOLUME_DATA *Volume); EFI_STATUS EFIAPI fsw_efi_FileSystem_OpenVolume(IN EFI_FILE_IO_INTERFACE *This, OUT EFI_FILE **Root); EFI_STATUS fsw_efi_dnode_to_FileHandle(IN struct fsw_dnode *dno, OUT EFI_FILE **NewFileHandle); EFI_STATUS fsw_efi_file_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS fsw_efi_file_getpos(IN FSW_FILE_DATA *File, OUT UINT64 *Position); EFI_STATUS fsw_efi_file_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position); EFI_STATUS fsw_efi_dir_open(IN FSW_FILE_DATA *File, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes); EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS fsw_efi_dir_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position); EFI_STATUS fsw_efi_dnode_getinfo(IN FSW_FILE_DATA *File, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer); EFI_STATUS fsw_efi_dnode_fill_FileInfo(IN FSW_VOLUME_DATA *Volume, IN struct fsw_dnode *dno, IN OUT UINTN *BufferSize, OUT VOID *Buffer); /** * Interface structure for the EFI Driver Binding protocol. */ EFI_DRIVER_BINDING_PROTOCOL fsw_efi_DriverBinding_table = { fsw_efi_DriverBinding_Supported, fsw_efi_DriverBinding_Start, fsw_efi_DriverBinding_Stop, 0x10, NULL, NULL }; /** * Interface structure for the EFI Component Name protocol. */ EFI_COMPONENT_NAME_PROTOCOL fsw_efi_ComponentName_table = { fsw_efi_ComponentName_GetDriverName, fsw_efi_ComponentName_GetControllerName, "eng" }; /** * Dispatch table for our FSW host driver. */ struct fsw_host_table fsw_efi_host_table = { FSW_STRING_TYPE_UTF16, fsw_efi_change_blocksize, fsw_efi_read_block }; extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(FSTYPE); EFI_DRIVER_ENTRY_POINT(fsw_efi_main) /** * Image entry point. Installs the Driver Binding and Component Name protocols * on the image's handle. Actually mounting a file system is initiated through * the Driver Binding protocol at the firmware's request. */ EFI_STATUS EFIAPI fsw_efi_main(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; InitializeLib(ImageHandle, SystemTable); // complete Driver Binding protocol instance fsw_efi_DriverBinding_table.ImageHandle = ImageHandle; fsw_efi_DriverBinding_table.DriverBindingHandle = ImageHandle; // install Driver Binding protocol Status = BS->InstallProtocolInterface(&fsw_efi_DriverBinding_table.DriverBindingHandle, &DriverBindingProtocol, EFI_NATIVE_INTERFACE, &fsw_efi_DriverBinding_table); if (EFI_ERROR (Status)) { return Status; } // install Component Name protocol Status = BS->InstallProtocolInterface(&fsw_efi_DriverBinding_table.DriverBindingHandle, &ComponentNameProtocol, EFI_NATIVE_INTERFACE, &fsw_efi_ComponentName_table); if (EFI_ERROR (Status)) { return Status; } return EFI_SUCCESS; } /** * Driver Binding EFI protocol, Supported function. This function is called by EFI * to test if this driver can handle a certain device. Our implementation only checks * if the device is a disk (i.e. that it supports the Block I/O and Disk I/O protocols) * and implicitly checks if the disk is already in use by another driver. */ EFI_STATUS EFIAPI fsw_efi_DriverBinding_Supported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) { EFI_STATUS Status; EFI_DISK_IO *DiskIo; // we check for both DiskIO and BlockIO protocols // first, open DiskIO Status = BS->OpenProtocol(ControllerHandle, &DiskIoProtocol, (VOID **) &DiskIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER); if (EFI_ERROR(Status)) return Status; // we were just checking, close it again BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); // next, check BlockIO without actually opening it Status = BS->OpenProtocol(ControllerHandle, &BlockIoProtocol, NULL, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL); return Status; } /** * Driver Binding EFI protocol, Start function. This function is called by EFI * to start driving the given device. It is still possible at this point to * return EFI_UNSUPPORTED, and in fact we will do so if the file system driver * cannot find the superblock signature (or equivalent) that it expects. * * This function allocates memory for a per-volume structure, opens the * required protocols (just Disk I/O in our case, Block I/O is only looked * at to get the MediaId field), and lets the FSW core mount the file system. * If successful, an EFI Simple File System protocol is exported on the * device handle. */ EFI_STATUS EFIAPI fsw_efi_DriverBinding_Start(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath) { EFI_STATUS Status; EFI_BLOCK_IO *BlockIo; EFI_DISK_IO *DiskIo; FSW_VOLUME_DATA *Volume; #if DEBUG_LEVEL Print(L"fsw_efi_DriverBinding_Start\n"); #endif // open consumed protocols Status = BS->OpenProtocol(ControllerHandle, &BlockIoProtocol, (VOID **) &BlockIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL); // NOTE: we only want to look at the MediaId if (EFI_ERROR(Status)) { Print(L"Fsw ERROR: OpenProtocol(BlockIo) returned %x\n", Status); return Status; } Status = BS->OpenProtocol(ControllerHandle, &DiskIoProtocol, (VOID **) &DiskIo, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_BY_DRIVER); if (EFI_ERROR(Status)) { Print(L"Fsw ERROR: OpenProtocol(DiskIo) returned %x\n", Status); return Status; } // allocate volume structure Volume = AllocateZeroPool(sizeof(FSW_VOLUME_DATA)); Volume->Signature = FSW_VOLUME_DATA_SIGNATURE; Volume->Handle = ControllerHandle; Volume->DiskIo = DiskIo; Volume->MediaId = BlockIo->Media->MediaId; Volume->LastIOStatus = EFI_SUCCESS; // mount the filesystem Status = fsw_efi_map_status(fsw_mount(Volume, &fsw_efi_host_table, &FSW_FSTYPE_TABLE_NAME(FSTYPE), &Volume->vol), Volume); if (!EFI_ERROR(Status)) { // register the SimpleFileSystem protocol Volume->FileSystem.Revision = EFI_FILE_IO_INTERFACE_REVISION; Volume->FileSystem.OpenVolume = fsw_efi_FileSystem_OpenVolume; Status = BS->InstallMultipleProtocolInterfaces(&ControllerHandle, &FileSystemProtocol, &Volume->FileSystem, NULL); if (EFI_ERROR(Status)) Print(L"Fsw ERROR: InstallMultipleProtocolInterfaces returned %x\n", Status); } // on errors, close the opened protocols if (EFI_ERROR(Status)) { if (Volume->vol != NULL) fsw_unmount(Volume->vol); FreePool(Volume); BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); } return Status; } /** * Driver Binding EFI protocol, Stop function. This function is called by EFI * to stop the driver on the given device. This translates to an unmount * call for the FSW core. * * We assume that all file handles on the volume have been closed before * the driver is stopped. At least with the EFI shell, that is actually the * case; it closes all file handles between commands. */ EFI_STATUS EFIAPI fsw_efi_DriverBinding_Stop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer) { EFI_STATUS Status; EFI_FILE_IO_INTERFACE *FileSystem; FSW_VOLUME_DATA *Volume; #if DEBUG_LEVEL Print(L"fsw_efi_DriverBinding_Stop\n"); #endif // get the installed SimpleFileSystem interface Status = BS->OpenProtocol(ControllerHandle, &FileSystemProtocol, (VOID **) &FileSystem, This->DriverBindingHandle, ControllerHandle, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) return EFI_UNSUPPORTED; // get private data structure Volume = FSW_VOLUME_FROM_FILE_SYSTEM(FileSystem); // uninstall Simple File System protocol Status = BS->UninstallMultipleProtocolInterfaces(ControllerHandle, &FileSystemProtocol, &Volume->FileSystem, NULL); if (EFI_ERROR(Status)) { Print(L"Fsw ERROR: UninstallMultipleProtocolInterfaces returned %x\n", Status); return Status; } #if DEBUG_LEVEL Print(L"fsw_efi_DriverBinding_Stop: protocol uninstalled successfully\n"); #endif // release private data structure if (Volume->vol != NULL) fsw_unmount(Volume->vol); FreePool(Volume); // close the consumed protocols Status = BS->CloseProtocol(ControllerHandle, &DiskIoProtocol, This->DriverBindingHandle, ControllerHandle); return Status; } /** * Component Name EFI protocol, GetDriverName function. Used by the EFI * environment to inquire the name of this driver. The name returned is * based on the file system type actually used in compilation. */ EFI_STATUS EFIAPI fsw_efi_ComponentName_GetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName) { if (Language == NULL || DriverName == NULL) return EFI_INVALID_PARAMETER; if (Language[0] == 'e' && Language[1] == 'n' && Language[2] == 'g' && Language[3] == 0) { *DriverName = FSW_EFI_DRIVER_NAME(FSTYPE); return EFI_SUCCESS; } return EFI_UNSUPPORTED; } /** * Component Name EFI protocol, GetControllerName function. Not implemented * because this is not a "bus" driver in the sense of the EFI Driver Model. */ EFI_STATUS EFIAPI fsw_efi_ComponentName_GetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName) { return EFI_UNSUPPORTED; } /** * FSW interface function for block size changes. This function is called by the FSW core * when the file system driver changes the block sizes for the volume. */ void fsw_efi_change_blocksize(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize) { // nothing to do } /** * FSW interface function to read data blocks. This function is called by the FSW core * to read a block of data from the device. The buffer is allocated by the core code. */ fsw_status_t fsw_efi_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)vol->host_data; FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_efi_read_block: %d (%d)\n"), phys_bno, vol->phys_blocksize)); // read from disk Status = Volume->DiskIo->ReadDisk(Volume->DiskIo, Volume->MediaId, (UINT64)phys_bno * vol->phys_blocksize, vol->phys_blocksize, buffer); Volume->LastIOStatus = Status; if (EFI_ERROR(Status)) return FSW_IO_ERROR; return FSW_SUCCESS; } /** * Map FSW status codes to EFI status codes. The FSW_IO_ERROR code is only produced * by fsw_efi_read_block, so we map it back to the EFI status code remembered from * the last I/O operation. */ EFI_STATUS fsw_efi_map_status(fsw_status_t fsw_status, FSW_VOLUME_DATA *Volume) { switch (fsw_status) { case FSW_SUCCESS: return EFI_SUCCESS; case FSW_OUT_OF_MEMORY: return EFI_VOLUME_CORRUPTED; case FSW_IO_ERROR: return Volume->LastIOStatus; case FSW_UNSUPPORTED: return EFI_UNSUPPORTED; case FSW_NOT_FOUND: return EFI_NOT_FOUND; case FSW_VOLUME_CORRUPTED: return EFI_VOLUME_CORRUPTED; default: return EFI_DEVICE_ERROR; } } /** * File System EFI protocol, OpenVolume function. Creates a file handle for * the root directory and returns it. Note that this function may be called * multiple times and returns a new file handle each time. Each returned * handle is closed by the client using it. */ EFI_STATUS EFIAPI fsw_efi_FileSystem_OpenVolume(IN EFI_FILE_IO_INTERFACE *This, OUT EFI_FILE **Root) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = FSW_VOLUME_FROM_FILE_SYSTEM(This); #if DEBUG_LEVEL Print(L"fsw_efi_FileSystem_OpenVolume\n"); #endif Status = fsw_efi_dnode_to_FileHandle(Volume->vol->root, Root); return Status; } /** * File Handle EFI protocol, Open function. Dispatches the call * based on the kind of file handle. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Open(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); if (File->Type == FSW_EFI_FILE_TYPE_DIR) return fsw_efi_dir_open(File, NewHandle, FileName, OpenMode, Attributes); // not supported for regular files return EFI_UNSUPPORTED; } /** * File Handle EFI protocol, Close function. Closes the FSW shandle * and frees the memory used for the structure. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Close(IN EFI_FILE *This) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); #if DEBUG_LEVEL Print(L"fsw_efi_FileHandle_Close\n"); #endif fsw_shandle_close(&File->shand); FreePool(File); return EFI_SUCCESS; } /** * File Handle EFI protocol, Delete function. Calls through to Close * and returns a warning because this driver is read-only. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Delete(IN EFI_FILE *This) { EFI_STATUS Status; Status = This->Close(This); if (Status == EFI_SUCCESS) { // this driver is read-only Status = EFI_WARN_DELETE_FAILURE; } return Status; } /** * File Handle EFI protocol, Read function. Dispatches the call * based on the kind of file handle. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Read(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); if (File->Type == FSW_EFI_FILE_TYPE_FILE) return fsw_efi_file_read(File, BufferSize, Buffer); else if (File->Type == FSW_EFI_FILE_TYPE_DIR) return fsw_efi_dir_read(File, BufferSize, Buffer); return EFI_UNSUPPORTED; } /** * File Handle EFI protocol, Write function. Returns unsupported status * because this driver is read-only. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Write(IN EFI_FILE *This, IN OUT UINTN *BufferSize, IN VOID *Buffer) { // this driver is read-only return EFI_WRITE_PROTECTED; } /** * File Handle EFI protocol, GetPosition function. Dispatches the call * based on the kind of file handle. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_GetPosition(IN EFI_FILE *This, OUT UINT64 *Position) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); if (File->Type == FSW_EFI_FILE_TYPE_FILE) return fsw_efi_file_getpos(File, Position); // not defined for directories return EFI_UNSUPPORTED; } /** * File Handle EFI protocol, SetPosition function. Dispatches the call * based on the kind of file handle. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_SetPosition(IN EFI_FILE *This, IN UINT64 Position) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); if (File->Type == FSW_EFI_FILE_TYPE_FILE) return fsw_efi_file_setpos(File, Position); else if (File->Type == FSW_EFI_FILE_TYPE_DIR) return fsw_efi_dir_setpos(File, Position); return EFI_UNSUPPORTED; } /** * File Handle EFI protocol, GetInfo function. Dispatches to the common * function implementing this. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_GetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { FSW_FILE_DATA *File = FSW_FILE_FROM_FILE_HANDLE(This); return fsw_efi_dnode_getinfo(File, InformationType, BufferSize, Buffer); } /** * File Handle EFI protocol, SetInfo function. Returns unsupported status * because this driver is read-only. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_SetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer) { // this driver is read-only return EFI_WRITE_PROTECTED; } /** * File Handle EFI protocol, Flush function. Returns unsupported status * because this driver is read-only. */ EFI_STATUS EFIAPI fsw_efi_FileHandle_Flush(IN EFI_FILE *This) { // this driver is read-only return EFI_WRITE_PROTECTED; } /** * Set up a file handle for a dnode. This function allocates a data structure * for a file handle, opens a FSW shandle and populates the EFI_FILE structure * with the interface functions. */ EFI_STATUS fsw_efi_dnode_to_FileHandle(IN struct fsw_dnode *dno, OUT EFI_FILE **NewFileHandle) { EFI_STATUS Status; FSW_FILE_DATA *File; // make sure the dnode has complete info Status = fsw_efi_map_status(fsw_dnode_fill(dno), (FSW_VOLUME_DATA *)dno->vol->host_data); if (EFI_ERROR(Status)) return Status; // check type if (dno->type != FSW_DNODE_TYPE_FILE && dno->type != FSW_DNODE_TYPE_DIR) return EFI_UNSUPPORTED; // allocate file structure File = AllocateZeroPool(sizeof(FSW_FILE_DATA)); File->Signature = FSW_FILE_DATA_SIGNATURE; if (dno->type == FSW_DNODE_TYPE_FILE) File->Type = FSW_EFI_FILE_TYPE_FILE; else if (dno->type == FSW_DNODE_TYPE_DIR) File->Type = FSW_EFI_FILE_TYPE_DIR; // open shandle Status = fsw_efi_map_status(fsw_shandle_open(dno, &File->shand), (FSW_VOLUME_DATA *)dno->vol->host_data); if (EFI_ERROR(Status)) { FreePool(File); return Status; } // populate the file handle File->FileHandle.Revision = EFI_FILE_HANDLE_REVISION; File->FileHandle.Open = fsw_efi_FileHandle_Open; File->FileHandle.Close = fsw_efi_FileHandle_Close; File->FileHandle.Delete = fsw_efi_FileHandle_Delete; File->FileHandle.Read = fsw_efi_FileHandle_Read; File->FileHandle.Write = fsw_efi_FileHandle_Write; File->FileHandle.GetPosition = fsw_efi_FileHandle_GetPosition; File->FileHandle.SetPosition = fsw_efi_FileHandle_SetPosition; File->FileHandle.GetInfo = fsw_efi_FileHandle_GetInfo; File->FileHandle.SetInfo = fsw_efi_FileHandle_SetInfo; File->FileHandle.Flush = fsw_efi_FileHandle_Flush; *NewFileHandle = &File->FileHandle; return EFI_SUCCESS; } /** * Data read function for regular files. Calls through to fsw_shandle_read. */ EFI_STATUS fsw_efi_file_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; fsw_u32 buffer_size; #if DEBUG_LEVEL Print(L"fsw_efi_file_read %d bytes\n", *BufferSize); #endif buffer_size = *BufferSize; Status = fsw_efi_map_status(fsw_shandle_read(&File->shand, &buffer_size, Buffer), (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data); *BufferSize = buffer_size; return Status; } /** * Get file position for regular files. */ EFI_STATUS fsw_efi_file_getpos(IN FSW_FILE_DATA *File, OUT UINT64 *Position) { *Position = File->shand.pos; return EFI_SUCCESS; } /** * Set file position for regular files. EFI specifies the all-ones value * to be a special value for the end of the file. */ EFI_STATUS fsw_efi_file_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position) { if (Position == 0xFFFFFFFFFFFFFFFFULL) File->shand.pos = File->shand.dnode->size; else File->shand.pos = Position; return EFI_SUCCESS; } /** * Open function used to open new file handles relative to a directory. * In EFI, the "open file" function is implemented by directory file handles * and is passed a relative or volume-absolute path to the file or directory * to open. We use fsw_dnode_lookup_path to find the node plus an additional * call to fsw_dnode_resolve because EFI has no concept of symbolic links. */ EFI_STATUS fsw_efi_dir_open(IN FSW_FILE_DATA *File, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data; struct fsw_dnode *dno; struct fsw_dnode *target_dno; struct fsw_string lookup_path; #if DEBUG_LEVEL Print(L"fsw_efi_dir_open: '%s'\n", FileName); #endif if (OpenMode != EFI_FILE_MODE_READ) return EFI_WRITE_PROTECTED; lookup_path.type = FSW_STRING_TYPE_UTF16; lookup_path.len = StrLen(FileName); lookup_path.size = lookup_path.len * sizeof(fsw_u16); lookup_path.data = FileName; // resolve the path (symlinks along the way are automatically resolved) Status = fsw_efi_map_status(fsw_dnode_lookup_path(File->shand.dnode, &lookup_path, '\\', &dno), Volume); if (EFI_ERROR(Status)) return Status; // if the final node is a symlink, also resolve it Status = fsw_efi_map_status(fsw_dnode_resolve(dno, &target_dno), Volume); fsw_dnode_release(dno); if (EFI_ERROR(Status)) return Status; dno = target_dno; // make a new EFI handle for the target dnode Status = fsw_efi_dnode_to_FileHandle(dno, NewHandle); fsw_dnode_release(dno); return Status; } /** * Read function for directories. A file handle read on a directory retrieves * the next directory entry. */ EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data; struct fsw_dnode *dno; #if DEBUG_LEVEL Print(L"fsw_efi_dir_read...\n"); #endif // read the next entry Status = fsw_efi_map_status(fsw_dnode_dir_read(&File->shand, &dno), Volume); if (Status == EFI_NOT_FOUND) { // end of directory *BufferSize = 0; #if DEBUG_LEVEL Print(L"...no more entries\n"); #endif return EFI_SUCCESS; } if (EFI_ERROR(Status)) return Status; // get info into buffer Status = fsw_efi_dnode_fill_FileInfo(Volume, dno, BufferSize, Buffer); fsw_dnode_release(dno); return Status; } /** * Set file position for directories. The only allowed set position operation * for directories is to rewind the directory completely by setting the * position to zero. */ EFI_STATUS fsw_efi_dir_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position) { if (Position == 0) { File->shand.pos = 0; return EFI_SUCCESS; } else { // directories can only rewind to the start return EFI_UNSUPPORTED; } } /** * Get file or volume information. This function implements the GetInfo call * for all file handles. Control is dispatched according to the type of information * requested by the caller. */ EFI_STATUS fsw_efi_dnode_getinfo(IN FSW_FILE_DATA *File, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data; EFI_FILE_SYSTEM_INFO *FSInfo; UINTN RequiredSize; struct fsw_volume_stat vsb; if (CompareGuid(InformationType, &GenericFileInfo) == 0) { #if DEBUG_LEVEL Print(L"fsw_efi_dnode_getinfo: FILE_INFO\n"); #endif Status = fsw_efi_dnode_fill_FileInfo(Volume, File->shand.dnode, BufferSize, Buffer); } else if (CompareGuid(InformationType, &FileSystemInfo) == 0) { #if DEBUG_LEVEL Print(L"fsw_efi_dnode_getinfo: FILE_SYSTEM_INFO\n"); #endif // check buffer size RequiredSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + fsw_efi_strsize(&Volume->vol->label); if (*BufferSize < RequiredSize) { *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure FSInfo = (EFI_FILE_SYSTEM_INFO *)Buffer; FSInfo->Size = RequiredSize; FSInfo->ReadOnly = TRUE; FSInfo->BlockSize = Volume->vol->log_blocksize; fsw_efi_strcpy(FSInfo->VolumeLabel, &Volume->vol->label); // get the missing info from the fs driver ZeroMem(&vsb, sizeof(struct fsw_volume_stat)); Status = fsw_efi_map_status(fsw_volume_stat(Volume->vol, &vsb), Volume); if (EFI_ERROR(Status)) return Status; FSInfo->VolumeSize = vsb.total_bytes; FSInfo->FreeSpace = vsb.free_bytes; // prepare for return *BufferSize = RequiredSize; Status = EFI_SUCCESS; } else if (CompareGuid(InformationType, &FileSystemVolumeLabelInfo) == 0) { #if DEBUG_LEVEL Print(L"fsw_efi_dnode_getinfo: FILE_SYSTEM_VOLUME_LABEL\n"); #endif // check buffer size RequiredSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + fsw_efi_strsize(&Volume->vol->label); if (*BufferSize < RequiredSize) { *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // copy volume label fsw_efi_strcpy(((EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *)Buffer)->VolumeLabel, &Volume->vol->label); // prepare for return *BufferSize = RequiredSize; Status = EFI_SUCCESS; } else { Status = EFI_UNSUPPORTED; } return Status; } /** * Time mapping callback for the fsw_dnode_stat call. This function converts * a Posix style timestamp into an EFI_TIME structure and writes it to the * appropriate member of the EFI_FILE_INFO structure that we're filling. */ static void fsw_efi_store_time_posix(struct fsw_dnode_stat *sb, int which, fsw_u32 posix_time) { EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data; if (which == FSW_DNODE_STAT_CTIME) fsw_efi_decode_time(&FileInfo->CreateTime, posix_time); else if (which == FSW_DNODE_STAT_MTIME) fsw_efi_decode_time(&FileInfo->ModificationTime, posix_time); else if (which == FSW_DNODE_STAT_ATIME) fsw_efi_decode_time(&FileInfo->LastAccessTime, posix_time); } /** * Mode mapping callback for the fsw_dnode_stat call. This function looks at * the Posix mode passed by the file system driver and makes appropriate * adjustments to the EFI_FILE_INFO structure that we're filling. */ static void fsw_efi_store_attr_posix(struct fsw_dnode_stat *sb, fsw_u16 posix_mode) { EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data; if ((posix_mode & S_IWUSR) == 0) FileInfo->Attribute |= EFI_FILE_READ_ONLY; } /** * Common function to fill an EFI_FILE_INFO with information about a dnode. */ EFI_STATUS fsw_efi_dnode_fill_FileInfo(IN FSW_VOLUME_DATA *Volume, IN struct fsw_dnode *dno, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EFI_FILE_INFO *FileInfo; UINTN RequiredSize; struct fsw_dnode_stat sb; // make sure the dnode has complete info Status = fsw_efi_map_status(fsw_dnode_fill(dno), Volume); if (EFI_ERROR(Status)) return Status; // TODO: check/assert that the dno's name is in UTF16 // check buffer size RequiredSize = SIZE_OF_EFI_FILE_INFO + fsw_efi_strsize(&dno->name); if (*BufferSize < RequiredSize) { // TODO: wind back the directory in this case #if DEBUG_LEVEL Print(L"...BUFFER TOO SMALL\n"); #endif *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure ZeroMem(Buffer, RequiredSize); FileInfo = (EFI_FILE_INFO *)Buffer; FileInfo->Size = RequiredSize; FileInfo->FileSize = dno->size; FileInfo->Attribute = 0; if (dno->type == FSW_DNODE_TYPE_DIR) FileInfo->Attribute |= EFI_FILE_DIRECTORY; fsw_efi_strcpy(FileInfo->FileName, &dno->name); // get the missing info from the fs driver ZeroMem(&sb, sizeof(struct fsw_dnode_stat)); sb.store_time_posix = fsw_efi_store_time_posix; sb.store_attr_posix = fsw_efi_store_attr_posix; sb.host_data = FileInfo; Status = fsw_efi_map_status(fsw_dnode_stat(dno, &sb), Volume); if (EFI_ERROR(Status)) return Status; FileInfo->PhysicalSize = sb.used_bytes; // prepare for return *BufferSize = RequiredSize; #if DEBUG_LEVEL Print(L"...returning '%s'\n", FileInfo->FileName); #endif return EFI_SUCCESS; } // EOF refit-0.14/fsw/fsw_efi.h0000644000175000017500000000730010463170331014475 0ustar julienjulien/** * \file fsw_efi.h * EFI host environment header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_EFI_H_ #define _FSW_EFI_H_ #include "fsw_core.h" /** * EFI Host: Private per-volume structure. */ typedef struct { UINT64 Signature; //!< Used to identify this structure EFI_FILE_IO_INTERFACE FileSystem; //!< Published EFI protocol interface structure EFI_HANDLE Handle; //!< The device handle the protocol is attached to EFI_DISK_IO *DiskIo; //!< The Disk I/O protocol we use for disk access UINT32 MediaId; //!< The media ID from the Block I/O protocol EFI_STATUS LastIOStatus; //!< Last status from Disk I/O struct fsw_volume *vol; //!< FSW volume structure } FSW_VOLUME_DATA; /** Signature for the volume structure. */ #define FSW_VOLUME_DATA_SIGNATURE EFI_SIGNATURE_32 ('f', 's', 'w', 'V') /** Access macro for the volume structure. */ #define FSW_VOLUME_FROM_FILE_SYSTEM(a) CR (a, FSW_VOLUME_DATA, FileSystem, FSW_VOLUME_DATA_SIGNATURE) /** * EFI Host: Private structure for a EFI_FILE interface. */ typedef struct { UINT64 Signature; //!< Used to identify this structure EFI_FILE FileHandle; //!< Published EFI protocol interface structure UINTN Type; //!< File type used for dispatchinng struct fsw_shandle shand; //!< FSW handle for this file } FSW_FILE_DATA; /** File type: regular file. */ #define FSW_EFI_FILE_TYPE_FILE (0) /** File type: directory. */ #define FSW_EFI_FILE_TYPE_DIR (1) /** Signature for the file handle structure. */ #define FSW_FILE_DATA_SIGNATURE EFI_SIGNATURE_32 ('f', 's', 'w', 'F') /** Access macro for the file handle structure. */ #define FSW_FILE_FROM_FILE_HANDLE(a) CR (a, FSW_FILE_DATA, FileHandle, FSW_FILE_DATA_SIGNATURE) // // Library functions // VOID fsw_efi_decode_time(OUT EFI_TIME *EfiTime, IN UINT32 UnixTime); UINTN fsw_efi_strsize(struct fsw_string *s); VOID fsw_efi_strcpy(CHAR16 *Dest, struct fsw_string *src); #endif refit-0.14/fsw/fsw_efi_base.h0000644000175000017500000000505210545737746015515 0ustar julienjulien/** * \file fsw_efi_base.h * Base definitions for the EFI host environment. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_EFI_BASE_H_ #define _FSW_EFI_BASE_H_ #include #include #define FSW_LITTLE_ENDIAN (1) // types, reuse EFI types typedef INT8 fsw_s8; typedef UINT8 fsw_u8; typedef INT16 fsw_s16; typedef UINT16 fsw_u16; typedef INT32 fsw_s32; typedef UINT32 fsw_u32; typedef INT64 fsw_s64; typedef UINT64 fsw_u64; // allocation functions #define fsw_alloc(size, ptrptr) (((*(ptrptr) = AllocatePool(size)) == NULL) ? FSW_OUT_OF_MEMORY : FSW_SUCCESS) #define fsw_free(ptr) FreePool(ptr) // memory functions #define fsw_memzero(dest,size) ZeroMem(dest,size) #define fsw_memcpy(dest,src,size) CopyMem(dest,src,size) #define fsw_memeq(p1,p2,size) (CompareMem(p1,p2,size) == 0) // message printing #define FSW_MSGSTR(s) L##s #define FSW_MSGFUNC Print // 64-bit hooks #define FSW_U64_SHR(val,shiftbits) RShiftU64((val), (shiftbits)) #define FSW_U64_DIV(val,divisor) DivU64x32((val), (divisor), NULL) #endif refit-0.14/fsw/fsw_efi_lib.c0000644000175000017500000001002110454216157015317 0ustar julienjulien/** * \file fsw_efi_lib.c * EFI host environment library functions. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_efi.h" // // time conversion // // Adopted from public domain code in FreeBSD libc. // #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) #define MONSPERYEAR 12 #define EPOCH_YEAR 1970 #define EPOCH_WDAY TM_THURSDAY #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) #define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) static const int mon_lengths[2][MONSPERYEAR] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; static const int year_lengths[2] = { DAYSPERNYEAR, DAYSPERLYEAR }; VOID fsw_efi_decode_time(OUT EFI_TIME *EfiTime, IN UINT32 UnixTime) { long days, rem; int y, newy, yleap; const int *ip; ZeroMem(EfiTime, sizeof(EFI_TIME)); days = UnixTime / SECSPERDAY; rem = UnixTime % SECSPERDAY; EfiTime->Hour = (int) (rem / SECSPERHOUR); rem = rem % SECSPERHOUR; EfiTime->Minute = (int) (rem / SECSPERMIN); EfiTime->Second = (int) (rem % SECSPERMIN); y = EPOCH_YEAR; while (days < 0 || days >= (long) year_lengths[yleap = isleap(y)]) { newy = y + days / DAYSPERNYEAR; if (days < 0) --newy; days -= (newy - y) * DAYSPERNYEAR + LEAPS_THRU_END_OF(newy - 1) - LEAPS_THRU_END_OF(y - 1); y = newy; } EfiTime->Year = y; ip = mon_lengths[yleap]; for (EfiTime->Month = 0; days >= (long) ip[EfiTime->Month]; ++(EfiTime->Month)) days = days - (long) ip[EfiTime->Month]; EfiTime->Month++; // adjust range to EFI conventions EfiTime->Day = (int) (days + 1); } // // String functions, used for file and volume info // UINTN fsw_efi_strsize(struct fsw_string *s) { if (s->type == FSW_STRING_TYPE_EMPTY) return sizeof(CHAR16); return (s->len + 1) * sizeof(CHAR16); } VOID fsw_efi_strcpy(CHAR16 *Dest, struct fsw_string *src) { if (src->type == FSW_STRING_TYPE_EMPTY) { Dest[0] = 0; } else if (src->type == FSW_STRING_TYPE_UTF16) { CopyMem(Dest, src->data, src->size); Dest[src->len] = 0; } else { // TODO: coerce, recurse Dest[0] = 0; } } // EOF refit-0.14/fsw/fsw_ext2.c0000644000175000017500000004725110505533606014625 0ustar julienjulien/** * \file fsw_ext2.c * ext2 file system driver code. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "fsw_ext2.h" // functions static fsw_status_t fsw_ext2_volume_mount(struct fsw_ext2_volume *vol); static void fsw_ext2_volume_free(struct fsw_ext2_volume *vol); static fsw_status_t fsw_ext2_volume_stat(struct fsw_ext2_volume *vol, struct fsw_volume_stat *sb); static fsw_status_t fsw_ext2_dnode_fill(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno); static void fsw_ext2_dnode_free(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno); static fsw_status_t fsw_ext2_dnode_stat(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_dnode_stat *sb); static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_extent *extent); static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *lookup_name, struct fsw_ext2_dnode **child_dno); static fsw_status_t fsw_ext2_dir_read(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_shandle *shand, struct fsw_ext2_dnode **child_dno); static fsw_status_t fsw_ext2_read_dentry(struct fsw_shandle *shand, struct ext2_dir_entry *entry); static fsw_status_t fsw_ext2_readlink(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *link); // // Dispatch Table // struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(ext2) = { { FSW_STRING_TYPE_ISO88591, 4, 4, "ext2" }, sizeof(struct fsw_ext2_volume), sizeof(struct fsw_ext2_dnode), fsw_ext2_volume_mount, fsw_ext2_volume_free, fsw_ext2_volume_stat, fsw_ext2_dnode_fill, fsw_ext2_dnode_free, fsw_ext2_dnode_stat, fsw_ext2_get_extent, fsw_ext2_dir_lookup, fsw_ext2_dir_read, fsw_ext2_readlink, }; /** * Mount an ext2 volume. Reads the superblock and constructs the * root directory dnode. */ static fsw_status_t fsw_ext2_volume_mount(struct fsw_ext2_volume *vol) { fsw_status_t status; void *buffer; fsw_u32 blocksize; fsw_u32 groupcnt, groupno, gdesc_per_block, gdesc_bno, gdesc_index; struct ext2_group_desc *gdesc; int i; struct fsw_string s; // allocate memory to keep the superblock around status = fsw_alloc(sizeof(struct ext2_super_block), &vol->sb); if (status) return status; // read the superblock into its buffer fsw_set_blocksize(vol, EXT2_SUPERBLOCK_BLOCKSIZE, EXT2_SUPERBLOCK_BLOCKSIZE); status = fsw_block_get(vol, EXT2_SUPERBLOCK_BLOCKNO, 0, &buffer); if (status) return status; fsw_memcpy(vol->sb, buffer, sizeof(struct ext2_super_block)); fsw_block_release(vol, EXT2_SUPERBLOCK_BLOCKNO, buffer); // check the superblock if (vol->sb->s_magic != EXT2_SUPER_MAGIC) return FSW_UNSUPPORTED; if (vol->sb->s_rev_level != EXT2_GOOD_OLD_REV && vol->sb->s_rev_level != EXT2_DYNAMIC_REV) return FSW_UNSUPPORTED; if (vol->sb->s_rev_level == EXT2_DYNAMIC_REV && (vol->sb->s_feature_incompat & ~(EXT2_FEATURE_INCOMPAT_FILETYPE | EXT3_FEATURE_INCOMPAT_RECOVER))) return FSW_UNSUPPORTED; /* if (vol->sb->s_rev_level == EXT2_DYNAMIC_REV && (vol->sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_RECOVER)) Print(L"Ext2 WARNING: This ext3 file system needs recovery, trying to use it anyway.\n"); */ // set real blocksize blocksize = EXT2_BLOCK_SIZE(vol->sb); fsw_set_blocksize(vol, blocksize, blocksize); // get other info from superblock vol->ind_bcnt = EXT2_ADDR_PER_BLOCK(vol->sb); vol->dind_bcnt = vol->ind_bcnt * vol->ind_bcnt; vol->inode_size = EXT2_INODE_SIZE(vol->sb); for (i = 0; i < 16; i++) if (vol->sb->s_volume_name[i] == 0) break; s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = i; s.data = vol->sb->s_volume_name; status = fsw_strdup_coerce(&vol->g.label, vol->g.host_string_type, &s); if (status) return status; // read the group descriptors to get inode table offsets groupcnt = ((vol->sb->s_inodes_count - 2) / vol->sb->s_inodes_per_group) + 1; gdesc_per_block = (vol->g.phys_blocksize / sizeof(struct ext2_group_desc)); status = fsw_alloc(sizeof(fsw_u32) * groupcnt, &vol->inotab_bno); if (status) return status; for (groupno = 0; groupno < groupcnt; groupno++) { // get the block group descriptor gdesc_bno = (vol->sb->s_first_data_block + 1) + groupno / gdesc_per_block; gdesc_index = groupno % gdesc_per_block; status = fsw_block_get(vol, gdesc_bno, 1, (void **)&buffer); if (status) return status; gdesc = ((struct ext2_group_desc *)(buffer)) + gdesc_index; vol->inotab_bno[groupno] = gdesc->bg_inode_table; fsw_block_release(vol, gdesc_bno, buffer); } // setup the root dnode status = fsw_dnode_create_root(vol, EXT2_ROOT_INO, &vol->g.root); if (status) return status; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_ext2_volume_mount: success, blocksize %d\n"), blocksize)); return FSW_SUCCESS; } /** * Free the volume data structure. Called by the core after an unmount or after * an unsuccessful mount to release the memory used by the file system type specific * part of the volume structure. */ static void fsw_ext2_volume_free(struct fsw_ext2_volume *vol) { if (vol->sb) fsw_free(vol->sb); if (vol->inotab_bno) fsw_free(vol->inotab_bno); } /** * Get in-depth information on a volume. */ static fsw_status_t fsw_ext2_volume_stat(struct fsw_ext2_volume *vol, struct fsw_volume_stat *sb) { sb->total_bytes = (fsw_u64)vol->sb->s_blocks_count * vol->g.log_blocksize; sb->free_bytes = (fsw_u64)vol->sb->s_free_blocks_count * vol->g.log_blocksize; return FSW_SUCCESS; } /** * Get full information on a dnode from disk. This function is called by the core * whenever it needs to access fields in the dnode structure that may not * be filled immediately upon creation of the dnode. In the case of ext2, we * delay fetching of the inode structure until dnode_fill is called. The size and * type fields are invalid until this function has been called. */ static fsw_status_t fsw_ext2_dnode_fill(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno) { fsw_status_t status; fsw_u32 groupno, ino_in_group, ino_bno, ino_index; fsw_u8 *buffer; if (dno->raw) return FSW_SUCCESS; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_ext2_dnode_fill: inode %d\n"), dno->g.dnode_id)); // read the inode block groupno = (dno->g.dnode_id - 1) / vol->sb->s_inodes_per_group; ino_in_group = (dno->g.dnode_id - 1) % vol->sb->s_inodes_per_group; ino_bno = vol->inotab_bno[groupno] + ino_in_group / (vol->g.phys_blocksize / vol->inode_size); ino_index = ino_in_group % (vol->g.phys_blocksize / vol->inode_size); status = fsw_block_get(vol, ino_bno, 2, (void **)&buffer); if (status) return status; // keep our inode around status = fsw_memdup((void **)&dno->raw, buffer + ino_index * vol->inode_size, vol->inode_size); fsw_block_release(vol, ino_bno, buffer); if (status) return status; // get info from the inode dno->g.size = dno->raw->i_size; // TODO: check docs for 64-bit sized files if (S_ISREG(dno->raw->i_mode)) dno->g.type = FSW_DNODE_TYPE_FILE; else if (S_ISDIR(dno->raw->i_mode)) dno->g.type = FSW_DNODE_TYPE_DIR; else if (S_ISLNK(dno->raw->i_mode)) dno->g.type = FSW_DNODE_TYPE_SYMLINK; else dno->g.type = FSW_DNODE_TYPE_SPECIAL; return FSW_SUCCESS; } /** * Free the dnode data structure. Called by the core when deallocating a dnode * structure to release the memory used by the file system type specific part * of the dnode structure. */ static void fsw_ext2_dnode_free(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno) { if (dno->raw) fsw_free(dno->raw); } /** * Get in-depth information on a dnode. The core makes sure that fsw_ext2_dnode_fill * has been called on the dnode before this function is called. Note that some * data is not directly stored into the structure, but passed to a host-specific * callback that converts it to the host-specific format. */ static fsw_status_t fsw_ext2_dnode_stat(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_dnode_stat *sb) { sb->used_bytes = dno->raw->i_blocks * 512; // very, very strange... sb->store_time_posix(sb, FSW_DNODE_STAT_CTIME, dno->raw->i_ctime); sb->store_time_posix(sb, FSW_DNODE_STAT_ATIME, dno->raw->i_atime); sb->store_time_posix(sb, FSW_DNODE_STAT_MTIME, dno->raw->i_mtime); sb->store_attr_posix(sb, dno->raw->i_mode); return FSW_SUCCESS; } /** * Retrieve file data mapping information. This function is called by the core when * fsw_shandle_read needs to know where on the disk the required piece of the file's * data can be found. The core makes sure that fsw_ext2_dnode_fill has been called * on the dnode before. Our task here is to get the physical disk block number for * the requested logical block number. * * The ext2 file system does not use extents, but stores a list of block numbers * using the usual direct, indirect, double-indirect, triple-indirect scheme. To * optimize access, this function checks if the following file blocks are mapped * to consecutive disk blocks and returns a combined extent if possible. */ static fsw_status_t fsw_ext2_get_extent(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_extent *extent) { fsw_status_t status; fsw_u32 bno, release_bno, buf_bcnt, file_bcnt; fsw_u32 *buffer; int path[5], i; // Preconditions: The caller has checked that the requested logical block // is within the file's size. The dnode has complete information, i.e. // fsw_ext2_dnode_read_info was called successfully on it. extent->type = FSW_EXTENT_TYPE_PHYSBLOCK; extent->log_count = 1; bno = extent->log_start; // try direct block pointers in the inode if (bno < EXT2_NDIR_BLOCKS) { path[0] = bno; path[1] = -1; } else { bno -= EXT2_NDIR_BLOCKS; // try indirect block if (bno < vol->ind_bcnt) { path[0] = EXT2_IND_BLOCK; path[1] = bno; path[2] = -1; } else { bno -= vol->ind_bcnt; // try double-indirect block if (bno < vol->dind_bcnt) { path[0] = EXT2_DIND_BLOCK; path[1] = bno / vol->ind_bcnt; path[2] = bno % vol->ind_bcnt; path[3] = -1; } else { bno -= vol->dind_bcnt; // use the triple-indirect block path[0] = EXT2_TIND_BLOCK; path[1] = bno / vol->dind_bcnt; path[2] = (bno / vol->ind_bcnt) % vol->ind_bcnt; path[3] = bno % vol->ind_bcnt; path[4] = -1; } } } // follow the indirection path buffer = dno->raw->i_block; buf_bcnt = EXT2_NDIR_BLOCKS; release_bno = 0; for (i = 0; ; i++) { bno = buffer[path[i]]; if (bno == 0) { extent->type = FSW_EXTENT_TYPE_SPARSE; if (release_bno) fsw_block_release(vol, release_bno, buffer); return FSW_SUCCESS; } if (path[i+1] < 0) break; if (release_bno) fsw_block_release(vol, release_bno, buffer); status = fsw_block_get(vol, bno, 1, (void **)&buffer); if (status) return status; release_bno = bno; buf_bcnt = vol->ind_bcnt; } extent->phys_start = bno; // check if the following blocks can be aggregated into one extent file_bcnt = (fsw_u32)((dno->g.size + vol->g.log_blocksize - 1) & (vol->g.log_blocksize - 1)); while (path[i] + extent->log_count < buf_bcnt && // indirect block has more block pointers extent->log_start + extent->log_count < file_bcnt) { // file has more blocks if (buffer[path[i] + extent->log_count] == buffer[path[i] + extent->log_count - 1] + 1) extent->log_count++; else break; } if (release_bno) fsw_block_release(vol, release_bno, buffer); return FSW_SUCCESS; } /** * Lookup a directory's child dnode by name. This function is called on a directory * to retrieve the directory entry with the given name. A dnode is constructed for * this entry and returned. The core makes sure that fsw_ext2_dnode_fill has been called * and the dnode is actually a directory. */ static fsw_status_t fsw_ext2_dir_lookup(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *lookup_name, struct fsw_ext2_dnode **child_dno_out) { fsw_status_t status; struct fsw_shandle shand; fsw_u32 child_ino; struct ext2_dir_entry entry; struct fsw_string entry_name; // Preconditions: The caller has checked that dno is a directory node. entry_name.type = FSW_STRING_TYPE_ISO88591; // setup handle to read the directory status = fsw_shandle_open(dno, &shand); if (status) return status; // scan the directory for the file child_ino = 0; while (child_ino == 0) { // read next entry status = fsw_ext2_read_dentry(&shand, &entry); if (status) goto errorexit; if (entry.inode == 0) { // end of directory reached status = FSW_NOT_FOUND; goto errorexit; } // compare name entry_name.len = entry_name.size = entry.name_len; entry_name.data = entry.name; if (fsw_streq(lookup_name, &entry_name)) { child_ino = entry.inode; break; } } // setup a dnode for the child item status = fsw_dnode_create(dno, child_ino, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); errorexit: fsw_shandle_close(&shand); return status; } /** * Get the next directory entry when reading a directory. This function is called during * directory iteration to retrieve the next directory entry. A dnode is constructed for * the entry and returned. The core makes sure that fsw_ext2_dnode_fill has been called * and the dnode is actually a directory. The shandle provided by the caller is used to * record the position in the directory between calls. */ static fsw_status_t fsw_ext2_dir_read(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_shandle *shand, struct fsw_ext2_dnode **child_dno_out) { fsw_status_t status; struct ext2_dir_entry entry; struct fsw_string entry_name; // Preconditions: The caller has checked that dno is a directory node. The caller // has opened a storage handle to the directory's storage and keeps it around between // calls. while (1) { // read next entry status = fsw_ext2_read_dentry(shand, &entry); if (status) return status; if (entry.inode == 0) // end of directory return FSW_NOT_FOUND; // skip . and .. if ((entry.name_len == 1 && entry.name[0] == '.') || (entry.name_len == 2 && entry.name[0] == '.' && entry.name[1] == '.')) continue; break; } // setup name entry_name.type = FSW_STRING_TYPE_ISO88591; entry_name.len = entry_name.size = entry.name_len; entry_name.data = entry.name; // setup a dnode for the child item status = fsw_dnode_create(dno, entry.inode, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); return status; } /** * Read a directory entry from the directory's raw data. This internal function is used * to read a raw ext2 directory entry into memory. The shandle's position pointer is adjusted * to point to the next entry. */ static fsw_status_t fsw_ext2_read_dentry(struct fsw_shandle *shand, struct ext2_dir_entry *entry) { fsw_status_t status; fsw_u32 buffer_size; while (1) { // read dir_entry header (fixed length) buffer_size = 8; status = fsw_shandle_read(shand, &buffer_size, entry); if (status) return status; if (buffer_size < 8 || entry->rec_len == 0) { // end of directory reached entry->inode = 0; return FSW_SUCCESS; } if (entry->rec_len < 8) return FSW_VOLUME_CORRUPTED; if (entry->inode != 0) { // this entry is used if (entry->rec_len < 8 + entry->name_len) return FSW_VOLUME_CORRUPTED; break; } // valid, but unused entry, skip it shand->pos += entry->rec_len - 8; } // read file name (variable length) buffer_size = entry->name_len; status = fsw_shandle_read(shand, &buffer_size, entry->name); if (status) return status; if (buffer_size < entry->name_len) return FSW_VOLUME_CORRUPTED; // skip any remaining padding shand->pos += entry->rec_len - (8 + entry->name_len); return FSW_SUCCESS; } /** * Get the target path of a symbolic link. This function is called when a symbolic * link needs to be resolved. The core makes sure that the fsw_ext2_dnode_fill has been * called on the dnode and that it really is a symlink. * * For ext2, the target path can be stored inline in the inode structure (in the space * otherwise occupied by the block pointers) or in the inode's data. There is no flag * indicating this, only the number of blocks entry (i_blocks) can be used as an * indication. The check used here comes from the Linux kernel. */ static fsw_status_t fsw_ext2_readlink(struct fsw_ext2_volume *vol, struct fsw_ext2_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; int ea_blocks; struct fsw_string s; if (dno->g.size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; ea_blocks = dno->raw->i_file_acl ? (vol->g.log_blocksize >> 9) : 0; if (dno->raw->i_blocks - ea_blocks == 0) { // "fast" symlink, path is stored inside the inode s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = (int)dno->g.size; s.data = dno->raw->i_block; status = fsw_strdup_coerce(link_target, vol->g.host_string_type, &s); } else { // "slow" symlink, path is stored in normal inode data status = fsw_dnode_readlink_data(dno, link_target); } return status; } // EOF refit-0.14/fsw/fsw_ext2.h0000644000175000017500000000376210505533606014631 0ustar julienjulien/** * \file fsw_ext2.h * ext2 file system driver header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FSW_EXT2_H_ #define _FSW_EXT2_H_ #define VOLSTRUCTNAME fsw_ext2_volume #define DNODESTRUCTNAME fsw_ext2_dnode #include "fsw_core.h" #include "fsw_ext2_disk.h" //! Block size to be used when reading the ext2 superblock. #define EXT2_SUPERBLOCK_BLOCKSIZE 1024 //! Block number where the (master copy of the) ext2 superblock resides. #define EXT2_SUPERBLOCK_BLOCKNO 1 /** * ext2: Volume structure with ext2-specific data. */ struct fsw_ext2_volume { struct fsw_volume g; //!< Generic volume structure struct ext2_super_block *sb; //!< Full raw ext2 superblock structure fsw_u32 *inotab_bno; //!< Block numbers of the inode tables fsw_u32 ind_bcnt; //!< Number of blocks addressable through an indirect block fsw_u32 dind_bcnt; //!< Number of blocks addressable through a double-indirect block fsw_u32 inode_size; //!< Size of inode structure in bytes }; /** * ext2: Dnode structure with ext2-specific data. */ struct fsw_ext2_dnode { struct fsw_dnode g; //!< Generic dnode structure struct ext2_inode *raw; //!< Full raw inode structure }; #endif refit-0.14/fsw/fsw_ext2.mak0000644000175000017500000000327610633422241015144 0ustar julienjulien# # fsw/fsw_ext2.mak # Build control file for the ext2 file system driver # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = fsw_ext2 IMAGE_ENTRY_POINT = fsw_efi_main # # Globals needed by master.mak # TARGET_BS_DRIVER = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\fsw BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) C_FLAGS = $(C_FLAGS) /D HOST_EFI /D FSTYPE=ext2 # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\fsw_efi.obj \ $(BUILD_DIR)\fsw_efi_lib.obj \ $(BUILD_DIR)\fsw_core.obj \ $(BUILD_DIR)\fsw_lib.obj \ $(BUILD_DIR)\fsw_ext2.obj \ INC_DEPS = $(INC_DEPS) fsw_base.h fsw_efi_base.h fsw_core.h fsw_efi.h fsw_ext2.h fsw_ext2_disk.h # # Source file dependencies # $(BUILD_DIR)\fsw_efi.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_efi_lib.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_core.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_lib.obj : $(*B).c $(INC_DEPS) fsw_strfunc.h $(BUILD_DIR)\fsw_ext2.obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/fsw/fsw_ext2_disk.h0000644000175000017500000003602010452734756015646 0ustar julienjulien/** * \file fsw_ext2_disk.h * ext2 file system on-disk structures. */ /*- * Copyright (c) 2006 Christoph Pfisterer * Portions Copyright (c) 1991-2006 by various Linux kernel contributors * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FSW_EXT2_DISK_H_ #define _FSW_EXT2_DISK_H_ // types typedef fsw_s8 __s8; typedef fsw_u8 __u8; typedef fsw_s16 __s16; typedef fsw_u16 __u16; typedef fsw_s32 __s32; typedef fsw_u32 __u32; typedef fsw_s64 __s64; typedef fsw_u64 __u64; typedef __u16 __le16; typedef __u32 __le32; typedef __u64 __le64; // // from Linux kernel, include/linux/ext2_fs.h // /* * Special inode numbers */ #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ /* * The second extended file system magic number */ #define EXT2_SUPER_MAGIC 0xEF53 /* * Macro-instructions used to manage several block sizes */ #define EXT2_MIN_BLOCK_SIZE 1024 #define EXT2_MAX_BLOCK_SIZE 4096 #define EXT2_MIN_BLOCK_LOG_SIZE 10 #define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) #define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) #define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ EXT2_GOOD_OLD_INODE_SIZE : \ (s)->s_inode_size) #define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ EXT2_GOOD_OLD_FIRST_INO : \ (s)->s_first_ino) /* * Structure of a blocks group descriptor */ struct ext2_group_desc { __le32 bg_block_bitmap; /* Blocks bitmap block */ __le32 bg_inode_bitmap; /* Inodes bitmap block */ __le32 bg_inode_table; /* Inodes table block */ __le16 bg_free_blocks_count; /* Free blocks count */ __le16 bg_free_inodes_count; /* Free inodes count */ __le16 bg_used_dirs_count; /* Directories count */ __le16 bg_pad; __le32 bg_reserved[3]; }; /* * Macro-instructions used to manage group descriptors */ #define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) #define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) #define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) /* * Constants relative to the data blocks */ #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) /* * Inode flags */ #define EXT2_SECRM_FL 0x00000001 /* Secure deletion */ #define EXT2_UNRM_FL 0x00000002 /* Undelete */ #define EXT2_COMPR_FL 0x00000004 /* Compress file */ #define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */ #define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */ #define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */ #define EXT2_NODUMP_FL 0x00000040 /* do not dump file */ #define EXT2_NOATIME_FL 0x00000080 /* do not update atime */ /* Reserved for compression usage... */ #define EXT2_DIRTY_FL 0x00000100 #define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ #define EXT2_NOCOMP_FL 0x00000400 /* Don't compress */ #define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ /* End compression flags --- maybe not all used */ #define EXT2_BTREE_FL 0x00001000 /* btree format dir */ #define EXT2_INDEX_FL 0x00001000 /* hash-indexed directory */ #define EXT2_IMAGIC_FL 0x00002000 /* AFS directory */ #define EXT2_JOURNAL_DATA_FL 0x00004000 /* Reserved for ext3 */ #define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */ #define EXT2_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ #define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ #define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ #define EXT2_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ #define EXT2_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ /* * Structure of an inode on the disk */ struct ext2_inode { __le16 i_mode; /* 0: File mode */ __le16 i_uid; /* 2: Low 16 bits of Owner Uid */ __le32 i_size; /* 4: Size in bytes */ __le32 i_atime; /* 8: Access time */ __le32 i_ctime; /* 12: Creation time */ __le32 i_mtime; /* 16: Modification time */ __le32 i_dtime; /* 20: Deletion Time */ __le16 i_gid; /* 24: Low 16 bits of Group Id */ __le16 i_links_count; /* 26: Links count */ __le32 i_blocks; /* 28: Blocks count */ __le32 i_flags; /* 32: File flags */ union { struct { __le32 l_i_reserved1; } linux1; struct { __le32 h_i_translator; } hurd1; struct { __le32 m_i_reserved1; } masix1; } osd1; /* 36: OS dependent 1 */ __le32 i_block[EXT2_N_BLOCKS];/* 40: Pointers to blocks */ __le32 i_generation; /* 100: File version (for NFS) */ __le32 i_file_acl; /* 104: File ACL */ __le32 i_dir_acl; /* 108: Directory ACL */ __le32 i_faddr; /* 112: Fragment address */ union { struct { __u8 l_i_frag; /* 116: Fragment number */ __u8 l_i_fsize; /* 117: Fragment size */ __u16 i_pad1; __le16 l_i_uid_high; /* 120: these 2 fields */ __le16 l_i_gid_high; /* 122: were reserved2[0] */ __u32 l_i_reserved2; } linux2; struct { __u8 h_i_frag; /* Fragment number */ __u8 h_i_fsize; /* Fragment size */ __le16 h_i_mode_high; __le16 h_i_uid_high; __le16 h_i_gid_high; __le32 h_i_author; } hurd2; struct { __u8 m_i_frag; /* Fragment number */ __u8 m_i_fsize; /* Fragment size */ __u16 m_pad1; __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ }; #define i_size_high i_dir_acl /* * Structure of the super block */ struct ext2_super_block { __le32 s_inodes_count; /* Inodes count */ __le32 s_blocks_count; /* Blocks count */ __le32 s_r_blocks_count; /* Reserved blocks count */ __le32 s_free_blocks_count; /* Free blocks count */ __le32 s_free_inodes_count; /* Free inodes count */ __le32 s_first_data_block; /* First Data Block */ __le32 s_log_block_size; /* Block size */ __le32 s_log_frag_size; /* Fragment size */ __le32 s_blocks_per_group; /* # Blocks per group */ __le32 s_frags_per_group; /* # Fragments per group */ __le32 s_inodes_per_group; /* # Inodes per group */ __le32 s_mtime; /* Mount time */ __le32 s_wtime; /* Write time */ __le16 s_mnt_count; /* Mount count */ __le16 s_max_mnt_count; /* Maximal mount count */ __le16 s_magic; /* Magic signature */ __le16 s_state; /* File system state */ __le16 s_errors; /* Behaviour when detecting errors */ __le16 s_minor_rev_level; /* minor revision level */ __le32 s_lastcheck; /* time of last check */ __le32 s_checkinterval; /* max. time between checks */ __le32 s_creator_os; /* OS */ __le32 s_rev_level; /* Revision level */ __le16 s_def_resuid; /* Default uid for reserved blocks */ __le16 s_def_resgid; /* Default gid for reserved blocks */ /* * These fields are for EXT2_DYNAMIC_REV superblocks only. * * Note: the difference between the compatible feature set and * the incompatible feature set is that if there is a bit set * in the incompatible feature set that the kernel doesn't * know about, it should refuse to mount the filesystem. * * e2fsck's requirements are more strict; if it doesn't know * about a feature in either the compatible or incompatible * feature set, it must abort and not try to meddle with * things it doesn't understand... */ __le32 s_first_ino; /* First non-reserved inode */ __le16 s_inode_size; /* size of inode structure */ __le16 s_block_group_nr; /* block group # of this superblock */ __le32 s_feature_compat; /* compatible feature set */ __le32 s_feature_incompat; /* incompatible feature set */ __le32 s_feature_ro_compat; /* readonly-compatible feature set */ __u8 s_uuid[16]; /* 128-bit uuid for volume */ char s_volume_name[16]; /* volume name */ char s_last_mounted[64]; /* directory where last mounted */ __le32 s_algorithm_usage_bitmap; /* For compression */ /* * Performance hints. Directory preallocation should only * happen if the EXT2_COMPAT_PREALLOC flag is on. */ __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ __u16 s_padding1; /* * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set. */ __u8 s_journal_uuid[16]; /* uuid of journal superblock */ __u32 s_journal_inum; /* inode number of journal file */ __u32 s_journal_dev; /* device number of journal file */ __u32 s_last_orphan; /* start of list of inodes to delete */ __u32 s_hash_seed[4]; /* HTREE hash seed */ __u8 s_def_hash_version; /* Default hash version to use */ __u8 s_reserved_char_pad; __u16 s_reserved_word_pad; __le32 s_default_mount_opts; __le32 s_first_meta_bg; /* First metablock block group */ __u32 s_reserved[190]; /* Padding to the end of the block */ }; /* * Revision levels */ #define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ #define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ #define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV #define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV #define EXT2_GOOD_OLD_INODE_SIZE 128 /* * Feature set definitions */ #define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) #define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) ) #define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) #define EXT2_SET_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask) #define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask) #define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask) #define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask) #define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask) #define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \ EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask) #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008 #define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010 #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020 #define EXT2_FEATURE_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 #define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff #define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 #define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff /* #define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \ EXT2_FEATURE_INCOMPAT_META_BG) #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT2_FEATURE_RO_COMPAT_BTREE_DIR) #define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP #define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP */ /* * Structure of a directory entry */ #define EXT2_NAME_LEN 255 struct ext2_dir_entry { __le32 inode; /* Inode number */ __le16 rec_len; /* Directory entry length */ __u8 name_len; /* Name length */ __u8 file_type; char name[EXT2_NAME_LEN]; /* File name */ }; // NOTE: The original Linux kernel header defines ext2_dir_entry with the original // layout and ext2_dir_entry_2 with the revised layout. We simply use the revised one. /* * Ext2 directory file types. Only the low 3 bits are used. The * other bits are reserved for now. */ enum { EXT2_FT_UNKNOWN, EXT2_FT_REG_FILE, EXT2_FT_DIR, EXT2_FT_CHRDEV, EXT2_FT_BLKDEV, EXT2_FT_FIFO, EXT2_FT_SOCK, EXT2_FT_SYMLINK, EXT2_FT_MAX }; #endif refit-0.14/fsw/fsw_iso9660.c0000644000175000017500000004170610545737532015071 0ustar julienjulien/** * \file fsw_iso9660.c * ISO9660 file system driver code. * * Current limitations: * - Files must be in one extent (i.e. Level 2) * - No Joliet or Rock Ridge extensions * - No interleaving * - inode number generation strategy fails on volumes > 2 GB * - No blocksizes != 2048 * - No High Sierra or anything else != 'CD001' * - No volume sets with directories pointing at other volumes * - No extended attribute records */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_iso9660.h" // functions static fsw_status_t fsw_iso9660_volume_mount(struct fsw_iso9660_volume *vol); static void fsw_iso9660_volume_free(struct fsw_iso9660_volume *vol); static fsw_status_t fsw_iso9660_volume_stat(struct fsw_iso9660_volume *vol, struct fsw_volume_stat *sb); static fsw_status_t fsw_iso9660_dnode_fill(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno); static void fsw_iso9660_dnode_free(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno); static fsw_status_t fsw_iso9660_dnode_stat(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_dnode_stat *sb); static fsw_status_t fsw_iso9660_get_extent(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_extent *extent); static fsw_status_t fsw_iso9660_dir_lookup(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *lookup_name, struct fsw_iso9660_dnode **child_dno); static fsw_status_t fsw_iso9660_dir_read(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_shandle *shand, struct fsw_iso9660_dnode **child_dno); static fsw_status_t fsw_iso9660_read_dirrec(struct fsw_shandle *shand, struct iso9660_dirrec_buffer *dirrec_buffer); static fsw_status_t fsw_iso9660_readlink(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *link); // // Dispatch Table // struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(iso9660) = { { FSW_STRING_TYPE_ISO88591, 4, 4, "iso9660" }, sizeof(struct fsw_iso9660_volume), sizeof(struct fsw_iso9660_dnode), fsw_iso9660_volume_mount, fsw_iso9660_volume_free, fsw_iso9660_volume_stat, fsw_iso9660_dnode_fill, fsw_iso9660_dnode_free, fsw_iso9660_dnode_stat, fsw_iso9660_get_extent, fsw_iso9660_dir_lookup, fsw_iso9660_dir_read, fsw_iso9660_readlink, }; /** * Mount an ISO9660 volume. Reads the superblock and constructs the * root directory dnode. */ static fsw_status_t fsw_iso9660_volume_mount(struct fsw_iso9660_volume *vol) { fsw_status_t status; void *buffer; fsw_u32 blockno; struct iso9660_volume_descriptor *voldesc; struct iso9660_primary_volume_descriptor *pvoldesc; fsw_u32 voldesc_type; int i; struct fsw_string s; // read through the Volume Descriptor Set fsw_set_blocksize(vol, ISO9660_BLOCKSIZE, ISO9660_BLOCKSIZE); blockno = ISO9660_SUPERBLOCK_BLOCKNO; do { status = fsw_block_get(vol, blockno, 0, &buffer); if (status) return status; voldesc = (struct iso9660_volume_descriptor *)buffer; voldesc_type = voldesc->volume_descriptor_type; if (fsw_memeq(voldesc->standard_identifier, "CD001", 5)) { // descriptor follows ISO 9660 standard if (voldesc_type == 1 && voldesc->volume_descriptor_version == 1) { // suitable Primary Volume Descriptor found if (vol->primary_voldesc) { fsw_free(vol->primary_voldesc); vol->primary_voldesc = NULL; } status = fsw_memdup((void **)&vol->primary_voldesc, voldesc, ISO9660_BLOCKSIZE); } } else if (!fsw_memeq(voldesc->standard_identifier, "CD", 2)) { // completely alien standard identifier, stop reading voldesc_type = 255; } fsw_block_release(vol, blockno, buffer); blockno++; } while (!status && voldesc_type != 255); if (status) return status; // get information from Primary Volume Descriptor if (vol->primary_voldesc == NULL) return FSW_UNSUPPORTED; pvoldesc = vol->primary_voldesc; if (ISOINT(pvoldesc->logical_block_size) != 2048) return FSW_UNSUPPORTED; // get volume name for (i = 32; i > 0; i--) if (pvoldesc->volume_identifier[i-1] != ' ') break; s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = i; s.data = pvoldesc->volume_identifier; status = fsw_strdup_coerce(&vol->g.label, vol->g.host_string_type, &s); if (status) return status; // setup the root dnode status = fsw_dnode_create_root(vol, ISO9660_SUPERBLOCK_BLOCKNO << ISO9660_BLOCKSIZE_BITS, &vol->g.root); if (status) return status; fsw_memcpy(&vol->g.root->dirrec, &pvoldesc->root_directory, sizeof(struct iso9660_dirrec)); // release volume descriptors fsw_free(vol->primary_voldesc); vol->primary_voldesc = NULL; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_iso9660_volume_mount: success\n"))); return FSW_SUCCESS; } /** * Free the volume data structure. Called by the core after an unmount or after * an unsuccessful mount to release the memory used by the file system type specific * part of the volume structure. */ static void fsw_iso9660_volume_free(struct fsw_iso9660_volume *vol) { if (vol->primary_voldesc) fsw_free(vol->primary_voldesc); } /** * Get in-depth information on a volume. */ static fsw_status_t fsw_iso9660_volume_stat(struct fsw_iso9660_volume *vol, struct fsw_volume_stat *sb) { sb->total_bytes = 0; //(fsw_u64)vol->sb->s_blocks_count * vol->g.log_blocksize; sb->free_bytes = 0; return FSW_SUCCESS; } /** * Get full information on a dnode from disk. This function is called by the core * whenever it needs to access fields in the dnode structure that may not * be filled immediately upon creation of the dnode. In the case of iso9660, we * delay fetching of the inode structure until dnode_fill is called. The size and * type fields are invalid until this function has been called. */ static fsw_status_t fsw_iso9660_dnode_fill(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno) { // get info from the directory record dno->g.size = ISOINT(dno->dirrec.data_length); if (dno->dirrec.file_flags & 0x02) dno->g.type = FSW_DNODE_TYPE_DIR; else dno->g.type = FSW_DNODE_TYPE_FILE; return FSW_SUCCESS; } /** * Free the dnode data structure. Called by the core when deallocating a dnode * structure to release the memory used by the file system type specific part * of the dnode structure. */ static void fsw_iso9660_dnode_free(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno) { } /** * Get in-depth information on a dnode. The core makes sure that fsw_iso9660_dnode_fill * has been called on the dnode before this function is called. Note that some * data is not directly stored into the structure, but passed to a host-specific * callback that converts it to the host-specific format. */ static fsw_status_t fsw_iso9660_dnode_stat(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_dnode_stat *sb) { sb->used_bytes = (dno->g.size + (ISO9660_BLOCKSIZE-1)) & ~(ISO9660_BLOCKSIZE-1); /* sb->store_time_posix(sb, FSW_DNODE_STAT_CTIME, dno->raw->i_ctime); sb->store_time_posix(sb, FSW_DNODE_STAT_ATIME, dno->raw->i_atime); sb->store_time_posix(sb, FSW_DNODE_STAT_MTIME, dno->raw->i_mtime); sb->store_attr_posix(sb, dno->raw->i_mode); */ return FSW_SUCCESS; } /** * Retrieve file data mapping information. This function is called by the core when * fsw_shandle_read needs to know where on the disk the required piece of the file's * data can be found. The core makes sure that fsw_iso9660_dnode_fill has been called * on the dnode before. Our task here is to get the physical disk block number for * the requested logical block number. */ static fsw_status_t fsw_iso9660_get_extent(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_extent *extent) { // Preconditions: The caller has checked that the requested logical block // is within the file's size. The dnode has complete information, i.e. // fsw_iso9660_dnode_read_info was called successfully on it. extent->type = FSW_EXTENT_TYPE_PHYSBLOCK; extent->phys_start = ISOINT(dno->dirrec.extent_location); extent->log_start = 0; extent->log_count = (ISOINT(dno->dirrec.data_length) + (ISO9660_BLOCKSIZE-1)) >> ISO9660_BLOCKSIZE_BITS; return FSW_SUCCESS; } /** * Lookup a directory's child dnode by name. This function is called on a directory * to retrieve the directory entry with the given name. A dnode is constructed for * this entry and returned. The core makes sure that fsw_iso9660_dnode_fill has been called * and the dnode is actually a directory. */ static fsw_status_t fsw_iso9660_dir_lookup(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *lookup_name, struct fsw_iso9660_dnode **child_dno_out) { fsw_status_t status; struct fsw_shandle shand; struct iso9660_dirrec_buffer dirrec_buffer; struct iso9660_dirrec *dirrec = &dirrec_buffer.dirrec; // Preconditions: The caller has checked that dno is a directory node. // setup handle to read the directory status = fsw_shandle_open(dno, &shand); if (status) return status; // scan the directory for the file while (1) { // read next entry status = fsw_iso9660_read_dirrec(&shand, &dirrec_buffer); if (status) goto errorexit; if (dirrec->dirrec_length == 0) { // end of directory reached status = FSW_NOT_FOUND; goto errorexit; } // skip . and .. if (dirrec->file_identifier_length == 1 && (dirrec->file_identifier[0] == 0 || dirrec->file_identifier[0] == 1)) continue; // compare name if (fsw_streq(lookup_name, &dirrec_buffer.name)) // TODO: compare case-insensitively break; } // setup a dnode for the child item status = fsw_dnode_create(dno, dirrec_buffer.ino, FSW_DNODE_TYPE_UNKNOWN, &dirrec_buffer.name, child_dno_out); if (status == FSW_SUCCESS) fsw_memcpy(&(*child_dno_out)->dirrec, dirrec, sizeof(struct iso9660_dirrec)); errorexit: fsw_shandle_close(&shand); return status; } /** * Get the next directory entry when reading a directory. This function is called during * directory iteration to retrieve the next directory entry. A dnode is constructed for * the entry and returned. The core makes sure that fsw_iso9660_dnode_fill has been called * and the dnode is actually a directory. The shandle provided by the caller is used to * record the position in the directory between calls. */ static fsw_status_t fsw_iso9660_dir_read(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_shandle *shand, struct fsw_iso9660_dnode **child_dno_out) { fsw_status_t status; struct iso9660_dirrec_buffer dirrec_buffer; struct iso9660_dirrec *dirrec = &dirrec_buffer.dirrec; // Preconditions: The caller has checked that dno is a directory node. The caller // has opened a storage handle to the directory's storage and keeps it around between // calls. while (1) { // read next entry status = fsw_iso9660_read_dirrec(shand, &dirrec_buffer); if (status) return status; if (dirrec->dirrec_length == 0) // end of directory return FSW_NOT_FOUND; // skip . and .. if (dirrec->file_identifier_length == 1 && (dirrec->file_identifier[0] == 0 || dirrec->file_identifier[0] == 1)) continue; break; } // setup a dnode for the child item status = fsw_dnode_create(dno, dirrec_buffer.ino, FSW_DNODE_TYPE_UNKNOWN, &dirrec_buffer.name, child_dno_out); if (status == FSW_SUCCESS) fsw_memcpy(&(*child_dno_out)->dirrec, dirrec, sizeof(struct iso9660_dirrec)); return status; } /** * Read a directory entry from the directory's raw data. This internal function is used * to read a raw iso9660 directory entry into memory. The shandle's position pointer is adjusted * to point to the next entry. */ static fsw_status_t fsw_iso9660_read_dirrec(struct fsw_shandle *shand, struct iso9660_dirrec_buffer *dirrec_buffer) { fsw_status_t status; fsw_u32 buffer_size, remaining_size, name_len; int i; struct iso9660_dirrec *dirrec = &dirrec_buffer->dirrec; dirrec_buffer->ino = (ISOINT(((struct fsw_iso9660_dnode *)shand->dnode)->dirrec.extent_location) << ISO9660_BLOCKSIZE_BITS) + (fsw_u32)shand->pos; // read fixed size part of directory record buffer_size = 33; status = fsw_shandle_read(shand, &buffer_size, dirrec); if (status) return status; if (buffer_size < 33 || dirrec->dirrec_length == 0) { // end of directory reached dirrec->dirrec_length = 0; return FSW_SUCCESS; } if (dirrec->dirrec_length < 33 || dirrec->dirrec_length < 33 + dirrec->file_identifier_length) return FSW_VOLUME_CORRUPTED; // read variable size part of directory record buffer_size = remaining_size = dirrec->dirrec_length - 33; status = fsw_shandle_read(shand, &buffer_size, dirrec->file_identifier); if (status) return status; if (buffer_size < remaining_size) return FSW_VOLUME_CORRUPTED; // setup name name_len = dirrec->file_identifier_length; for (i = name_len - 1; i >= 0; i--) { if (dirrec->file_identifier[i] == ';') { name_len = i; // cut the ISO9660 version number off break; } } if (name_len > 0 && dirrec->file_identifier[name_len-1] == '.') name_len--; // also cut the extension separator if the extension is empty dirrec_buffer->name.type = FSW_STRING_TYPE_ISO88591; dirrec_buffer->name.len = dirrec_buffer->name.size = name_len; dirrec_buffer->name.data = dirrec->file_identifier; return FSW_SUCCESS; } /** * Get the target path of a symbolic link. This function is called when a symbolic * link needs to be resolved. The core makes sure that the fsw_iso9660_dnode_fill has been * called on the dnode and that it really is a symlink. * * For iso9660, the target path can be stored inline in the inode structure (in the space * otherwise occupied by the block pointers) or in the inode's data. There is no flag * indicating this, only the number of blocks entry (i_blocks) can be used as an * indication. The check used here comes from the Linux kernel. */ static fsw_status_t fsw_iso9660_readlink(struct fsw_iso9660_volume *vol, struct fsw_iso9660_dnode *dno, struct fsw_string *link_target) { fsw_status_t status; if (dno->g.size > FSW_PATH_MAX) return FSW_VOLUME_CORRUPTED; status = fsw_dnode_readlink_data(dno, link_target); return status; } // EOF refit-0.14/fsw/fsw_iso9660.h0000644000175000017500000001201310544467664015070 0ustar julienjulien/** * \file fsw_iso9660.h * ISO9660 file system driver header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_ISO9660_H_ #define _FSW_ISO9660_H_ #define VOLSTRUCTNAME fsw_iso9660_volume #define DNODESTRUCTNAME fsw_iso9660_dnode #include "fsw_core.h" //! Block size for ISO9660 volumes. #define ISO9660_BLOCKSIZE 2048 #define ISO9660_BLOCKSIZE_BITS 11 //! Block number where the ISO9660 superblock resides. #define ISO9660_SUPERBLOCK_BLOCKNO 16 #pragma pack(1) typedef struct { fsw_u16 lsb; fsw_u16 msb; } iso9660_u16; typedef struct { fsw_u32 lsb; fsw_u32 msb; } iso9660_u32; #define ISOINT(lsbmsbvalue) ((lsbmsbvalue).lsb) struct iso9660_dirrec { fsw_u8 dirrec_length; fsw_u8 ear_length; iso9660_u32 extent_location; iso9660_u32 data_length; fsw_u8 recording_datetime[7]; fsw_u8 file_flags; fsw_u8 file_unit_size; fsw_u8 interleave_gap_size; iso9660_u16 volume_sequence_number; fsw_u8 file_identifier_length; char file_identifier[1]; }; //#if sizeof(struct fsw_iso9660_dirrec) != 34 //#fail Structure fsw_iso9660_dirrec has wrong size //#endif struct iso9660_volume_descriptor { fsw_u8 volume_descriptor_type; char standard_identifier[5]; fsw_u8 volume_descriptor_version; }; struct iso9660_primary_volume_descriptor { fsw_u8 volume_descriptor_type; char standard_identifier[5]; fsw_u8 volume_descriptor_version; fsw_u8 unused1; char system_identifier[32]; char volume_identifier[32]; fsw_u8 unused2[8]; iso9660_u32 volume_space_size; fsw_u8 unused3[32]; iso9660_u16 volume_set_size; iso9660_u16 volume_sequence_number; iso9660_u16 logical_block_size; iso9660_u32 path_table_size; fsw_u32 location_type_l_path_table; fsw_u32 location_optional_type_l_path_table; fsw_u32 location_type_m_path_table; fsw_u32 location_optional_type_m_path_table; struct iso9660_dirrec root_directory; char volume_set_identifier[128]; char publisher_identifier[128]; char data_preparer_identifier[128]; char application_identifier[128]; char copyright_file_identifier[37]; char abstract_file_identifier[37]; char bibliographic_file_identifier[37]; char volume_creation_datetime[17]; char volume_modification_datetime[17]; char volume_expiration_datetime[17]; char volume_effective_datetime[17]; fsw_u8 file_structure_version; fsw_u8 reserved1; fsw_u8 application_use[512]; fsw_u8 reserved2[653]; }; //#if sizeof(struct fsw_iso9660_volume_descriptor) != 2048 //#fail Structure fsw_iso9660_volume_descriptor has wrong size //#endif #pragma pack() struct iso9660_dirrec_buffer { fsw_u32 ino; struct fsw_string name; struct iso9660_dirrec dirrec; char dirrec_buffer[222]; }; /** * ISO9660: Volume structure with ISO9660-specific data. */ struct fsw_iso9660_volume { struct fsw_volume g; //!< Generic volume structure struct iso9660_primary_volume_descriptor *primary_voldesc; //!< Full Primary Volume Descriptor }; /** * ISO9660: Dnode structure with ISO9660-specific data. */ struct fsw_iso9660_dnode { struct fsw_dnode g; //!< Generic dnode structure struct iso9660_dirrec dirrec; //!< Fixed part of the directory record (i.e. w/o name) }; #endif refit-0.14/fsw/fsw_iso9660.mak0000644000175000017500000000330110633422241015366 0ustar julienjulien# # fsw/fsw_iso9660.mak # Build control file for the ISO9660 file system driver # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = fsw_iso9660 IMAGE_ENTRY_POINT = fsw_efi_main # # Globals needed by master.mak # TARGET_BS_DRIVER = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\fsw BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) C_FLAGS = $(C_FLAGS) /D HOST_EFI /D FSTYPE=iso9660 # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\fsw_efi.obj \ $(BUILD_DIR)\fsw_efi_lib.obj \ $(BUILD_DIR)\fsw_core.obj \ $(BUILD_DIR)\fsw_lib.obj \ $(BUILD_DIR)\fsw_iso9660.obj \ INC_DEPS = $(INC_DEPS) fsw_base.h fsw_efi_base.h fsw_core.h fsw_efi.h fsw_iso9660.h # # Source file dependencies # $(BUILD_DIR)\fsw_efi.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_efi_lib.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_core.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\fsw_lib.obj : $(*B).c $(INC_DEPS) fsw_strfunc.h $(BUILD_DIR)\fsw_iso9660.obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/fsw/fsw_lib.c0000644000175000017500000002151010545744767014517 0ustar julienjulien/** * \file fsw_lib.c * Core file system wrapper library functions. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_core.h" /* Include generated string encoding specific functions */ #include "fsw_strfunc.h" /** * Allocate memory and clear it. */ fsw_status_t fsw_alloc_zero(int len, void **ptr_out) { fsw_status_t status; status = fsw_alloc(len, ptr_out); if (status) return status; fsw_memzero(*ptr_out, len); return FSW_SUCCESS; } /** * Duplicate a piece of data. */ fsw_status_t fsw_memdup(void **dest_out, void *src, int len) { fsw_status_t status; status = fsw_alloc(len, dest_out); if (status) return status; fsw_memcpy(*dest_out, src, len); return FSW_SUCCESS; } /** * Get the length of a string. Returns the number of characters in the string. */ int fsw_strlen(struct fsw_string *s) { if (s->type == FSW_STRING_TYPE_EMPTY) return 0; return s->len; } /** * Compare two strings for equality. The two strings are compared, taking their * encoding into account. If they are considered equal, boolean true is returned. * Otherwise, boolean false is returned. */ int fsw_streq(struct fsw_string *s1, struct fsw_string *s2) { struct fsw_string temp_s; // handle empty strings if (s1->type == FSW_STRING_TYPE_EMPTY) { temp_s.type = FSW_STRING_TYPE_ISO88591; temp_s.size = temp_s.len = 0; temp_s.data = NULL; return fsw_streq(&temp_s, s2); } if (s2->type == FSW_STRING_TYPE_EMPTY) { temp_s.type = FSW_STRING_TYPE_ISO88591; temp_s.size = temp_s.len = 0; temp_s.data = NULL; return fsw_streq(s1, &temp_s); } // check length (count of chars) if (s1->len != s2->len) return 0; if (s1->len == 0) // both strings are empty return 1; if (s1->type == s2->type) { // same type, do a dumb memory compare if (s1->size != s2->size) return 0; return fsw_memeq(s1->data, s2->data, s1->size); } // dispatch to type-specific functions #define STREQ_DISPATCH(type1, type2) \ if (s1->type == FSW_STRING_TYPE_##type1 && s2->type == FSW_STRING_TYPE_##type2) \ return fsw_streq_##type1##_##type2(s1->data, s2->data, s1->len); \ if (s2->type == FSW_STRING_TYPE_##type1 && s1->type == FSW_STRING_TYPE_##type2) \ return fsw_streq_##type1##_##type2(s2->data, s1->data, s1->len); STREQ_DISPATCH(ISO88591, UTF8); STREQ_DISPATCH(ISO88591, UTF16); STREQ_DISPATCH(ISO88591, UTF16_SWAPPED); STREQ_DISPATCH(UTF8, UTF16); STREQ_DISPATCH(UTF8, UTF16_SWAPPED); STREQ_DISPATCH(UTF16, UTF16_SWAPPED); // final fallback return 0; } /** * Compare a string with a C string constant. This sets up a string descriptor * for the string constant (second argument) and runs fsw_streq on the two * strings. Currently the C string is interpreted as ISO 8859-1. * Returns boolean true if the strings are considered equal, boolean false otherwise. */ int fsw_streq_cstr(struct fsw_string *s1, const char *s2) { struct fsw_string temp_s; int i; for (i = 0; s2[i]; i++) ; temp_s.type = FSW_STRING_TYPE_ISO88591; temp_s.size = temp_s.len = i; temp_s.data = (char *)s2; return fsw_streq(s1, &temp_s); } /** * Creates a duplicate of a string, converting it to the given encoding during the copy. * If the function returns FSW_SUCCESS, the caller must free the string later with * fsw_strfree. */ fsw_status_t fsw_strdup_coerce(struct fsw_string *dest, int type, struct fsw_string *src) { fsw_status_t status; if (src->type == FSW_STRING_TYPE_EMPTY || src->len == 0) { dest->type = type; dest->size = dest->len = 0; dest->data = NULL; return FSW_SUCCESS; } if (src->type == type) { dest->type = type; dest->len = src->len; dest->size = src->size; status = fsw_alloc(dest->size, &dest->data); if (status) return status; fsw_memcpy(dest->data, src->data, dest->size); return FSW_SUCCESS; } // dispatch to type-specific functions #define STRCOERCE_DISPATCH(type1, type2) \ if (src->type == FSW_STRING_TYPE_##type1 && type == FSW_STRING_TYPE_##type2) \ return fsw_strcoerce_##type1##_##type2(src->data, src->len, dest); STRCOERCE_DISPATCH(UTF8, ISO88591); STRCOERCE_DISPATCH(UTF16, ISO88591); STRCOERCE_DISPATCH(UTF16_SWAPPED, ISO88591); STRCOERCE_DISPATCH(ISO88591, UTF8); STRCOERCE_DISPATCH(UTF16, UTF8); STRCOERCE_DISPATCH(UTF16_SWAPPED, UTF8); STRCOERCE_DISPATCH(ISO88591, UTF16); STRCOERCE_DISPATCH(UTF8, UTF16); STRCOERCE_DISPATCH(UTF16_SWAPPED, UTF16); return FSW_UNSUPPORTED; } /** * Splits a string at the first occurence of the separator character. * The buffer string is searched for the separator character. If it is found, the * element string descriptor is filled to point at the part of the buffer string * before the separator. The buffer string itself is adjusted to point at the * remaining part of the string (without the separator). * * If the separator is not found in the buffer string, then element is changed to * point at the whole buffer string, and the buffer string itself is changed into * an empty string. * * This function only manipulates the pointers and lengths in the two string descriptors, * it does not change the actual string. If the buffer string is dynamically allocated, * you must make a copy of it so that you can release it later. */ void fsw_strsplit(struct fsw_string *element, struct fsw_string *buffer, char separator) { int i, maxlen; if (buffer->type == FSW_STRING_TYPE_EMPTY || buffer->len == 0) { element->type = FSW_STRING_TYPE_EMPTY; return; } maxlen = buffer->len; *element = *buffer; if (buffer->type == FSW_STRING_TYPE_ISO88591) { fsw_u8 *p; p = (fsw_u8 *)element->data; for (i = 0; i < maxlen; i++, p++) { if (*p == separator) { buffer->data = p + 1; buffer->len -= i + 1; break; } } element->len = i; if (i == maxlen) { buffer->data = p; buffer->len -= i; } element->size = element->len; buffer->size = buffer->len; } else if (buffer->type == FSW_STRING_TYPE_UTF16) { fsw_u16 *p; p = (fsw_u16 *)element->data; for (i = 0; i < maxlen; i++, p++) { if (*p == separator) { buffer->data = p + 1; buffer->len -= i + 1; break; } } element->len = i; if (i == maxlen) { buffer->data = p; buffer->len -= i; } element->size = element->len * sizeof(fsw_u16); buffer->size = buffer->len * sizeof(fsw_u16); } else { // fallback buffer->type = FSW_STRING_TYPE_EMPTY; } // TODO: support UTF8 and UTF16_SWAPPED } /** * Frees the memory used by a string returned from fsw_strdup_coerce. */ void fsw_strfree(struct fsw_string *s) { if (s->type != FSW_STRING_TYPE_EMPTY && s->data) fsw_free(s->data); s->type = FSW_STRING_TYPE_EMPTY; } // EOF refit-0.14/fsw/fsw_posix.c0000644000175000017500000003305410463170331015074 0ustar julienjulien/** * \file fsw_posix.c * POSIX user space host environment code. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_posix.h" #ifndef FSTYPE /** The file system type name to use. */ #define FSTYPE ext2 #endif // function prototypes fsw_status_t fsw_posix_open_dno(struct fsw_posix_volume *pvol, const char *path, int required_type, struct fsw_shandle *shand); void fsw_posix_change_blocksize(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize); fsw_status_t fsw_posix_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer); /** * Dispatch table for our FSW host driver. */ struct fsw_host_table fsw_posix_host_table = { FSW_STRING_TYPE_ISO88591, fsw_posix_change_blocksize, fsw_posix_read_block }; extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(FSTYPE); /** * Mount function. */ struct fsw_posix_volume * fsw_posix_mount(const char *path, struct fsw_fstype_table *fstype_table) { fsw_status_t status; struct fsw_posix_volume *pvol; // allocate volume structure status = fsw_alloc_zero(sizeof(struct fsw_posix_volume), (void **)&pvol); if (status) return NULL; pvol->fd = -1; // open underlying file/device pvol->fd = open(path, O_RDONLY, 0); if (pvol->fd < 0) { fprintf(stderr, "fsw_posix_mount: %s: %s\n", path, strerror(errno)); fsw_free(pvol); return NULL; } // mount the filesystem if (fstype_table == NULL) fstype_table = &FSW_FSTYPE_TABLE_NAME(FSTYPE); status = fsw_mount(pvol, &fsw_posix_host_table, fstype_table, &pvol->vol); if (status) { fprintf(stderr, "fsw_posix_mount: fsw_mount returned %d\n", status); fsw_free(pvol); return NULL; } return pvol; } /** * Unmount function. */ int fsw_posix_unmount(struct fsw_posix_volume *pvol) { if (pvol->vol != NULL) fsw_unmount(pvol->vol); fsw_free(pvol); return 0; } /** * Open a named regular file. */ struct fsw_posix_file * fsw_posix_open(struct fsw_posix_volume *pvol, const char *path, int flags, mode_t mode) { fsw_status_t status; struct fsw_posix_file *file; // TODO: check flags for unwanted values // allocate file structure status = fsw_alloc(sizeof(struct fsw_posix_file), &file); if (status) return NULL; file->pvol = pvol; // open the file status = fsw_posix_open_dno(pvol, path, FSW_DNODE_TYPE_FILE, &file->shand); if (status) { fprintf(stderr, "fsw_posix_open: open_dno returned %d\n", status); fsw_free(file); return NULL; } return file; } /** * Read data from a regular file. */ ssize_t fsw_posix_read(struct fsw_posix_file *file, void *buf, size_t nbytes) { fsw_status_t status; fsw_u32 buffer_size; buffer_size = nbytes; status = fsw_shandle_read(&file->shand, &buffer_size, buf); if (status) return -1; return buffer_size; } /** * Change position within a regular file. */ off_t fsw_posix_lseek(struct fsw_posix_file *file, off_t offset, int whence) { fsw_u64 base_offset = 0; // get base offset base_offset = 0; if (whence == SEEK_CUR) base_offset = file->shand.pos; else if (whence == SEEK_END) base_offset = file->shand.dnode->size; // calculate new offset, prevent seeks before the start of the file if (offset < 0 && -offset > base_offset) file->shand.pos = 0; else file->shand.pos = base_offset + offset; return file->shand.pos; } /** * Close a regular file. */ int fsw_posix_close(struct fsw_posix_file *file) { fsw_shandle_close(&file->shand); fsw_free(file); return 0; } /** * Open a directory for iteration. */ struct fsw_posix_dir * fsw_posix_opendir(struct fsw_posix_volume *pvol, const char *path) { fsw_status_t status; struct fsw_posix_dir *dir; // allocate file structure status = fsw_alloc(sizeof(struct fsw_posix_dir), &dir); if (status) return NULL; dir->pvol = pvol; // open the directory status = fsw_posix_open_dno(pvol, path, FSW_DNODE_TYPE_DIR, &dir->shand); if (status) { fprintf(stderr, "fsw_posix_opendir: open_dno returned %d\n", status); fsw_free(dir); return NULL; } return dir; } /** * Read the next entry from a directory. */ struct dirent * fsw_posix_readdir(struct fsw_posix_dir *dir) { fsw_status_t status; struct fsw_dnode *dno; static struct dirent dent; // get next entry from file system status = fsw_dnode_dir_read(&dir->shand, &dno); if (status) { fprintf(stderr, "fsw_posix_readdir: fsw_dnode_dir_read returned %d\n", status); return NULL; } status = fsw_dnode_fill(dno); if (status) { fprintf(stderr, "fsw_posix_readdir: fsw_dnode_fill returned %d\n", status); fsw_dnode_release(dno); return NULL; } // fill dirent structure dent.d_fileno = dno->dnode_id; dent.d_reclen = 8 + dno->name.size + 1; switch (dno->type) { case FSW_DNODE_TYPE_FILE: dent.d_type = DT_REG; break; case FSW_DNODE_TYPE_DIR: dent.d_type = DT_DIR; break; case FSW_DNODE_TYPE_SYMLINK: dent.d_type = DT_LNK; break; default: dent.d_type = DT_UNKNOWN; break; } dent.d_namlen = dno->name.size; memcpy(dent.d_name, dno->name.data, dno->name.size); dent.d_name[dent.d_namlen] = 0; return &dent; } /** * Rewind a directory to the start. */ void fsw_posix_rewinddir(struct fsw_posix_dir *dir) { dir->shand.pos = 0; } /** * Close a directory. */ int fsw_posix_closedir(struct fsw_posix_dir *dir) { fsw_shandle_close(&dir->shand); fsw_free(dir); return 0; } /** * Open a shand of a required type by path. */ fsw_status_t fsw_posix_open_dno(struct fsw_posix_volume *pvol, const char *path, int required_type, struct fsw_shandle *shand) { fsw_status_t status; struct fsw_dnode *dno; struct fsw_dnode *target_dno; struct fsw_string lookup_path; lookup_path.type = FSW_STRING_TYPE_ISO88591; lookup_path.len = strlen(path); lookup_path.size = lookup_path.len; lookup_path.data = (void *)path; // resolve the path (symlinks along the way are automatically resolved) status = fsw_dnode_lookup_path(pvol->vol->root, &lookup_path, '/', &dno); if (status) { fprintf(stderr, "fsw_posix_open_dno: fsw_dnode_lookup_path returned %d\n", status); return status; } // if the final node is a symlink, also resolve it status = fsw_dnode_resolve(dno, &target_dno); fsw_dnode_release(dno); if (status) { fprintf(stderr, "fsw_posix_open_dno: fsw_dnode_resolve returned %d\n", status); return status; } dno = target_dno; // check that it is a regular file status = fsw_dnode_fill(dno); if (status) { fprintf(stderr, "fsw_posix_open_dno: fsw_dnode_fill returned %d\n", status); fsw_dnode_release(dno); return status; } if (dno->type != required_type) { fprintf(stderr, "fsw_posix_open_dno: dnode is not of the requested type\n"); fsw_dnode_release(dno); return FSW_UNSUPPORTED; } // open shandle status = fsw_shandle_open(dno, shand); if (status) { fprintf(stderr, "fsw_posix_open_dno: fsw_shandle_open returned %d\n", status); } fsw_dnode_release(dno); return status; } /** * FSW interface function for block size changes. This function is called by the FSW core * when the file system driver changes the block sizes for the volume. */ void fsw_posix_change_blocksize(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize) { // nothing to do } /** * FSW interface function to read data blocks. This function is called by the FSW core * to read a block of data from the device. The buffer is allocated by the core code. */ fsw_status_t fsw_posix_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer) { struct fsw_posix_volume *pvol = (struct fsw_posix_volume *)vol->host_data; off_t block_offset, seek_result; ssize_t read_result; FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_posix_read_block: %d (%d)\n"), phys_bno, vol->phys_blocksize)); // read from disk block_offset = (off_t)phys_bno * vol->phys_blocksize; seek_result = lseek(pvol->fd, block_offset, SEEK_SET); if (seek_result != block_offset) return FSW_IO_ERROR; read_result = read(pvol->fd, buffer, vol->phys_blocksize); if (read_result != vol->phys_blocksize) return FSW_IO_ERROR; return FSW_SUCCESS; } /** * Time mapping callback for the fsw_dnode_stat call. This function converts * a Posix style timestamp into an EFI_TIME structure and writes it to the * appropriate member of the EFI_FILE_INFO structure that we're filling. */ /* static void fsw_posix_store_time_posix(struct fsw_dnode_stat *sb, int which, fsw_u32 posix_time) { EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data; if (which == FSW_DNODE_STAT_CTIME) fsw_posix_decode_time(&FileInfo->CreateTime, posix_time); else if (which == FSW_DNODE_STAT_MTIME) fsw_posix_decode_time(&FileInfo->ModificationTime, posix_time); else if (which == FSW_DNODE_STAT_ATIME) fsw_posix_decode_time(&FileInfo->LastAccessTime, posix_time); } */ /** * Mode mapping callback for the fsw_dnode_stat call. This function looks at * the Posix mode passed by the file system driver and makes appropriate * adjustments to the EFI_FILE_INFO structure that we're filling. */ /* static void fsw_posix_store_attr_posix(struct fsw_dnode_stat *sb, fsw_u16 posix_mode) { EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data; if ((posix_mode & S_IWUSR) == 0) FileInfo->Attribute |= EFI_FILE_READ_ONLY; } */ /** * Common function to fill an EFI_FILE_INFO with information about a dnode. */ /* EFI_STATUS fsw_posix_dnode_fill_FileInfo(IN FSW_VOLUME_DATA *Volume, IN struct fsw_dnode *dno, IN OUT UINTN *BufferSize, OUT VOID *Buffer) { EFI_STATUS Status; EFI_FILE_INFO *FileInfo; UINTN RequiredSize; struct fsw_dnode_stat sb; // make sure the dnode has complete info Status = fsw_posix_map_status(fsw_dnode_fill(dno), Volume); if (EFI_ERROR(Status)) return Status; // TODO: check/assert that the dno's name is in UTF16 // check buffer size RequiredSize = SIZE_OF_EFI_FILE_INFO + fsw_posix_strsize(&dno->name); if (*BufferSize < RequiredSize) { // TODO: wind back the directory in this case *BufferSize = RequiredSize; return EFI_BUFFER_TOO_SMALL; } // fill structure ZeroMem(Buffer, RequiredSize); FileInfo = (EFI_FILE_INFO *)Buffer; FileInfo->Size = RequiredSize; FileInfo->FileSize = dno->size; FileInfo->Attribute = 0; if (dno->type == FSW_DNODE_TYPE_DIR) FileInfo->Attribute |= EFI_FILE_DIRECTORY; fsw_posix_strcpy(FileInfo->FileName, &dno->name); // get the missing info from the fs driver ZeroMem(&sb, sizeof(struct fsw_dnode_stat)); sb.store_time_posix = fsw_posix_store_time_posix; sb.store_attr_posix = fsw_posix_store_attr_posix; sb.host_data = FileInfo; Status = fsw_posix_map_status(fsw_dnode_stat(dno, &sb), Volume); if (EFI_ERROR(Status)) return Status; FileInfo->PhysicalSize = sb.used_bytes; // prepare for return *BufferSize = RequiredSize; return EFI_SUCCESS; } */ // EOF refit-0.14/fsw/fsw_posix.h0000644000175000017500000000637110463170331015103 0ustar julienjulien/** * \file fsw_posix.h * POSIX user space host environment header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_POSIX_H_ #define _FSW_POSIX_H_ #include "fsw_core.h" #include #include #include /** * POSIX Host: Private per-volume structure. */ struct fsw_posix_volume { struct fsw_volume *vol; //!< FSW volume structure int fd; //!< System file descriptor for data access }; /** * POSIX Host: Private structure for an open file. */ struct fsw_posix_file { struct fsw_posix_volume *pvol; //!< POSIX host volume structure struct fsw_shandle shand; //!< FSW handle for this file }; /** * POSIX Host: Private structure for an open directory. */ struct fsw_posix_dir { struct fsw_posix_volume *pvol; //!< POSIX host volume structure struct fsw_shandle shand; //!< FSW handle for this file }; /* functions */ struct fsw_posix_volume * fsw_posix_mount(const char *path, struct fsw_fstype_table *fstype_table); int fsw_posix_unmount(struct fsw_posix_volume *pvol); struct fsw_posix_file * fsw_posix_open(struct fsw_posix_volume *pvol, const char *path, int flags, mode_t mode); ssize_t fsw_posix_read(struct fsw_posix_file *file, void *buf, size_t nbytes); off_t fsw_posix_lseek(struct fsw_posix_file *file, off_t offset, int whence); int fsw_posix_close(struct fsw_posix_file *file); struct fsw_posix_dir * fsw_posix_opendir(struct fsw_posix_volume *pvol, const char *path); struct dirent * fsw_posix_readdir(struct fsw_posix_dir *dir); void fsw_posix_rewinddir(struct fsw_posix_dir *dir); int fsw_posix_closedir(struct fsw_posix_dir *dir); #endif refit-0.14/fsw/fsw_posix_base.h0000644000175000017500000000536510545737746016123 0ustar julienjulien/** * \file fsw_posix_base.h * Base definitions for the POSIX user space host environment. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _FSW_POSIX_BASE_H_ #define _FSW_POSIX_BASE_H_ #include #include #include #include #include #define FSW_LITTLE_ENDIAN (1) // TODO: use info from the headers to define FSW_LITTLE_ENDIAN or FSW_BIG_ENDIAN // types typedef signed char fsw_s8; typedef unsigned char fsw_u8; typedef short fsw_s16; typedef unsigned short fsw_u16; typedef long fsw_s32; typedef unsigned long fsw_u32; typedef long long fsw_s64; typedef unsigned long long fsw_u64; // allocation functions #define fsw_alloc(size, ptrptr) (((*(ptrptr) = malloc(size)) == NULL) ? FSW_OUT_OF_MEMORY : FSW_SUCCESS) #define fsw_free(ptr) free(ptr) // memory functions #define fsw_memzero(dest,size) memset(dest,0,size) #define fsw_memcpy(dest,src,size) memcpy(dest,src,size) #define fsw_memeq(p1,p2,size) (memcmp(p1,p2,size) == 0) // message printing #define FSW_MSGSTR(s) s #define FSW_MSGFUNC printf // 64-bit hooks #define FSW_U64_SHR(val,shiftbits) ((val) >> (shiftbits)) #define FSW_U64_DIV(val,divisor) ((val) / (divisor)) #endif refit-0.14/fsw/fsw_reiserfs.c0000644000175000017500000010362010463170777015567 0ustar julienjulien/** * \file fsw_reiserfs.c * ReiserFS file system driver code. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "fsw_reiserfs.h" // functions static fsw_status_t fsw_reiserfs_volume_mount(struct fsw_reiserfs_volume *vol); static void fsw_reiserfs_volume_free(struct fsw_reiserfs_volume *vol); static fsw_status_t fsw_reiserfs_volume_stat(struct fsw_reiserfs_volume *vol, struct fsw_volume_stat *sb); static fsw_status_t fsw_reiserfs_dnode_fill(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno); static void fsw_reiserfs_dnode_free(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno); static fsw_status_t fsw_reiserfs_dnode_stat(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_dnode_stat *sb); static fsw_status_t fsw_reiserfs_get_extent(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_extent *extent); static fsw_status_t fsw_reiserfs_dir_lookup(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_string *lookup_name, struct fsw_reiserfs_dnode **child_dno); static fsw_status_t fsw_reiserfs_dir_read(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_shandle *shand, struct fsw_reiserfs_dnode **child_dno); static fsw_status_t fsw_reiserfs_readlink(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_string *link); static fsw_status_t fsw_reiserfs_item_search(struct fsw_reiserfs_volume *vol, fsw_u32 dir_id, fsw_u32 objectid, fsw_u64 offset, struct fsw_reiserfs_item *item); static fsw_status_t fsw_reiserfs_item_next(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_item *item); static void fsw_reiserfs_item_release(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_item *item); // // Dispatch Table // struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(reiserfs) = { { FSW_STRING_TYPE_ISO88591, 8, 8, "reiserfs" }, sizeof(struct fsw_reiserfs_volume), sizeof(struct fsw_reiserfs_dnode), fsw_reiserfs_volume_mount, fsw_reiserfs_volume_free, fsw_reiserfs_volume_stat, fsw_reiserfs_dnode_fill, fsw_reiserfs_dnode_free, fsw_reiserfs_dnode_stat, fsw_reiserfs_get_extent, fsw_reiserfs_dir_lookup, fsw_reiserfs_dir_read, fsw_reiserfs_readlink, }; // misc data static fsw_u32 superblock_offsets[3] = { REISERFS_DISK_OFFSET_IN_BYTES >> REISERFS_SUPERBLOCK_BLOCKSIZEBITS, REISERFS_OLD_DISK_OFFSET_IN_BYTES >> REISERFS_SUPERBLOCK_BLOCKSIZEBITS, 0 }; /** * Mount an reiserfs volume. Reads the superblock and constructs the * root directory dnode. */ static fsw_status_t fsw_reiserfs_volume_mount(struct fsw_reiserfs_volume *vol) { fsw_status_t status; void *buffer; fsw_u32 blocksize; int i; struct fsw_string s; // allocate memory to keep the superblock around status = fsw_alloc(sizeof(struct reiserfs_super_block), &vol->sb); if (status) return status; // read the superblock into its buffer fsw_set_blocksize(vol, REISERFS_SUPERBLOCK_BLOCKSIZE, REISERFS_SUPERBLOCK_BLOCKSIZE); for (i = 0; superblock_offsets[i]; i++) { status = fsw_block_get(vol, superblock_offsets[i], 0, &buffer); if (status) return status; fsw_memcpy(vol->sb, buffer, sizeof(struct reiserfs_super_block)); fsw_block_release(vol, superblock_offsets[i], buffer); // check for one of the magic strings if (fsw_memeq(vol->sb->s_v1.s_magic, REISERFS_SUPER_MAGIC_STRING, 8)) { vol->version = REISERFS_VERSION_1; break; } else if (fsw_memeq(vol->sb->s_v1.s_magic, REISER2FS_SUPER_MAGIC_STRING, 9)) { vol->version = REISERFS_VERSION_2; break; } else if (fsw_memeq(vol->sb->s_v1.s_magic, REISER2FS_JR_SUPER_MAGIC_STRING, 9)) { vol->version = vol->sb->s_v1.s_version; if (vol->version == REISERFS_VERSION_1 || vol->version == REISERFS_VERSION_2) break; } } if (superblock_offsets[i] == 0) return FSW_UNSUPPORTED; // check the superblock if (vol->sb->s_v1.s_root_block == -1) // unfinished 'reiserfsck --rebuild-tree' return FSW_VOLUME_CORRUPTED; /* if (vol->sb->s_rev_level != EXT2_GOOD_OLD_REV && vol->sb->s_rev_level != EXT2_DYNAMIC_REV) return FSW_UNSUPPORTED; if (vol->sb->s_rev_level == EXT2_DYNAMIC_REV && (vol->sb->s_feature_incompat & ~(EXT2_FEATURE_INCOMPAT_FILETYPE | EXT3_FEATURE_INCOMPAT_RECOVER))) return FSW_UNSUPPORTED; */ // set real blocksize blocksize = vol->sb->s_v1.s_blocksize; fsw_set_blocksize(vol, blocksize, blocksize); // get other info from superblock /* vol->ind_bcnt = EXT2_ADDR_PER_BLOCK(vol->sb); vol->dind_bcnt = vol->ind_bcnt * vol->ind_bcnt; vol->inode_size = EXT2_INODE_SIZE(vol->sb); */ for (i = 0; i < 16; i++) if (vol->sb->s_label[i] == 0) break; s.type = FSW_STRING_TYPE_ISO88591; s.size = s.len = i; s.data = vol->sb->s_label; status = fsw_strdup_coerce(&vol->g.label, vol->g.host_string_type, &s); if (status) return status; // setup the root dnode status = fsw_dnode_create_root(vol, REISERFS_ROOT_OBJECTID, &vol->g.root); if (status) return status; vol->g.root->dir_id = REISERFS_ROOT_PARENT_OBJECTID; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_volume_mount: success, blocksize %d tree height %d\n"), blocksize, vol->sb->s_v1.s_tree_height)); return FSW_SUCCESS; } /** * Free the volume data structure. Called by the core after an unmount or after * an unsuccessful mount to release the memory used by the file system type specific * part of the volume structure. */ static void fsw_reiserfs_volume_free(struct fsw_reiserfs_volume *vol) { if (vol->sb) fsw_free(vol->sb); } /** * Get in-depth information on a volume. */ static fsw_status_t fsw_reiserfs_volume_stat(struct fsw_reiserfs_volume *vol, struct fsw_volume_stat *sb) { sb->total_bytes = (fsw_u64)vol->sb->s_v1.s_block_count * vol->g.log_blocksize; sb->free_bytes = (fsw_u64)vol->sb->s_v1.s_free_blocks * vol->g.log_blocksize; return FSW_SUCCESS; } /** * Get full information on a dnode from disk. This function is called by the core * whenever it needs to access fields in the dnode structure that may not * be filled immediately upon creation of the dnode. In the case of reiserfs, we * delay fetching of the stat data until dnode_fill is called. The size and * type fields are invalid until this function has been called. */ static fsw_status_t fsw_reiserfs_dnode_fill(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno) { fsw_status_t status; fsw_u32 item_len, mode; struct fsw_reiserfs_item item; if (dno->sd_v1 || dno->sd_v2) return FSW_SUCCESS; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_dnode_fill: object %d/%d\n"), dno->dir_id, dno->g.dnode_id)); // find stat data item in reiserfs tree status = fsw_reiserfs_item_search(vol, dno->dir_id, dno->g.dnode_id, 0, &item); if (status == FSW_NOT_FOUND) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_dnode_fill: cannot find stat_data for object %d/%d\n"), dno->dir_id, dno->g.dnode_id)); return FSW_VOLUME_CORRUPTED; } if (status) return status; if (item.item_offset != 0) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_dnode_fill: got item that's not stat_data\n"))); fsw_reiserfs_item_release(vol, &item); return FSW_VOLUME_CORRUPTED; } item_len = item.ih.ih_item_len; // get data in appropriate version if (item.ih.ih_version == KEY_FORMAT_3_5 && item_len == SD_V1_SIZE) { // have stat_data_v1 structure status = fsw_memdup((void **)&dno->sd_v1, item.item_data, item_len); fsw_reiserfs_item_release(vol, &item); if (status) return status; // get info from the inode dno->g.size = dno->sd_v1->sd_size; mode = dno->sd_v1->sd_mode; } else if (item.ih.ih_version == KEY_FORMAT_3_6 && item_len == SD_V2_SIZE) { // have stat_data_v2 structure status = fsw_memdup((void **)&dno->sd_v2, item.item_data, item_len); fsw_reiserfs_item_release(vol, &item); if (status) return status; // get info from the inode dno->g.size = dno->sd_v2->sd_size; mode = dno->sd_v2->sd_mode; } else { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_dnode_fill: version %d(%d) and size %d(%d) not recognized for stat_data\n"), item.ih.ih_version, KEY_FORMAT_3_6, item_len, SD_V2_SIZE)); fsw_reiserfs_item_release(vol, &item); return FSW_VOLUME_CORRUPTED; } // get node type from mode field if (S_ISREG(mode)) dno->g.type = FSW_DNODE_TYPE_FILE; else if (S_ISDIR(mode)) dno->g.type = FSW_DNODE_TYPE_DIR; else if (S_ISLNK(mode)) dno->g.type = FSW_DNODE_TYPE_SYMLINK; else dno->g.type = FSW_DNODE_TYPE_SPECIAL; return FSW_SUCCESS; } /** * Free the dnode data structure. Called by the core when deallocating a dnode * structure to release the memory used by the file system type specific part * of the dnode structure. */ static void fsw_reiserfs_dnode_free(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno) { if (dno->sd_v1) fsw_free(dno->sd_v1); if (dno->sd_v2) fsw_free(dno->sd_v2); } /** * Get in-depth information on a dnode. The core makes sure that fsw_reiserfs_dnode_fill * has been called on the dnode before this function is called. Note that some * data is not directly stored into the structure, but passed to a host-specific * callback that converts it to the host-specific format. */ static fsw_status_t fsw_reiserfs_dnode_stat(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_dnode_stat *sb) { if (dno->sd_v1) { if (dno->g.type == FSW_DNODE_TYPE_SPECIAL) sb->used_bytes = 0; else sb->used_bytes = dno->sd_v1->u.sd_blocks * vol->g.log_blocksize; sb->store_time_posix(sb, FSW_DNODE_STAT_CTIME, dno->sd_v1->sd_ctime); sb->store_time_posix(sb, FSW_DNODE_STAT_ATIME, dno->sd_v1->sd_atime); sb->store_time_posix(sb, FSW_DNODE_STAT_MTIME, dno->sd_v1->sd_mtime); sb->store_attr_posix(sb, dno->sd_v1->sd_mode); } else if (dno->sd_v2) { sb->used_bytes = dno->sd_v2->sd_blocks * vol->g.log_blocksize; sb->store_time_posix(sb, FSW_DNODE_STAT_CTIME, dno->sd_v2->sd_ctime); sb->store_time_posix(sb, FSW_DNODE_STAT_ATIME, dno->sd_v2->sd_atime); sb->store_time_posix(sb, FSW_DNODE_STAT_MTIME, dno->sd_v2->sd_mtime); sb->store_attr_posix(sb, dno->sd_v2->sd_mode); } return FSW_SUCCESS; } /** * Retrieve file data mapping information. This function is called by the core when * fsw_shandle_read needs to know where on the disk the required piece of the file's * data can be found. The core makes sure that fsw_reiserfs_dnode_fill has been called * on the dnode before. Our task here is to get the physical disk block number for * the requested logical block number. */ static fsw_status_t fsw_reiserfs_get_extent(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_extent *extent) { fsw_status_t status; fsw_u64 search_offset, intra_offset; struct fsw_reiserfs_item item; fsw_u32 intra_bno, nr_item; // Preconditions: The caller has checked that the requested logical block // is within the file's size. The dnode has complete information, i.e. // fsw_reiserfs_dnode_read_info was called successfully on it. FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_get_extent: mapping block %d of object %d/%d\n"), extent->log_start, dno->dir_id, dno->g.dnode_id)); extent->type = FSW_EXTENT_TYPE_SPARSE; extent->log_count = 1; // get the item for the requested block search_offset = (fsw_u64)extent->log_start * vol->g.log_blocksize + 1; status = fsw_reiserfs_item_search(vol, dno->dir_id, dno->g.dnode_id, search_offset, &item); if (status) return status; if (item.item_offset == 0) { fsw_reiserfs_item_release(vol, &item); return FSW_SUCCESS; // no data items found, assume all-sparse file } intra_offset = search_offset - item.item_offset; // check the kind of block if (item.item_type == TYPE_INDIRECT || item.item_type == V1_INDIRECT_UNIQUENESS) { // indirect item, contains block numbers if (intra_offset & (vol->g.log_blocksize - 1)) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_get_extent: intra_offset not block-aligned for indirect block\n"))); goto bail; } intra_bno = (fsw_u32)FSW_U64_DIV(intra_offset, vol->g.log_blocksize); nr_item = item.ih.ih_item_len / sizeof(fsw_u32); if (intra_bno >= nr_item) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_get_extent: indirect block too small\n"))); goto bail; } extent->type = FSW_EXTENT_TYPE_PHYSBLOCK; extent->phys_start = ((fsw_u32 *)item.item_data)[intra_bno]; // TODO: check if the following blocks can be aggregated into one extent fsw_reiserfs_item_release(vol, &item); return FSW_SUCCESS; } else if (item.item_type == TYPE_DIRECT || item.item_type == V1_DIRECT_UNIQUENESS) { // direct item, contains file data // TODO: Check if direct items always start on block boundaries. If not, we may have // to do extra work here. if (intra_offset != 0) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_get_extent: intra_offset not aligned for direct block\n"))); goto bail; } extent->type = FSW_EXTENT_TYPE_BUFFER; status = fsw_memdup(&extent->buffer, item.item_data, item.ih.ih_item_len); fsw_reiserfs_item_release(vol, &item); if (status) return status; return FSW_SUCCESS; } bail: fsw_reiserfs_item_release(vol, &item); return FSW_VOLUME_CORRUPTED; /* // check if the following blocks can be aggregated into one extent file_bcnt = (fsw_u32)((dno->g.size + vol->g.log_blocksize - 1) & (vol->g.log_blocksize - 1)); while (path[i] + extent->log_count < buf_bcnt && // indirect block has more block pointers extent->log_start + extent->log_count < file_bcnt) { // file has more blocks if (buffer[path[i] + extent->log_count] == buffer[path[i] + extent->log_count - 1] + 1) extent->log_count++; else break; } */ } /** * Lookup a directory's child dnode by name. This function is called on a directory * to retrieve the directory entry with the given name. A dnode is constructed for * this entry and returned. The core makes sure that fsw_reiserfs_dnode_fill has been called * and the dnode is actually a directory. */ static fsw_status_t fsw_reiserfs_dir_lookup(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_string *lookup_name, struct fsw_reiserfs_dnode **child_dno_out) { fsw_status_t status; struct fsw_reiserfs_item item; fsw_u32 nr_item, i, name_offset, next_name_offset, name_len; fsw_u32 child_dir_id; struct reiserfs_de_head *dhead; struct fsw_string entry_name; // Preconditions: The caller has checked that dno is a directory node. // BIG TODOS: Use the hash function to start with the item containing the entry. // Use binary search within the item. entry_name.type = FSW_STRING_TYPE_ISO88591; // get the item for that position status = fsw_reiserfs_item_search(vol, dno->dir_id, dno->g.dnode_id, FIRST_ITEM_OFFSET, &item); if (status) return status; if (item.item_offset == 0) { fsw_reiserfs_item_release(vol, &item); return FSW_NOT_FOUND; // empty directory or something } for(;;) { // search the directory item dhead = (struct reiserfs_de_head *)item.item_data; nr_item = item.ih.u.ih_entry_count; next_name_offset = item.ih.ih_item_len; for (i = 0; i < nr_item; i++, dhead++, next_name_offset = name_offset) { // get the name name_offset = dhead->deh_location; name_len = next_name_offset - name_offset; while (name_len > 0 && item.item_data[name_offset + name_len - 1] == 0) name_len--; entry_name.len = entry_name.size = name_len; entry_name.data = item.item_data + name_offset; // compare name if (fsw_streq(lookup_name, &entry_name)) { // found the entry we're looking for! // setup a dnode for the child item status = fsw_dnode_create(dno, dhead->deh_objectid, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); child_dir_id = dhead->deh_dir_id; fsw_reiserfs_item_release(vol, &item); if (status) return status; (*child_dno_out)->dir_id = child_dir_id; return FSW_SUCCESS; } } // We didn't find the next directory entry in this item. Look for the next // item of the directory. status = fsw_reiserfs_item_next(vol, &item); if (status) return status; } } /** * Get the next directory entry when reading a directory. This function is called during * directory iteration to retrieve the next directory entry. A dnode is constructed for * the entry and returned. The core makes sure that fsw_reiserfs_dnode_fill has been called * and the dnode is actually a directory. The shandle provided by the caller is used to * record the position in the directory between calls. */ static fsw_status_t fsw_reiserfs_dir_read(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_shandle *shand, struct fsw_reiserfs_dnode **child_dno_out) { fsw_status_t status; struct fsw_reiserfs_item item; fsw_u32 nr_item, i, name_offset, next_name_offset, name_len; fsw_u32 child_dir_id; struct reiserfs_de_head *dhead; struct fsw_string entry_name; // Preconditions: The caller has checked that dno is a directory node. The caller // has opened a storage handle to the directory's storage and keeps it around between // calls. // BIG TODOS: Use binary search within the item. // adjust pointer to first entry if necessary if (shand->pos == 0) shand->pos = FIRST_ITEM_OFFSET; // get the item for that position status = fsw_reiserfs_item_search(vol, dno->dir_id, dno->g.dnode_id, shand->pos, &item); if (status) return status; if (item.item_offset == 0) { fsw_reiserfs_item_release(vol, &item); return FSW_NOT_FOUND; // empty directory or something } for(;;) { // search the directory item dhead = (struct reiserfs_de_head *)item.item_data; nr_item = item.ih.u.ih_entry_count; for (i = 0; i < nr_item; i++, dhead++) { if (dhead->deh_offset < shand->pos) continue; // not yet past the last entry returned if (dhead->deh_offset == DOT_OFFSET || dhead->deh_offset == DOT_DOT_OFFSET) continue; // never report . or .. // get the name name_offset = dhead->deh_location; if (i == 0) next_name_offset = item.ih.ih_item_len; else next_name_offset = dhead[-1].deh_location; name_len = next_name_offset - name_offset; while (name_len > 0 && item.item_data[name_offset + name_len - 1] == 0) name_len--; entry_name.type = FSW_STRING_TYPE_ISO88591; entry_name.len = entry_name.size = name_len; entry_name.data = item.item_data + name_offset; if (fsw_streq_cstr(&entry_name, ".reiserfs_priv")) continue; // never report this special file // found the next entry! shand->pos = dhead->deh_offset + 1; // setup a dnode for the child item status = fsw_dnode_create(dno, dhead->deh_objectid, FSW_DNODE_TYPE_UNKNOWN, &entry_name, child_dno_out); child_dir_id = dhead->deh_dir_id; fsw_reiserfs_item_release(vol, &item); if (status) return status; (*child_dno_out)->dir_id = child_dir_id; return FSW_SUCCESS; } // We didn't find the next directory entry in this item. Look for the next // item of the directory. status = fsw_reiserfs_item_next(vol, &item); if (status) return status; } } /** * Get the target path of a symbolic link. This function is called when a symbolic * link needs to be resolved. The core makes sure that the fsw_reiserfs_dnode_fill has been * called on the dnode and that it really is a symlink. */ static fsw_status_t fsw_reiserfs_readlink(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_dnode *dno, struct fsw_string *link_target) { return fsw_dnode_readlink_data(dno, link_target); } /** * Compare an on-disk tree key against the search key. */ static int fsw_reiserfs_compare_key(struct reiserfs_key *key, fsw_u32 dir_id, fsw_u32 objectid, fsw_u64 offset) { fsw_u32 key_type; fsw_u64 key_offset; if (key->k_dir_id > dir_id) return FIRST_GREATER; if (key->k_dir_id < dir_id) return SECOND_GREATER; if (key->k_objectid > objectid) return FIRST_GREATER; if (key->k_objectid < objectid) return SECOND_GREATER; // determine format of the on-disk key key_type = (fsw_u32)FSW_U64_SHR(key->u.k_offset_v2.v, 60); if (key_type != TYPE_DIRECT && key_type != TYPE_INDIRECT && key_type != TYPE_DIRENTRY) { // detected 3.5 format (_v1) key_offset = key->u.k_offset_v1.k_offset; } else { // detected 3.6 format (_v2) key_offset = key->u.k_offset_v2.v & (~0ULL >> 4); } if (key_offset > offset) return FIRST_GREATER; if (key_offset < offset) return SECOND_GREATER; return KEYS_IDENTICAL; } /** * Find an item by key in the reiserfs tree. */ static fsw_status_t fsw_reiserfs_item_search(struct fsw_reiserfs_volume *vol, fsw_u32 dir_id, fsw_u32 objectid, fsw_u64 offset, struct fsw_reiserfs_item *item) { fsw_status_t status; int comp_result; fsw_u32 tree_bno, next_tree_bno, tree_level, nr_item, i; fsw_u8 *buffer; struct block_head *bhead; struct reiserfs_key *key; struct item_head *ihead; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_item_search: searching %d/%d/%lld\n"), dir_id, objectid, offset)); // BIG TODOS: Use binary search within the item. // Remember tree path for "get next item" function. item->valid = 0; item->block_bno = 0; // walk the tree tree_bno = vol->sb->s_v1.s_root_block; for (tree_level = vol->sb->s_v1.s_tree_height - 1; ; tree_level--) { // get the current tree block into memory status = fsw_block_get(vol, tree_bno, tree_level, (void **)&buffer); if (status) return status; bhead = (struct block_head *)buffer; if (bhead->blk_level != tree_level) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_item_search: tree block %d has not expected level %d\n"), tree_bno, tree_level)); fsw_block_release(vol, tree_bno, buffer); return FSW_VOLUME_CORRUPTED; } nr_item = bhead->blk_nr_item; FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_reiserfs_item_search: visiting block %d level %d items %d\n"), tree_bno, tree_level, nr_item)); item->path_bno[tree_level] = tree_bno; // check if we have reached a leaf block if (tree_level == DISK_LEAF_NODE_LEVEL) break; // search internal node block, look for the path to follow key = (struct reiserfs_key *)(buffer + BLKH_SIZE); for (i = 0; i < nr_item; i++, key++) { if (fsw_reiserfs_compare_key(key, dir_id, objectid, offset) == FIRST_GREATER) break; } item->path_index[tree_level] = i; next_tree_bno = ((struct disk_child *)(buffer + BLKH_SIZE + nr_item * KEY_SIZE))[i].dc_block_number; fsw_block_release(vol, tree_bno, buffer); tree_bno = next_tree_bno; } // search leaf node block, look for our data ihead = (struct item_head *)(buffer + BLKH_SIZE); for (i = 0; i < nr_item; i++, ihead++) { comp_result = fsw_reiserfs_compare_key(&ihead->ih_key, dir_id, objectid, offset); if (comp_result == KEYS_IDENTICAL) break; if (comp_result == FIRST_GREATER) { // Current key is greater than the search key. Use the last key before this // one as the preliminary result. if (i == 0) { fsw_block_release(vol, tree_bno, buffer); return FSW_NOT_FOUND; } i--, ihead--; break; } } if (i >= nr_item) { // Go back to the last key, it was smaller than the search key. // NOTE: The first key of the next leaf block is guaranteed to be greater than // our search key. i--, ihead--; } item->path_index[tree_level] = i; // Since we may have a key that is smaller than the search key, verify that // it is for the same object. if (ihead->ih_key.k_dir_id != dir_id || ihead->ih_key.k_objectid != objectid) { fsw_block_release(vol, tree_bno, buffer); return FSW_NOT_FOUND; // Found no key for this object at all } // return results fsw_memcpy(&item->ih, ihead, sizeof(struct item_head)); item->item_type = (fsw_u32)FSW_U64_SHR(ihead->ih_key.u.k_offset_v2.v, 60); if (item->item_type != TYPE_DIRECT && item->item_type != TYPE_INDIRECT && item->item_type != TYPE_DIRENTRY) { // 3.5 format (_v1) item->item_type = ihead->ih_key.u.k_offset_v1.k_uniqueness; item->item_offset = ihead->ih_key.u.k_offset_v1.k_offset; } else { // 3.6 format (_v2) item->item_offset = ihead->ih_key.u.k_offset_v2.v & (~0ULL >> 4); } item->item_data = buffer + ihead->ih_item_location; item->valid = 1; // add information for block release item->block_bno = tree_bno; item->block_buffer = buffer; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_item_search: found %d/%d/%lld (%d)\n"), ihead->ih_key.k_dir_id, ihead->ih_key.k_objectid, item->item_offset, item->item_type)); return FSW_SUCCESS; } /** * Find the next item in the reiserfs tree for an already-found item. */ static fsw_status_t fsw_reiserfs_item_next(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_item *item) { fsw_status_t status; fsw_u32 dir_id, objectid; fsw_u64 offset; fsw_u32 tree_bno, next_tree_bno, tree_level, nr_item, nr_ptr_item; fsw_u8 *buffer; struct block_head *bhead; struct item_head *ihead; if (!item->valid) return FSW_NOT_FOUND; fsw_reiserfs_item_release(vol, item); // TODO: maybe delay this and/or use the cached block! dir_id = item->ih.ih_key.k_dir_id; objectid = item->ih.ih_key.k_objectid; offset = item->item_offset; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_item_next: next for %d/%d/%lld\n"), dir_id, objectid, offset)); // find a node that has more items, moving up until we find one for (tree_level = DISK_LEAF_NODE_LEVEL; tree_level < vol->sb->s_v1.s_tree_height; tree_level++) { // get the current tree block into memory tree_bno = item->path_bno[tree_level]; status = fsw_block_get(vol, tree_bno, tree_level, (void **)&buffer); if (status) return status; bhead = (struct block_head *)buffer; if (bhead->blk_level != tree_level) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_item_next: tree block %d has not expected level %d\n"), tree_bno, tree_level)); fsw_block_release(vol, tree_bno, buffer); return FSW_VOLUME_CORRUPTED; } nr_item = bhead->blk_nr_item; FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_reiserfs_item_next: visiting block %d level %d items %d\n"), tree_bno, tree_level, nr_item)); nr_ptr_item = nr_item + ((tree_level > DISK_LEAF_NODE_LEVEL) ? 1 : 0); // internal nodes have (nr_item) keys and (nr_item+1) pointers item->path_index[tree_level]++; if (item->path_index[tree_level] >= nr_ptr_item) { item->path_index[tree_level] = 0; fsw_block_release(vol, tree_bno, buffer); continue; // this node doesn't have any more items, move up one level } // we have a new path to follow, move down to the leaf node again while (tree_level > DISK_LEAF_NODE_LEVEL) { // get next pointer from current block next_tree_bno = ((struct disk_child *)(buffer + BLKH_SIZE + nr_item * KEY_SIZE))[item->path_index[tree_level]].dc_block_number; fsw_block_release(vol, tree_bno, buffer); tree_bno = next_tree_bno; tree_level--; // get the current tree block into memory status = fsw_block_get(vol, tree_bno, tree_level, (void **)&buffer); if (status) return status; bhead = (struct block_head *)buffer; if (bhead->blk_level != tree_level) { FSW_MSG_ASSERT((FSW_MSGSTR("fsw_reiserfs_item_next: tree block %d has not expected level %d\n"), tree_bno, tree_level)); fsw_block_release(vol, tree_bno, buffer); return FSW_VOLUME_CORRUPTED; } nr_item = bhead->blk_nr_item; FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_reiserfs_item_next: visiting block %d level %d items %d\n"), tree_bno, tree_level, nr_item)); item->path_bno[tree_level] = tree_bno; } // get the item from the leaf node ihead = ((struct item_head *)(buffer + BLKH_SIZE)) + item->path_index[tree_level]; // We now have the item that follows the previous one in the tree. Check that it // belongs to the same object. if (ihead->ih_key.k_dir_id != dir_id || ihead->ih_key.k_objectid != objectid) { fsw_block_release(vol, tree_bno, buffer); return FSW_NOT_FOUND; // Found no next key for this object } // return results fsw_memcpy(&item->ih, ihead, sizeof(struct item_head)); item->item_type = (fsw_u32)FSW_U64_SHR(ihead->ih_key.u.k_offset_v2.v, 60); if (item->item_type != TYPE_DIRECT && item->item_type != TYPE_INDIRECT && item->item_type != TYPE_DIRENTRY) { // 3.5 format (_v1) item->item_type = ihead->ih_key.u.k_offset_v1.k_uniqueness; item->item_offset = ihead->ih_key.u.k_offset_v1.k_offset; } else { // 3.6 format (_v2) item->item_offset = ihead->ih_key.u.k_offset_v2.v & (~0ULL >> 4); } item->item_data = buffer + ihead->ih_item_location; item->valid = 1; // add information for block release item->block_bno = tree_bno; item->block_buffer = buffer; FSW_MSG_DEBUG((FSW_MSGSTR("fsw_reiserfs_item_next: found %d/%d/%lld (%d)\n"), ihead->ih_key.k_dir_id, ihead->ih_key.k_objectid, item->item_offset, item->item_type)); return FSW_SUCCESS; } // we went to the highest level node and there still were no more items... return FSW_NOT_FOUND; } /** * Release the disk block still referenced by an item search result. */ static void fsw_reiserfs_item_release(struct fsw_reiserfs_volume *vol, struct fsw_reiserfs_item *item) { if (!item->valid) return; if (item->block_bno > 0) { fsw_block_release(vol, item->block_bno, item->block_buffer); item->block_bno = 0; } } // EOF refit-0.14/fsw/fsw_reiserfs.h0000644000175000017500000000461710463170777015602 0ustar julienjulien/** * \file fsw_reiserfs.h * ReiserFS file system driver header. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FSW_REISERFS_H_ #define _FSW_REISERFS_H_ #define VOLSTRUCTNAME fsw_reiserfs_volume #define DNODESTRUCTNAME fsw_reiserfs_dnode #include "fsw_core.h" #include "fsw_reiserfs_disk.h" //! Block size (in shift bits) to be used when reading the reiserfs superblock. #define REISERFS_SUPERBLOCK_BLOCKSIZEBITS 12 //! Block size (in bytes) to be used when reading the reiserfs superblock. #define REISERFS_SUPERBLOCK_BLOCKSIZE (1<s_rs * the version in RAM is part of a larger structure containing fields never written to disk. */ #define UNSET_HASH 0 // read_super will guess about, what hash names // in directories were sorted with #define TEA_HASH 1 #define YURA_HASH 2 #define R5_HASH 3 #define DEFAULT_HASH R5_HASH struct journal_params { __le32 jp_journal_1st_block; /* where does journal start from on its * device */ __le32 jp_journal_dev; /* journal device st_rdev */ __le32 jp_journal_size; /* size of the journal */ __le32 jp_journal_trans_max; /* max number of blocks in a transaction. */ __le32 jp_journal_magic; /* random value made on fs creation (this * was sb_journal_block_count) */ __le32 jp_journal_max_batch; /* max number of blocks to batch into a * trans */ __le32 jp_journal_max_commit_age; /* in seconds, how old can an async * commit be */ __le32 jp_journal_max_trans_age; /* in seconds, how old can a transaction * be */ }; /* this is the super from 3.5.X, where X >= 10 */ struct reiserfs_super_block_v1 { __le32 s_block_count; /* blocks count */ __le32 s_free_blocks; /* free blocks count */ __le32 s_root_block; /* root block number */ struct journal_params s_journal; __le16 s_blocksize; /* block size */ __le16 s_oid_maxsize; /* max size of object id array, see * get_objectid() commentary */ __le16 s_oid_cursize; /* current size of object id array */ __le16 s_umount_state; /* this is set to 1 when filesystem was * umounted, to 2 - when not */ char s_magic[10]; /* reiserfs magic string indicates that * file system is reiserfs: * "ReIsErFs" or "ReIsEr2Fs" or "ReIsEr3Fs" */ __le16 s_fs_state; /* it is set to used by fsck to mark which * phase of rebuilding is done */ __le32 s_hash_function_code; /* indicate, what hash function is being use * to sort names in a directory*/ __le16 s_tree_height; /* height of disk tree */ __le16 s_bmap_nr; /* amount of bitmap blocks needed to address * each block of file system */ __le16 s_version; /* this field is only reliable on filesystem * with non-standard journal */ __le16 s_reserved_for_journal; /* size in blocks of journal area on main * device, we need to keep after * making fs with non-standard journal */ } ATTR_PACKED; #define SB_SIZE_V1 (sizeof(struct reiserfs_super_block_v1)) /* this is the on disk super block */ struct reiserfs_super_block { struct reiserfs_super_block_v1 s_v1; __le32 s_inode_generation; __le32 s_flags; /* Right now used only by inode-attributes, if enabled */ unsigned char s_uuid[16]; /* filesystem unique identifier */ unsigned char s_label[16]; /* filesystem volume label */ char s_unused[88]; /* zero filled by mkreiserfs and * reiserfs_convert_objectid_map_v1() * so any additions must be updated * there as well. */ } ATTR_PACKED; #define SB_SIZE (sizeof(struct reiserfs_super_block)) #define REISERFS_VERSION_1 0 #define REISERFS_VERSION_2 2 // on-disk super block fields converted to cpu form #define SB_DISK_SUPER_BLOCK(s) (REISERFS_SB(s)->s_rs) #define SB_V1_DISK_SUPER_BLOCK(s) (&(SB_DISK_SUPER_BLOCK(s)->s_v1)) #define SB_BLOCKSIZE(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_blocksize)) #define SB_BLOCK_COUNT(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_block_count)) #define SB_FREE_BLOCKS(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_free_blocks)) #define SB_REISERFS_MAGIC(s) \ (SB_V1_DISK_SUPER_BLOCK(s)->s_magic) #define SB_ROOT_BLOCK(s) \ le32_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_root_block)) #define SB_TREE_HEIGHT(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_tree_height)) #define SB_REISERFS_STATE(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_umount_state)) #define SB_VERSION(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_version)) #define SB_BMAP_NR(s) le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_bmap_nr)) #define SB_ONDISK_JP(s) (&SB_V1_DISK_SUPER_BLOCK(s)->s_journal) #define SB_ONDISK_JOURNAL_SIZE(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_size)) #define SB_ONDISK_JOURNAL_1st_BLOCK(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_1st_block)) #define SB_ONDISK_JOURNAL_DEVICE(s) \ le32_to_cpu ((SB_ONDISK_JP(s)->jp_journal_dev)) #define SB_ONDISK_RESERVED_FOR_JOURNAL(s) \ le16_to_cpu ((SB_V1_DISK_SUPER_BLOCK(s)->s_reserved_for_journal)) #define is_block_in_log_or_reserved_area(s, block) \ block >= SB_JOURNAL_1st_RESERVED_BLOCK(s) \ && block < SB_JOURNAL_1st_RESERVED_BLOCK(s) + \ ((!is_reiserfs_jr(SB_DISK_SUPER_BLOCK(s)) ? \ SB_ONDISK_JOURNAL_SIZE(s) + 1 : SB_ONDISK_RESERVED_FOR_JOURNAL(s))) /* used by gcc */ #define REISERFS_SUPER_MAGIC 0x52654973 /* used by file system utilities that look at the superblock, etc. */ #define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" #define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" #define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" /* ReiserFS leaves the first 64k unused, so that partition labels have enough space. If someone wants to write a fancy bootloader that needs more than 64k, let us know, and this will be increased in size. This number must be larger than than the largest block size on any platform, or code will break. -Hans */ #define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024) #define REISERFS_FIRST_BLOCK unused_define #define REISERFS_JOURNAL_OFFSET_IN_BYTES REISERFS_DISK_OFFSET_IN_BYTES /* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */ #define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024) // reiserfs internal error code (used by search_by_key adn fix_nodes)) #define CARRY_ON 0 #define REPEAT_SEARCH -1 #define IO_ERROR -2 #define NO_DISK_SPACE -3 #define NO_BALANCING_NEEDED (-4) #define NO_MORE_UNUSED_CONTIGUOUS_BLOCKS (-5) #define QUOTA_EXCEEDED -6 typedef __u32 b_blocknr_t; typedef __le32 unp_t; struct unfm_nodeinfo { unp_t unfm_nodenum; unsigned short unfm_freespace; }; /* there are two formats of keys: 3.5 and 3.6 */ #define KEY_FORMAT_3_5 0 #define KEY_FORMAT_3_6 1 /* there are two stat datas */ #define STAT_DATA_V1 0 #define STAT_DATA_V2 1 /** this says about version of key of all items (but stat data) the object consists of */ #define get_inode_item_key_version( inode ) \ ((REISERFS_I(inode)->i_flags & i_item_key_version_mask) ? KEY_FORMAT_3_6 : KEY_FORMAT_3_5) #define set_inode_item_key_version( inode, version ) \ ({ if((version)==KEY_FORMAT_3_6) \ REISERFS_I(inode)->i_flags |= i_item_key_version_mask; \ else \ REISERFS_I(inode)->i_flags &= ~i_item_key_version_mask; }) #define get_inode_sd_version(inode) \ ((REISERFS_I(inode)->i_flags & i_stat_data_version_mask) ? STAT_DATA_V2 : STAT_DATA_V1) #define set_inode_sd_version(inode, version) \ ({ if((version)==STAT_DATA_V2) \ REISERFS_I(inode)->i_flags |= i_stat_data_version_mask; \ else \ REISERFS_I(inode)->i_flags &= ~i_stat_data_version_mask; }) /* This is an aggressive tail suppression policy, I am hoping it improves our benchmarks. The principle behind it is that percentage space saving is what matters, not absolute space saving. This is non-intuitive, but it helps to understand it if you consider that the cost to access 4 blocks is not much more than the cost to access 1 block, if you have to do a seek and rotate. A tail risks a non-linear disk access that is significant as a percentage of total time cost for a 4 block file and saves an amount of space that is less significant as a percentage of space, or so goes the hypothesis. -Hans */ #define STORE_TAIL_IN_UNFM_S1(n_file_size,n_tail_size,n_block_size) \ (\ (!(n_tail_size)) || \ (((n_tail_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) || \ ( (n_file_size) >= (n_block_size) * 4 ) || \ ( ( (n_file_size) >= (n_block_size) * 3 ) && \ ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size))/4) ) || \ ( ( (n_file_size) >= (n_block_size) * 2 ) && \ ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size))/2) ) || \ ( ( (n_file_size) >= (n_block_size) ) && \ ( (n_tail_size) >= (MAX_DIRECT_ITEM_LEN(n_block_size) * 3)/4) ) ) \ ) /* Another strategy for tails, this one means only create a tail if all the file would fit into one DIRECT item. Primary intention for this one is to increase performance by decreasing seeking. */ #define STORE_TAIL_IN_UNFM_S2(n_file_size,n_tail_size,n_block_size) \ (\ (!(n_tail_size)) || \ (((n_file_size) > MAX_DIRECT_ITEM_LEN(n_block_size)) ) \ ) /* * values for s_umount_state field */ #define REISERFS_VALID_FS 1 #define REISERFS_ERROR_FS 2 // // there are 5 item types currently // #define TYPE_STAT_DATA 0 #define TYPE_INDIRECT 1 #define TYPE_DIRECT 2 #define TYPE_DIRENTRY 3 #define TYPE_MAXTYPE 3 #define TYPE_ANY 15 // FIXME: comment is required /***************************************************************************/ /* KEY & ITEM HEAD */ /***************************************************************************/ // // directories use this key as well as old files // struct offset_v1 { __le32 k_offset; __le32 k_uniqueness; } ATTR_PACKED; struct offset_v2 { __le64 v; } ATTR_PACKED; /* static inline __u16 offset_v2_k_type(const struct offset_v2 *v2) { __u8 type = le64_to_cpu(v2->v) >> 60; return (type <= TYPE_MAXTYPE) ? type : TYPE_ANY; } static inline loff_t offset_v2_k_offset(const struct offset_v2 *v2) { return le64_to_cpu(v2->v) & (~0ULL >> 4); } */ /* Key of an item determines its location in the S+tree, and is composed of 4 components */ struct reiserfs_key { __le32 k_dir_id; /* packing locality: by default parent directory object id */ __le32 k_objectid; /* object identifier */ union { struct offset_v1 k_offset_v1; struct offset_v2 k_offset_v2; } ATTR_PACKED u; } ATTR_PACKED; struct in_core_key { __u32 k_dir_id; /* packing locality: by default parent directory object id */ __u32 k_objectid; /* object identifier */ __u64 k_offset; __u8 k_type; }; struct cpu_key { struct in_core_key on_disk_key; int version; int key_length; /* 3 in all cases but direct2indirect and indirect2direct conversion */ }; /* Our function for comparing keys can compare keys of different lengths. It takes as a parameter the length of the keys it is to compare. These defines are used in determining what is to be passed to it as that parameter. */ #define REISERFS_FULL_KEY_LEN 4 #define REISERFS_SHORT_KEY_LEN 2 /* The result of the key compare */ #define FIRST_GREATER 1 #define SECOND_GREATER -1 #define KEYS_IDENTICAL 0 #define KEY_FOUND 1 #define KEY_NOT_FOUND 0 #define KEY_SIZE (sizeof(struct reiserfs_key)) #define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32)) /* return values for search_by_key and clones */ #define ITEM_FOUND 1 #define ITEM_NOT_FOUND 0 #define ENTRY_FOUND 1 #define ENTRY_NOT_FOUND 0 #define DIRECTORY_NOT_FOUND -1 #define REGULAR_FILE_FOUND -2 #define DIRECTORY_FOUND -3 #define BYTE_FOUND 1 #define BYTE_NOT_FOUND 0 #define FILE_NOT_FOUND -1 #define POSITION_FOUND 1 #define POSITION_NOT_FOUND 0 // return values for reiserfs_find_entry and search_by_entry_key #define NAME_FOUND 1 #define NAME_NOT_FOUND 0 #define GOTO_PREVIOUS_ITEM 2 #define NAME_FOUND_INVISIBLE 3 /* Everything in the filesystem is stored as a set of items. The item head contains the key of the item, its free space (for indirect items) and specifies the location of the item itself within the block. */ struct item_head { /* Everything in the tree is found by searching for it based on * its key.*/ struct reiserfs_key ih_key; union { /* The free space in the last unformatted node of an indirect item if this is an indirect item. This equals 0xFFFF iff this is a direct item or stat data item. Note that the key, not this field, is used to determine the item type, and thus which field this union contains. */ __le16 ih_free_space_reserved; /* Iff this is a directory item, this field equals the number of directory entries in the directory item. */ __le16 ih_entry_count; } ATTR_PACKED u; __le16 ih_item_len; /* total size of the item body */ __le16 ih_item_location; /* an offset to the item body * within the block */ __le16 ih_version; /* 0 for all old items, 2 for new ones. Highest bit is set by fsck temporary, cleaned after all done */ } ATTR_PACKED; /* size of item header */ #define IH_SIZE (sizeof(struct item_head)) #define ih_free_space(ih) le16_to_cpu((ih)->u.ih_free_space_reserved) #define ih_version(ih) le16_to_cpu((ih)->ih_version) #define ih_entry_count(ih) le16_to_cpu((ih)->u.ih_entry_count) #define ih_location(ih) le16_to_cpu((ih)->ih_item_location) #define ih_item_len(ih) le16_to_cpu((ih)->ih_item_len) #define unreachable_item(ih) (ih_version(ih) & (1 << 15)) #define get_ih_free_space(ih) (ih_version (ih) == KEY_FORMAT_3_6 ? 0 : ih_free_space (ih)) /* these operate on indirect items, where you've got an array of ints ** at a possibly unaligned location. These are a noop on ia32 ** ** p is the array of __u32, i is the index into the array, v is the value ** to store there. */ #define get_block_num(p, i) le32_to_cpu(get_unaligned((p) + (i))) // // in old version uniqueness field shows key type // #define V1_SD_UNIQUENESS 0 #define V1_INDIRECT_UNIQUENESS 0xfffffffe #define V1_DIRECT_UNIQUENESS 0xffffffff #define V1_DIRENTRY_UNIQUENESS 500 #define V1_ANY_UNIQUENESS 555 // FIXME: comment is required // // here are conversion routines // /* static inline int uniqueness2type(__u32 uniqueness) { switch ((int)uniqueness) { case V1_SD_UNIQUENESS: return TYPE_STAT_DATA; case V1_INDIRECT_UNIQUENESS: return TYPE_INDIRECT; case V1_DIRECT_UNIQUENESS: return TYPE_DIRECT; case V1_DIRENTRY_UNIQUENESS: return TYPE_DIRENTRY; default: reiserfs_warning(NULL, "vs-500: unknown uniqueness %d", uniqueness); case V1_ANY_UNIQUENESS: return TYPE_ANY; } } static inline __u32 type2uniqueness(int type) { switch (type) { case TYPE_STAT_DATA: return V1_SD_UNIQUENESS; case TYPE_INDIRECT: return V1_INDIRECT_UNIQUENESS; case TYPE_DIRECT: return V1_DIRECT_UNIQUENESS; case TYPE_DIRENTRY: return V1_DIRENTRY_UNIQUENESS; default: reiserfs_warning(NULL, "vs-501: unknown type %d", type); case TYPE_ANY: return V1_ANY_UNIQUENESS; } } */ // // key is pointer to on disk key which is stored in le, result is cpu, // there is no way to get version of object from key, so, provide // version to these defines // /* static inline loff_t le_key_k_offset(int version, const struct reiserfs_key *key) { return (version == KEY_FORMAT_3_5) ? le32_to_cpu(key->u.k_offset_v1.k_offset) : offset_v2_k_offset(&(key->u.k_offset_v2)); } static inline loff_t le_ih_k_offset(const struct item_head *ih) { return le_key_k_offset(ih_version(ih), &(ih->ih_key)); } static inline loff_t le_key_k_type(int version, const struct reiserfs_key *key) { return (version == KEY_FORMAT_3_5) ? uniqueness2type(le32_to_cpu(key->u.k_offset_v1.k_uniqueness)) : offset_v2_k_type(&(key->u.k_offset_v2)); } static inline loff_t le_ih_k_type(const struct item_head *ih) { return le_key_k_type(ih_version(ih), &(ih->ih_key)); } */ #define is_direntry_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRENTRY) #define is_direct_le_key(version,key) (le_key_k_type (version, key) == TYPE_DIRECT) #define is_indirect_le_key(version,key) (le_key_k_type (version, key) == TYPE_INDIRECT) #define is_statdata_le_key(version,key) (le_key_k_type (version, key) == TYPE_STAT_DATA) // // item header has version. // #define is_direntry_le_ih(ih) is_direntry_le_key (ih_version (ih), &((ih)->ih_key)) #define is_direct_le_ih(ih) is_direct_le_key (ih_version (ih), &((ih)->ih_key)) #define is_indirect_le_ih(ih) is_indirect_le_key (ih_version(ih), &((ih)->ih_key)) #define is_statdata_le_ih(ih) is_statdata_le_key (ih_version (ih), &((ih)->ih_key)) // // key is pointer to cpu key, result is cpu // /* static inline loff_t cpu_key_k_offset(const struct cpu_key *key) { return key->on_disk_key.k_offset; } static inline loff_t cpu_key_k_type(const struct cpu_key *key) { return key->on_disk_key.k_type; } static inline void cpu_key_k_offset_dec(struct cpu_key *key) { key->on_disk_key.k_offset--; } */ #define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY) #define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT) #define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT) #define is_statdata_cpu_key(key) (cpu_key_k_type (key) == TYPE_STAT_DATA) /* are these used ? */ #define is_direntry_cpu_ih(ih) (is_direntry_cpu_key (&((ih)->ih_key))) #define is_direct_cpu_ih(ih) (is_direct_cpu_key (&((ih)->ih_key))) #define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key))) #define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key))) #define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \ ( ! COMP_SHORT_KEYS(p_s_ih, p_s_key) && \ I_OFF_BYTE_IN_ITEM(p_s_ih, k_offset (p_s_key), n_blocksize) ) /* maximal length of item */ #define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE) #define MIN_ITEM_LEN 1 /* object identifier for root dir */ #define REISERFS_ROOT_OBJECTID 2 #define REISERFS_ROOT_PARENT_OBJECTID 1 /* * Picture represents a leaf of the S+tree * ______________________________________________________ * | | Array of | | | * |Block | Object-Item | F r e e | Objects- | * | head | Headers | S p a c e | Items | * |______|_______________|___________________|___________| */ /* Header of a disk block. More precisely, header of a formatted leaf or internal node, and not the header of an unformatted node. */ struct block_head { __le16 blk_level; /* Level of a block in the tree. */ __le16 blk_nr_item; /* Number of keys/items in a block. */ __le16 blk_free_space; /* Block free space in bytes. */ __le16 blk_reserved; /* dump this in v4/planA */ struct reiserfs_key blk_right_delim_key; /* kept only for compatibility */ }; #define BLKH_SIZE (sizeof(struct block_head)) #define blkh_level(p_blkh) (le16_to_cpu((p_blkh)->blk_level)) #define blkh_nr_item(p_blkh) (le16_to_cpu((p_blkh)->blk_nr_item)) #define blkh_free_space(p_blkh) (le16_to_cpu((p_blkh)->blk_free_space)) #define blkh_reserved(p_blkh) (le16_to_cpu((p_blkh)->blk_reserved)) #define blkh_right_delim_key(p_blkh) ((p_blkh)->blk_right_delim_key) /* * values for blk_level field of the struct block_head */ #define FREE_LEVEL 0 /* when node gets removed from the tree its blk_level is set to FREE_LEVEL. It is then used to see whether the node is still in the tree */ #define DISK_LEAF_NODE_LEVEL 1 /* Leaf node level. */ /* Given the buffer head of a formatted node, resolve to the block head of that node. */ #define B_BLK_HEAD(p_s_bh) ((struct block_head *)((p_s_bh)->b_data)) /* Number of items that are in buffer. */ #define B_NR_ITEMS(p_s_bh) (blkh_nr_item(B_BLK_HEAD(p_s_bh))) #define B_LEVEL(p_s_bh) (blkh_level(B_BLK_HEAD(p_s_bh))) #define B_FREE_SPACE(p_s_bh) (blkh_free_space(B_BLK_HEAD(p_s_bh))) /* Get right delimiting key. -- little endian */ #define B_PRIGHT_DELIM_KEY(p_s_bh) (&(blk_right_delim_key(B_BLK_HEAD(p_s_bh)) /* Does the buffer contain a disk leaf. */ #define B_IS_ITEMS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) == DISK_LEAF_NODE_LEVEL) /* Does the buffer contain a disk internal node */ #define B_IS_KEYS_LEVEL(p_s_bh) (B_LEVEL(p_s_bh) > DISK_LEAF_NODE_LEVEL \ && B_LEVEL(p_s_bh) <= MAX_HEIGHT) /***************************************************************************/ /* STAT DATA */ /***************************************************************************/ // // old stat data is 32 bytes long. We are going to distinguish new one by // different size // struct stat_data_v1 { __le16 sd_mode; /* file type, permissions */ __le16 sd_nlink; /* number of hard links */ __le16 sd_uid; /* owner */ __le16 sd_gid; /* group */ __le32 sd_size; /* file size */ __le32 sd_atime; /* time of last access */ __le32 sd_mtime; /* time file was last modified */ __le32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ union { __le32 sd_rdev; __le32 sd_blocks; /* number of blocks file uses */ } ATTR_PACKED u; __le32 sd_first_direct_byte; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals ~(__u32)0 there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy. Someday. -Hans */ } ATTR_PACKED; #define SD_V1_SIZE (sizeof(struct stat_data_v1)) #define stat_data_v1(ih) (ih_version (ih) == KEY_FORMAT_3_5) #define sd_v1_mode(sdp) (le16_to_cpu((sdp)->sd_mode)) #define set_sd_v1_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v)) #define sd_v1_nlink(sdp) (le16_to_cpu((sdp)->sd_nlink)) #define set_sd_v1_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le16(v)) #define sd_v1_uid(sdp) (le16_to_cpu((sdp)->sd_uid)) #define set_sd_v1_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le16(v)) #define sd_v1_gid(sdp) (le16_to_cpu((sdp)->sd_gid)) #define set_sd_v1_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le16(v)) #define sd_v1_size(sdp) (le32_to_cpu((sdp)->sd_size)) #define set_sd_v1_size(sdp,v) ((sdp)->sd_size = cpu_to_le32(v)) #define sd_v1_atime(sdp) (le32_to_cpu((sdp)->sd_atime)) #define set_sd_v1_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v)) #define sd_v1_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime)) #define set_sd_v1_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v)) #define sd_v1_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime)) #define set_sd_v1_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v)) #define sd_v1_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev)) #define set_sd_v1_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v)) #define sd_v1_blocks(sdp) (le32_to_cpu((sdp)->u.sd_blocks)) #define set_sd_v1_blocks(sdp,v) ((sdp)->u.sd_blocks = cpu_to_le32(v)) #define sd_v1_first_direct_byte(sdp) \ (le32_to_cpu((sdp)->sd_first_direct_byte)) #define set_sd_v1_first_direct_byte(sdp,v) \ ((sdp)->sd_first_direct_byte = cpu_to_le32(v)) /* #include */ /* inode flags stored in sd_attrs (nee sd_reserved) */ /* we want common flags to have the same values as in ext2, so chattr(1) will work without problems */ #define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE_FL #define REISERFS_APPEND_FL EXT2_APPEND_FL #define REISERFS_SYNC_FL EXT2_SYNC_FL #define REISERFS_NOATIME_FL EXT2_NOATIME_FL #define REISERFS_NODUMP_FL EXT2_NODUMP_FL #define REISERFS_SECRM_FL EXT2_SECRM_FL #define REISERFS_UNRM_FL EXT2_UNRM_FL #define REISERFS_COMPR_FL EXT2_COMPR_FL #define REISERFS_NOTAIL_FL EXT2_NOTAIL_FL /* persistent flags that file inherits from the parent directory */ #define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL | \ REISERFS_SYNC_FL | \ REISERFS_NOATIME_FL | \ REISERFS_NODUMP_FL | \ REISERFS_SECRM_FL | \ REISERFS_COMPR_FL | \ REISERFS_NOTAIL_FL ) /* Stat Data on disk (reiserfs version of UFS disk inode minus the address blocks) */ struct stat_data { __le16 sd_mode; /* file type, permissions */ __le16 sd_attrs; /* persistent inode flags */ __le32 sd_nlink; /* number of hard links */ __le64 sd_size; /* file size */ __le32 sd_uid; /* owner */ __le32 sd_gid; /* group */ __le32 sd_atime; /* time of last access */ __le32 sd_mtime; /* time file was last modified */ __le32 sd_ctime; /* time inode (stat data) was last changed (except changes to sd_atime and sd_mtime) */ __le32 sd_blocks; union { __le32 sd_rdev; __le32 sd_generation; //__le32 sd_first_direct_byte; /* first byte of file which is stored in a direct item: except that if it equals 1 it is a symlink and if it equals ~(__u32)0 there is no direct item. The existence of this field really grates on me. Let's replace it with a macro based on sd_size and our tail suppression policy? */ } ATTR_PACKED u; } ATTR_PACKED; // // this is 44 bytes long // #define SD_SIZE (sizeof(struct stat_data)) #define SD_V2_SIZE SD_SIZE #define stat_data_v2(ih) (ih_version (ih) == KEY_FORMAT_3_6) #define sd_v2_mode(sdp) (le16_to_cpu((sdp)->sd_mode)) #define set_sd_v2_mode(sdp,v) ((sdp)->sd_mode = cpu_to_le16(v)) /* sd_reserved */ /* set_sd_reserved */ #define sd_v2_nlink(sdp) (le32_to_cpu((sdp)->sd_nlink)) #define set_sd_v2_nlink(sdp,v) ((sdp)->sd_nlink = cpu_to_le32(v)) #define sd_v2_size(sdp) (le64_to_cpu((sdp)->sd_size)) #define set_sd_v2_size(sdp,v) ((sdp)->sd_size = cpu_to_le64(v)) #define sd_v2_uid(sdp) (le32_to_cpu((sdp)->sd_uid)) #define set_sd_v2_uid(sdp,v) ((sdp)->sd_uid = cpu_to_le32(v)) #define sd_v2_gid(sdp) (le32_to_cpu((sdp)->sd_gid)) #define set_sd_v2_gid(sdp,v) ((sdp)->sd_gid = cpu_to_le32(v)) #define sd_v2_atime(sdp) (le32_to_cpu((sdp)->sd_atime)) #define set_sd_v2_atime(sdp,v) ((sdp)->sd_atime = cpu_to_le32(v)) #define sd_v2_mtime(sdp) (le32_to_cpu((sdp)->sd_mtime)) #define set_sd_v2_mtime(sdp,v) ((sdp)->sd_mtime = cpu_to_le32(v)) #define sd_v2_ctime(sdp) (le32_to_cpu((sdp)->sd_ctime)) #define set_sd_v2_ctime(sdp,v) ((sdp)->sd_ctime = cpu_to_le32(v)) #define sd_v2_blocks(sdp) (le32_to_cpu((sdp)->sd_blocks)) #define set_sd_v2_blocks(sdp,v) ((sdp)->sd_blocks = cpu_to_le32(v)) #define sd_v2_rdev(sdp) (le32_to_cpu((sdp)->u.sd_rdev)) #define set_sd_v2_rdev(sdp,v) ((sdp)->u.sd_rdev = cpu_to_le32(v)) #define sd_v2_generation(sdp) (le32_to_cpu((sdp)->u.sd_generation)) #define set_sd_v2_generation(sdp,v) ((sdp)->u.sd_generation = cpu_to_le32(v)) #define sd_v2_attrs(sdp) (le16_to_cpu((sdp)->sd_attrs)) #define set_sd_v2_attrs(sdp,v) ((sdp)->sd_attrs = cpu_to_le16(v)) /***************************************************************************/ /* DIRECTORY STRUCTURE */ /***************************************************************************/ /* Picture represents the structure of directory items ________________________________________________ | Array of | | | | | | | directory |N-1| N-2 | .... | 1st |0th| | entry headers | | | | | | |_______________|___|_____|________|_______|___| <---- directory entries ------> First directory item has k_offset component 1. We store "." and ".." in one item, always, we never split "." and ".." into differing items. This makes, among other things, the code for removing directories simpler. */ #define SD_OFFSET 0 #define SD_UNIQUENESS 0 #define DOT_OFFSET 1 #define DOT_DOT_OFFSET 2 #define DIRENTRY_UNIQUENESS 500 /* */ #define FIRST_ITEM_OFFSET 1 /* Q: How to get key of object pointed to by entry from entry? A: Each directory entry has its header. This header has deh_dir_id and deh_objectid fields, those are key of object, entry points to */ /* NOT IMPLEMENTED: Directory will someday contain stat data of object */ struct reiserfs_de_head { __le32 deh_offset; /* third component of the directory entry key */ __le32 deh_dir_id; /* objectid of the parent directory of the object, that is referenced by directory entry */ __le32 deh_objectid; /* objectid of the object, that is referenced by directory entry */ __le16 deh_location; /* offset of name in the whole item */ __le16 deh_state; /* whether 1) entry contains stat data (for future), and 2) whether entry is hidden (unlinked) */ } ATTR_PACKED; #define DEH_SIZE sizeof(struct reiserfs_de_head) #define deh_offset(p_deh) (le32_to_cpu((p_deh)->deh_offset)) #define deh_dir_id(p_deh) (le32_to_cpu((p_deh)->deh_dir_id)) #define deh_objectid(p_deh) (le32_to_cpu((p_deh)->deh_objectid)) #define deh_location(p_deh) (le16_to_cpu((p_deh)->deh_location)) #define deh_state(p_deh) (le16_to_cpu((p_deh)->deh_state)) #define put_deh_offset(p_deh,v) ((p_deh)->deh_offset = cpu_to_le32((v))) #define put_deh_dir_id(p_deh,v) ((p_deh)->deh_dir_id = cpu_to_le32((v))) #define put_deh_objectid(p_deh,v) ((p_deh)->deh_objectid = cpu_to_le32((v))) #define put_deh_location(p_deh,v) ((p_deh)->deh_location = cpu_to_le16((v))) #define put_deh_state(p_deh,v) ((p_deh)->deh_state = cpu_to_le16((v))) /* empty directory contains two entries "." and ".." and their headers */ #define EMPTY_DIR_SIZE \ (DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen (".."))) /* old format directories have this size when empty */ #define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3) #define DEH_Statdata 0 /* not used now */ #define DEH_Visible 2 /* 64 bit systems (and the S/390) need to be aligned explicitly -jdm */ #if BITS_PER_LONG == 64 || defined(__s390__) || defined(__hppa__) # define ADDR_UNALIGNED_BITS (3) #endif /* These are only used to manipulate deh_state. * Because of this, we'll use the ext2_ bit routines, * since they are little endian */ #ifdef ADDR_UNALIGNED_BITS # define aligned_address(addr) ((void *)((long)(addr) & ~((1UL << ADDR_UNALIGNED_BITS) - 1))) # define unaligned_offset(addr) (((int)((long)(addr) & ((1 << ADDR_UNALIGNED_BITS) - 1))) << 3) # define set_bit_unaligned(nr, addr) ext2_set_bit((nr) + unaligned_offset(addr), aligned_address(addr)) # define clear_bit_unaligned(nr, addr) ext2_clear_bit((nr) + unaligned_offset(addr), aligned_address(addr)) # define test_bit_unaligned(nr, addr) ext2_test_bit((nr) + unaligned_offset(addr), aligned_address(addr)) #else # define set_bit_unaligned(nr, addr) ext2_set_bit(nr, addr) # define clear_bit_unaligned(nr, addr) ext2_clear_bit(nr, addr) # define test_bit_unaligned(nr, addr) ext2_test_bit(nr, addr) #endif #define mark_de_with_sd(deh) set_bit_unaligned (DEH_Statdata, &((deh)->deh_state)) #define mark_de_without_sd(deh) clear_bit_unaligned (DEH_Statdata, &((deh)->deh_state)) #define mark_de_visible(deh) set_bit_unaligned (DEH_Visible, &((deh)->deh_state)) #define mark_de_hidden(deh) clear_bit_unaligned (DEH_Visible, &((deh)->deh_state)) #define de_with_sd(deh) test_bit_unaligned (DEH_Statdata, &((deh)->deh_state)) #define de_visible(deh) test_bit_unaligned (DEH_Visible, &((deh)->deh_state)) #define de_hidden(deh) !test_bit_unaligned (DEH_Visible, &((deh)->deh_state)) /* extern void make_empty_dir_item_v1(char *body, __le32 dirid, __le32 objid, __le32 par_dirid, __le32 par_objid); extern void make_empty_dir_item(char *body, __le32 dirid, __le32 objid, __le32 par_dirid, __le32 par_objid); */ /* array of the entry headers */ /* get item body */ #define B_I_PITEM(bh,ih) ( (bh)->b_data + ih_location(ih) ) #define B_I_DEH(bh,ih) ((struct reiserfs_de_head *)(B_I_PITEM(bh,ih))) /* length of the directory entry in directory item. This define calculates length of i-th directory entry using directory entry locations from dir entry head. When it calculates length of 0-th directory entry, it uses length of whole item in place of entry location of the non-existent following entry in the calculation. See picture above.*/ /* #define I_DEH_N_ENTRY_LENGTH(ih,deh,i) \ ((i) ? (deh_location((deh)-1) - deh_location((deh))) : (ih_item_len((ih)) - deh_location((deh)))) */ /* static inline int entry_length(const struct buffer_head *bh, const struct item_head *ih, int pos_in_item) { struct reiserfs_de_head *deh; deh = B_I_DEH(bh, ih) + pos_in_item; if (pos_in_item) return deh_location(deh - 1) - deh_location(deh); return ih_item_len(ih) - deh_location(deh); } */ /* number of entries in the directory item, depends on ENTRY_COUNT being at the start of directory dynamic data. */ #define I_ENTRY_COUNT(ih) (ih_entry_count((ih))) /* name by bh, ih and entry_num */ #define B_I_E_NAME(bh,ih,entry_num) ((char *)(bh->b_data + ih_location(ih) + deh_location(B_I_DEH(bh,ih)+(entry_num)))) // two entries per block (at least) #define REISERFS_MAX_NAME(block_size) 255 /* this structure is used for operations on directory entries. It is not a disk structure. */ /* When reiserfs_find_entry or search_by_entry_key find directory entry, they return filled reiserfs_dir_entry structure */ struct reiserfs_dir_entry { struct buffer_head *de_bh; int de_item_num; struct item_head *de_ih; int de_entry_num; struct reiserfs_de_head *de_deh; int de_entrylen; int de_namelen; char *de_name; unsigned long *de_gen_number_bit_string; __u32 de_dir_id; __u32 de_objectid; struct cpu_key de_entry_key; }; /* these defines are useful when a particular member of a reiserfs_dir_entry is needed */ /* pointer to file name, stored in entry */ #define B_I_DEH_ENTRY_FILE_NAME(bh,ih,deh) (B_I_PITEM (bh, ih) + deh_location(deh)) /* length of name */ #define I_DEH_N_ENTRY_FILE_NAME_LENGTH(ih,deh,entry_num) \ (I_DEH_N_ENTRY_LENGTH (ih, deh, entry_num) - (de_with_sd (deh) ? SD_SIZE : 0)) /* hash value occupies bits from 7 up to 30 */ #define GET_HASH_VALUE(offset) ((offset) & 0x7fffff80LL) /* generation number occupies 7 bits starting from 0 up to 6 */ #define GET_GENERATION_NUMBER(offset) ((offset) & 0x7fLL) #define MAX_GENERATION_NUMBER 127 #define SET_GENERATION_NUMBER(offset,gen_number) (GET_HASH_VALUE(offset)|(gen_number)) /* * Picture represents an internal node of the reiserfs tree * ______________________________________________________ * | | Array of | Array of | Free | * |block | keys | pointers | space | * | head | N | N+1 | | * |______|_______________|___________________|___________| */ /***************************************************************************/ /* DISK CHILD */ /***************************************************************************/ /* Disk child pointer: The pointer from an internal node of the tree to a node that is on disk. */ struct disk_child { __le32 dc_block_number; /* Disk child's block number. */ __le16 dc_size; /* Disk child's used space. */ __le16 dc_reserved; }; #define DC_SIZE (sizeof(struct disk_child)) #define dc_block_number(dc_p) (le32_to_cpu((dc_p)->dc_block_number)) #define dc_size(dc_p) (le16_to_cpu((dc_p)->dc_size)) /* Get disk child by buffer header and position in the tree node. */ #define B_N_CHILD(p_s_bh,n_pos) ((struct disk_child *)\ ((p_s_bh)->b_data+BLKH_SIZE+B_NR_ITEMS(p_s_bh)*KEY_SIZE+DC_SIZE*(n_pos))) /* Get disk child number by buffer header and position in the tree node. */ #define B_N_CHILD_NUM(p_s_bh,n_pos) (dc_block_number(B_N_CHILD(p_s_bh,n_pos))) #define PUT_B_N_CHILD_NUM(p_s_bh,n_pos, val) (put_dc_block_number(B_N_CHILD(p_s_bh,n_pos), val )) /* maximal value of field child_size in structure disk_child */ /* child size is the combined size of all items and their headers */ #define MAX_CHILD_SIZE(bh) ((int)( (bh)->b_size - BLKH_SIZE )) /* amount of used space in buffer (not including block head) */ #define B_CHILD_SIZE(cur) (MAX_CHILD_SIZE(cur)-(B_FREE_SPACE(cur))) /* max and min number of keys in internal node */ #define MAX_NR_KEY(bh) ( (MAX_CHILD_SIZE(bh)-DC_SIZE)/(KEY_SIZE+DC_SIZE) ) #define MIN_NR_KEY(bh) (MAX_NR_KEY(bh)/2) /***************************************************************************/ /* PATH STRUCTURES AND DEFINES */ /***************************************************************************/ /* Search_by_key fills up the path from the root to the leaf as it descends the tree looking for the key. It uses reiserfs_bread to try to find buffers in the cache given their block number. If it does not find them in the cache it reads them from disk. For each node search_by_key finds using reiserfs_bread it then uses bin_search to look through that node. bin_search will find the position of the block_number of the next node if it is looking through an internal node. If it is looking through a leaf node bin_search will find the position of the item which has key either equal to given key, or which is the maximal key less than the given key. */ struct path_element { struct buffer_head *pe_buffer; /* Pointer to the buffer at the path in the tree. */ int pe_position; /* Position in the tree node which is placed in the */ /* buffer above. */ }; #define MAX_HEIGHT 5 /* maximal height of a tree. don't change this without changing JOURNAL_PER_BALANCE_CNT */ #define EXTENDED_MAX_HEIGHT 7 /* Must be equals MAX_HEIGHT + FIRST_PATH_ELEMENT_OFFSET */ #define FIRST_PATH_ELEMENT_OFFSET 2 /* Must be equal to at least 2. */ #define ILLEGAL_PATH_ELEMENT_OFFSET 1 /* Must be equal to FIRST_PATH_ELEMENT_OFFSET - 1 */ #define MAX_FEB_SIZE 6 /* this MUST be MAX_HEIGHT + 1. See about FEB below */ /* We need to keep track of who the ancestors of nodes are. When we perform a search we record which nodes were visited while descending the tree looking for the node we searched for. This list of nodes is called the path. This information is used while performing balancing. Note that this path information may become invalid, and this means we must check it when using it to see if it is still valid. You'll need to read search_by_key and the comments in it, especially about decrement_counters_in_path(), to understand this structure. Paths make the code so much harder to work with and debug.... An enormous number of bugs are due to them, and trying to write or modify code that uses them just makes my head hurt. They are based on an excessive effort to avoid disturbing the precious VFS code.:-( The gods only know how we are going to SMP the code that uses them. znodes are the way! */ #define PATH_READA 0x1 /* do read ahead */ #define PATH_READA_BACK 0x2 /* read backwards */ struct path { int path_length; /* Length of the array above. */ int reada; struct path_element path_elements[EXTENDED_MAX_HEIGHT]; /* Array of the path elements. */ int pos_in_item; }; #define pos_in_item(path) ((path)->pos_in_item) #define INITIALIZE_PATH(var) \ struct path var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,} /* Get path element by path and path position. */ #define PATH_OFFSET_PELEMENT(p_s_path,n_offset) ((p_s_path)->path_elements +(n_offset)) /* Get buffer header at the path by path and path position. */ #define PATH_OFFSET_PBUFFER(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_buffer) /* Get position in the element at the path by path and path position. */ #define PATH_OFFSET_POSITION(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_position) #define PATH_PLAST_BUFFER(p_s_path) (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length)) /* you know, to the person who didn't write this the macro name does not at first suggest what it does. Maybe POSITION_FROM_PATH_END? Or maybe we should just focus on dumping paths... -Hans */ #define PATH_LAST_POSITION(p_s_path) (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length)) #define PATH_PITEM_HEAD(p_s_path) B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path),PATH_LAST_POSITION(p_s_path)) /* in do_balance leaf has h == 0 in contrast with path structure, where root has level == 0. That is why we need these defines */ #define PATH_H_PBUFFER(p_s_path, h) PATH_OFFSET_PBUFFER (p_s_path, p_s_path->path_length - (h)) /* tb->S[h] */ #define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1) /* tb->F[h] or tb->S[0]->b_parent */ #define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h)) #define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1) /* tb->S[h]->b_item_order */ #define PATH_H_PATH_OFFSET(p_s_path, n_h) ((p_s_path)->path_length - (n_h)) #define get_last_bh(path) PATH_PLAST_BUFFER(path) #define get_ih(path) PATH_PITEM_HEAD(path) #define get_item_pos(path) PATH_LAST_POSITION(path) #define get_item(path) ((void *)B_N_PITEM(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION (path))) #define item_moved(ih,path) comp_items(ih, path) #define path_changed(ih,path) comp_items (ih, path) /***************************************************************************/ /* MISC */ /***************************************************************************/ /* Size of pointer to the unformatted node. */ #define UNFM_P_SIZE (sizeof(unp_t)) #define UNFM_P_SHIFT 2 // in in-core inode key is stored on le form #define INODE_PKEY(inode) ((struct reiserfs_key *)(REISERFS_I(inode)->i_key)) #define MAX_UL_INT 0xffffffff #define MAX_INT 0x7ffffff #define MAX_US_INT 0xffff // reiserfs version 2 has max offset 60 bits. Version 1 - 32 bit offset #define U32_MAX (~(__u32)0) /* static inline loff_t max_reiserfs_offset(struct inode *inode) { if (get_inode_item_key_version(inode) == KEY_FORMAT_3_5) return (loff_t) U32_MAX; return (loff_t) ((~(__u64) 0) >> 4); } */ /*#define MAX_KEY_UNIQUENESS MAX_UL_INT*/ #define MAX_KEY_OBJECTID MAX_UL_INT #define MAX_B_NUM MAX_UL_INT #define MAX_FC_NUM MAX_US_INT /* the purpose is to detect overflow of an unsigned short */ #define REISERFS_LINK_MAX (MAX_US_INT - 1000) /* The following defines are used in reiserfs_insert_item and reiserfs_append_item */ #define REISERFS_KERNEL_MEM 0 /* reiserfs kernel memory mode */ #define REISERFS_USER_MEM 1 /* reiserfs user memory mode */ #define fs_generation(s) (REISERFS_SB(s)->s_generation_counter) #define get_generation(s) atomic_read (&fs_generation(s)) #define FILESYSTEM_CHANGED_TB(tb) (get_generation((tb)->tb_sb) != (tb)->fs_gen) #define __fs_changed(gen,s) (gen != get_generation (s)) #define fs_changed(gen,s) ({cond_resched(); __fs_changed(gen, s);}) /***************************************************************************/ /* FIXATE NODES */ /***************************************************************************/ #define VI_TYPE_LEFT_MERGEABLE 1 #define VI_TYPE_RIGHT_MERGEABLE 2 /* To make any changes in the tree we always first find node, that contains item to be changed/deleted or place to insert a new item. We call this node S. To do balancing we need to decide what we will shift to left/right neighbor, or to a new node, where new item will be etc. To make this analysis simpler we build virtual node. Virtual node is an array of items, that will replace items of node S. (For instance if we are going to delete an item, virtual node does not contain it). Virtual node keeps information about item sizes and types, mergeability of first and last items, sizes of all entries in directory item. We use this array of items when calculating what we can shift to neighbors and how many nodes we have to have if we do not any shiftings, if we shift to left/right neighbor or to both. */ struct virtual_item { int vi_index; // index in the array of item operations unsigned short vi_type; // left/right mergeability unsigned short vi_item_len; /* length of item that it will have after balancing */ struct item_head *vi_ih; const char *vi_item; // body of item (old or new) const void *vi_new_data; // 0 always but paste mode void *vi_uarea; // item specific area }; struct virtual_node { char *vn_free_ptr; /* this is a pointer to the free space in the buffer */ unsigned short vn_nr_item; /* number of items in virtual node */ short vn_size; /* size of node , that node would have if it has unlimited size and no balancing is performed */ short vn_mode; /* mode of balancing (paste, insert, delete, cut) */ short vn_affected_item_num; short vn_pos_in_item; struct item_head *vn_ins_ih; /* item header of inserted item, 0 for other modes */ const void *vn_data; struct virtual_item *vn_vi; /* array of items (including a new one, excluding item to be deleted) */ }; /* used by directory items when creating virtual nodes */ struct direntry_uarea { int flags; __u16 entry_count; __u16 entry_sizes[1]; } ATTR_PACKED; /***************************************************************************/ /* TREE BALANCE */ /***************************************************************************/ /* This temporary structure is used in tree balance algorithms, and constructed as we go to the extent that its various parts are needed. It contains arrays of nodes that can potentially be involved in the balancing of node S, and parameters that define how each of the nodes must be balanced. Note that in these algorithms for balancing the worst case is to need to balance the current node S and the left and right neighbors and all of their parents plus create a new node. We implement S1 balancing for the leaf nodes and S0 balancing for the internal nodes (S1 and S0 are defined in our papers.)*/ #define MAX_FREE_BLOCK 7 /* size of the array of buffers to free at end of do_balance */ /* maximum number of FEB blocknrs on a single level */ #define MAX_AMOUNT_NEEDED 2 /* someday somebody will prefix every field in this struct with tb_ */ struct tree_balance { int tb_mode; int need_balance_dirty; struct super_block *tb_sb; struct reiserfs_transaction_handle *transaction_handle; struct path *tb_path; struct buffer_head *L[MAX_HEIGHT]; /* array of left neighbors of nodes in the path */ struct buffer_head *R[MAX_HEIGHT]; /* array of right neighbors of nodes in the path */ struct buffer_head *FL[MAX_HEIGHT]; /* array of fathers of the left neighbors */ struct buffer_head *FR[MAX_HEIGHT]; /* array of fathers of the right neighbors */ struct buffer_head *CFL[MAX_HEIGHT]; /* array of common parents of center node and its left neighbor */ struct buffer_head *CFR[MAX_HEIGHT]; /* array of common parents of center node and its right neighbor */ struct buffer_head *FEB[MAX_FEB_SIZE]; /* array of empty buffers. Number of buffers in array equals cur_blknum. */ struct buffer_head *used[MAX_FEB_SIZE]; struct buffer_head *thrown[MAX_FEB_SIZE]; int lnum[MAX_HEIGHT]; /* array of number of items which must be shifted to the left in order to balance the current node; for leaves includes item that will be partially shifted; for internal nodes, it is the number of child pointers rather than items. It includes the new item being created. The code sometimes subtracts one to get the number of wholly shifted items for other purposes. */ int rnum[MAX_HEIGHT]; /* substitute right for left in comment above */ int lkey[MAX_HEIGHT]; /* array indexed by height h mapping the key delimiting L[h] and S[h] to its item number within the node CFL[h] */ int rkey[MAX_HEIGHT]; /* substitute r for l in comment above */ int insert_size[MAX_HEIGHT]; /* the number of bytes by we are trying to add or remove from S[h]. A negative value means removing. */ int blknum[MAX_HEIGHT]; /* number of nodes that will replace node S[h] after balancing on the level h of the tree. If 0 then S is being deleted, if 1 then S is remaining and no new nodes are being created, if 2 or 3 then 1 or 2 new nodes is being created */ /* fields that are used only for balancing leaves of the tree */ int cur_blknum; /* number of empty blocks having been already allocated */ int s0num; /* number of items that fall into left most node when S[0] splits */ int s1num; /* number of items that fall into first new node when S[0] splits */ int s2num; /* number of items that fall into second new node when S[0] splits */ int lbytes; /* number of bytes which can flow to the left neighbor from the left */ /* most liquid item that cannot be shifted from S[0] entirely */ /* if -1 then nothing will be partially shifted */ int rbytes; /* number of bytes which will flow to the right neighbor from the right */ /* most liquid item that cannot be shifted from S[0] entirely */ /* if -1 then nothing will be partially shifted */ int s1bytes; /* number of bytes which flow to the first new node when S[0] splits */ /* note: if S[0] splits into 3 nodes, then items do not need to be cut */ int s2bytes; struct buffer_head *buf_to_free[MAX_FREE_BLOCK]; /* buffers which are to be freed after do_balance finishes by unfix_nodes */ char *vn_buf; /* kmalloced memory. Used to create virtual node and keep map of dirtied bitmap blocks */ int vn_buf_size; /* size of the vn_buf */ struct virtual_node *tb_vn; /* VN starts after bitmap of bitmap blocks */ int fs_gen; /* saved value of `reiserfs_generation' counter see FILESYSTEM_CHANGED() macro in reiserfs_fs.h */ #ifdef DISPLACE_NEW_PACKING_LOCALITIES struct in_core_key key; /* key pointer, to pass to block allocator or another low-level subsystem */ #endif }; /* These are modes of balancing */ /* When inserting an item. */ #define M_INSERT 'i' /* When inserting into (directories only) or appending onto an already existant item. */ #define M_PASTE 'p' /* When deleting an item. */ #define M_DELETE 'd' /* When truncating an item or removing an entry from a (directory) item. */ #define M_CUT 'c' /* used when balancing on leaf level skipped (in reiserfsck) */ #define M_INTERNAL 'n' /* When further balancing is not needed, then do_balance does not need to be called. */ #define M_SKIP_BALANCING 's' #define M_CONVERT 'v' /* modes of leaf_move_items */ #define LEAF_FROM_S_TO_L 0 #define LEAF_FROM_S_TO_R 1 #define LEAF_FROM_R_TO_L 2 #define LEAF_FROM_L_TO_R 3 #define LEAF_FROM_S_TO_SNEW 4 #define FIRST_TO_LAST 0 #define LAST_TO_FIRST 1 /* used in do_balance for passing parent of node information that has been gotten from tb struct */ struct buffer_info { struct tree_balance *tb; struct buffer_head *bi_bh; struct buffer_head *bi_parent; int bi_position; }; /* there are 4 types of items: stat data, directory item, indirect, direct. +-------------------+------------+--------------+------------+ | | k_offset | k_uniqueness | mergeable? | +-------------------+------------+--------------+------------+ | stat data | 0 | 0 | no | +-------------------+------------+--------------+------------+ | 1st directory item| DOT_OFFSET |DIRENTRY_UNIQUENESS| no | | non 1st directory | hash value | | yes | | item | | | | +-------------------+------------+--------------+------------+ | indirect item | offset + 1 |TYPE_INDIRECT | if this is not the first indirect item of the object +-------------------+------------+--------------+------------+ | direct item | offset + 1 |TYPE_DIRECT | if not this is not the first direct item of the object +-------------------+------------+--------------+------------+ */ struct item_operations { int (*bytes_number) (struct item_head * ih, int block_size); void (*decrement_key) (struct cpu_key *); int (*is_left_mergeable) (struct reiserfs_key * ih, unsigned long bsize); void (*print_item) (struct item_head *, char *item); void (*check_item) (struct item_head *, char *item); int (*create_vi) (struct virtual_node * vn, struct virtual_item * vi, int is_affected, int insert_size); int (*check_left) (struct virtual_item * vi, int free, int start_skip, int end_skip); int (*check_right) (struct virtual_item * vi, int free); int (*part_size) (struct virtual_item * vi, int from, int to); int (*unit_num) (struct virtual_item * vi); void (*print_vi) (struct virtual_item * vi); }; extern struct item_operations *item_ops[TYPE_ANY + 1]; #define op_bytes_number(ih,bsize) item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize) #define op_is_left_mergeable(key,bsize) item_ops[le_key_k_type (le_key_version (key), key)]->is_left_mergeable (key, bsize) #define op_print_item(ih,item) item_ops[le_ih_k_type (ih)]->print_item (ih, item) #define op_check_item(ih,item) item_ops[le_ih_k_type (ih)]->check_item (ih, item) #define op_create_vi(vn,vi,is_affected,insert_size) item_ops[le_ih_k_type ((vi)->vi_ih)]->create_vi (vn,vi,is_affected,insert_size) #define op_check_left(vi,free,start_skip,end_skip) item_ops[(vi)->vi_index]->check_left (vi, free, start_skip, end_skip) #define op_check_right(vi,free) item_ops[(vi)->vi_index]->check_right (vi, free) #define op_part_size(vi,from,to) item_ops[(vi)->vi_index]->part_size (vi, from, to) #define op_unit_num(vi) item_ops[(vi)->vi_index]->unit_num (vi) #define op_print_vi(vi) item_ops[(vi)->vi_index]->print_vi (vi) #define COMP_SHORT_KEYS comp_short_keys /* number of blocks pointed to by the indirect item */ #define I_UNFM_NUM(p_s_ih) ( ih_item_len(p_s_ih) / UNFM_P_SIZE ) /* the used space within the unformatted node corresponding to pos within the item pointed to by ih */ #define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space(ih) : (size)) /* number of bytes contained by the direct item or the unformatted nodes the indirect item points to */ /* get the item header */ #define B_N_PITEM_HEAD(bh,item_num) ( (struct item_head * )((bh)->b_data + BLKH_SIZE) + (item_num) ) /* get key */ #define B_N_PDELIM_KEY(bh,item_num) ( (struct reiserfs_key * )((bh)->b_data + BLKH_SIZE) + (item_num) ) /* get the key */ #define B_N_PKEY(bh,item_num) ( &(B_N_PITEM_HEAD(bh,item_num)->ih_key) ) /* get item body */ #define B_N_PITEM(bh,item_num) ( (bh)->b_data + ih_location(B_N_PITEM_HEAD((bh),(item_num)))) /* get the stat data by the buffer header and the item order */ #define B_N_STAT_DATA(bh,nr) \ ( (struct stat_data *)((bh)->b_data + ih_location(B_N_PITEM_HEAD((bh),(nr))) ) ) /* following defines use reiserfs buffer header and item header */ /* get stat-data */ #define B_I_STAT_DATA(bh, ih) ( (struct stat_data * )((bh)->b_data + ih_location(ih)) ) // this is 3976 for size==4096 #define MAX_DIRECT_ITEM_LEN(size) ((size) - BLKH_SIZE - 2*IH_SIZE - SD_SIZE - UNFM_P_SIZE) /* indirect items consist of entries which contain blocknrs, pos indicates which entry, and B_I_POS_UNFM_POINTER resolves to the blocknr contained by the entry pos points to */ #define B_I_POS_UNFM_POINTER(bh,ih,pos) le32_to_cpu(*(((unp_t *)B_I_PITEM(bh,ih)) + (pos))) #define PUT_B_I_POS_UNFM_POINTER(bh,ih,pos, val) do {*(((unp_t *)B_I_PITEM(bh,ih)) + (pos)) = cpu_to_le32(val); } while (0) struct reiserfs_iget_args { __u32 objectid; __u32 dirid; }; /***************************************************************************/ /* FUNCTION DECLARATIONS */ /***************************************************************************/ /*#ifdef __KERNEL__*/ #define get_journal_desc_magic(bh) (bh->b_data + bh->b_size - 12) #define journal_trans_half(blocksize) \ ((blocksize - sizeof (struct reiserfs_journal_desc) + sizeof (__u32) - 12) / sizeof (__u32)) /* journal.c see journal.c for all the comments here */ /* first block written in a commit. */ struct reiserfs_journal_desc { __le32 j_trans_id; /* id of commit */ __le32 j_len; /* length of commit. len +1 is the commit block */ __le32 j_mount_id; /* mount id of this trans */ __le32 j_realblock[1]; /* real locations for each block */ }; #define get_desc_trans_id(d) le32_to_cpu((d)->j_trans_id) #define get_desc_trans_len(d) le32_to_cpu((d)->j_len) #define get_desc_mount_id(d) le32_to_cpu((d)->j_mount_id) #define set_desc_trans_id(d,val) do { (d)->j_trans_id = cpu_to_le32 (val); } while (0) #define set_desc_trans_len(d,val) do { (d)->j_len = cpu_to_le32 (val); } while (0) #define set_desc_mount_id(d,val) do { (d)->j_mount_id = cpu_to_le32 (val); } while (0) /* last block written in a commit */ struct reiserfs_journal_commit { __le32 j_trans_id; /* must match j_trans_id from the desc block */ __le32 j_len; /* ditto */ __le32 j_realblock[1]; /* real locations for each block */ }; #define get_commit_trans_id(c) le32_to_cpu((c)->j_trans_id) #define get_commit_trans_len(c) le32_to_cpu((c)->j_len) #define get_commit_mount_id(c) le32_to_cpu((c)->j_mount_id) #define set_commit_trans_id(c,val) do { (c)->j_trans_id = cpu_to_le32 (val); } while (0) #define set_commit_trans_len(c,val) do { (c)->j_len = cpu_to_le32 (val); } while (0) /* this header block gets written whenever a transaction is considered fully flushed, and is more recent than the ** last fully flushed transaction. fully flushed means all the log blocks and all the real blocks are on disk, ** and this transaction does not need to be replayed. */ struct reiserfs_journal_header { __le32 j_last_flush_trans_id; /* id of last fully flushed transaction */ __le32 j_first_unflushed_offset; /* offset in the log of where to start replay after a crash */ __le32 j_mount_id; /* 12 */ struct journal_params jh_journal; }; /* biggest tunable defines are right here */ #define JOURNAL_BLOCK_COUNT 8192 /* number of blocks in the journal */ #define JOURNAL_TRANS_MAX_DEFAULT 1024 /* biggest possible single transaction, don't change for now (8/3/99) */ #define JOURNAL_TRANS_MIN_DEFAULT 256 #define JOURNAL_MAX_BATCH_DEFAULT 900 /* max blocks to batch into one transaction, don't make this any bigger than 900 */ #define JOURNAL_MIN_RATIO 2 #define JOURNAL_MAX_COMMIT_AGE 30 #define JOURNAL_MAX_TRANS_AGE 30 #define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9) #ifdef CONFIG_QUOTA /* We need to update data and inode (atime) */ #define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<s_mount_opt & (1<s_mount_opt & (1< max, the node is freed, otherwise, ** it is put on a free list for faster use later. */ #define REISERFS_MIN_BITMAP_NODES 10 #define REISERFS_MAX_BITMAP_NODES 100 #define JBH_HASH_SHIFT 13 /* these are based on journal hash size of 8192 */ #define JBH_HASH_MASK 8191 #define _jhashfn(sb,block) \ (((unsigned long)sb>>L1_CACHE_SHIFT) ^ \ (((block)<<(JBH_HASH_SHIFT - 6)) ^ ((block) >> 13) ^ ((block) << (JBH_HASH_SHIFT - 12)))) #define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK]) // We need these to make journal.c code more readable #define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) #define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) #define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) //enum reiserfs_bh_state_bits { // BH_JDirty = BH_PrivateStart, /* buffer is in current transaction */ // BH_JDirty_wait, // BH_JNew, /* disk block was taken off free list before // * being in a finished transaction, or // * written to disk. Can be reused immed. */ // BH_JPrepared, // BH_JRestore_dirty, // BH_JTest, // debugging only will go away //}; /* BUFFER_FNS(JDirty, journaled); TAS_BUFFER_FNS(JDirty, journaled); BUFFER_FNS(JDirty_wait, journal_dirty); TAS_BUFFER_FNS(JDirty_wait, journal_dirty); BUFFER_FNS(JNew, journal_new); TAS_BUFFER_FNS(JNew, journal_new); BUFFER_FNS(JPrepared, journal_prepared); TAS_BUFFER_FNS(JPrepared, journal_prepared); BUFFER_FNS(JRestore_dirty, journal_restore_dirty); TAS_BUFFER_FNS(JRestore_dirty, journal_restore_dirty); BUFFER_FNS(JTest, journal_test); TAS_BUFFER_FNS(JTest, journal_test); */ /* ** transaction handle which is passed around for all journal calls */ struct reiserfs_transaction_handle { struct super_block *t_super; /* super for this FS when journal_begin was called. saves calls to reiserfs_get_super also used by nested transactions to make sure they are nesting on the right FS _must_ be first in the handle */ int t_refcount; int t_blocks_logged; /* number of blocks this writer has logged */ int t_blocks_allocated; /* number of blocks this writer allocated */ unsigned long t_trans_id; /* sanity check, equals the current trans id */ void *t_handle_save; /* save existing current->journal_info */ unsigned displace_new_blocks:1; /* if new block allocation occurres, that block should be displaced from others */ //struct list_head t_list; }; /* used to keep track of ordered and tail writes, attached to the buffer * head through b_journal_head. */ struct reiserfs_jh { struct reiserfs_journal_list *jl; struct buffer_head *bh; //struct list_head list; }; // // get key version from on disk key - kludge // /* static inline int le_key_version(const struct reiserfs_key *key) { int type; type = offset_v2_k_type(&(key->u.k_offset_v2)); if (type != TYPE_DIRECT && type != TYPE_INDIRECT && type != TYPE_DIRENTRY) return KEY_FORMAT_3_5; return KEY_FORMAT_3_6; } static inline void copy_key(struct reiserfs_key *to, const struct reiserfs_key *from) { memcpy(to, from, KEY_SIZE); } */ #define i_block_size(inode) ((inode)->i_sb->s_blocksize) #define file_size(inode) ((inode)->i_size) #define tail_size(inode) (file_size (inode) & (i_block_size (inode) - 1)) #define tail_has_to_be_packed(inode) (have_large_tails ((inode)->i_sb)?\ !STORE_TAIL_IN_UNFM_S1(file_size (inode), tail_size(inode), inode->i_sb->s_blocksize):have_small_tails ((inode)->i_sb)?!STORE_TAIL_IN_UNFM_S2(file_size (inode), tail_size(inode), inode->i_sb->s_blocksize):0 ) /* inode.c */ /* args for the create parameter of reiserfs_get_block */ #define GET_BLOCK_NO_CREATE 0 /* don't create new blocks or convert tails */ #define GET_BLOCK_CREATE 1 /* add anything you need to find block */ #define GET_BLOCK_NO_HOLE 2 /* return -ENOENT for file holes */ #define GET_BLOCK_READ_DIRECT 4 /* read the tail if indirect item not found */ #define GET_BLOCK_NO_IMUX 8 /* i_mutex is not held, don't preallocate */ #define GET_BLOCK_NO_DANGLE 16 /* don't leave any transactions running */ /* bitmap.c */ /* structure contains hints for block allocator, and it is a container for * arguments, such as node, search path, transaction_handle, etc. */ struct __reiserfs_blocknr_hint { struct inode *inode; /* inode passed to allocator, if we allocate unf. nodes */ long block; /* file offset, in blocks */ struct in_core_key key; struct path *path; /* search path, used by allocator to deternine search_start by * various ways */ struct reiserfs_transaction_handle *th; /* transaction handle is needed to log super blocks and * bitmap blocks changes */ b_blocknr_t beg, end; b_blocknr_t search_start; /* a field used to transfer search start value (block number) * between different block allocator procedures * (determine_search_start() and others) */ int prealloc_size; /* is set in determine_prealloc_size() function, used by underlayed * function that do actual allocation */ unsigned formatted_node:1; /* the allocator uses different polices for getting disk space for * formatted/unformatted blocks with/without preallocation */ unsigned preallocate:1; }; typedef struct __reiserfs_blocknr_hint reiserfs_blocknr_hint_t; /* hashes.c */ __u32 keyed_hash(const signed char *msg, int len); __u32 yura_hash(const signed char *msg, int len); __u32 r5_hash(const signed char *msg, int len); /* the ext2 bit routines adjust for big or little endian as ** appropriate for the arch, so in our laziness we use them rather ** than using the bit routines they call more directly. These ** routines must be used when changing on disk bitmaps. */ #define reiserfs_test_and_set_le_bit ext2_set_bit #define reiserfs_test_and_clear_le_bit ext2_clear_bit #define reiserfs_test_le_bit ext2_test_bit #define reiserfs_find_next_zero_le_bit ext2_find_next_zero_bit /* sometimes reiserfs_truncate may require to allocate few new blocks to perform indirect2direct conversion. People probably used to think, that truncate should work without problems on a filesystem without free disk space. They may complain that they can not truncate due to lack of free disk space. This spare space allows us to not worry about it. 500 is probably too much, but it should be absolutely safe */ #define SPARE_SPACE 500 /* ioctl's command */ #define REISERFS_IOC_UNPACK _IOW(0xCD,1,long) /* define following flags to be the same as in ext2, so that chattr(1), lsattr(1) will work with us. */ #define REISERFS_IOC_GETFLAGS EXT2_IOC_GETFLAGS #define REISERFS_IOC_SETFLAGS EXT2_IOC_SETFLAGS #define REISERFS_IOC_GETVERSION EXT2_IOC_GETVERSION #define REISERFS_IOC_SETVERSION EXT2_IOC_SETVERSION #pragma pack() #endif refit-0.14/fsw/fsw_strfunc.h0000644000175000017500000002760210545744767015452 0ustar julienjulien/* fsw_strfunc.h generated by mk_fsw_strfunc.py */ static int fsw_streq_ISO88591_UTF8(void *s1data, void *s2data, int len) { int i; fsw_u8 *p1 = (fsw_u8 *)s1data; fsw_u8 *p2 = (fsw_u8 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; c2 = *p2++; if ((c2 & 0xe0) == 0xc0) { c2 = ((c2 & 0x1f) << 6) | (*p2++ & 0x3f); } else if ((c2 & 0xf0) == 0xe0) { c2 = ((c2 & 0x0f) << 12) | ((*p2++ & 0x3f) << 6); c2 |= (*p2++ & 0x3f); } else if ((c2 & 0xf8) == 0xf0) { c2 = ((c2 & 0x07) << 18) | ((*p2++ & 0x3f) << 12); c2 |= ((*p2++ & 0x3f) << 6); c2 |= (*p2++ & 0x3f); } if (c1 != c2) return 0; } return 1; } static int fsw_streq_ISO88591_UTF16(void *s1data, void *s2data, int len) { int i; fsw_u8 *p1 = (fsw_u8 *)s1data; fsw_u16 *p2 = (fsw_u16 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; c2 = *p2++; if (c1 != c2) return 0; } return 1; } static int fsw_streq_ISO88591_UTF16_SWAPPED(void *s1data, void *s2data, int len) { int i; fsw_u8 *p1 = (fsw_u8 *)s1data; fsw_u16 *p2 = (fsw_u16 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2); if (c1 != c2) return 0; } return 1; } static int fsw_streq_UTF8_UTF16(void *s1data, void *s2data, int len) { int i; fsw_u8 *p1 = (fsw_u8 *)s1data; fsw_u16 *p2 = (fsw_u16 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; if ((c1 & 0xe0) == 0xc0) { c1 = ((c1 & 0x1f) << 6) | (*p1++ & 0x3f); } else if ((c1 & 0xf0) == 0xe0) { c1 = ((c1 & 0x0f) << 12) | ((*p1++ & 0x3f) << 6); c1 |= (*p1++ & 0x3f); } else if ((c1 & 0xf8) == 0xf0) { c1 = ((c1 & 0x07) << 18) | ((*p1++ & 0x3f) << 12); c1 |= ((*p1++ & 0x3f) << 6); c1 |= (*p1++ & 0x3f); } c2 = *p2++; if (c1 != c2) return 0; } return 1; } static int fsw_streq_UTF8_UTF16_SWAPPED(void *s1data, void *s2data, int len) { int i; fsw_u8 *p1 = (fsw_u8 *)s1data; fsw_u16 *p2 = (fsw_u16 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; if ((c1 & 0xe0) == 0xc0) { c1 = ((c1 & 0x1f) << 6) | (*p1++ & 0x3f); } else if ((c1 & 0xf0) == 0xe0) { c1 = ((c1 & 0x0f) << 12) | ((*p1++ & 0x3f) << 6); c1 |= (*p1++ & 0x3f); } else if ((c1 & 0xf8) == 0xf0) { c1 = ((c1 & 0x07) << 18) | ((*p1++ & 0x3f) << 12); c1 |= ((*p1++ & 0x3f) << 6); c1 |= (*p1++ & 0x3f); } c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2); if (c1 != c2) return 0; } return 1; } static int fsw_streq_UTF16_UTF16_SWAPPED(void *s1data, void *s2data, int len) { int i; fsw_u16 *p1 = (fsw_u16 *)s1data; fsw_u16 *p2 = (fsw_u16 *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { c1 = *p1++; c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2); if (c1 != c2) return 0; } return 1; } static fsw_status_t fsw_strcoerce_UTF8_ISO88591(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u8 *sp; fsw_u8 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_ISO88591; dest->len = srclen; dest->size = srclen * sizeof(fsw_u8); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u8 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; if ((c & 0xe0) == 0xc0) { c = ((c & 0x1f) << 6) | (*sp++ & 0x3f); } else if ((c & 0xf0) == 0xe0) { c = ((c & 0x0f) << 12) | ((*sp++ & 0x3f) << 6); c |= (*sp++ & 0x3f); } else if ((c & 0xf8) == 0xf0) { c = ((c & 0x07) << 18) | ((*sp++ & 0x3f) << 12); c |= ((*sp++ & 0x3f) << 6); c |= (*sp++ & 0x3f); } *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF16_ISO88591(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u16 *sp; fsw_u8 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_ISO88591; dest->len = srclen; dest->size = srclen * sizeof(fsw_u8); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u16 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF16_SWAPPED_ISO88591(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u16 *sp; fsw_u8 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_ISO88591; dest->len = srclen; dest->size = srclen * sizeof(fsw_u8); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u16 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; c = FSW_SWAPVALUE_U16(c); *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_ISO88591_UTF16(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u8 *sp; fsw_u16 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_UTF16; dest->len = srclen; dest->size = srclen * sizeof(fsw_u16); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u8 *)srcdata; dp = (fsw_u16 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF8_UTF16(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u8 *sp; fsw_u16 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_UTF16; dest->len = srclen; dest->size = srclen * sizeof(fsw_u16); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u8 *)srcdata; dp = (fsw_u16 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; if ((c & 0xe0) == 0xc0) { c = ((c & 0x1f) << 6) | (*sp++ & 0x3f); } else if ((c & 0xf0) == 0xe0) { c = ((c & 0x0f) << 12) | ((*sp++ & 0x3f) << 6); c |= (*sp++ & 0x3f); } else if ((c & 0xf8) == 0xf0) { c = ((c & 0x07) << 18) | ((*sp++ & 0x3f) << 12); c |= ((*sp++ & 0x3f) << 6); c |= (*sp++ & 0x3f); } *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF16_SWAPPED_UTF16(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; fsw_u16 *sp; fsw_u16 *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_UTF16; dest->len = srclen; dest->size = srclen * sizeof(fsw_u16); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u16 *)srcdata; dp = (fsw_u16 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; c = FSW_SWAPVALUE_U16(c); *dp++ = c; } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_ISO88591_UTF8(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i, destsize; fsw_u8 *sp; fsw_u8 *dp; fsw_u32 c; sp = (fsw_u8 *)srcdata; destsize = 0; for (i = 0; i < srclen; i++) { c = *sp++; if (c < 0x000080) destsize++; else if (c < 0x000800) destsize += 2; else if (c < 0x010000) destsize += 3; else destsize += 4; } dest->type = FSW_STRING_TYPE_UTF8; dest->len = srclen; dest->size = destsize; status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u8 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; if (c < 0x000080) { *dp++ = c; } else if (c < 0x000800) { *dp++ = 0xc0 | ((c >> 6) & 0x1f); *dp++ = 0x80 | (c & 0x3f); } else if (c < 0x010000) { *dp++ = 0xe0 | ((c >> 12) & 0x0f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } else { *dp++ = 0xf0 | ((c >> 18) & 0x07); *dp++ = 0x80 | ((c >> 12) & 0x3f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF16_UTF8(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i, destsize; fsw_u16 *sp; fsw_u8 *dp; fsw_u32 c; sp = (fsw_u16 *)srcdata; destsize = 0; for (i = 0; i < srclen; i++) { c = *sp++; if (c < 0x000080) destsize++; else if (c < 0x000800) destsize += 2; else if (c < 0x010000) destsize += 3; else destsize += 4; } dest->type = FSW_STRING_TYPE_UTF8; dest->len = srclen; dest->size = destsize; status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u16 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; if (c < 0x000080) { *dp++ = c; } else if (c < 0x000800) { *dp++ = 0xc0 | ((c >> 6) & 0x1f); *dp++ = 0x80 | (c & 0x3f); } else if (c < 0x010000) { *dp++ = 0xe0 | ((c >> 12) & 0x0f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } else { *dp++ = 0xf0 | ((c >> 18) & 0x07); *dp++ = 0x80 | ((c >> 12) & 0x3f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } } return FSW_SUCCESS; } static fsw_status_t fsw_strcoerce_UTF16_SWAPPED_UTF8(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i, destsize; fsw_u16 *sp; fsw_u8 *dp; fsw_u32 c; sp = (fsw_u16 *)srcdata; destsize = 0; for (i = 0; i < srclen; i++) { c = *sp++; c = FSW_SWAPVALUE_U16(c); if (c < 0x000080) destsize++; else if (c < 0x000800) destsize += 2; else if (c < 0x010000) destsize += 3; else destsize += 4; } dest->type = FSW_STRING_TYPE_UTF8; dest->len = srclen; dest->size = destsize; status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (fsw_u16 *)srcdata; dp = (fsw_u8 *)dest->data; for (i = 0; i < srclen; i++) { c = *sp++; c = FSW_SWAPVALUE_U16(c); if (c < 0x000080) { *dp++ = c; } else if (c < 0x000800) { *dp++ = 0xc0 | ((c >> 6) & 0x1f); *dp++ = 0x80 | (c & 0x3f); } else if (c < 0x010000) { *dp++ = 0xe0 | ((c >> 12) & 0x0f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } else { *dp++ = 0xf0 | ((c >> 18) & 0x07); *dp++ = 0x80 | ((c >> 12) & 0x3f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } } return FSW_SUCCESS; } refit-0.14/fsw/LICENSE.txt0000644000175000017500000000147010474603527014541 0ustar julienjulien File System Wrapper License ============================= The various parts of the File System Wrapper source code come from different sources and may carry different licenses. Here's a quick account of the situation: * The core code was written from scratch and is covered by a BSD-style license. * The EFI host driver was written from scratch, possibly using code from the TianoCore project and Intel's EFI Application Toolkit. It is covered by a BSD-style license. * The ext2 and reiserfs file system drivers use definitions from the Linux kernel source. The actual code was written from scratch, using multiple sources for reference. These drivers are covered by the GNU GPL. For more details, see each file's boilerplate comment. The full text of the GNU GPL is in the file LICENSE_GPL.txt. refit-0.14/fsw/LICENSE_GPL.txt0000644000175000017500000004311010452422655015235 0ustar julienjulien GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. refit-0.14/fsw/lslr.c0000644000175000017500000000637310545744675014056 0ustar julienjulien/** * \file lslr.c * Test program for the POSIX user space environment. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_posix.h" extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(ext2); extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(reiserfs); extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(iso9660); static struct fsw_fstype_table *fstypes[] = { &FSW_FSTYPE_TABLE_NAME(ext2), &FSW_FSTYPE_TABLE_NAME(reiserfs), &FSW_FSTYPE_TABLE_NAME(iso9660), NULL }; static int listdir(struct fsw_posix_volume *vol, char *path, int level) { struct fsw_posix_dir *dir; struct dirent *dent; int i; char subpath[4096]; dir = fsw_posix_opendir(vol, path); if (dir == NULL) { printf("opendir(%s) call failed.\n", path); return 1; } while ((dent = fsw_posix_readdir(dir)) != NULL) { for (i = 0; i < level*2; i++) fputc(' ', stdout); printf("%d %s\n", dent->d_type, dent->d_name); if (dent->d_type == DT_DIR) { snprintf(subpath, 4095, "%s%s/", path, dent->d_name); listdir(vol, subpath, level + 1); } } fsw_posix_closedir(dir); return 0; } int main(int argc, char **argv) { struct fsw_posix_volume *vol; int i; if (argc != 2) { printf("Usage: lslr \n"); return 1; } for (i = 0; fstypes[i]; i++) { vol = fsw_posix_mount(argv[1], fstypes[i]); if (vol != NULL) { printf("Mounted as '%s'.\n", fstypes[i]->name.data); break; } } if (vol == NULL) { printf("Mounting failed.\n"); return 1; } listdir(vol, "/", 0); fsw_posix_unmount(vol); return 0; } // EOF refit-0.14/fsw/lsroot.c0000644000175000017500000000531110544467664014412 0ustar julienjulien/** * \file lsroot.c * Example program for the POSIX user space environment. */ /*- * Copyright (c) 2006 Christoph Pfisterer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "fsw_posix.h" extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(ext2); extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(reiserfs); extern struct fsw_fstype_table FSW_FSTYPE_TABLE_NAME(iso9660); int main(int argc, char **argv) { struct fsw_posix_volume *vol; struct fsw_posix_dir *dir; struct dirent *dent; if (argc != 2) { printf("Usage: lsroot \n"); return 1; } //vol = fsw_posix_mount(argv[1], &FSW_FSTYPE_TABLE_NAME(ext2)); //vol = fsw_posix_mount(argv[1], &FSW_FSTYPE_TABLE_NAME(reiserfs)); vol = fsw_posix_mount(argv[1], &FSW_FSTYPE_TABLE_NAME(iso9660)); if (vol == NULL) { printf("Mounting failed.\n"); return 1; } //dir = fsw_posix_opendir(vol, "/drivers/net/"); dir = fsw_posix_opendir(vol, "/"); if (dir == NULL) { printf("opendir call failed.\n"); return 1; } while ((dent = fsw_posix_readdir(dir)) != NULL) { printf("- %s\n", dent->d_name); } fsw_posix_closedir(dir); fsw_posix_unmount(vol); return 0; } // EOF refit-0.14/fsw/mk_fsw_strfunc.py0000755000175000017500000001116010545744767016335 0ustar julienjulien#!/usr/bin/env python # # mk_fsw_strfunc.py # # definitions types = { 'ISO88591': 'fsw_u8', 'UTF8': 'fsw_u8', 'UTF16': 'fsw_u16', 'UTF16_SWAPPED': 'fsw_u16', } getnext = { 'ISO88591': 'VARC = *VARP++;', 'UTF8': """VARC = *VARP++; if ((VARC & 0xe0) == 0xc0) { VARC = ((VARC & 0x1f) << 6) | (*VARP++ & 0x3f); } else if ((VARC & 0xf0) == 0xe0) { VARC = ((VARC & 0x0f) << 12) | ((*VARP++ & 0x3f) << 6); VARC |= (*VARP++ & 0x3f); } else if ((VARC & 0xf8) == 0xf0) { VARC = ((VARC & 0x07) << 18) | ((*VARP++ & 0x3f) << 12); VARC |= ((*VARP++ & 0x3f) << 6); VARC |= (*VARP++ & 0x3f); }""", 'UTF16': 'VARC = *VARP++;', 'UTF16_SWAPPED': 'VARC = *VARP++; VARC = FSW_SWAPVALUE_U16(VARC);', } combos = ( ('ISO88591', 'UTF8'), ('ISO88591', 'UTF16'), ('ISO88591', 'UTF16_SWAPPED'), ('UTF8', 'UTF16'), ('UTF8', 'UTF16_SWAPPED'), ('UTF16', 'UTF16_SWAPPED') ) coerce_combos = {} for combo in combos: coerce_combos.setdefault(combo[0], []).append(combo[1]) coerce_combos.setdefault(combo[1], []).append(combo[0]) # generate functions output = """/* fsw_strfunc.h generated by mk_fsw_strfunc.py */ """ # generate streq functions (symmetric) for combo in combos: (enc1, enc2) = combo type1 = types[enc1] type2 = types[enc2] getnext1 = getnext[enc1].replace('VARC', 'c1').replace('VARP', 'p1').replace("\n", "\n ") getnext2 = getnext[enc2].replace('VARC', 'c2').replace('VARP', 'p2').replace("\n", "\n ") output += """ static int fsw_streq_%(enc1)s_%(enc2)s(void *s1data, void *s2data, int len) { int i; %(type1)s *p1 = (%(type1)s *)s1data; %(type2)s *p2 = (%(type2)s *)s2data; fsw_u32 c1, c2; for (i = 0; i < len; i++) { %(getnext1)s %(getnext2)s if (c1 != c2) return 0; } return 1; } """ % locals() # generate strcoerce functions (asymmetric, destination-specific) for enc2 in ('ISO88591', 'UTF16'): for enc1 in coerce_combos[enc2]: type1 = types[enc1] type2 = types[enc2] getnext1 = getnext[enc1].replace('VARC', 'c').replace('VARP', 'sp').replace("\n", "\n ") output += """ static fsw_status_t fsw_strcoerce_%(enc1)s_%(enc2)s(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i; %(type1)s *sp; %(type2)s *dp; fsw_u32 c; dest->type = FSW_STRING_TYPE_%(enc2)s; dest->len = srclen; dest->size = srclen * sizeof(%(type2)s); status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (%(type1)s *)srcdata; dp = (%(type2)s *)dest->data; for (i = 0; i < srclen; i++) { %(getnext1)s *dp++ = c; } return FSW_SUCCESS; } """ % locals() for enc2 in ('UTF8',): for enc1 in coerce_combos[enc2]: type1 = types[enc1] type2 = types[enc2] getnext1 = getnext[enc1].replace('VARC', 'c').replace('VARP', 'sp').replace("\n", "\n ") output += """ static fsw_status_t fsw_strcoerce_%(enc1)s_%(enc2)s(void *srcdata, int srclen, struct fsw_string *dest) { fsw_status_t status; int i, destsize; %(type1)s *sp; %(type2)s *dp; fsw_u32 c; sp = (%(type1)s *)srcdata; destsize = 0; for (i = 0; i < srclen; i++) { %(getnext1)s if (c < 0x000080) destsize++; else if (c < 0x000800) destsize += 2; else if (c < 0x010000) destsize += 3; else destsize += 4; } dest->type = FSW_STRING_TYPE_%(enc2)s; dest->len = srclen; dest->size = destsize; status = fsw_alloc(dest->size, &dest->data); if (status) return status; sp = (%(type1)s *)srcdata; dp = (%(type2)s *)dest->data; for (i = 0; i < srclen; i++) { %(getnext1)s if (c < 0x000080) { *dp++ = c; } else if (c < 0x000800) { *dp++ = 0xc0 | ((c >> 6) & 0x1f); *dp++ = 0x80 | (c & 0x3f); } else if (c < 0x010000) { *dp++ = 0xe0 | ((c >> 12) & 0x0f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } else { *dp++ = 0xf0 | ((c >> 18) & 0x07); *dp++ = 0x80 | ((c >> 12) & 0x3f); *dp++ = 0x80 | ((c >> 6) & 0x3f); *dp++ = 0x80 | (c & 0x3f); } } return FSW_SUCCESS; } """ % locals() # coerce functions with destination UFT16_SWAPPED missing by design # write output file f = file("fsw_strfunc.h", "w") f.write(output) f.close() # EOF refit-0.14/gluerefit.sh0000755000175000017500000000043111161476603014435 0ustar julienjulien#!/bin/sh for binary in refit/refit dbounce/dbounce dumpfv/dumpfv dumpprot/dumpprot \ fsw/fsw_ext2 fsw/fsw_iso9660 fsw/fsw_reiserfs gptsync/gptsync \ TextMode/textmode ; do ./fatglue.py $(basename $binary).efi \ ${binary}_bios32.efi ${binary}_em64t.efi done exit 0 refit-0.14/gluetools.sh0000755000175000017500000000054511161476603014472 0ustar julienjulien#!/bin/sh cd ../binaries mkdir -p fat ../refit/fatglue.py fat/shell.efi bios32/NShell.efi em64t/NShell.efi for tool in drawbox.efi dhclient.efi ed.efi edit.efi ftp.efi hexdump.efi \ hostname.efi ifconfig.efi loadarg.efi ping.efi pppd.efi route.efi \ tcpipv4.efi which.efi ; do ../refit/fatglue.py fat/$tool bios32/$tool em64t/$tool done exit 0 refit-0.14/gptsync/0000755000175000017500000000000011363100432013565 5ustar julienjulienrefit-0.14/gptsync/gptsync.80000644000175000017500000000115510453477312015364 0ustar julienjulien.TH "gptsync" 8 "2006 Jul 2" "Debian" "rEFIt" .SH NAME gptsync \- GPT partition table to MBR partition table synchronisation .SH "SYNOPSIS" .BI "gptsync " "device" .SH "DESCRIPTION" Reads the GPT partition table on the device and synchronise content of MBR partition table on the device. Useful for situations (as in mactel linux) where legacy operating systems require MBR partition table to function properly, while most other operating systems can work with GPT. .SH "Author" Written by Christoph Pfisterer. This manual page contributed for Debian by Junichi Uekawa , but may be used for others. refit-0.14/gptsync/gptsync.c0000644000175000017500000004116010570501225015426 0ustar julienjulien/* * gptsync/gptsync.c * Platform-independent code for syncing GPT and MBR * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gptsync.h" #include "syslinux_mbr.h" // // MBR functions // static UINTN check_mbr(VOID) { UINTN i, k; // check each entry for (i = 0; i < mbr_part_count; i++) { // check for overlap for (k = 0; k < mbr_part_count; k++) { if (k != i && !(mbr_parts[i].start_lba > mbr_parts[k].end_lba || mbr_parts[k].start_lba > mbr_parts[i].end_lba)) { Print(L"Status: MBR partition table is invalid, partitions overlap.\n"); return 1; } } // check for extended partitions if (mbr_parts[i].mbr_type == 0x05 || mbr_parts[i].mbr_type == 0x0f || mbr_parts[i].mbr_type == 0x85) { Print(L"Status: Extended partition found in MBR table, will not touch this disk.\n", gpt_parts[i].gpt_parttype->name); return 1; } } return 0; } static UINTN write_mbr(VOID) { UINTN status; UINTN i, k; UINT8 active; UINT64 lba; MBR_PARTITION_INFO *table; BOOLEAN have_bootcode; Print(L"\nWriting new MBR...\n"); // read MBR data status = read_sector(0, sector); if (status != 0) return status; // write partition table *((UINT16 *)(sector + 510)) = 0xaa55; table = (MBR_PARTITION_INFO *)(sector + 446); active = 0x80; for (i = 0; i < 4; i++) { for (k = 0; k < new_mbr_part_count; k++) { if (new_mbr_parts[k].index == i) break; } if (k >= new_mbr_part_count) { // unused entry table[i].flags = 0; table[i].start_chs[0] = 0; table[i].start_chs[1] = 0; table[i].start_chs[2] = 0; table[i].type = 0; table[i].end_chs[0] = 0; table[i].end_chs[1] = 0; table[i].end_chs[2] = 0; table[i].start_lba = 0; table[i].size = 0; } else { if (new_mbr_parts[k].active) { table[i].flags = active; active = 0x00; } else table[i].flags = 0x00; table[i].start_chs[0] = 0xfe; table[i].start_chs[1] = 0xff; table[i].start_chs[2] = 0xff; table[i].type = new_mbr_parts[k].mbr_type; table[i].end_chs[0] = 0xfe; table[i].end_chs[1] = 0xff; table[i].end_chs[2] = 0xff; lba = new_mbr_parts[k].start_lba; if (lba > 0xffffffffULL) { Print(L"Warning: Partition %d starts beyond 2 TiB limit\n", i+1); lba = 0xffffffffULL; } table[i].start_lba = (UINT32)lba; lba = new_mbr_parts[k].end_lba + 1 - new_mbr_parts[k].start_lba; if (lba > 0xffffffffULL) { Print(L"Warning: Partition %d extends beyond 2 TiB limit\n", i+1); lba = 0xffffffffULL; } table[i].size = (UINT32)lba; } } // add boot code if necessary have_bootcode = FALSE; for (i = 0; i < MBR_BOOTCODE_SIZE; i++) { if (sector[i] != 0) { have_bootcode = TRUE; break; } } if (!have_bootcode) { // no boot code found in the MBR, add the syslinux MBR code SetMem(sector, MBR_BOOTCODE_SIZE, 0); CopyMem(sector, syslinux_mbr, SYSLINUX_MBR_SIZE); } // write MBR data status = write_sector(0, sector); if (status != 0) return status; Print(L"MBR updated successfully!\n"); return 0; } // // GPT functions // static UINTN check_gpt(VOID) { UINTN i, k; BOOLEAN found_data_parts; if (gpt_part_count == 0) { Print(L"Status: No GPT partition table, no need to sync.\n"); return 1; } // check each entry found_data_parts = FALSE; for (i = 0; i < gpt_part_count; i++) { // check sanity if (gpt_parts[i].end_lba < gpt_parts[i].start_lba) { Print(L"Status: GPT partition table is invalid.\n"); return 1; } // check for overlap for (k = 0; k < gpt_part_count; k++) { if (k != i && !(gpt_parts[i].start_lba > gpt_parts[k].end_lba || gpt_parts[k].start_lba > gpt_parts[i].end_lba)) { Print(L"Status: GPT partition table is invalid, partitions overlap.\n"); return 1; } } // check for partitions kind if (gpt_parts[i].gpt_parttype->kind == GPT_KIND_FATAL) { Print(L"Status: GPT partition of type '%s' found, will not touch this disk.\n", gpt_parts[i].gpt_parttype->name); return 1; } if (gpt_parts[i].gpt_parttype->kind == GPT_KIND_DATA || gpt_parts[i].gpt_parttype->kind == GPT_KIND_BASIC_DATA) found_data_parts = TRUE; } if (!found_data_parts) { Print(L"Status: GPT partition table has no data partitions, no need to sync.\n"); return 1; } return 0; } // // compare GPT and MBR tables // #define ACTION_NONE (0) #define ACTION_NOP (1) #define ACTION_REWRITE (2) static UINTN analyze(VOID) { UINTN action; UINTN i, k, iter, count_active, detected_parttype; CHARN *fsname; UINT64 min_start_lba; UINTN status; BOOLEAN have_esp; new_mbr_part_count = 0; // determine correct MBR types for GPT partitions if (gpt_part_count == 0) { Print(L"Status: No GPT partitions defined, nothing to sync.\n"); return 0; } have_esp = FALSE; for (i = 0; i < gpt_part_count; i++) { gpt_parts[i].mbr_type = gpt_parts[i].gpt_parttype->mbr_type; if (gpt_parts[i].gpt_parttype->kind == GPT_KIND_BASIC_DATA) { // Basic Data: need to look at data in the partition status = detect_mbrtype_fs(gpt_parts[i].start_lba, &detected_parttype, &fsname); if (detected_parttype) gpt_parts[i].mbr_type = detected_parttype; else gpt_parts[i].mbr_type = 0x0b; // fallback: FAT32 } else if (gpt_parts[i].mbr_type == 0xef) { // EFI System Partition: GNU parted can put this on any partition, // need to detect file systems status = detect_mbrtype_fs(gpt_parts[i].start_lba, &detected_parttype, &fsname); if (!have_esp && (detected_parttype == 0x01 || detected_parttype == 0x0e || detected_parttype == 0x0c)) ; // seems to be a legitimate ESP, don't change else if (detected_parttype) gpt_parts[i].mbr_type = detected_parttype; else if (have_esp) // make sure there's no more than one ESP per disk gpt_parts[i].mbr_type = 0x83; // fallback: Linux } // NOTE: mbr_type may still be 0 if content detection fails for exotic GPT types or file systems if (gpt_parts[i].mbr_type == 0xef) have_esp = TRUE; } // check for common scenarios action = ACTION_NONE; if (mbr_part_count == 0) { // current MBR is empty action = ACTION_REWRITE; } else if (mbr_part_count == 1 && mbr_parts[0].mbr_type == 0xee) { // MBR has just the EFI Protective partition (i.e. untouched) action = ACTION_REWRITE; } if (action == ACTION_NONE && mbr_part_count > 0) { if (mbr_parts[0].mbr_type == 0xee && gpt_parts[0].mbr_type == 0xef && mbr_parts[0].start_lba == 1 && mbr_parts[0].end_lba == gpt_parts[0].end_lba) { // The Apple Way, "EFI Protective" covering the tables and the ESP action = ACTION_NOP; if ((mbr_part_count != gpt_part_count && gpt_part_count <= 4) || (mbr_part_count != 4 && gpt_part_count > 4)) { // number of partitions has changed action = ACTION_REWRITE; } else { // check partition ranges and types for (i = 1; i < mbr_part_count; i++) { if (mbr_parts[i].start_lba != gpt_parts[i].start_lba || mbr_parts[i].end_lba != gpt_parts[i].end_lba || (gpt_parts[i].mbr_type && mbr_parts[i].mbr_type != gpt_parts[i].mbr_type)) // position or type has changed action = ACTION_REWRITE; } } // check number of active partitions count_active = 0; for (i = 0; i < mbr_part_count; i++) if (mbr_parts[i].active) count_active++; if (count_active!= 1) action = ACTION_REWRITE; } } if (action == ACTION_NONE && mbr_part_count > 0 && mbr_parts[0].mbr_type == 0xef) { // The XOM Way, all partitions mirrored 1:1 action = ACTION_REWRITE; // check partition ranges and types for (i = 0; i < mbr_part_count; i++) { if (mbr_parts[i].start_lba != gpt_parts[i].start_lba || mbr_parts[i].end_lba != gpt_parts[i].end_lba || (gpt_parts[i].mbr_type && mbr_parts[i].mbr_type != gpt_parts[i].mbr_type)) // position or type has changed -> better don't touch action = ACTION_NONE; } } if (action == ACTION_NOP) { Print(L"Status: Tables are synchronized, no need to sync.\n"); return 0; } else if (action == ACTION_REWRITE) { Print(L"Status: MBR table must be updated.\n"); } else { Print(L"Status: Analysis inconclusive, will not touch this disk.\n"); return 1; } // generate the new table // first entry: EFI Protective new_mbr_parts[0].index = 0; new_mbr_parts[0].start_lba = 1; new_mbr_parts[0].mbr_type = 0xee; new_mbr_part_count = 1; if (gpt_parts[0].mbr_type == 0xef) { new_mbr_parts[0].end_lba = gpt_parts[0].end_lba; i = 1; } else { min_start_lba = gpt_parts[0].start_lba; for (k = 0; k < gpt_part_count; k++) { if (min_start_lba > gpt_parts[k].start_lba) min_start_lba = gpt_parts[k].start_lba; } new_mbr_parts[0].end_lba = min_start_lba - 1; i = 0; } // add other GPT partitions until the table is full // TODO: in the future, prioritize partitions by kind for (; i < gpt_part_count && new_mbr_part_count < 4; i++) { new_mbr_parts[new_mbr_part_count].index = new_mbr_part_count; new_mbr_parts[new_mbr_part_count].start_lba = gpt_parts[i].start_lba; new_mbr_parts[new_mbr_part_count].end_lba = gpt_parts[i].end_lba; new_mbr_parts[new_mbr_part_count].mbr_type = gpt_parts[i].mbr_type; new_mbr_parts[new_mbr_part_count].active = FALSE; // find matching partition in the old MBR table for (k = 0; k < mbr_part_count; k++) { if (mbr_parts[k].start_lba == gpt_parts[i].start_lba) { // keep type if not detected if (new_mbr_parts[new_mbr_part_count].mbr_type == 0) new_mbr_parts[new_mbr_part_count].mbr_type = mbr_parts[k].mbr_type; // keep active flag new_mbr_parts[new_mbr_part_count].active = mbr_parts[k].active; break; } } if (new_mbr_parts[new_mbr_part_count].mbr_type == 0) // final fallback: set to a (hopefully) unused type new_mbr_parts[new_mbr_part_count].mbr_type = 0xc0; new_mbr_part_count++; } // make sure there's exactly one active partition for (iter = 0; iter < 3; iter++) { // check count_active = 0; for (i = 0; i < new_mbr_part_count; i++) if (new_mbr_parts[i].active) count_active++; if (count_active == 1) break; // set active on the first matching partition if (count_active == 0) { for (i = 0; i < new_mbr_part_count; i++) { if ((iter >= 0 && (new_mbr_parts[i].mbr_type == 0x07 || // NTFS new_mbr_parts[i].mbr_type == 0x0b || // FAT32 new_mbr_parts[i].mbr_type == 0x0c)) || // FAT32 (LBA) (iter >= 1 && (new_mbr_parts[i].mbr_type == 0x83)) || // Linux (iter >= 2 && i > 0)) { new_mbr_parts[i].active = TRUE; break; } } } else if (count_active > 1 && iter == 0) { // too many active partitions, try deactivating the ESP / EFI Protective entry if ((new_mbr_parts[0].mbr_type == 0xee || new_mbr_parts[0].mbr_type == 0xef) && new_mbr_parts[0].active) { new_mbr_parts[0].active = FALSE; } } else if (count_active > 1 && iter > 0) { // too many active partitions, deactivate all but the first one count_active = 0; for (i = 0; i < new_mbr_part_count; i++) if (new_mbr_parts[i].active) { if (count_active > 0) new_mbr_parts[i].active = FALSE; count_active++; } } } // dump table Print(L"\nProposed new MBR partition table:\n"); Print(L" # A Start LBA End LBA Type\n"); for (i = 0; i < new_mbr_part_count; i++) { Print(L" %d %s %12lld %12lld %02x %s\n", new_mbr_parts[i].index + 1, new_mbr_parts[i].active ? STR("*") : STR(" "), new_mbr_parts[i].start_lba, new_mbr_parts[i].end_lba, new_mbr_parts[i].mbr_type, mbr_parttype_name(new_mbr_parts[i].mbr_type)); } return 0; } // // sync algorithm entry point // UINTN gptsync(VOID) { UINTN status = 0; UINTN status_gpt, status_mbr; BOOLEAN proceed = FALSE; // get full information from disk status_gpt = read_gpt(); status_mbr = read_mbr(); if (status_gpt != 0 || status_mbr != 0) return (status_gpt || status_mbr); // cross-check current situation Print(L"\n"); status = check_gpt(); // check GPT for consistency if (status != 0) return status; status = check_mbr(); // check MBR for consistency if (status != 0) return status; status = analyze(); // analyze the situation & compose new MBR table if (status != 0) return status; if (new_mbr_part_count == 0) return status; // offer user the choice what to do status = input_boolean(STR("\nMay I update the MBR as printed above? [y/N] "), &proceed); if (status != 0 || proceed != TRUE) return status; // adjust the MBR and write it back status = write_mbr(); if (status != 0) return status; return status; } refit-0.14/gptsync/gptsync.h0000644000175000017500000001226510633422241015437 0ustar julienjulien/* * gptsync/gptsync.h * Common header for gptsync and showpart * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // // config // #if defined(EFI32) || defined(EFIX64) #define CONFIG_EFI #endif // // platform-dependent types // #ifdef CONFIG_EFI #include #include #define copy_guid(destguid, srcguid) (CopyMem(destguid, srcguid, 16)) #define guids_are_equal(guid1, guid2) (CompareMem(guid1, guid2, 16) == 0) typedef CHAR16 CHARN; #define STR(x) L##x #endif #ifndef CONFIG_EFI #include #include #include #include #include #include #include #include #include typedef int INTN; typedef unsigned int UINTN; typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned long UINT32; typedef unsigned long long UINT64; typedef void VOID; typedef int BOOLEAN; #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (1) #endif typedef unsigned short CHAR16; typedef char CHARN; #define STR(x) x void Print(wchar_t *format, ...); // FUTURE: use STR(), #define Print printf #define CopyMem memcpy #define SetMem memset #define CompareMem memcmp #define copy_guid(destguid, srcguid) (memcpy(destguid, srcguid, 16)) #define guids_are_equal(guid1, guid2) (memcmp(guid1, guid2, 16) == 0) #endif // // platform-independent types // typedef struct { UINT8 flags; UINT8 start_chs[3]; UINT8 type; UINT8 end_chs[3]; UINT32 start_lba; UINT32 size; } MBR_PARTITION_INFO; typedef struct { UINT8 type; CHARN *name; } MBR_PARTTYPE; typedef struct { UINT64 signature; UINT32 spec_revision; UINT32 header_size; UINT32 header_crc32; UINT32 reserved; UINT64 header_lba; UINT64 alternate_header_lba; UINT64 first_usable_lba; UINT64 last_usable_lba; UINT8 disk_guid[16]; UINT64 entry_lba; UINT32 entry_count; UINT32 entry_size; UINT32 entry_crc32; } GPT_HEADER; typedef struct { UINT8 type_guid[16]; UINT8 partition_guid[16]; UINT64 start_lba; UINT64 end_lba; UINT64 attributes; CHAR16 name[36]; } GPT_ENTRY; #define GPT_KIND_SYSTEM (0) #define GPT_KIND_DATA (1) #define GPT_KIND_BASIC_DATA (2) #define GPT_KIND_FATAL (3) typedef struct { UINT8 guid[16]; UINT8 mbr_type; CHARN *name; UINTN kind; } GPT_PARTTYPE; typedef struct { UINTN index; UINT64 start_lba; UINT64 end_lba; UINTN mbr_type; UINT8 gpt_type[16]; GPT_PARTTYPE *gpt_parttype; BOOLEAN active; } PARTITION_INFO; // // functions provided by the OS-specific module // UINTN read_sector(UINT64 lba, UINT8 *buffer); UINTN write_sector(UINT64 lba, UINT8 *buffer); UINTN input_boolean(CHARN *prompt, BOOLEAN *bool_out); // // vars and functions provided by the common lib module // extern UINT8 empty_guid[16]; extern PARTITION_INFO mbr_parts[4]; extern UINTN mbr_part_count; extern PARTITION_INFO gpt_parts[128]; extern UINTN gpt_part_count; extern PARTITION_INFO new_mbr_parts[4]; extern UINTN new_mbr_part_count; extern UINT8 sector[512]; extern MBR_PARTTYPE mbr_types[]; extern GPT_PARTTYPE gpt_types[]; extern GPT_PARTTYPE gpt_dummy_type; CHARN * mbr_parttype_name(UINT8 type); UINTN read_mbr(VOID); GPT_PARTTYPE * gpt_parttype(UINT8 *type_guid); UINTN read_gpt(VOID); UINTN detect_mbrtype_fs(UINT64 partlba, UINTN *parttype, CHARN **fsname); // // actual platform-independent programs // UINTN gptsync(VOID); UINTN showpart(VOID); /* EOF */ refit-0.14/gptsync/gptsync.mak0000644000175000017500000000260710633422241015757 0ustar julienjulien# # gptsync/gptsync.mak # Build control file for the gptsync tool # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = gptsync IMAGE_ENTRY_POINT = efi_main # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ $(BUILD_DIR)\lib.obj \ $(BUILD_DIR)\os_efi.obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\lib.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\os_efi.obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/gptsync/lib.c0000644000175000017500000004636311344435111014517 0ustar julienjulien/* * gptsync/lib.c * Platform-independent code common to gptsync and showpart * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gptsync.h" // variables UINT8 empty_guid[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; PARTITION_INFO mbr_parts[4]; UINTN mbr_part_count = 0; PARTITION_INFO gpt_parts[128]; UINTN gpt_part_count = 0; PARTITION_INFO new_mbr_parts[4]; UINTN new_mbr_part_count = 0; UINT8 sector[512]; MBR_PARTTYPE mbr_types[] = { { 0x01, STR("FAT12 (CHS)") }, { 0x04, STR("FAT16 <32M (CHS)") }, { 0x05, STR("Extended (CHS)") }, { 0x06, STR("FAT16 (CHS)") }, { 0x07, STR("NTFS/HPFS") }, { 0x0b, STR("FAT32 (CHS)") }, { 0x0c, STR("FAT32 (LBA)") }, { 0x0e, STR("FAT16 (LBA)") }, { 0x0f, STR("Extended (LBA)") }, { 0x11, STR("Hidden FAT12 (CHS)") }, { 0x14, STR("Hidden FAT16 <32M (CHS)") }, { 0x16, STR("Hidden FAT16 (CHS)") }, { 0x17, STR("Hidden NTFS/HPFS") }, { 0x1b, STR("Hidden FAT32 (CHS)") }, { 0x1c, STR("Hidden FAT32 (LBA)") }, { 0x1e, STR("Hidden FAT16 (LBA)") }, { 0x82, STR("Linux swap / Solaris") }, { 0x83, STR("Linux") }, { 0x85, STR("Linux Extended") }, { 0x86, STR("NT FAT volume set") }, { 0x87, STR("NTFS volume set") }, { 0x8e, STR("Linux LVM") }, { 0xa5, STR("FreeBSD") }, { 0xa6, STR("OpenBSD") }, { 0xa7, STR("NeXTSTEP") }, { 0xa8, STR("Mac OS X UFS") }, { 0xa9, STR("NetBSD") }, { 0xab, STR("Mac OS X Boot") }, { 0xac, STR("Apple RAID") }, { 0xaf, STR("Mac OS X HFS+") }, { 0xbe, STR("Solaris Boot") }, { 0xbf, STR("Solaris") }, { 0xeb, STR("BeOS") }, { 0xee, STR("EFI Protective") }, { 0xef, STR("EFI System (FAT)") }, { 0xfd, STR("Linux RAID") }, { 0, NULL }, }; GPT_PARTTYPE gpt_types[] = { // Defined by EFI/UEFI specification { "\x28\x73\x2A\xC1\x1F\xF8\xD2\x11\xBA\x4B\x00\xA0\xC9\x3E\xC9\x3B", 0xef, STR("EFI System (FAT)"), GPT_KIND_SYSTEM }, { "\x41\xEE\x4D\x02\xE7\x33\xD3\x11\x9D\x69\x00\x08\xC7\x81\xF3\x9F", 0x00, STR("MBR partition scheme"), GPT_KIND_FATAL }, // Generally well-known { "\x16\xE3\xC9\xE3\x5C\x0B\xB8\x4D\x81\x7D\xF9\x2D\xF0\x02\x15\xAE", 0x00, STR("MS Reserved"), GPT_KIND_SYSTEM }, { "\xA2\xA0\xD0\xEB\xE5\xB9\x33\x44\x87\xC0\x68\xB6\xB7\x26\x99\xC7", 0x00, STR("Basic Data"), GPT_KIND_BASIC_DATA }, // From Wikipedia { "\xAA\xC8\x08\x58\x8F\x7E\xE0\x42\x85\xD2\xE1\xE9\x04\x34\xCF\xB3", 0x00, STR("MS LDM Metadata"), GPT_KIND_FATAL }, { "\xA0\x60\x9B\xAF\x31\x14\x62\x4F\xBC\x68\x33\x11\x71\x4A\x69\xAD", 0x00, STR("MS LDM Data"), GPT_KIND_FATAL }, { "\x1E\x4C\x89\x75\xEB\x3A\xD3\x11\xB7\xC1\x7B\x03\xA0\x00\x00\x00", 0x00, STR("HP/UX Data"), GPT_KIND_DATA }, { "\x28\xE7\xA1\xE2\xE3\x32\xD6\x11\xA6\x82\x7B\x03\xA0\x00\x00\x00", 0x00, STR("HP/UX Service"), GPT_KIND_SYSTEM }, // From Linux repository, fs/partitions/efi.h { "\x0F\x88\x9D\xA1\xFC\x05\x3B\x4D\xA0\x06\x74\x3F\x0F\x84\x91\x1E", 0xfd, STR("Linux RAID"), GPT_KIND_DATA }, { "\x6D\xFD\x57\x06\xAB\xA4\xC4\x43\x84\xE5\x09\x33\xC8\x4B\x4F\x4F", 0x82, STR("Linux Swap"), GPT_KIND_SYSTEM }, { "\x79\xD3\xD6\xE6\x07\xF5\xC2\x44\xA2\x3C\x23\x8F\x2A\x3D\xF9\x28", 0x8e, STR("Linux LVM"), GPT_KIND_DATA }, // From Wikipedia { "\x39\x33\xA6\x8D\x07\x00\xC0\x60\xC4\x36\x08\x3A\xC8\x23\x09\x08", 0x00, STR("Linux Reserved"), GPT_KIND_SYSTEM }, // From grub2 repository, grub/include/grub/gpt_partition.h { "\x48\x61\x68\x21\x49\x64\x6F\x6E\x74\x4E\x65\x65\x64\x45\x46\x49", 0x00, STR("GRUB2 BIOS Boot"), GPT_KIND_SYSTEM }, // From FreeBSD repository, sys/sys/gpt.h { "\xB4\x7C\x6E\x51\xCF\x6E\xD6\x11\x8F\xF8\x00\x02\x2D\x09\x71\x2B", 0xa5, STR("FreeBSD Data"), GPT_KIND_DATA }, { "\xB5\x7C\x6E\x51\xCF\x6E\xD6\x11\x8F\xF8\x00\x02\x2D\x09\x71\x2B", 0x00, STR("FreeBSD Swap"), GPT_KIND_SYSTEM }, { "\xB6\x7C\x6E\x51\xCF\x6E\xD6\x11\x8F\xF8\x00\x02\x2D\x09\x71\x2B", 0xa5, STR("FreeBSD UFS"), GPT_KIND_DATA }, { "\xB8\x7C\x6E\x51\xCF\x6E\xD6\x11\x8F\xF8\x00\x02\x2D\x09\x71\x2B", 0x00, STR("FreeBSD Vinum"), GPT_KIND_DATA }, { "\xBA\x7C\x6E\x51\xCF\x6E\xD6\x11\x8F\xF8\x00\x02\x2D\x09\x71\x2B", 0xa5, STR("FreeBSD ZFS"), GPT_KIND_DATA }, { "\x9D\x6B\xBD\x83\x41\x7F\xDC\x11\xBE\x0B\x00\x15\x60\xB8\x4F\x0F", 0xa5, STR("FreeBSD Boot"), GPT_KIND_DATA }, // From NetBSD repository, sys/sys/disklabel_gpt.h { "\x32\x8D\xF4\x49\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0x00, STR("NetBSD Swap"), GPT_KIND_SYSTEM }, { "\x5A\x8D\xF4\x49\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0xa9, STR("NetBSD FFS"), GPT_KIND_DATA }, { "\x82\x8D\xF4\x49\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0xa9, STR("NetBSD LFS"), GPT_KIND_DATA }, { "\xAA\x8D\xF4\x49\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0xa9, STR("NetBSD RAID"), GPT_KIND_DATA }, { "\xC4\x19\xB5\x2D\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0xa9, STR("NetBSD CCD"), GPT_KIND_DATA }, { "\xEC\x19\xB5\x2D\x0E\xB1\xDC\x11\xB9\x9B\x00\x19\xD1\x87\x96\x48", 0xa9, STR("NetBSD CGD"), GPT_KIND_DATA }, // From http://developer.apple.com/mac/library/technotes/tn2006/tn2166.html { "\x00\x53\x46\x48\x00\x00\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0xaf, STR("Mac OS X HFS+"), GPT_KIND_DATA }, { "\x00\x53\x46\x55\x00\x00\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0xa8, STR("Mac OS X UFS"), GPT_KIND_DATA }, { "\x74\x6F\x6F\x42\x00\x00\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0xab, STR("Mac OS X Boot"), GPT_KIND_DATA }, { "\x44\x49\x41\x52\x00\x00\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0xac, STR("Apple RAID"), GPT_KIND_DATA }, { "\x44\x49\x41\x52\x4F\x5F\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0xac, STR("Apple RAID (Offline)"), GPT_KIND_DATA }, { "\x65\x62\x61\x4C\x00\x6C\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0x00, STR("Apple Label"), GPT_KIND_SYSTEM }, // From Wikipedia { "\x6F\x63\x65\x52\x65\x76\xAA\x11\xAA\x11\x00\x30\x65\x43\xEC\xAC", 0x00, STR("Apple TV Recovery"), GPT_KIND_BASIC_DATA }, // From OpenSolaris repository, usr/src/uts/common/sys/efi_partition.h { "\x7f\x23\x96\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Reserved"), GPT_KIND_SYSTEM }, { "\x45\xCB\x82\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0xbf, STR("Solaris Boot"), GPT_KIND_DATA }, { "\x4D\xCF\x85\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0xbf, STR("Solaris Root"), GPT_KIND_DATA }, { "\x6F\xC4\x87\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Swap"), GPT_KIND_SYSTEM }, { "\xC3\x8C\x89\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0xbf, STR("Solaris Usr / Apple ZFS"), GPT_KIND_DATA }, { "\x2B\x64\x8B\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Backup"), GPT_KIND_SYSTEM }, { "\xC7\x2A\x8D\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Reserved (Stand)"), GPT_KIND_SYSTEM }, { "\xE9\xF2\x8E\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0xbf, STR("Solaris Var"), GPT_KIND_DATA }, { "\x39\xBA\x90\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0xbf, STR("Solaris Home"), GPT_KIND_DATA }, { "\xA5\x83\x92\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Alternate Sector"), GPT_KIND_SYSTEM }, { "\x3B\x5A\x94\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Reserved (Cache)"), GPT_KIND_SYSTEM }, { "\xD1\x30\x96\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Reserved"), GPT_KIND_SYSTEM }, { "\x67\x07\x98\x6A\xD2\x1D\xB2\x11\x99\xa6\x08\x00\x20\x73\x66\x31", 0x00, STR("Solaris Reserved"), GPT_KIND_SYSTEM }, // List sentinel { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, 0, NULL, 0 }, }; GPT_PARTTYPE gpt_dummy_type = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, 0, STR("Unknown"), GPT_KIND_FATAL }; // // MBR functions // CHARN * mbr_parttype_name(UINT8 type) { int i; for (i = 0; mbr_types[i].name; i++) if (mbr_types[i].type == type) return mbr_types[i].name; return STR("Unknown"); } UINTN read_mbr(VOID) { UINTN status; UINTN i; BOOLEAN used; MBR_PARTITION_INFO *table; Print(L"\nCurrent MBR partition table:\n"); // read MBR data status = read_sector(0, sector); if (status != 0) return status; // check for validity if (*((UINT16 *)(sector + 510)) != 0xaa55) { Print(L" No MBR partition table present!\n"); return 1; } table = (MBR_PARTITION_INFO *)(sector + 446); for (i = 0; i < 4; i++) { if (table[i].flags != 0x00 && table[i].flags != 0x80) { Print(L" MBR partition table is invalid!\n"); return 1; } } // check if used used = FALSE; for (i = 0; i < 4; i++) { if (table[i].start_lba > 0 && table[i].size > 0) { used = TRUE; break; } } if (!used) { Print(L" No partitions defined\n"); return 0; } // dump current state & fill internal structures Print(L" # A Start LBA End LBA Type\n"); for (i = 0; i < 4; i++) { if (table[i].start_lba == 0 || table[i].size == 0) continue; mbr_parts[mbr_part_count].index = i; mbr_parts[mbr_part_count].start_lba = (UINT64)table[i].start_lba; mbr_parts[mbr_part_count].end_lba = (UINT64)table[i].start_lba + (UINT64)table[i].size - 1; mbr_parts[mbr_part_count].mbr_type = table[i].type; mbr_parts[mbr_part_count].active = (table[i].flags == 0x80) ? TRUE : FALSE; Print(L" %d %s %12lld %12lld %02x %s\n", mbr_parts[mbr_part_count].index + 1, mbr_parts[mbr_part_count].active ? STR("*") : STR(" "), mbr_parts[mbr_part_count].start_lba, mbr_parts[mbr_part_count].end_lba, mbr_parts[mbr_part_count].mbr_type, mbr_parttype_name(mbr_parts[mbr_part_count].mbr_type)); mbr_part_count++; } return 0; } // // GPT functions // GPT_PARTTYPE * gpt_parttype(UINT8 *type_guid) { int i; for (i = 0; gpt_types[i].name; i++) if (guids_are_equal(gpt_types[i].guid, type_guid)) return &(gpt_types[i]); return &gpt_dummy_type; } UINTN read_gpt(VOID) { UINTN status; GPT_HEADER *header; GPT_ENTRY *entry; UINT64 entry_lba; UINTN entry_count, entry_size, i; Print(L"\nCurrent GPT partition table:\n"); // read GPT header status = read_sector(1, sector); if (status != 0) return status; // check signature header = (GPT_HEADER *)sector; if (header->signature != 0x5452415020494645ULL) { Print(L" No GPT partition table present!\n"); return 0; } if (header->spec_revision != 0x00010000UL) { Print(L" Warning: Unknown GPT spec revision 0x%08x\n", header->spec_revision); } if ((512 % header->entry_size) > 0 || header->entry_size > 512) { Print(L" Error: Invalid GPT entry size (misaligned or more than 512 bytes)\n"); return 0; } // read entries entry_lba = header->entry_lba; entry_size = header->entry_size; entry_count = header->entry_count; for (i = 0; i < entry_count; i++) { if (((i * entry_size) % 512) == 0) { status = read_sector(entry_lba, sector); if (status != 0) return status; entry_lba++; } entry = (GPT_ENTRY *)(sector + ((i * entry_size) % 512)); if (guids_are_equal(entry->type_guid, empty_guid)) continue; if (gpt_part_count == 0) { Print(L" # Start LBA End LBA Type\n"); } gpt_parts[gpt_part_count].index = i; gpt_parts[gpt_part_count].start_lba = entry->start_lba; gpt_parts[gpt_part_count].end_lba = entry->end_lba; gpt_parts[gpt_part_count].mbr_type = 0; copy_guid(gpt_parts[gpt_part_count].gpt_type, entry->type_guid); gpt_parts[gpt_part_count].gpt_parttype = gpt_parttype(gpt_parts[gpt_part_count].gpt_type); gpt_parts[gpt_part_count].active = FALSE; Print(L" %d %12lld %12lld %s\n", gpt_parts[gpt_part_count].index + 1, gpt_parts[gpt_part_count].start_lba, gpt_parts[gpt_part_count].end_lba, gpt_parts[gpt_part_count].gpt_parttype->name); gpt_part_count++; } if (gpt_part_count == 0) { Print(L" No partitions defined\n"); return 0; } return 0; } // // detect file system type // UINTN detect_mbrtype_fs(UINT64 partlba, UINTN *parttype, CHARN **fsname) { UINTN status; UINTN signature, score; UINTN sectsize, clustersize, reserved, fatcount, dirsize, sectcount, fatsize, clustercount; *fsname = STR("Unknown"); *parttype = 0; // READ sector 0 / offset 0K status = read_sector(partlba, sector); if (status != 0) return status; // detect XFS signature = *((UINT32 *)(sector)); if (signature == 0x42534658) { *parttype = 0x83; *fsname = STR("XFS"); return 0; } // detect FAT and NTFS sectsize = *((UINT16 *)(sector + 11)); clustersize = sector[13]; if (sectsize >= 512 && (sectsize & (sectsize - 1)) == 0 && clustersize > 0 && (clustersize & (clustersize - 1)) == 0) { // preconditions for both FAT and NTFS are now met if (CompareMem(sector + 3, "NTFS ", 8) == 0) { *parttype = 0x07; *fsname = STR("NTFS"); return 0; } score = 0; // boot jump if ((sector[0] == 0xEB && sector[2] == 0x90) || sector[0] == 0xE9) score++; // boot signature if (sector[510] == 0x55 && sector[511] == 0xAA) score++; // reserved sectors reserved = *((UINT16 *)(sector + 14)); if (reserved == 1 || reserved == 32) score++; // number of FATs fatcount = sector[16]; if (fatcount == 2) score++; // number of root dir entries dirsize = *((UINT16 *)(sector + 17)); // sector count (16-bit and 32-bit versions) sectcount = *((UINT16 *)(sector + 19)); if (sectcount == 0) sectcount = *((UINT32 *)(sector + 32)); // media byte if (sector[21] == 0xF0 || sector[21] >= 0xF8) score++; // FAT size in sectors fatsize = *((UINT16 *)(sector + 22)); if (fatsize == 0) fatsize = *((UINT32 *)(sector + 36)); // determine FAT type dirsize = ((dirsize * 32) + (sectsize - 1)) / sectsize; clustercount = sectcount - (reserved + (fatcount * fatsize) + dirsize); clustercount /= clustersize; if (score >= 3) { if (clustercount < 4085) { *parttype = 0x01; *fsname = STR("FAT12"); } else if (clustercount < 65525) { *parttype = 0x0e; *fsname = STR("FAT16"); } else { *parttype = 0x0c; *fsname = STR("FAT32"); } // TODO: check if 0e and 0c are okay to use, maybe we should use 06 and 0b instead... return 0; } } // READ sector 2 / offset 1K status = read_sector(partlba + 2, sector); if (status != 0) return status; // detect HFS+ signature = *((UINT16 *)(sector)); if (signature == 0x4442) { *parttype = 0xaf; if (*((UINT16 *)(sector + 0x7c)) == 0x2B48) *fsname = STR("HFS Extended (HFS+)"); else *fsname = STR("HFS Standard"); return 0; } else if (signature == 0x2B48) { *parttype = 0xaf; *fsname = STR("HFS Extended (HFS+)"); return 0; } // detect ext2/ext3/ext4 signature = *((UINT16 *)(sector + 56)); if (signature == 0xEF53) { *parttype = 0x83; if (*((UINT16 *)(sector + 96)) & 0x02C0 || *((UINT16 *)(sector + 100)) & 0x0078) *fsname = STR("ext4"); else if (*((UINT16 *)(sector + 92)) & 0x0004) *fsname = STR("ext3"); else *fsname = STR("ext2"); return 0; } // READ sector 128 / offset 64K status = read_sector(partlba + 128, sector); if (status != 0) return status; // detect btrfs if (CompareMem(sector + 64, "_BHRfS_M", 8) == 0) { *parttype = 0x83; *fsname = STR("btrfs"); return 0; } // detect ReiserFS if (CompareMem(sector + 52, "ReIsErFs", 8) == 0 || CompareMem(sector + 52, "ReIsEr2Fs", 9) == 0 || CompareMem(sector + 52, "ReIsEr3Fs", 9) == 0) { *parttype = 0x83; *fsname = STR("ReiserFS"); return 0; } // detect Reiser4 if (CompareMem(sector, "ReIsEr4", 7) == 0) { *parttype = 0x83; *fsname = STR("Reiser4"); return 0; } // READ sector 64 / offset 32K status = read_sector(partlba + 64, sector); if (status != 0) return status; // detect JFS if (CompareMem(sector, "JFS1", 4) == 0) { *parttype = 0x83; *fsname = STR("JFS"); return 0; } // READ sector 16 / offset 8K status = read_sector(partlba + 16, sector); if (status != 0) return status; // detect ReiserFS if (CompareMem(sector + 52, "ReIsErFs", 8) == 0 || CompareMem(sector + 52, "ReIsEr2Fs", 9) == 0 || CompareMem(sector + 52, "ReIsEr3Fs", 9) == 0) { *parttype = 0x83; *fsname = STR("ReiserFS"); return 0; } return 0; } refit-0.14/gptsync/Makefile.gnuefi0000644000175000017500000000041410532726143016512 0ustar julienjulien# # gptsync/Makefile # Build control file for the gptsync tool # LOCAL_CPPFLAGS = -I. -I../include -DEFI32 LOCAL_LDFLAGS = LOCAL_LIBS = OBJS = gptsync.o lib.o os_efi.o TARGET = gptsync.efi all: $(TARGET) include ../Make.common # EOF refit-0.14/gptsync/Makefile.unix0000644000175000017500000000332410532726143016223 0ustar julienjulien# # Makefile for gptsync on Unix platforms # RM = rm -f CC = gcc GPTSYNC_TARGET = gptsync GPTSYNC_OBJS = gptsync.unix.o lib.unix.o os_unix.gptsync.o SHOWPART_TARGET = showpart SHOWPART_OBJS = showpart.unix.o lib.unix.o os_unix.showpart.o CPPFLAGS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I../include CFLAGS = -Wall LDFLAGS = LIBS = # system-dependent additions system = $(shell uname) ifeq ($(system),Darwin) CC = gcc-4.0 # TODO: re-enable this once the code is no longer little-endian specific #CFLAGS += -arch i386 -arch ppc #LDFLAGS += -arch i386 -arch ppc ifeq (/Developer/SDKs/MacOSX10.4u.sdk,$(wildcard /Developer/SDKs/MacOSX10.4u.sdk)) CPPFLAGS += -isysroot /Developer/SDKs/MacOSX10.4u.sdk LDFLAGS += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk endif endif # real making all: $(GPTSYNC_TARGET) $(SHOWPART_TARGET) $(GPTSYNC_TARGET): $(GPTSYNC_OBJS) $(CC) $(LDFLAGS) -o $@ $(GPTSYNC_OBJS) $(LIBS) gptsync.unix.o: gptsync.c $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ os_unix.gptsync.o: os_unix.c $(CC) $(CPPFLAGS) -DPROGNAME=gptsync $(CFLAGS) -c $< -o $@ $(SHOWPART_TARGET): $(SHOWPART_OBJS) $(CC) $(LDFLAGS) -o $@ $(SHOWPART_OBJS) $(LIBS) showpart.unix.o: showpart.c $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ os_unix.showpart.o: os_unix.c $(CC) $(CPPFLAGS) -DPROGNAME=showpart -DNOREADONLYWARN $(CFLAGS) -c $< -o $@ lib.unix.o: lib.c $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ # additional dependencies gptsync.unix.o: gptsync.h ../include/syslinux_mbr.h os_unix.gptsync.o: gptsync.h showpart.unix.o: gptsync.h os_unix.showpart.o: gptsync.h lib.unix.o: gptsync.h # cleanup clean: $(RM) *.o *~ *% $(GPTSYNC_TARGET) $(SHOWPART_TARGET) distclean: clean $(RM) .depend # eof refit-0.14/gptsync/os_efi.c0000644000175000017500000001437310431155471015215 0ustar julienjulien/* * gptsync/os_efi.c * EFI glue for gptsync * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gptsync.h" // variables EFI_BLOCK_IO *BlockIO = NULL; // // sector I/O functions // UINTN read_sector(UINT64 lba, UINT8 *buffer) { EFI_STATUS Status; Status = BlockIO->ReadBlocks(BlockIO, BlockIO->Media->MediaId, lba, 512, buffer); if (EFI_ERROR(Status)) { // TODO: report error return 1; } return 0; } UINTN write_sector(UINT64 lba, UINT8 *buffer) { EFI_STATUS Status; Status = BlockIO->WriteBlocks(BlockIO, BlockIO->Media->MediaId, lba, 512, buffer); if (EFI_ERROR(Status)) { // TODO: report error return 1; } return 0; } // // Keyboard input // static BOOLEAN ReadAllKeyStrokes(VOID) { EFI_STATUS Status; BOOLEAN GotKeyStrokes; EFI_INPUT_KEY Key; GotKeyStrokes = FALSE; for (;;) { Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &Key); if (Status == EFI_SUCCESS) { GotKeyStrokes = TRUE; continue; } break; } return GotKeyStrokes; } static VOID PauseForKey(VOID) { UINTN Index; Print(L"\n* Hit any key to continue *"); if (ReadAllKeyStrokes()) { // remove buffered key strokes BS->Stall(5000000); // 5 seconds delay ReadAllKeyStrokes(); // empty the buffer again } BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &Index); ReadAllKeyStrokes(); // empty the buffer to protect the menu Print(L"\n"); } UINTN input_boolean(CHARN *prompt, BOOLEAN *bool_out) { EFI_STATUS Status; UINTN Index; EFI_INPUT_KEY Key; Print(prompt); if (ReadAllKeyStrokes()) { // remove buffered key strokes BS->Stall(500000); // 0.5 seconds delay ReadAllKeyStrokes(); // empty the buffer again } BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &Index); Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &Key); if (EFI_ERROR(Status)) return 1; if (Key.UnicodeChar == 'y' || Key.UnicodeChar == 'Y') { Print(L"Yes\n"); *bool_out = TRUE; } else { Print(L"No\n"); *bool_out = FALSE; } ReadAllKeyStrokes(); return 0; } // // main entry point // EFI_STATUS EFIAPI efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; UINTN SyncStatus; UINTN Index; UINTN HandleCount; EFI_HANDLE *HandleBuffer; EFI_HANDLE DeviceHandle; EFI_DEVICE_PATH *DevicePath, *NextDevicePath; BOOLEAN Usable; InitializeLib(ImageHandle, SystemTable); Status = LibLocateHandle(ByProtocol, &BlockIoProtocol, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { Status = EFI_NOT_FOUND; return Status; } for (Index = 0; Index < HandleCount; Index++) { DeviceHandle = HandleBuffer[Index]; // check device path DevicePath = DevicePathFromHandle(DeviceHandle); Usable = TRUE; while (DevicePath != NULL && !IsDevicePathEndType(DevicePath)) { NextDevicePath = NextDevicePathNode(DevicePath); if (DevicePathType(DevicePath) == MESSAGING_DEVICE_PATH && (DevicePathSubType(DevicePath) == MSG_USB_DP || DevicePathSubType(DevicePath) == MSG_USB_CLASS_DP || DevicePathSubType(DevicePath) == MSG_1394_DP || DevicePathSubType(DevicePath) == MSG_FIBRECHANNEL_DP)) Usable = FALSE; // USB/FireWire/FC device if (DevicePathType(DevicePath) == MEDIA_DEVICE_PATH) Usable = FALSE; // partition, El Torito entry, legacy BIOS device DevicePath = NextDevicePath; } if (!Usable) continue; Status = BS->HandleProtocol(DeviceHandle, &BlockIoProtocol, (VOID **) &BlockIO); if (EFI_ERROR(Status)) { // TODO: report error BlockIO = NULL; } else { if (BlockIO->Media->BlockSize != 512) BlockIO = NULL; // optical media else break; } } FreePool (HandleBuffer); if (BlockIO == NULL) { Print(L"Internal hard disk device not found!\n"); return EFI_NOT_FOUND; } SyncStatus = gptsync(); if (SyncStatus == 0) PauseForKey(); if (SyncStatus) return EFI_NOT_FOUND; return EFI_SUCCESS; } refit-0.14/gptsync/os_unix.c0000644000175000017500000001420710532726143015433 0ustar julienjulien/* * gptsync/os_unix.c * Unix OS glue for gptsync * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gptsync.h" #include #define STRINGIFY(s) #s #define STRINGIFY2(s) STRINGIFY(s) #define PROGNAME_S STRINGIFY2(PROGNAME) // variables static int fd; // // error functions // void error(const char *msg, ...) { va_list par; char buf[4096]; va_start(par, msg); vsnprintf(buf, 4096, msg, par); va_end(par); fprintf(stderr, PROGNAME_S ": %s\n", buf); } void errore(const char *msg, ...) { va_list par; char buf[4096]; va_start(par, msg); vsnprintf(buf, 4096, msg, par); va_end(par); fprintf(stderr, PROGNAME_S ": %s: %s\n", buf, strerror(errno)); } // // sector I/O functions // UINTN read_sector(UINT64 lba, UINT8 *buffer) { off_t offset; off_t result_seek; ssize_t result_read; offset = lba * 512; result_seek = lseek(fd, offset, SEEK_SET); if (result_seek != offset) { errore("Seek to %llu failed", offset); return 1; } result_read = read(fd, buffer, 512); if (result_read < 0) { errore("Data read failed at position %llu", offset); return 1; } if (result_read != 512) { errore("Data read fell short at position %llu", offset); return 1; } return 0; } UINTN write_sector(UINT64 lba, UINT8 *buffer) { off_t offset; off_t result_seek; ssize_t result_write; offset = lba * 512; result_seek = lseek(fd, offset, SEEK_SET); if (result_seek != offset) { errore("Seek to %llu failed", offset); return 1; } result_write = write(fd, buffer, 512); if (result_write < 0) { errore("Data write failed at position %llu", offset); return 1; } if (result_write != 512) { errore("Data write fell short at position %llu", offset); return 1; } return 0; } // // keyboard input // UINTN input_boolean(CHARN *prompt, BOOLEAN *bool_out) { int c; printf("%s", prompt); fflush(NULL); c = getchar(); if (c == EOF) return 1; if (c == 'y' || c == 'Y') { printf("Yes\n"); *bool_out = TRUE; } else { printf("No\n"); *bool_out = FALSE; } return 0; } // // EFI-style print function // void Print(wchar_t *format, ...) { va_list par; char formatbuf[256]; char buf[4096]; int i; for (i = 0; format[i]; i++) formatbuf[i] = (format[i] > 255) ? '?' : (char)(format[i] & 0xff); formatbuf[i] = 0; va_start(par, format); vsnprintf(buf, 4096, formatbuf, par); va_end(par); printf("%s", buf); } // // main entry point // int main(int argc, char *argv[]) { char *filename; struct stat sb; int filekind; UINT64 filesize; char *reason; int status; // argument check if (argc != 2) { fprintf(stderr, "Usage: " PROGNAME_S " \n"); return 1; } filename = argv[1]; // set input to unbuffered fflush(NULL); setvbuf(stdin, NULL, _IONBF, 0); // stat check if (stat(filename, &sb) < 0) { errore("Can't stat %.300s", filename); return 1; } filekind = 0; filesize = 0; reason = NULL; if (S_ISREG(sb.st_mode)) filesize = sb.st_size; else if (S_ISBLK(sb.st_mode)) filekind = 1; else if (S_ISCHR(sb.st_mode)) filekind = 2; else if (S_ISDIR(sb.st_mode)) reason = "Is a directory"; else if (S_ISFIFO(sb.st_mode)) reason = "Is a FIFO"; #ifdef S_ISSOCK else if (S_ISSOCK(sb.st_mode)) reason = "Is a socket"; #endif else reason = "Is an unknown kind of special file"; if (reason != NULL) { error("%.300s: %s", filename, reason); return 1; } // open file fd = open(filename, O_RDWR); if (fd < 0 && errno == EBUSY) { fd = open(filename, O_RDONLY); #ifndef NOREADONLYWARN if (fd >= 0) printf("Warning: %.300s opened read-only\n", filename); #endif } if (fd < 0) { errore("Can't open %.300s", filename); return 1; } // (try to) guard against TTY character devices if (filekind == 2) { if (isatty(fd)) { error("%.300s: Is a TTY device", filename); return 1; } } // run sync algorithm status = PROGNAME(); printf("\n"); // close file if (close(fd) != 0) { errore("Error while closing %.300s", filename); return 1; } return status; } refit-0.14/gptsync/showpart.c0000644000175000017500000001741211343673014015616 0ustar julienjulien/* * gptsync/showpart.c * Platform-independent code for analyzing hard disk partitioning * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gptsync.h" // // memory string search // static INTN FindMem(VOID *Buffer, UINTN BufferLength, VOID *SearchString, UINTN SearchStringLength) { UINT8 *BufferPtr; UINTN Offset; BufferPtr = Buffer; BufferLength -= SearchStringLength; for (Offset = 0; Offset < BufferLength; Offset++, BufferPtr++) { if (CompareMem(BufferPtr, SearchString, SearchStringLength) == 0) return (INTN)Offset; } return -1; } // // detect boot code // static UINTN detect_bootcode(UINT64 partlba, CHARN **bootcodename) { UINTN status; BOOLEAN bootable; // read MBR data status = read_sector(partlba, sector); if (status != 0) return status; // check bootable signature if (*((UINT16 *)(sector + 510)) == 0xaa55 && sector[0] != 0) bootable = TRUE; else bootable = FALSE; *bootcodename = NULL; // detect specific boot codes if (CompareMem(sector + 2, "LILO", 4) == 0 || CompareMem(sector + 6, "LILO", 4) == 0) { *bootcodename = STR("LILO"); } else if (CompareMem(sector + 3, "SYSLINUX", 8) == 0) { *bootcodename = STR("SYSLINUX"); } else if (FindMem(sector, 512, "ISOLINUX", 8) >= 0) { *bootcodename = STR("ISOLINUX"); } else if (FindMem(sector, 512, "Geom\0Hard Disk\0Read\0 Error", 26) >= 0) { *bootcodename = STR("GRUB"); } else if ((*((UINT32 *)(sector + 502)) == 0 && *((UINT32 *)(sector + 506)) == 50000 && *((UINT16 *)(sector + 510)) == 0xaa55) || FindMem(sector, 512, "Starting the BTX loader", 23) >= 0) { *bootcodename = STR("FreeBSD"); } else if (FindMem(sector, 512, "!Loading", 8) >= 0 || FindMem(sector, 512, "/cdboot\0/CDBOOT\0", 16) >= 0) { *bootcodename = STR("OpenBSD"); } else if (FindMem(sector, 512, "Not a bootxx image", 18) >= 0) { *bootcodename = STR("NetBSD"); } else if (FindMem(sector, 512, "NTLDR", 5) >= 0) { *bootcodename = STR("Windows NTLDR"); } else if (FindMem(sector, 512, "BOOTMGR", 7) >= 0) { *bootcodename = STR("Windows BOOTMGR (Vista)"); } else if (FindMem(sector, 512, "CPUBOOT SYS", 11) >= 0 || FindMem(sector, 512, "KERNEL SYS", 11) >= 0) { *bootcodename = STR("FreeDOS"); } else if (FindMem(sector, 512, "OS2LDR", 6) >= 0 || FindMem(sector, 512, "OS2BOOT", 7) >= 0) { *bootcodename = STR("eComStation"); } else if (FindMem(sector, 512, "Be Boot Loader", 14) >= 0) { *bootcodename = STR("BeOS"); } else if (FindMem(sector, 512, "yT Boot Loader", 14) >= 0) { *bootcodename = STR("ZETA"); } else if (FindMem(sector, 512, "\x04" "beos\x06" "system\x05" "zbeos", 18) >= 0) { *bootcodename = STR("Haiku"); } if (FindMem(sector, 512, "Non-system disk", 15) >= 0) // dummy FAT boot sector *bootcodename = STR("None (Non-system disk message)"); // TODO: Add a note if a specific code was detected, but the sector is not bootable? if (*bootcodename == NULL) { if (bootable) *bootcodename = STR("Unknown, but bootable"); else *bootcodename = STR("None"); } return 0; } // // check one partition // static UINTN analyze_part(UINT64 partlba) { UINTN status; UINTN i; CHARN *bootcodename; UINTN parttype; CHARN *fsname; if (partlba == 0) Print(L"\nMBR contents:\n"); else Print(L"\nPartition at LBA %lld:\n", partlba); // detect boot code status = detect_bootcode(partlba, &bootcodename); if (status) return status; Print(L" Boot Code: %s\n", bootcodename); if (partlba == 0) return 0; // short-circuit MBR analysis // detect file system status = detect_mbrtype_fs(partlba, &parttype, &fsname); if (status) return status; Print(L" File System: %s\n", fsname); // cross-reference with partition table for (i = 0; i < gpt_part_count; i++) { if (gpt_parts[i].start_lba == partlba) { Print(L" Listed in GPT as partition %d, type %s\n", i+1, gpt_parts[i].gpt_parttype->name); } } for (i = 0; i < mbr_part_count; i++) { if (mbr_parts[i].start_lba == partlba) { Print(L" Listed in MBR as partition %d, type %02x %s%s\n", i+1, mbr_parts[i].mbr_type, mbr_parttype_name(mbr_parts[i].mbr_type), mbr_parts[i].active ? STR(", active") : STR("")); } } return 0; } // // check all partitions // static UINTN analyze_parts(VOID) { UINTN i, k; UINTN status; BOOLEAN is_dupe; // check MBR (bootcode only) status = analyze_part(0); if (status) return status; // check partitions listed in GPT for (i = 0; i < gpt_part_count; i++) { status = analyze_part(gpt_parts[i].start_lba); if (status) return status; } // check partitions listed in MBR, but not in GPT for (i = 0; i < mbr_part_count; i++) { if (mbr_parts[i].start_lba == 1 && mbr_parts[i].mbr_type == 0xee) continue; // skip EFI Protective entry is_dupe = FALSE; for (k = 0; k < gpt_part_count; k++) if (gpt_parts[k].start_lba == mbr_parts[i].start_lba) is_dupe = TRUE; if (!is_dupe) { status = analyze_part(mbr_parts[i].start_lba); if (status) return status; } } return 0; } // // display algorithm entry point // UINTN showpart(VOID) { UINTN status = 0; UINTN status_gpt, status_mbr; // get full information from disk status_gpt = read_gpt(); status_mbr = read_mbr(); if (status_gpt != 0 || status_mbr != 0) return (status_gpt || status_mbr); // analyze all partitions status = analyze_parts(); if (status != 0) return status; return status; } refit-0.14/include/0000755000175000017500000000000011363100661013525 5ustar julienjulienrefit-0.14/include/efiConsoleControl.h0000644000175000017500000000657010424203526017336 0ustar julienjulien/*++ Copyright (c) 2004, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: ConsoleControl.h Abstract: Abstraction of a Text mode or UGA screen --*/ #ifndef __CONSOLE_CONTROL_H__ #define __CONSOLE_CONTROL_H__ #define EFI_CONSOLE_CONTROL_PROTOCOL_GUID \ { 0xf42f7782, 0x12e, 0x4c12, { 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21 } } struct _EFI_CONSOLE_CONTROL_PROTOCOL; typedef enum { EfiConsoleControlScreenText, EfiConsoleControlScreenGraphics, EfiConsoleControlScreenMaxValue } EFI_CONSOLE_CONTROL_SCREEN_MODE; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode, OUT BOOLEAN *UgaExists, OPTIONAL OUT BOOLEAN *StdInLocked OPTIONAL ) /*++ Routine Description: Return the current video mode information. Also returns info about existence of UGA Draw devices in system, and if the Std In device is locked. All the arguments are optional and only returned if a non NULL pointer is passed in. Arguments: This - Protocol instance pointer. Mode - Are we in text of grahics mode. UgaExists - TRUE if UGA Spliter has found a UGA device StdInLocked - TRUE if StdIn device is keyboard locked Returns: EFI_SUCCESS - Mode information returned. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, OUT EFI_CONSOLE_CONTROL_SCREEN_MODE Mode ) /*++ Routine Description: Set the current mode to either text or graphics. Graphics is for Quiet Boot. Arguments: This - Protocol instance pointer. Mode - Mode to set the Returns: EFI_SUCCESS - Mode information returned. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, IN CHAR16 *Password ) /*++ Routine Description: Lock Std In devices until Password is typed. Arguments: This - Protocol instance pointer. Password - Password needed to unlock screen. NULL means unlock keyboard Returns: EFI_SUCCESS - Mode information returned. EFI_DEVICE_ERROR - Std In not locked --*/ ; typedef struct _EFI_CONSOLE_CONTROL_PROTOCOL { EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE GetMode; EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE SetMode; EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN LockStdIn; } EFI_CONSOLE_CONTROL_PROTOCOL; //extern EFI_GUID gEfiConsoleControlProtocolGuid; #endif refit-0.14/include/egemb_back_selected_small.h0000644000175000017500000002220610425126743021006 0ustar julienjulienstatic const UINT8 egemb_back_selected_small_data[1503] = { 0x83, 0xbf, 0x02, 0xc8, 0xd2, 0xd6, 0xab, 0xdc, 0x02, 0xd6, 0xd2, 0xc8, 0x87, 0xbf, 0x01, 0xc3, 0xd6, 0x80, 0xdc, 0x04, 0xdb, 0xd7, 0xd5, 0xd3, 0xd1, 0xa1, 0xd0, 0x04, 0xd1, 0xd3, 0xd5, 0xd7, 0xdb, 0x80, 0xdc, 0x01, 0xd6, 0xc3, 0x84, 0xbf, 0x0b, 0xcc, 0xdb, 0xdc, 0xdc, 0xd5, 0xcd, 0xc7, 0xc3, 0xbf, 0xbe, 0xbd, 0xbc, 0x9f, 0xbb, 0x0b, 0xbc, 0xbd, 0xbe, 0xbf, 0xc3, 0xc7, 0xcd, 0xd5, 0xdc, 0xdc, 0xdb, 0xcc, 0x82, 0xbf, 0x0c, 0xcf, 0xdc, 0xdc, 0xd7, 0xcc, 0xc3, 0xba, 0xb4, 0xb0, 0xad, 0xac, 0xaa, 0xaa, 0x9f, 0xa9, 0x0c, 0xaa, 0xaa, 0xac, 0xad, 0xb0, 0xb4, 0xba, 0xc3, 0xcc, 0xd7, 0xdc, 0xdc, 0xcf, 0x80, 0xbf, 0x0d, 0xc9, 0xdc, 0xdc, 0xd5, 0xc8, 0xbc, 0xb2, 0xaa, 0xa3, 0x9f, 0x9d, 0x9c, 0x9b, 0x9a, 0x9f, 0x99, 0x1c, 0x9a, 0x9b, 0x9c, 0x9d, 0x9f, 0xa3, 0xaa, 0xb2, 0xbc, 0xc8, 0xd5, 0xdc, 0xdc, 0xc9, 0xbf, 0xc0, 0xd9, 0xdc, 0xd7, 0xc8, 0xb9, 0xad, 0xa3, 0x9b, 0x96, 0x92, 0x90, 0x8e, 0x8e, 0xa1, 0x8d, 0x1b, 0x8e, 0x8e, 0x90, 0x92, 0x96, 0x9b, 0xa3, 0xad, 0xb9, 0xc8, 0xd7, 0xdc, 0xd8, 0xc0, 0xc9, 0xdc, 0xdc, 0xcb, 0xbb, 0xad, 0xa1, 0x97, 0x8f, 0x8a, 0x87, 0x85, 0x84, 0x83, 0xa1, 0x82, 0x1a, 0x83, 0x84, 0x85, 0x87, 0x8a, 0x8f, 0x97, 0xa1, 0xad, 0xbb, 0xcb, 0xdc, 0xdc, 0xc9, 0xd2, 0xdc, 0xd4, 0xc2, 0xb2, 0xa3, 0x97, 0x8d, 0x86, 0x81, 0x7e, 0x7c, 0x7c, 0xa3, 0x7b, 0x18, 0x7c, 0x7c, 0x7e, 0x81, 0x86, 0x8d, 0x97, 0xa3, 0xb2, 0xc2, 0xd4, 0xdc, 0xd2, 0xd8, 0xdc, 0xcc, 0xba, 0xa9, 0x9b, 0x8f, 0x86, 0x7f, 0x7a, 0x78, 0x77, 0x80, 0x76, 0x9f, 0x75, 0x80, 0x76, 0x17, 0x77, 0x78, 0x7a, 0x7f, 0x86, 0x8f, 0x9b, 0xa9, 0xba, 0xcc, 0xdc, 0xd8, 0xda, 0xdb, 0xc6, 0xb4, 0xa3, 0x95, 0x8a, 0x81, 0x7a, 0x76, 0x74, 0x74, 0xa5, 0x73, 0x16, 0x74, 0x74, 0x76, 0x7a, 0x80, 0x8a, 0x95, 0xa3, 0xb4, 0xc6, 0xdb, 0xdb, 0xdc, 0xd7, 0xc3, 0xaf, 0x9f, 0x91, 0x86, 0x7d, 0x78, 0x74, 0x74, 0xa7, 0x73, 0x14, 0x74, 0x74, 0x78, 0x7d, 0x86, 0x91, 0x9f, 0xaf, 0xc2, 0xd7, 0xdc, 0xdc, 0xd4, 0xbf, 0xad, 0x9d, 0x90, 0x85, 0x7c, 0x77, 0x74, 0xa9, 0x73, 0x12, 0x74, 0x77, 0x7c, 0x85, 0x90, 0x9d, 0xad, 0xbf, 0xd4, 0xdc, 0xdc, 0xd3, 0xbe, 0xac, 0x9b, 0x8e, 0x83, 0x7c, 0x76, 0xab, 0x73, 0x11, 0x76, 0x7c, 0x83, 0x8e, 0x9b, 0xab, 0xbe, 0xd3, 0xdc, 0xdc, 0xd1, 0xbc, 0xaa, 0x9b, 0x8d, 0x83, 0x7b, 0x76, 0xab, 0x73, 0x11, 0x76, 0x7b, 0x83, 0x8d, 0x9b, 0xaa, 0xbc, 0xd1, 0xdc, 0xdc, 0xd0, 0xbc, 0xaa, 0x9a, 0x8d, 0x82, 0x7b, 0x76, 0xab, 0x73, 0x11, 0x76, 0x7b, 0x82, 0x8d, 0x9a, 0xaa, 0xbc, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbb, 0xa9, 0x99, 0x8d, 0x82, 0x7b, 0x75, 0xab, 0x73, 0x11, 0x75, 0x7b, 0x82, 0x8d, 0x99, 0xa9, 0xbb, 0xd0, 0xdc, 0xdc, 0xd0, 0xbc, 0xaa, 0x9a, 0x8d, 0x82, 0x7b, 0x76, 0xab, 0x73, 0x11, 0x76, 0x7b, 0x82, 0x8d, 0x9a, 0xaa, 0xbc, 0xd0, 0xdc, 0xdc, 0xd1, 0xbc, 0xaa, 0x9b, 0x8d, 0x83, 0x7b, 0x76, 0xab, 0x73, 0x11, 0x76, 0x7b, 0x83, 0x8d, 0x9b, 0xaa, 0xbc, 0xd1, 0xdc, 0xdc, 0xd3, 0xbe, 0xac, 0x9b, 0x8e, 0x83, 0x7c, 0x76, 0xab, 0x73, 0x12, 0x76, 0x7c, 0x83, 0x8e, 0x9b, 0xab, 0xbe, 0xd3, 0xdc, 0xdc, 0xd4, 0xbf, 0xad, 0x9d, 0x90, 0x85, 0x7c, 0x77, 0x74, 0xa9, 0x73, 0x14, 0x74, 0x77, 0x7c, 0x85, 0x90, 0x9d, 0xad, 0xbf, 0xd4, 0xdc, 0xdc, 0xd7, 0xc2, 0xaf, 0x9f, 0x91, 0x86, 0x7d, 0x78, 0x74, 0x74, 0xa7, 0x73, 0x16, 0x74, 0x74, 0x78, 0x7d, 0x86, 0x91, 0x9f, 0xaf, 0xc2, 0xd7, 0xdc, 0xda, 0xdb, 0xc6, 0xb4, 0xa3, 0x95, 0x8a, 0x80, 0x7a, 0x76, 0x74, 0x74, 0xa5, 0x73, 0x17, 0x74, 0x74, 0x76, 0x7a, 0x80, 0x8a, 0x95, 0xa3, 0xb4, 0xc6, 0xdb, 0xdb, 0xd8, 0xdc, 0xcc, 0xba, 0xa9, 0x9b, 0x8f, 0x86, 0x7f, 0x7a, 0x78, 0x77, 0x80, 0x76, 0x9f, 0x75, 0x80, 0x76, 0x18, 0x77, 0x78, 0x7a, 0x7f, 0x86, 0x8f, 0x9b, 0xa9, 0xba, 0xcc, 0xdc, 0xd8, 0xd2, 0xdc, 0xd4, 0xc2, 0xb1, 0xa3, 0x97, 0x8d, 0x86, 0x81, 0x7e, 0x7c, 0x7c, 0xa3, 0x7b, 0x1a, 0x7c, 0x7c, 0x7e, 0x81, 0x86, 0x8d, 0x97, 0xa3, 0xb1, 0xc2, 0xd4, 0xdc, 0xd2, 0xc9, 0xdc, 0xdc, 0xcb, 0xbb, 0xad, 0xa1, 0x97, 0x8f, 0x8a, 0x87, 0x85, 0x84, 0x83, 0xa1, 0x82, 0x1b, 0x83, 0x84, 0x85, 0x86, 0x8a, 0x8f, 0x97, 0xa1, 0xad, 0xbb, 0xcb, 0xdc, 0xdc, 0xc9, 0xc0, 0xd8, 0xdc, 0xd6, 0xc8, 0xb9, 0xad, 0xa3, 0x9b, 0x95, 0x92, 0x90, 0x8e, 0x8e, 0xa1, 0x8d, 0x1c, 0x8e, 0x8e, 0x90, 0x92, 0x95, 0x9b, 0xa3, 0xad, 0xb9, 0xc8, 0xd6, 0xdc, 0xd8, 0xc0, 0xbf, 0xc9, 0xdc, 0xdc, 0xd5, 0xc8, 0xbb, 0xb2, 0xa9, 0xa3, 0x9f, 0x9d, 0x9c, 0x9b, 0x9a, 0x9f, 0x99, 0x0d, 0x9a, 0x9b, 0x9c, 0x9d, 0x9f, 0xa3, 0xa9, 0xb2, 0xbb, 0xc8, 0xd5, 0xdc, 0xdc, 0xc9, 0x80, 0xbf, 0x0c, 0xcf, 0xdc, 0xdc, 0xd7, 0xcc, 0xc2, 0xba, 0xb4, 0xb0, 0xad, 0xac, 0xaa, 0xaa, 0x9f, 0xa9, 0x0c, 0xaa, 0xaa, 0xac, 0xad, 0xb0, 0xb4, 0xba, 0xc2, 0xcc, 0xd7, 0xdc, 0xdc, 0xcf, 0x82, 0xbf, 0x0b, 0xcd, 0xdb, 0xdc, 0xdc, 0xd5, 0xcd, 0xc7, 0xc3, 0xbf, 0xbe, 0xbc, 0xbc, 0x9f, 0xbb, 0x0b, 0xbc, 0xbc, 0xbe, 0xbf, 0xc3, 0xc7, 0xcc, 0xd5, 0xdc, 0xdc, 0xdb, 0xcd, 0x84, 0xbf, 0x01, 0xc3, 0xd6, 0x80, 0xdc, 0x04, 0xdb, 0xd7, 0xd5, 0xd3, 0xd1, 0xa1, 0xd0, 0x04, 0xd1, 0xd3, 0xd5, 0xd7, 0xdb, 0x80, 0xdc, 0x01, 0xd6, 0xc4, 0x87, 0xbf, 0x02, 0xc9, 0xd2, 0xd6, 0xab, 0xdc, 0x02, 0xd6, 0xd2, 0xc9, 0x83, 0xbf, }; static EG_EMBEDDED_IMAGE egemb_back_selected_small = { 64, 64, EG_EIPIXELMODE_GRAY, EG_EICOMPMODE_RLE, egemb_back_selected_small_data, 1503 }; refit-0.14/include/egemb_refit_banner.h0000644000175000017500000006130710425126743017511 0ustar julienjulienstatic const UINT8 egemb_refit_banner_data[4126] = { 0x98, 0xbf, 0x03, 0xbe, 0xb3, 0xa7, 0xb8, 0xf7, 0xbf, 0x05, 0xbc, 0xb1, 0xa4, 0xb1, 0xab, 0xb3, 0xf5, 0xbf, 0x07, 0xbb, 0xac, 0xa2, 0xb4, 0xdb, 0xfa, 0xb0, 0xb8, 0xf3, 0xbf, 0x09, 0xba, 0xab, 0xa2, 0xbe, 0xe7, 0xfe, 0xff, 0xf7, 0xa2, 0xba, 0xf1, 0xbf, 0x04, 0xb9, 0xaa, 0xa4, 0xc2, 0xeb, 0x81, 0xff, 0x04, 0xf2, 0xb2, 0xa5, 0xa9, 0xb6, 0xee, 0xbf, 0x03, 0xbc, 0xa0, 0xc3, 0xef, 0x84, 0xff, 0x05, 0xfd, 0xf0, 0xd2, 0xac, 0xa7, 0xba, 0x9e, 0xbf, 0x00, 0x99, 0x88, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x66, 0x88, 0x00, 0x03, 0x99, 0xbf, 0xbf, 0x59, 0x81, 0x00, 0x00, 0x73, 0xa6, 0xbf, 0x03, 0xbd, 0xa9, 0xbb, 0xf9, 0x87, 0xff, 0x03, 0xf8, 0xcc, 0xa2, 0xb6, 0x9d, 0xbf, 0x00, 0x7f, 0x88, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x4c, 0x87, 0x00, 0x00, 0x26, 0x80, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x01, 0x0d, 0xb2, 0x83, 0xbf, 0x02, 0x8c, 0x33, 0x99, 0x9f, 0xbf, 0x02, 0xab, 0xb1, 0xf2, 0x88, 0xff, 0x02, 0xe0, 0xa3, 0xb5, 0x9c, 0xbf, 0x00, 0x59, 0x81, 0x00, 0x00, 0xb2, 0x83, 0xbf, 0x00, 0xb2, 0x80, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0xa6, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x40, 0x81, 0xbf, 0x04, 0xa6, 0x66, 0x19, 0x00, 0x0d, 0xa1, 0xbf, 0x02, 0xad, 0xad, 0xef, 0x80, 0xff, 0x01, 0xfe, 0xfa, 0x83, 0xff, 0x02, 0xe2, 0xa2, 0xb9, 0x9b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x81, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x59, 0xa2, 0xbf, 0x09, 0xb0, 0xa7, 0xea, 0xff, 0xff, 0xfc, 0xb3, 0xb8, 0xde, 0xfe, 0x81, 0xff, 0x02, 0xd3, 0xa3, 0xbd, 0x9a, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0xa3, 0xbf, 0x09, 0xb1, 0xa5, 0xec, 0xff, 0xf8, 0xa5, 0xb2, 0xa2, 0xbb, 0xf9, 0x80, 0xff, 0x02, 0xfe, 0xb2, 0xb2, 0x99, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x7f, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x99, 0x98, 0xbf, 0x00, 0xbb, 0x81, 0xb0, 0x01, 0xb2, 0xbb, 0x82, 0xbf, 0x09, 0xac, 0xac, 0xe8, 0xf2, 0xa8, 0xbf, 0xbc, 0xa6, 0xba, 0xfa, 0x80, 0xff, 0x02, 0xd9, 0xa4, 0xbe, 0x8c, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x08, 0x73, 0xbf, 0x66, 0x00, 0x00, 0x73, 0xbf, 0xbf, 0x7f, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x40, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x80, 0xbf, 0x85, 0x00, 0x00, 0x4c, 0x96, 0xbf, 0x06, 0xa9, 0xb4, 0xc5, 0xc4, 0xc5, 0xad, 0xaf, 0x83, 0xbf, 0x03, 0xae, 0xa4, 0xc0, 0xaa, 0x80, 0xbf, 0x01, 0xa7, 0xc3, 0x80, 0xff, 0x02, 0xfa, 0xaa, 0xb8, 0x8c, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x04, 0xa6, 0x33, 0x00, 0x00, 0x0d, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x03, 0x7f, 0xbf, 0xbf, 0x99, 0x85, 0x00, 0x00, 0x66, 0x96, 0xbf, 0x01, 0x9f, 0xdf, 0x80, 0xff, 0x01, 0xb7, 0xb5, 0x84, 0xbf, 0x02, 0xb6, 0xa0, 0xaf, 0x80, 0xbf, 0x02, 0xbc, 0xa1, 0xe5, 0x80, 0xff, 0x01, 0xc7, 0xac, 0x8c, 0xbf, 0x04, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x80, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x40, 0x87, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0xb2, 0x87, 0x00, 0x04, 0x0d, 0xb2, 0xbf, 0xbf, 0x99, 0x81, 0x00, 0x00, 0xb2, 0x81, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x99, 0xbf, 0x06, 0xa0, 0xe5, 0xff, 0xff, 0xfc, 0xab, 0xba, 0x85, 0xbf, 0x01, 0xbd, 0xbe, 0x81, 0xbf, 0x01, 0xaf, 0xc1, 0x80, 0xff, 0x01, 0xdf, 0xa6, 0x8b, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x19, 0x81, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x19, 0x87, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x8c, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x7f, 0x99, 0xbf, 0x06, 0xa0, 0xe4, 0xff, 0xff, 0xfb, 0xab, 0xb9, 0x8b, 0xbf, 0x06, 0xba, 0xab, 0xfc, 0xff, 0xff, 0xee, 0xa5, 0x8b, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x07, 0x33, 0xa6, 0xbf, 0xb2, 0x8c, 0xbf, 0xbf, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x82, 0xbf, 0x01, 0xb2, 0xb2, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0x99, 0x7f, 0x80, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x40, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0xb2, 0x99, 0xbf, 0x06, 0xa1, 0xde, 0xff, 0xff, 0xfe, 0xb4, 0xb5, 0x8b, 0xbf, 0x06, 0xbe, 0xa5, 0xf4, 0xff, 0xff, 0xf7, 0xa6, 0x8b, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x84, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x88, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x26, 0x9a, 0xbf, 0x01, 0xa7, 0xd1, 0x80, 0xff, 0x01, 0xc9, 0xaa, 0x8b, 0xbf, 0x06, 0xbd, 0xa6, 0xf0, 0xff, 0xff, 0xfa, 0xa5, 0x8b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x73, 0x84, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x33, 0x88, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x4c, 0x9a, 0xbf, 0x01, 0xb2, 0xbc, 0x80, 0xff, 0x02, 0xe9, 0xa1, 0xbd, 0x80, 0xbf, 0x02, 0xba, 0xac, 0xb9, 0x84, 0xbf, 0x06, 0xbd, 0xa7, 0xfa, 0xff, 0xff, 0xf9, 0xa5, 0x8b, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0xb2, 0x84, 0xbf, 0x00, 0x33, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x66, 0x9a, 0xbf, 0x02, 0xbb, 0xa5, 0xf5, 0x80, 0xff, 0x01, 0xbf, 0xa9, 0x80, 0xbf, 0x03, 0xb2, 0xa6, 0xa3, 0xb5, 0x83, 0xbf, 0x06, 0xb8, 0xa7, 0xe2, 0xe4, 0xe4, 0xd7, 0xa4, 0x8a, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x26, 0x85, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x99, 0x9b, 0xbf, 0x01, 0xa7, 0xd3, 0x80, 0xff, 0x09, 0xf4, 0xab, 0xad, 0xbf, 0xbf, 0xab, 0xce, 0xd8, 0x9e, 0xb2, 0x82, 0xbf, 0x01, 0xba, 0xa8, 0x81, 0xa6, 0x00, 0xaf, 0x8a, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x84, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x33, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x59, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x0d, 0x9c, 0xbf, 0x02, 0xb4, 0xb0, 0xfe, 0x80, 0xff, 0x09, 0xe7, 0xa2, 0xac, 0xbc, 0xa7, 0xd8, 0xff, 0xda, 0x9e, 0xb5, 0x95, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0x84, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x33, 0x9c, 0xbf, 0x02, 0xbe, 0xa3, 0xd5, 0x81, 0xff, 0x09, 0xeb, 0xb9, 0xa2, 0x9c, 0xe3, 0xff, 0xff, 0xdc, 0xa1, 0xb4, 0x94, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x99, 0x84, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x4c, 0x9d, 0xbf, 0x02, 0xb9, 0xa3, 0xe9, 0x82, 0xff, 0x02, 0xea, 0xd5, 0xf7, 0x80, 0xff, 0x02, 0xe1, 0xa2, 0xb3, 0x92, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x0d, 0x84, 0xbf, 0x01, 0xb2, 0x0d, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x40, 0x81, 0x00, 0x00, 0xb2, 0x82, 0xbf, 0x06, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x99, 0xa6, 0x9b, 0xbf, 0x02, 0xb2, 0xa7, 0xeb, 0x88, 0xff, 0x02, 0xe6, 0xa5, 0xb0, 0x91, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x33, 0x84, 0xbf, 0x00, 0x73, 0x88, 0x00, 0x00, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x81, 0x00, 0x00, 0xb2, 0x85, 0xbf, 0x01, 0xb2, 0x0d, 0x80, 0x00, 0x00, 0x19, 0x83, 0xbf, 0x01, 0xb2, 0x59, 0x80, 0x00, 0x00, 0x40, 0x9d, 0xbf, 0x02, 0xb1, 0xa6, 0xdf, 0x88, 0xff, 0x03, 0xea, 0xaa, 0xb0, 0xbe, 0xec, 0xbf, 0x03, 0xb5, 0xa2, 0xbf, 0xea, 0x87, 0xff, 0x02, 0xde, 0x9e, 0xb6, 0xed, 0xbf, 0x05, 0xbc, 0xad, 0xa4, 0xb6, 0xcc, 0xef, 0x82, 0xff, 0x04, 0xed, 0xc4, 0xa7, 0xac, 0xbb, 0xef, 0xbf, 0x03, 0xbd, 0xb3, 0x9d, 0xdb, 0x80, 0xff, 0x04, 0xe9, 0xc1, 0xa3, 0xaa, 0xb9, 0xf3, 0xbf, 0x07, 0xa6, 0xef, 0xfd, 0xdd, 0xbb, 0xa3, 0xac, 0xba, 0xf4, 0xbf, 0x06, 0xbb, 0xa4, 0xd3, 0xb2, 0xa2, 0xae, 0xbc, 0xf6, 0xbf, 0x04, 0xba, 0xa1, 0xa4, 0xb2, 0xbe, 0xe3, 0xbf, 0x98, 0xbf, 0x03, 0xbe, 0x95, 0x66, 0xa3, 0xf7, 0xbf, 0x05, 0xb4, 0x8c, 0x58, 0x54, 0x4c, 0x90, 0xf5, 0xbf, 0x07, 0xb1, 0x7c, 0x4c, 0x5d, 0xa2, 0xd6, 0x58, 0xa5, 0xf3, 0xbf, 0x09, 0xae, 0x77, 0x4b, 0x72, 0xb9, 0xe1, 0xf5, 0xd0, 0x45, 0xae, 0xf1, 0xbf, 0x0d, 0xab, 0x73, 0x4c, 0x76, 0xba, 0xe0, 0xdb, 0xca, 0xd8, 0xc4, 0x5b, 0x4f, 0x6c, 0x9e, 0xee, 0xbf, 0x10, 0xb4, 0x45, 0x75, 0xbc, 0xd9, 0xd8, 0xcf, 0xc5, 0xc0, 0xd1, 0xd9, 0xd7, 0xc0, 0x8d, 0x51, 0x67, 0xae, 0x9e, 0xbf, 0x00, 0x99, 0x88, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x66, 0x88, 0x00, 0x03, 0x99, 0xbf, 0xbf, 0x59, 0x81, 0x00, 0x00, 0x73, 0xa6, 0xbf, 0x11, 0xbb, 0x70, 0x68, 0xca, 0xd7, 0xcf, 0xcd, 0xc6, 0xc0, 0xbf, 0xbd, 0xc2, 0xcf, 0xdb, 0xc8, 0x7f, 0x4c, 0x9c, 0x9d, 0xbf, 0x00, 0x7f, 0x88, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x4c, 0x87, 0x00, 0x00, 0x26, 0x80, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x01, 0x0d, 0xb2, 0x83, 0xbf, 0x02, 0x8c, 0x33, 0x99, 0x9f, 0xbf, 0x10, 0x77, 0x5a, 0xbf, 0xd8, 0xcb, 0xc4, 0xbd, 0xb9, 0xb3, 0xa8, 0xa2, 0xac, 0xc4, 0xd1, 0x97, 0x48, 0x9a, 0x9c, 0xbf, 0x00, 0x59, 0x81, 0x00, 0x00, 0xb2, 0x83, 0xbf, 0x00, 0xb2, 0x80, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0xa6, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x40, 0x81, 0xbf, 0x04, 0xa6, 0x66, 0x19, 0x00, 0x0d, 0xa1, 0xbf, 0x10, 0x7e, 0x52, 0xb9, 0xd4, 0xc2, 0xbb, 0xbd, 0xba, 0xb9, 0xb0, 0x99, 0x93, 0xae, 0xc7, 0x94, 0x48, 0xa9, 0x9b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x81, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x59, 0xa2, 0xbf, 0x10, 0x87, 0x4d, 0xb1, 0xce, 0xbb, 0xbc, 0x5c, 0x5f, 0x90, 0xb1, 0x9c, 0x87, 0xa2, 0xba, 0x7a, 0x5a, 0xbb, 0x9a, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0xa3, 0xbf, 0x0f, 0x89, 0x48, 0xb3, 0xd1, 0xb8, 0x51, 0x94, 0x56, 0x61, 0xac, 0x9a, 0x82, 0xa3, 0xa8, 0x50, 0x92, 0x99, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x7f, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x99, 0x98, 0xbf, 0x01, 0xaf, 0x8c, 0x80, 0x88, 0x01, 0x8c, 0xb0, 0x82, 0xbf, 0x0f, 0x7a, 0x52, 0xae, 0xb5, 0x5c, 0xbf, 0xb7, 0x6a, 0x5f, 0xa8, 0x8d, 0x8b, 0xa4, 0x75, 0x5e, 0xbe, 0x8c, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x08, 0x73, 0xbf, 0x66, 0x00, 0x00, 0x73, 0xbf, 0xbf, 0x7f, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x40, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x80, 0xbf, 0x85, 0x00, 0x00, 0x4c, 0x96, 0xbf, 0x06, 0x6b, 0x5c, 0x80, 0x7e, 0x7d, 0x53, 0x85, 0x83, 0xbf, 0x03, 0x82, 0x47, 0x6e, 0x6b, 0x80, 0xbf, 0x07, 0x6a, 0x68, 0xa7, 0x86, 0x8f, 0x8d, 0x48, 0xa5, 0x8c, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x04, 0xa6, 0x33, 0x00, 0x00, 0x0d, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x03, 0x7f, 0xbf, 0xbf, 0x99, 0x85, 0x00, 0x00, 0x66, 0x96, 0xbf, 0x06, 0x4a, 0x7a, 0xcb, 0xe8, 0xf3, 0x65, 0x99, 0x84, 0xbf, 0x02, 0x9d, 0x4b, 0x83, 0x80, 0xbf, 0x07, 0xb7, 0x4f, 0x8e, 0x99, 0x80, 0x89, 0x5c, 0x7d, 0x8c, 0xbf, 0x04, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x80, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x40, 0x87, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0xb2, 0x87, 0x00, 0x04, 0x0d, 0xb2, 0xbf, 0xbf, 0x99, 0x81, 0x00, 0x00, 0xb2, 0x81, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x99, 0xbf, 0x06, 0x45, 0x79, 0xa9, 0xcb, 0xe3, 0x53, 0xaa, 0x85, 0xbf, 0x01, 0xb8, 0xbc, 0x81, 0xbf, 0x06, 0x86, 0x65, 0xa4, 0x82, 0x83, 0x6a, 0x62, 0x8b, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x19, 0x81, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x19, 0x87, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x8c, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x7f, 0x99, 0xbf, 0x06, 0x45, 0x7c, 0xa7, 0xc9, 0xda, 0x51, 0xa9, 0x8b, 0xbf, 0x06, 0xae, 0x4f, 0xa2, 0x87, 0x81, 0x75, 0x52, 0x8b, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x07, 0x33, 0xa6, 0xbf, 0xb2, 0x8c, 0xbf, 0xbf, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x82, 0xbf, 0x01, 0xb2, 0xb2, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0x99, 0x7f, 0x80, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x40, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0xb2, 0x99, 0xbf, 0x06, 0x4e, 0x76, 0xa4, 0xc1, 0xd8, 0x5a, 0x99, 0x8b, 0xbf, 0x06, 0xbb, 0x54, 0x9c, 0x8c, 0x7f, 0x7b, 0x49, 0x8b, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x84, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x88, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x26, 0x9a, 0xbf, 0x06, 0x6d, 0x6b, 0xa0, 0xb7, 0xd7, 0x75, 0x78, 0x8b, 0xbf, 0x06, 0xbb, 0x57, 0x99, 0x8e, 0x7f, 0x7c, 0x48, 0x8b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x73, 0x84, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x33, 0x88, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x4c, 0x9a, 0xbf, 0x07, 0x8f, 0x58, 0x98, 0xaa, 0xce, 0xa0, 0x4b, 0xb7, 0x80, 0xbf, 0x02, 0xae, 0x76, 0xab, 0x84, 0xbf, 0x06, 0xba, 0x53, 0xa5, 0x8e, 0x83, 0x7c, 0x4a, 0x8b, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0xb2, 0x84, 0xbf, 0x00, 0x33, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x66, 0x9a, 0xbf, 0x07, 0xb0, 0x4a, 0x8c, 0x9e, 0xbb, 0xc3, 0x61, 0x72, 0x80, 0xbf, 0x03, 0x8c, 0x45, 0x4f, 0x9b, 0x83, 0xbf, 0x06, 0xa7, 0x48, 0x88, 0x72, 0x6e, 0x65, 0x4f, 0x8a, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x26, 0x85, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x99, 0x9b, 0xbf, 0x0e, 0x67, 0x6f, 0x9b, 0xa5, 0xc0, 0xa9, 0x49, 0x7f, 0xbf, 0xbf, 0x79, 0x7e, 0x8f, 0x3c, 0x8d, 0x82, 0xbf, 0x01, 0xae, 0x66, 0x81, 0x60, 0x00, 0x83, 0x8a, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x84, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x33, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x59, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x0d, 0x9c, 0xbf, 0x0f, 0x98, 0x4f, 0x96, 0x96, 0xad, 0xc1, 0x93, 0x3f, 0x79, 0xb6, 0x68, 0x94, 0xf6, 0x91, 0x3b, 0x9b, 0x95, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0x84, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x33, 0x9c, 0xbf, 0x10, 0xbc, 0x5b, 0x71, 0x99, 0x96, 0xac, 0xbc, 0x9c, 0x5b, 0x4c, 0x3e, 0x9f, 0xf1, 0xf3, 0x9c, 0x42, 0x98, 0x94, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x99, 0x84, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x4c, 0x9d, 0xbf, 0x10, 0xa6, 0x47, 0x84, 0x97, 0x90, 0xa3, 0xba, 0xbd, 0x9f, 0x80, 0xbc, 0xcb, 0xbd, 0xee, 0xa9, 0x42, 0x91, 0x92, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x0d, 0x84, 0xbf, 0x01, 0xb2, 0x0d, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x40, 0x81, 0x00, 0x00, 0xb2, 0x82, 0xbf, 0x06, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x99, 0xa6, 0x9b, 0xbf, 0x10, 0x90, 0x46, 0x87, 0x98, 0x8c, 0x94, 0xa7, 0xbc, 0xca, 0xd2, 0xb3, 0x8e, 0xa8, 0xe3, 0xb4, 0x44, 0x89, 0x91, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x33, 0x84, 0xbf, 0x00, 0x73, 0x88, 0x00, 0x00, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x81, 0x00, 0x00, 0xb2, 0x85, 0xbf, 0x01, 0xb2, 0x0d, 0x80, 0x00, 0x00, 0x19, 0x83, 0xbf, 0x01, 0xb2, 0x59, 0x80, 0x00, 0x00, 0x40, 0x9d, 0xbf, 0x11, 0x8d, 0x46, 0x7a, 0x99, 0x92, 0x8a, 0x8d, 0x97, 0xa3, 0x9a, 0x91, 0x91, 0x99, 0xcf, 0xbb, 0x4d, 0x83, 0xbc, 0xec, 0xbf, 0x10, 0x9c, 0x52, 0x5a, 0x84, 0x95, 0x95, 0x8e, 0x89, 0x8b, 0x8f, 0x8f, 0x90, 0x92, 0xbd, 0x9f, 0x3d, 0x9b, 0xed, 0xbf, 0x0f, 0xb6, 0x80, 0x50, 0x52, 0x68, 0x85, 0x8f, 0x87, 0x8b, 0x8e, 0x8d, 0x7b, 0x5a, 0x4f, 0x73, 0xb2, 0xef, 0xbf, 0x0b, 0xb8, 0x98, 0x4b, 0x72, 0x98, 0x91, 0x8f, 0x79, 0x58, 0x4b, 0x77, 0xab, 0xf3, 0xbf, 0x07, 0x58, 0x86, 0x98, 0x72, 0x53, 0x4d, 0x7c, 0xaf, 0xf4, 0xbf, 0x06, 0xb3, 0x46, 0x67, 0x4d, 0x57, 0x83, 0xb3, 0xf6, 0xbf, 0x04, 0xae, 0x49, 0x5c, 0x93, 0xbc, 0xe3, 0xbf, 0x98, 0xbf, 0x03, 0xbe, 0x83, 0x3e, 0x96, 0xf7, 0xbf, 0x05, 0xb0, 0x79, 0x2f, 0x0b, 0x08, 0x7b, 0xf5, 0xbf, 0x07, 0xab, 0x64, 0x18, 0x14, 0x5c, 0x9a, 0x14, 0x9b, 0xf3, 0xbf, 0x09, 0xa7, 0x5c, 0x13, 0x25, 0x67, 0x9a, 0xc7, 0x98, 0x0a, 0xa8, 0xf1, 0xbf, 0x0d, 0xa3, 0x55, 0x12, 0x1f, 0x4e, 0x6e, 0x6a, 0x4e, 0x83, 0x81, 0x1c, 0x1a, 0x4b, 0x90, 0xee, 0xbf, 0x10, 0xb0, 0x0f, 0x18, 0x39, 0x4a, 0x48, 0x3d, 0x35, 0x36, 0x7a, 0x9a, 0x9f, 0x89, 0x55, 0x14, 0x44, 0xa7, 0x9e, 0xbf, 0x00, 0x99, 0x88, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x66, 0x88, 0x00, 0x03, 0x99, 0xbf, 0xbf, 0x59, 0x81, 0x00, 0x00, 0x73, 0xa6, 0xbf, 0x11, 0xbb, 0x4f, 0x13, 0x3d, 0x41, 0x3e, 0x3e, 0x3b, 0x3a, 0x4a, 0x56, 0x6a, 0x8d, 0xa8, 0x98, 0x46, 0x19, 0x8d, 0x9d, 0xbf, 0x00, 0x7f, 0x88, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x4c, 0x87, 0x00, 0x00, 0x26, 0x80, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x01, 0x0d, 0xb2, 0x83, 0xbf, 0x02, 0x8c, 0x33, 0x99, 0x9f, 0xbf, 0x10, 0x5c, 0x0d, 0x38, 0x43, 0x3e, 0x3b, 0x38, 0x33, 0x30, 0x2c, 0x31, 0x51, 0x86, 0xa1, 0x62, 0x0f, 0x8b, 0x9c, 0xbf, 0x00, 0x59, 0x81, 0x00, 0x00, 0xb2, 0x83, 0xbf, 0x00, 0xb2, 0x80, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0xa6, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x40, 0x81, 0xbf, 0x04, 0xa6, 0x66, 0x19, 0x00, 0x0d, 0xa1, 0xbf, 0x10, 0x67, 0x0a, 0x35, 0x41, 0x3a, 0x37, 0x38, 0x36, 0x35, 0x31, 0x24, 0x2e, 0x67, 0x94, 0x5c, 0x11, 0xa0, 0x9b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x81, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x59, 0xa2, 0xbf, 0x10, 0x71, 0x09, 0x32, 0x3e, 0x37, 0x37, 0x0d, 0x10, 0x24, 0x33, 0x28, 0x23, 0x59, 0x81, 0x3b, 0x31, 0xbb, 0x9a, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0xa3, 0xbf, 0x0f, 0x73, 0x05, 0x33, 0x40, 0x35, 0x16, 0x85, 0x2c, 0x10, 0x31, 0x28, 0x24, 0x5c, 0x66, 0x0f, 0x7e, 0x99, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x7f, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x19, 0x80, 0x00, 0x00, 0x99, 0x98, 0xbf, 0x01, 0xa9, 0x76, 0x80, 0x74, 0x01, 0x76, 0xa9, 0x82, 0xbf, 0x0f, 0x5e, 0x0a, 0x30, 0x34, 0x2a, 0xbf, 0xb5, 0x49, 0x0f, 0x2f, 0x22, 0x35, 0x5a, 0x2e, 0x35, 0xbe, 0x8c, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x08, 0x73, 0xbf, 0x66, 0x00, 0x00, 0x73, 0xbf, 0xbf, 0x7f, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x40, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x80, 0xbf, 0x85, 0x00, 0x00, 0x4c, 0x96, 0xbf, 0x06, 0x48, 0x1a, 0x43, 0x3f, 0x3b, 0x0f, 0x6d, 0x83, 0xbf, 0x03, 0x69, 0x06, 0x15, 0x40, 0x80, 0xbf, 0x07, 0x49, 0x13, 0x2e, 0x23, 0x38, 0x3b, 0x07, 0x9a, 0x8c, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x04, 0xa6, 0x33, 0x00, 0x00, 0x0d, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x88, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x03, 0x7f, 0xbf, 0xbf, 0x99, 0x85, 0x00, 0x00, 0x66, 0x96, 0xbf, 0x06, 0x15, 0x22, 0x69, 0xad, 0xd0, 0x21, 0x8a, 0x84, 0xbf, 0x02, 0x8e, 0x19, 0x67, 0x80, 0xbf, 0x07, 0xb5, 0x1e, 0x24, 0x29, 0x20, 0x2b, 0x11, 0x63, 0x8c, 0xbf, 0x04, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x80, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x40, 0x87, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0xb2, 0x87, 0x00, 0x04, 0x0d, 0xb2, 0xbf, 0xbf, 0x99, 0x81, 0x00, 0x00, 0xb2, 0x81, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x99, 0xbf, 0x06, 0x0a, 0x1a, 0x23, 0x6f, 0xbb, 0x14, 0xa2, 0x85, 0xbf, 0x01, 0xb6, 0xbb, 0x81, 0xbf, 0x06, 0x6f, 0x11, 0x2e, 0x1f, 0x20, 0x15, 0x39, 0x8b, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x19, 0x81, 0x00, 0x00, 0x66, 0x80, 0xbf, 0x00, 0x19, 0x87, 0x00, 0x00, 0xa6, 0x80, 0xbf, 0x00, 0x8c, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x7f, 0x99, 0xbf, 0x06, 0x0a, 0x1c, 0x27, 0x71, 0xa9, 0x11, 0xa0, 0x8b, 0xbf, 0x06, 0xa6, 0x0d, 0x2d, 0x22, 0x1f, 0x1a, 0x1c, 0x8b, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x07, 0x33, 0xa6, 0xbf, 0xb2, 0x8c, 0xbf, 0xbf, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x82, 0xbf, 0x01, 0xb2, 0xb2, 0x80, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x01, 0x99, 0x7f, 0x80, 0xbf, 0x00, 0x4c, 0x80, 0x00, 0x00, 0x40, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0xb2, 0x99, 0xbf, 0x06, 0x1b, 0x1a, 0x27, 0x67, 0xa0, 0x13, 0x8b, 0x8b, 0xbf, 0x06, 0xba, 0x1c, 0x2a, 0x25, 0x1f, 0x1d, 0x0d, 0x8b, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x26, 0x84, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x88, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x26, 0x9a, 0xbf, 0x06, 0x4c, 0x15, 0x27, 0x57, 0x97, 0x2a, 0x5d, 0x8b, 0xbf, 0x06, 0xbb, 0x23, 0x28, 0x25, 0x1f, 0x1d, 0x0b, 0x8b, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x73, 0x84, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x33, 0x88, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x4c, 0x9a, 0xbf, 0x07, 0x7c, 0x0c, 0x27, 0x41, 0x88, 0x51, 0x19, 0xb4, 0x80, 0xbf, 0x02, 0xa7, 0x55, 0xa3, 0x84, 0xbf, 0x06, 0xb8, 0x1a, 0x2e, 0x25, 0x20, 0x1d, 0x0e, 0x8b, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0xb2, 0x84, 0xbf, 0x00, 0x33, 0x80, 0x00, 0x00, 0x59, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x0d, 0x82, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x66, 0x9a, 0xbf, 0x07, 0xaa, 0x0c, 0x23, 0x2e, 0x69, 0x76, 0x15, 0x54, 0x80, 0xbf, 0x03, 0x75, 0x02, 0x1c, 0x8b, 0x83, 0xbf, 0x06, 0x9c, 0x05, 0x21, 0x19, 0x17, 0x12, 0x19, 0x8a, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x26, 0x85, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x73, 0x87, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x59, 0x80, 0x00, 0x00, 0x26, 0x82, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x99, 0x9b, 0xbf, 0x0e, 0x42, 0x16, 0x27, 0x42, 0x74, 0x57, 0x06, 0x64, 0xbf, 0xbf, 0x5d, 0x35, 0x46, 0x05, 0x77, 0x82, 0xbf, 0x01, 0xa7, 0x3c, 0x81, 0x35, 0x00, 0x67, 0x8a, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x59, 0x84, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x99, 0x87, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x33, 0x87, 0xbf, 0x00, 0x26, 0x80, 0x00, 0x00, 0x59, 0x81, 0xbf, 0x00, 0xb2, 0x80, 0x00, 0x00, 0x0d, 0x9c, 0xbf, 0x0f, 0x87, 0x07, 0x27, 0x29, 0x56, 0x75, 0x42, 0x01, 0x5e, 0xb2, 0x48, 0x56, 0xd3, 0x49, 0x04, 0x8c, 0x95, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x7f, 0x84, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0xb2, 0x87, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x59, 0x86, 0xbf, 0x00, 0xb2, 0x81, 0x00, 0x00, 0x66, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x33, 0x9c, 0xbf, 0x10, 0xbb, 0x30, 0x17, 0x28, 0x2e, 0x58, 0x72, 0x51, 0x17, 0x19, 0x11, 0x5f, 0xd8, 0xdb, 0x60, 0x0d, 0x87, 0x94, 0xbf, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x99, 0x84, 0xbf, 0x00, 0x40, 0x80, 0x00, 0x00, 0x0d, 0x87, 0xbf, 0x00, 0x99, 0x81, 0x00, 0x00, 0x73, 0x86, 0xbf, 0x00, 0x7f, 0x81, 0x00, 0x00, 0x99, 0x81, 0xbf, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x4c, 0x9d, 0xbf, 0x10, 0x9d, 0x0c, 0x20, 0x26, 0x29, 0x4b, 0x70, 0x77, 0x5a, 0x39, 0x81, 0x8f, 0x71, 0xd0, 0x76, 0x07, 0x7e, 0x92, 0xbf, 0x00, 0x99, 0x80, 0x00, 0x00, 0x0d, 0x84, 0xbf, 0x01, 0xb2, 0x0d, 0x87, 0x00, 0x00, 0x40, 0x80, 0xbf, 0x00, 0x66, 0x81, 0x00, 0x00, 0x99, 0x86, 0xbf, 0x00, 0x40, 0x81, 0x00, 0x00, 0xb2, 0x82, 0xbf, 0x06, 0x19, 0x00, 0x00, 0x0d, 0x66, 0x99, 0xa6, 0x9b, 0xbf, 0x10, 0x7c, 0x06, 0x21, 0x28, 0x22, 0x33, 0x53, 0x76, 0x8b, 0xa2, 0x64, 0x16, 0x48, 0xb9, 0x86, 0x09, 0x73, 0x91, 0xbf, 0x00, 0x66, 0x80, 0x00, 0x00, 0x33, 0x84, 0xbf, 0x00, 0x73, 0x88, 0x00, 0x00, 0x73, 0x80, 0xbf, 0x00, 0x19, 0x81, 0x00, 0x00, 0xb2, 0x85, 0xbf, 0x01, 0xb2, 0x0d, 0x80, 0x00, 0x00, 0x19, 0x83, 0xbf, 0x01, 0xb2, 0x59, 0x80, 0x00, 0x00, 0x40, 0x9d, 0xbf, 0x11, 0x78, 0x09, 0x1c, 0x29, 0x24, 0x21, 0x27, 0x38, 0x4c, 0x38, 0x24, 0x20, 0x2d, 0x92, 0x8e, 0x13, 0x69, 0xbc, 0xec, 0xbf, 0x10, 0x8e, 0x22, 0x0d, 0x20, 0x28, 0x27, 0x22, 0x1e, 0x22, 0x25, 0x26, 0x23, 0x21, 0x6e, 0x6a, 0x03, 0x8b, 0xed, 0xbf, 0x0f, 0xb3, 0x65, 0x1c, 0x09, 0x14, 0x20, 0x25, 0x22, 0x23, 0x25, 0x25, 0x1c, 0x08, 0x16, 0x50, 0xad, 0xef, 0xbf, 0x0b, 0xb5, 0x88, 0x1f, 0x18, 0x29, 0x26, 0x25, 0x1c, 0x0d, 0x11, 0x58, 0xa3, 0xf3, 0xbf, 0x07, 0x27, 0x21, 0x29, 0x18, 0x0a, 0x16, 0x5f, 0xa9, 0xf4, 0xbf, 0x06, 0xaf, 0x09, 0x13, 0x07, 0x2b, 0x6a, 0xae, 0xf6, 0xbf, 0x04, 0xa7, 0x12, 0x2f, 0x82, 0xbb, 0xe3, 0xbf, }; static EG_EMBEDDED_IMAGE egemb_refit_banner = { 128, 32, EG_EIPIXELMODE_COLOR, EG_EICOMPMODE_RLE, egemb_refit_banner_data, 4126 }; refit-0.14/libeg/0000755000175000017500000000000011363100432013160 5ustar julienjulienrefit-0.14/libeg/efiConsoleControl.h0000644000175000017500000000657010424435046017001 0ustar julienjulien/*++ Copyright (c) 2004, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: ConsoleControl.h Abstract: Abstraction of a Text mode or UGA screen --*/ #ifndef __CONSOLE_CONTROL_H__ #define __CONSOLE_CONTROL_H__ #define EFI_CONSOLE_CONTROL_PROTOCOL_GUID \ { 0xf42f7782, 0x12e, 0x4c12, { 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21 } } struct _EFI_CONSOLE_CONTROL_PROTOCOL; typedef enum { EfiConsoleControlScreenText, EfiConsoleControlScreenGraphics, EfiConsoleControlScreenMaxValue } EFI_CONSOLE_CONTROL_SCREEN_MODE; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode, OUT BOOLEAN *UgaExists, OPTIONAL OUT BOOLEAN *StdInLocked OPTIONAL ) /*++ Routine Description: Return the current video mode information. Also returns info about existence of UGA Draw devices in system, and if the Std In device is locked. All the arguments are optional and only returned if a non NULL pointer is passed in. Arguments: This - Protocol instance pointer. Mode - Are we in text of grahics mode. UgaExists - TRUE if UGA Spliter has found a UGA device StdInLocked - TRUE if StdIn device is keyboard locked Returns: EFI_SUCCESS - Mode information returned. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, OUT EFI_CONSOLE_CONTROL_SCREEN_MODE Mode ) /*++ Routine Description: Set the current mode to either text or graphics. Graphics is for Quiet Boot. Arguments: This - Protocol instance pointer. Mode - Mode to set the Returns: EFI_SUCCESS - Mode information returned. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN) ( IN struct _EFI_CONSOLE_CONTROL_PROTOCOL *This, IN CHAR16 *Password ) /*++ Routine Description: Lock Std In devices until Password is typed. Arguments: This - Protocol instance pointer. Password - Password needed to unlock screen. NULL means unlock keyboard Returns: EFI_SUCCESS - Mode information returned. EFI_DEVICE_ERROR - Std In not locked --*/ ; typedef struct _EFI_CONSOLE_CONTROL_PROTOCOL { EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE GetMode; EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE SetMode; EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN LockStdIn; } EFI_CONSOLE_CONTROL_PROTOCOL; //extern EFI_GUID gEfiConsoleControlProtocolGuid; #endif refit-0.14/libeg/efiGraphicsOutput.h0000644000175000017500000001724111071622702017010 0ustar julienjulien/*++ Copyright (c) 2006, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: GraphicsOutput.h Abstract: Graphics Output Protocol from the UEFI 2.0 specification. Abstraction of a very simple graphics device. --*/ #ifndef __GRAPHICS_OUTPUT_H__ #define __GRAPHICS_OUTPUT_H__ #include #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ { \ 0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a \ } /* typedef struct _EFI_GRAPHICS_OUTPUT_PROTOCOL EFI_GRAPHICS_OUTPUT_PROTOCOL; */ struct _EFI_GRAPHICS_OUTPUT_PROTOCOL; typedef struct { UINT32 RedMask; UINT32 GreenMask; UINT32 BlueMask; UINT32 ReservedMask; } EFI_PIXEL_BITMASK; typedef enum { PixelRedGreenBlueReserved8BitPerColor, PixelBlueGreenRedReserved8BitPerColor, PixelBitMask, PixelBltOnly, PixelFormatMax } EFI_GRAPHICS_PIXEL_FORMAT; typedef struct { UINT32 Version; UINT32 HorizontalResolution; UINT32 VerticalResolution; EFI_GRAPHICS_PIXEL_FORMAT PixelFormat; EFI_PIXEL_BITMASK PixelInformation; UINT32 PixelsPerScanLine; } EFI_GRAPHICS_OUTPUT_MODE_INFORMATION; typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) ( IN struct _EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN UINT32 ModeNumber, OUT UINTN *SizeOfInfo, OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info ) /*++ Routine Description: Return the current video mode information. Arguments: This - Protocol instance pointer. ModeNumber - The mode number to return information on. SizeOfInfo - A pointer to the size, in bytes, of the Info buffer. Info - A pointer to callee allocated buffer that returns information about ModeNumber. Returns: EFI_SUCCESS - Mode information returned. EFI_DEVICE_ERROR - A hardware error occurred trying to retrieve the video mode. EFI_NOT_STARTED - Video display is not initialized. Call SetMode () EFI_INVALID_PARAMETER - One of the input args was NULL. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) ( IN struct _EFI_GRAPHICS_OUTPUT_PROTOCOL * This, IN UINT32 ModeNumber ) /*++ Routine Description: Return the current video mode information. Arguments: This - Protocol instance pointer. ModeNumber - The mode number to be set. Returns: EFI_SUCCESS - Graphics mode was changed. EFI_DEVICE_ERROR - The device had an error and could not complete the request. EFI_UNSUPPORTED - ModeNumber is not supported by this device. --*/ ; typedef EFI_UGA_PIXEL EFI_GRAPHICS_OUTPUT_BLT_PIXEL; typedef union { EFI_GRAPHICS_OUTPUT_BLT_PIXEL Pixel; UINT32 Raw; } EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION; typedef enum { EfiBltVideoFill, EfiBltVideoToBltBuffer, EfiBltBufferToVideo, EfiBltVideoToVideo, EfiGraphicsOutputBltOperationMax } EFI_GRAPHICS_OUTPUT_BLT_OPERATION; typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) ( IN struct _EFI_GRAPHICS_OUTPUT_PROTOCOL * This, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL ); /*++ Routine Description: The following table defines actions for BltOperations: EfiBltVideoFill - Write data from the BltBuffer pixel (SourceX, SourceY) directly to every pixel of the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). Only one pixel will be used from the BltBuffer. Delta is NOT used. EfiBltVideoToBltBuffer - Read data from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in the BltBuffer rectangle (DestinationX, DestinationY ) (DestinationX + Width, DestinationY + Height). If DestinationX or DestinationY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiBltBufferToVideo - Write data from the BltBuffer rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiBltVideoToVideo - Copy from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) .to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). The BltBuffer and Delta are not used in this mode. Arguments: This - Protocol instance pointer. BltBuffer - Buffer containing data to blit into video buffer. This buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) BltOperation - Operation to perform on BlitBuffer and video memory SourceX - X coordinate of source for the BltBuffer. SourceY - Y coordinate of source for the BltBuffer. DestinationX - X coordinate of destination for the BltBuffer. DestinationY - Y coordinate of destination for the BltBuffer. Width - Width of rectangle in BltBuffer in pixels. Height - Hight of rectangle in BltBuffer in pixels. Delta - Returns: EFI_SUCCESS - The Blt operation completed. EFI_INVALID_PARAMETER - BltOperation is not valid. EFI_DEVICE_ERROR - A hardware error occured writting to the video buffer. --*/ ; typedef struct { UINT32 MaxMode; UINT32 Mode; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; UINTN SizeOfInfo; EFI_PHYSICAL_ADDRESS FrameBufferBase; UINTN FrameBufferSize; } EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE; typedef struct _EFI_GRAPHICS_OUTPUT_PROTOCOL { EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode; EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode; EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt; EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode; } EFI_GRAPHICS_OUTPUT_PROTOCOL; extern EFI_GUID gEfiGraphicsOutputProtocolGuid; #endif refit-0.14/libeg/efiUgaDraw.h0000644000175000017500000001607410424435046015370 0ustar julienjulien/*++ Copyright (c) 2004, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: UgaDraw.h Abstract: UGA Draw protocol from the EFI 1.1 specification. Abstraction of a very simple graphics device. --*/ #ifndef __UGA_DRAW_H__ #define __UGA_DRAW_H__ #define EFI_UGA_DRAW_PROTOCOL_GUID \ { \ 0x982c298b, 0xf4fa, 0x41cb, { 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } \ } /* typedef struct _EFI_UGA_DRAW_PROTOCOL EFI_UGA_DRAW_PROTOCOL; */ struct _EFI_UGA_DRAW_PROTOCOL; typedef EFI_STATUS (EFIAPI *EFI_UGA_DRAW_PROTOCOL_GET_MODE) ( IN struct _EFI_UGA_DRAW_PROTOCOL * This, OUT UINT32 *HorizontalResolution, OUT UINT32 *VerticalResolution, OUT UINT32 *ColorDepth, OUT UINT32 *RefreshRate ) /*++ Routine Description: Return the current video mode information. Arguments: This - Protocol instance pointer. HorizontalResolution - Current video horizontal resolution in pixels VerticalResolution - Current video vertical resolution in pixels ColorDepth - Current video color depth in bits per pixel RefreshRate - Current video refresh rate in Hz. Returns: EFI_SUCCESS - Mode information returned. EFI_NOT_STARTED - Video display is not initialized. Call SetMode () EFI_INVALID_PARAMETER - One of the input args was NULL. --*/ ; typedef EFI_STATUS (EFIAPI *EFI_UGA_DRAW_PROTOCOL_SET_MODE) ( IN struct _EFI_UGA_DRAW_PROTOCOL * This, IN UINT32 HorizontalResolution, IN UINT32 VerticalResolution, IN UINT32 ColorDepth, IN UINT32 RefreshRate ) /*++ Routine Description: Return the current video mode information. Arguments: This - Protocol instance pointer. HorizontalResolution - Current video horizontal resolution in pixels VerticalResolution - Current video vertical resolution in pixels ColorDepth - Current video color depth in bits per pixel RefreshRate - Current video refresh rate in Hz. Returns: EFI_SUCCESS - Mode information returned. EFI_NOT_STARTED - Video display is not initialized. Call SetMode () --*/ ; typedef struct { UINT8 Blue; UINT8 Green; UINT8 Red; UINT8 Reserved; } EFI_UGA_PIXEL; typedef union { EFI_UGA_PIXEL Pixel; UINT32 Raw; } EFI_UGA_PIXEL_UNION; typedef enum { EfiUgaVideoFill, EfiUgaVideoToBltBuffer, EfiUgaBltBufferToVideo, EfiUgaVideoToVideo, EfiUgaBltMax } EFI_UGA_BLT_OPERATION; typedef EFI_STATUS (EFIAPI *EFI_UGA_DRAW_PROTOCOL_BLT) ( IN struct _EFI_UGA_DRAW_PROTOCOL * This, IN EFI_UGA_PIXEL * BltBuffer, OPTIONAL IN EFI_UGA_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL ); /*++ Routine Description: The following table defines actions for BltOperations: EfiUgaVideoFill - Write data from the BltBuffer pixel (SourceX, SourceY) directly to every pixel of the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). Only one pixel will be used from the BltBuffer. Delta is NOT used. EfiUgaVideoToBltBuffer - Read data from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in the BltBuffer rectangle (DestinationX, DestinationY ) (DestinationX + Width, DestinationY + Height). If DestinationX or DestinationY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiUgaBltBufferToVideo - Write data from the BltBuffer rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiUgaVideoToVideo - Copy from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) .to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). The BltBuffer and Delta are not used in this mode. Arguments: This - Protocol instance pointer. BltBuffer - Buffer containing data to blit into video buffer. This buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL) BltOperation - Operation to perform on BlitBuffer and video memory SourceX - X coordinate of source for the BltBuffer. SourceY - Y coordinate of source for the BltBuffer. DestinationX - X coordinate of destination for the BltBuffer. DestinationY - Y coordinate of destination for the BltBuffer. Width - Width of rectangle in BltBuffer in pixels. Height - Hight of rectangle in BltBuffer in pixels. Delta - Returns: EFI_SUCCESS - The Blt operation completed. EFI_INVALID_PARAMETER - BltOperation is not valid. EFI_DEVICE_ERROR - A hardware error occured writting to the video buffer. --*/ ; typedef struct _EFI_UGA_DRAW_PROTOCOL { EFI_UGA_DRAW_PROTOCOL_GET_MODE GetMode; EFI_UGA_DRAW_PROTOCOL_SET_MODE SetMode; EFI_UGA_DRAW_PROTOCOL_BLT Blt; } EFI_UGA_DRAW_PROTOCOL; extern EFI_GUID gEfiUgaDrawProtocolGuid; #endif refit-0.14/libeg/egemb_font.h0000644000175000017500000005274010424717761015466 0ustar julienjulienstatic const UINT8 egemb_font_data[3587] = { 0xff, 0x00, 0xdd, 0x00, 0x80, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xbc, 0x00, 0x00, 0xff, 0x81, 0x00, 0x04, 0xff, 0xff, 0x00, 0xff, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x8b, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0xa1, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x81, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x80, 0xff, 0x81, 0x00, 0x80, 0xff, 0x83, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x81, 0xff, 0x81, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x80, 0xff, 0x81, 0x00, 0x80, 0xff, 0xaa, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x82, 0xff, 0x81, 0x00, 0x81, 0xff, 0x00, 0x00, 0x81, 0xff, 0x80, 0x00, 0x83, 0xff, 0x01, 0x00, 0x00, 0x83, 0xff, 0x01, 0x00, 0x00, 0x81, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x81, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x80, 0x00, 0x80, 0xff, 0x00, 0x00, 0x83, 0xff, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x80, 0x00, 0x81, 0xff, 0x81, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x81, 0x00, 0x04, 0xff, 0xff, 0x00, 0xff, 0x00, 0x87, 0xff, 0x00, 0x00, 0x83, 0xff, 0x00, 0x00, 0x83, 0xff, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x82, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x00, 0xff, 0x84, 0x00, 0x80, 0xff, 0x90, 0x00, 0x00, 0xff, 0x87, 0x00, 0x01, 0xff, 0xff, 0x8d, 0x00, 0x01, 0xff, 0xff, 0x88, 0x00, 0x80, 0xff, 0x85, 0x00, 0x01, 0xff, 0xff, 0x85, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x84, 0x00, 0x01, 0xff, 0xff, 0xe6, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x99, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x82, 0xff, 0x81, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x90, 0x00, 0x01, 0xff, 0xff, 0x85, 0x00, 0x01, 0xff, 0xff, 0x85, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0e, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x11, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x8b, 0x00, 0x00, 0xff, 0x87, 0x00, 0x00, 0xff, 0x8e, 0x00, 0x00, 0xff, 0x87, 0x00, 0x00, 0xff, 0x89, 0x00, 0x00, 0xff, 0x91, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0xae, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8a, 0x00, 0x01, 0xff, 0xff, 0x89, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x84, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x99, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x87, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x83, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x89, 0x00, 0x00, 0xff, 0x83, 0x00, 0x0a, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x05, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0e, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x81, 0x00, 0x02, 0xff, 0x00, 0xff, 0x8f, 0x00, 0x80, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0xff, 0xff, 0x81, 0x00, 0x81, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x82, 0xff, 0x80, 0x00, 0x09, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x80, 0x00, 0x80, 0xff, 0x81, 0x00, 0x81, 0xff, 0x80, 0x00, 0x01, 0xff, 0x00, 0x80, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x08, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x81, 0x00, 0x80, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x81, 0x00, 0x0a, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x00, 0x81, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x07, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x83, 0xff, 0x00, 0x00, 0x82, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x82, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x89, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0x88, 0x00, 0x82, 0xff, 0x02, 0x00, 0x00, 0xff, 0x86, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x99, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x82, 0x00, 0x01, 0xff, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x81, 0xff, 0x83, 0x00, 0x00, 0xff, 0x81, 0x00, 0x80, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x83, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x82, 0xff, 0x81, 0x00, 0x01, 0xff, 0xff, 0x84, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x81, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0x00, 0x80, 0xff, 0x82, 0x00, 0x80, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x82, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0e, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x82, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x8d, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0a, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0a, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0b, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x81, 0x00, 0x0e, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0e, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0x89, 0x00, 0x02, 0xff, 0x00, 0xff, 0x81, 0x00, 0x80, 0xff, 0x80, 0x00, 0x80, 0xff, 0x82, 0x00, 0x00, 0xff, 0x8b, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x82, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0x00, 0x84, 0xff, 0x85, 0x00, 0x82, 0xff, 0x88, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x85, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x81, 0xff, 0x8c, 0x00, 0x00, 0xff, 0x8f, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x05, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0e, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0x00, 0x81, 0xff, 0x84, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x96, 0x00, 0x81, 0xff, 0x02, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x83, 0x00, 0x00, 0xff, 0x81, 0x00, 0x07, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x80, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x82, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x95, 0x00, 0x82, 0xff, 0x05, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x98, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x86, 0x00, 0x02, 0xff, 0x00, 0x00, 0x83, 0xff, 0x82, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8d, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x82, 0xff, 0x81, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x81, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x82, 0xff, 0x02, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0a, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x95, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x81, 0x00, 0x07, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x86, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x04, 0xff, 0x00, 0xff, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x02, 0xff, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x97, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x80, 0xff, 0x83, 0x00, 0x08, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x89, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x83, 0x00, 0x01, 0xff, 0xff, 0x88, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x83, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x81, 0x00, 0x01, 0xff, 0xff, 0x83, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x89, 0x00, 0x00, 0xff, 0x89, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x0a, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x07, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x07, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x95, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x81, 0x00, 0x07, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x03, 0xff, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x06, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x02, 0xff, 0x00, 0xff, 0x80, 0x00, 0x0a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x82, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x98, 0x00, 0x00, 0xff, 0x88, 0x00, 0x02, 0xff, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x84, 0x00, 0x00, 0xff, 0x81, 0x00, 0x03, 0xff, 0xff, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x89, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x00, 0xff, 0x83, 0x00, 0x80, 0xff, 0x80, 0x00, 0x82, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x80, 0xff, 0x83, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x81, 0x00, 0x80, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x80, 0xff, 0x80, 0x00, 0x80, 0xff, 0x82, 0x00, 0x01, 0xff, 0xff, 0x82, 0x00, 0x01, 0xff, 0xff, 0x84, 0x00, 0x01, 0xff, 0xff, 0x85, 0x00, 0x01, 0xff, 0xff, 0x84, 0x00, 0x01, 0xff, 0xff, 0x81, 0x00, 0x00, 0xff, 0x80, 0x00, 0x01, 0xff, 0x00, 0x80, 0xff, 0x00, 0x00, 0x85, 0xff, 0x81, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x81, 0xff, 0x80, 0x00, 0x83, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x82, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x80, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x83, 0xff, 0x02, 0x00, 0xff, 0xff, 0x80, 0x00, 0x80, 0xff, 0x80, 0x00, 0x80, 0xff, 0x82, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x80, 0x00, 0x05, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x81, 0x00, 0x80, 0xff, 0x81, 0x00, 0x80, 0xff, 0x82, 0x00, 0x00, 0xff, 0x82, 0x00, 0x06, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x80, 0x00, 0x82, 0xff, 0x80, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x96, 0x00, 0x87, 0xff, 0x81, 0x00, 0x80, 0xff, 0x81, 0x00, 0x82, 0xff, 0x01, 0x00, 0x00, 0x81, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x80, 0x00, 0x81, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x82, 0xff, 0x82, 0x00, 0x05, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0xff, 0x00, 0x00, 0x82, 0xff, 0x00, 0x00, 0x87, 0xff, 0x00, 0x00, 0x80, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0x80, 0x00, 0x81, 0xff, 0x81, 0x00, 0x81, 0xff, 0x01, 0x00, 0x00, 0x82, 0xff, 0x01, 0x00, 0x00, 0x81, 0xff, 0x82, 0x00, 0x80, 0xff, 0x80, 0x00, 0x04, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0x82, 0x00, 0x0a, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x81, 0x00, 0x00, 0xff, 0x81, 0x00, 0x82, 0xff, 0x81, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x89, 0x00, 0x01, 0xff, 0xff, 0x96, 0x00, 0x02, 0xff, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x99, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x91, 0x00, 0x01, 0xff, 0xff, 0x8f, 0x00, 0x00, 0xff, 0xd1, 0x00, 0x00, 0xff, 0x9f, 0x00, 0x80, 0xff, 0xf2, 0x00, 0x80, 0xff, 0xbf, 0x00, 0x00, 0xff, 0x85, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xff, 0xa3, 0x00, 0x00, 0xff, 0x87, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, 0xca, 0x00, 0x00, 0xff, 0x81, 0x00, 0x00, 0xff, 0x91, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xc1, 0x00, 0x80, 0xff, 0x88, 0x00, 0x80, 0xff, 0xc0, 0x00, 0x80, 0xff, 0x8e, 0x00, 0x80, 0xff, 0xa3, 0x00, 0x80, 0xff, 0x85, 0x00, 0x80, 0xff, 0xaf, 0x00, 0x81, 0xff, 0x8a, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xc2, 0x00, 0x84, 0xff, 0xff, 0x00, 0xdb, 0x00, }; static EG_EMBEDDED_IMAGE egemb_font = { 672, 12, EG_EIPIXELMODE_ALPHA, EG_EICOMPMODE_RLE, egemb_font_data, 3587 }; refit-0.14/libeg/image.c0000644000175000017500000004166710431662252014434 0ustar julienjulien/* * libeg/image.c * Image handling functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libegint.h" #define MAX_FILE_SIZE (1024*1024*1024) // // Basic image handling // EG_IMAGE * egCreateImage(IN UINTN Width, IN UINTN Height, IN BOOLEAN HasAlpha) { EG_IMAGE *NewImage; NewImage = (EG_IMAGE *) AllocatePool(sizeof(EG_IMAGE)); if (NewImage == NULL) return NULL; NewImage->PixelData = (EG_PIXEL *) AllocatePool(Width * Height * sizeof(EG_PIXEL)); if (NewImage->PixelData == NULL) { FreePool(NewImage); return NULL; } NewImage->Width = Width; NewImage->Height = Height; NewImage->HasAlpha = HasAlpha; return NewImage; } EG_IMAGE * egCreateFilledImage(IN UINTN Width, IN UINTN Height, IN BOOLEAN HasAlpha, IN EG_PIXEL *Color) { EG_IMAGE *NewImage; NewImage = egCreateImage(Width, Height, HasAlpha); if (NewImage == NULL) return NULL; egFillImage(NewImage, Color); return NewImage; } EG_IMAGE * egCopyImage(IN EG_IMAGE *Image) { EG_IMAGE *NewImage; NewImage = egCreateImage(Image->Width, Image->Height, Image->HasAlpha); if (NewImage == NULL) return NULL; CopyMem(NewImage->PixelData, Image->PixelData, Image->Width * Image->Height * sizeof(EG_PIXEL)); return NewImage; } VOID egFreeImage(IN EG_IMAGE *Image) { if (Image != NULL) { if (Image->PixelData != NULL) FreePool(Image->PixelData); FreePool(Image); } } // // Basic file operations // EFI_STATUS egLoadFile(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, OUT UINT8 **FileData, OUT UINTN *FileDataLength) { EFI_STATUS Status; EFI_FILE_HANDLE FileHandle; EFI_FILE_INFO *FileInfo; UINT64 ReadSize; UINTN BufferSize; UINT8 *Buffer; Status = BaseDir->Open(BaseDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0); if (EFI_ERROR(Status)) return Status; FileInfo = LibFileInfo(FileHandle); if (FileInfo == NULL) { FileHandle->Close(FileHandle); return EFI_NOT_FOUND; } ReadSize = FileInfo->FileSize; if (ReadSize > MAX_FILE_SIZE) ReadSize = MAX_FILE_SIZE; FreePool(FileInfo); BufferSize = (UINTN)ReadSize; // was limited to 1 GB above, so this is safe Buffer = (UINT8 *) AllocatePool(BufferSize); if (Buffer == NULL) { FileHandle->Close(FileHandle); return EFI_OUT_OF_RESOURCES; } Status = FileHandle->Read(FileHandle, &BufferSize, Buffer); FileHandle->Close(FileHandle); if (EFI_ERROR(Status)) { FreePool(Buffer); return Status; } *FileData = Buffer; *FileDataLength = BufferSize; return EFI_SUCCESS; } static EFI_GUID ESPGuid = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } }; static EFI_STATUS egFindESP(OUT EFI_FILE_HANDLE *RootDir) { EFI_STATUS Status; UINTN HandleCount = 0; EFI_HANDLE *Handles; Status = LibLocateHandle(ByProtocol, &ESPGuid, NULL, &HandleCount, &Handles); if (!EFI_ERROR(Status) && HandleCount > 0) { *RootDir = LibOpenRoot(Handles[0]); if (*RootDir == NULL) Status = EFI_NOT_FOUND; FreePool(Handles); } return Status; } EFI_STATUS egSaveFile(IN EFI_FILE_HANDLE BaseDir OPTIONAL, IN CHAR16 *FileName, IN UINT8 *FileData, IN UINTN FileDataLength) { EFI_STATUS Status; EFI_FILE_HANDLE FileHandle; UINTN BufferSize; if (BaseDir == NULL) { Status = egFindESP(&BaseDir); if (EFI_ERROR(Status)) return Status; } Status = BaseDir->Open(BaseDir, &FileHandle, FileName, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR(Status)) return Status; BufferSize = FileDataLength; Status = FileHandle->Write(FileHandle, &BufferSize, FileData); FileHandle->Close(FileHandle); return Status; } // // Loading images from files and embedded data // static CHAR16 * egFindExtension(IN CHAR16 *FileName) { UINTN i; for (i = StrLen(FileName); i >= 0; i--) { if (FileName[i] == '.') return FileName + i + 1; if (FileName[i] == '/' || FileName[i] == '\\') break; } return FileName + StrLen(FileName); } static EG_IMAGE * egDecodeAny(IN UINT8 *FileData, IN UINTN FileDataLength, IN CHAR16 *Format, IN UINTN IconSize, IN BOOLEAN WantAlpha) { EG_DECODE_FUNC DecodeFunc; EG_IMAGE *NewImage; // dispatch by extension DecodeFunc = NULL; if (StriCmp(Format, L"BMP") == 0) DecodeFunc = egDecodeBMP; else if (StriCmp(Format, L"ICNS") == 0) DecodeFunc = egDecodeICNS; if (DecodeFunc == NULL) return NULL; // decode it NewImage = DecodeFunc(FileData, FileDataLength, IconSize, WantAlpha); return NewImage; } EG_IMAGE * egLoadImage(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN BOOLEAN WantAlpha) { EFI_STATUS Status; UINT8 *FileData; UINTN FileDataLength; EG_IMAGE *NewImage; if (BaseDir == NULL || FileName == NULL) return NULL; // load file Status = egLoadFile(BaseDir, FileName, &FileData, &FileDataLength); if (EFI_ERROR(Status)) return NULL; // decode it NewImage = egDecodeAny(FileData, FileDataLength, egFindExtension(FileName), 128, WantAlpha); FreePool(FileData); return NewImage; } EG_IMAGE * egLoadIcon(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN IconSize) { EFI_STATUS Status; UINT8 *FileData; UINTN FileDataLength; EG_IMAGE *NewImage; if (BaseDir == NULL || FileName == NULL) return NULL; // load file Status = egLoadFile(BaseDir, FileName, &FileData, &FileDataLength); if (EFI_ERROR(Status)) return NULL; // decode it NewImage = egDecodeAny(FileData, FileDataLength, egFindExtension(FileName), IconSize, TRUE); FreePool(FileData); return NewImage; } EG_IMAGE * egDecodeImage(IN UINT8 *FileData, IN UINTN FileDataLength, IN CHAR16 *Format, IN BOOLEAN WantAlpha) { return egDecodeAny(FileData, FileDataLength, Format, 128, WantAlpha); } EG_IMAGE * egPrepareEmbeddedImage(IN EG_EMBEDDED_IMAGE *EmbeddedImage, IN BOOLEAN WantAlpha) { EG_IMAGE *NewImage; UINT8 *CompData; UINTN CompLen; UINTN PixelCount; // sanity check if (EmbeddedImage->PixelMode > EG_MAX_EIPIXELMODE || (EmbeddedImage->CompressMode != EG_EICOMPMODE_NONE && EmbeddedImage->CompressMode != EG_EICOMPMODE_RLE)) return NULL; // allocate image structure and pixel buffer NewImage = egCreateImage(EmbeddedImage->Width, EmbeddedImage->Height, WantAlpha); if (NewImage == NULL) return NULL; CompData = (UINT8 *)EmbeddedImage->Data; // drop const CompLen = EmbeddedImage->DataLength; PixelCount = EmbeddedImage->Width * EmbeddedImage->Height; // FUTURE: for EG_EICOMPMODE_EFICOMPRESS, decompress whole data block here if (EmbeddedImage->PixelMode == EG_EIPIXELMODE_GRAY || EmbeddedImage->PixelMode == EG_EIPIXELMODE_GRAY_ALPHA) { // copy grayscale plane and expand if (EmbeddedImage->CompressMode == EG_EICOMPMODE_RLE) { egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, r), PixelCount); } else { egInsertPlane(CompData, PLPTR(NewImage, r), PixelCount); CompData += PixelCount; } egCopyPlane(PLPTR(NewImage, r), PLPTR(NewImage, g), PixelCount); egCopyPlane(PLPTR(NewImage, r), PLPTR(NewImage, b), PixelCount); } else if (EmbeddedImage->PixelMode == EG_EIPIXELMODE_COLOR || EmbeddedImage->PixelMode == EG_EIPIXELMODE_COLOR_ALPHA) { // copy color planes if (EmbeddedImage->CompressMode == EG_EICOMPMODE_RLE) { egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, r), PixelCount); egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, g), PixelCount); egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, b), PixelCount); } else { egInsertPlane(CompData, PLPTR(NewImage, r), PixelCount); CompData += PixelCount; egInsertPlane(CompData, PLPTR(NewImage, g), PixelCount); CompData += PixelCount; egInsertPlane(CompData, PLPTR(NewImage, b), PixelCount); CompData += PixelCount; } } else { // set color planes to black egSetPlane(PLPTR(NewImage, r), 0, PixelCount); egSetPlane(PLPTR(NewImage, g), 0, PixelCount); egSetPlane(PLPTR(NewImage, b), 0, PixelCount); } if (WantAlpha && (EmbeddedImage->PixelMode == EG_EIPIXELMODE_GRAY_ALPHA || EmbeddedImage->PixelMode == EG_EIPIXELMODE_COLOR_ALPHA || EmbeddedImage->PixelMode == EG_EIPIXELMODE_ALPHA)) { // copy alpha plane if (EmbeddedImage->CompressMode == EG_EICOMPMODE_RLE) { egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, a), PixelCount); } else { egInsertPlane(CompData, PLPTR(NewImage, a), PixelCount); CompData += PixelCount; } } else { egSetPlane(PLPTR(NewImage, a), WantAlpha ? 255 : 0, PixelCount); } return NewImage; } // // Compositing // VOID egRestrictImageArea(IN EG_IMAGE *Image, IN UINTN AreaPosX, IN UINTN AreaPosY, IN OUT UINTN *AreaWidth, IN OUT UINTN *AreaHeight) { if (AreaPosX >= Image->Width || AreaPosY >= Image->Height) { // out of bounds, operation has no effect *AreaWidth = 0; *AreaHeight = 0; } else { // calculate affected area if (*AreaWidth > Image->Width - AreaPosX) *AreaWidth = Image->Width - AreaPosX; if (*AreaHeight > Image->Height - AreaPosY) *AreaHeight = Image->Height - AreaPosY; } } VOID egFillImage(IN OUT EG_IMAGE *CompImage, IN EG_PIXEL *Color) { UINTN i; EG_PIXEL FillColor; EG_PIXEL *PixelPtr; FillColor = *Color; if (!CompImage->HasAlpha) FillColor.a = 0; PixelPtr = CompImage->PixelData; for (i = 0; i < CompImage->Width * CompImage->Height; i++, PixelPtr++) *PixelPtr = FillColor; } VOID egFillImageArea(IN OUT EG_IMAGE *CompImage, IN UINTN AreaPosX, IN UINTN AreaPosY, IN UINTN AreaWidth, IN UINTN AreaHeight, IN EG_PIXEL *Color) { UINTN x, y; EG_PIXEL FillColor; EG_PIXEL *PixelPtr; EG_PIXEL *PixelBasePtr; egRestrictImageArea(CompImage, AreaPosX, AreaPosY, &AreaWidth, &AreaHeight); if (AreaWidth > 0) { FillColor = *Color; if (!CompImage->HasAlpha) FillColor.a = 0; PixelBasePtr = CompImage->PixelData + AreaPosY * CompImage->Width + AreaPosX; for (y = 0; y < AreaHeight; y++) { PixelPtr = PixelBasePtr; for (x = 0; x < AreaWidth; x++, PixelPtr++) *PixelPtr = FillColor; PixelBasePtr += CompImage->Width; } } } VOID egRawCopy(IN OUT EG_PIXEL *CompBasePtr, IN EG_PIXEL *TopBasePtr, IN UINTN Width, IN UINTN Height, IN UINTN CompLineOffset, IN UINTN TopLineOffset) { UINTN x, y; EG_PIXEL *TopPtr, *CompPtr; for (y = 0; y < Height; y++) { TopPtr = TopBasePtr; CompPtr = CompBasePtr; for (x = 0; x < Width; x++) { *CompPtr = *TopPtr; TopPtr++, CompPtr++; } TopBasePtr += TopLineOffset; CompBasePtr += CompLineOffset; } } VOID egRawCompose(IN OUT EG_PIXEL *CompBasePtr, IN EG_PIXEL *TopBasePtr, IN UINTN Width, IN UINTN Height, IN UINTN CompLineOffset, IN UINTN TopLineOffset) { UINTN x, y; EG_PIXEL *TopPtr, *CompPtr; UINTN Alpha; UINTN RevAlpha; UINTN Temp; for (y = 0; y < Height; y++) { TopPtr = TopBasePtr; CompPtr = CompBasePtr; for (x = 0; x < Width; x++) { Alpha = TopPtr->a; RevAlpha = 255 - Alpha; Temp = (UINTN)CompPtr->b * RevAlpha + (UINTN)TopPtr->b * Alpha + 0x80; CompPtr->b = (Temp + (Temp >> 8)) >> 8; Temp = (UINTN)CompPtr->g * RevAlpha + (UINTN)TopPtr->g * Alpha + 0x80; CompPtr->g = (Temp + (Temp >> 8)) >> 8; Temp = (UINTN)CompPtr->r * RevAlpha + (UINTN)TopPtr->r * Alpha + 0x80; CompPtr->r = (Temp + (Temp >> 8)) >> 8; /* CompPtr->b = ((UINTN)CompPtr->b * RevAlpha + (UINTN)TopPtr->b * Alpha) / 255; CompPtr->g = ((UINTN)CompPtr->g * RevAlpha + (UINTN)TopPtr->g * Alpha) / 255; CompPtr->r = ((UINTN)CompPtr->r * RevAlpha + (UINTN)TopPtr->r * Alpha) / 255; */ TopPtr++, CompPtr++; } TopBasePtr += TopLineOffset; CompBasePtr += CompLineOffset; } } VOID egComposeImage(IN OUT EG_IMAGE *CompImage, IN EG_IMAGE *TopImage, IN UINTN PosX, IN UINTN PosY) { UINTN CompWidth, CompHeight; CompWidth = TopImage->Width; CompHeight = TopImage->Height; egRestrictImageArea(CompImage, PosX, PosY, &CompWidth, &CompHeight); // compose if (CompWidth > 0) { if (CompImage->HasAlpha) { CompImage->HasAlpha = FALSE; egSetPlane(PLPTR(CompImage, a), 0, CompImage->Width * CompImage->Height); } if (TopImage->HasAlpha) egRawCompose(CompImage->PixelData + PosY * CompImage->Width + PosX, TopImage->PixelData, CompWidth, CompHeight, CompImage->Width, TopImage->Width); else egRawCopy(CompImage->PixelData + PosY * CompImage->Width + PosX, TopImage->PixelData, CompWidth, CompHeight, CompImage->Width, TopImage->Width); } } EG_IMAGE * egEnsureImageSize(IN EG_IMAGE *Image, IN UINTN Width, IN UINTN Height, IN EG_PIXEL *Color) { EG_IMAGE *NewImage; if (Image == NULL) return NULL; if (Image->Width == Width && Image->Height == Height) return Image; NewImage = egCreateFilledImage(Width, Height, Image->HasAlpha, Color); if (NewImage == NULL) { egFreeImage(Image); return NULL; } egComposeImage(NewImage, Image, 0, 0); egFreeImage(Image); return NewImage; } // // misc internal functions // VOID egInsertPlane(IN UINT8 *SrcDataPtr, IN UINT8 *DestPlanePtr, IN UINTN PixelCount) { UINTN i; for (i = 0; i < PixelCount; i++) { *DestPlanePtr = *SrcDataPtr++; DestPlanePtr += 4; } } VOID egSetPlane(IN UINT8 *DestPlanePtr, IN UINT8 Value, IN UINTN PixelCount) { UINTN i; for (i = 0; i < PixelCount; i++) { *DestPlanePtr = Value; DestPlanePtr += 4; } } VOID egCopyPlane(IN UINT8 *SrcPlanePtr, IN UINT8 *DestPlanePtr, IN UINTN PixelCount) { UINTN i; for (i = 0; i < PixelCount; i++) { *DestPlanePtr = *SrcPlanePtr; DestPlanePtr += 4, SrcPlanePtr += 4; } } /* EOF */ refit-0.14/libeg/libeg.h0000644000175000017500000001172311076137453014435 0ustar julienjulien/* * libeg/libeg.h * EFI graphics library header for users * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __LIBEG_LIBEG_H__ #define __LIBEG_LIBEG_H__ /* types */ /* This should be compatible with EFI_UGA_PIXEL */ typedef struct { UINT8 b, g, r, a; } EG_PIXEL; typedef struct { UINTN Width; UINTN Height; BOOLEAN HasAlpha; EG_PIXEL *PixelData; } EG_IMAGE; #define EG_EIPIXELMODE_GRAY (0) #define EG_EIPIXELMODE_GRAY_ALPHA (1) #define EG_EIPIXELMODE_COLOR (2) #define EG_EIPIXELMODE_COLOR_ALPHA (3) #define EG_EIPIXELMODE_ALPHA (4) #define EG_MAX_EIPIXELMODE EG_EIPIXELMODE_ALPHA #define EG_EICOMPMODE_NONE (0) #define EG_EICOMPMODE_RLE (1) #define EG_EICOMPMODE_EFICOMPRESS (2) typedef struct { UINTN Width; UINTN Height; UINTN PixelMode; UINTN CompressMode; const UINT8 *Data; UINTN DataLength; } EG_EMBEDDED_IMAGE; /* functions */ VOID egInitScreen(VOID); VOID egGetScreenSize(OUT UINTN *ScreenWidth, OUT UINTN *ScreenHeight); CHAR16 * egScreenDescription(VOID); BOOLEAN egHasGraphicsMode(VOID); BOOLEAN egIsGraphicsModeEnabled(VOID); VOID egSetGraphicsModeEnabled(IN BOOLEAN Enable); // NOTE: Even when egHasGraphicsMode() returns FALSE, you should // call egSetGraphicsModeEnabled(FALSE) to ensure the system // is running in text mode. egHasGraphicsMode() only determines // if libeg can draw to the screen in graphics mode. EG_IMAGE * egCreateImage(IN UINTN Width, IN UINTN Height, IN BOOLEAN HasAlpha); EG_IMAGE * egCreateFilledImage(IN UINTN Width, IN UINTN Height, IN BOOLEAN HasAlpha, IN EG_PIXEL *Color); EG_IMAGE * egCopyImage(IN EG_IMAGE *Image); VOID egFreeImage(IN EG_IMAGE *Image); EG_IMAGE * egLoadImage(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN BOOLEAN WantAlpha); EG_IMAGE * egLoadIcon(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN IconSize); EG_IMAGE * egDecodeImage(IN UINT8 *FileData, IN UINTN FileDataLength, IN CHAR16 *Format, IN BOOLEAN WantAlpha); EG_IMAGE * egPrepareEmbeddedImage(IN EG_EMBEDDED_IMAGE *EmbeddedImage, IN BOOLEAN WantAlpha); EG_IMAGE * egEnsureImageSize(IN EG_IMAGE *Image, IN UINTN Width, IN UINTN Height, IN EG_PIXEL *Color); EFI_STATUS egLoadFile(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, OUT UINT8 **FileData, OUT UINTN *FileDataLength); EFI_STATUS egSaveFile(IN EFI_FILE_HANDLE BaseDir OPTIONAL, IN CHAR16 *FileName, IN UINT8 *FileData, IN UINTN FileDataLength); VOID egFillImage(IN OUT EG_IMAGE *CompImage, IN EG_PIXEL *Color); VOID egFillImageArea(IN OUT EG_IMAGE *CompImage, IN UINTN AreaPosX, IN UINTN AreaPosY, IN UINTN AreaWidth, IN UINTN AreaHeight, IN EG_PIXEL *Color); VOID egComposeImage(IN OUT EG_IMAGE *CompImage, IN EG_IMAGE *TopImage, IN UINTN PosX, IN UINTN PosY); VOID egMeasureText(IN CHAR16 *Text, OUT UINTN *Width, OUT UINTN *Height); VOID egRenderText(IN CHAR16 *Text, IN OUT EG_IMAGE *CompImage, IN UINTN PosX, IN UINTN PosY); VOID egClearScreen(IN EG_PIXEL *Color); VOID egDrawImage(IN EG_IMAGE *Image, IN UINTN ScreenPosX, IN UINTN ScreenPosY); VOID egDrawImageArea(IN EG_IMAGE *Image, IN UINTN AreaPosX, IN UINTN AreaPosY, IN UINTN AreaWidth, IN UINTN AreaHeight, IN UINTN ScreenPosX, IN UINTN ScreenPosY); VOID egScreenShot(VOID); #endif /* __LIBEG_LIBEG_H__ */ /* EOF */ refit-0.14/libeg/libeg.mak0000644000175000017500000000251310425075304014744 0ustar julienjulien# # libeg/libeg.mak # Build control file for the libeg library # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name # BASE_NAME = libeg # # Globals needed by master.mak # TARGET_LIB = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) #!include .\makefile.hdr INC = -I . \ -I .\$(PROCESSOR) $(INC) # # Default target # all : dirs $(OBJECTS) # # Library object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\screen.obj \ $(BUILD_DIR)\image.obj \ $(BUILD_DIR)\text.obj \ $(BUILD_DIR)\load_bmp.obj \ $(BUILD_DIR)\load_icns.obj \ # # Source file dependencies # $(BUILD_DIR)\screen.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\image.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\text.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\load_bmp.obj : $(*B).c $(INC_DEPS) $(BUILD_DIR)\load_icns.obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak refit-0.14/libeg/libeg.mkefi0000644000175000017500000000020410425075304015262 0ustar julienjulien# # mkefi control file for libeg # name libeg type lib includedir . source screen.c image.c text.c load_bmp.c load_icns.c # EOF refit-0.14/libeg/libegint.h0000644000175000017500000000635210431626145015145 0ustar julienjulien/* * libeg/libegint.h * EFI graphics library internal header * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __LIBEG_LIBEGINT_H__ #define __LIBEG_LIBEGINT_H__ #include #include #include "libeg.h" /* types */ typedef EG_IMAGE * (*EG_DECODE_FUNC)(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN IconSize, IN BOOLEAN WantAlpha); /* functions */ VOID egRestrictImageArea(IN EG_IMAGE *Image, IN UINTN AreaPosX, IN UINTN AreaPosY, IN OUT UINTN *AreaWidth, IN OUT UINTN *AreaHeight); VOID egRawCopy(IN OUT EG_PIXEL *CompBasePtr, IN EG_PIXEL *TopBasePtr, IN UINTN Width, IN UINTN Height, IN UINTN CompLineOffset, IN UINTN TopLineOffset); VOID egRawCompose(IN OUT EG_PIXEL *CompBasePtr, IN EG_PIXEL *TopBasePtr, IN UINTN Width, IN UINTN Height, IN UINTN CompLineOffset, IN UINTN TopLineOffset); #define PLPTR(imagevar, colorname) ((UINT8 *) &((imagevar)->PixelData->colorname)) VOID egDecompressIcnsRLE(IN OUT UINT8 **CompData, IN OUT UINTN *CompLen, IN UINT8 *DestPlanePtr, IN UINTN PixelCount); VOID egInsertPlane(IN UINT8 *SrcDataPtr, IN UINT8 *DestPlanePtr, IN UINTN PixelCount); VOID egSetPlane(IN UINT8 *DestPlanePtr, IN UINT8 Value, IN UINTN PixelCount); VOID egCopyPlane(IN UINT8 *SrcPlanePtr, IN UINT8 *DestPlanePtr, IN UINTN PixelCount); EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN IconSize, IN BOOLEAN WantAlpha); EG_IMAGE * egDecodeICNS(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN IconSize, IN BOOLEAN WantAlpha); VOID egEncodeBMP(IN EG_IMAGE *Image, OUT UINT8 **FileData, OUT UINTN *FileDataLength); #endif /* __LIBEG_LIBEGINT_H__ */ /* EOF */ refit-0.14/libeg/load_bmp.c0000644000175000017500000002227110476564364015133 0ustar julienjulien/* * libeg/load_bmp.c * Loading function for BMP images * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libegint.h" // BMP structures #pragma pack(1) typedef struct { UINT8 Blue; UINT8 Green; UINT8 Red; UINT8 Reserved; } BMP_COLOR_MAP; typedef struct { CHAR8 CharB; CHAR8 CharM; UINT32 Size; UINT16 Reserved[2]; UINT32 ImageOffset; UINT32 HeaderSize; UINT32 PixelWidth; UINT32 PixelHeight; UINT16 Planes; // Must be 1 UINT16 BitPerPixel; // 1, 4, 8, or 24 UINT32 CompressionType; UINT32 ImageSize; // Compressed image size in bytes UINT32 XPixelsPerMeter; UINT32 YPixelsPerMeter; UINT32 NumberOfColors; UINT32 ImportantColors; } BMP_IMAGE_HEADER; #pragma pack() // // Load BMP image // EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN IconSize, IN BOOLEAN WantAlpha) { EG_IMAGE *NewImage; BMP_IMAGE_HEADER *BmpHeader; BMP_COLOR_MAP *BmpColorMap; UINTN x, y; UINT8 *ImagePtr; UINT8 *ImagePtrBase; UINTN ImageLineOffset; UINT8 ImageValue, AlphaValue; EG_PIXEL *PixelPtr; UINTN Index, BitIndex; // read and check header if (FileDataLength < sizeof(BMP_IMAGE_HEADER) || FileData == NULL) return NULL; BmpHeader = (BMP_IMAGE_HEADER *) FileData; if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') return NULL; if (BmpHeader->CompressionType != 0) return NULL; if (BmpHeader->BitPerPixel != 1 && BmpHeader->BitPerPixel != 4 && BmpHeader->BitPerPixel != 8 && BmpHeader->BitPerPixel != 24) return NULL; // calculate parameters ImageLineOffset = BmpHeader->PixelWidth; if (BmpHeader->BitPerPixel == 24) ImageLineOffset *= 3; else if (BmpHeader->BitPerPixel == 1) ImageLineOffset = (ImageLineOffset + 7) >> 3; else if (BmpHeader->BitPerPixel == 4) ImageLineOffset = (ImageLineOffset + 1) >> 1; if ((ImageLineOffset % 4) != 0) ImageLineOffset = ImageLineOffset + (4 - (ImageLineOffset % 4)); // check bounds if (BmpHeader->ImageOffset + ImageLineOffset * BmpHeader->PixelHeight > FileDataLength) return NULL; // allocate image structure and buffer NewImage = egCreateImage(BmpHeader->PixelWidth, BmpHeader->PixelHeight, WantAlpha); if (NewImage == NULL) return NULL; AlphaValue = WantAlpha ? 255 : 0; // convert image BmpColorMap = (BMP_COLOR_MAP *)(FileData + sizeof(BMP_IMAGE_HEADER)); ImagePtrBase = FileData + BmpHeader->ImageOffset; for (y = 0; y < BmpHeader->PixelHeight; y++) { ImagePtr = ImagePtrBase; ImagePtrBase += ImageLineOffset; PixelPtr = NewImage->PixelData + (BmpHeader->PixelHeight - 1 - y) * BmpHeader->PixelWidth; switch (BmpHeader->BitPerPixel) { case 1: for (x = 0; x < BmpHeader->PixelWidth; x++) { BitIndex = x & 0x07; if (BitIndex == 0) ImageValue = *ImagePtr++; Index = (ImageValue >> (7 - BitIndex)) & 0x01; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; PixelPtr->r = BmpColorMap[Index].Red; PixelPtr->a = AlphaValue; PixelPtr++; } break; case 4: for (x = 0; x <= BmpHeader->PixelWidth - 2; x += 2) { ImageValue = *ImagePtr++; Index = ImageValue >> 4; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; PixelPtr->r = BmpColorMap[Index].Red; PixelPtr->a = AlphaValue; PixelPtr++; Index = ImageValue & 0x0f; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; PixelPtr->r = BmpColorMap[Index].Red; PixelPtr->a = AlphaValue; PixelPtr++; } if (x < BmpHeader->PixelWidth) { ImageValue = *ImagePtr++; Index = ImageValue >> 4; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; PixelPtr->r = BmpColorMap[Index].Red; PixelPtr->a = AlphaValue; PixelPtr++; } break; case 8: for (x = 0; x < BmpHeader->PixelWidth; x++) { Index = *ImagePtr++; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; PixelPtr->r = BmpColorMap[Index].Red; PixelPtr->a = AlphaValue; PixelPtr++; } break; case 24: for (x = 0; x < BmpHeader->PixelWidth; x++) { PixelPtr->b = *ImagePtr++; PixelPtr->g = *ImagePtr++; PixelPtr->r = *ImagePtr++; PixelPtr->a = AlphaValue; PixelPtr++; } break; } } return NewImage; } // // Save BMP image // VOID egEncodeBMP(IN EG_IMAGE *Image, OUT UINT8 **FileDataReturn, OUT UINTN *FileDataLengthReturn) { BMP_IMAGE_HEADER *BmpHeader; UINT8 *FileData; UINTN FileDataLength; UINT8 *ImagePtr; UINT8 *ImagePtrBase; UINTN ImageLineOffset; EG_PIXEL *PixelPtr; UINTN x, y; ImageLineOffset = Image->Width * 3; if ((ImageLineOffset % 4) != 0) ImageLineOffset = ImageLineOffset + (4 - (ImageLineOffset % 4)); // allocate buffer for file data FileDataLength = sizeof(BMP_IMAGE_HEADER) + Image->Height * ImageLineOffset; FileData = AllocateZeroPool(FileDataLength); if (FileData == NULL) { Print(L"Error allocate %d bytes\n", FileDataLength); *FileDataReturn = NULL; *FileDataLengthReturn = 0; return; } // fill header BmpHeader = (BMP_IMAGE_HEADER *)FileData; BmpHeader->CharB = 'B'; BmpHeader->CharM = 'M'; BmpHeader->Size = FileDataLength; BmpHeader->ImageOffset = sizeof(BMP_IMAGE_HEADER); BmpHeader->HeaderSize = 40; BmpHeader->PixelWidth = Image->Width; BmpHeader->PixelHeight = Image->Height; BmpHeader->Planes = 1; BmpHeader->BitPerPixel = 24; BmpHeader->CompressionType = 0; BmpHeader->XPixelsPerMeter = 0xb13; BmpHeader->YPixelsPerMeter = 0xb13; // fill pixel buffer ImagePtrBase = FileData + BmpHeader->ImageOffset; for (y = 0; y < Image->Height; y++) { ImagePtr = ImagePtrBase; ImagePtrBase += ImageLineOffset; PixelPtr = Image->PixelData + (Image->Height - 1 - y) * Image->Width; for (x = 0; x < Image->Width; x++) { *ImagePtr++ = PixelPtr->b; *ImagePtr++ = PixelPtr->g; *ImagePtr++ = PixelPtr->r; PixelPtr++; } } *FileDataReturn = FileData; *FileDataLengthReturn = FileDataLength; } /* EOF */ refit-0.14/libeg/load_icns.c0000644000175000017500000001746610476564364015323 0ustar julienjulien/* * libeg/load_icns.c * Loading function for .icns Apple icon images * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libegint.h" // // Decompress .icns RLE data // VOID egDecompressIcnsRLE(IN OUT UINT8 **CompData, IN OUT UINTN *CompLen, IN UINT8 *PixelData, IN UINTN PixelCount) { UINT8 *cp; UINT8 *cp_end; UINT8 *pp; UINTN pp_left; UINTN len, i; UINT8 value; // setup variables cp = *CompData; cp_end = cp + *CompLen; pp = PixelData; pp_left = PixelCount; // decode while (cp + 1 < cp_end && pp_left > 0) { len = *cp++; if (len & 0x80) { // compressed data: repeat next byte len -= 125; if (len > pp_left) break; value = *cp++; for (i = 0; i < len; i++) { *pp = value; pp += 4; } } else { // uncompressed data: copy bytes len++; if (len > pp_left || cp + len > cp_end) break; for (i = 0; i < len; i++) { *pp = *cp++; pp += 4; } } pp_left -= len; } if (pp_left > 0) { Print(L" egDecompressIcnsRLE: still need %d bytes of pixel data\n", pp_left); } // record what's left of the compressed data stream *CompData = cp; *CompLen = (UINTN)(cp_end - cp); } // // Load Apple .icns icons // EG_IMAGE * egDecodeICNS(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN IconSize, IN BOOLEAN WantAlpha) { EG_IMAGE *NewImage; UINT8 *Ptr, *BufferEnd, *DataPtr, *MaskPtr; UINT32 BlockLen, DataLen, MaskLen; UINTN FetchPixelSize, PixelCount, i; UINT8 *CompData; UINTN CompLen; UINT8 *SrcPtr; EG_PIXEL *DestPtr; if (FileDataLength < 8 || FileData == NULL || FileData[0] != 'i' || FileData[1] != 'c' || FileData[2] != 'n' || FileData[3] != 's') { // not an icns file... return NULL; } FetchPixelSize = IconSize; for (;;) { DataPtr = NULL; DataLen = 0; MaskPtr = NULL; MaskLen = 0; Ptr = FileData + 8; BufferEnd = FileData + FileDataLength; // iterate over tagged blocks in the file while (Ptr + 8 <= BufferEnd) { BlockLen = ((UINT32)Ptr[4] << 24) + ((UINT32)Ptr[5] << 16) + ((UINT32)Ptr[6] << 8) + (UINT32)Ptr[7]; if (Ptr + BlockLen > BufferEnd) // block continues beyond end of file break; // extract the appropriate blocks for each pixel size if (FetchPixelSize == 128) { if (Ptr[0] == 'i' && Ptr[1] == 't' && Ptr[2] == '3' && Ptr[3] == '2') { if (Ptr[8] == 0 && Ptr[9] == 0 && Ptr[10] == 0 && Ptr[11] == 0) { DataPtr = Ptr + 12; DataLen = BlockLen - 12; } } else if (Ptr[0] == 't' && Ptr[1] == '8' && Ptr[2] == 'm' && Ptr[3] == 'k') { MaskPtr = Ptr + 8; MaskLen = BlockLen - 8; } } else if (FetchPixelSize == 48) { if (Ptr[0] == 'i' && Ptr[1] == 'h' && Ptr[2] == '3' && Ptr[3] == '2') { DataPtr = Ptr + 8; DataLen = BlockLen - 8; } else if (Ptr[0] == 'h' && Ptr[1] == '8' && Ptr[2] == 'm' && Ptr[3] == 'k') { MaskPtr = Ptr + 8; MaskLen = BlockLen - 8; } } else if (FetchPixelSize == 32) { if (Ptr[0] == 'i' && Ptr[1] == 'l' && Ptr[2] == '3' && Ptr[3] == '2') { DataPtr = Ptr + 8; DataLen = BlockLen - 8; } else if (Ptr[0] == 'l' && Ptr[1] == '8' && Ptr[2] == 'm' && Ptr[3] == 'k') { MaskPtr = Ptr + 8; MaskLen = BlockLen - 8; } } else if (FetchPixelSize == 16) { if (Ptr[0] == 'i' && Ptr[1] == 's' && Ptr[2] == '3' && Ptr[3] == '2') { DataPtr = Ptr + 8; DataLen = BlockLen - 8; } else if (Ptr[0] == 's' && Ptr[1] == '8' && Ptr[2] == 'm' && Ptr[3] == 'k') { MaskPtr = Ptr + 8; MaskLen = BlockLen - 8; } } Ptr += BlockLen; } /* FUTURE: try to load a different size and scale it later if (DataPtr == NULL && FetchPixelSize == 32) { FetchPixelSize = 128; continue; } */ break; } if (DataPtr == NULL) return NULL; // no image found // allocate image structure and buffer NewImage = egCreateImage(FetchPixelSize, FetchPixelSize, WantAlpha); if (NewImage == NULL) return NULL; PixelCount = FetchPixelSize * FetchPixelSize; if (DataLen < PixelCount * 3) { // pixel data is compressed, RGB planar CompData = DataPtr; CompLen = DataLen; egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, r), PixelCount); egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, g), PixelCount); egDecompressIcnsRLE(&CompData, &CompLen, PLPTR(NewImage, b), PixelCount); // possible assertion: CompLen == 0 if (CompLen > 0) { Print(L" egLoadICNSIcon: %d bytes of compressed data left\n", CompLen); } } else { // pixel data is uncompressed, RGB interleaved SrcPtr = DataPtr; DestPtr = NewImage->PixelData; for (i = 0; i < PixelCount; i++, DestPtr++) { DestPtr->r = *SrcPtr++; DestPtr->g = *SrcPtr++; DestPtr->b = *SrcPtr++; } } // add/set alpha plane if (MaskPtr != NULL && MaskLen >= PixelCount && WantAlpha) egInsertPlane(MaskPtr, PLPTR(NewImage, a), PixelCount); else egSetPlane(PLPTR(NewImage, a), WantAlpha ? 255 : 0, PixelCount); // FUTURE: scale to originally requested size if we had to load another size return NewImage; } /* EOF */ refit-0.14/libeg/Makefile0000644000175000017500000000034210424717761014637 0ustar julienjulien# # libeg/Makefile # Build control file for the libeg library # LOCAL_CPPFLAGS = -I. OBJS = screen.o image.o text.o load_bmp.o load_icns.o TARGET = libeg.a all: $(TARGET) include ../Make.common # EOF refit-0.14/libeg/mkegemb.py0000644000175000017500000001164710424717761015172 0ustar julienjulien#!/usr/bin/env python import sys, os.path import Image def enc_backbuffer(backbuffer): """Helper function for RLE compression, encodes a string of uncompressable data.""" compdata = [] if len(backbuffer) == 0: return compdata while len(backbuffer) > 128: compdata.append(127) compdata.extend(backbuffer[0:128]) backbuffer = backbuffer[128:] compdata.append(len(backbuffer)-1) compdata.extend(backbuffer) return compdata def compress_rle(rawdata): """Compresses the string using a RLE scheme.""" compdata = [] backbuffer = [] while len(rawdata) >= 3: c = rawdata[0] if rawdata[1] == c and rawdata[2] == c: runlength = 3 while runlength < 130 and len(rawdata) > runlength: if rawdata[runlength] == c: runlength = runlength + 1 else: break compdata.extend(enc_backbuffer(backbuffer)) backbuffer = [] compdata.append(runlength + 125) compdata.append(c) rawdata = rawdata[runlength:] else: backbuffer.append(c) rawdata = rawdata[1:] backbuffer.extend(rawdata) compdata.extend(enc_backbuffer(backbuffer)) return compdata def encode_plane(rawdata, planename): """Encodes the data of a single plane.""" rawlen = len(rawdata) compdata = compress_rle(rawdata) complen = len(compdata) print " plane %s: compressed %d to %d (%.1f%%)" % (planename, rawlen, complen, float(complen) / float(rawlen) * 100.0) return compdata ### main loop print "mkegemb 0.1, Copyright (c) 2006 Christoph Pfisterer" planenames = ( "blue", "green", "red", "alpha", "grey" ) for filename in sys.argv[1:]: origimage = Image.open(filename) (width, height) = origimage.size mode = origimage.mode data = origimage.getdata() print "%s: %d x %d %s" % (filename, width, height, mode) (basename, extension) = os.path.splitext(filename) identname = basename.replace("-", "_") # extract image data from PIL object planes = [ [], [], [], [] ] if mode == "RGB": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata[0]) planes[1].append(pixeldata[1]) planes[2].append(pixeldata[2]) elif mode == "RGBA": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata[0]) planes[1].append(pixeldata[1]) planes[2].append(pixeldata[2]) planes[3].append(pixeldata[3]) elif mode == "L": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata) planes[1].append(pixeldata) planes[2].append(pixeldata) else: print " Error: Mode not supported!" continue # special treatment for fonts if basename[0:4] == "font": if planes[0] != planes[1] or planes[0] != planes[2]: print " Error: Font detected, but it is not greyscale!" continue print " font detected, encoding as alpha-only" # invert greyscale values for use as alpha planes[3] = map(lambda x: 255-x, planes[0]) planes[0] = [] planes[1] = [] planes[2] = [] # encode planes imagedata = [] pixelformat = "EG_EIPIXELMODE" if len(planes[0]) > 0 and planes[0] == planes[1] and planes[0] == planes[2]: print " encoding as greyscale" imagedata.extend(encode_plane(planes[0], planenames[4])) pixelformat = pixelformat + "_GRAY" elif len(planes[0]) > 0: print " encoding as true color" imagedata.extend(encode_plane(planes[0], planenames[0])) imagedata.extend(encode_plane(planes[1], planenames[1])) imagedata.extend(encode_plane(planes[2], planenames[2])) pixelformat = pixelformat + "_COLOR" if len(planes[3]) > 0: if reduce(lambda x,y: x+y, planes[3]) == 0: print " skipping alpha plane because it is empty" else: imagedata.extend(encode_plane(planes[3], planenames[3])) pixelformat = pixelformat + "_ALPHA" # generate compilable header file output = "static const UINT8 egemb_%s_data[%d] = {\n" % (identname, len(imagedata)) for i in range(0, len(imagedata)): output = output + " 0x%02x," % imagedata[i] if (i % 12) == 11: output = output + "\n" output = output + "\n};\n" output = output + "static EG_EMBEDDED_IMAGE egemb_%s = { %d, %d, %s, EG_EICOMPMODE_RLE, egemb_%s_data, %d };\n" % (identname, width, height, pixelformat, identname, len(imagedata)) f = file("egemb_%s.h" % identname, "w") f.write(output) f.close() print "Done!" refit-0.14/libeg/screen.c0000644000175000017500000002207311076137453014625 0ustar julienjulien/* * libeg/screen.c * Screen handling functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libegint.h" #include #include #include // Console defines and variables static EFI_GUID ConsoleControlProtocolGuid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; static EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL; static EFI_GUID UgaDrawProtocolGuid = EFI_UGA_DRAW_PROTOCOL_GUID; static EFI_UGA_DRAW_PROTOCOL *UgaDraw = NULL; static EFI_GUID GraphicsOutputProtocolGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; static EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL; static BOOLEAN egHasGraphics = FALSE; static UINTN egScreenWidth = 800; static UINTN egScreenHeight = 600; // // Screen handling // VOID egInitScreen(VOID) { EFI_STATUS Status; UINT32 UGAWidth, UGAHeight, UGADepth, UGARefreshRate; // get protocols Status = LibLocateProtocol(&ConsoleControlProtocolGuid, (VOID **) &ConsoleControl); if (EFI_ERROR(Status)) ConsoleControl = NULL; Status = LibLocateProtocol(&UgaDrawProtocolGuid, (VOID **) &UgaDraw); if (EFI_ERROR(Status)) UgaDraw = NULL; Status = LibLocateProtocol(&GraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput); if (EFI_ERROR(Status)) GraphicsOutput = NULL; // get screen size egHasGraphics = FALSE; if (GraphicsOutput != NULL) { egScreenWidth = GraphicsOutput->Mode->Info->HorizontalResolution; egScreenHeight = GraphicsOutput->Mode->Info->VerticalResolution; egHasGraphics = TRUE; } else if (UgaDraw != NULL) { Status = UgaDraw->GetMode(UgaDraw, &UGAWidth, &UGAHeight, &UGADepth, &UGARefreshRate); if (EFI_ERROR(Status)) { UgaDraw = NULL; // graphics not available } else { egScreenWidth = UGAWidth; egScreenHeight = UGAHeight; egHasGraphics = TRUE; } } } VOID egGetScreenSize(OUT UINTN *ScreenWidth, OUT UINTN *ScreenHeight) { if (ScreenWidth != NULL) *ScreenWidth = egScreenWidth; if (ScreenHeight != NULL) *ScreenHeight = egScreenHeight; } CHAR16 * egScreenDescription(VOID) { if (egHasGraphics) { if (GraphicsOutput != NULL) { return PoolPrint(L"Graphics Output (UEFI), %dx%d", egScreenWidth, egScreenHeight); } else if (UgaDraw != NULL) { return PoolPrint(L"UGA Draw (EFI 1.10), %dx%d", egScreenWidth, egScreenHeight); } else { return L"Internal Error"; } } else { return L"Text Console"; } } BOOLEAN egHasGraphicsMode(VOID) { return egHasGraphics; } BOOLEAN egIsGraphicsModeEnabled(VOID) { EFI_CONSOLE_CONTROL_SCREEN_MODE CurrentMode; if (ConsoleControl != NULL) { ConsoleControl->GetMode(ConsoleControl, &CurrentMode, NULL, NULL); return (CurrentMode == EfiConsoleControlScreenGraphics) ? TRUE : FALSE; } return FALSE; } VOID egSetGraphicsModeEnabled(IN BOOLEAN Enable) { EFI_CONSOLE_CONTROL_SCREEN_MODE CurrentMode; EFI_CONSOLE_CONTROL_SCREEN_MODE NewMode; if (ConsoleControl != NULL) { ConsoleControl->GetMode(ConsoleControl, &CurrentMode, NULL, NULL); NewMode = Enable ? EfiConsoleControlScreenGraphics : EfiConsoleControlScreenText; if (CurrentMode != NewMode) ConsoleControl->SetMode(ConsoleControl, NewMode); } } // // Drawing to the screen // VOID egClearScreen(IN EG_PIXEL *Color) { EFI_UGA_PIXEL FillColor; if (!egHasGraphics) return; FillColor.Red = Color->r; FillColor.Green = Color->g; FillColor.Blue = Color->b; FillColor.Reserved = 0; if (GraphicsOutput != NULL) { // EFI_GRAPHICS_OUTPUT_BLT_PIXEL and EFI_UGA_PIXEL have the same // layout, and the header from TianoCore actually defines them // to be the same type. GraphicsOutput->Blt(GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)&FillColor, EfiBltVideoFill, 0, 0, 0, 0, egScreenWidth, egScreenHeight, 0); } else if (UgaDraw != NULL) { UgaDraw->Blt(UgaDraw, &FillColor, EfiUgaVideoFill, 0, 0, 0, 0, egScreenWidth, egScreenHeight, 0); } } VOID egDrawImage(IN EG_IMAGE *Image, IN UINTN ScreenPosX, IN UINTN ScreenPosY) { if (!egHasGraphics) return; if (Image->HasAlpha) { Image->HasAlpha = FALSE; egSetPlane(PLPTR(Image, a), 0, Image->Width * Image->Height); } if (GraphicsOutput != NULL) { GraphicsOutput->Blt(GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)Image->PixelData, EfiBltBufferToVideo, 0, 0, ScreenPosX, ScreenPosY, Image->Width, Image->Height, 0); } else if (UgaDraw != NULL) { UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)Image->PixelData, EfiUgaBltBufferToVideo, 0, 0, ScreenPosX, ScreenPosY, Image->Width, Image->Height, 0); } } VOID egDrawImageArea(IN EG_IMAGE *Image, IN UINTN AreaPosX, IN UINTN AreaPosY, IN UINTN AreaWidth, IN UINTN AreaHeight, IN UINTN ScreenPosX, IN UINTN ScreenPosY) { if (!egHasGraphics) return; egRestrictImageArea(Image, AreaPosX, AreaPosY, &AreaWidth, &AreaHeight); if (AreaWidth == 0) return; if (Image->HasAlpha) { Image->HasAlpha = FALSE; egSetPlane(PLPTR(Image, a), 0, Image->Width * Image->Height); } if (GraphicsOutput != NULL) { GraphicsOutput->Blt(GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)Image->PixelData, EfiBltBufferToVideo, AreaPosX, AreaPosY, ScreenPosX, ScreenPosY, AreaWidth, AreaHeight, Image->Width * 4); } else if (UgaDraw != NULL) { UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)Image->PixelData, EfiUgaBltBufferToVideo, AreaPosX, AreaPosY, ScreenPosX, ScreenPosY, AreaWidth, AreaHeight, Image->Width * 4); } } // // Make a screenshot // VOID egScreenShot(VOID) { EFI_STATUS Status; EG_IMAGE *Image; UINT8 *FileData; UINTN FileDataLength; UINTN Index; if (!egHasGraphics) return; // allocate a buffer for the whole screen Image = egCreateImage(egScreenWidth, egScreenHeight, FALSE); if (Image == NULL) { Print(L"Error egCreateImage returned NULL\n"); goto bailout_wait; } // get full screen image if (GraphicsOutput != NULL) { GraphicsOutput->Blt(GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)Image->PixelData, EfiBltVideoToBltBuffer, 0, 0, 0, 0, Image->Width, Image->Height, 0); } else if (UgaDraw != NULL) { UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)Image->PixelData, EfiUgaVideoToBltBuffer, 0, 0, 0, 0, Image->Width, Image->Height, 0); } // encode as BMP egEncodeBMP(Image, &FileData, &FileDataLength); egFreeImage(Image); if (FileData == NULL) { Print(L"Error egEncodeBMP returned NULL\n"); goto bailout_wait; } // save to file on the ESP Status = egSaveFile(NULL, L"screenshot.bmp", FileData, FileDataLength); FreePool(FileData); if (EFI_ERROR(Status)) { Print(L"Error egSaveFile: %x\n", Status); goto bailout_wait; } return; // DEBUG: switch to text mode bailout_wait: egSetGraphicsModeEnabled(FALSE); BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &Index); } /* EOF */ refit-0.14/libeg/text.c0000644000175000017500000000621510424717761014334 0ustar julienjulien/* * libeg/text.c * Text drawing functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "libegint.h" #include "egemb_font.h" #define FONT_CELL_WIDTH (7) #define FONT_CELL_HEIGHT (12) static EG_IMAGE *FontImage = NULL; // // Text rendering // VOID egMeasureText(IN CHAR16 *Text, OUT UINTN *Width, OUT UINTN *Height) { if (Width != NULL) *Width = StrLen(Text) * FONT_CELL_WIDTH; if (Height != NULL) *Height = FONT_CELL_HEIGHT; } VOID egRenderText(IN CHAR16 *Text, IN OUT EG_IMAGE *CompImage, IN UINTN PosX, IN UINTN PosY) { EG_PIXEL *BufferPtr; EG_PIXEL *FontPixelData; UINTN BufferLineOffset, FontLineOffset; UINTN TextLength; UINTN i, c; // clip the text TextLength = StrLen(Text); if (TextLength * FONT_CELL_WIDTH + PosX > CompImage->Width) TextLength = (CompImage->Width - PosX) / FONT_CELL_WIDTH; // load the font if (FontImage == NULL) FontImage = egPrepareEmbeddedImage(&egemb_font, TRUE); // render it BufferPtr = CompImage->PixelData; BufferLineOffset = CompImage->Width; BufferPtr += PosX + PosY * BufferLineOffset; FontPixelData = FontImage->PixelData; FontLineOffset = FontImage->Width; for (i = 0; i < TextLength; i++) { c = Text[i]; if (c < 32 || c >= 127) c = 95; else c -= 32; egRawCompose(BufferPtr, FontPixelData + c * FONT_CELL_WIDTH, FONT_CELL_WIDTH, FONT_CELL_HEIGHT, BufferLineOffset, FontLineOffset); BufferPtr += FONT_CELL_WIDTH; } } /* EOF */ refit-0.14/LICENSE.txt0000644000175000017500000000332010474603527013736 0ustar julienjulien rEFIt License =============== Copyright (c) 2006 Christoph Pfisterer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Christoph Pfisterer nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Additional Notice =================== Parts of the file system driver sub-projects are covered by the GNU GPL instead. See the LICENSE.txt files in the fs_ext2 and fsw directories for more information. refit-0.14/Make.common0000644000175000017500000000344410424645223014203 0ustar julienjulien# # Make.common # Common make rules for building with gnu-efi # EFIINC = /usr/include/efi GNUEFILIB = /usr/lib EFILIB = /usr/lib EFICRT0 = /usr/lib ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) CPPFLAGS = -I$(EFIINC) -I$(EFIINC)/$(ARCH) -I$(EFIINC)/protocol -DCONFIG_$(ARCH) OPTIMFLAGS = -O2 -fno-strict-aliasing DEBUGFLAGS = -Wall CFLAGS = $(OPTIMFLAGS) -mcpu=i386 -fpic -fshort-wchar $(DEBUGFLAGS) LDFLAGS = -nostdlib -znocombreloc prefix = /usr/bin/ CC = $(prefix)gcc AS = $(prefix)as LD = $(prefix)ld AR = $(prefix)ar RANLIB = $(prefix)ranlib OBJCOPY = $(prefix)objcopy ifeq ($(ARCH),ia64) # EFI specs allows only lower floating point partition to be used CFLAGS += -frename-registers -mfixed-range=f32-f127 endif CRTOBJS = $(EFICRT0)/crt0-efi-$(ARCH).o LDSCRIPT = $(EFICRT0)/elf_$(ARCH)_efi.lds LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L$(EFILIB) -L$(GNUEFILIB) $(CRTOBJS) LIBS = -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name) FORMAT = efi-app-$(ARCH) # general rules %.o: %.c $(CC) $(LOCAL_CPPFLAGS) $(CPPFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) -c $< -o $@ # rules for EFI applications ifneq (,$(filter %.efi,$(TARGET))) SHLIB_TARGET = $(subst .efi,.so,$(TARGET)) $(SHLIB_TARGET): $(OBJS) $(LD) $(LOCAL_LDFLAGS) $(LDFLAGS) $(OBJS) -o $@ $(LOCAL_LIBS) $(LIBS) $(TARGET): $(SHLIB_TARGET) $(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ -j .rela -j .reloc --target=$(FORMAT) $< $@ endif # rules for libraries ifneq (,$(filter %.a,$(TARGET))) $(TARGET): $(OBJS) $(AR) cq $@ $(OBJS) endif # utility rules clean: rm -f $(TARGET) *~ *.so $(OBJS) # EOF refit-0.14/partinsp/0000755000175000017500000000000011363100432013736 5ustar julienjulienrefit-0.14/partinsp/Analyzer.h0000644000175000017500000000467310570501016015710 0ustar julienjulien/* * partinsp/Analyzer.h * Partition Inspector UI controller class * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @interface Analyzer : NSObject { @private NSString *report; NSAttributedString *attrReport; NSMutableDictionary *attr; BOOL inPhase1; BOOL inPhase2; BOOL inPhase3; } // init - (id)init; // accessors - (NSString *)report; - (void)setReport:(NSString *)newReport; - (NSAttributedString *)attrReport; - (void)setAttrReport:(NSAttributedString *)newReport; - (BOOL)isInPhase1; - (void)setInPhase1:(BOOL)newFlag; - (BOOL)isInPhase2; - (void)setInPhase2:(BOOL)newFlag; - (BOOL)isInPhase3; - (void)setInPhase3:(BOOL)newFlag; // actions - (IBAction)startAnalysis:(id)sender; - (IBAction)visitHomePage:(id)sender; - (IBAction)visitHelpPage:(id)sender; // analyzing - (void)analyze; - (void)reportCallback:(NSString *)report; // delegates - (BOOL)windowShouldClose:(id)sender; @end refit-0.14/partinsp/Analyzer.m0000644000175000017500000001217610570501016015712 0ustar julienjulien/* * partinsp/Analyzer.m * Partition Inspector UI controller class * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import "Analyzer.h" #import "ToolRunner.h" @implementation Analyzer // init - (id)init { self = [super init]; if (self) { report = nil; attrReport = nil; attr = nil; inPhase1 = YES; inPhase2 = NO; inPhase3 = NO; } return self; } - (void)dealloc { [report release]; [attrReport release]; [attr release]; [super dealloc]; } - (void)awakeFromNib { } // accessors - (NSString *)report { return report; } - (void)setReport:(NSString *)newReport { [report autorelease]; report = [newReport retain]; if (attr == nil) { attr = [[NSMutableDictionary dictionary] retain]; NSFontManager *mgr = [NSFontManager sharedFontManager]; NSFont *font = [mgr fontWithFamily:@"Monaco" traits:NSUnboldFontMask|NSUnitalicFontMask weight:5 size:11]; [attr setObject:font forKey:NSFontAttributeName]; } NSAttributedString *newAttrReport = [[[NSAttributedString alloc] initWithString:report attributes:attr] autorelease]; [self setAttrReport:newAttrReport]; } - (NSAttributedString *)attrReport { return attrReport; } - (void)setAttrReport:(NSAttributedString *)newAttrReport { [attrReport autorelease]; attrReport = [newAttrReport retain]; } - (BOOL)isInPhase1 { return inPhase1; } - (void)setInPhase1:(BOOL)newFlag { inPhase1 = newFlag; } - (BOOL)isInPhase2 { return inPhase2; } - (void)setInPhase2:(BOOL)newFlag { inPhase2 = newFlag; } - (BOOL)isInPhase3 { return inPhase3; } - (void)setInPhase3:(BOOL)newFlag { inPhase3 = newFlag; } // actions - (IBAction)startAnalysis:(id)sender { [self setInPhase1:NO]; [self setInPhase2:YES]; [self performSelectorOnMainThread:@selector(analyze) withObject:nil waitUntilDone:NO]; } - (IBAction)visitHomePage:(id)sender { NSString *pageURLString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CYProductHomePage"]; if (pageURLString != nil) [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:pageURLString]]; } - (IBAction)visitHelpPage:(id)sender { NSString *pageURLString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CYProductHelpPage"]; if (pageURLString != nil) [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:pageURLString]]; } // analyzing - (void)analyze { ToolRunner *runner = [[ToolRunner alloc] initWithLaunchPath:[[NSBundle mainBundle] pathForResource:@"showpart" ofType:nil] arguments:[NSArray arrayWithObject:@"/dev/rdisk0"] callbackSelector:@selector(reportCallback:) callbackObject:self]; [runner launchTool]; } - (void)reportCallback:(NSString *)toolReport { if (toolReport == nil) { [self setInPhase1:YES]; [self setInPhase2:NO]; return; } [self setReport:[NSString stringWithFormat:@"\n*** Report for internal hard disk ***\n%@", toolReport]]; NSPasteboard *pb = [NSPasteboard generalPasteboard]; [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; [pb setString:report forType:NSStringPboardType]; [self setInPhase2:NO]; [self setInPhase3:YES]; } // delegates - (BOOL)windowShouldClose:(id)sender { [NSApp terminate:sender]; return YES; } @end refit-0.14/partinsp/English.lproj/0000755000175000017500000000000011363100432016454 5ustar julienjulienrefit-0.14/partinsp/English.lproj/InfoPlist.strings0000644000175000017500000000077611344755516022032 0ustar julienjulienџў/* Localized versions of Info.plist keys */ CFBundleName = "Partition Inspector"; CFBundleGetInfoString = "0.14, released March 7, 2010. Copyright Љ 2006-2010 Christoph Pfisterer"; NSHumanReadableCopyright = "Copyright Љ 2006-2010 Christoph Pfisterer"; refit-0.14/partinsp/English.lproj/MainMenu.nib/0000755000175000017500000000000011344764622020754 5ustar julienjulienrefit-0.14/partinsp/English.lproj/MainMenu.nib/classes.nib0000644000175000017500000000051210570501016023063 0ustar julienjulien{ IBClasses = ( { ACTIONS = {startAnalysis = id; visitHelpPage = id; visitHomePage = id; }; CLASS = Analyzer; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; } ); IBVersion = 1; }refit-0.14/partinsp/English.lproj/MainMenu.nib/info.nib0000644000175000017500000000111610570501016022362 0ustar julienjulien IBDocumentLocation 571 136 356 240 0 0 1440 878 IBEditorPositions 29 101 327 359 44 0 0 1440 878 IBFramework Version 446.1 IBOpenObjects 29 21 IBSystem Version 8L2127 refit-0.14/partinsp/English.lproj/MainMenu.nib/keyedobjects.nib0000644000175000017500000005124710570501016024114 0ustar julienjulienbplist00д Y$archiverX$versionT$topX$objects_NSKeyedArchiver† б ]IB.objectdata€ЏO 159@CFKefghks{Ž”ЄЈКЛХЭбдимртфєњ§ыќ &ќУ'+./067<=?BNOPT]O^_blm|}…†‰Ž”•™ЅІЙвКМРУЫЬгдлмуфхчшщъыюђ"289:?@AEIJMPTX_`cgnrstw{‚ƒ„‡‹’—˜›ЁЈ­ЎЏВЗОПТЧЯабвзоапрхьэюђљ§ўџ "&-./26=>?BFMNORV]abcfjqrsvz‚ƒ‡Ž‘•œžЂЉЊЋЏЗЛМНОТЩЪНЫЯжзНимфхНцъёђѓєјџ $%&)1234BCDEFGH123PBCDEFG^cdl2mnBCDEF|G}l2m…BCDEFG“›2œBCDEFGЋАБЖНСТУШЯабв'12139;DI2JL[ckt2uw‚†‡Š‘™šЁЂЃЌ2­ЏНФХЦ€2Язопрчшщ№ёљњџf2f'/678A2BGILMUVˆ2_љ2hikЗюL%'+,-ТL#./2369:-<?BLL#EFIKˆLELMPSНT2#VWYZ[\_`abcfiнQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰ЖŠ‹ŒŽ‘’“”•Y–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПТХШU$nullп  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootЃKийЄзMк€N€hЅPL€€€в234[NSClassName€€в678YNS.string]NSApplication€в:;<=X$classesZ$classnameЃ=>?_NSMutableStringXNSStringXNSObjectв:;ABЂB?^NSCustomObjectв6D8_IBCocoaFramework€вGHJZNS.objectsЁI€€gнLMNOPQRSTUVWXYZ[\]^_`abcd_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass_NSFrameAutosaveName€c€ € € €b€d€ px€f€ €e_{{146, 461}, {480, 360}}_Partition InspectorXNSWindowв6i8TView€дlmno.qrZNSSubviews_NSNextResponderWNSFrame€€€`€aвGtzЅuvwxy€€C€P€X€\€лlm|}n~€‚ƒ``†‡ˆ‰Š‹†[NSSuperview]NSNextKeyView[NSHScrollerXNSvFlagsXNSsFlags[NSVScroller]NSContentView€€ € €€A€>џџџџ€€:€€BвGzЃ†‹ˆ€€:€>€лlm|}•–—˜n™uuœœŸ ЁЂЃYNSBGColorYNSDocViewYNScvFlagsXNSCursor€€€€€€€6€5 €9вGЅzЁœ€€лЉm|ЊЋSЌ­ЎЏ††ВГД.ЖЗИЙ[NSFrameSizeXNSMinize\NSSharedDataZNSDelegateYNSTVFlags_NSTextContainer€€€€3€€2€ €4€Y{423, 14}еМНОПРœТУФWNSWidthZNSTextView_NSLayoutManagerYNSTCFlags"Cг€€€€еЦЧЌШЩЖ.ЫЬ]NSTextStorageYNSLMFlags_NSTextContainers€€€€гЌ>.Яа€€€в6в8P€в:;еЦЄЦжз?_NSMutableAttributedString_NSAttributedStringвGйzЁЙ€€в:;ноЃоп?^NSMutableArrayWNSArrayв:;сОЂО?в:;уЎЂЎ?ихцчшщъыьэ.я№ё._NSSelectedAttributesWNSFlags_NSDefaultParagraphStyle_NSInsertionColor_NSLinkAttributes_NSMarkedAttributes_NSBackgroundColor€"+a€€!€,€1€€гѕіїјљWNSWhite\NSColorSpaceB1€ в:;ћќЂќ?WNSColorгѕіўјљB0€ гGWNS.keysЂ€%€)Ђ€#€$€+еќ і   Жљ[NSColorName]NSCatalogName€(€'€&€ VSystem_selectedTextBackgroundColorгѕіјљK0.66666669€ еќ і яЖљ€!€*€&€ _selectedTextColorв:;Ђ?\NSDictionaryгG"Ђ !€/€0Ђ#$€-€.€+[NSUnderlineг(і)УљUNSRGBF0 0 1€ в:;,-Ђ-?_NSTextViewSharedData\{434, 1e+07}X{114, 0}в:;1НІН2345?[%NSTextViewVNSTextVNSView[NSResponder_{{1, 1}, {423, 276}}г89:У;YNSHotSpot\NSCursorType€7€8W{4, -5}в:;>˜Ђ˜?в:;@AЄA45?ZNSClipViewиm|CDnEuuHuJKLMZNSCurValueXNSTargetXNSAction€€"?€€€;€=€<_{{424, 1}, {15, 276}}\_doScroller:в:;QRЅRS45?ZNSScrollerYNSControlкm|CDn€UEuuHuYKУL[\YNSPercent€€€€?€="?rC€@_{{-100, -100}, {87, 18}}_{{20, 20}, {440, 278}}в:;`aЄa45?\NSScrollViewзm|ncd``ghijkYNSEnabledVNSCell€ € €D џџџџ€ €O€E_{{17, 306}, {446, 34}}иыnopqrstuvwvyz{[NSTextColorYNSSupportZNSContents]NSControlView[NSCellFlags\NSCellFlags2€J€L€G€F€C€Nў@_pYour report is ready now. It has been copied to the clipboard for easy pasting into e-mails and supports forums.д~€‚ƒ„VNSSizeVNSNameXNSfFlags"AP€H€I\LucidaGrandeв:;‡ˆЂˆ?VNSFontеќ і  ‹Жљ€(€K€&€ \controlColorеќ і я‘Жљ€!€M€&€ _controlTextColorв:;–—Є—˜d?_NSTextFieldCell\NSActionCellв:;š›І›œS45?[NSTextField\%NSTextFieldзm|ncd`` hЂЃЄ€ € €Q  €W€R_{{195, 141}, {90, 32}}нЇЈopqЉЊЋЌr­sЎvvБwУГДЕЖzЗИ_NSKeyEquivalent_NSAlternateImage^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay_NSAlternateContents€U€G€G€S€Pџџџџ†‚@џ€VШ€TWAnalyzeв6в8€в:;НОЅОП˜d?\NSButtonCell]%NSButtonCellв:;СТЅТS45?XNSButtonзm|ncd``ЦhШjЪ€ € €Y  €O€Z_{{17, 221}, {445, 119}}иыnopqrstuvаxyz{€J€L€G€[€X€No‡Welcome to Partition Inspector. This tool compiles a report about the partition setup of the internal hard disk. The report can help you track down problems with Boot Camp, rEFIt, or Linux. To continue, click the Analyze  button below. You will be asked for your password to authorize low-level access to the hard disk. This tool is read-only; it will not change anything on the hard disk.зm|ncd``зhijк€ € €] €O€^_{{17, 323}, {446, 17}}иыnopqrstuvрyyz{€J€L€G€_€\€N_"Preparing the report, please wait._{{1, 9}, {480, 360}}в:;ц4Ѓ45?_{{0, 0}, {1440, 878}}Z{480, 382}_{3.40282e+38, 3.40282e+38}Xpartshowв:;ьэЂэ?_NSWindowTemplateв:;я№Ѓ№ё?\NSMutableSetUNSSetвGѓzЏ'єѕіїјљњћќ§ўџ     €i€w€{€€†€‹€‘€•€š€Ÿ€Ѓ€Љ€Ў€Г€И€Н€Т€Ш€Э€б€ж€к€о€ф€щ€ю€ѓ€ј€§  ".9DFK€г !WNSLabelXNSSource€u€v€jи#$%&'()*+,-./01VNSMenu]NSMnemonicLoc_NSKeyEquivModMaskWNSTitleYNSOnImageZNSKeyEquiv\NSMixedImage€kџџџ€l€n€m€r€tд&34567[NSMenuItemshkWiXMinimizeQmг;2<=>^NSResourceName€p€q€oWNSImage_NSMenuCheckmarkв:;BCЃCD?_NSCustomResource_%NSCustomResourceг;2F=>€s€q€o_NSMenuMixedStateв:;KLЂL?ZNSMenuItemв6N8_performMiniaturize:€в:;QRЃRS?_NSNibControlConnector^NSNibConnectorгU W€z€v€xи#$%&'()*+,Z.З01€k€y€n€T€r€t_Bring All to Frontв6a8_arrangeInFront:€гd f€€€v€|и#$%&'()h+,i.k01€}€~€n€€r€tг&3o6qrWsfPrint &Qpв6u8Vprint:€гx z€…€v€‚и#$%&'()h+,}.01€}€ƒ€n€„€r€tkPage Setup &QPв6…8^runPageLayout:€гˆ ЀЀv€‡и#$%&'()Œ+,.З01€ˆ€‰€n€T€r€tд&3“”6–egWfZClear Menuв6™8_clearRecentDocuments:€дœ0ž  ]NSDestination€€€v€Œи#$%&'()Ђ+,Ѓ.Ѕ01€€Ž€n€€r€tд&3ЉЊ6ЌŒšW_Quit Partition InspectorQqв6А8Zterminate:€дœ0Д Ж€€”€v€’з#$&'()Ђ+Й.З01€€“€n€T€r€t_About Partition Inspectorв6Р8_orderFrontStandardAboutPanel:€дœ0Ф Ц€€™€v€–и#$%&'()Ђ+ЩЪ.Ь01€€—€n€˜€r€t[Hide OthersQh_hideOtherApplications:дœ0д ж€€ž€v€›и#$%&'()Ђ+,й.л01€€œ€n€€r€t_Hide Partition InspectorUhide:дœ0т ф€€Ђ€v€ и#$%&'()Ђ+,ч.З01€€Ё€n€T€r€tXShow All_unhideAllApplications:гя ё€Ј€v€Єи#$%&'()ѓ+,є.і01€Ѕ€І€n€Ї€r€tг&3њ6ќ\W]SCutQxв68Tcut:€г €­€v€Њи#$%&'()ѓ+,. 01€Ѕ€Ћ€n€Ќ€r€tUPasteQvв68Vpaste:€г €В€v€Џи#$%&'()ѓ+,.01€Ѕ€А€n€Б€r€tTRedoQZв6 8Uredo:€г# %€З€v€Ди#$%&'()ѓ+,(.*01€Ѕ€Е€n€Ж€r€tZSelect AllQaв608ZselectAll:€г3 5€М€v€Йи#$%&'()ѓ+,8.:01€Ѕ€К€n€Л€r€tTUndoQzв6@8Uundo:€гC E€С€v€Ои#$%&'()ѓ+,H.J01€Ѕ€П€n€Р€r€tTCopyQcв6P8Ucopy:€гS U€Ч€v€Уи#$%&'()W+,X.Z01€Ф€Х€n€Ц€r€tг&3^6`UWViSpelling &Q:в6d8_showGuessPanel:€гg i€Ь€v€Щи#$%&'()W+,l.n01€Ф€Ъ€n€Ы€r€t^Check SpellingQ;в6t8^checkSpelling:€гw y€а€v€Юи#$%&'()W+,|.З01€Ф€Я€n€T€r€t_Check Spelling as You Type_toggleContinuousSpellChecking:г„ †€е€v€ви#$%&'()h+,‰.‹01€}€г€n€д€r€tUCloseQw]performClose:г’ ”€й€v€зи#$%&'()ѓ+,—.З01€Ѕ€и€n€T€r€tVDeleteWdelete:гŸ Ё€н€v€ли#$%&'()*+,Є.З01€k€м€n€T€r€tTZoom\performZoom:гЌ Ў€у€v€пй#$%&'()АБ+,В.Д01УUNSTag€р€с€n€т€r€tг&3И6КcWdeFind &Qf_performFindPanelAction:гП С€ш€v€хй#$%&'()АБ+,Ф.Ц01Y€р€ц€n€ч€r€tYFind NextQgгЬ Ю€э€v€ъй#$%&'()АБ+,б.г01ј€р€ы€n€ь€r€t]Find PreviousQGгй л€ђ€v€яй#$%&'()АБ+,о.р01у€р€№€n€ё€r€t_Use Selection for FindQeгч щ€ї€v€єи#$%&'()Б+,ь.ю01€р€ѕ€n€і€r€t_Jump to SelectionQj_centerSelectionInVisibleArea:гѕ ї€ќ€v€љи#$%&'()ѓ+Щњ.ќ01€Ѕ€њ€n€ћ€r€t_Paste and Match StyleQV_pasteAsPlainText:дœœI€€ў€џ€_initialFirstResponderв:;  Ѓ S?_NSNibOutletConnectorиœ  YœYNSKeyPath_NSNibBindingConnectorVersionYNSBindingYNSOptions €в23€XAnalyzer_attributedString: attrReport_attributedStringZattrReportгG!Ё Ё"€+_NSConditionallySetsEditableв:;'(Ѓ(S?_NSNibBindingConnectorиœ  +,Y-.u    €_hidden: inPhase3VhiddenXinPhase3гG5;Ѕ   9 €/€/€/€/Ѕ<=>?@€+_NSNotApplicablePlaceholder_NSNullPlaceholder_NSNoSelectionPlaceholder_NSValueTransformerName_NSMultipleValuesPlaceholder_NSNegateBooleanиœ  JKYLMv €CгGQWЅ   U €/€/€/€/ЅXYZ[\€+дœ` w!€v€P^startAnalysis:иœ  fgYhiw%#$& €P_hidden: inPhase1XinPhase1гGouЅpppsp,,,-,Ѕvwxyz'()*+€+иœ  €Y‚x1/02 €XгG†ŒЅpppŠp,,,8,ЅŽ‘34567€+иœ  •–Y—˜y<:;= €\_hidden: inPhase2XinPhase2гGžЄЅ   Ђ €/€/€/C€/ЅЅІЇЈЉ>?@AB€+дœ­IE€џ€XdelegateдœГ ЕJ€vGи#$%&'()З+,И.З01HI€n€T€r€tг&3О6Р„W…]rEFIt Website]visitHomePageдœХ ЧO€vLи#$%&'()З+,Ъ.Ь01HM€nN€r€t_rEFIt DocumentationQ?]visitHelpPageвGгЏI`ЎvŠиЮкwмѓŒ*лxжzфхцhёїъыЗэWяWyС†єЦіЧЖIщћЕ§ў”EЂfUœ5ф Б !% uyЁi€ €п€C€‡Q€ъR€PX€Ѕ€ˆ€k€я€X€›€‚lo_€}€Є€љ~zH^€x†€Ф€Ю€х€вt€–YL€’€€є`Gj›€з€О’€€|€У€žŽ€Й€ ™€рw€j€Дƒ€Њ‰€Œ{•€€\€л€Щ€ЏЂй#$%&'()Ђ+,З.З01h]NSIsSeparator€€T€n€T€r€t к#$%(&'()Eѓ+,W+.З010YNSSubmenu€Ѕ€ФS€n€T€r€tTXSpelling^submenuAction:вG4zЃUiy€У€Щ€Ю€в:;:#Ђ#?к#$%(&'()Eі+,ѓ>.З01CY€ЅZ€n€T€r€t[д&3EF6H‡ЁWˆTEditв6I8€вGMzЌ5эёEї”%цћк€Й€Џ^€Є€О€Њ€љ€з€Д_`R€й#$%&'()ѓ+,З.З01h€Ѕ€T€n€T€r€t й#$%&'()ѓ+,З.З01h€Ѕ€T€n€T€r€t к#$%(&'()Eѓ+,Бn.З01s€Ѕ€рa€n€T€r€tbTFindв6t8€вGxzЅЎСЮлщ€п€х€ъ€я€є€в6€8[Open Recent€вGƒzЁŠ€‡€__NSRecentDocumentsMenuв6ˆ8VWindow€вG‹zЄ!Ё§W€j€лj€x€й#$%&'()*+,З.З01h€k€T€n€T€r€t ^_NSWindowsMenuи#$%&'()h+,œ.ž01€}m€nn€r€tSNewQnк#$%(&'()Eі+,hІ.З01ЋY€}p€n€T€r€tqTFileв6Ќ8€вGАzЋфє ы†ъzfltwz€в{~ƒ€‚€|€и#$%&'()h+,П.С01€}u€nv€r€tWOpen...Qoк#$%(&'()Eh+,ŒЩ.З01Ю€}€ˆx€n€T€r€tyй#$%&'()h+,З.З01h€}€T€n€T€r€t и#$%&'()h+,й.л01€}|€n}€r€tTSaveQsи#$%&'()h+,т.ф01€}€n€€r€thSave As &QSз#$&'()h+ы.З01€}‚€n€T€r€tVRevertй#$%&'()h+,З.З01h€}€T€n€T€r€t THelpвGћzЂЧЕLG€й#$%&'()Ђ+,З.З01h€€T€n€T€r€t XMainMenuвG zЅхмў‰oX›ž€к#$%(&'()Eі+,Ђ.З01Y€Š€n€T€r€t‹вGzЋЖя жЦфи €’ށ†’™€›€–€ Q€Œ€й#$%&'()Ђ+,З.З01h€€T€n€T€r€t и#$%&'()Ђ+,1.301€€n‘€r€tlPreferences &Q,к#$%(&'()EЂ+,;.З01@€•“€n€T€r€t”XServicesд&3CD6F–˜W—в6A8€вGJz €__NSServicesMenuй#$%&'()Ђ+,З.З01h€€T€n€T€r€t \_NSAppleMenuк#$%(&'()Eі+,*Y.З01^Y€kœ€n€T€r€tк#$%(&'()Eі+,Зb.З01gYHŸ€n€T€r€t [_NSMainMenuв:;jпЂп?вGlЏIIБ`ŒЂБѓ`ім ўБ`Ђhhіѓхѓѓhhѓ*ЂкWБhhЂ0ЗЂ0БѓЗ*іѓѓЂhhWuіЂѓЂЂћh*ѓ0hѓіЂh`Ђ`*Wѓ€€р€ €ˆ€€р€Ѕ€ YXw›€р€ €€}€}Y€Ѕo€Ѕ€Ѕ€}€}ž€Ѕ€k€R€Ф€р€}€}€€H€€€р€ЅH€kY€Ѕ€Ѕ€€}‰€}€Ф€Y€€Ѕ€€`€}€k€Ѕ€€}€ЅY€€}’€ €€ €k€Ф€ЅЂвGИЏ4Ў*vкЮwмѓxzл0фцхhёъыЗэyWС†єіћЧIщ§”EfUœ5Б%y ui€п€k€CR€ъ€PX€Ѕ€X€‚€я€l_o€}€Є~zH^€Ю€Ф€х€вtY`L€€єj€з€О€|€У€ž€Й€р€Дƒ€Њ€\€Œ{€€Щ€ЏЂвGяЏ4№ёђѓєѕіїјљњћќ§ўўў  ў ў !"#ІЇЉЊЋЌ­ЎЏАБВГДЕЕЖЗИЙКЛМНОЕПРЕСТЕУФХЦЧШЩЪЫЬЭЮЯабвгдежЂб&Јв:;()Ѓ)*?VNSNullW%NSNull\NSTextField2\NSMenuItem13[NSMenuItem3]NSTextField21в608Q5€[NSMenuItem2в648\File's Owner€в678Q9€\NSMenuItem12в6в8€в6=8Q8€в6@8Q7€в6C8Q2€[NSMenuItem4в6G8Q1€в68€[NSMenuItem7[NSMenuItem1в6N8R10€в6Q8Q6€[NSMenuItem6в6G8€\NSMenuItem10в6C8€[NSMenuItem9^NSTextField211T1111в6]8Q3€]NSScrollView2S121[NSMenuItem8\NSMenuItem11вGd ЂвGg ЂвGjЏq *цѓ!œіњіїыŠжfћЖщяhWWўџ%ёБЂ§EIъzиЁ 5†yvлЕ љŒкє ”Чћ`iф ѕ0Сuy ўэїќЗwфЮ јUЦєxх §Ўм€Œ€Н€k_€ЅF€Џ€j€Њ€€{€‘Y€z€‡€›€Э€|€•€б€’€є†€}€ѓ€Ф€x€Ѓ€Љ€Д€Є.€р€j€О€~9€‚Q€л™€Й€ж €в€Ю€C€яG€Т‰€ф€‹€Ў€ˆR•€i€щ€зL`K€ €ГD{€Щ€ €ю€w€€х€"€\€ШwŽ€§’ž›^€љ€šƒ H€Pl€ъ€о€И€†€У€–t€ј€Xo€к€Ÿ€пXЂвGоЏqпрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ      !"#$%&'()*+, ./0123456789:;<=>?@ABCDEFGHIJKLMNOлмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ      !"#$%&'(€/)*+,-./0123456789:;<=>?@ABCDEFGHIJЂˆЕЎЉ­ЋЯVŽWO~†РNp’С:›QЫЙЏАЌа ћŸ9\PM•ХžУьIПйЁМ8‹Ви}И‚%ЩЄoЈГKН–Ъ'ЇЮѕќО|ФгƒgœЬ˜JфjмRЂЧДЛъ‘HЭыSЦ™šЃвGРz €вGУ ЂвGЦ Ђв:;ЩЪЂЪ?^NSIBObjectData#,1:LQVdfYk‡™ЄАОкчњ+EQ_ipsvy|‚…ˆŠ’•˜šœŸЁЊЖИКУЭлнцяњ%.3BK^`itwy{АФжрюќ  -7CY[]_acegikprtv‘ЇАЙОРбмюіјњќў         K W e q z ƒ   Ÿ Ё Ѓ Ѕ Ї Љ В Д Ж И К У Ъ Ь Ю а в џ   & ( * , . 0 2 4 6 8 ; = F I K M z †  œ Ї Б У Х Ч Щ Ы Э Я б г ж и к ф љ   ( - / 1 3 5 J X b u w y { } Š Œ Ž  ™ š œ Ѕ Ў Ъ п ш ы э я ј џ    $ - 2 S j r Œ Ÿ В Ч л н р т ф ц ш ъ ь љ       # + 8 ; = J R W Y [ ` b d f { ‡ • — ™ ›  Є Т Я л н ђ є і ј њ)6;=?DFHJVcipr{€—Є­ЖУЯжнщ $&(09>GP[|‡™›ЂЄІЉЋ­Хвлцёћ$.02468=?Zs|…’ЏЙРТФЦЧавдэ$/=IVXZ\^`bglп№їў  ).5JLNPR_tvxz|˜ЁГРЩжтя 3hzœБПбчщыэяёѓќў#.;IR]fƒ…‡‰Š‘ЋЬЮавджиъ   +LNPRTVX}”ЄМЧфэіћ+1:‹‘“•—™›ŸЁЃЅЇЉЋ­ЏБГЕЗЙЛНПСУХШЫЮбдзкнрухђњ *1?S[ep}„‰‹‘“ЄАГЖЙМХЧдухчщё &:GIKM`iny‚˜šЃЊТбортф   &/ACPRTVwy{}ƒ“–™ІЈБИКЧЩЫЭю№ђєіјњ+-:<>@acegikm~„‡Š•žЖИЩзйлнп   #&)DFOZ\moqsu’”–˜šœžКУухіјњќў!&(*,.0<>Whjlnp‘“•—™›ИОЯбгезјњќў   & 3 5 7 9 Z \ ^ ` b d f s v y | € ‚ ‹  ’ Ÿ Ё Ѓ Ѕ Ц Ш Ъ Ь Ю а в и к у ъ ь љ ћ § џ! !"!$!&!(!*!,!1!3!)A)D)F)c)w)’)Ћ)Щ)л)ќ)џ**** ****(***,*.*1*3*>*A*D*G*J*M*O*`*c*f*h*j*y*š** *Ѓ*І*Љ*Ќ*Ў*С*Ъ*з*т*х*ш*ы*ю*ё*ќ*џ++++ + ++0+3+6+9+<+?+B+D+Q+\+_+b+e+h+k+v+y+|++‚+…+‡+Ј+Ћ+Ў+Б+Д+З+К+М+Я+и+х+№+ђ+є+і+љ+ћ,, , ,,,,,(,+,.,0,2,;,L,O,R,T,W,x,{,~,€,‚,„,†,“,–,™,œ,Њ,И,Щ,Ь,Я,б,д,ѕ,ј,ћ,§------*-3-Ш-Ъ-Ь-Ю-а-г-е-и-к-н-п-с-у-х-ч-щ-ы-ю-ё-є-і-ј-њ-§..... . ........ .".$.'.*.-.0.2.4.7.:.<.>.@.B.E.H.J.L.O.Q.T.V.X.[.^.`.c.e.h.k.m.p.r.t.v.x.{. .Ў.А.В.Д.Ж.И.К.Л.ф.ю.№.ђ.ѕ.ї.љ.ћ.§// //!/(/*/,/./0/9/>/g/j/l/o/q/s/u/w/z/‹/Ž/‘/”/—/œ/Ѕ/Ї/А/Щ/Ы/Э/а/в/д/ж/и/к/м/п/т/х/ч0 00000000>0@0B0D0F0H0J0K0t0v0x0{0}000ƒ0†0‹0”0–0Ÿ0Њ0Ќ0Ў0А0В0Д0Ж0П0Ы0Э0ж0й0л0н0і0џ1111111!1#1%1J1L1N1P1R1T1V1W1f1‡1‰1Œ1Ž1‘1“1•1™1›1Ф1Ч1Щ1Ь1Ю1а1в1д1з1м1х1ч1№22 2 2222222!2#2%2'2H2J2M2O2R2T2V2^2`2‰2‹222’2”2–2˜2›2Р2Т2Ф2Ц2Ш2Ъ2Ь2Э2ю2№2ѓ2ѕ2ј2њ2ќ333$3&3)3+3.30323C3E3b3d3g3i3k3m3o3v3›33Ÿ3Ё3Ѓ3Ѕ3Ї3Ј3­3Ж3Л3О3С3У3ш3ъ3ь3ю3№3ђ3є3ѕ3ў4444444!4#4L4O4Q4T4V4X4Z4\4_4h444„4‡4Š444’4”4–4™4›44Т4Ф4Ц4Ш4Ъ4Ь4Ю4Я4№4ђ4ѕ4ї4њ4ќ4ў555B5D5G5J5L5N5P5R5U5^5o5r5u5x5{5„5†555’5Є5Щ5Ы5Э5Я5б5г5е5ж5у6 666666666H6K6N6Q6S6U6W6Y6\6h6q6v67777777 7"7$7'7*7-70727476787:7=7?7B7D7F7H7J7M7O7Q7S7V7X7Z7\7^7`7b7e7g7i7k7m7p7r7u7w7y7{7}7€7‚7„7†7‰7‹777‘7”7–7˜7š7œ7ž7 7Ѓ7Ѕ7Ї7Њ7Ќ7Ў7А7В7Д7Ж7Й7Т8-8/818386888:8=8?8A8C8E8G8J8M8P8R8T8W8Z8]8`8b8d8f8h8k8n8q8t8v8x8{8}88‚8„8†8ˆ8‹888‘8”8—8™8›88 8Ђ8Ѕ8Ї8Љ8Ќ8Е9 9#9&9)9,9/9295989;9>9A9D9G9J9M9P9S9V9Y9\9_9b9e9h9k9n9q9t9w9z9}9€9ƒ9†9‰9Œ99’9•9˜9›9ž9Ё9Є9Ї9Њ9­9А9Г9Ж9Й9М9П9Ф9Ч9а9з9о9ц9ѓ:: ::#:%:':3:<:I:K:T:V:X:e:n:p:y:{:}:†:ˆ:Š:“:•:—:Ѓ:Ќ:Ў:А:Й:Л:Ч:г:м:п:с:ъ:ь:ю:њ;;;;;;);8;=;F;H;J;X;\;h;u;~;;‚;‹;Œ;;˜<}<<<ƒ<†<ˆ<‹<<<‘<“<•<—<š<œ<Ÿ<Ё<Ѓ<Ѕ<Ї<Њ<Ќ<Ў<А<В<Е<З<Й<Л<Н<П<С<У<Ц<Ш<Ы<Ю<а<в<е<з<й<м<п<с<ф<ц<щ<ы<э<№<ђ<є<і<ј<ћ<§===== = ======== ="=$='=*=,=.=0=2=4=6=8=;===?=B=E=G=J=M=P=S=U=W=Z=]=`=b=e=g=i=k=m=o=r=t=w=y={=~=€=‚=„=‡=Š=“>x>{>~>>„>‡>Š>>>“>–>™>œ>Ÿ>Ђ>Ѕ>Ј>Ћ>Ў>Б>Д>З>К>Н>Р>У>Ц>Щ>Ь>Я>в>е>и>л>о>с>ф>ч>ъ>э>№>ѓ>і>љ>ќ>џ???? ??????? ?#?&?)?,?/?2?5?8?;?>?A?D?G?J?M?P?S?V?Y?\?_?b?d?g?j?m?p?s?v?y?|??‚?…?ˆ?‹?Ž?‘?”?—?š?? ?Ѓ?І?Љ?Ќ?Џ?В?Е?И?Л?О?С?Ф?Ч?Ъ?Э?Я?б?г?е?з?к?м?о?р?т?ф?ц?ш?ъ?ь?ю?№?ђ?є?і?ј?њ?ќ?ў@@@@@@ @ @@@@@@@@@@ @"@%@'@)@+@-@/@1@3@5@7@9@;@>@@@B@D@F@H@J@L@N@P@R@T@V@X@[@]@`@b@d@f@h@j@l@n@p@r@t@v@x@z@|@~@€@‚@„@†@ˆ@Š@Œ@Ž@@’@”@–@˜@š@œ@ž@ @Ђ@Є@І@Ј@Њ@Ќ@Ў@З@И@К@У@Ф@Ч@а@б@д@н@тЫ@ёrefit-0.14/partinsp/Info.plist0000644000175000017500000000236711344755317015737 0ustar julienjulien CFBundleDevelopmentRegion English CFBundleExecutable Partition Inspector CFBundleGetInfoString 0.14 CFBundleIconFile partinsp CFBundleIdentifier net.sourceforge.refit.PartitionInspector CFBundleInfoDictionaryVersion 6.0 CFBundleName Partition Inspector CFBundlePackageType APPL CFBundleShortVersionString 0.14 CFBundleSignature ???? CFBundleVersion 0 CYProductHelpPage http://refit.sourceforge.net/doc/ CYProductHomePage http://refit.sourceforge.net/ CYVendorHomePage http://chrisp.de/ CYVendorName Christoph Pfisterer NSMainNibFile MainMenu NSPrincipalClass NSApplication refit-0.14/partinsp/main.m0000644000175000017500000000332210570501016015042 0ustar julienjulien/* * partinsp/main.m * Application glue code * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } refit-0.14/partinsp/partinsp.icns0000644000175000017500000015023210570501016016461 0ustar julienjulienicnsаšics#Hјќўўўўџўџџџџџўџќџќџќџќџќџјјќўўўўџўџџџџџўџќџќџќџќџќџјis32ш„ЁО~‹z†™†ЦцчгzR€†6Ar}ЩЯЪЭХЏTPŸЕУЬ›ЋЌЏЃ€c02R­žpwxŒ“™™tO..fVГПžž‚••ГЉq4F-fЕЬЦЦœœЅІСєеВœЁ{КЖДШВŸЗОМЪўџџѓОƒЛЛШКНМИвгпўџџжOŽТвЭЪжлжЩЮшџџЭr˜$ФЩнийлнрцхщН>šЛДЩжмппозаЙД6ЅЮУФУФ€Щ+ЫЭЬФ[}ly€~qrp†Ѓ–ЃdЇЁ˜ЕТУЙКЙЩШРUuŽ‘“‚•Ž|€„йіБВРЏ†бИођђцЗЊ€†6AXПДтфстнсНЂЇМЪв­ШбвдЫЩХГžRЖЇs}ЌУЦЫШУЭЛЊЃfVМФŸЁВСЦЭЪХЩПД­-pПдаЮНЪвкйІЖІšЂЁƒУРОЯСЪуъщГРРА—ŠˆХХвХФЬиёѓЮИЊ…D’ЬкидотплтнжТUЁRагфссуфхысиВ>ЃХПепфцчцркУТEЌзЬЮЬЭбввгевЬ[•‚o|ƒuusŒЎІЌiЊЂ˜ЕТУЙКЙЩеЫЧUu‘‘“€•˜˜•’|€„6ьь№†юі§§џЙN€žЂХњэљјї§ьЏRKМЬиппєєѓјщ~M++‚ЪГw…пѓђєјy%fЯЭЁІсѓѓіђБ{G3-бфоксѕїњќ–ŠjwЁ•жЯЮмжэќ§џ˜jsaDc идпгбсёџџ­3DЌочтпчшъьћЗ+AHЕ$срьщщыыьѓдЂЂPИеЮтщьэюющцижUЛсжизи€л3мннзmЈ~‹’€—ЛЌЛsМАЇЦггЦШЦзм˜еf…œ ЁЁЄЄЁЁšŒ€s8mkDЖюэЙGŒџџџџџџ…$=:1yџџџџџџџџlсџќќўџџџџџџџџб %іџџџџџџџџџџџџѕ#5ћџџџџџџџџџџќњё"FџџџџџџџџџџџімЖWџџџџџџџџџџџџџџ{gџџџџџџџџџџџџџіCxџџџџџџџџџџџџ№i‹џџџџџџџџџџџўRЂџџџџџџџџџџџџBЙџџџџџџџџџџџџVЫџџџџџџџџџџџџfДџџџџџџџџџџџџZAЈЅЄЄЄЄЄЄЄЄЇ—ICN#ўџ€џРџрџ№џџ№?џџј?џџј?џџјџџќџџјџџјџџјџџјџџќџџќџџќџџјџџјџџ№џџРџџРџџРџџџРџџџРџџџРџџџРџџџРџџџРџџџРџџР?џџ€ўџ€џРџрџ№џџ№?џџј?џџј?џџјџџќџџјџџјџџјџџјџџќџџќџџќџџјџџјџџ№џџРџџРџџРџџџРџџџРџџџРџџџРџџџРџџџРџџџРџџР?џџ€il32 &ŒЊ8оŒ‡žЫv“ 7Z8RkogUAYШaЂ4zЯєћќљђЩt5ˆ6 rAБьъфхьш}y–JЌйаЯабЮМУožƒUРШЧ€ТЦЖIˆФООРРССТТЉ™šЃ<8с‚ЕБЊУЩЩзˆUЉЏЏБГ€ДИ ‡‰ƒvG‡/˜ФЖЌЯзлЭDzЁ ЃЅЇЈЉ­•zyb=bЁ€K›ПВЅžЁЇ’O…”•˜›ŸЂjgM6) VZ€DЂЛЂO0:<]n€‡‹“•˜™q`QLE;-Vu€YЋОЦ|ovy{m~€…ŠŽ’•‘ŸОЄ{`F3 dL€ZДПмтуфьФW†„‹‘•™œ™ЅкмгЛkN0x7€_ЗНФЧЪЩОНxˆŒ’™žЂІЅЌНЯзЬЄЁ™ŽxjЙНТЦЕЃАЪЏ…›œžЅЋЏЏАЖцџљюдЦБžb€{КНФЊ РЪЩЮЁЏЏ­БЖЙЗДчџўѓйъ€}МПЕЃХЧШШЙЇ’ДФШХФТЩЦъƒџ ўЎ}ПНЎП€Ц ЁЈШЗМбмрбейэƒџсy€‹РЛОХЧЩСЉЫШЮСЉЗЬоойнё‚џѓ™ТЛбЩЧЩЩжкгвзлЩЛТУбуєџђЄ* ŽФКжпШЬЭблр€т мивеоыїџџљо‘%‚ ”ФМРчсЮЯввг€ж зййоёээыуЯkƒ;œХСПТфыозежзийлпъёоиооЮНEƒ EЄС­ЖСРбфыы€ш ыюьугадШЛЦС\ƒJАŘІФССТШЯжйкзгЯЬЯбжŘИШgƒ]РаЫЬЭЭЮ€ЯабгдеикклмлмлбnƒeгввƒаЯƒбваЭЭЮЯЮл„ƒb|knoqrssupqpqrqp’“”‘rƒfЏvR`dksw{…]e^ef_bЋЈž˜ЇЏwƒhЦ}?h‹—› Ќ‹˜‘—˜‘—КПОqHЈШxƒZФЦЁЎЛЩдзйожмкммйнтимЅеоm„ ~ИНКИЖЕДДГЕ ДЕДАЎЎДЗЖŽ#… ’…ŒЊXЙДЩї‘“ _™•ЄЇЂ˜‰”хaдБфљ§ўќјс­…Ф6 Њгєє№яя№№ѕюСšКС–ащƒфхслщЦšШƒUРШЯ€ЧЦФМоклмнмЬезкВœс‚„ПИЏЪаЯк­›ЯвгдежжзйХЪдЯШЖžВ/žЯНАзпсз…ЕЫЫЭЯабвеНПгЧЗІ›šІKЂЩНЎІЉ­Ј‘ОХЦЩЫЬЭаРЗвЧЛДЌЃœЇ8€DЊЦЎR0;:rЌМРТХШЪЬЪЏЫЮЮЧОЕЋЃЊf€YДШЮ}ovvЊМНСФШЪЬШНииЭЪЦОАЉЎ<€ZНШтчшщяг“УСХЩЭЯваПЫРбгРМСЖА€dСЦЬЯгбЧФЄСЧЫаджйи٘t•—ƒ•АП—lУЧЫЮПЏКЯУЙабейнррЫšюЧЈˆƒ†ы€‚ФЧЭЕЋЩвбдЕвннптцча’“дбвЬЖŸ…А€$€ЧШОЏЮЯЯаТЗМрщыыюэрЇšПИБЌЎВšs.„ЩЧИЩ€а­ДЮЧУфђіјђщНЃЗ­Є˜ŒŽ‡i€‘ЫХЦЯбдЬГгбдЮЧмяјјыЦЕТЗЋ›”‘u€“ЮЦздгденсммптигмохЯЩдЧЛЕЄ{2–аХмцгжилучщщшурнпщйпьйФІs%‚ бШЫьшйкллнп ссцїйХЧМДaƒ;ЅгЮЫЮщ№хрооррсучюѓхлзлгЬJƒEЎЮЖСЮЬкъяяэью№ё№щмйнвУбЮ]ƒJЛСœЏвЮЮЯдйпстрмижйлрМœСеkƒ]Ылж€и йклкклнорсттуф€унtƒe€йи‚зж‚зиижгг€дсˆƒfЇ…ruwxyzz|wxwyyxx‹žœžŸœЈvƒgИyQ_ckswz„]e]de_a”ДБЅœАЙ|ƒhЬ?h~‹—› ЌŒ˜‘—˜‘–НХО­ЎЕЬzƒZШШЂЎМЪдзкпжнлннкофммжглсn„~КОЛКИ€ЖЕЖ ЕЖЖБЏЏБАЖ#… ’…ŒЊ{:ыцњ)­“ ‹огоффттйж aеыњџўњёГˆ6 щоі§§‚ћўџ— sљчѕњљ‚јљћдОp™ƒ  €шз№їѕѕ‚іќз˜˜Є<3с‚ œвЩОзнмсйт€є‚ѕњф‰z|rG~ oГсЭРфььчЫэѓђ€ѓ єєјюŒTC!VЁ€ dЖлЫКБДЕУжё№ёђ€ѓія}'‚KZ€ _НиМV0;7‹ъ№№ёђ€ѓћЉƒGf€tШкк~ousІхёяёђѓѓєѕЬБD€S<€{вйыюя№ѓчбѓёђѓєѕіінЮЛиЧ‚C%aS€|езлоспдбд№ѓєѕїјљњч%^v}——~j‡зикоЮОЩкнчїііјњћ§цtPв–gFQqы€›иимХЛиротпѕљљњћ§џъy8›žŽlM:„€šкйЮОн€оЮЭхњќ§§џџј+[WTTXY-BHšмзШз€оМУкрщћ‚џ Ї #!4a€ЊнженопиУтпртщіў€џ Б' 0]%€ЊпзцроррчъццчыюяіљќК4$E`:ЈржщярстфъэяяюъшщьіЧH/7D]_.‚Џрийёюфцшшч€щьўФdczšdƒ^Зрмкляєьшччшщщъэѓїэпднптbƒ gОлХЯмлхяєє€ђ єѕѕяцфшпбопnƒfЫЯЌПпмлмрушщъщцууфхщЩЌЮу}ƒ{кчтуффххцччшъы€ьыььъ…ƒ€трс€порппрнкк€лш’ƒ wИ”„†‡ˆ‰‰‹…†…€†…™ЎЌЏБЌЗˆƒ~Ъ‰`orz‚†‰”hognphiœХСЕ­РЩƒ€оŽLz“ŸЋАЕСœЈ ЇЈЁЄХждxHЛп‹ƒwкеЊИЦжсхчэущцшщцшэь№Џ†хѓ~„ ЫЭЪЩЦХФФУХФХ€ФХТРРЦЩШ +…  …l8mk_ВьђрЄT €ыџџџџџџџмc"ЧџџџџџџџџџџџІвџџџџџџџџџџџџџА ­џџџџџџџџџџџџџџџ‡bfeeee_†§џџџџџџџџџџџџџџџѓ3Тџџџџџџџџџџџџџџџџџџџџџџџџџ“ єџџџџџџџџџџџџџџџџџџџџџџџџџе3њџџџџџџџџџџџџџџџџџџџџџџџџџѕ-CџџџџџџџџџџџџџџџџџџџџџџџџџџќASџџџџџџџџџџџџџџџџџџџџџџџџџџћ?eџџџџџџџџџџџџџџџџџџџџџџћњџџы.uџџџџџџџџџџџџџџџџџџџџџџ№БИфИ†џџџџџџџџџџџџџџџџџџџџџџџїкМw •џџџџџџџџџџџџџџџџџџџџџџџџџџўвЇџџџџџџџџџџџџџџџџџџџџџџџџџџџъ1ЗџџџџџџџџџџџџџџџџџџџџџџџџџџџЦџџџџџџџџџџџџџџџџџџџџџџџџџџл6 иџџџџџџџџџџџџџџџџџџџџџџџџџщ[шџџџџџџџџџџџџџџџџџџџџџџџџжXђџџџџџџџџџџџџџџџџџџџџџџџМ1+јџџџџџџџџџџџџџџџџџџџџџџџ–;§џџџџџџџџџџџџџџџџџџџџџџџІKџџџџџџџџџџџџџџџџџџџџџџџџЗ]џџџџџџџџџџџџџџџџџџџџџџџџХ oџџџџџџџџџџџџџџџџџџџџџџџџв‚џџџџџџџџџџџџџџџџџџџџџџџџр‡џџџџџџџџџџџџџџџџџџџџџџџџц%sџџџџџџџџџџџџџџџџџџџџџџџџиOџџџџџџџџџџџџџџџџџџџџџџџџС СџўўўўўўўўўўўўўўўўўўўўџњzUYXXXXXXXXXXXXXXXXXXXZNich#HРџ№џќџўџџ€?џџ€џџРџџрџџџџрџџџџ№џџџџ№џџџџ№џџџџјџџџџјџџџџјџџџџјџџџџјџџџџјџџџџ№џџџџ№џџџџ№џџџџќџџџџќџџџџќ?џџџџќ?џџџџј?џџџџј?џџџџ№?џџџџр?џџџџР?џџџџ?џџџў?џџџў?џџџў?џџџџ?џџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџ?џџџўџџџўџџџјРџ№џќџўџџ€?џџ€џџРџџрџџџџрџџџџ№џџџџ№џџџџ№џџџџјџџџџјџџџџјџџџџјџџџџјџџџџјџџџџ№џџџџ№џџџџ№џџџџќџџџџќџџџџќ?џџџџќ?џџџџј?џџџџј?џџџџ№?џџџџр?џџџџР?џџџџ?џџџў?џџџў?џџџў?џџџџ?џџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџ?џџџўџџџўџџџјih32v• ЊШsЫ‰Š‰Іђ?4 ]йк\%IХ3HЅ%"6\БИИЈ{E/'YœRJ!KвёўџћчС})2…I— 3љ@-qЫїђэыъыюіэ™}– 36ƒру‚н€онлЃsu” kI8…Югаабб„ваПЗТЅ Ї’ Џˆ6gЛШФХЦЦ„ЧЩЖ€ЄЏv+Л†cyksxx‚t r‰1XЅМИЙКЛ€МН€О ПБ–”“œQ‰у…qЇЖКЌЎЩЪЫЬЬмB„БЎЏБВГГДЕ ЗЎŠ‰‰‡†…YEм„=‘ФОЈ—ŠПбабгп_W“ЅЄІЈЉЊЌЌ€­ ЎЌŠ}€u^H"…„)m—НЙУЗМаггелЛ;k•›œž ЁЃЄЅІІЇЋ„p|tW0  ciƒ)PНЛ­žЃЂЃЄЅД~Ay‘“•–™›œžŸ  Єkq\F60*#]4ƒ)EЃНЙ’–ZY]`auZN}Ћސ“•–™š›ž”_dZKGC<4," ]Qƒ)BЈМЕЉ.59<>SS[}‚…‡‹Ž‘”•–›‚hcWXSLD<3)j„ƒ)UЋЛКЭ‘>GKNPcW\}|€ƒ†ŠŒ‘“”—“ИКЈvaZL?8.$&m5ƒ)]ЎЙПпрэььээќ“S‚~…‰’•–˜š›ЗжѓхЖ‹pX=0#0x%ƒVГЙНжй€л мнхМS‰‚†ŠŽ’•˜šœž ЁЙУЛкоЬКЁЃW,Cy3ƒ(_ЖЙНТТУУХЧЪПФp†Š”—›žЁЃЄІЉЛЎБУШХЛЁА““Ž‹„(bЙЙНУФФШЩМ ”П›“‘‘”—œ ЃІЈЊ­АЙЋдџњыШЉМЭЃ[•V„kМЙПТУЩКЂДЧбЏfŸ—Ё ЅЈЌЎАГЖЗЈдџіуфвБЅы”‚*vОИПСУЌŽЉЪЩЧШбu”ЂЊЎЇЉ­ВДЖЙПМЅд„џўщЬещ]}СИПФ­†ЙЩХЦЦЧЮа}ЕЊКРЖГЕИЛПФХЊиˆџеІ‡ПЙПКšНЦФХЦЩЪЈ ІqГЕХЯЬЪЩЧЦЧпСл‡џєИo5’ОЙРЈЈЧХХЦШШ–ОзБ‹ЗОЩжнооаЪхЯп‡џпВ*;žНЙМАН€ЦЧЬЇšЭЩЦвОƒЛЩШгпфзафгф†џюДO‚]ЌЛЙМПФХЦЧШЬЏЕЪШЩШгЪЎ›Йикмпкфзш…џјЭŽƒUЖЛКМаЬХЧШЩЩЪжбЬЮЯЯбнХЂИФЩаЫфлы„џѕЭ™ƒ\ЙМЛЛнсФШЩЪЫЬлюрлммнцянгеШОСппяƒџяЦ• „bМНМЛЩёвШЫЬЭЮЮдно€р пжджзнсррьёџъиМf…lОПННКкјзЫЯЯбввб€вгезииййзпљяэіяысХžD‡ПП€О НпўпЯбгдджзиик цќщтрнпмЬРLˆСРП Оиіьнедезиий€кймф№јчазннмаНОZˆyУСРПРПРПФсљѕщр€мнопфэїљчвЯввгбевРСdˆvЦЛ›œЃУСТТСЩзршяѓ€є№ъфнвЭЯввеФЈ–­ХЦpˆ%wЪМŒЅХТТУФУТТХЪЭЮЯЯЭЫЪЬЮаабвжО“•ІЧЫ~†G~ШРПО‚РТ€УФФХЦЧШЩЪЪЬЭЮЮЯабвЯавТЪ‹†8‡футууфф€хццчшщъъ€ыь€юхоš†6Ђцˆж€еж‡е„децО&†C†“‰€ˆ‚‡†‡Š†‰€ˆ‡ŠˆŠ‡…‹‘˜:†&DŒЁnMTVZ]`dfgikoiHnP\Y`hKgO››œ Ÿ››—;†&F˜ВwP`bejot{~ƒŒ€CŒQibo~DzPВЊЉЊЄ‡—ЌЉЋЅ<†&K“Цy?g}†Š’–˜™Іžk­zˆ”Ёo{ЮЗЗНŠ…dœЛЛЂ,†&VŽд‹.@Vj}Œ—ŸЂЄЉГАˆС—ЈЃЌЗŽГ›тУФЭ,%ЉЩЬ"†&/ŒнТ™ ІЊЏИХЬЮЯбжжЪоЯегзлЬйвшбвжН|›згк‰ ‡ eЪыђёяяюэьъщщышъщъщшыщъфуутчъъфчЖE‰E_•^„_]4Ж• ЊШ„ъЏБАЪ Dф ]ю’ofinmgk‹ИхHЬmu‡ŸОвзжЭВ‚w ›n„s”Цфї‚џ§ёлГ{zН8—3­сњїѕƒѓіњѕО……Н–$z‡Иэяыы†ьъшмЃ„ГD”k†ˆЙуцфф…хцузсчлЃ‹Ю“ЏД„Јипноо…п саблкпЩ”‘д†cyou{{‚u pšz Ьйззйй€кл нЭЧздввзКŒМГ…tЏРУБГа€б внБŽКгбвгдеежж€з йЮЙбгбЯЮЫМ•Єм„=˜ЮШЎšЦй€и у•ŸУЭЭЮЯаббв€г дбЖЫдаЫСИЇ™™“Ќ„)mžШУЫЛСжклмпЫ­ФШЩЪЬЭЮЯЯаббдЏИжЯХЕЌЅЁœ™—ŸDƒ)PЄЧХИЋЏ­ЎААЛŸ†ЖТФХЧЩЪЫЬЭЭЮвЛВдЬУЛЗГЎЈЂ›Ђ4ƒ)EЊЧУЁ ]\aces“ЙПСТФЦЧЩЪЫЬЮФ ЮвЪЧУПЙДЎЇ ЁЇQƒ)BАЧПЕ“-49<>MwКНОРТХЦШЩЫЬЯДАЭЯвбЪФОЙВЌЄЅВ„ƒ)UГХУж—>GKNO^{ЛЙМПТФЦШЩЫЬЮСШвдРРЬЫФНЗЏЇЋЎ5ƒ]ЗФШхц€ю яяљБ’ОЛОСУЦШЫЬЭЮбЧПкїьбРТШРЙБЉЏЎƒ)XМУЦлпссуттшЭŽУПТХШЫЭЯбвджЬХГЬукЫЙаЬНВДЈƒ(aРУЦЪЪЫЬЭЯбЧЬŸФТХШЫЯбгезилбЩŽKo† А{ЁЖЊСЯЉ„(fУУЧЫЫЬЯбЦ­ ФЙУЩЩЬЯвдзклмпжЧŒzіЪ’f]ˆИŸ_›Z„)nЦУШЫЬбУЎОЯжТ›бЬгвжилопсфлЦŠuчэшйК—ˆ~q‚ы ‚+*{ЩУШЫЭЗœДббаазžТеймймптфцщсЪˆvгббвжйЮА‰o‰ЛH+ƒЫТШЭИ”УаЭЭЯаеиЉнлтхтухчъэцбŽШФРНККМРСПЅh†ŒЪУШУЅЦаЭЮЮавДЋМЂлтш€эя№ёцщІŠРКЖБЌЈЅЅЇЃŒmi+5™ЩУЩГГбЯЯабаЉЃЧкЦДнщьђѕіїѕшюЖ”ЛДЏЉЃ”‘}•3HЅЧУХЙЧ€а бжГІдбЯжЮ­мяёєіјіъэЛЁПЗАЊЂ™…ˆˆxR‚)]ЕХУЦЦЭааввжКОббвбиеШРніјјњяюСЏЬТМДЋЃ——š†€ƒ)]РЦФЧедбггдеднкзиййктжРгоущтэЧМиЭЦОГЊЎІ†„ƒ(bУЧЦЦрхбдежжзуђцууффыёунскдиыЬШуиЯЦУШЏ‡‰„'fЦШЦЦвѓнджзийинфцччцхпопрфццщзеђшфрЕ–’X … pЩЪШЩЦрњрзйклммноопррссрц§йШнЮФД–†G‡…ЪЪЩЩЪШфўцккмнооппр„с ыќябЉЊИЬЮЭSˆ…Ь‚Ы Щпј№хонопррст фъѓљыирцчщмЫЪ\ˆ$€аЮЬЫЭЬЬЫачњјючфууфхцщёљњьликкмкнмЭЯhˆ|дШЂЁЌбЭ€ЮдоцьѓіѓющфмийллнЬЎ›Евгuˆ}жШ‘ЁЎбЮЯ€аЯЯбезиййижежикклмп֘šЏг脇G„еЮЫЪ‚ЭЯЯ€аббвггд€ж ззйккллзикЮи“ †8эъ‚щъыы€ьээ€юя№ёђѓђышЃ†6Єщ•кй„ийъТ&†CŒŸ•”€“‚’“–’•”—”–“…—ž :†&D•­tNUX\_bfhikmqkJpQ^[bjMiP“ЈІІЇЊЉІІЇ ;†&FŸМ{O`beintz}ƒŒ€B‹Qibn~DzPЖГВГЌ‘ДВД­<†&K˜Ю}>g}†Š’–˜™Іžk­zˆ”Ёo{бООС К’ЄСУЇ,†&VйŽ.@Vj}Œ—ŸЂЄЉГЏˆС—ЈЃЌЗŽГ›фЩЩЪЕиЏГЬбЁ"†&/ŽсХšЁІЊАЙХЭЯавжзЪпаждилЭкгъежзЯЫЫижп‹ ‡ eЬюєѓѓђёяю€э€ьюы€ьыыэыэч€цшхччъИE‰E_`š_a]2Ж• ЊШ™оппѕ+Mф ]/ЯФУШЫЫЦФзыHіПбоц№ѕіієэслаЭ)›ŽЩЮуёј§ƒџќіэйА€8—3.Ьжьјў§ƒќ§§ўџѓPx–BЫмюњћˆњћъ ku”qЬмюјљ‡ј љћхКСЅ Ё’Џчзыѕїіі†ї љщЖЁЄЏv'Л†XЉŽ”™™‚”НЪчђі€ѕ…іјѕАŠ€R……УвгРУнофймяєѓѓє‚ѕ ііО}{~ƒZ;ж„=ЎркРЉžдхффуыбц№ђ€ѓ…є јгqfkcM; v„•ДкекЪафччшщсЩь€ёђѓєјхPQ2 ‚PiƒyКйзЦКНЛМНОУЦая€№ёђђѓєіђŒ6 „ M4ƒaРйеАЋa`dghqЌк№я№ёёђђѓѕєЏ'†MQƒ[ХибХ›,48;=GЂр№юя№ёђђѓљпO‡X}ƒ vШзефž=GJNOXІо№юя№№ђђѓѓєєіщРВŒ@ ƒX3ƒ|Ыжйюыяя€№ѕжгђя№ёђђѓєєѕѕіяЭъџюЋi9^%ƒsЯжзцш€ы ььяфЮђ№ёђѓѓєѕѕіії№вЊvЫїьۘ‡X- 'Z3ƒ{везкк€лопеиг№ђђѓєѕііїїјљѓз|'O‰ИŠВЏ}yjs„(~жеиллмордКЏЭнэєѓєѕіїјјљљћіеx%рš: $cВЏk›V„)…иеиклргЌОЭнтмдіѕііїјљљњњќїгwХйЬЉ}Q47Dqя ‚\леийлЧЌУррннубыјїј€љћћќ§ћиv™ŸŸЃЉЋ’],J—4 /™ндимЧЄгпм€нсцйїљљ€ћќ§§џ§п~rwtsrru{ytC tFЁмейгЕеоммнпрТЖийіћћ€§ўўџћі•MPNMJHGGI>5fO­лейУТомннооИВеуссї§§ўџќћЅ"*+)&# !…E\КйезШенмнотТЕуонрхпіў‚џ§њЌ* !LY‚|ЩзезжлнноптШЮр€птхшъіџ§њГ53Pwƒuгзезфтноппрршхт€уфшэщёјњћћњИ@ ! $?L{$ƒ {зижжяђорр€сыѕэъ€ыёєъщяёѓііРJ$$"EVUƒ„zййззрњцр€тутцыэьш€чщъъєЭW,3HaPKqT … ‰лкиижщћшт„фххччшшщ эџЦf[_krm}P‡Ѓййиийиьўэфххцц€чшшщщ€ъ щё§љОkr‘РирmˆŸмкйккйишњєьчцччшш€щъъы№їћёуъђѓїълкqˆ™омлйкклкнюќњѓю‚ыьяѕњќђфуфхчфццлн|ˆ‘тжВЏМпл€мршэђїљіѓ№ьцууфхчзМЉТрс‰‡ ‘ужЃБОоллм€нморс€утссту€ф хшвЈЋМпх—†z›умйи‚лмнноонноопрсттууфхттфмфЅ †_Ёє№ёё…№ё„ђ€ѓєєѕіїїіёёГ(†UГэпрпп€рп„опюЬ3†`ŸЎІ‚ЄƒЃ ЂЃЇЃІЅЅЄЄЇЄІЄ…Ј­ЏH†&ZЈМƒ[bfimpsvwxzwS}[ieluTtWœИЖЖЗЛЙЖЖЗВM†&\ВЬŠ_pqtx}ƒŠ“›ŽIšYslyŠK†TМФТУН›­ХТФПM†&eЋмŠKx‘›žЁЅЉЋЌАЙАvО…œ•ЁБx­‚зЮЭд—ƒfЏвбИ;†&zЄщœ9Lf{‘ЁЌЕИКПЩԘеІКДОЪœЧІыййуˆ*"ЕпсВ/†&/Ё№бЂЉАДКФвкмнпфуеьлтрушзцлђххщЫ€Ђщцюž‡zоўƒџ§€ќ€ћ §њќћќћњ§њ§їњ§§јћЫUˆQk™jllji@Жh8mk B’ЫёёёпДp_Нџџџџџџџџџш2?цџџџџџџџџџџџџџџ†ˆіџџџџџџџџџџџџџџџџж;‰џџџџџџџџџџџџџџџџџџџн@Ёџџџџџџџџџџџџџџџџџџџџџу%aўџџџџџџџџџџџџџџџџџџџџџџЭ цџџџџџџџџџџџџџџџџџџџџџџџџrОККККККККЗбџџџџџџџџџџџџџџџџџџџџџџџџџр%Нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ…ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџП :ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс)RџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕDkџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ[~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџp•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќdІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїXМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјћџџџџцFбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйЄЖзјџа,цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўяА}~Ћv ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњнН‚$іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэb0љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИ:ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“CџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэTMџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў—ZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧ@hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзb tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеeџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЕWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђŽ? Ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџх3Гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю. Эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ8тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќEђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўR2њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_Hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџl]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџwrџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒ‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ— lџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŠ Gўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџv щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџк9(ЂЬЮЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЯЗjŽ?<, +Єе IУJ 5??ƒ@AL„p…A@:$ :У4гч№h :@‚AY‰Им‡џѓаЁrƒB>$ Y№šЯIГ ;ABZ”кўУ}DC< Г0]Ьл w 2BC€DqП•љэžP€ED- vBЪ„№: =D€EpЧ™ѓ шœQGG5 9№ЙШ sв: "EEFFQЎю й|A  *бЄЦsв 1F€Gyошšщ шшЃ б Ф sв 2HHIIŸ€уžф окО( б•Т Џ№: 2IJJSЙ‚оŠп…р‡п мвваУM с­Р f : 3JKKTО€й†к’л€кйЬЫЩ€ШK 9ђЬП 2w %KLLUКддƒе†ж‹зƒжЩФТ‚СH W™НиГ LMNVЖ€Яа„б“вбШНМ„ЙE ”6Мf№JOOPœЫЬ…Э‘ЮЭЩЖЕ†В! сrЛDY ;PPQ„€ЦЧШƒЩ‘ЪШГЎЋ†ЊŸ  H:Й ZУ QRRgСС€ТУФХ’ЦГЈЅˆЃo Є3Й J ISSTЉНН€О€П€РС„ТˆУТЗ  žœ†›: *№сšР{v—w Є ,TUU†ИИЙЙ€КЛЛМ€НƒОŠП ООЙ›™™˜——–•”„“Š ‡"˜чGBBX—` чJPVV]ЎДЕЕЖЖ€ЗИИЙК„Л…МЛ ™’””“’’‘ŽƒŒN/К–šBQŒ‚ИКЧЬЭЭ€ЮЯЯ€аббвнУ )WXXŽААББВВГГ€Д€ЕЖЗŒИЁŠŽŒ‹Š‰ˆ‡†…‚„ Ї• DXБ‚ИЙЪЫЬ€Э€ЮЯЯааббв ёhPZY_ЌЌ­ЎЎЏЏ€АББ€В€ГДŒЕЉ†‡ŒŒ‹Š‰ˆ‡†…„ƒ‚€~NP•`BЉƒИТژƒŽ€ЛЬ€Э€ЮЯЯааббвве№#]][ЈЉЉЊЊЋЋЌ­­€ЎЏЏ€АБ‹ВЏƒ€‡ˆ‡†……„ƒ€}|{yxvoR4тѓ”Dn„ИШ’ЩЩ’`УЬ€ЭЮЮЯЯ€аббвуЄ C`^]›ЄЅІІЇЈЈЉЉЊЊЋЋЌЌ€­Ў‹Џ‡z„„ƒ‚€~}{zxwuZ6€ ›“+BŒ„И Щu›s†ЊЬЬ€ЭЮЮЯЯ€аббёh^d^s ЁЂЂЃЄЄЅІІЇЇЈЈЉЉ€ЊЋЋƒЌ†­”uz€~}|{zxwuW7 € !H“ЎB›ƒИЙЩ“|КМНoЛ€ЬЭЭ€ЮЯЯ€абќ'ff_…žŸ  ЁЂЂЃЃЄ€ЅІ€Ї€ЈЉ†Њ Ÿoq~~}|{zyxwueD!  !ёs’ŸB›ƒИМЩЩœЋ“Њ‚ЬЭЭ€ЮЯЯаайв ?ifa’šš›œžŸŸ ЁЁЂЃЃЄЄ€Ѕ€І‚ЇƒЈ!Єrjy{{zzxwvuX:%"  %Лэ’†B„ИМШЩЩ€ЪЫЫЬ€Э€ЮЯЯатЄ Ymel•–—˜™™š›œœžžŸ  ЁЁЂЂЃЃЄ†Ѕ!}epyxxwvupS8.+)&#  +“ѓ’hB„ИОШШЩЩ€ЪЫЫЬ€Э€ЮЯЯъwjpeu’“”•–—˜˜™šš›œžžŸ€ ЁЁ‚ЂƒЃ"Š`fwvvutoV<641/,*'$! 2_љ’eB„ИР€ШЩЩЪЪЫЫ‚Ь€Э€ЮЯѓJ srf}‘’“”••–—˜™™š››œœžž€Ÿ€ ƒЁ#˜_\sutspZC><:8530-*'$! /Sњ’`Q„И-РКoddffghjkklnnpqqrttvх+.vsh‚ŒŽ‘’“””•–—˜˜™š€›œœ‚ž‚Ÿ#cVlssrbLFDB@><9641.*'$! 3.џ’M`„И3У”gЕШЗƒ„…†‡‡ˆ‰ŠŠ‹ŒŽџ =yrj„‰Š‹Œ‘‘’“”••–—˜˜™™š››€œƒ$rQ`rqkWMKJHFDB?=:741.*'$   01џ’M`„И2УzzЧШD<=?@BBDEGGIJLMNOџ L|tk…†‡‰Š‹ŒŽ‘’“””••–—˜˜™š‚›&‡LSpnaSRQPNLJHFC@=;741.*'#  #84йF‘Kg„И4Уy”Ч­:;<>?ABBDEGGIJLMNџ O€vm‚„…†‡ˆŠ‹ŒŽ‘’““””•–——˜˜€™*ššŸUJjj[XWWUTRPNLJGDA>;741-)&" '<6ЭЛ‘E}„И5Цe“Чš9:<<>?ABCDFGHIKLMџ Q‚yo€‚ƒ…†‡ˆ‰ŠŒŽ‘‘’““”•––——€˜)™w`mpf^]\[ZXWURPMJGDA>:730,($! +@9ЮИ‘B}„И4ЦuЌЧ89;<=>?ABCDFGHIKLџ S†{q}~€ƒ„…†ˆ‰Š‹ŒŽ‘’“””••€–*——œq^_\bnoja^][YVTQNKHDA=:62/+'#/D<ЮЎ‘B}ƒИcЛФ•КЧl689;<=>@ABCEFGHJKџ U‰~r{|~‚ƒ…††ˆ‰Š‹ŒŽ‘’’“””••––—›nЭœjaafmpk`\ZWTQNKGD@<951-)%!3I?ЯkрB“ƒИ6ЛТЕЦЪZ6789;<=>@ABCEFGHJџ W‹€txz{}~€‚ƒ„†‡ˆ‰Š‹ŒŽ‘‘’““€”(•™mƒђпџиЇwddhppk_XUQNJFC?;73/+'#7LAџ‘ЁB›ƒИbЛЪжЭЭs5678:;<=?@BBDEGGIџ G‚vyz|}€‚ƒ…†‡‰Š‹ŒŽ‘‘’““””••–›q†х˜ЭщєџуЊ|iilrrfXQMIEA=951-)% $;NDџ‘ŸB›ƒИОкёббєџJ:;’Œxz|~€ƒ„…‡ˆ‰‹ŒŽ‘’“””•––——˜˜žuŠх–Йллощђ§уЌmmorm`PHD@;73/+&"*?W^ѕ‘“BЉƒИОсєжжм„ь„э€ю ћJ)”y|~€ƒ„†‡‰Š‹Ž‘’“”•–——˜™™€š xŒф•И€лммншђћфР‹€qrjZI=950,(#9CZwя‘nB„ИПт§цф†х‚цчKѓ†’˜{}€‚ƒ…†ˆ‰‹Œ‘’“”•–—˜™šš››œœЂ|ф”ИнэырммннИЮфћюТvvusiT?2.)% FL\šб‘eB„ИРШэ№‰ё„ђ2ѕЄ €›…€‚ƒ…‡ˆŠ‹ŒŽ‘’“”•–˜™™š›œœžžŸŸЅ€’ф”ЗѓъдјјюунН€ИЪріюФ’yyxtfM4&! MYWНЙ‘dB„ИРУ€ФХХЦ€Ч€Ш&ЩЩЪЪЫЫвс cž€‚ƒ…‡ˆŠ‹Ž‘“”•–˜™š›œœžŸŸ €ЁЇƒ•ф“ЎіЊБдјћтХ‚И™ЌёяЮІ€~ ucD0/PfRщ^‘V`„ИТУУФФХХ‚Ц€ЧШШЩЩ€Ъ.ЫЫљ+@ ›‚ƒ…‡ˆŠŒ’“•–—˜š›œžŸ  ЁЂЂЃЃЄЊ‡˜ф’ЅіЊ›Б€ЂЭёірХИИ}BeЮђїЯЈ€ufVjiѕ’M`„ИТ€УФФХХ‚Ц€ЧШШЩЩ€Ъ;Ыьh"˜Ѓ‡…‡ˆŠŒ‘’”•–˜™šœžŸ ЁЂЃЃЄЅЅІІЌŠ›у’ЄіЊЊџџлИ”ЂЭёірБB €tЛяїбЋ€…h–н’M`ƒИЙТТУУ€ФХХ‚ЦЧЧ€Ш0ЩЩЪБšЅГ |І”‡ˆŠŒ‘’”•—˜š›œžŸ ЁЂЃЄЅІІЇЇЈЈЏŽžу‘ЃѕЊЊ‚џ лИ”ЂЭъѓпх‚TМяџкЏ{жЁ’KvƒИКСТТУУ€ФХХ‚Ц4ЧЧШШЉ‹ls“ЌќKЈЅˆŠŒ‘’”–—™šœž ЁЂЃЄЅІЇЈЉЉЊЊЋБ‘ уЂѕЊЊ…џ лИ››Пъ6P‚UНсца“B}ƒИКСТТ€У€ФХХЦ4ЧКhpЖЩЪЪыiœЌ“‹“••”–—™›œŸ ЂЃЄЅІЇЈЉЊЋЋЌ­­Д”ЃуŽ”ѕЊЊˆџ ъП››Пъ:QŠ™B}ƒИМССТТ€У€ФХХЦЦЌ`zЎ€Ш-ЩЩЪдсiЏІ”šœ˜—™›œžŸЁЂЄЅІЇЉЊЊЋЌ­ЎЎЏЏЖ—ЅуŽŽѕЊЊ‹џ ъП››Пуџ,QŠ–B„ƒИН€СТТ€УФФХХИƒ]xЌ€Ч€Ш,ЩЩЪђN2ЇВ˜“Ÿ Ё››œž ЁЃЄЅЇЈЉЊЌ­ЎЏЏАББВИ›ЈтŽѕЊЊŽџ ъПЂ”Илџ1t’ОB›ƒИНСТТ€УФФ•ahЋ€Ц€Ч.ШШЩЩЪоФyДЌ’”œЄІІž ЁЃЄІЇЉЊЋ­ЎЏАБВВГДДЛžЋтŒŽѕЊЊ‘џ ёЭЂ”Илџ7уŸB›ƒИО‚СТТУУНv\ŠО‚Ц€Ч-ШШЩЩЪѕQ-ЃЗЁ•˜ЈЊЌЌЃЁЃЅІЈЉЋЌ­ЏАБВГДЕЕЖЖНЁ­ь‹ѕЊЊ”џ ёЭЂ”Илј((,ŒšB›ƒИОР‚СТТБghЅФХХ‚ЦЧЧ€Ш*ЩЩздhЙИ™˜ ЎАБВЉЅІЈЊЋ­ЎЏБВГДЕЖЗЗИЙПЄЏѕ‹ŒтЊЊ—џёЭЊ€ŽБд&„‹„B„ИПРРСТ gmВ€ФХХ‚ЦЧЧ€Ш)ЩЩю(–МВšœЊДЕЗИБЉЊЋ­ЎАБГДЕЖЗИЙККЛТЇВѕуЌЌšџјеВуЄ‹hB„ИψЈрnsГУУ€ФХХЦ€Ч€Ш(Щаю;JБРЌ ГЙЛМОМВ­ЏАВГЕЖЗИЙКЛМННФЊДѕ“”фБАџЙёш‹eB„И ППРРССГyyГТ€У€ФХХЦ€Ч€Ш'ЩсЧ"lНТЈ ЄИОРСТФПЖВДЕЖИЙКМННОПРЦЌЖѕ›˜цДГœџј–ЂіŒ`QƒИЙ€ПРРМ{ЋТ€У€ФХХЦЦ‚Ч€Ш(ЩЩЪю‘+ƒФУЉЃЇНУХЦЧШЩЧПИИКЛМОПРРСТШЏИѕУчЗЗœџздРŒM`ƒИКОППРР•‚š€ТУУ€ФХХ€ЦЧ€Ш(ТЃŠ|тx9–ЧЦЌЇЊСШЩЪЬЭЮЯаЪХРОРСТУФФЫБКѕеВшККœџŸ”ј+ŒM`ƒИКООППВ‰ŒПУ€ФХХ€ЦЧЧШ*Л‡hiЊЭюQ<ЂЪЩЏЊЌРЭЮЯабвгдежевЮЫЪШЦЬДМѕегьОО›џиЦйKgƒИ ЛООППœЉУУ‚ФХХ€Ц€ЧШШЩšfmЁ€Ш$ЩгюT?ЁЭЬД­ЏЛЯвгдежзийкллммвЧЮЖПѕжжѕСР›џ ”јLE}ƒИ ЛНООЗ—˜НУУ‚Ф€ХЦЦ€ЧШШ…]Œ€Ч€ШЩнђVB абОБГЖЩжзийклмнн€о дЪаИРѕежѕФФšџгЦзŽB}ƒИЛННО­ŸІУУ€Ф‚ХЦЦ€ЧШШƒ[žЦЦ€Ч€Ш"ЩкяYF‘ЯдЪЖЖИНЮлмннопрсстзЬгЛТѕжжѕЧЧ™џљ˜”№OŽB}ƒИЛ€НЊЇЕ€Ф€Х‚Ц€ЧШШ­Z|Ц€Ч€Ш!Щгќ=€ХжеФЙЛНУгорсстуффйЯеНФѕззѕЪЪ™џЗлТŽрB“ƒИЛМНМЏЏН€ФХХ€Ц‚Ч€Ш}[И‚Ц€Ч#ШШЩЩаѕЈ;eГекгФОРТФЮирфхччмвиРЦѕззѕЭݘџдБэЁB›ƒИЛММЛЗЗР€ФХХ€Ц‚Ч€ШxvХХ‚Ц€Ч"ШШЩЩЭыкbLŽШмнзЩФХЦШЪЯзмфмелТШѕззѕЯЯ—џэ“›јhŸB›ƒИЛЛМНОПУФ€ХЦЦ€Ч‚ШЩЩ•ЦЦ€Ч‚ШЩЩ€ЪЫмќ O]ІапсовЫЩЫЮавджиоФЩѕззѕвв–џѕœъЁ“BЊƒИЛЛМПЦЦХ€Ц€ЧШШ‚ЩЎЈЦШШ€Щ‚ЪЫЫ€ЬЭаэш‹ImŸЭууфркжгезйлсЦЫѕззѕее•џњЉдг‘nBƒЙК€МСЯЮШ€Х€ЦЧЧ€Ш‚ЩЦФШЪЪ€Ы€Ь‚Э€ЮЯЯиѓшMaŽМдцшщъщшцчъШЬѕззѕиз”џњЉдц’eBƒЙК€МОизаХ€Ц€ЧШШЩ€ЪЫмпбЬЬ€ЭЮЮ€Яƒа€бнюєГsUsŽГЯоъю№ёђЪЭѕзиѕкй“џёЊдэ&’dB„КМ€Нлрл€Ц€Ч€ШЩЩ€Ъ€Ывѓѓзаа€б€в€г€дезчюьњпЖƒ]ewˆАЕЖЎРѕзиѕмм’џыšдэ&“V`ƒКЛМ€НишшЭЦ€ЧШШ€Щ€Ъ€ЫЬЬеѕџщзе€жз€ийфїјоггмчєџзКВ~nqŸѕзиѕоо‘џл——мв&”M`ƒК ЛММННЭ№№рЧ€Ш€Щ€Ъ€Ы€Ь€Эцќ§юрƒк€лмрыћџюжгдеенхыђѕѕџџњпииѕсрџјП•ЈъЪ–M`ƒЛМ€НООюѕѕЮШ€Щ€ЪЫЫЬЭЭЮбс№џ§іƒюєљџїщйгг€д€е€ж€з€и€ймћутŽџпЉ™ОёЂ—KwƒЛММ€НОгїїь€Ъ€Ы€Ь€Э€Ю€Я‚амшшєьщсй€дƒе€ж€з€и€йккюќхфŒџ№РŸЉрыG˜B„М€Н€ОыћћрЫЫЬ€Э€Ю€Яаƒбввг€д€еƒж€з€ийккщї§чцŠџёЧЇЂађОšB„М€Н€ОЧњўўмЬЬ€Э€ЮЯ€а€б„в€г€д€е€жƒзи€й€кчњњўшш‡џ§цУ­ЈЧєвG›BŽ…М€НООПгџџќзЮ€Я€а€бв€г„д€е€жз€иƒйклтћ§§ќъъ„џ љцЮЙАГаєаvœОBž†Н€ОППРиџџќо€Яа€б€вг€д„е€жз€и€й„кллщ§џџуєъъјіыщодФКИЖЫтћцЩB2œŸBž‡Н€ОППРи€џш€аб€в€гд€е„ж€зи€йкƒлэ€џувєиЩШЦХУСЧЮнэџъжСННa5œšBŸˆО€П€Ри€џєз€вгд€еж€з…и€й€клмсіџџќуввщљђђёёєџїђымƒОa=œ„BŠОПП€РСЭїџџќщ€где€жз€и…й€кл€мнню§џџљкв лооппкеежжвƒОa=œhBŠО€П€РСХф€џњфддеж€зий„кл€мннъћ€џыдб‚в€гддее€жƒОx=œeB‹П€Р€СТТбє€џњчиж€зийк…л€мнпюћ€џімббввƒгдд€е€жƒПBœ`YŒП€РССТйїџђцкийклм‚нпъєџљсаабб€в‚г€д€ежжТ‚ПBœMaПРЈтТ幂џѕьтлйклмнрцюї‚џ№оЯЯаа€б€в‚г€деежжХ‚П‰BœMb„РИ™‘ȂЈш҂УЫоєƒџњіяэыфхццьюёїћƒџіуд€Яаа€б€в€гдІ‹žУжжЦ‚РЁB›KiƒРЈnЊрПx‘‚Јш҂УФФЬоэј’џљярдЮ€Яаа€б€в€г дЙpЊрПyžжЫ‚РЁB,›E‚ƒС_ЖЖАtcƒС€ТУУƒФ€ХЦЦЮеуъёё†џђђщцйгЭ€Ю‚Яабб€в€г ддvЎЖАwpФЬ‚СЁB,›B‚ƒСj’nqЉœoБƒС€ТУУƒФХХ€Ц€ЧШШЩ‚Ъ€Ы€ЬЭЭ€Ю‚Яабб€в€г дb’ižœБЭƒСB/›B‚ƒСt‰ТППЗa…СТТ€У‚Ф€Х€ЦЧЧ€Ш€ЩƒЪЫЫ€Ь€ЭЮЮƒЯ€а€б€в ггд‹‹ЗППЗaЬбƒСB:šрBЂƒТКv™ФЋЊ†ТУУ€Ф‚Х€Ц€Ч€Ш€ЩЪЪ„ЫЬЬ€Э€ЮЯЯƒа€б€в ггддЫˆ™МЋwЛжбƒТB9šЁBЂ…УПЖП‰У€Ф€ХƒЦЧЧ€Ш€Щ€Ъ€Ы‚Ь€Э€Ю€Яаа„бвв€г€дебФЭжжзеƒУR6šŸBЃ”У€Ф€ХƒЦЧЧ€Ш€Щ€Ъ€Ы‚ЬЭЮЮ€Я€аƒбвв€г€д€е€жззƒУb=š“BД•Ф€Х€ЦƒЧШШЩЪЪ€Ы€ЬƒЭ€Ю€Яаа€бƒв€г€д€е€ж€зƒФc=šhB—Х€Ц€ЧƒШ€Щ€ЪЫЫЬЭЭ„ЮЯЯаббв‚г€д€е€ж€зиЪ‚Хk=šeBЦЩлэŸё‰ђŒѓŒє†ѕђёётЭЦ„>š`Jбјйџц„BšVkќџјуЭгЦлёџџCšOsјПиЊъХDšQmЃк”ДF0™Nhм‘G1™Io‚–€g„hƒi†j„kƒl…m…n„oppŒ––ŒI0™Js‚›m?@AABCCDDEFFGHHIJKKLMM€NOOPPQQRSTO@@ARXS€BTYTCCD[[P€E\\QFFNd—›J>™L€‚ }DFHJMNPRTVXZ\^`bdfhjlnoprstvx{}j,./sŠs€/sŠs€/ŠŠ]€/ŠŠ]//NЈЂ— LC™M‰‚Ѕ)‘SNNPRUVY[]_acfhjlnpruvvwwxyz|}€‚„‡t789~•~€:~•~€:••g€:••g::YЖЉ—ЅMC™O|‚Њ)™ekidb^]_bdfikmortvy{}€€ƒ„…‡‰ŒŽ‘BCEРЀFРЀF  s€F  sFFeФА—ЊO@™Sz‚Џ)Њ?ABBDEGGIJLMNџVЙДЏЛМНОПРССТУФФХЦЦЧЧШШЩЪЪЫЬ(ЮЭŒ‡ЭжвббааЯЮЬЫЩШЦФТРОМЙЗЕВА­ЋЈІЃЁžŸЇ ‰тЛ‘E‚„Т0Юw Я 9:<<>?ABCDFGHIKLMџVЛЖАКЛМНОППРСТУУФХЦЦЧЧШЩЩ€Ъ€Ы€Ь(ЮЇ“БвзеддгвваЯЮЬЪШЦФТРОЛЙЗДВЏ­ЊЇЅЂŸ ЉЂ‹тИ‘B‚„Т0Ю„ЗЯƒ89;<=>?ABCDFGHIKLџVНЗВЙКЛМНОПРРСТУФХХЦЧЧШШЩ€Ъ€Ы€Ь(ЮЂ•ЁŸЋТдйзедгваЮЭЫЩЦФТРНЛИЖГБЎЋЉІЃЁЂЌЅтЎ‘B‚ƒТ4ФЬЁФаp689;<=>@ABCEFGHJKџV‘ПЙГИЙКЛМНОПРСТУУФХЦЧЧШШЩЩЪЪ€Ы€Ь(Ю ЉтХЈЂЂЎНбкждгбЯЭЫШЦФСПНКИЕВА­ЊЇЅЂЃЎЇŽуkрBšƒТ2ХЩНЯг\6789;<=>@ABCEFGHJџV’РКДЗИЙКЛМНОПРСТУФХХЦЧШШЩЩ€Ъ€Ы)ЬЬЮЁЋєтџшЬАЅЅЌОбйдбЯЭЪШЦУСОМЙЖДБЎЋЉІЃЅЏЉџ‘ЁBЂƒТ7Хбкжзv5678:;<=?@BBDEGGIџV„ТМЖЗИЙКЛМОПРСТУУФХЦЧЧШЩЩЪЪЫЫЬЬ€Э'аЃ­шЃгьіџяЮВЈЈЎПбеаЬЪЧХТРНКИЕВЏЌЊЇЄЉБЅ’џ‘ŸBЂƒТЧпђлліџvzФСЗИЙКМНОПРСТУФХЦЧШШЩЪЪЫЬЬЭЭ€Ю)ЯЯбІАшЂТрсуьє§яЯДЊЊАМШаЪЦФСОМЙЖГА­ЋЈЅЌГІЁѕ‘“BВƒТЧхїппф‚№‰ёќ€kЦФИЙЛМНОПРСТФХХЦЧШЩЪЫЫЬЭЭЮЮЯЯ€абгЉВшЁСррсъєћякЛЌЌЏМХЬХРНКЗДБЎЌЉІВЕЁЏя‘nB„ТШц§ь€ъƒы‡ь іЋ`УЩЙЛМНОПСТУФХЦЧШЩЪЫЫЬЭЮЮЯЯаабб€в еЋДчЁРт№юхсТешћѕмОЏЏБМУЦОИЕВЏЌЉЇИЖ Фб‘eB„ТЩЯяђ‹ѓ‚єїРVВЪПМНОРСТУФХЦЧШЩЪЫЬЭЮЮЯаабвв€гддз­Жч РѕкЕѓљ№чсЦ€ТбфїѕнПББГЙППЖА­ЊЊКЖиЙ‘dB„ТЩЫ€ЬЭЭ€Ю€Яƒа7ббввиъV™ЬФНОРСТУФЦЧШЩЪЫЬЭЮЮЯаббвггддеежжиАИчŸЗїk99wЕѓћцЭ‚ТЌёіуЫ€Д КМИВАЛЕšђ^‘Vb„ТЪЫЫЬЬ€Э€ЮЯЯƒа€бввљk}ЮЫОРСТУФЦЧШЩЪЫЬЭЮЯабввгдде€ж ззикГКчŸЏїkBP€9^ЈцїфЭТТ‚BeЮђњуЬ€ЖЙЛМЏЈѕ’Mb„ТЫЬЬ€Э€ЮЯЯƒа€бвю•dХаТСТУФЦЧШЩЪЫЭЮЯаббвгдеежзз€ийймЕНчžЏїkLƒƒlU>99^ЈцїфЕB €tЛяњфЭ€ЗЇТн’MbƒТУЫ€Ь€ЭЮЮ€Яƒа>бЛІЏЪV­бШТУФЦЧШЩЫЬЭЮЯабвгдежжзииййккллоЗОцЎїkLƒВЙ“ƒlU>99^Јкѓпх‚TМяџщаВчЁ’KzƒТФ‚Ы€Ь€ЭЮЮ€Я€аCĘ}ƒ Жќa„вбУФЦШЩЩЫЬЭЮЯабвддежзиййккллммнпКРцœ­їkLƒР§§цЗ’ƒlUB99Rк6P‚UНсца“B‚ƒТФƒЫ€ЬЭЭ€Ю)ЯЯФœz€žПаббю–bЧеЩХЧЪЫЬЬЭЮЯбвгдежзиййкллмнн€о сМТц›ЁїkLƒМ‚ѕпД‘ƒuYB99Rк:QŠ™B‚ƒТЦЪƒЫ€ЬЭЭЮЮЖŽqŠЙ‚а-бкъZжгЧШЫЮЯЮЮабвгдежзийклммнооппрруПФц››їkLƒИ…юйО—ƒuYB99RЮџ,QŠ–BŠƒТЦЪЪƒЫ ЬЬЭЭС’oˆЗЯЯƒабє„pЯиЬЩЫбвгббвгджзийклммноппр€с тхСЦцš›їkLƒДˆхиЙ•ƒuYG99EƒСџ1t’ОBЂƒТЦ€ЪƒЫ ЬЬЂryЖЮЮЯЯƒа,бтж]ЈкжЪЫадежвгежзийклмнопррсттууфцУШц™šіkL„А‹нвЕ”ƒzcG99EƒСџ7уŸBЂƒТЧЩЪЪƒЫЦ†n—ЧЭ€ЮЯЯƒа,бі‡nЫмвЭЮжиййжжзийкмнопррстууффххшХЩю™™іkMˆЏзжЫЖœƒzcG99EƒСѓ((,ŒšBЂƒТЧЩЩЪЪЫЛyxАЬ€ЭЮЮ€Яƒа/мсa™ннЯЯгклмнкийлмнопрстуффхццччщЧЫі™™цkOЏббааЯŒЮЩБšƒzcL€:xД&„‹„B„ТЧЩЩ€ЪЫЫЌy~Л€Ь€ЭЮЮ€Яƒа1ёЇkПплабйопрсолмнопрстуфхцччшшщыЩЭі›œцnT’ЎЬЫЫЪЩЩШЧŒЦ ТЌ—„€kT=8ЭЄ‹hB„ТШШЩЩ€ЪЎ~ƒМЫЫ€ЬЭЭ€Ю€Я‚а3жђx„дтйвднстуффрорстуфхцчшшщщъъэЫЮі ЁчsZ—ЏЧЧЦХФУУТРПŽОЋ‰Y8цш‹eB„ТШШ€ЩЪНˆ‰НЫ€ЬЭЭ€Ю€Я‚а3хйgпфиезруфцчшцутуфхцчшщъъыььюЭаіЇЄшxaЏФУТСРПОНЛКЙЗЕˆ@]іŒ`RƒТ УЧШШЩЩХŠЗЫ‚Ь€Э€Ю€Яаа‚б4ёГmЎххйзйуцчшщъыышцчшщъыыьээю№ЯвіЫЈщ}gЂАРПОНМЛКИЗЕДВА‹Џ–s8ДРŒMbƒТУЧ€ШЩЂІ€Ь‚ЭЮ€Яаа€б9ЬЏ™‹цЂwМчцлкмцщщыьэююяэьыыьэююяяёагімЛъmЇБНМЛКЙИЖЕГБЏЎЌЊЈˆЇ“‘‘IDѓ+ŒMbƒТ ФЧЧШШМ–šШЬЬЭЭƒЮ€ЯабХ–y{ДгѓˆzЦшшнмоцыьэюя№№ёђё№ђвеімкю…sЌВЛКЙИЖЕГБАЎЌЉЈЅЃЁ†ŸŽ”x8œйKjƒТФ€ЧШЇœДЬ€Э€ЮƒЯ€аббЇw}­айѓŠ|Хъъспрхэю№ёёђѓѓєєѕ€іѓёѓгжімнїŠxБДЙИЗЖДВБЎ­ЊЈІЄЁŸœ™ƒ—•‡ˆ––KDѓLE‚ƒТ ФЦЧЧРЂЃЧЭЭ€Ю€Яƒа€б”pšЯЯ‚а6тіŒФыьцстхьёђѓѓєєѕѕііїїєёѓезіннїŽ~ЖЖИЗЕДВАЎЌЊЇЅЃ š—•‘‹„ƒ•™z8œзŽB‚ƒТХЦЦЧЗЊА€Э€Ю€Яƒабб’nЊЮ€Я‚апѓŽ‚Иъюыфхцщяєѕѕі€ї+ѕђєжиіннї’ƒЛИИЖЕГБЏ­ЊЈЅЃ š—”‰‡†„ƒƒœ˜EDьOŽB‚ƒТХЦЦЧГБПЭ€ЮЯ€а‚бИl‹€Ю€Я‚айќЊ|Ћт№№ъчщъэђі‚ї"јјѕѓєикїннї–‰РЛКИЖЕГАЎЋЉІЃ š–“Œ‰…€ƒŠžžc8СТŽрBšƒТФХЦХЗЗЧ€Ю€Я€а€бвnСЭ€ЮЯЯƒажіФ{˜вюђ№ьыэюяђѕї€ј*љіѓѕйлїннїšŽХРОНЛЙЗЕВЏ­ЊЇЄЁš—“Œˆ„ƒ‡ŸЁ;vэЁBЂƒТХХЦФООЪЮ€Я€а€б€в€г‡†€Э€ЮЯЯƒа=дюц•‡Еуѓєѓ№я№№ёёѓѕіјієілмїооїž“ЩФУСРНЛЙЖДБЎЋЇЄЁš–“‹‡†žЄ–AQѓhŸBЂƒТ€ХЦФФЬЯЯ€а€бв€гд™ЁЮЮ€Я€аббƒв:сќП‰“ЧщіїіѓђёђђѓѓєєѕїмнїппїЂ˜ЮЩШЦФТПНКЗЕБЎЋЈЄЁ™–’ŽŒЂІŸM8кЁ“BГƒУ€ЦЧЫЫЮ€аб€в€г€дЗБЯббвггдеи№яВ†žТх€јїѕ€є(ѕѕіїноїппїІгЮЬЪШЦФСОЛИЕВЏЋЈЄ ™•“ЉЌЇX8Дг‘nBƒУФ€ЦЩггбаб€вг€деЮЪбд€е€ж€зийрі№ДŠ—Езъјљљњњ€љ$њопїпрїЊЂзвбЯЭЪШХТПМЙЕВЎЋЇЃŸœžАДЎZ8Дц’eB„ФЦЧЧШллзббв€гд€ежрскзз„и€йк€л хђјЭЃЄЖбф№ј€ћ$ќпрїррїЎЇмзегбЮЬЩЦУРМЙЕВЎЊІЂЉЛЛ­\8Дэ&’dBƒФХЦ€Чотпвг€д€е€жмєєркл„мн4оопъяяћъЯЏ–›ЈГИЮвгЬиїррїБЌрлкиегаЭЪЦУРМЙЕБ­ЉИУСЋJ8Дэ&“Vc„Х€ЧШмщщзгде€жззоїџюр€о‚п„р2щјјхннуьїџхгЮЖИЎЄІУїррїЕАфромйздбЭЪЧУПМИДЖЦЪЧœEGСв&”McƒХЦ€ЧШд№№х‚деж€з€иь§§ђцс‚тучяћџђп€н€о'пхыяѕїїџџћцссјИДщфтрнкздбЭЪЦТПМЩбЯХ{?bкЪ–Mc„ЦЧЧ€Шяѕѕйƒеж€зиййлшѓџ§јё‚ђїњџјюс€но€п…рссућЛИэщчфсолидбЭЩЧЯизеЉ\BˆьЂ—K|ƒЦ€Ч€Шкїїя„ж€зий‚кфээі№ючсноп€р…с№ќОМёэышхтплидексомХ}G]ФыG˜B„…ЧШШ€Щюћћц„зийклм…нопрстьї§ТРђ№яьщхууфчшхуЬ‡QJЄьОšB……Ч€ШЩЩаћўўф„ийклмн…опр‚стуьњњўХУєђєѓѓђђ№юьцМ~VOщвG›B–†Ш€ЩЪЪкџџ§р„й‚клмно…прс‚туушћ§§ќШЦ‚ј ієцПŽhV_žщаvœОBЇ‡ШЩЩ€Ъоџџ§х„к‚лмн‚оп†рст€ую§џџшіЦХщфШУЋ—u^][РќъвB2œŸBЇˆЩ€ЪЫЫп€џэ…лм‚ноп‚р†стуё€џшкі‘lkihfev‰ЏзџюнЬЩЩd5œšBЇˆЩЪЫЫп€џір„мн‚о‚пр‚с†тучјџџ§чккээлккйуџљєютƒЩd=œ„BŠЪЫЬЬжљџџ§ю…но‚пр‚с‚т†у фё§џџњрккллтф€хс€нокƒЪd=œhB‹Ъ€Ы€ЬЯщ€џћъ„опƒр‚ст‚уƒфюќ€џюлй€к€лм€нооƒЪ~=œeBŒЫ€ЬЭкі€џћэс‚пƒрс‚т‚у‚фхцђќ€џјтйй€кл€м€н€оƒЫ†Bœ`\Ы€Ь€ЭЮЮрљџѕьтр‚с‚т‚у‚фхчяїџњчйк€л€мнооЭ‚Ы‡BœMdŽЬ€ЭЮЯЯоѓ‚џї№шусƒт‚у‚фцыђј‚џѓхйй„к€лм€н€оа‚ЬBœMe„ЬУЁ‡˜У‚ЬЭ€ЮЯефіƒџћјѓёя€ъы№ђєљќƒџјщнийƒкл€м­ЃЪооб‚ЬЊB›KmƒЭГp­уТz™‚ЭЮ€Яƒажхёљ’џњѓцн€и€йк„л ммПr­уТzЄож‚ЭЊB,›EˆƒЭbООЗ„vfƒЭ€ЮЯ„аббзнщюєє†џѕѕэырлж€з€ийкƒл ммyЕОЗ„ysЫж‚ЭЊB,›BˆƒЮo›rsЏІtНƒЮ€Яа„б€вгд€ежƒзий€к€л„мe›nЄІ‡ИиƒЮB/›BˆƒЮwŠЦХХНc…Ю€Яа„б€вгд€е€ж„зи€йк€лƒмŽŒМХХНcдлƒЮB:šрBЌƒЯЦyšЦ­ƒЕ†Я€аб„вг€д€е‚ж€з„ий€кл€мнг‹šН­xСплƒЯB9šЁBЌ…ЯЫПЫˆЯабƒвгд€еж€з…и€йкл€м‚ниЪдоƒЯT6šŸB­”абв„г€дежз€и…й€кл€мн„о€пƒаf=š“BП–бв€г…деж€зи€й…кл€мно„пƒбf=šhB—бв€г…деж€зий„кл€мно„пе‚бo=šeBвеуёЃєŒѕі‹ї€єшзвŠ>š`KкљйџыŠBšVlќџљцвгЬпђџџžCšOsљЦи™ГьХDšQnЌк™ ЗF0™Nmм‡G1™Iu‚Ё‡‚m…n„o…p„q…r‚s„t…u––Ё–I0™Jx‚Іr?@AABCCDDEFFGHHIJKKLMM€NOOPPQQRSTO@@ARXS€BTYTCCD[[P€E\\QFFNd•—ІJ>™L†‚ЊƒDFHJMNPRTVXZ\^`bdfhjlnoprstvx{}j,./sŠs€/sŠs€/ŠŠ]€/ŠŠ]//NЈЉ—ЊLC™M‚Ў)˜SNNPRUVY[]_acfhjlnpruvvwwxyz|}€‚„‡t789~•~€:~•~€:••g€:••g::YЖА—ЎMC™O‚Г)Ÿekidb^]_bdfikmortvy{}€€ƒ„…‡‰ŒŽ‘BCEРЀFРЀF  s€F  sFFeФЗ—ГO@™S}‚З)В?ABBDEGGIJLMNџЌаээыюяƒ№ё‚ђ„ѓєѓЭО7™ %,УЛ‘_˜„дн†ЏнЉ9:<<>?ABCDFGHIKLMџЌаюэьюю€я№ё‚ђ‰ѓємаn'™ (/ФИ‘[˜„дн”ХнŠ89;<=>?ABCDFGHIKLџЌбюэьэ€ю€я№ё‚ђ„ѓ€є ѕкЕ<961– *2ФЎ‘[˜ƒджлЏвоu689;<=>@ABCEFGHJKџЌбяюь€ю€я€№ё‚ђƒѓ„є йлТ†I==:6"“ -5Фk[ЎƒджиЫмр`6789;<=>@ABCEFGHJџЌвяю€э€ю€я€№ё‚ђƒѓєѕймѕцџЯ“X@@>9$ 08џ‘с[Жƒджпчттy5678:;<=?@BBDEGGIџЌШ№яээюю€я№€ёђ‚ѓ…єѕлоы­мёјџм–[DDB<,22џ‘л[ЖƒдиыќххљџМТё№€ю€я€№€ёђ‚ѓƒєѕімпъ­Ыщщъђїўм—^GGEA1Š574ѕ‘Ъ[Хƒдиюљшшы„є‡ѕ§СЗёёюю€я€№€ё€ђѓ‚є…ѕіоръЌЫщъъёїќнАlJJIC3 ‡*80Rя‘š[„диэўё†№…ёђђјжБюђю€я€№€ё€ђ€ѓ‚єƒѕі їртъЌЪъєѓьщ€ъ дсяќщБoNNMG:! „7=-}б‘Œ[„дйнєіїљрЌтђ№яя€№ёё€ђѓ€є‚ѕ…іїсуъЋЪјЯ яћєюъз€д пьњщВqQQOK=$ €=C$ЉЙ‘Š[„дйллм…нопфѕЌгѓёя№№€ё€ђ€ѓєѕ‚і‚їјтфъЊТљAP яќюм‚дЏЗёъПŠ€U N@&@Hт^‘wy„дк€лм…нопћЖТѓђ№№€ё€ђ€ѓ€єѕі…їјфхщЉКљA‚1пњьмдд˜[eЮђєР‹€WQKDA8ѕ’jy„дклм…но€пѓЫГэєё№ёё€ђ€ѓ€є€ѕі‚ї‚ј љхчщЈЙљAƒ1пњьУ[€tЛяѕСŽ€[4rн’jy„дкклм…но ЩДЙхЌоєђёё€ђѓѓ€є€ѕії„ј љљчшщЈИљA`p ƒ1Яѕсх‚TМяџЬ’LЧЁ’jƒдж€клм…н ТЇŒ’ЎФ§ВХѕєё€ђѓѓ€є€ѕ€ії‚ј‚љњшщщЇИљA}ћћЫl‚!pЯ6P‚UНсца“[˜ƒдж€клм‚нвЊ‰ЌЭоопѓЬГэѕѓђђ‚є€ѕ€і€їј„љ њњщъщЇЋљAv‚ыОe‚!pЯ:QŠ™[˜ƒджклмннЦ™Чно пхѕЏдіѕђѓєѕѕє€ѕ€і€ї€ј‚љ‚њ ћъыщІЇљAn…лБy(‚!pРџ,QŠ–[Ÿƒдзйкл€маЂ—ЦнопїФЛёієѓѓѕѕіѕѕіі€їј€љƒњ€ћ ыьшЅІљAeˆЪАp%‚`Аџ1t’[ЖƒдзййклмВƒŠХ„ноыьВйїіѓєѕ€їіі€ї€јљњ‚ћ ќьэшЄІљA]‹КЂg"‚`Аџ7ул[Жƒди€йклле–~Їжм…но љЦЛэїѕєѕїїјј€ї€ј€љњ‚ћ€ќ ююёЄЅљAVŽЊ”i4‚`Ая((,Œж[ЖƒдзйкЫ‰‰Рм…н€о цёЕбјјѕѕіјјљљј€љ€њћƒќ яяљЄЄшAP›š_/‚QŸ&„‹И[„дий€кМˆŽЫллм…н€о ѕжКцјјѕіїјљљњљ€њћ‚ќ€§ №№љЇЈщE I€Œ€‹Š U*ПЄ‹[„диийкО”Ь€лм…н€о тјСЧђљїііљљ€њћњ€ћќƒ§ ёёљЋЋъI C~~€}€|{{ŽzR пш‹Œ[„д€и€йܘ˜Эклм…н€оьэКдїљ€їљњњћћќќћ€ќ‚§€ў ёђљВЏыM=p€onnmmllkkŒjf0іŒ‰jƒдеийеž™Цлмн†о пѕнОнњњјїјњћћ€ќ§‚ќ€§ƒў ђѓљжГьQ7b€a`__^^]\[[‹Z&ŸРŒlyƒдезиВ ЖкклмнƒоиНЇ™щжУфњњјјљћћќќ…§‚ў€џ ѓѓљцХэU 1T€SRQ€PNNMLK‰J! я+ŒjyƒдеззииЬІЉз€лмн‚оппгЅ‰ŠЌТпљЫХщћћ€љћќ‚§ƒўƒџєєљцфёY&,FFEEDCCBA@??><<;†:"€йjƒджззииЗЌУклмн‚оЕ‡ЛнноофљЬЧщћћ€њћ§ƒў„џєѕљццљ^,&988766543210/.-,+ƒ*% ((яL_˜ƒдж€збГГж€лмноппЃЉ‚нооъћЮЩш€ћњћћ§ўˆџѕіљцчљb1 ++*)(('&%$#! %-'€зŽ[˜ƒдж€зЦЙРлмн‚оЂКƒн€о шљаЫуњќќћќќ§ўў‰џ(іїљцчљe7# 22 шOŽ[˜ƒдж€зУРЮлм‚ноппЦ}›…н€оф§мЪоі€§ќ§§ў‰џїїљччљj=& €88ЏТŽ[ЎƒджззжЦЦеллмн‚опœ~ам…н€о тљчЪж№ќўў§§ўўˆџ&їјљцчљnB) :=2Pэс[Жƒд€здЭЭи€мн‚оп—•€м…н€о рѓѕжафїўўџў‰џ&јјљччљrH, 7C> яhл[ЖƒджззжддкƒнопррЉАн…опъ§чгзыљ‹џ%јљљшшљvN/ )('&%$"!%]mlT Џв&”jzƒж€зиифўўђ‡рƒс€тё§ўѕэ€щƒъыэєќџішƒц'чь№ѓјљљџџќэщщњnA+*)('%$"!Rtsq<0ЯЪ–jzƒжзиињџџфр‡с‚т€ухюіџўњƒѕљћџњѓщ‡ч‚ш‚щьў’tD-,+*('%$"!#Mv{z_`шЂ—j‘…зичџџїссˆт‚у‚фыђђљєѓющц‚чˆш‚щъљџ•yG/.-+*('%$;_ƒ‚u; ЏыG˜[™…зийіџџюсˆт‚уƒф‚х‚цƒчˆш‚щєџџšL20.-+0H`ŠŠˆ|?€шОš[™†зио§џџыттˆуƒф‚хƒц‚чƒшˆщъђ€џž…gQfcu“’‘‘Žo1`пвG›[Љ†зийхџџ§ш€уˆф‚хƒцƒчƒш‚щ†ъюўџџ§ЂŒІЂŸœš™˜”m=pпж€œ[Й‡ийкшџџ§ь€ф‰хƒцƒч‚шƒщƒъ‚ыђўџџяљЅšwsU@"€PŸ§№п[Fœл[Йˆийкш€џђфф‰хƒцƒчƒшƒщƒъ€ыѕ€џяхљ@ƒ @€ПџѓчкииzMœж[Й‰ийкш€џљшхх‰ц„чƒшƒщƒъы юњџџ§юфхђпПЯџњїѓъƒиzUœИ[‹й‚ктћџџ§ѓццŠчƒш„щƒъ„ыіўџџќщхъьщчфƒй{Uœ[Œйклня€џќ№ччŠш„щƒъ„ыььѓ§€џѓцфф‚хц‚чƒй’UœŒ[йкллфј€џќђщŠшƒщ„ъ‚ыьѕ§€џњъ‚ф‚хцчƒйš[œ‰sк‚л€мщћџјёъ‰щ„ъƒыэѓљџќю‚ф‚хц‚чшм‚к›[œl{Žк‚лмчї‚џњѕяы‡ъ„ыэёіњ‚џіь€у‚ф‚хцчшо‚кЂ[œj{„квВ›Њвƒк‚лмнсьљƒџќњіѕє„№єѕіњ§ƒџњячƒу‚фх€цЛЁГжччн‚кК[*›jƒƒлУ„ИчЫŒЋƒл‚м‚ноотьѕћ’џћіюцуу‡фх€цЬ…ИчЫŒГшс‚лЛ[=›_›ƒлxШШТ•ˆ{„лм‚нƒотцяѓїї†џјјђ№щцтт‚у†ф‚х ццСШТ•‹…жт‚лЛ[=›[›ƒлƒЋ††МЖ‰Ы„лм‚н†о‚п‚р‚с‚т‚у†ф‚х ц{Ћ‚’ГЖ™Фтƒл[D›[›ƒм‹›гдеЭz†м‚н‚о‡п‚р‚ст‚у‚ф‡х€цŸœЪдеЭyпхƒм[Qš[МƒмдŽ­жО–Ф†м‚н‚о‡п‚р‚с‚туƒф†х€цн­ЮОŒЭшхƒм[Ošс[М…миЭи‰м‚н‚о‡п‚р‚ст‚у‚ф‡хцтеочƒмkNšл[Н•н‚о‚п‡рƒстƒуфƒх‡цчшƒн|UšЪ[Э–н‚о‚п‡р‚с‚т‚у‚фƒх‡цч€шƒн|Uš[˜оƒп‚р‡сƒт‚у‚ф‚х‚ц‡ч‚шр‚о„UšŒ[оръѕŸї—ј–љ€їятоYš‰cфћйџё[šw€§џњъйгдфєџџЋ\šm…њЯиЉПяЬ]šnЙкЉЏС^A™kм­™`A™a‰‚Б•ƒ{…|ˆ}„~…†€…ƒ‚Ѕ–БЇaA™bŒ‚Е€KLMMNNOPQQRSTTUVVWWX€Y€Z[€\ ]^__ZIJJ]d^€K^d^LLMffZMMNgg[OOVlЃ—ЕbR™d™‚К’QSUWY[]_acehiknortvwz{€|}~€‚„†ˆ‹v223˜€3˜€3˜˜f€3˜˜f33QЈЕ—КdY™eЂ‚ОЈb\\^`cegikmprtvy{}ƒ…€†‡ˆ‰‹ŒŽ‘“–<>?‹Є‹€@‹Є‹€@ЄЄr€@ЄЄr@@]ЖМ—ОeX™f”‚Т)Аw~{vrmlnqtvx{}‚„†‰‹‘‘“”•—™œžЁIJL—А—€M—А—€MАА~€MАА~MMjԘТfU™l‘‚Ч)ТHc~„‡Š‹‡…ƒ…ˆ‹’•—™™šš›œž ЁЃІЉЌ˜VXZЄНЄ€ZЄНЄ€ZНН‹€ZНН‹ZZxбЩ‡ЧБW??zМ†ЧЏh@™xƒЫ(EHQk„Š”—š›š—˜˜–™›žЁЃЃЄЅЅЇЈЊЌЎБДИЅegiБЩБ€jБЩБ€jЩЩš€jЩЩšjj‡па†ЫІ.A{k(NТ…ЫВi5™…}ƒЯ(HHNRZsА”—š ЃІЉЌ­ЎЎБАЏЎЏАБВЕЗЙМПУБtwyОеО€zОеО€zееЇ€zееЇzz—ьж†Я]H€ФЖ+–…Яœjš”kƒд(iHNRW\dv—š ЃІЉЌЏВЕЙЛЛМНМННПСФЧЪЮО…ˆ‹ЬсЬ€ŒЬсЬ€ŒссЗ€ŒссЗŒŒЇњн…дП@l€vR#ƒ…дŸgšЏmб‚и(jHNRW\agm ЃІЉЌЏВЕЙЛЛМНОПСУХШЫЯгФ‘•˜гцг€™гцг€™ццР€™ццР™™Гџс…иЫS##!…и‡cšЯnР‚м(nHNRW\agmps{Š™ІЉЌЏВЕЙЛЛМНОПСУХШЫЯгЧœŸЂеце€Єеце€ЄццХ€ЄццХЄЄКџф…ми€а…мŠbšхpЖ‚р(“HNRW\agmpsvy}€Ž™ЃЋЕЙЛЛМНОПСУХШЫЯгЩІЉ­ици€Ўици€ЎццЪ€ЎццЪЎЎТџш†ръ3Btj!šу…рp[›rœ‚хђЛџы†хцїŸ€€Оя…хЯqR›‰rкщюЛєыˆщьяяъ†щžr›•t™иэЮtcuЃжђв}pžuv†ЖвжЦІvo- NnдwoWџџџџџ‹t8mk@!RƒСТџџџџџџџџвУ•v6QЁрџџџџџџџџџџџџџџџџџџџЕw'AЁ№џџџџџџџџџџџџџџџџџџџџџџџџџЖibбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуl Rрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуl "СџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ?‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩ12№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђT bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvcџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџycџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџzcџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџm#№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєQбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн2 „џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ 4џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъ9eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃ! сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕDQ‚ƒ„„„„„„„„„„„„„„„„„„„„„„„„„„ЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ& BрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіGcџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“& #№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџу9Єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџo"№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА1)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфBLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]$ Pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“0aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ;ŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчR$‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\+ Шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd0 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџs5 Ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“9 хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜Aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡C!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvBOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџs>Pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђo9Sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуl6џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦf1џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕ^, џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєџџџџџџџџџџџџџџџ’T& ­џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ­гѓџџџџџџџџџџџђzJ Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™ƒ~‚ЂФьџџџџџџџџзq> Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй–WXfs€šУьџџџџџБf3 ЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓЖ|HTbq™Тпчв€U( џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓД‡STbq|ƒ~f?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџС‡SPWSB%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР;!?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧz(PџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдjQџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе0bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџcŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџr+џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщh8‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџСl: Шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘a0 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй}O# ЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸl< хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџк‚W* џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ o@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭ‚W+!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэk>OџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋ{Q' PџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТ†`5SџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлŽmBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџч“vM' џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэ|V/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэž€\5­џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмž_9 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе”~^:  ЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљУ‘zY7  ЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюЈtT3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџља–…kL-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмЈz_@%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе–„lP4 ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ€aA'PџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭi? Qџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс\-bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрY( Žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс\+ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџa.‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe1 Шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџi4 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ7 Ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•: хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЁBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМF!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОKOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџПO"PџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзS$ SџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрW' џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџсZ* џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№_- ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџc0­џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџh2 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџk5 Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“8 зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНIџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОM!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗP#цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸP#Ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•M!ВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxF—џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјt@ zџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфo9 [џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмi4<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХb/ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџД[* ЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆR$MџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиxH &Њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ–i9>ЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓЌ~T(  &M˜уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєаžƒa8.PoƒŽ’“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““’‰z_> *CYgmooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooomi`M5 )267777777777777777777777777777777777777777777777777777777777777777777777777777777777774."  refit-0.14/partinsp/partinsp_Prefix.pch0000644000175000017500000000022310545172625017622 0ustar julienjulien// // Prefix header for all source files of the 'partshow' target in the 'partshow' project // #ifdef __OBJC__ #import #endif refit-0.14/partinsp/ToolRunner.h0000644000175000017500000000426710570501016016231 0ustar julienjulien/* * partinsp/ToolRunner.h * Helper class to run embedded tool with root privileges * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @interface ToolRunner : NSObject { @private NSString *launchPath; NSArray *arguments; SEL callbackSelector; id callbackObject; NSTask *task; NSFileHandle *stdoutHandle; NSMutableData *stdoutData; } // init - (id)initWithLaunchPath:(NSString *)_launchPath arguments:(NSArray *)_arguments callbackSelector:(SEL)_callbackSelector callbackObject:(id)_callbackObject; - (void)launchTool; - (void)readCompleted; - (void)didReadNextChunk:(NSNotification *)notification; @end refit-0.14/partinsp/ToolRunner.m0000644000175000017500000001552710570501016016237 0ustar julienjulien/* * partinsp/ToolRunner.m * Helper class to run embedded tool with root privileges * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import "ToolRunner.h" #include #include @implementation ToolRunner // init - (id)initWithLaunchPath:(NSString *)_launchPath arguments:(NSArray *)_arguments callbackSelector:(SEL)_callbackSelector callbackObject:(id)_callbackObject { self = [super init]; if (self) { launchPath = [_launchPath retain]; arguments = [_arguments retain]; callbackSelector = _callbackSelector; callbackObject = _callbackObject; task = nil; stdoutHandle = nil; stdoutData = nil; } return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [launchPath release]; [arguments release]; [stdoutData release]; [super dealloc]; } - (void)launchTool { stdoutData = [[NSMutableData data] retain]; #ifdef USE_SUDO task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/sudo"]; NSMutableArray *fullArguments = [NSMutableArray array]; [fullArguments addObject:launchPath]; [fullArguments addObjectsFromArray:arguments]; [task setArguments:fullArguments]; NSPipe *stdoutPipe = [NSPipe pipe]; stdoutHandle = [[stdoutPipe fileHandleForReading] retain]; [task setStandardOutput:stdoutPipe]; [task launch]; #else OSStatus myStatus; int i; FILE *pipefile; // create authorization session AuthorizationFlags myFlags = kAuthorizationFlagDefaults; AuthorizationRef myAuthorizationRef; myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, myFlags, &myAuthorizationRef); if (myStatus == errAuthorizationSuccess) { // add the execute right AuthorizationItem myItems = { kAuthorizationRightExecute, 0, NULL, 0 }; AuthorizationRights myRights = { 1, &myItems }; myFlags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; myStatus = AuthorizationCopyRights(myAuthorizationRef, &myRights, NULL, myFlags, NULL); if (myStatus == errAuthorizationSuccess) { const char *myToolPath = [launchPath UTF8String]; const char **myArguments = malloc(sizeof(const char *) * ([arguments count] + 1)); if (myArguments == nil) return; for (i = 0; i < [arguments count]; i++) myArguments[i] = [[arguments objectAtIndex:i] UTF8String]; myArguments[i] = nil; myFlags = kAuthorizationFlagDefaults; myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, myToolPath, myFlags, (char **)myArguments, &pipefile); // NOTE: The cast of myArguments avoids a compiler warning only. // The function actually expects a "const * char *", but the Obj-C // compiler somehow doesn't know about that... free(myArguments); if (myStatus == errAuthorizationSuccess) { stdoutHandle = [[NSFileHandle alloc] initWithFileDescriptor:fileno(pipefile)]; } else { // TODO: error handling } } //AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults); } // TODO: error handling if (stdoutHandle == nil) { [callbackObject performSelectorOnMainThread:callbackSelector withObject:nil waitUntilDone:NO]; return; } #endif // arrange for data to be read asynchronously [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReadNextChunk:) name:NSFileHandleReadCompletionNotification object:stdoutHandle]; [stdoutHandle readInBackgroundAndNotify]; } - (void)readCompleted { // close our end of the pipe [stdoutHandle closeFile]; [stdoutHandle release]; stdoutHandle = nil; // release the task [task release]; task = nil; // send all data to the client object NSString *stdoutString = [[[NSString alloc] initWithData:stdoutData encoding:NSUTF8StringEncoding] autorelease]; [stdoutData release]; stdoutData = nil; [callbackObject performSelectorOnMainThread:callbackSelector withObject:stdoutString waitUntilDone:NO]; } - (void)didReadNextChunk:(NSNotification *)notification { if ([notification object] != stdoutHandle) return; NSData *chunk = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; if ([chunk length] == 0) { // reached EOF [self readCompleted]; } else { // got some data [stdoutData appendData:chunk]; [stdoutHandle readInBackgroundAndNotify]; } } @end refit-0.14/refit/0000755000175000017500000000000011363100432013207 5ustar julienjulienrefit-0.14/refit/config.c0000644000175000017500000003377111344445254014650 0ustar julienjulien/* * refit/config.c * Configuration file functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" // constants #define CONFIG_FILE_NAME L"refit.conf" #define MAXCONFIGFILESIZE (64*1024) #define ENCODING_ISO8859_1 (0) #define ENCODING_UTF8 (1) #define ENCODING_UTF16_LE (2) // global configuration with default values REFIT_CONFIG GlobalConfig = { FALSE, 20, 0, 0, 0, FALSE, NULL, NULL, NULL, NULL }; // // read a file into a buffer // static EFI_STATUS ReadFile(IN EFI_FILE_HANDLE BaseDir, CHAR16 *FileName, REFIT_FILE *File) { EFI_STATUS Status; EFI_FILE_HANDLE FileHandle; EFI_FILE_INFO *FileInfo; UINT64 ReadSize; File->Buffer = NULL; File->BufferSize = 0; // read the file, allocating a buffer on the woy Status = BaseDir->Open(BaseDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0); if (CheckError(Status, L"while loading the configuration file")) return Status; FileInfo = LibFileInfo(FileHandle); if (FileInfo == NULL) { // TODO: print and register the error FileHandle->Close(FileHandle); return EFI_LOAD_ERROR; } ReadSize = FileInfo->FileSize; if (ReadSize > MAXCONFIGFILESIZE) ReadSize = MAXCONFIGFILESIZE; FreePool(FileInfo); File->BufferSize = (UINTN)ReadSize; // was limited to a few K before, so this is safe File->Buffer = AllocatePool(File->BufferSize); Status = FileHandle->Read(FileHandle, &File->BufferSize, File->Buffer); if (CheckError(Status, L"while loading the configuration file")) { FreePool(File->Buffer); File->Buffer = NULL; FileHandle->Close(FileHandle); return Status; } Status = FileHandle->Close(FileHandle); // setup for reading File->Current8Ptr = (CHAR8 *)File->Buffer; File->End8Ptr = File->Current8Ptr + File->BufferSize; File->Current16Ptr = (CHAR16 *)File->Buffer; File->End16Ptr = File->Current16Ptr + (File->BufferSize >> 1); // detect encoding File->Encoding = ENCODING_ISO8859_1; // default: 1:1 translation of CHAR8 to CHAR16 if (File->BufferSize >= 4) { if (File->Buffer[0] == 0xFF && File->Buffer[1] == 0xFE) { // BOM in UTF-16 little endian (or UTF-32 little endian) File->Encoding = ENCODING_UTF16_LE; // use CHAR16 as is File->Current16Ptr++; } else if (File->Buffer[0] == 0xEF && File->Buffer[1] == 0xBB && File->Buffer[2] == 0xBF) { // BOM in UTF-8 File->Encoding = ENCODING_UTF8; // translate from UTF-8 to UTF-16 File->Current8Ptr += 3; } else if (File->Buffer[1] == 0 && File->Buffer[3] == 0) { File->Encoding = ENCODING_UTF16_LE; // use CHAR16 as is } // TODO: detect other encodings as they are implemented } return EFI_SUCCESS; } // // get a single line of text from a file // static CHAR16 *ReadLine(REFIT_FILE *File) { CHAR16 *Line, *q; UINTN LineLength; if (File->Buffer == NULL) return NULL; if (File->Encoding == ENCODING_ISO8859_1 || File->Encoding == ENCODING_UTF8) { CHAR8 *p, *LineStart, *LineEnd; p = File->Current8Ptr; if (p >= File->End8Ptr) return NULL; LineStart = p; for (; p < File->End8Ptr; p++) if (*p == 13 || *p == 10) break; LineEnd = p; for (; p < File->End8Ptr; p++) if (*p != 13 && *p != 10) break; File->Current8Ptr = p; LineLength = (UINTN)(LineEnd - LineStart) + 1; Line = AllocatePool(LineLength * sizeof(CHAR16)); if (Line == NULL) return NULL; q = Line; if (File->Encoding == ENCODING_ISO8859_1) { for (p = LineStart; p < LineEnd; ) *q++ = *p++; } else if (File->Encoding == ENCODING_UTF8) { // TODO: actually handle UTF-8 for (p = LineStart; p < LineEnd; ) *q++ = *p++; } *q = 0; } else if (File->Encoding == ENCODING_UTF16_LE) { CHAR16 *p, *LineStart, *LineEnd; p = File->Current16Ptr; if (p >= File->End16Ptr) return NULL; LineStart = p; for (; p < File->End16Ptr; p++) if (*p == 13 || *p == 10) break; LineEnd = p; for (; p < File->End16Ptr; p++) if (*p != 13 && *p != 10) break; File->Current16Ptr = p; LineLength = (UINTN)(LineEnd - LineStart) + 1; Line = AllocatePool(LineLength * sizeof(CHAR16)); if (Line == NULL) return NULL; for (p = LineStart, q = Line; p < LineEnd; ) *q++ = *p++; *q = 0; } else return NULL; // unsupported encoding return Line; } // // get a line of tokens from a file // static VOID ReadTokenLine(IN REFIT_FILE *File, OUT CHAR16 ***TokenList, OUT UINTN *TokenCount) { BOOLEAN LineFinished; CHAR16 *Line, *Token, *p; *TokenCount = 0; *TokenList = NULL; while (*TokenCount == 0) { Line = ReadLine(File); if (Line == NULL) return; p = Line; LineFinished = FALSE; while (!LineFinished) { // skip whitespace while (*p == ' ' || *p == '\t' || *p == '=') p++; if (*p == 0 || *p == '#') break; Token = p; // find end of token while (*p && *p != ' ' && *p != '\t' && *p != '=' && *p != '#') p++; if (*p == 0 || *p == '#') LineFinished = TRUE; *p++ = 0; AddListElement((VOID ***)TokenList, TokenCount, (VOID *)StrDuplicate(Token)); } FreePool(Line); } } static VOID FreeTokenLine(IN OUT CHAR16 ***TokenList, IN OUT UINTN *TokenCount) { // TODO: also free the items FreeList((VOID ***)TokenList, TokenCount); } // // handle a parameter with a single integer argument // static VOID HandleInt(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT UINTN *Value) { if (TokenCount < 2) { return; } if (TokenCount > 2) { return; } *Value = Atoi(TokenList[1]); } // // handle a parameter with a single string argument // static VOID HandleString(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT CHAR16 **Value) { if (TokenCount < 2) { return; } if (TokenCount > 2) { return; } *Value = StrDuplicate(TokenList[1]); } // // handle an enumeration parameter // static VOID HandleEnum(IN CHAR16 **TokenList, IN UINTN TokenCount, IN CHAR16 **EnumList, IN UINTN EnumCount, OUT UINTN *Value) { UINTN i; if (TokenCount < 2) { return; } if (TokenCount > 2) { return; } // look for the enum value for (i = 0; i < EnumCount; i++) if (StriCmp(EnumList[i], TokenList[1]) == 0) { *Value = i; return; } // try to handle an int instead *Value = Atoi(TokenList[1]); } // // read config file // static CHAR16 *HideBadgesEnum[3] = { L"none", L"internal", L"all" }; VOID ReadConfig(VOID) { EFI_STATUS Status; REFIT_FILE File; CHAR16 **TokenList; CHAR16 *FlagName; UINTN TokenCount, i; if (!FileExists(SelfDir, CONFIG_FILE_NAME)) return; Print(L"Reading configuration file...\n"); Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File); if (EFI_ERROR(Status)) return; for (;;) { ReadTokenLine(&File, &TokenList, &TokenCount); if (TokenCount == 0) break; if (StriCmp(TokenList[0], L"timeout") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.Timeout)); } else if (StriCmp(TokenList[0], L"disable") == 0) { for (i = 1; i < TokenCount; i++) { FlagName = TokenList[i]; if (StriCmp(FlagName, L"shell") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL; } else if (StriCmp(FlagName, L"tools") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_TOOLS; } else if (StriCmp(FlagName, L"optical") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_OPTICAL; } else if (StriCmp(FlagName, L"external") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_EXTERNAL; } else if (StriCmp(FlagName, L"internal") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_INTERNAL; } else if (StriCmp(FlagName, L"singleuser") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_SINGLEUSER; } else if (StriCmp(FlagName, L"hwtest") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_HWTEST; } else if (StriCmp(FlagName, L"all") == 0) { GlobalConfig.DisableFlags = DISABLE_ALL; } else { Print(L" unknown disable flag: '%s'\n", FlagName); } } } else if (StriCmp(TokenList[0], L"disableopticalboot") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_OPTICAL; } else if (StriCmp(TokenList[0], L"disableexternalboot") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_EXTERNAL; } else if (StriCmp(TokenList[0], L"disableinternalboot") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_INTERNAL; } else if (StriCmp(TokenList[0], L"hidebadges") == 0) { HandleEnum(TokenList, TokenCount, HideBadgesEnum, 3, &(GlobalConfig.HideBadges)); } else if (StriCmp(TokenList[0], L"hideui") == 0) { for (i = 1; i < TokenCount; i++) { FlagName = TokenList[i]; if (StriCmp(FlagName, L"banner") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_BANNER; } else if (StriCmp(FlagName, L"shell") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL; } else if (StriCmp(FlagName, L"tools") == 0) { GlobalConfig.DisableFlags |= DISABLE_FLAG_TOOLS; } else if (StriCmp(FlagName, L"funcs") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_FUNCS; } else if (StriCmp(FlagName, L"label") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_LABEL; } else if (StriCmp(FlagName, L"hdbadges") == 0) { if (GlobalConfig.HideBadges < 1) GlobalConfig.HideBadges = 1; } else if (StriCmp(FlagName, L"badges") == 0) { if (GlobalConfig.HideBadges < 2) GlobalConfig.HideBadges = 2; } else if (StriCmp(FlagName, L"all") == 0) { GlobalConfig.HideUIFlags = HIDEUI_ALL; GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL | DISABLE_FLAG_TOOLS; if (GlobalConfig.HideBadges < 1) GlobalConfig.HideBadges = 1; } else { Print(L" unknown hideui flag: '%s'\n", FlagName); } } } else if (StriCmp(TokenList[0], L"banner") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.BannerFileName)); } else if (StriCmp(TokenList[0], L"selection_small") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.SelectionSmallFileName)); } else if (StriCmp(TokenList[0], L"selection_big") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.SelectionBigFileName)); } else if (StriCmp(TokenList[0], L"default_selection") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.DefaultSelection)); } else if (StriCmp(TokenList[0], L"textonly") == 0) { GlobalConfig.TextOnly = TRUE; } else if (StriCmp(TokenList[0], L"legacyfirst") == 0) { GlobalConfig.LegacyFirst = TRUE; } else { Print(L" unknown configuration command: '%s'\n", TokenList[0]); } FreeTokenLine(&TokenList, &TokenCount); } FreePool(File.Buffer); } refit-0.14/refit/icns.c0000644000175000017500000001345210570501406014321 0ustar julienjulien/* * refit/icns.c * Loader for .icns icon files * * Copyright (c) 2006-2007 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" // // well-known icons // typedef struct { EG_IMAGE *Image; CHAR16 *Path; UINTN PixelSize; } BUILTIN_ICON; BUILTIN_ICON BuiltinIconTable[BUILTIN_ICON_COUNT] = { { NULL, L"icons\\func_about.icns", 48 }, { NULL, L"icons\\func_reset.icns", 48 }, { NULL, L"icons\\func_shutdown.icns", 48 }, { NULL, L"icons\\tool_shell.icns", 48 }, { NULL, L"icons\\tool_part.icns", 48 }, { NULL, L"icons\\tool_rescue.icns", 48 }, { NULL, L"icons\\vol_internal.icns", 32 }, { NULL, L"icons\\vol_external.icns", 32 }, { NULL, L"icons\\vol_optical.icns", 32 }, }; EG_IMAGE * BuiltinIcon(IN UINTN Id) { if (Id >= BUILTIN_ICON_COUNT) return NULL; if (BuiltinIconTable[Id].Image == NULL) BuiltinIconTable[Id].Image = LoadIcnsFallback(SelfDir, BuiltinIconTable[Id].Path, BuiltinIconTable[Id].PixelSize); return BuiltinIconTable[Id].Image; } // // Load an icon for an operating system // EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo) { EG_IMAGE *Image; CHAR16 CutoutName[16]; CHAR16 FileName[256]; UINTN StartIndex, Index, NextIndex; if (GlobalConfig.TextOnly) // skip loading if it's not used anyway return NULL; Image = NULL; // try the names from OSIconName for (StartIndex = 0; OSIconName != NULL && OSIconName[StartIndex]; StartIndex = NextIndex) { // find the next name in the list NextIndex = 0; for (Index = StartIndex; OSIconName[Index]; Index++) { if (OSIconName[Index] == ',') { NextIndex = Index + 1; break; } } if (OSIconName[Index] == 0) NextIndex = Index; // construct full path if (Index > StartIndex + 15) // prevent buffer overflow continue; CopyMem(CutoutName, OSIconName + StartIndex, (Index - StartIndex) * sizeof(CHAR16)); CutoutName[Index - StartIndex] = 0; SPrint(FileName, 255, L"icons\\%s_%s.icns", BootLogo ? L"boot" : L"os", CutoutName); // try to load it Image = egLoadIcon(SelfDir, FileName, 128); if (Image != NULL) return Image; } // try the fallback name SPrint(FileName, 255, L"icons\\%s_%s.icns", BootLogo ? L"boot" : L"os", FallbackIconName); Image = egLoadIcon(SelfDir, FileName, 128); if (Image != NULL) return Image; // try the fallback name with os_ instead of boot_ if (BootLogo) return LoadOSIcon(NULL, FallbackIconName, FALSE); return DummyImage(128); } // // Load an image from a .icns file // EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize) { if (GlobalConfig.TextOnly) // skip loading if it's not used anyway return NULL; return egLoadIcon(BaseDir, FileName, PixelSize); } static EG_PIXEL BlackPixel = { 0x00, 0x00, 0x00, 0 }; //static EG_PIXEL YellowPixel = { 0x00, 0xff, 0xff, 0 }; EG_IMAGE * DummyImage(IN UINTN PixelSize) { EG_IMAGE *Image; UINTN x, y, LineOffset; CHAR8 *Ptr, *YPtr; Image = egCreateFilledImage(PixelSize, PixelSize, TRUE, &BlackPixel); LineOffset = PixelSize * 4; YPtr = (CHAR8 *)Image->PixelData + ((PixelSize - 32) >> 1) * (LineOffset + 4); for (y = 0; y < 32; y++) { Ptr = YPtr; for (x = 0; x < 32; x++) { if (((x + y) % 12) < 6) { *Ptr++ = 0; *Ptr++ = 0; *Ptr++ = 0; } else { *Ptr++ = 0; *Ptr++ = 255; *Ptr++ = 255; } *Ptr++ = 144; } YPtr += LineOffset; } return Image; } EG_IMAGE * LoadIcnsFallback(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize) { EG_IMAGE *Image; if (GlobalConfig.TextOnly) // skip loading if it's not used anyway return NULL; Image = LoadIcns(BaseDir, FileName, PixelSize); if (Image == NULL) Image = DummyImage(PixelSize); return Image; } refit-0.14/refit/lib.c0000644000175000017500000010713511344436214014141 0ustar julienjulien/* * refit/lib.c * General library functions * * Copyright (c) 2006-2009 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" // variables EFI_HANDLE SelfImageHandle; EFI_LOADED_IMAGE *SelfLoadedImage; EFI_FILE *SelfRootDir; EFI_FILE *SelfDir; CHAR16 *SelfDirPath; REFIT_VOLUME *SelfVolume = NULL; REFIT_VOLUME **Volumes = NULL; UINTN VolumesCount = 0; // functions static EFI_STATUS FinishInitRefitLib(VOID); static VOID UninitVolumes(VOID); static VOID ReinitVolumes(VOID); // // self recognition stuff // EFI_STATUS InitRefitLib(IN EFI_HANDLE ImageHandle) { EFI_STATUS Status; CHAR16 *DevicePathAsString; CHAR16 BaseDirectory[256]; UINTN i; SelfImageHandle = ImageHandle; Status = BS->HandleProtocol(SelfImageHandle, &LoadedImageProtocol, (VOID **) &SelfLoadedImage); if (CheckFatalError(Status, L"while getting a LoadedImageProtocol handle")) return EFI_LOAD_ERROR; /* if (SelfLoadedImage->LoadOptionsSize > 0) { CHAR16 Buffer[1024]; UINTN Length = SelfLoadedImage->LoadOptionsSize / 2; if (Length > 1023) Length = 1023; CopyMem(Buffer, SelfLoadedImage->LoadOptions, SelfLoadedImage->LoadOptionsSize); Buffer[Length] = 0; Print(L"Load options: '%s'\n", Buffer); CheckError(EFI_LOAD_ERROR, L"FOR DEBUGGING"); } */ // find the current directory DevicePathAsString = DevicePathToStr(SelfLoadedImage->FilePath); if (DevicePathAsString != NULL) { StrCpy(BaseDirectory, DevicePathAsString); FreePool(DevicePathAsString); for (i = StrLen(BaseDirectory); i > 0 && BaseDirectory[i] != '\\'; i--) ; BaseDirectory[i] = 0; } else BaseDirectory[0] = 0; SelfDirPath = StrDuplicate(BaseDirectory); return FinishInitRefitLib(); } VOID UninitRefitLib(VOID) { // called before running external programs to close open file handles UninitVolumes(); if (SelfDir != NULL) { SelfDir->Close(SelfDir); SelfDir = NULL; } if (SelfRootDir != NULL) { SelfRootDir->Close(SelfRootDir); SelfRootDir = NULL; } } EFI_STATUS ReinitRefitLib(VOID) { // called after running external programs to re-open file handles //EFI_STATUS Status; ReinitVolumes(); if (SelfVolume != NULL && SelfVolume->RootDir != NULL) SelfRootDir = SelfVolume->RootDir; return FinishInitRefitLib(); } static EFI_STATUS FinishInitRefitLib(VOID) { EFI_STATUS Status; if (SelfRootDir == NULL) { SelfRootDir = LibOpenRoot(SelfLoadedImage->DeviceHandle); if (SelfRootDir == NULL) { CheckError(EFI_LOAD_ERROR, L"while (re)opening our installation volume"); return EFI_LOAD_ERROR; } } Status = SelfRootDir->Open(SelfRootDir, &SelfDir, SelfDirPath, EFI_FILE_MODE_READ, 0); if (CheckFatalError(Status, L"while opening our installation directory")) return EFI_LOAD_ERROR; return EFI_SUCCESS; } // // list functions // VOID CreateList(OUT VOID ***ListPtr, OUT UINTN *ElementCount, IN UINTN InitialElementCount) { UINTN AllocateCount; *ElementCount = InitialElementCount; if (*ElementCount > 0) { AllocateCount = (*ElementCount + 7) & ~7; // next multiple of 8 *ListPtr = AllocatePool(sizeof(VOID *) * AllocateCount); } else { *ListPtr = NULL; } } VOID AddListElement(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount, IN VOID *NewElement) { UINTN AllocateCount; if ((*ElementCount & 7) == 0) { AllocateCount = *ElementCount + 8; if (*ElementCount == 0) *ListPtr = AllocatePool(sizeof(VOID *) * AllocateCount); else *ListPtr = ReallocatePool(*ListPtr, sizeof(VOID *) * (*ElementCount), sizeof(VOID *) * AllocateCount); } (*ListPtr)[*ElementCount] = NewElement; (*ElementCount)++; } VOID FreeList(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount) { UINTN i; if (*ElementCount > 0) { for (i = 0; i < *ElementCount; i++) { // TODO: call a user-provided routine for each element here FreePool((*ListPtr)[i]); } FreePool(*ListPtr); } } // // firmware device path discovery // static UINT8 LegacyLoaderMediaPathData[] = { 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; static EFI_DEVICE_PATH *LegacyLoaderMediaPath = (EFI_DEVICE_PATH *)LegacyLoaderMediaPathData; VOID ExtractLegacyLoaderPaths(EFI_DEVICE_PATH **PathList, UINTN MaxPaths, EFI_DEVICE_PATH **HardcodedPathList) { EFI_STATUS Status; UINTN HandleCount = 0; UINTN HandleIndex, HardcodedIndex; EFI_HANDLE *Handles; EFI_HANDLE Handle; UINTN PathCount = 0; UINTN PathIndex; EFI_LOADED_IMAGE *LoadedImage; EFI_DEVICE_PATH *DevicePath; BOOLEAN Seen; MaxPaths--; // leave space for the terminating NULL pointer // get all LoadedImage handles Status = LibLocateHandle(ByProtocol, &LoadedImageProtocol, NULL, &HandleCount, &Handles); if (CheckError(Status, L"while listing LoadedImage handles")) { if (HardcodedPathList) { for (HardcodedIndex = 0; HardcodedPathList[HardcodedIndex] && PathCount < MaxPaths; HardcodedIndex++) PathList[PathCount++] = HardcodedPathList[HardcodedIndex]; } PathList[PathCount] = NULL; return; } for (HandleIndex = 0; HandleIndex < HandleCount && PathCount < MaxPaths; HandleIndex++) { Handle = Handles[HandleIndex]; Status = BS->HandleProtocol(Handle, &LoadedImageProtocol, (VOID **) &LoadedImage); if (EFI_ERROR(Status)) continue; // This can only happen if the firmware scewed up, ignore it. Status = BS->HandleProtocol(LoadedImage->DeviceHandle, &DevicePathProtocol, (VOID **) &DevicePath); if (EFI_ERROR(Status)) continue; // This happens, ignore it. // Only grab memory range nodes if (DevicePathType(DevicePath) != HARDWARE_DEVICE_PATH || DevicePathSubType(DevicePath) != HW_MEMMAP_DP) continue; // Check if we have this device path in the list already // WARNING: This assumes the first node in the device path is unique! Seen = FALSE; for (PathIndex = 0; PathIndex < PathCount; PathIndex++) { if (DevicePathNodeLength(DevicePath) != DevicePathNodeLength(PathList[PathIndex])) continue; if (CompareMem(DevicePath, PathList[PathIndex], DevicePathNodeLength(DevicePath)) == 0) { Seen = TRUE; break; } } if (Seen) continue; PathList[PathCount++] = AppendDevicePath(DevicePath, LegacyLoaderMediaPath); } FreePool(Handles); if (HardcodedPathList) { for (HardcodedIndex = 0; HardcodedPathList[HardcodedIndex] && PathCount < MaxPaths; HardcodedIndex++) PathList[PathCount++] = HardcodedPathList[HardcodedIndex]; } PathList[PathCount] = NULL; } // // volume functions // static VOID ScanVolumeBootcode(IN OUT REFIT_VOLUME *Volume, OUT BOOLEAN *Bootable) { EFI_STATUS Status; UINT8 SectorBuffer[2048]; UINTN i; MBR_PARTITION_INFO *MbrTable; BOOLEAN MbrTableFound; Volume->HasBootCode = FALSE; Volume->OSIconName = NULL; Volume->OSName = NULL; *Bootable = FALSE; if (Volume->BlockIO == NULL) return; if (Volume->BlockIO->Media->BlockSize > 2048) return; // our buffer is too small... // look at the boot sector (this is used for both hard disks and El Torito images!) Status = Volume->BlockIO->ReadBlocks(Volume->BlockIO, Volume->BlockIO->Media->MediaId, Volume->BlockIOOffset, 2048, SectorBuffer); if (!EFI_ERROR(Status)) { if (*((UINT16 *)(SectorBuffer + 510)) == 0xaa55 && SectorBuffer[0] != 0) { *Bootable = TRUE; Volume->HasBootCode = TRUE; } // detect specific boot codes if (CompareMem(SectorBuffer + 2, "LILO", 4) == 0 || CompareMem(SectorBuffer + 6, "LILO", 4) == 0 || CompareMem(SectorBuffer + 3, "SYSLINUX", 8) == 0 || FindMem(SectorBuffer, 2048, "ISOLINUX", 8) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"linux"; Volume->OSName = L"Linux"; } else if (FindMem(SectorBuffer, 512, "Geom\0Hard Disk\0Read\0 Error", 26) >= 0) { // GRUB Volume->HasBootCode = TRUE; Volume->OSIconName = L"grub,linux"; Volume->OSName = L"Linux"; } else if ((*((UINT32 *)(SectorBuffer + 502)) == 0 && *((UINT32 *)(SectorBuffer + 506)) == 50000 && *((UINT16 *)(SectorBuffer + 510)) == 0xaa55) || FindMem(SectorBuffer, 2048, "Starting the BTX loader", 23) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"freebsd"; Volume->OSName = L"FreeBSD"; } else if (FindMem(SectorBuffer, 512, "!Loading", 8) >= 0 || FindMem(SectorBuffer, 2048, "/cdboot\0/CDBOOT\0", 16) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"openbsd"; Volume->OSName = L"OpenBSD"; } else if (FindMem(SectorBuffer, 512, "Not a bootxx image", 18) >= 0 || *((UINT32 *)(SectorBuffer + 1028)) == 0x7886b6d1) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"netbsd"; Volume->OSName = L"NetBSD"; } else if (FindMem(SectorBuffer, 2048, "NTLDR", 5) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"win"; Volume->OSName = L"Windows"; } else if (FindMem(SectorBuffer, 2048, "BOOTMGR", 7) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"winvista,win"; Volume->OSName = L"Windows"; } else if (FindMem(SectorBuffer, 512, "CPUBOOT SYS", 11) >= 0 || FindMem(SectorBuffer, 512, "KERNEL SYS", 11) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"freedos"; Volume->OSName = L"FreeDOS"; } else if (FindMem(SectorBuffer, 512, "OS2LDR", 6) >= 0 || FindMem(SectorBuffer, 512, "OS2BOOT", 7) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"ecomstation"; Volume->OSName = L"eComStation"; } else if (FindMem(SectorBuffer, 512, "Be Boot Loader", 14) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"beos"; Volume->OSName = L"BeOS"; } else if (FindMem(SectorBuffer, 512, "yT Boot Loader", 14) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"zeta,beos"; Volume->OSName = L"ZETA"; } else if (FindMem(SectorBuffer, 512, "\x04" "beos\x06" "system\x05" "zbeos", 18) >= 0 || FindMem(SectorBuffer, 512, "\x06" "system\x0c" "haiku_loader", 20) >= 0) { Volume->HasBootCode = TRUE; Volume->OSIconName = L"haiku,beos"; Volume->OSName = L"Haiku"; } // NOTE: If you add an operating system with a name that starts with 'W' or 'L', you // need to fix AddLegacyEntry in main.c. #if REFIT_DEBUG > 0 Print(L" Result of bootcode detection: %s %s (%s)\n", Volume->HasBootCode ? L"bootable" : L"non-bootable", Volume->OSName, Volume->OSIconName); #endif if (FindMem(SectorBuffer, 512, "Non-system disk", 15) >= 0) // dummy FAT boot sector Volume->HasBootCode = FALSE; // check for MBR partition table if (*((UINT16 *)(SectorBuffer + 510)) == 0xaa55) { MbrTableFound = FALSE; MbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); for (i = 0; i < 4; i++) if (MbrTable[i].StartLBA && MbrTable[i].Size) MbrTableFound = TRUE; for (i = 0; i < 4; i++) if (MbrTable[i].Flags != 0x00 && MbrTable[i].Flags != 0x80) MbrTableFound = FALSE; if (MbrTableFound) { Volume->MbrPartitionTable = AllocatePool(4 * 16); CopyMem(Volume->MbrPartitionTable, MbrTable, 4 * 16); } } } else { #if REFIT_DEBUG > 0 CheckError(Status, L"while reading boot sector"); #endif } } static VOID ScanVolumeDefaultIcon(IN OUT REFIT_VOLUME *Volume) { // default volume icon based on disk kind if (Volume->DiskKind == DISK_KIND_INTERNAL) Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_INTERNAL); else if (Volume->DiskKind == DISK_KIND_EXTERNAL) Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_EXTERNAL); else if (Volume->DiskKind == DISK_KIND_OPTICAL) Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL); } static VOID ScanVolume(IN OUT REFIT_VOLUME *Volume) { EFI_STATUS Status; EFI_DEVICE_PATH *DevicePath, *NextDevicePath; EFI_DEVICE_PATH *DiskDevicePath, *RemainingDevicePath; EFI_HANDLE WholeDiskHandle; UINTN PartialLength; EFI_FILE_SYSTEM_INFO *FileSystemInfoPtr; BOOLEAN Bootable; // get device path Volume->DevicePath = DuplicateDevicePath(DevicePathFromHandle(Volume->DeviceHandle)); #if REFIT_DEBUG > 0 if (Volume->DevicePath != NULL) { Print(L"* %s\n", DevicePathToStr(Volume->DevicePath)); #if REFIT_DEBUG >= 2 DumpHex(1, 0, DevicePathSize(Volume->DevicePath), Volume->DevicePath); #endif } #endif Volume->DiskKind = DISK_KIND_INTERNAL; // default // get block i/o Status = BS->HandleProtocol(Volume->DeviceHandle, &BlockIoProtocol, (VOID **) &(Volume->BlockIO)); if (EFI_ERROR(Status)) { Volume->BlockIO = NULL; Print(L"Warning: Can't get BlockIO protocol.\n"); } else { if (Volume->BlockIO->Media->BlockSize == 2048) Volume->DiskKind = DISK_KIND_OPTICAL; } // scan for bootcode and MBR table Bootable = FALSE; ScanVolumeBootcode(Volume, &Bootable); // detect device type DevicePath = Volume->DevicePath; while (DevicePath != NULL && !IsDevicePathEndType(DevicePath)) { NextDevicePath = NextDevicePathNode(DevicePath); if (DevicePathType(DevicePath) == MESSAGING_DEVICE_PATH && (DevicePathSubType(DevicePath) == MSG_USB_DP || DevicePathSubType(DevicePath) == MSG_USB_CLASS_DP || DevicePathSubType(DevicePath) == MSG_1394_DP || DevicePathSubType(DevicePath) == MSG_FIBRECHANNEL_DP)) Volume->DiskKind = DISK_KIND_EXTERNAL; // USB/FireWire/FC device -> external if (DevicePathType(DevicePath) == MEDIA_DEVICE_PATH && DevicePathSubType(DevicePath) == MEDIA_CDROM_DP) { Volume->DiskKind = DISK_KIND_OPTICAL; // El Torito entry -> optical disk Bootable = TRUE; } if (DevicePathType(DevicePath) == MEDIA_DEVICE_PATH && DevicePathSubType(DevicePath) == MEDIA_VENDOR_DP) { Volume->IsAppleLegacy = TRUE; // legacy BIOS device entry // TODO: also check for Boot Camp GUID Bootable = FALSE; // this handle's BlockIO is just an alias for the whole device } if (DevicePathType(DevicePath) == MESSAGING_DEVICE_PATH) { // make a device path for the whole device PartialLength = (UINT8 *)NextDevicePath - (UINT8 *)(Volume->DevicePath); DiskDevicePath = (EFI_DEVICE_PATH *)AllocatePool(PartialLength + sizeof(EFI_DEVICE_PATH)); CopyMem(DiskDevicePath, Volume->DevicePath, PartialLength); CopyMem((UINT8 *)DiskDevicePath + PartialLength, EndDevicePath, sizeof(EFI_DEVICE_PATH)); // get the handle for that path RemainingDevicePath = DiskDevicePath; //Print(L" * looking at %s\n", DevicePathToStr(RemainingDevicePath)); Status = BS->LocateDevicePath(&BlockIoProtocol, &RemainingDevicePath, &WholeDiskHandle); //Print(L" * remaining: %s\n", DevicePathToStr(RemainingDevicePath)); FreePool(DiskDevicePath); if (!EFI_ERROR(Status)) { //Print(L" - original handle: %08x - disk handle: %08x\n", (UINT32)DeviceHandle, (UINT32)WholeDiskHandle); // get the device path for later Status = BS->HandleProtocol(WholeDiskHandle, &DevicePathProtocol, (VOID **) &DiskDevicePath); if (!EFI_ERROR(Status)) { Volume->WholeDiskDevicePath = DuplicateDevicePath(DiskDevicePath); } // look at the BlockIO protocol Status = BS->HandleProtocol(WholeDiskHandle, &BlockIoProtocol, (VOID **) &Volume->WholeDiskBlockIO); if (!EFI_ERROR(Status)) { // check the media block size if (Volume->WholeDiskBlockIO->Media->BlockSize == 2048) Volume->DiskKind = DISK_KIND_OPTICAL; } else { Volume->WholeDiskBlockIO = NULL; //CheckError(Status, L"from HandleProtocol"); } } //else // CheckError(Status, L"from LocateDevicePath"); } DevicePath = NextDevicePath; } if (!Bootable) { #if REFIT_DEBUG > 0 if (Volume->HasBootCode) Print(L" Volume considered non-bootable, but boot code is present\n"); #endif Volume->HasBootCode = FALSE; } // default volume icon based on disk kind ScanVolumeDefaultIcon(Volume); // open the root directory of the volume Volume->RootDir = LibOpenRoot(Volume->DeviceHandle); if (Volume->RootDir == NULL) { Print(L"Error: Can't open volume.\n"); // TODO: signal that we had an error return; } // get volume name FileSystemInfoPtr = LibFileSystemInfo(Volume->RootDir); if (FileSystemInfoPtr != NULL) { Print(L" Volume %s\n", FileSystemInfoPtr->VolumeLabel); Volume->VolName = StrDuplicate(FileSystemInfoPtr->VolumeLabel); FreePool(FileSystemInfoPtr); } else { Print(L"Warning: Can't get volume info.\n"); // NOTE: this is normal for Apple's VenMedia device paths } // TODO: if no official volume name is found or it is empty, use something else, e.g.: // - name from bytes 3 to 10 of the boot sector // - partition number // - name derived from file system type or partition type // get custom volume icon if present if (FileExists(Volume->RootDir, L".VolumeIcon.icns")) Volume->VolBadgeImage = LoadIcns(Volume->RootDir, L".VolumeIcon.icns", 32); } static VOID ScanExtendedPartition(REFIT_VOLUME *WholeDiskVolume, MBR_PARTITION_INFO *MbrEntry) { EFI_STATUS Status; REFIT_VOLUME *Volume; UINT32 ExtBase, ExtCurrent, NextExtCurrent; UINTN i; UINTN LogicalPartitionIndex = 4; UINT8 SectorBuffer[512]; BOOLEAN Bootable; MBR_PARTITION_INFO *EMbrTable; ExtBase = MbrEntry->StartLBA; for (ExtCurrent = ExtBase; ExtCurrent; ExtCurrent = NextExtCurrent) { // read current EMBR Status = WholeDiskVolume->BlockIO->ReadBlocks(WholeDiskVolume->BlockIO, WholeDiskVolume->BlockIO->Media->MediaId, ExtCurrent, 512, SectorBuffer); if (EFI_ERROR(Status)) break; if (*((UINT16 *)(SectorBuffer + 510)) != 0xaa55) break; EMbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); // scan logical partitions in this EMBR NextExtCurrent = 0; for (i = 0; i < 4; i++) { if ((EMbrTable[i].Flags != 0x00 && EMbrTable[i].Flags != 0x80) || EMbrTable[i].StartLBA == 0 || EMbrTable[i].Size == 0) break; if (IS_EXTENDED_PART_TYPE(EMbrTable[i].Type)) { // set next ExtCurrent NextExtCurrent = ExtBase + EMbrTable[i].StartLBA; break; } else { // found a logical partition Volume = AllocateZeroPool(sizeof(REFIT_VOLUME)); Volume->DiskKind = WholeDiskVolume->DiskKind; Volume->IsMbrPartition = TRUE; Volume->MbrPartitionIndex = LogicalPartitionIndex++; Volume->VolName = PoolPrint(L"Partition %d", Volume->MbrPartitionIndex + 1); Volume->BlockIO = WholeDiskVolume->BlockIO; Volume->BlockIOOffset = ExtCurrent + EMbrTable[i].StartLBA; Volume->WholeDiskBlockIO = WholeDiskVolume->BlockIO; Bootable = FALSE; ScanVolumeBootcode(Volume, &Bootable); if (!Bootable) Volume->HasBootCode = FALSE; ScanVolumeDefaultIcon(Volume); AddListElement((VOID ***) &Volumes, &VolumesCount, Volume); } } } } VOID ScanVolumes(VOID) { EFI_STATUS Status; UINTN HandleCount = 0; UINTN HandleIndex; EFI_HANDLE *Handles; REFIT_VOLUME *Volume, *WholeDiskVolume; UINTN VolumeIndex, VolumeIndex2; MBR_PARTITION_INFO *MbrTable; UINTN PartitionIndex; UINT8 *SectorBuffer1, *SectorBuffer2; UINTN SectorSum, i; Print(L"Scanning volumes...\n"); // get all filesystem handles Status = LibLocateHandle(ByProtocol, &BlockIoProtocol, NULL, &HandleCount, &Handles); // was: &FileSystemProtocol if (Status == EFI_NOT_FOUND) return; // no filesystems. strange, but true... if (CheckError(Status, L"while listing all file systems")) return; // first pass: collect information about all handles for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { Volume = AllocateZeroPool(sizeof(REFIT_VOLUME)); Volume->DeviceHandle = Handles[HandleIndex]; ScanVolume(Volume); AddListElement((VOID ***) &Volumes, &VolumesCount, Volume); if (Volume->DeviceHandle == SelfLoadedImage->DeviceHandle) SelfVolume = Volume; } FreePool(Handles); if (SelfVolume == NULL) Print(L"WARNING: SelfVolume not found"); // second pass: relate partitions and whole disk devices for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { Volume = Volumes[VolumeIndex]; // check MBR partition table for extended partitions if (Volume->BlockIO != NULL && Volume->WholeDiskBlockIO != NULL && Volume->BlockIO == Volume->WholeDiskBlockIO && Volume->BlockIOOffset == 0 && Volume->MbrPartitionTable != NULL) { MbrTable = Volume->MbrPartitionTable; for (PartitionIndex = 0; PartitionIndex < 4; PartitionIndex++) { if (IS_EXTENDED_PART_TYPE(MbrTable[PartitionIndex].Type)) { ScanExtendedPartition(Volume, MbrTable + PartitionIndex); } } } // search for corresponding whole disk volume entry WholeDiskVolume = NULL; if (Volume->BlockIO != NULL && Volume->WholeDiskBlockIO != NULL && Volume->BlockIO != Volume->WholeDiskBlockIO) { for (VolumeIndex2 = 0; VolumeIndex2 < VolumesCount; VolumeIndex2++) { if (Volumes[VolumeIndex2]->BlockIO == Volume->WholeDiskBlockIO && Volumes[VolumeIndex2]->BlockIOOffset == 0) WholeDiskVolume = Volumes[VolumeIndex2]; } } if (WholeDiskVolume != NULL && WholeDiskVolume->MbrPartitionTable != NULL) { // check if this volume is one of the partitions in the table MbrTable = WholeDiskVolume->MbrPartitionTable; SectorBuffer1 = AllocatePool(512); SectorBuffer2 = AllocatePool(512); for (PartitionIndex = 0; PartitionIndex < 4; PartitionIndex++) { // check size if ((UINT64)(MbrTable[PartitionIndex].Size) != Volume->BlockIO->Media->LastBlock + 1) continue; // compare boot sector read through offset vs. directly Status = Volume->BlockIO->ReadBlocks(Volume->BlockIO, Volume->BlockIO->Media->MediaId, Volume->BlockIOOffset, 512, SectorBuffer1); if (EFI_ERROR(Status)) break; Status = Volume->WholeDiskBlockIO->ReadBlocks(Volume->WholeDiskBlockIO, Volume->WholeDiskBlockIO->Media->MediaId, MbrTable[PartitionIndex].StartLBA, 512, SectorBuffer2); if (EFI_ERROR(Status)) break; if (CompareMem(SectorBuffer1, SectorBuffer2, 512) != 0) continue; SectorSum = 0; for (i = 0; i < 512; i++) SectorSum += SectorBuffer1[i]; if (SectorSum < 1000) continue; // TODO: mark entry as non-bootable if it is an extended partition // now we're reasonably sure the association is correct... Volume->IsMbrPartition = TRUE; Volume->MbrPartitionIndex = PartitionIndex; if (Volume->VolName == NULL) Volume->VolName = PoolPrint(L"Partition %d", PartitionIndex + 1); break; } FreePool(SectorBuffer1); FreePool(SectorBuffer2); } } } static VOID UninitVolumes(VOID) { REFIT_VOLUME *Volume; UINTN VolumeIndex; for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { Volume = Volumes[VolumeIndex]; if (Volume->RootDir != NULL) { Volume->RootDir->Close(Volume->RootDir); Volume->RootDir = NULL; } Volume->DeviceHandle = NULL; Volume->BlockIO = NULL; Volume->WholeDiskBlockIO = NULL; } } static VOID ReinitVolumes(VOID) { EFI_STATUS Status; REFIT_VOLUME *Volume; UINTN VolumeIndex; EFI_DEVICE_PATH *RemainingDevicePath; EFI_HANDLE DeviceHandle, WholeDiskHandle; for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { Volume = Volumes[VolumeIndex]; if (Volume->DevicePath != NULL) { // get the handle for that path RemainingDevicePath = Volume->DevicePath; Status = BS->LocateDevicePath(&BlockIoProtocol, &RemainingDevicePath, &DeviceHandle); if (!EFI_ERROR(Status)) { Volume->DeviceHandle = DeviceHandle; // get the root directory Volume->RootDir = LibOpenRoot(Volume->DeviceHandle); } else CheckError(Status, L"from LocateDevicePath"); } if (Volume->WholeDiskDevicePath != NULL) { // get the handle for that path RemainingDevicePath = Volume->WholeDiskDevicePath; Status = BS->LocateDevicePath(&BlockIoProtocol, &RemainingDevicePath, &WholeDiskHandle); if (!EFI_ERROR(Status)) { // get the BlockIO protocol Status = BS->HandleProtocol(WholeDiskHandle, &BlockIoProtocol, (VOID **) &Volume->WholeDiskBlockIO); if (EFI_ERROR(Status)) { Volume->WholeDiskBlockIO = NULL; CheckError(Status, L"from HandleProtocol"); } } else CheckError(Status, L"from LocateDevicePath"); } } } // // file and dir functions // BOOLEAN FileExists(IN EFI_FILE *BaseDir, IN CHAR16 *RelativePath) { EFI_STATUS Status; EFI_FILE *TestFile; Status = BaseDir->Open(BaseDir, &TestFile, RelativePath, EFI_FILE_MODE_READ, 0); if (Status == EFI_SUCCESS) { TestFile->Close(TestFile); return TRUE; } return FALSE; } EFI_STATUS DirNextEntry(IN EFI_FILE *Directory, IN OUT EFI_FILE_INFO **DirEntry, IN UINTN FilterMode) { EFI_STATUS Status; VOID *Buffer; UINTN LastBufferSize, BufferSize; INTN IterCount; for (;;) { // free pointer from last call if (*DirEntry != NULL) { FreePool(*DirEntry); *DirEntry = NULL; } // read next directory entry LastBufferSize = BufferSize = 256; Buffer = AllocatePool(BufferSize); for (IterCount = 0; ; IterCount++) { Status = Directory->Read(Directory, &BufferSize, Buffer); if (Status != EFI_BUFFER_TOO_SMALL || IterCount >= 4) break; if (BufferSize <= LastBufferSize) { Print(L"FS Driver requests bad buffer size %d (was %d), using %d instead\n", BufferSize, LastBufferSize, LastBufferSize * 2); BufferSize = LastBufferSize * 2; #if REFIT_DEBUG > 0 } else { Print(L"Reallocating buffer from %d to %d\n", LastBufferSize, BufferSize); #endif } Buffer = ReallocatePool(Buffer, LastBufferSize, BufferSize); LastBufferSize = BufferSize; } if (EFI_ERROR(Status)) { FreePool(Buffer); break; } // check for end of listing if (BufferSize == 0) { // end of directory listing FreePool(Buffer); break; } // entry is ready to be returned *DirEntry = (EFI_FILE_INFO *)Buffer; // filter results if (FilterMode == 1) { // only return directories if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY)) break; } else if (FilterMode == 2) { // only return files if (((*DirEntry)->Attribute & EFI_FILE_DIRECTORY) == 0) break; } else // no filter or unknown filter -> return everything break; } return Status; } VOID DirIterOpen(IN EFI_FILE *BaseDir, IN CHAR16 *RelativePath OPTIONAL, OUT REFIT_DIR_ITER *DirIter) { if (RelativePath == NULL) { DirIter->LastStatus = EFI_SUCCESS; DirIter->DirHandle = BaseDir; DirIter->CloseDirHandle = FALSE; } else { DirIter->LastStatus = BaseDir->Open(BaseDir, &(DirIter->DirHandle), RelativePath, EFI_FILE_MODE_READ, 0); DirIter->CloseDirHandle = EFI_ERROR(DirIter->LastStatus) ? FALSE : TRUE; } DirIter->LastFileInfo = NULL; } BOOLEAN DirIterNext(IN OUT REFIT_DIR_ITER *DirIter, IN UINTN FilterMode, IN CHAR16 *FilePattern OPTIONAL, OUT EFI_FILE_INFO **DirEntry) { if (DirIter->LastFileInfo != NULL) { FreePool(DirIter->LastFileInfo); DirIter->LastFileInfo = NULL; } if (EFI_ERROR(DirIter->LastStatus)) return FALSE; // stop iteration for (;;) { DirIter->LastStatus = DirNextEntry(DirIter->DirHandle, &(DirIter->LastFileInfo), FilterMode); if (EFI_ERROR(DirIter->LastStatus)) return FALSE; if (DirIter->LastFileInfo == NULL) // end of listing return FALSE; if (FilePattern != NULL) { if ((DirIter->LastFileInfo->Attribute & EFI_FILE_DIRECTORY)) break; if (MetaiMatch(DirIter->LastFileInfo->FileName, FilePattern)) break; // else continue loop } else break; } *DirEntry = DirIter->LastFileInfo; return TRUE; } EFI_STATUS DirIterClose(IN OUT REFIT_DIR_ITER *DirIter) { if (DirIter->LastFileInfo != NULL) { FreePool(DirIter->LastFileInfo); DirIter->LastFileInfo = NULL; } if (DirIter->CloseDirHandle) DirIter->DirHandle->Close(DirIter->DirHandle); return DirIter->LastStatus; } // // file name manipulation // CHAR16 * Basename(IN CHAR16 *Path) { CHAR16 *FileName; UINTN i; FileName = Path; if (Path != NULL) { for (i = StrLen(Path); i > 0; i--) { if (Path[i-1] == '\\' || Path[i-1] == '/') { FileName = Path + i; break; } } } return FileName; } VOID ReplaceExtension(IN OUT CHAR16 *Path, IN CHAR16 *Extension) { UINTN i; for (i = StrLen(Path); i >= 0; i--) { if (Path[i] == '.') { Path[i] = 0; break; } if (Path[i] == '\\' || Path[i] == '/') break; } StrCat(Path, Extension); } // // memory string search // INTN FindMem(IN VOID *Buffer, IN UINTN BufferLength, IN VOID *SearchString, IN UINTN SearchStringLength) { UINT8 *BufferPtr; UINTN Offset; BufferPtr = Buffer; BufferLength -= SearchStringLength; for (Offset = 0; Offset < BufferLength; Offset++, BufferPtr++) { if (CompareMem(BufferPtr, SearchString, SearchStringLength) == 0) return (INTN)Offset; } return -1; } // EOF refit-0.14/refit/lib.h0000644000175000017500000002236511344445254014153 0ustar julienjulien/* * refit/lib.h * General header file * * Copyright (c) 2006-2009 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efilib.h" #include "libeg.h" #define REFIT_DEBUG (0) // // lib module // typedef struct { EFI_STATUS LastStatus; EFI_FILE *DirHandle; BOOLEAN CloseDirHandle; EFI_FILE_INFO *LastFileInfo; } REFIT_DIR_ITER; typedef struct { UINT8 Flags; UINT8 StartCHS1; UINT8 StartCHS2; UINT8 StartCHS3; UINT8 Type; UINT8 EndCHS1; UINT8 EndCHS2; UINT8 EndCHS3; UINT32 StartLBA; UINT32 Size; } MBR_PARTITION_INFO; #define DISK_KIND_INTERNAL (0) #define DISK_KIND_EXTERNAL (1) #define DISK_KIND_OPTICAL (2) #define IS_EXTENDED_PART_TYPE(type) ((type) == 0x05 || (type) == 0x0f || (type) == 0x85) typedef struct { EFI_DEVICE_PATH *DevicePath; EFI_HANDLE DeviceHandle; EFI_FILE *RootDir; CHAR16 *VolName; EG_IMAGE *VolBadgeImage; UINTN DiskKind; BOOLEAN IsAppleLegacy; BOOLEAN HasBootCode; CHAR16 *OSIconName; CHAR16 *OSName; BOOLEAN IsMbrPartition; UINTN MbrPartitionIndex; EFI_BLOCK_IO *BlockIO; UINT64 BlockIOOffset; EFI_BLOCK_IO *WholeDiskBlockIO; EFI_DEVICE_PATH *WholeDiskDevicePath; MBR_PARTITION_INFO *MbrPartitionTable; } REFIT_VOLUME; extern EFI_HANDLE SelfImageHandle; extern EFI_LOADED_IMAGE *SelfLoadedImage; extern EFI_FILE *SelfRootDir; extern EFI_FILE *SelfDir; extern CHAR16 *SelfDirPath; extern REFIT_VOLUME *SelfVolume; extern REFIT_VOLUME **Volumes; extern UINTN VolumesCount; EFI_STATUS InitRefitLib(IN EFI_HANDLE ImageHandle); VOID UninitRefitLib(VOID); EFI_STATUS ReinitRefitLib(VOID); VOID CreateList(OUT VOID ***ListPtr, OUT UINTN *ElementCount, IN UINTN InitialElementCount); VOID AddListElement(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount, IN VOID *NewElement); VOID FreeList(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount /*, IN Callback*/); VOID ExtractLegacyLoaderPaths(EFI_DEVICE_PATH **PathList, UINTN MaxPaths, EFI_DEVICE_PATH **HardcodedPathList); VOID ScanVolumes(VOID); BOOLEAN FileExists(IN EFI_FILE *BaseDir, IN CHAR16 *RelativePath); EFI_STATUS DirNextEntry(IN EFI_FILE *Directory, IN OUT EFI_FILE_INFO **DirEntry, IN UINTN FilterMode); VOID DirIterOpen(IN EFI_FILE *BaseDir, IN CHAR16 *RelativePath OPTIONAL, OUT REFIT_DIR_ITER *DirIter); BOOLEAN DirIterNext(IN OUT REFIT_DIR_ITER *DirIter, IN UINTN FilterMode, IN CHAR16 *FilePattern OPTIONAL, OUT EFI_FILE_INFO **DirEntry); EFI_STATUS DirIterClose(IN OUT REFIT_DIR_ITER *DirIter); CHAR16 * Basename(IN CHAR16 *Path); VOID ReplaceExtension(IN OUT CHAR16 *Path, IN CHAR16 *Extension); INTN FindMem(IN VOID *Buffer, IN UINTN BufferLength, IN VOID *SearchString, IN UINTN SearchStringLength); // // screen module // #define ATTR_BASIC (EFI_LIGHTGRAY | EFI_BACKGROUND_BLACK) #define ATTR_ERROR (EFI_YELLOW | EFI_BACKGROUND_BLACK) #define ATTR_BANNER (EFI_WHITE | EFI_BACKGROUND_BLUE) #define ATTR_CHOICE_BASIC ATTR_BASIC #define ATTR_CHOICE_CURRENT (EFI_WHITE | EFI_BACKGROUND_GREEN) #define ATTR_SCROLLARROW (EFI_LIGHTGREEN | EFI_BACKGROUND_BLACK) #define LAYOUT_TEXT_WIDTH (512) #define LAYOUT_TOTAL_HEIGHT (368) #define LAYOUT_BANNER_HEIGHT (32) #define LAYOUT_BANNER_YOFFSET (LAYOUT_BANNER_HEIGHT + 32) #define FONT_CELL_WIDTH (7) #define FONT_CELL_HEIGHT (12) extern UINTN ConWidth; extern UINTN ConHeight; extern CHAR16 *BlankLine; extern UINTN UGAWidth; extern UINTN UGAHeight; extern BOOLEAN AllowGraphicsMode; extern EG_PIXEL StdBackgroundPixel; extern EG_PIXEL MenuBackgroundPixel; VOID InitScreen(VOID); VOID SetupScreen(VOID); VOID BeginTextScreen(IN CHAR16 *Title); VOID FinishTextScreen(IN BOOLEAN WaitAlways); VOID BeginExternalScreen(IN BOOLEAN UseGraphicsMode, IN CHAR16 *Title); VOID FinishExternalScreen(VOID); VOID TerminateScreen(VOID); #if REFIT_DEBUG > 0 VOID DebugPause(VOID); #else #define DebugPause() #endif VOID EndlessIdleLoop(VOID); BOOLEAN CheckFatalError(IN EFI_STATUS Status, IN CHAR16 *where); BOOLEAN CheckError(IN EFI_STATUS Status, IN CHAR16 *where); VOID SwitchToGraphicsAndClear(VOID); VOID BltClearScreen(IN BOOLEAN ShowBanner); VOID BltImage(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos); VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL *BackgroundPixel); VOID BltImageComposite(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN UINTN XPos, IN UINTN YPos); VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG_IMAGE *BadgeImage, IN UINTN XPos, IN UINTN YPos); // // icns loader module // EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo); EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize); EG_IMAGE * LoadIcnsFallback(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize); EG_IMAGE * DummyImage(IN UINTN PixelSize); EG_IMAGE * BuiltinIcon(IN UINTN Id); #define BUILTIN_ICON_FUNC_ABOUT (0) #define BUILTIN_ICON_FUNC_RESET (1) #define BUILTIN_ICON_FUNC_SHUTDOWN (2) #define BUILTIN_ICON_TOOL_SHELL (3) #define BUILTIN_ICON_TOOL_PART (4) #define BUILTIN_ICON_TOOL_RESCUE (5) #define BUILTIN_ICON_VOL_INTERNAL (6) #define BUILTIN_ICON_VOL_EXTERNAL (7) #define BUILTIN_ICON_VOL_OPTICAL (8) #define BUILTIN_ICON_COUNT (9) // // menu module // #define MENU_EXIT_ENTER (1) #define MENU_EXIT_ESCAPE (2) #define MENU_EXIT_DETAILS (3) #define MENU_EXIT_TIMEOUT (4) #define TAG_RETURN (99) struct _refit_menu_screen; typedef struct _refit_menu_entry { CHAR16 *Title; UINTN Tag; UINTN Row; CHAR16 ShortcutDigit; CHAR16 ShortcutLetter; EG_IMAGE *Image; EG_IMAGE *BadgeImage; struct _refit_menu_screen *SubScreen; } REFIT_MENU_ENTRY; typedef struct _refit_menu_screen { CHAR16 *Title; EG_IMAGE *TitleImage; UINTN InfoLineCount; CHAR16 **InfoLines; UINTN EntryCount; REFIT_MENU_ENTRY **Entries; UINTN TimeoutSeconds; CHAR16 *TimeoutText; } REFIT_MENU_SCREEN; VOID AddMenuInfoLine(IN REFIT_MENU_SCREEN *Screen, IN CHAR16 *InfoLine); VOID AddMenuEntry(IN REFIT_MENU_SCREEN *Screen, IN REFIT_MENU_ENTRY *Entry); VOID FreeMenu(IN REFIT_MENU_SCREEN *Screen); UINTN RunMenu(IN REFIT_MENU_SCREEN *Screen, OUT REFIT_MENU_ENTRY **ChosenEntry); UINTN RunMainMenu(IN REFIT_MENU_SCREEN *Screen, IN CHAR16* DefaultSelection, OUT REFIT_MENU_ENTRY **ChosenEntry); // // config module // typedef struct { UINT8 *Buffer; UINTN BufferSize; UINTN Encoding; CHAR8 *Current8Ptr; CHAR8 *End8Ptr; CHAR16 *Current16Ptr; CHAR16 *End16Ptr; } REFIT_FILE; #define DISABLE_FLAG_SHELL (0x0001) #define DISABLE_FLAG_TOOLS (0x0002) #define DISABLE_FLAG_OPTICAL (0x0004) #define DISABLE_FLAG_EXTERNAL (0x0008) #define DISABLE_FLAG_INTERNAL (0x0010) #define DISABLE_FLAG_SINGLEUSER (0x0020) #define DISABLE_FLAG_HWTEST (0x0040) #define DISABLE_ALL ((0xffff) & (~DISABLE_FLAG_INTERNAL)) #define HIDEUI_FLAG_BANNER (0x0001) #define HIDEUI_FLAG_FUNCS (0x0002) #define HIDEUI_FLAG_LABEL (0x0004) #define HIDEUI_ALL (0xffff) typedef struct { BOOLEAN TextOnly; UINTN Timeout; UINTN DisableFlags; UINTN HideBadges; UINTN HideUIFlags; BOOLEAN LegacyFirst; CHAR16 *BannerFileName; CHAR16 *SelectionSmallFileName; CHAR16 *SelectionBigFileName; CHAR16 *DefaultSelection; } REFIT_CONFIG; extern REFIT_CONFIG GlobalConfig; VOID ReadConfig(VOID); /* EOF */ refit-0.14/refit/main.c0000644000175000017500000013140711344751330014315 0ustar julienjulien/* * refit/main.c * Main code for the boot menu * * Copyright (c) 2006-2010 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" #include "syslinux_mbr.h" // types typedef struct { REFIT_MENU_ENTRY me; CHAR16 *LoaderPath; CHAR16 *VolName; EFI_DEVICE_PATH *DevicePath; BOOLEAN UseGraphicsMode; CHAR16 *LoadOptions; } LOADER_ENTRY; typedef struct { REFIT_MENU_ENTRY me; REFIT_VOLUME *Volume; CHAR16 *LoadOptions; } LEGACY_ENTRY; // variables #define MACOSX_LOADER_PATH L"\\System\\Library\\CoreServices\\boot.efi" #define TAG_ABOUT (1) #define TAG_RESET (2) #define TAG_SHUTDOWN (3) #define TAG_TOOL (4) #define TAG_LOADER (5) #define TAG_LEGACY (6) static REFIT_MENU_ENTRY MenuEntryAbout = { L"About rEFIt", TAG_ABOUT, 1, 0, 'A', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryReset = { L"Restart Computer", TAG_RESET, 1, 0, 'R', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryShutdown = { L"Shut Down Computer", TAG_SHUTDOWN, 1, 0, 'U', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; static REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL }; // // misc functions // static VOID AboutRefit(VOID) { if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); AddMenuInfoLine(&AboutMenu, L"rEFIt Version 0.14"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Portions Copyright (c) Intel Corporation and others"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Running on:"); AddMenuInfoLine(&AboutMenu, PoolPrint(L" EFI Revision %d.%02d", ST->Hdr.Revision >> 16, ST->Hdr.Revision & ((1 << 16) - 1))); #if defined(EFI32) AddMenuInfoLine(&AboutMenu, L" Platform: x86 (32 bit)"); #elif defined(EFIX64) AddMenuInfoLine(&AboutMenu, L" Platform: x86_64 (64 bit)"); #else AddMenuInfoLine(&AboutMenu, L" Platform: unknown"); #endif AddMenuInfoLine(&AboutMenu, PoolPrint(L" Firmware: %s %d.%02d", ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & ((1 << 16) - 1))); AddMenuInfoLine(&AboutMenu, PoolPrint(L" Screen Output: %s", egScreenDescription())); AddMenuEntry(&AboutMenu, &MenuEntryReturn); } RunMenu(&AboutMenu, NULL); } static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, IN CHAR16 *LoadOptions, IN CHAR16 *LoadOptionsPrefix, IN CHAR16 *ImageTitle, OUT UINTN *ErrorInStep) { EFI_STATUS Status, ReturnStatus; EFI_HANDLE ChildImageHandle; EFI_LOADED_IMAGE *ChildLoadedImage; UINTN DevicePathIndex; CHAR16 ErrorInfo[256]; CHAR16 *FullLoadOptions = NULL; Print(L"Starting %s\n", ImageTitle); if (ErrorInStep != NULL) *ErrorInStep = 0; // load the image into memory ReturnStatus = Status = EFI_NOT_FOUND; // in case the list is empty for (DevicePathIndex = 0; DevicePaths[DevicePathIndex] != NULL; DevicePathIndex++) { ReturnStatus = Status = BS->LoadImage(FALSE, SelfImageHandle, DevicePaths[DevicePathIndex], NULL, 0, &ChildImageHandle); if (ReturnStatus != EFI_NOT_FOUND) break; } SPrint(ErrorInfo, 255, L"while loading %s", ImageTitle); if (CheckError(Status, ErrorInfo)) { if (ErrorInStep != NULL) *ErrorInStep = 1; goto bailout; } // set load options if (LoadOptions != NULL) { ReturnStatus = Status = BS->HandleProtocol(ChildImageHandle, &LoadedImageProtocol, (VOID **) &ChildLoadedImage); if (CheckError(Status, L"while getting a LoadedImageProtocol handle")) { if (ErrorInStep != NULL) *ErrorInStep = 2; goto bailout_unload; } if (LoadOptionsPrefix != NULL) { FullLoadOptions = PoolPrint(L"%s %s ", LoadOptionsPrefix, LoadOptions); // NOTE: That last space is also added by the EFI shell and seems to be significant // when passing options to Apple's boot.efi... LoadOptions = FullLoadOptions; } // NOTE: We also include the terminating null in the length for safety. ChildLoadedImage->LoadOptions = (VOID *)LoadOptions; ChildLoadedImage->LoadOptionsSize = ((UINT32)StrLen(LoadOptions) + 1) * sizeof(CHAR16); Print(L"Using load options '%s'\n", LoadOptions); } // close open file handles UninitRefitLib(); // turn control over to the image // TODO: (optionally) re-enable the EFI watchdog timer! ReturnStatus = Status = BS->StartImage(ChildImageHandle, NULL, NULL); // control returns here when the child image calls Exit() SPrint(ErrorInfo, 255, L"returned from %s", ImageTitle); if (CheckError(Status, ErrorInfo)) { if (ErrorInStep != NULL) *ErrorInStep = 3; } // re-open file handles ReinitRefitLib(); bailout_unload: // unload the image, we don't care if it works or not... Status = BS->UnloadImage(ChildImageHandle); bailout: if (FullLoadOptions != NULL) FreePool(FullLoadOptions); return ReturnStatus; } static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, IN CHAR16 *LoadOptions, IN CHAR16 *LoadOptionsPrefix, IN CHAR16 *ImageTitle, OUT UINTN *ErrorInStep) { EFI_DEVICE_PATH *DevicePaths[2]; DevicePaths[0] = DevicePath; DevicePaths[1] = NULL; return StartEFIImageList(DevicePaths, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep); } // // EFI OS loader functions // static VOID StartLoader(IN LOADER_ENTRY *Entry) { BeginExternalScreen(Entry->UseGraphicsMode, L"Booting OS"); StartEFIImage(Entry->DevicePath, Entry->LoadOptions, Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), NULL); FinishExternalScreen(); } static LOADER_ENTRY * AddLoaderEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume) { CHAR16 *FileName, *OSIconName; CHAR16 IconFileName[256]; CHAR16 DiagsFileName[256]; CHAR16 ShortcutLetter; UINTN LoaderKind; LOADER_ENTRY *Entry, *SubEntry; REFIT_MENU_SCREEN *SubScreen; FileName = Basename(LoaderPath); // prepare the menu entry Entry = AllocateZeroPool(sizeof(LOADER_ENTRY)); Entry->me.Title = PoolPrint(L"Boot %s from %s", (LoaderTitle != NULL) ? LoaderTitle : LoaderPath + 1, Volume->VolName); Entry->me.Tag = TAG_LOADER; Entry->me.Row = 0; if (GlobalConfig.HideBadges == 0 || (GlobalConfig.HideBadges == 1 && Volume->DiskKind != DISK_KIND_INTERNAL)) Entry->me.BadgeImage = Volume->VolBadgeImage; Entry->LoaderPath = StrDuplicate(LoaderPath); Entry->VolName = Volume->VolName; Entry->DevicePath = FileDevicePath(Volume->DeviceHandle, Entry->LoaderPath); Entry->UseGraphicsMode = FALSE; // locate a custom icon for the loader StrCpy(IconFileName, LoaderPath); ReplaceExtension(IconFileName, L".icns"); if (FileExists(Volume->RootDir, IconFileName)) Entry->me.Image = LoadIcns(Volume->RootDir, IconFileName, 128); // detect specific loaders OSIconName = NULL; LoaderKind = 0; ShortcutLetter = 0; if (StriCmp(LoaderPath, MACOSX_LOADER_PATH) == 0) { OSIconName = L"mac"; Entry->UseGraphicsMode = TRUE; LoaderKind = 1; ShortcutLetter = 'M'; } else if (StriCmp(FileName, L"diags.efi") == 0) { OSIconName = L"hwtest"; } else if (StriCmp(FileName, L"e.efi") == 0 || StriCmp(FileName, L"elilo.efi") == 0) { OSIconName = L"elilo,linux"; LoaderKind = 2; ShortcutLetter = 'L'; } else if (StriCmp(FileName, L"cdboot.efi") == 0 || StriCmp(FileName, L"bootmgr.efi") == 0 || StriCmp(FileName, L"Bootmgfw.efi") == 0) { OSIconName = L"win"; ShortcutLetter = 'W'; } else if (StriCmp(FileName, L"xom.efi") == 0) { OSIconName = L"xom,win"; Entry->UseGraphicsMode = TRUE; LoaderKind = 3; ShortcutLetter = 'W'; } Entry->me.ShortcutLetter = ShortcutLetter; if (Entry->me.Image == NULL) Entry->me.Image = LoadOSIcon(OSIconName, L"unknown", FALSE); // create the submenu SubScreen = AllocateZeroPool(sizeof(REFIT_MENU_SCREEN)); SubScreen->Title = PoolPrint(L"Boot Options for %s on %s", (LoaderTitle != NULL) ? LoaderTitle : FileName, Volume->VolName); SubScreen->TitleImage = Entry->me.Image; // default entry SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = (LoaderKind == 1) ? L"Boot Mac OS X" : PoolPrint(L"Run %s", FileName); SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); // loader-specific submenu entries if (LoaderKind == 1) { // entries for Mac OS X #if defined(EFIX64) SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X with a 64-bit kernel"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; SubEntry->LoadOptions = L"arch=x86_64"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X with a 32-bit kernel"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; SubEntry->LoadOptions = L"arch=i386"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); #endif if (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SINGLEUSER)) { SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X in verbose mode"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = FALSE; SubEntry->LoadOptions = L"-v"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); #if defined(EFIX64) SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X in verbose mode (64-bit)"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = FALSE; SubEntry->LoadOptions = L"-v arch=x86_64"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X in verbose mode (32-bit)"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = FALSE; SubEntry->LoadOptions = L"-v arch=i386"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); #endif SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Mac OS X in single user mode"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = FALSE; SubEntry->LoadOptions = L"-v -s"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); } // check for Apple hardware diagnostics StrCpy(DiagsFileName, L"\\System\\Library\\CoreServices\\.diagnostics\\diags.efi"); if (FileExists(Volume->RootDir, DiagsFileName) && !(GlobalConfig.DisableFlags & DISABLE_FLAG_HWTEST)) { Print(L" - Apple Hardware Test found\n"); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Run Apple Hardware Test"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = StrDuplicate(DiagsFileName); SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = FileDevicePath(Volume->DeviceHandle, SubEntry->LoaderPath); SubEntry->UseGraphicsMode = TRUE; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); } } else if (LoaderKind == 2) { // entries for elilo SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = PoolPrint(L"Run %s in interactive mode", FileName); SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; SubEntry->LoadOptions = L"-p"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Linux for a 17\" iMac or a 15\" MacBook Pro (*)"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = TRUE; SubEntry->LoadOptions = L"-d 0 i17"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Linux for a 20\" iMac (*)"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = TRUE; SubEntry->LoadOptions = L"-d 0 i20"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Linux for a Mac Mini (*)"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = TRUE; SubEntry->LoadOptions = L"-d 0 mini"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); AddMenuInfoLine(SubScreen, L"NOTE: This is an example. Entries"); AddMenuInfoLine(SubScreen, L"marked with (*) may not work."); } else if (LoaderKind == 3) { // entries for xom.efi // by default, skip the built-in selection and boot from hard disk only Entry->LoadOptions = L"-s -h"; SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Windows from Hard Disk"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; SubEntry->LoadOptions = L"-s -h"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = L"Boot Windows from CD-ROM"; SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = Entry->UseGraphicsMode; SubEntry->LoadOptions = L"-s -c"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); SubEntry = AllocateZeroPool(sizeof(LOADER_ENTRY)); SubEntry->me.Title = PoolPrint(L"Run %s in text mode", FileName); SubEntry->me.Tag = TAG_LOADER; SubEntry->LoaderPath = Entry->LoaderPath; SubEntry->VolName = Entry->VolName; SubEntry->DevicePath = Entry->DevicePath; SubEntry->UseGraphicsMode = FALSE; SubEntry->LoadOptions = L"-v"; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); } AddMenuEntry(SubScreen, &MenuEntryReturn); Entry->me.SubScreen = SubScreen; AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); return Entry; } static VOID ScanLoaderDir(IN REFIT_VOLUME *Volume, IN CHAR16 *Path) { EFI_STATUS Status; REFIT_DIR_ITER DirIter; EFI_FILE_INFO *DirEntry; CHAR16 FileName[256]; // look through contents of the directory DirIterOpen(Volume->RootDir, Path, &DirIter); while (DirIterNext(&DirIter, 2, L"*.EFI", &DirEntry)) { if (DirEntry->FileName[0] == '.' || StriCmp(DirEntry->FileName, L"TextMode.efi") == 0 || StriCmp(DirEntry->FileName, L"ebounce.efi") == 0 || StriCmp(DirEntry->FileName, L"GraphicsConsole.efi") == 0) continue; // skip this if (Path) SPrint(FileName, 255, L"\\%s\\%s", Path, DirEntry->FileName); else SPrint(FileName, 255, L"\\%s", DirEntry->FileName); AddLoaderEntry(FileName, NULL, Volume); } Status = DirIterClose(&DirIter); if (Status != EFI_NOT_FOUND) { if (Path) SPrint(FileName, 255, L"while scanning the %s directory", Path); else StrCpy(FileName, L"while scanning the root directory"); CheckError(Status, FileName); } } static VOID ScanLoader(VOID) { EFI_STATUS Status; UINTN VolumeIndex; REFIT_VOLUME *Volume; REFIT_DIR_ITER EfiDirIter; EFI_FILE_INFO *EfiDirEntry; CHAR16 FileName[256]; LOADER_ENTRY *Entry; Print(L"Scanning for boot loaders...\n"); for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { Volume = Volumes[VolumeIndex]; if (Volume->RootDir == NULL || Volume->VolName == NULL) continue; // skip volume if its kind is configured as disabled if ((Volume->DiskKind == DISK_KIND_OPTICAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_OPTICAL)) || (Volume->DiskKind == DISK_KIND_EXTERNAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_EXTERNAL)) || (Volume->DiskKind == DISK_KIND_INTERNAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_INTERNAL))) continue; // check for Mac OS X boot loader StrCpy(FileName, MACOSX_LOADER_PATH); if (FileExists(Volume->RootDir, FileName)) { Print(L" - Mac OS X boot file found\n"); Entry = AddLoaderEntry(FileName, L"Mac OS X", Volume); } // check for XOM StrCpy(FileName, L"\\System\\Library\\CoreServices\\xom.efi"); if (FileExists(Volume->RootDir, FileName)) { AddLoaderEntry(FileName, L"Windows XP (XoM)", Volume); } // check for Microsoft boot loader/menu StrCpy(FileName, L"\\EFI\\Microsoft\\Boot\\Bootmgfw.efi"); if (FileExists(Volume->RootDir, FileName)) { Print(L" - Microsoft boot menu found\n"); AddLoaderEntry(FileName, L"Microsoft boot menu", Volume); } // scan the root directory for EFI executables ScanLoaderDir(Volume, NULL); // scan the elilo directory (as used on gimli's first Live CD) ScanLoaderDir(Volume, L"elilo"); // scan the boot directory ScanLoaderDir(Volume, L"boot"); // scan subdirectories of the EFI directory (as per the standard) DirIterOpen(Volume->RootDir, L"EFI", &EfiDirIter); while (DirIterNext(&EfiDirIter, 1, NULL, &EfiDirEntry)) { if (StriCmp(EfiDirEntry->FileName, L"TOOLS") == 0 || EfiDirEntry->FileName[0] == '.') continue; // skip this, doesn't contain boot loaders if (StriCmp(EfiDirEntry->FileName, L"REFIT") == 0 || StriCmp(EfiDirEntry->FileName, L"REFITL") == 0 || StriCmp(EfiDirEntry->FileName, L"RESCUE") == 0) continue; // skip ourselves Print(L" - Directory EFI\\%s found\n", EfiDirEntry->FileName); SPrint(FileName, 255, L"EFI\\%s", EfiDirEntry->FileName); ScanLoaderDir(Volume, FileName); } Status = DirIterClose(&EfiDirIter); if (Status != EFI_NOT_FOUND) CheckError(Status, L"while scanning the EFI directory"); } } // // legacy boot functions // static EFI_STATUS ActivateMbrPartition(IN EFI_BLOCK_IO *BlockIO, IN UINTN PartitionIndex) { EFI_STATUS Status; UINT8 SectorBuffer[512]; MBR_PARTITION_INFO *MbrTable, *EMbrTable; UINT32 ExtBase, ExtCurrent, NextExtCurrent; UINTN LogicalPartitionIndex = 4; UINTN i; BOOLEAN HaveBootCode; // read MBR Status = BlockIO->ReadBlocks(BlockIO, BlockIO->Media->MediaId, 0, 512, SectorBuffer); if (EFI_ERROR(Status)) return Status; if (*((UINT16 *)(SectorBuffer + 510)) != 0xaa55) return EFI_NOT_FOUND; // safety measure #1 // add boot code if necessary HaveBootCode = FALSE; for (i = 0; i < MBR_BOOTCODE_SIZE; i++) { if (SectorBuffer[i] != 0) { HaveBootCode = TRUE; break; } } if (!HaveBootCode) { // no boot code found in the MBR, add the syslinux MBR code SetMem(SectorBuffer, MBR_BOOTCODE_SIZE, 0); CopyMem(SectorBuffer, syslinux_mbr, SYSLINUX_MBR_SIZE); } // set the partition active MbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); ExtBase = 0; for (i = 0; i < 4; i++) { if (MbrTable[i].Flags != 0x00 && MbrTable[i].Flags != 0x80) return EFI_NOT_FOUND; // safety measure #2 if (i == PartitionIndex) MbrTable[i].Flags = 0x80; else if (PartitionIndex >= 4 && IS_EXTENDED_PART_TYPE(MbrTable[i].Type)) { MbrTable[i].Flags = 0x80; ExtBase = MbrTable[i].StartLBA; } else MbrTable[i].Flags = 0x00; } // write MBR Status = BlockIO->WriteBlocks(BlockIO, BlockIO->Media->MediaId, 0, 512, SectorBuffer); if (EFI_ERROR(Status)) return Status; if (PartitionIndex >= 4) { // we have to activate a logical partition, so walk the EMBR chain // NOTE: ExtBase was set above while looking at the MBR table for (ExtCurrent = ExtBase; ExtCurrent; ExtCurrent = NextExtCurrent) { // read current EMBR Status = BlockIO->ReadBlocks(BlockIO, BlockIO->Media->MediaId, ExtCurrent, 512, SectorBuffer); if (EFI_ERROR(Status)) return Status; if (*((UINT16 *)(SectorBuffer + 510)) != 0xaa55) return EFI_NOT_FOUND; // safety measure #3 // scan EMBR, set appropriate partition active EMbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); NextExtCurrent = 0; for (i = 0; i < 4; i++) { if (EMbrTable[i].Flags != 0x00 && EMbrTable[i].Flags != 0x80) return EFI_NOT_FOUND; // safety measure #4 if (EMbrTable[i].StartLBA == 0 || EMbrTable[i].Size == 0) break; if (IS_EXTENDED_PART_TYPE(EMbrTable[i].Type)) { // link to next EMBR NextExtCurrent = ExtBase + EMbrTable[i].StartLBA; EMbrTable[i].Flags = (PartitionIndex >= LogicalPartitionIndex) ? 0x80 : 0x00; break; } else { // logical partition EMbrTable[i].Flags = (PartitionIndex == LogicalPartitionIndex) ? 0x80 : 0x00; LogicalPartitionIndex++; } } // write current EMBR Status = BlockIO->WriteBlocks(BlockIO, BlockIO->Media->MediaId, ExtCurrent, 512, SectorBuffer); if (EFI_ERROR(Status)) return Status; if (PartitionIndex < LogicalPartitionIndex) break; // stop the loop, no need to touch further EMBRs } } return EFI_SUCCESS; } // early 2006 Core Duo / Core Solo models static UINT8 LegacyLoaderDevicePath1Data[] = { 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; // mid-2006 Mac Pro (and probably other Core 2 models) static UINT8 LegacyLoaderDevicePath2Data[] = { 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; // mid-2007 MBP ("Santa Rosa" based models) static UINT8 LegacyLoaderDevicePath3Data[] = { 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; // early-2008 MBA static UINT8 LegacyLoaderDevicePath4Data[] = { 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; // late-2008 MB/MBP (NVidia chipset) static UINT8 LegacyLoaderDevicePath5Data[] = { 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x40, 0xCB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, }; static EFI_DEVICE_PATH *LegacyLoaderList[] = { (EFI_DEVICE_PATH *)LegacyLoaderDevicePath1Data, (EFI_DEVICE_PATH *)LegacyLoaderDevicePath2Data, (EFI_DEVICE_PATH *)LegacyLoaderDevicePath3Data, (EFI_DEVICE_PATH *)LegacyLoaderDevicePath4Data, (EFI_DEVICE_PATH *)LegacyLoaderDevicePath5Data, NULL }; #define MAX_DISCOVERED_PATHS (16) static VOID StartLegacy(IN LEGACY_ENTRY *Entry) { EFI_STATUS Status; EG_IMAGE *BootLogoImage; UINTN ErrorInStep = 0; EFI_DEVICE_PATH *DiscoveredPathList[MAX_DISCOVERED_PATHS]; BeginExternalScreen(TRUE, L"Booting Legacy OS"); BootLogoImage = LoadOSIcon(Entry->Volume->OSIconName, L"legacy", TRUE); if (BootLogoImage != NULL) BltImageAlpha(BootLogoImage, (UGAWidth - BootLogoImage->Width ) >> 1, (UGAHeight - BootLogoImage->Height) >> 1, &StdBackgroundPixel); if (Entry->Volume->IsMbrPartition) ActivateMbrPartition(Entry->Volume->WholeDiskBlockIO, Entry->Volume->MbrPartitionIndex); ExtractLegacyLoaderPaths(DiscoveredPathList, MAX_DISCOVERED_PATHS, LegacyLoaderList); Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, NULL, L"legacy loader", &ErrorInStep); if (Status == EFI_NOT_FOUND) { if (ErrorInStep == 1) Print(L"\nPlease make sure that you have the latest firmware update installed.\n"); else if (ErrorInStep == 3) Print(L"\nThe firmware refused to boot from the selected volume. Note that external\n" L"hard drives are not well-supported by Apple's firmware for legacy OS booting.\n"); } FinishExternalScreen(); } static LEGACY_ENTRY * AddLegacyEntry(IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume) { LEGACY_ENTRY *Entry, *SubEntry; REFIT_MENU_SCREEN *SubScreen; CHAR16 *VolDesc; CHAR16 ShortcutLetter = 0; if (LoaderTitle == NULL) { if (Volume->OSName != NULL) { LoaderTitle = Volume->OSName; if (LoaderTitle[0] == 'W' || LoaderTitle[0] == 'L') ShortcutLetter = LoaderTitle[0]; } else LoaderTitle = L"Legacy OS"; } if (Volume->VolName != NULL) VolDesc = Volume->VolName; else VolDesc = (Volume->DiskKind == DISK_KIND_OPTICAL) ? L"CD" : L"HD"; // prepare the menu entry Entry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); Entry->me.Title = PoolPrint(L"Boot %s from %s", LoaderTitle, VolDesc); Entry->me.Tag = TAG_LEGACY; Entry->me.Row = 0; Entry->me.ShortcutLetter = ShortcutLetter; Entry->me.Image = LoadOSIcon(Volume->OSIconName, L"legacy", FALSE); if (GlobalConfig.HideBadges == 0 || (GlobalConfig.HideBadges == 1 && Volume->DiskKind != DISK_KIND_INTERNAL)) Entry->me.BadgeImage = Volume->VolBadgeImage; Entry->Volume = Volume; Entry->LoadOptions = (Volume->DiskKind == DISK_KIND_OPTICAL) ? L"CD" : ((Volume->DiskKind == DISK_KIND_EXTERNAL) ? L"USB" : L"HD"); // create the submenu SubScreen = AllocateZeroPool(sizeof(REFIT_MENU_SCREEN)); SubScreen->Title = PoolPrint(L"Boot Options for %s on %s", LoaderTitle, VolDesc); SubScreen->TitleImage = Entry->me.Image; // default entry SubEntry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); SubEntry->me.Title = PoolPrint(L"Boot %s", LoaderTitle); SubEntry->me.Tag = TAG_LEGACY; SubEntry->Volume = Entry->Volume; SubEntry->LoadOptions = Entry->LoadOptions; AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); AddMenuEntry(SubScreen, &MenuEntryReturn); Entry->me.SubScreen = SubScreen; AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); return Entry; } static VOID ScanLegacy(VOID) { UINTN VolumeIndex, VolumeIndex2; BOOLEAN ShowVolume, HideIfOthersFound; REFIT_VOLUME *Volume; Print(L"Scanning for legacy boot volumes...\n"); for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { Volume = Volumes[VolumeIndex]; #if REFIT_DEBUG > 0 Print(L" %d %s\n %d %d %s %d %s\n", VolumeIndex, DevicePathToStr(Volume->DevicePath), Volume->DiskKind, Volume->MbrPartitionIndex, Volume->IsAppleLegacy ? L"AL" : L"--", Volume->HasBootCode, Volume->VolName ? Volume->VolName : L"(no name)"); #endif // skip volume if its kind is configured as disabled if ((Volume->DiskKind == DISK_KIND_OPTICAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_OPTICAL)) || (Volume->DiskKind == DISK_KIND_EXTERNAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_EXTERNAL)) || (Volume->DiskKind == DISK_KIND_INTERNAL && (GlobalConfig.DisableFlags & DISABLE_FLAG_INTERNAL))) continue; ShowVolume = FALSE; HideIfOthersFound = FALSE; if (Volume->IsAppleLegacy) { ShowVolume = TRUE; HideIfOthersFound = TRUE; } else if (Volume->HasBootCode) { ShowVolume = TRUE; if (Volume->BlockIO == Volume->WholeDiskBlockIO && Volume->BlockIOOffset == 0 && Volume->OSName == NULL) // this is a whole disk (MBR) entry; hide if we have entries for partitions HideIfOthersFound = TRUE; } if (HideIfOthersFound) { // check for other bootable entries on the same disk for (VolumeIndex2 = 0; VolumeIndex2 < VolumesCount; VolumeIndex2++) { if (VolumeIndex2 != VolumeIndex && Volumes[VolumeIndex2]->HasBootCode && Volumes[VolumeIndex2]->WholeDiskBlockIO == Volume->WholeDiskBlockIO) ShowVolume = FALSE; } } if (ShowVolume) AddLegacyEntry(NULL, Volume); } } // // pre-boot tool functions // static VOID StartTool(IN LOADER_ENTRY *Entry) { BeginExternalScreen(Entry->UseGraphicsMode, Entry->me.Title + 6); // assumes "Start " as assigned below StartEFIImage(Entry->DevicePath, Entry->LoadOptions, Basename(Entry->LoaderPath), Basename(Entry->LoaderPath), NULL); FinishExternalScreen(); } static LOADER_ENTRY * AddToolEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN EG_IMAGE *Image, IN CHAR16 ShortcutLetter, IN BOOLEAN UseGraphicsMode) { LOADER_ENTRY *Entry; Entry = AllocateZeroPool(sizeof(LOADER_ENTRY)); Entry->me.Title = PoolPrint(L"Start %s", LoaderTitle); Entry->me.Tag = TAG_TOOL; Entry->me.Row = 1; Entry->me.ShortcutLetter = ShortcutLetter; Entry->me.Image = Image; Entry->LoaderPath = StrDuplicate(LoaderPath); Entry->DevicePath = FileDevicePath(SelfLoadedImage->DeviceHandle, Entry->LoaderPath); Entry->UseGraphicsMode = UseGraphicsMode; AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); return Entry; } static VOID ScanTool(VOID) { //EFI_STATUS Status; CHAR16 FileName[256]; LOADER_ENTRY *Entry; if (GlobalConfig.DisableFlags & DISABLE_FLAG_TOOLS) return; Print(L"Scanning for tools...\n"); // look for the EFI shell if (!(GlobalConfig.DisableFlags & DISABLE_FLAG_SHELL)) { SPrint(FileName, 255, L"%s\\apps\\shell.efi", SelfDirPath); if (FileExists(SelfRootDir, FileName)) { AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE); } else { StrCpy(FileName, L"\\efi\\tools\\shell.efi"); if (FileExists(SelfRootDir, FileName)) { AddToolEntry(FileName, L"EFI Shell", BuiltinIcon(BUILTIN_ICON_TOOL_SHELL), 'S', FALSE); } } } // look for the GPT/MBR sync tool StrCpy(FileName, L"\\efi\\tools\\gptsync.efi"); if (FileExists(SelfRootDir, FileName)) { AddToolEntry(FileName, L"Partitioning Tool", BuiltinIcon(BUILTIN_ICON_TOOL_PART), 'P', FALSE); } // look for rescue Linux StrCpy(FileName, L"\\efi\\rescue\\elilo.efi"); if (SelfVolume != NULL && FileExists(SelfRootDir, FileName)) { Entry = AddToolEntry(FileName, L"Rescue Linux", BuiltinIcon(BUILTIN_ICON_TOOL_RESCUE), 0, FALSE); if (UGAWidth == 1440 && UGAHeight == 900) Entry->LoadOptions = L"-d 0 i17"; else if (UGAWidth == 1680 && UGAHeight == 1050) Entry->LoadOptions = L"-d 0 i20"; else Entry->LoadOptions = L"-d 0 mini"; } } // // pre-boot driver functions // static VOID ScanDriverDir(IN CHAR16 *Path) { EFI_STATUS Status; REFIT_DIR_ITER DirIter; EFI_FILE_INFO *DirEntry; CHAR16 FileName[256]; // look through contents of the directory DirIterOpen(SelfRootDir, Path, &DirIter); while (DirIterNext(&DirIter, 2, L"*.EFI", &DirEntry)) { if (DirEntry->FileName[0] == '.') continue; // skip this SPrint(FileName, 255, L"%s\\%s", Path, DirEntry->FileName); Status = StartEFIImage(FileDevicePath(SelfLoadedImage->DeviceHandle, FileName), L"", DirEntry->FileName, DirEntry->FileName, NULL); } Status = DirIterClose(&DirIter); if (Status != EFI_NOT_FOUND) { SPrint(FileName, 255, L"while scanning the %s directory", Path); CheckError(Status, FileName); } } static EFI_STATUS ConnectAllDriversToAllControllers(VOID) { EFI_STATUS Status; UINTN AllHandleCount; EFI_HANDLE *AllHandleBuffer; UINTN Index; UINTN HandleCount; EFI_HANDLE *HandleBuffer; UINT32 *HandleType; UINTN HandleIndex; BOOLEAN Parent; BOOLEAN Device; Status = LibLocateHandle(AllHandles, NULL, NULL, &AllHandleCount, &AllHandleBuffer); if (EFI_ERROR(Status)) return Status; for (Index = 0; Index < AllHandleCount; Index++) { // // Scan the handle database // Status = LibScanHandleDatabase(NULL, NULL, AllHandleBuffer[Index], NULL, &HandleCount, &HandleBuffer, &HandleType); if (EFI_ERROR (Status)) goto Done; Device = TRUE; if (HandleType[Index] & EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE) Device = FALSE; if (HandleType[Index] & EFI_HANDLE_TYPE_IMAGE_HANDLE) Device = FALSE; if (Device) { Parent = FALSE; for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) { if (HandleType[HandleIndex] & EFI_HANDLE_TYPE_PARENT_HANDLE) Parent = TRUE; } if (!Parent) { if (HandleType[Index] & EFI_HANDLE_TYPE_DEVICE_HANDLE) { Status = BS->ConnectController(AllHandleBuffer[Index], NULL, NULL, TRUE); } } } FreePool (HandleBuffer); FreePool (HandleType); } Done: FreePool (AllHandleBuffer); return Status; } static VOID LoadDrivers(VOID) { CHAR16 DirName[256]; Print(L"Scanning for drivers...\n"); // load drivers from /efi/refit/drivers SPrint(DirName, 255, L"%s\\drivers", SelfDirPath); ScanDriverDir(DirName); // load drivers from /efi/tools/drivers ScanDriverDir(L"\\efi\\tools\\drivers"); // connect all devices ConnectAllDriversToAllControllers(); } // // main entry point // #ifdef __GNUC__ #define RefitMain efi_main #endif EFI_STATUS EFIAPI RefitMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_STATUS Status; BOOLEAN MainLoopRunning = TRUE; REFIT_MENU_ENTRY *ChosenEntry; UINTN MenuExit; UINTN i; // bootstrap InitializeLib(ImageHandle, SystemTable); InitScreen(); Status = InitRefitLib(ImageHandle); if (EFI_ERROR(Status)) return Status; // read configuration ReadConfig(); MainMenu.TimeoutSeconds = GlobalConfig.Timeout; // disable EFI watchdog timer BS->SetWatchdogTimer(0x0000, 0x0000, 0x0000, NULL); // further bootstrap (now with config available) SetupScreen(); LoadDrivers(); ScanVolumes(); DebugPause(); // scan for loaders and tools, add them to the menu if (GlobalConfig.LegacyFirst) ScanLegacy(); ScanLoader(); if (!GlobalConfig.LegacyFirst) ScanLegacy(); ScanTool(); DebugPause(); // fixed other menu entries if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_FUNCS)) { MenuEntryAbout.Image = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); AddMenuEntry(&MainMenu, &MenuEntryAbout); } if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_FUNCS) || MainMenu.EntryCount == 0) { MenuEntryShutdown.Image = BuiltinIcon(BUILTIN_ICON_FUNC_SHUTDOWN); AddMenuEntry(&MainMenu, &MenuEntryShutdown); MenuEntryReset.Image = BuiltinIcon(BUILTIN_ICON_FUNC_RESET); AddMenuEntry(&MainMenu, &MenuEntryReset); } // assign shortcut keys for (i = 0; i < MainMenu.EntryCount && MainMenu.Entries[i]->Row == 0 && i < 9; i++) MainMenu.Entries[i]->ShortcutDigit = (CHAR16)('1' + i); // wait for user ACK when there were errors FinishTextScreen(FALSE); while (MainLoopRunning) { MenuExit = RunMainMenu(&MainMenu, GlobalConfig.DefaultSelection, &ChosenEntry); // We don't allow exiting the main menu with the Escape key. if (MenuExit == MENU_EXIT_ESCAPE) continue; switch (ChosenEntry->Tag) { case TAG_RESET: // Restart TerminateScreen(); RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); MainLoopRunning = FALSE; // just in case we get this far break; case TAG_SHUTDOWN: // Shut Down TerminateScreen(); RT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL); MainLoopRunning = FALSE; // just in case we get this far break; case TAG_ABOUT: // About rEFIt AboutRefit(); break; case TAG_LOADER: // Boot OS via .EFI loader StartLoader((LOADER_ENTRY *)ChosenEntry); break; case TAG_LEGACY: // Boot legacy OS StartLegacy((LEGACY_ENTRY *)ChosenEntry); break; case TAG_TOOL: // Start a EFI tool StartTool((LOADER_ENTRY *)ChosenEntry); break; } } // If we end up here, things have gone wrong. Try to reboot, and if that // fails, go into an endless loop. RT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); EndlessIdleLoop(); return EFI_SUCCESS; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit/Makefile���������������������������������������������������������������������������0000644�0001750�0001750�00000000460�10431662527�014664� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # refit/Makefile # Build control file for the rEFIt boot menu # LOCAL_CPPFLAGS = -I. -I../include -I../libeg LOCAL_LDFLAGS = -L../libeg LOCAL_LIBS = -leg OBJS = main.o config.o menu.o screen.o icns.o lib.o TARGET = refit.efi all: $(TARGET) include ../Make.common # EOF ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit/menu.c�����������������������������������������������������������������������������0000644�0001750�0001750�00000101400�11344445254�014330� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * refit/menu.c * Menu functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" #include "egemb_back_selected_small.h" // scrolling definitions typedef struct { INTN CurrentSelection, LastSelection, MaxIndex; INTN FirstVisible, LastVisible, MaxVisible, MaxFirstVisible; BOOLEAN IsScrolling, PaintAll, PaintSelection; } SCROLL_STATE; #define SCROLL_LINE_UP (0) #define SCROLL_LINE_DOWN (1) #define SCROLL_PAGE_UP (2) #define SCROLL_PAGE_DOWN (3) #define SCROLL_FIRST (4) #define SCROLL_LAST (5) #define SCROLL_NONE (6) // other menu definitions #define MENU_FUNCTION_INIT (0) #define MENU_FUNCTION_CLEANUP (1) #define MENU_FUNCTION_PAINT_ALL (2) #define MENU_FUNCTION_PAINT_SELECTION (3) #define MENU_FUNCTION_PAINT_TIMEOUT (4) typedef VOID (*MENU_STYLE_FUNC)(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CHAR16 *ParamText); static CHAR16 ArrowUp[2] = { ARROW_UP, 0 }; static CHAR16 ArrowDown[2] = { ARROW_DOWN, 0 }; #define TEXT_YMARGIN (2) #define TEXT_XMARGIN (8) #define TEXT_LINE_HEIGHT (FONT_CELL_HEIGHT + TEXT_YMARGIN * 2) #define TITLEICON_SPACING (16) #define ROW0_TILESIZE (144) #define ROW1_TILESIZE (64) #define TILE_XSPACING (8) #define TILE_YSPACING (16) static EG_IMAGE *SelectionImages[4] = { NULL, NULL, NULL, NULL }; static EG_PIXEL SelectionBackgroundPixel = { 0xff, 0xff, 0xff, 0 }; static EG_IMAGE *TextBuffer = NULL; // // Graphics helper functions // static VOID InitSelection(VOID) { UINTN x, y, src_x, src_y; EG_PIXEL *DestPtr, *SrcPtr; if (!AllowGraphicsMode) return; if (SelectionImages[0] != NULL) return; // load small selection image if (GlobalConfig.SelectionSmallFileName != NULL) SelectionImages[2] = egLoadImage(SelfDir, GlobalConfig.SelectionSmallFileName, FALSE); if (SelectionImages[2] == NULL) SelectionImages[2] = egPrepareEmbeddedImage(&egemb_back_selected_small, FALSE); SelectionImages[2] = egEnsureImageSize(SelectionImages[2], ROW1_TILESIZE, ROW1_TILESIZE, &MenuBackgroundPixel); if (SelectionImages[2] == NULL) return; // load big selection image if (GlobalConfig.SelectionBigFileName != NULL) { SelectionImages[0] = egLoadImage(SelfDir, GlobalConfig.SelectionBigFileName, FALSE); SelectionImages[0] = egEnsureImageSize(SelectionImages[0], ROW0_TILESIZE, ROW0_TILESIZE, &MenuBackgroundPixel); } if (SelectionImages[0] == NULL) { // calculate big selection image from small one SelectionImages[0] = egCreateImage(ROW0_TILESIZE, ROW0_TILESIZE, FALSE); if (SelectionImages[0] == NULL) { egFreeImage(SelectionImages[2]); SelectionImages[2] = NULL; return; } DestPtr = SelectionImages[0]->PixelData; SrcPtr = SelectionImages[2]->PixelData; for (y = 0; y < ROW0_TILESIZE; y++) { if (y < (ROW1_TILESIZE >> 1)) src_y = y; else if (y < (ROW0_TILESIZE - (ROW1_TILESIZE >> 1))) src_y = (ROW1_TILESIZE >> 1); else src_y = y - (ROW0_TILESIZE - ROW1_TILESIZE); for (x = 0; x < ROW0_TILESIZE; x++) { if (x < (ROW1_TILESIZE >> 1)) src_x = x; else if (x < (ROW0_TILESIZE - (ROW1_TILESIZE >> 1))) src_x = (ROW1_TILESIZE >> 1); else src_x = x - (ROW0_TILESIZE - ROW1_TILESIZE); *DestPtr++ = SrcPtr[src_y * ROW1_TILESIZE + src_x]; } } } // non-selected background images SelectionImages[1] = egCreateFilledImage(ROW0_TILESIZE, ROW0_TILESIZE, FALSE, &MenuBackgroundPixel); SelectionImages[3] = egCreateFilledImage(ROW1_TILESIZE, ROW1_TILESIZE, FALSE, &MenuBackgroundPixel); } // // Scrolling functions // static VOID InitScroll(OUT SCROLL_STATE *State, IN UINTN ItemCount, IN UINTN VisibleSpace) { State->LastSelection = State->CurrentSelection = 0; State->MaxIndex = (INTN)ItemCount - 1; State->FirstVisible = 0; if (VisibleSpace == 0) State->MaxVisible = State->MaxIndex; else State->MaxVisible = (INTN)VisibleSpace - 1; State->MaxFirstVisible = State->MaxIndex - State->MaxVisible; if (State->MaxFirstVisible < 0) State->MaxFirstVisible = 0; // non-scrolling case State->IsScrolling = (State->MaxFirstVisible > 0) ? TRUE : FALSE; State->PaintAll = TRUE; State->PaintSelection = FALSE; State->LastVisible = State->FirstVisible + State->MaxVisible; // TODO: use more sane values for the non-scrolling case } #define CONSTRAIN_MIN(Variable, MinValue) if (Variable < MinValue) Variable = MinValue #define CONSTRAIN_MAX(Variable, MaxValue) if (Variable > MaxValue) Variable = MaxValue static VOID UpdateScroll(IN OUT SCROLL_STATE *State, IN UINTN Movement) { State->LastSelection = State->CurrentSelection; switch (Movement) { case SCROLL_LINE_UP: if (State->CurrentSelection > 0) { State->CurrentSelection --; if (State->CurrentSelection < State->FirstVisible) { State->PaintAll = TRUE; State->FirstVisible = State->CurrentSelection - (State->MaxVisible >> 1); CONSTRAIN_MIN(State->FirstVisible, 0); } } break; case SCROLL_LINE_DOWN: if (State->CurrentSelection < State->MaxIndex) { State->CurrentSelection ++; if (State->CurrentSelection > State->LastVisible) { State->PaintAll = TRUE; State->FirstVisible = State->CurrentSelection - (State->MaxVisible >> 1); CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); } } break; case SCROLL_PAGE_UP: if (State->CurrentSelection > 0) { if (State->CurrentSelection == State->MaxIndex) { // currently at last entry, special treatment if (State->IsScrolling) State->CurrentSelection -= State->MaxVisible - 1; // move to second line without scrolling else State->CurrentSelection = 0; // move to first entry } else { if (State->FirstVisible > 0) State->PaintAll = TRUE; State->CurrentSelection -= State->MaxVisible; // move one page and scroll synchronously State->FirstVisible -= State->MaxVisible; } CONSTRAIN_MIN(State->CurrentSelection, 0); CONSTRAIN_MIN(State->FirstVisible, 0); } break; case SCROLL_PAGE_DOWN: if (State->CurrentSelection < State->MaxIndex) { if (State->CurrentSelection == 0) { // currently at first entry, special treatment if (State->IsScrolling) State->CurrentSelection += State->MaxVisible - 1; // move to second-to-last line without scrolling else State->CurrentSelection = State->MaxIndex; // move to last entry } else { if (State->FirstVisible < State->MaxFirstVisible) State->PaintAll = TRUE; State->CurrentSelection += State->MaxVisible; // move one page and scroll synchronously State->FirstVisible += State->MaxVisible; } CONSTRAIN_MAX(State->CurrentSelection, State->MaxIndex); CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); } break; case SCROLL_FIRST: if (State->CurrentSelection > 0) { State->CurrentSelection = 0; if (State->FirstVisible > 0) { State->PaintAll = TRUE; State->FirstVisible = 0; } } break; case SCROLL_LAST: if (State->CurrentSelection < State->MaxIndex) { State->CurrentSelection = State->MaxIndex; if (State->FirstVisible < State->MaxFirstVisible) { State->PaintAll = TRUE; State->FirstVisible = State->MaxFirstVisible; } } break; case SCROLL_NONE: // The caller has already updated CurrentSelection, but we may // have to scroll to make it visible. if (State->CurrentSelection < State->FirstVisible) { State->PaintAll = TRUE; State->FirstVisible = State->CurrentSelection - (State->MaxVisible >> 1); CONSTRAIN_MIN(State->FirstVisible, 0); } else if (State->CurrentSelection > State->LastVisible) { State->PaintAll = TRUE; State->FirstVisible = State->CurrentSelection - (State->MaxVisible >> 1); CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); } break; } if (!State->PaintAll && State->CurrentSelection != State->LastSelection) State->PaintSelection = TRUE; State->LastVisible = State->FirstVisible + State->MaxVisible; } // // menu helper functions // VOID AddMenuInfoLine(IN REFIT_MENU_SCREEN *Screen, IN CHAR16 *InfoLine) { AddListElement((VOID ***) &(Screen->InfoLines), &(Screen->InfoLineCount), InfoLine); } VOID AddMenuEntry(IN REFIT_MENU_SCREEN *Screen, IN REFIT_MENU_ENTRY *Entry) { AddListElement((VOID ***) &(Screen->Entries), &(Screen->EntryCount), Entry); } VOID FreeMenu(IN REFIT_MENU_SCREEN *Screen) { if (Screen->Entries) FreePool(Screen->Entries); } static INTN FindMenuShortcutEntry(IN REFIT_MENU_SCREEN *Screen, IN CHAR16 Shortcut) { UINTN i; if (Shortcut >= 'a' && Shortcut <= 'z') Shortcut -= ('a' - 'A'); if (Shortcut) { for (i = 0; i < Screen->EntryCount; i++) { if (Screen->Entries[i]->ShortcutDigit == Shortcut || Screen->Entries[i]->ShortcutLetter == Shortcut) { return i; } } } return -1; } // // generic menu function // static UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc, IN INTN DefaultEntryIndex, OUT REFIT_MENU_ENTRY **ChosenEntry) { SCROLL_STATE State; EFI_STATUS Status; EFI_INPUT_KEY key; UINTN index; INTN ShortcutEntry; BOOLEAN HaveTimeout = FALSE; UINTN TimeoutCountdown = 0; CHAR16 *TimeoutMessage; UINTN MenuExit; if (Screen->TimeoutSeconds > 0) { HaveTimeout = TRUE; TimeoutCountdown = Screen->TimeoutSeconds * 10; } MenuExit = 0; StyleFunc(Screen, &State, MENU_FUNCTION_INIT, NULL); // override the starting selection with the default index, if any if (DefaultEntryIndex >= 0 && DefaultEntryIndex <= State.MaxIndex) { State.CurrentSelection = DefaultEntryIndex; UpdateScroll(&State, SCROLL_NONE); } while (!MenuExit) { // update the screen if (State.PaintAll) { StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_ALL, NULL); State.PaintAll = FALSE; } else if (State.PaintSelection) { StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_SELECTION, NULL); State.PaintSelection = FALSE; } if (HaveTimeout) { TimeoutMessage = PoolPrint(L"%s in %d seconds", Screen->TimeoutText, (TimeoutCountdown + 5) / 10); StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_TIMEOUT, TimeoutMessage); FreePool(TimeoutMessage); } // read key press (and wait for it if applicable) Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key); if (Status == EFI_NOT_READY) { if (HaveTimeout && TimeoutCountdown == 0) { // timeout expired MenuExit = MENU_EXIT_TIMEOUT; break; } else if (HaveTimeout) { BS->Stall(100000); TimeoutCountdown--; } else BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index); continue; } if (HaveTimeout) { // the user pressed a key, cancel the timeout StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_TIMEOUT, L""); HaveTimeout = FALSE; } // react to key press switch (key.ScanCode) { case SCAN_UP: case SCAN_LEFT: UpdateScroll(&State, SCROLL_LINE_UP); break; case SCAN_DOWN: case SCAN_RIGHT: UpdateScroll(&State, SCROLL_LINE_DOWN); break; case SCAN_HOME: UpdateScroll(&State, SCROLL_FIRST); break; case SCAN_END: UpdateScroll(&State, SCROLL_LAST); break; case SCAN_PAGE_UP: UpdateScroll(&State, SCROLL_PAGE_UP); break; case SCAN_PAGE_DOWN: UpdateScroll(&State, SCROLL_PAGE_DOWN); break; case SCAN_ESC: MenuExit = MENU_EXIT_ESCAPE; break; case SCAN_INSERT: case SCAN_F2: MenuExit = MENU_EXIT_DETAILS; break; case SCAN_F10: egScreenShot(); break; } switch (key.UnicodeChar) { case CHAR_LINEFEED: case CHAR_CARRIAGE_RETURN: case ' ': MenuExit = MENU_EXIT_ENTER; break; case '+': MenuExit = MENU_EXIT_DETAILS; break; default: ShortcutEntry = FindMenuShortcutEntry(Screen, key.UnicodeChar); if (ShortcutEntry >= 0) { State.CurrentSelection = ShortcutEntry; MenuExit = MENU_EXIT_ENTER; } break; } } StyleFunc(Screen, &State, MENU_FUNCTION_CLEANUP, NULL); if (ChosenEntry) *ChosenEntry = Screen->Entries[State.CurrentSelection]; return MenuExit; } // // text-mode generic style // static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CHAR16 *ParamText) { INTN i; UINTN MenuWidth, ItemWidth, MenuHeight; static UINTN MenuPosY; static CHAR16 **DisplayStrings; CHAR16 *TimeoutMessage; switch (Function) { case MENU_FUNCTION_INIT: // vertical layout MenuPosY = 4; if (Screen->InfoLineCount > 0) MenuPosY += Screen->InfoLineCount + 1; MenuHeight = ConHeight - MenuPosY; if (Screen->TimeoutSeconds > 0) MenuHeight -= 2; InitScroll(State, Screen->EntryCount, MenuHeight); // determine width of the menu MenuWidth = 20; // minimum for (i = 0; i <= State->MaxIndex; i++) { ItemWidth = StrLen(Screen->Entries[i]->Title); if (MenuWidth < ItemWidth) MenuWidth = ItemWidth; } if (MenuWidth > ConWidth - 6) MenuWidth = ConWidth - 6; // prepare strings for display DisplayStrings = AllocatePool(sizeof(CHAR16 *) * Screen->EntryCount); for (i = 0; i <= State->MaxIndex; i++) DisplayStrings[i] = PoolPrint(L" %-.*s ", MenuWidth, Screen->Entries[i]->Title); // TODO: shorten strings that are too long (PoolPrint doesn't do that...) // TODO: use more elaborate techniques for shortening too long strings (ellipses in the middle) // TODO: account for double-width characters // initial painting BeginTextScreen(Screen->Title); if (Screen->InfoLineCount > 0) { ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); for (i = 0; i < (INTN)Screen->InfoLineCount; i++) { ST->ConOut->SetCursorPosition(ST->ConOut, 3, 4 + i); ST->ConOut->OutputString(ST->ConOut, Screen->InfoLines[i]); } } break; case MENU_FUNCTION_CLEANUP: // release temporary memory for (i = 0; i <= State->MaxIndex; i++) FreePool(DisplayStrings[i]); FreePool(DisplayStrings); break; case MENU_FUNCTION_PAINT_ALL: // paint the whole screen (initially and after scrolling) for (i = 0; i <= State->MaxIndex; i++) { if (i >= State->FirstVisible && i <= State->LastVisible) { ST->ConOut->SetCursorPosition(ST->ConOut, 2, MenuPosY + (i - State->FirstVisible)); if (i == State->CurrentSelection) ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_CURRENT); else ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_BASIC); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[i]); } } // scrolling indicators ST->ConOut->SetAttribute(ST->ConOut, ATTR_SCROLLARROW); ST->ConOut->SetCursorPosition(ST->ConOut, 0, MenuPosY); if (State->FirstVisible > 0) ST->ConOut->OutputString(ST->ConOut, ArrowUp); else ST->ConOut->OutputString(ST->ConOut, L" "); ST->ConOut->SetCursorPosition(ST->ConOut, 0, MenuPosY + State->MaxVisible); if (State->LastVisible < State->MaxIndex) ST->ConOut->OutputString(ST->ConOut, ArrowDown); else ST->ConOut->OutputString(ST->ConOut, L" "); break; case MENU_FUNCTION_PAINT_SELECTION: // redraw selection cursor ST->ConOut->SetCursorPosition(ST->ConOut, 2, MenuPosY + (State->LastSelection - State->FirstVisible)); ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_BASIC); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[State->LastSelection]); ST->ConOut->SetCursorPosition(ST->ConOut, 2, MenuPosY + (State->CurrentSelection - State->FirstVisible)); ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_CURRENT); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[State->CurrentSelection]); break; case MENU_FUNCTION_PAINT_TIMEOUT: if (ParamText[0] == 0) { // clear message ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); ST->ConOut->SetCursorPosition(ST->ConOut, 0, ConHeight - 1); ST->ConOut->OutputString(ST->ConOut, BlankLine + 1); } else { // paint or update message ST->ConOut->SetAttribute(ST->ConOut, ATTR_ERROR); ST->ConOut->SetCursorPosition(ST->ConOut, 3, ConHeight - 1); TimeoutMessage = PoolPrint(L"%s ", ParamText); ST->ConOut->OutputString(ST->ConOut, TimeoutMessage); FreePool(TimeoutMessage); } break; } } // // graphical generic style // static VOID DrawMenuText(IN CHAR16 *Text, IN UINTN SelectedWidth, IN UINTN XPos, IN UINTN YPos) { if (TextBuffer == NULL) TextBuffer = egCreateImage(LAYOUT_TEXT_WIDTH, TEXT_LINE_HEIGHT, FALSE); egFillImage(TextBuffer, &MenuBackgroundPixel); if (SelectedWidth > 0) { // draw selection bar background egFillImageArea(TextBuffer, 0, 0, SelectedWidth, TextBuffer->Height, &SelectionBackgroundPixel); } // render the text egRenderText(Text, TextBuffer, TEXT_XMARGIN, TEXT_YMARGIN); BltImage(TextBuffer, XPos, YPos); } static VOID GraphicsMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CHAR16 *ParamText) { INTN i; UINTN ItemWidth; static UINTN MenuWidth, EntriesPosX, EntriesPosY, TimeoutPosY; switch (Function) { case MENU_FUNCTION_INIT: InitScroll(State, Screen->EntryCount, 0); // TODO: calculate available screen space // determine width of the menu MenuWidth = 20; // minimum for (i = 0; i < (INTN)Screen->InfoLineCount; i++) { ItemWidth = StrLen(Screen->InfoLines[i]); if (MenuWidth < ItemWidth) MenuWidth = ItemWidth; } for (i = 0; i <= State->MaxIndex; i++) { ItemWidth = StrLen(Screen->Entries[i]->Title); if (MenuWidth < ItemWidth) MenuWidth = ItemWidth; } MenuWidth = TEXT_XMARGIN * 2 + MenuWidth * FONT_CELL_WIDTH; if (MenuWidth > LAYOUT_TEXT_WIDTH) MenuWidth = LAYOUT_TEXT_WIDTH; if (Screen->TitleImage) EntriesPosX = (UGAWidth + (Screen->TitleImage->Width + TITLEICON_SPACING) - MenuWidth) >> 1; else EntriesPosX = (UGAWidth - MenuWidth) >> 1; EntriesPosY = ((UGAHeight - LAYOUT_TOTAL_HEIGHT) >> 1) + LAYOUT_BANNER_YOFFSET + TEXT_LINE_HEIGHT * 2; TimeoutPosY = EntriesPosY + (Screen->EntryCount + 1) * TEXT_LINE_HEIGHT; // initial painting SwitchToGraphicsAndClear(); egMeasureText(Screen->Title, &ItemWidth, NULL); DrawMenuText(Screen->Title, 0, ((UGAWidth - ItemWidth) >> 1) - TEXT_XMARGIN, EntriesPosY - TEXT_LINE_HEIGHT * 2); if (Screen->TitleImage) BltImageAlpha(Screen->TitleImage, EntriesPosX - (Screen->TitleImage->Width + TITLEICON_SPACING), EntriesPosY, &MenuBackgroundPixel); if (Screen->InfoLineCount > 0) { for (i = 0; i < (INTN)Screen->InfoLineCount; i++) { DrawMenuText(Screen->InfoLines[i], 0, EntriesPosX, EntriesPosY); EntriesPosY += TEXT_LINE_HEIGHT; } EntriesPosY += TEXT_LINE_HEIGHT; // also add a blank line } break; case MENU_FUNCTION_CLEANUP: // nothing to do break; case MENU_FUNCTION_PAINT_ALL: for (i = 0; i <= State->MaxIndex; i++) { DrawMenuText(Screen->Entries[i]->Title, (i == State->CurrentSelection) ? MenuWidth : 0, EntriesPosX, EntriesPosY + i * TEXT_LINE_HEIGHT); } // TODO: account for scrolling /* for (i = 0; i <= State->MaxIndex; i++) { if (i >= State->FirstVisible && i <= State->LastVisible) { ST->ConOut->SetCursorPosition(ST->ConOut, 2, 4 + (i - State->FirstVisible)); if (i == State->CurrentSelection) ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_CURRENT); else ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_BASIC); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[i]); } } // scrolling indicators ST->ConOut->SetAttribute(ST->ConOut, ATTR_SCROLLARROW); ST->ConOut->SetCursorPosition(ST->ConOut, 0, 4); if (State->FirstVisible > 0) ST->ConOut->OutputString(ST->ConOut, ArrowUp); else ST->ConOut->OutputString(ST->ConOut, L" "); ST->ConOut->SetCursorPosition(ST->ConOut, 0, 4 + State->MaxVisible); if (State->LastVisible < State->MaxIndex) ST->ConOut->OutputString(ST->ConOut, ArrowDown); else ST->ConOut->OutputString(ST->ConOut, L" "); */ break; case MENU_FUNCTION_PAINT_SELECTION: // redraw selection cursor DrawMenuText(Screen->Entries[State->LastSelection]->Title, 0, EntriesPosX, EntriesPosY + State->LastSelection * TEXT_LINE_HEIGHT); DrawMenuText(Screen->Entries[State->CurrentSelection]->Title, MenuWidth, EntriesPosX, EntriesPosY + State->CurrentSelection * TEXT_LINE_HEIGHT); // TODO: account for scrolling /* ST->ConOut->SetCursorPosition(ST->ConOut, 2, 4 + (State->LastSelection - State->FirstVisible)); ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_BASIC); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[State->LastSelection]); ST->ConOut->SetCursorPosition(ST->ConOut, 2, 4 + (State->CurrentSelection - State->FirstVisible)); ST->ConOut->SetAttribute(ST->ConOut, ATTR_CHOICE_CURRENT); ST->ConOut->OutputString(ST->ConOut, DisplayStrings[State->CurrentSelection]); */ break; case MENU_FUNCTION_PAINT_TIMEOUT: DrawMenuText(ParamText, 0, EntriesPosX, TimeoutPosY); break; } } // // graphical main menu style // static VOID DrawMainMenuEntry(REFIT_MENU_ENTRY *Entry, BOOLEAN selected, UINTN XPos, UINTN YPos) { BltImageCompositeBadge(SelectionImages[((Entry->Row == 0) ? 0 : 2) + (selected ? 0 : 1)], Entry->Image, Entry->BadgeImage, XPos, YPos); } static VOID DrawMainMenuText(IN CHAR16 *Text, IN UINTN XPos, IN UINTN YPos) { UINTN TextWidth; if (TextBuffer == NULL) TextBuffer = egCreateImage(LAYOUT_TEXT_WIDTH, TEXT_LINE_HEIGHT, FALSE); egFillImage(TextBuffer, &MenuBackgroundPixel); // render the text egMeasureText(Text, &TextWidth, NULL); egRenderText(Text, TextBuffer, (TextBuffer->Width - TextWidth) >> 1, 0); BltImage(TextBuffer, XPos, YPos); } static VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CHAR16 *ParamText) { INTN i; UINTN row0Count, row0PosX, row0PosXRunning; UINTN row1Count, row1PosX, row1PosXRunning; static UINTN *itemPosX; static UINTN row0PosY, row1PosY, textPosY; switch (Function) { case MENU_FUNCTION_INIT: InitScroll(State, Screen->EntryCount, 0); // layout row0Count = 0; row1Count = 0; for (i = 0; i <= State->MaxIndex; i++) { if (Screen->Entries[i]->Row == 0) row0Count++; else row1Count++; } row0PosX = (UGAWidth + TILE_XSPACING - (ROW0_TILESIZE + TILE_XSPACING) * row0Count) >> 1; row0PosY = ((UGAHeight - LAYOUT_TOTAL_HEIGHT) >> 1) + LAYOUT_BANNER_YOFFSET; row1PosX = (UGAWidth + TILE_XSPACING - (ROW1_TILESIZE + TILE_XSPACING) * row1Count) >> 1; row1PosY = row0PosY + ROW0_TILESIZE + TILE_YSPACING; if (row1Count > 0) textPosY = row1PosY + ROW1_TILESIZE + TILE_YSPACING; else textPosY = row1PosY; itemPosX = AllocatePool(sizeof(UINTN) * Screen->EntryCount); row0PosXRunning = row0PosX; row1PosXRunning = row1PosX; for (i = 0; i <= State->MaxIndex; i++) { if (Screen->Entries[i]->Row == 0) { itemPosX[i] = row0PosXRunning; row0PosXRunning += ROW0_TILESIZE + TILE_XSPACING; } else { itemPosX[i] = row1PosXRunning; row1PosXRunning += ROW1_TILESIZE + TILE_XSPACING; } } // initial painting InitSelection(); SwitchToGraphicsAndClear(); break; case MENU_FUNCTION_CLEANUP: FreePool(itemPosX); break; case MENU_FUNCTION_PAINT_ALL: for (i = 0; i <= State->MaxIndex; i++) { DrawMainMenuEntry(Screen->Entries[i], (i == State->CurrentSelection) ? TRUE : FALSE, itemPosX[i], (Screen->Entries[i]->Row == 0) ? row0PosY : row1PosY); } if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)) DrawMainMenuText(Screen->Entries[State->CurrentSelection]->Title, (UGAWidth - LAYOUT_TEXT_WIDTH) >> 1, textPosY); break; case MENU_FUNCTION_PAINT_SELECTION: DrawMainMenuEntry(Screen->Entries[State->LastSelection], FALSE, itemPosX[State->LastSelection], (Screen->Entries[State->LastSelection]->Row == 0) ? row0PosY : row1PosY); DrawMainMenuEntry(Screen->Entries[State->CurrentSelection], TRUE, itemPosX[State->CurrentSelection], (Screen->Entries[State->CurrentSelection]->Row == 0) ? row0PosY : row1PosY); if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)) DrawMainMenuText(Screen->Entries[State->CurrentSelection]->Title, (UGAWidth - LAYOUT_TEXT_WIDTH) >> 1, textPosY); break; case MENU_FUNCTION_PAINT_TIMEOUT: if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)) DrawMainMenuText(ParamText, (UGAWidth - LAYOUT_TEXT_WIDTH) >> 1, textPosY + TEXT_LINE_HEIGHT); break; } } // // user-callable dispatcher functions // UINTN RunMenu(IN REFIT_MENU_SCREEN *Screen, OUT REFIT_MENU_ENTRY **ChosenEntry) { MENU_STYLE_FUNC Style = TextMenuStyle; if (AllowGraphicsMode) Style = GraphicsMenuStyle; return RunGenericMenu(Screen, Style, -1, ChosenEntry); } UINTN RunMainMenu(IN REFIT_MENU_SCREEN *Screen, IN CHAR16* DefaultSelection, OUT REFIT_MENU_ENTRY **ChosenEntry) { MENU_STYLE_FUNC Style = TextMenuStyle; MENU_STYLE_FUNC MainStyle = TextMenuStyle; REFIT_MENU_ENTRY *TempChosenEntry; UINTN MenuExit = 0; UINTN DefaultEntryIndex = -1; if (DefaultSelection != NULL) { // Find a menu entry whose shortcut is the first character of DefaultSelection. DefaultEntryIndex = FindMenuShortcutEntry(Screen, DefaultSelection[0]); // If that didn't work, should we scan more characters? For now, no. } if (AllowGraphicsMode) { Style = GraphicsMenuStyle; MainStyle = MainMenuStyle; } while (!MenuExit) { MenuExit = RunGenericMenu(Screen, MainStyle, DefaultEntryIndex, &TempChosenEntry); Screen->TimeoutSeconds = 0; if (MenuExit == MENU_EXIT_DETAILS && TempChosenEntry->SubScreen != NULL) { MenuExit = RunGenericMenu(TempChosenEntry->SubScreen, Style, -1, &TempChosenEntry); if (MenuExit == MENU_EXIT_ESCAPE || TempChosenEntry->Tag == TAG_RETURN) MenuExit = 0; } } if (ChosenEntry) *ChosenEntry = TempChosenEntry; return MenuExit; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit/refit.mak��������������������������������������������������������������������������0000644�0001750�0001750�00000003364�10633422241�015024� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # refit/refit.mak # Build control file for the rEFIt boot menu # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = refit IMAGE_ENTRY_POINT = RefitMain # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include \ -I $(SDK_INSTALL_DIR)\refit\libeg $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib \ $(SDK_BUILD_DIR)\refit\libeg\libeg.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\main.obj \ $(BUILD_DIR)\config.obj \ $(BUILD_DIR)\menu.obj \ $(BUILD_DIR)\screen.obj \ $(BUILD_DIR)\icns.obj \ $(BUILD_DIR)\lib.obj \ # # Source file dependencies # $(BUILD_DIR)\main.obj : $(*B).c $(INC_DEPS) lib.h $(BUILD_DIR)\config.obj : $(*B).c $(INC_DEPS) lib.h $(BUILD_DIR)\menu.obj : $(*B).c $(INC_DEPS) lib.h $(BUILD_DIR)\screen.obj : $(*B).c $(INC_DEPS) lib.h $(BUILD_DIR)\icns.obj : $(*B).c $(INC_DEPS) lib.h $(BUILD_DIR)\lib.obj : $(*B).c $(INC_DEPS) lib.h # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit/refit.mkefi������������������������������������������������������������������������0000644�0001750�0001750�00000000302�10431662527�015345� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # mkefi control file for refit # name refit type app entrypoint RefitMain includedir . ../include ../libeg libdir ../libeg lib eg source main.c config.c menu.c screen.c icns.c lib.c # EOF ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit/screen.c���������������������������������������������������������������������������0000644�0001750�0001750�00000027116�10756102142�014646� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * refit/screen.c * Screen handling functions * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "lib.h" #include "egemb_refit_banner.h" // Console defines and variables UINTN ConWidth; UINTN ConHeight; CHAR16 *BlankLine; static VOID SwitchToText(IN BOOLEAN CursorEnabled); static VOID SwitchToGraphics(VOID); static VOID DrawScreenHeader(IN CHAR16 *Title); static VOID PauseForKey(VOID); // UGA defines and variables UINTN UGAWidth; UINTN UGAHeight; BOOLEAN AllowGraphicsMode; EG_PIXEL StdBackgroundPixel = { 0xbf, 0xbf, 0xbf, 0 }; EG_PIXEL MenuBackgroundPixel = { 0xbf, 0xbf, 0xbf, 0 }; static BOOLEAN GraphicsScreenDirty; // general defines and variables static BOOLEAN haveError = FALSE; // // Screen initialization and switching // VOID InitScreen(VOID) { UINTN i; // initialize libeg egInitScreen(); if (egHasGraphicsMode()) { egGetScreenSize(&UGAWidth, &UGAHeight); AllowGraphicsMode = TRUE; } else { AllowGraphicsMode = FALSE; egSetGraphicsModeEnabled(FALSE); // just to be sure we are in text mode } GraphicsScreenDirty = TRUE; // disable cursor ST->ConOut->EnableCursor(ST->ConOut, FALSE); // get size of text console if (ST->ConOut->QueryMode(ST->ConOut, ST->ConOut->Mode->Mode, &ConWidth, &ConHeight) != EFI_SUCCESS) { // use default values on error ConWidth = 80; ConHeight = 25; } // make a buffer for a whole text line BlankLine = AllocatePool((ConWidth + 1) * sizeof(CHAR16)); for (i = 0; i < ConWidth; i++) BlankLine[i] = ' '; BlankLine[i] = 0; // show the banner (even when in graphics mode) DrawScreenHeader(L"Initializing..."); } VOID SetupScreen(VOID) { if (GlobalConfig.TextOnly) { // switch to text mode if requested AllowGraphicsMode = FALSE; SwitchToText(FALSE); } else if (AllowGraphicsMode) { // clear screen and show banner // (now we know we'll stay in graphics mode) SwitchToGraphics(); BltClearScreen(TRUE); } } static VOID SwitchToText(IN BOOLEAN CursorEnabled) { egSetGraphicsModeEnabled(FALSE); ST->ConOut->EnableCursor(ST->ConOut, CursorEnabled); } static VOID SwitchToGraphics(VOID) { if (AllowGraphicsMode && !egIsGraphicsModeEnabled()) { egSetGraphicsModeEnabled(TRUE); GraphicsScreenDirty = TRUE; } } // // Screen control for running tools // VOID BeginTextScreen(IN CHAR16 *Title) { DrawScreenHeader(Title); SwitchToText(FALSE); // reset error flag haveError = FALSE; } VOID FinishTextScreen(IN BOOLEAN WaitAlways) { if (haveError || WaitAlways) { SwitchToText(FALSE); PauseForKey(); } // reset error flag haveError = FALSE; } VOID BeginExternalScreen(IN BOOLEAN UseGraphicsMode, IN CHAR16 *Title) { if (!AllowGraphicsMode) UseGraphicsMode = FALSE; if (UseGraphicsMode) { SwitchToGraphics(); BltClearScreen(FALSE); } // show the header DrawScreenHeader(Title); if (!UseGraphicsMode) SwitchToText(TRUE); // reset error flag haveError = FALSE; } VOID FinishExternalScreen(VOID) { // make sure we clean up later GraphicsScreenDirty = TRUE; if (haveError) { SwitchToText(FALSE); PauseForKey(); } // reset error flag haveError = FALSE; } VOID TerminateScreen(VOID) { // clear text screen ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); ST->ConOut->ClearScreen(ST->ConOut); // enable cursor ST->ConOut->EnableCursor(ST->ConOut, TRUE); } static VOID DrawScreenHeader(IN CHAR16 *Title) { UINTN y; // clear to black background ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); ST->ConOut->ClearScreen(ST->ConOut); // paint header background ST->ConOut->SetAttribute(ST->ConOut, ATTR_BANNER); for (y = 0; y < 3; y++) { ST->ConOut->SetCursorPosition(ST->ConOut, 0, y); Print(BlankLine); } // print header text ST->ConOut->SetCursorPosition(ST->ConOut, 3, 1); Print(L"rEFIt - %s", Title); // reposition cursor ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); ST->ConOut->SetCursorPosition(ST->ConOut, 0, 4); } // // Keyboard input // static BOOLEAN ReadAllKeyStrokes(VOID) { BOOLEAN GotKeyStrokes; EFI_STATUS Status; EFI_INPUT_KEY key; GotKeyStrokes = FALSE; for (;;) { Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &key); if (Status == EFI_SUCCESS) { GotKeyStrokes = TRUE; continue; } break; } return GotKeyStrokes; } static VOID PauseForKey(VOID) { UINTN index; Print(L"\n* Hit any key to continue *"); if (ReadAllKeyStrokes()) { // remove buffered key strokes BS->Stall(5000000); // 5 seconds delay ReadAllKeyStrokes(); // empty the buffer again } BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index); ReadAllKeyStrokes(); // empty the buffer to protect the menu Print(L"\n"); } #if REFIT_DEBUG > 0 VOID DebugPause(VOID) { // show console and wait for key SwitchToText(FALSE); PauseForKey(); // reset error flag haveError = FALSE; } #endif VOID EndlessIdleLoop(VOID) { UINTN index; for (;;) { ReadAllKeyStrokes(); BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &index); } } // // Error handling // BOOLEAN CheckFatalError(IN EFI_STATUS Status, IN CHAR16 *where) { CHAR16 ErrorName[64]; if (!EFI_ERROR(Status)) return FALSE; StatusToString(ErrorName, Status); ST->ConOut->SetAttribute(ST->ConOut, ATTR_ERROR); Print(L"Fatal Error: %s %s\n", ErrorName, where); ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); haveError = TRUE; //BS->Exit(ImageHandle, ExitStatus, ExitDataSize, ExitData); return TRUE; } BOOLEAN CheckError(IN EFI_STATUS Status, IN CHAR16 *where) { CHAR16 ErrorName[64]; if (!EFI_ERROR(Status)) return FALSE; StatusToString(ErrorName, Status); ST->ConOut->SetAttribute(ST->ConOut, ATTR_ERROR); Print(L"Error: %s %s\n", ErrorName, where); ST->ConOut->SetAttribute(ST->ConOut, ATTR_BASIC); haveError = TRUE; return TRUE; } // // Graphics functions // VOID SwitchToGraphicsAndClear(VOID) { SwitchToGraphics(); if (GraphicsScreenDirty) BltClearScreen(TRUE); } VOID BltClearScreen(IN BOOLEAN ShowBanner) { static EG_IMAGE *Banner = NULL; if (ShowBanner && !(GlobalConfig.HideUIFlags & HIDEUI_FLAG_BANNER)) { // load banner on first call if (Banner == NULL) { if (GlobalConfig.BannerFileName == NULL) Banner = egPrepareEmbeddedImage(&egemb_refit_banner, FALSE); else Banner = egLoadImage(SelfDir, GlobalConfig.BannerFileName, FALSE); if (Banner != NULL) MenuBackgroundPixel = Banner->PixelData[0]; } // clear and draw banner egClearScreen(&MenuBackgroundPixel); if (Banner != NULL) BltImage(Banner, (UGAWidth - Banner->Width) >> 1, ((UGAHeight - LAYOUT_TOTAL_HEIGHT) >> 1) + LAYOUT_BANNER_HEIGHT - Banner->Height); } else { // clear to standard background color egClearScreen(&StdBackgroundPixel); } GraphicsScreenDirty = FALSE; } VOID BltImage(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos) { egDrawImage(Image, XPos, YPos); GraphicsScreenDirty = TRUE; } VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL *BackgroundPixel) { EG_IMAGE *CompImage; // compose on background CompImage = egCreateFilledImage(Image->Width, Image->Height, FALSE, BackgroundPixel); egComposeImage(CompImage, Image, 0, 0); // blit to screen and clean up egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); GraphicsScreenDirty = TRUE; } VOID BltImageComposite(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN UINTN XPos, IN UINTN YPos) { UINTN TotalWidth, TotalHeight, CompWidth, CompHeight, OffsetX, OffsetY; EG_IMAGE *CompImage; // initialize buffer with base image CompImage = egCopyImage(BaseImage); TotalWidth = BaseImage->Width; TotalHeight = BaseImage->Height; // place the top image CompWidth = TopImage->Width; if (CompWidth > TotalWidth) CompWidth = TotalWidth; OffsetX = (TotalWidth - CompWidth) >> 1; CompHeight = TopImage->Height; if (CompHeight > TotalHeight) CompHeight = TotalHeight; OffsetY = (TotalHeight - CompHeight) >> 1; egComposeImage(CompImage, TopImage, OffsetX, OffsetY); // blit to screen and clean up egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); GraphicsScreenDirty = TRUE; } VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG_IMAGE *BadgeImage, IN UINTN XPos, IN UINTN YPos) { UINTN TotalWidth, TotalHeight, CompWidth, CompHeight, OffsetX, OffsetY; EG_IMAGE *CompImage; // initialize buffer with base image CompImage = egCopyImage(BaseImage); TotalWidth = BaseImage->Width; TotalHeight = BaseImage->Height; // place the top image CompWidth = TopImage->Width; if (CompWidth > TotalWidth) CompWidth = TotalWidth; OffsetX = (TotalWidth - CompWidth) >> 1; CompHeight = TopImage->Height; if (CompHeight > TotalHeight) CompHeight = TotalHeight; OffsetY = (TotalHeight - CompHeight) >> 1; egComposeImage(CompImage, TopImage, OffsetX, OffsetY); // place the badge image if (BadgeImage != NULL && (BadgeImage->Width + 8) < CompWidth && (BadgeImage->Height + 8) < CompHeight) { OffsetX += CompWidth - 8 - BadgeImage->Width; OffsetY += CompHeight - 8 - BadgeImage->Height; egComposeImage(CompImage, BadgeImage, OffsetX, OffsetY); } // blit to screen and clean up egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); GraphicsScreenDirty = TRUE; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit.mak��������������������������������������������������������������������������������0000644�0001750�0001750�00000001733�10633422241�013711� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # refit.mak # Build control file for all rEFIt components # SOURCE_DIR = $(SDK_INSTALL_DIR)\refit !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env all : cd $(SOURCE_DIR)\libeg nmake -f libeg.mak all cd $(SOURCE_DIR) cd $(SOURCE_DIR)\refit nmake -f refit.mak all cd $(SOURCE_DIR) cd $(SOURCE_DIR)\gptsync nmake -f gptsync.mak all cd $(SOURCE_DIR) # cd $(SOURCE_DIR)\ebounce # nmake -f ebounce.mak all # cd $(SOURCE_DIR) cd $(SOURCE_DIR)\TextMode nmake -f TextMode.mak all cd $(SOURCE_DIR) cd $(SOURCE_DIR)\dumpprot nmake -f dumpprot.mak all cd $(SOURCE_DIR) cd $(SOURCE_DIR)\dumpfv nmake -f dumpfv.mak all cd $(SOURCE_DIR) cd $(SOURCE_DIR)\dbounce nmake -f dbounce.mak all cd $(SOURCE_DIR) # cd $(SOURCE_DIR)\fs_ext2 # nmake -f fs_ext2.mak all # cd $(SOURCE_DIR) cd $(SOURCE_DIR)\fsw nmake -f fsw_ext2.mak all nmake -f fsw_reiserfs.mak all nmake -f fsw_iso9660.mak all cd $(SOURCE_DIR) �������������������������������������refit-0.14/refit.xcodeproj/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�11363100432�015203� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit.xcodeproj/project.pbxproj����������������������������������������������������������0000644�0001750�0001750�00000145772�11344755213�020313� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXAggregateTarget section */ 9D48FDA90B45210F001800E8 /* Doxygen */ = { isa = PBXAggregateTarget; buildConfigurationList = 9D48FDB00B45212D001800E8 /* Build configuration list for PBXAggregateTarget "Doxygen" */; buildPhases = ( 9D48FDA80B45210F001800E8 /* ShellScript */, ); dependencies = ( ); name = Doxygen; productName = Doxygen; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 9D48FD680B451AF1001800E8 /* config.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD3C0B451880001800E8 /* config.c */; }; 9D48FD690B451AF1001800E8 /* icns.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD3D0B451880001800E8 /* icns.c */; }; 9D48FD6A0B451AF2001800E8 /* lib.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD3E0B451880001800E8 /* lib.c */; }; 9D48FD6B0B451AF3001800E8 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD400B451880001800E8 /* main.c */; }; 9D48FD6C0B451AF4001800E8 /* menu.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD410B451880001800E8 /* menu.c */; }; 9D48FD6D0B451AF5001800E8 /* screen.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD420B451880001800E8 /* screen.c */; }; 9D48FD6E0B451B04001800E8 /* image.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD2B0B45183F001800E8 /* image.c */; }; 9D48FD6F0B451B05001800E8 /* load_bmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD2E0B45183F001800E8 /* load_bmp.c */; }; 9D48FD700B451B05001800E8 /* load_icns.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD2F0B45183F001800E8 /* load_icns.c */; }; 9D48FD710B451B07001800E8 /* screen.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD310B45183F001800E8 /* screen.c */; }; 9D48FD720B451B08001800E8 /* text.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD320B45183F001800E8 /* text.c */; }; 9D48FD9D0B45206F001800E8 /* fsw_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FCFF0B4517A1001800E8 /* fsw_core.c */; }; 9D48FD9E0B452072001800E8 /* fsw_ext2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD060B4517A1001800E8 /* fsw_ext2.c */; }; 9D48FD9F0B452077001800E8 /* lsroot.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD110B4517A1001800E8 /* lsroot.c */; }; 9D48FDA00B45207A001800E8 /* fsw_reiserfs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0F0B4517A1001800E8 /* fsw_reiserfs.c */; }; 9D48FDA10B45207B001800E8 /* fsw_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0C0B4517A1001800E8 /* fsw_posix.c */; }; 9D48FDA20B45207C001800E8 /* fsw_lib.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0A0B4517A1001800E8 /* fsw_lib.c */; }; 9D48FDA30B45207D001800E8 /* fsw_iso9660.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD080B4517A1001800E8 /* fsw_iso9660.c */; }; 9D48FDC20B4521A1001800E8 /* Analyzer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FDBD0B4521A1001800E8 /* Analyzer.m */; }; 9D48FDC30B4521A1001800E8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FDBE0B4521A1001800E8 /* main.m */; }; 9D48FDC40B4521A1001800E8 /* ToolRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FDC10B4521A1001800E8 /* ToolRunner.m */; }; 9D48FDDD0B4521E5001800E8 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 9D48FDDB0B4521E5001800E8 /* MainMenu.nib */; }; 9D48FDE40B4521ED001800E8 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9D48FDE20B4521ED001800E8 /* InfoPlist.strings */; }; 9D48FE060B452311001800E8 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D48FE050B452311001800E8 /* Security.framework */; }; 9D48FE440B45261B001800E8 /* lib.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD190B4517DF001800E8 /* lib.c */; }; 9D48FE450B45261C001800E8 /* showpart.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD1C0B4517DF001800E8 /* showpart.c */; }; 9D48FE460B45261F001800E8 /* os_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD1B0B4517DF001800E8 /* os_unix.c */; }; 9D48FE490B4526DD001800E8 /* showpart in Resources */ = {isa = PBXBuildFile; fileRef = 9D48FE3F0B4525BA001800E8 /* showpart */; }; 9D86CB280B92B85300D8614D /* partinsp.icns in Resources */ = {isa = PBXBuildFile; fileRef = 9D86CB270B92B85300D8614D /* partinsp.icns */; }; 9DDE57B20B45402500B859A7 /* fsw_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FCFF0B4517A1001800E8 /* fsw_core.c */; }; 9DDE57B30B45402500B859A7 /* fsw_ext2.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD060B4517A1001800E8 /* fsw_ext2.c */; }; 9DDE57B50B45402500B859A7 /* fsw_reiserfs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0F0B4517A1001800E8 /* fsw_reiserfs.c */; }; 9DDE57B60B45402500B859A7 /* fsw_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0C0B4517A1001800E8 /* fsw_posix.c */; }; 9DDE57B70B45402500B859A7 /* fsw_lib.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD0A0B4517A1001800E8 /* fsw_lib.c */; }; 9DDE57B80B45402500B859A7 /* fsw_iso9660.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D48FD080B4517A1001800E8 /* fsw_iso9660.c */; }; 9DDE57C50B4540A600B859A7 /* lslr.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DDE57AD0B45401000B859A7 /* lslr.c */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 9D48FE4C0B4526E9001800E8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; remoteGlobalIDString = 9D48FE3E0B4525BA001800E8; remoteInfo = showpart; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; 8D1107320486CEB800E47090 /* Partition Inspector.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Partition Inspector.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9D36F0C00E97540B001687BB /* efiGraphicsOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = efiGraphicsOutput.h; sourceTree = "<group>"; }; 9D466A580B4FC22E0038B56A /* dbounce.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dbounce.c; sourceTree = "<group>"; }; 9D466A590B4FC23A0038B56A /* dbounce.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = dbounce.mak; sourceTree = "<group>"; }; 9D48FCF10B4516F7001800E8 /* build.bat */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 2; path = build.bat; sourceTree = "<group>"; }; 9D48FCF20B4516F7001800E8 /* Make.common */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Make.common; sourceTree = "<group>"; }; 9D48FCF30B4516F7001800E8 /* refit.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = refit.mak; sourceTree = "<group>"; }; 9D48FCF40B451724001800E8 /* dumpprot.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = dumpprot.mak; sourceTree = "<group>"; }; 9D48FCF50B451724001800E8 /* dumpprot.mkefi */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dumpprot.mkefi; sourceTree = "<group>"; }; 9D48FCFA0B451747001800E8 /* dumpprot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dumpprot.c; sourceTree = "<group>"; }; 9D48FCFB0B451747001800E8 /* mkprot.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mkprot.py; sourceTree = "<group>"; }; 9D48FCFC0B451747001800E8 /* protocols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protocols.h; sourceTree = "<group>"; }; 9D48FCFD0B451747001800E8 /* protocols.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = protocols.txt; sourceTree = "<group>"; }; 9D48FCFE0B4517A1001800E8 /* fsw_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_base.h; sourceTree = "<group>"; }; 9D48FCFF0B4517A1001800E8 /* fsw_core.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_core.c; sourceTree = "<group>"; }; 9D48FD000B4517A1001800E8 /* fsw_core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_core.h; sourceTree = "<group>"; }; 9D48FD010B4517A1001800E8 /* fsw_efi_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_efi_base.h; sourceTree = "<group>"; }; 9D48FD020B4517A1001800E8 /* fsw_efi_lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_efi_lib.c; sourceTree = "<group>"; }; 9D48FD030B4517A1001800E8 /* fsw_efi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_efi.c; sourceTree = "<group>"; }; 9D48FD040B4517A1001800E8 /* fsw_efi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_efi.h; sourceTree = "<group>"; }; 9D48FD050B4517A1001800E8 /* fsw_ext2_disk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_ext2_disk.h; sourceTree = "<group>"; }; 9D48FD060B4517A1001800E8 /* fsw_ext2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_ext2.c; sourceTree = "<group>"; }; 9D48FD070B4517A1001800E8 /* fsw_ext2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_ext2.h; sourceTree = "<group>"; }; 9D48FD080B4517A1001800E8 /* fsw_iso9660.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_iso9660.c; sourceTree = "<group>"; }; 9D48FD090B4517A1001800E8 /* fsw_iso9660.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_iso9660.h; sourceTree = "<group>"; }; 9D48FD0A0B4517A1001800E8 /* fsw_lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_lib.c; sourceTree = "<group>"; }; 9D48FD0B0B4517A1001800E8 /* fsw_posix_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_posix_base.h; sourceTree = "<group>"; }; 9D48FD0C0B4517A1001800E8 /* fsw_posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_posix.c; sourceTree = "<group>"; }; 9D48FD0D0B4517A1001800E8 /* fsw_posix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_posix.h; sourceTree = "<group>"; }; 9D48FD0E0B4517A1001800E8 /* fsw_reiserfs_disk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_reiserfs_disk.h; sourceTree = "<group>"; }; 9D48FD0F0B4517A1001800E8 /* fsw_reiserfs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsw_reiserfs.c; sourceTree = "<group>"; }; 9D48FD100B4517A1001800E8 /* fsw_reiserfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_reiserfs.h; sourceTree = "<group>"; }; 9D48FD110B4517A1001800E8 /* lsroot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lsroot.c; sourceTree = "<group>"; }; 9D48FD120B4517B8001800E8 /* design.dox */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = design.dox; sourceTree = "<group>"; }; 9D48FD130B4517B8001800E8 /* Doxyfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Doxyfile; sourceTree = "<group>"; }; 9D48FD140B4517B8001800E8 /* fsw_ext2.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = fsw_ext2.mak; sourceTree = "<group>"; }; 9D48FD150B4517B8001800E8 /* fsw_iso9660.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = fsw_iso9660.mak; sourceTree = "<group>"; }; 9D48FD160B4517B8001800E8 /* fsw_reiserfs.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = fsw_reiserfs.mak; sourceTree = "<group>"; }; 9D48FD170B4517DF001800E8 /* gptsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gptsync.c; sourceTree = "<group>"; }; 9D48FD180B4517DF001800E8 /* gptsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gptsync.h; sourceTree = "<group>"; }; 9D48FD190B4517DF001800E8 /* lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lib.c; sourceTree = "<group>"; }; 9D48FD1A0B4517DF001800E8 /* os_efi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = os_efi.c; sourceTree = "<group>"; }; 9D48FD1B0B4517DF001800E8 /* os_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = os_unix.c; sourceTree = "<group>"; }; 9D48FD1C0B4517DF001800E8 /* showpart.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = showpart.c; sourceTree = "<group>"; }; 9D48FD1D0B4517F2001800E8 /* gptsync.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = gptsync.mak; sourceTree = "<group>"; }; 9D48FD1E0B4517F2001800E8 /* Makefile.gnuefi */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.gnuefi; sourceTree = "<group>"; }; 9D48FD1F0B4517F2001800E8 /* Makefile.unix */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.unix; sourceTree = "<group>"; }; 9D48FD230B4517FD001800E8 /* gptsync.8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gptsync.8; sourceTree = "<group>"; }; 9D48FD240B451828001800E8 /* efiConsoleControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = efiConsoleControl.h; sourceTree = "<group>"; }; 9D48FD250B451828001800E8 /* egemb_back_selected_small.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = egemb_back_selected_small.h; sourceTree = "<group>"; }; 9D48FD260B451828001800E8 /* egemb_refit_banner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = egemb_refit_banner.h; sourceTree = "<group>"; }; 9D48FD270B451828001800E8 /* syslinux_mbr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syslinux_mbr.h; sourceTree = "<group>"; }; 9D48FD280B45183F001800E8 /* efiConsoleControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = efiConsoleControl.h; sourceTree = "<group>"; }; 9D48FD290B45183F001800E8 /* efiUgaDraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = efiUgaDraw.h; sourceTree = "<group>"; }; 9D48FD2A0B45183F001800E8 /* egemb_font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = egemb_font.h; sourceTree = "<group>"; }; 9D48FD2B0B45183F001800E8 /* image.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = image.c; sourceTree = "<group>"; }; 9D48FD2C0B45183F001800E8 /* libeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libeg.h; sourceTree = "<group>"; }; 9D48FD2D0B45183F001800E8 /* libegint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libegint.h; sourceTree = "<group>"; }; 9D48FD2E0B45183F001800E8 /* load_bmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = load_bmp.c; sourceTree = "<group>"; }; 9D48FD2F0B45183F001800E8 /* load_icns.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = load_icns.c; sourceTree = "<group>"; }; 9D48FD300B45183F001800E8 /* mkegemb.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mkegemb.py; sourceTree = "<group>"; }; 9D48FD310B45183F001800E8 /* screen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = screen.c; sourceTree = "<group>"; }; 9D48FD320B45183F001800E8 /* text.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = text.c; sourceTree = "<group>"; }; 9D48FD390B451864001800E8 /* libeg.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = libeg.mak; sourceTree = "<group>"; }; 9D48FD3A0B451864001800E8 /* libeg.mkefi */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libeg.mkefi; sourceTree = "<group>"; }; 9D48FD3B0B451864001800E8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; 9D48FD3C0B451880001800E8 /* config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.c; sourceTree = "<group>"; }; 9D48FD3D0B451880001800E8 /* icns.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = icns.c; sourceTree = "<group>"; }; 9D48FD3E0B451880001800E8 /* lib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lib.c; sourceTree = "<group>"; }; 9D48FD3F0B451880001800E8 /* lib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lib.h; sourceTree = "<group>"; }; 9D48FD400B451880001800E8 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; }; 9D48FD410B451880001800E8 /* menu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = menu.c; sourceTree = "<group>"; }; 9D48FD420B451880001800E8 /* screen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = screen.c; sourceTree = "<group>"; }; 9D48FD490B451892001800E8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; }; 9D48FD4A0B451892001800E8 /* refit.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = refit.mak; sourceTree = "<group>"; }; 9D48FD4B0B451892001800E8 /* refit.mkefi */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = refit.mkefi; sourceTree = "<group>"; }; 9D48FD4D0B4518D3001800E8 /* dumpfv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dumpfv.c; sourceTree = "<group>"; }; 9D48FD530B4519B6001800E8 /* dumpfv.mak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; lineEnding = 2; path = dumpfv.mak; sourceTree = "<group>"; }; 9D48FD5B0B451ABF001800E8 /* refit-check */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "refit-check"; sourceTree = BUILT_PRODUCTS_DIR; }; 9D48FD7B0B451BAA001800E8 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = index.html; path = fsw/doc/html/index.html; sourceTree = "<group>"; }; 9D48FD980B452015001800E8 /* lsroot */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lsroot; sourceTree = BUILT_PRODUCTS_DIR; }; 9D48FDBC0B4521A1001800E8 /* Analyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Analyzer.h; sourceTree = "<group>"; }; 9D48FDBD0B4521A1001800E8 /* Analyzer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Analyzer.m; sourceTree = "<group>"; }; 9D48FDBE0B4521A1001800E8 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; 9D48FDBF0B4521A1001800E8 /* partinsp_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partinsp_Prefix.pch; sourceTree = "<group>"; }; 9D48FDC00B4521A1001800E8 /* ToolRunner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToolRunner.h; sourceTree = "<group>"; }; 9D48FDC10B4521A1001800E8 /* ToolRunner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ToolRunner.m; sourceTree = "<group>"; }; 9D48FDD70B4521D3001800E8 /* Info.plist */ = {isa = PBXFileReference; explicitFileType = text.plist; fileEncoding = 4; path = Info.plist; sourceTree = "<group>"; }; 9D48FDDC0B4521E5001800E8 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = "<group>"; }; 9D48FDE30B4521ED001800E8 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 9D48FE050B452311001800E8 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; }; 9D48FE3F0B4525BA001800E8 /* showpart */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = showpart; sourceTree = BUILT_PRODUCTS_DIR; }; 9D86CB270B92B85300D8614D /* partinsp.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = partinsp.icns; sourceTree = "<group>"; }; 9DDE57AD0B45401000B859A7 /* lslr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lslr.c; sourceTree = "<group>"; }; 9DDE57BD0B45402500B859A7 /* lslr */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lslr; sourceTree = BUILT_PRODUCTS_DIR; }; 9DE637DD0B47DC77006BE837 /* mk_fsw_strfunc.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mk_fsw_strfunc.py; sourceTree = "<group>"; }; 9DE638040B47F22B006BE837 /* fsw_strfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsw_strfunc.h; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 9D48FE060B452311001800E8 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FD590B451ABF001800E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FD960B452015001800E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FE3D0B4525BA001800E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 9DDE57B90B45402500B859A7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 9D48FE050B452311001800E8 /* Security.framework */, ); name = "Linked Frameworks"; sourceTree = "<group>"; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = "<group>"; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* Partition Inspector.app */, 9D48FD5B0B451ABF001800E8 /* refit-check */, 9D48FD980B452015001800E8 /* lsroot */, 9D48FE3F0B4525BA001800E8 /* showpart */, 9DDE57BD0B45402500B859A7 /* lslr */, ); name = Products; sourceTree = "<group>"; }; 29B97314FDCFA39411CA2CEA /* refit1 */ = { isa = PBXGroup; children = ( 9D48FCC50B4514C5001800E8 /* Source */, 9D48FCC60B4514D4001800E8 /* Makefiles */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 9D48FD750B451B7E001800E8 /* Documentation */, 19C28FACFE9D520D11CA2CBB /* Products */, ); comments = "Project-wide settings are for regular Mac OS X development. Those should need minimal additional settings.\n\nEFI targets need some additional settings, see refit-check for reference. EFI targets don't produce working binaries, but can be used to check for compile-time and link-time problems. The project-wide SDK_INSTALL_DIR variable must point to the EFI application toolkit installation directory.\n\nAll targets build for i386 only until further notice."; name = refit1; sourceTree = "<group>"; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 9D48FD550B4519F0001800E8 /* partinsp */, ); name = Resources; sourceTree = "<group>"; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = "<group>"; }; 9D466A4E0B4FC1F20038B56A /* dbounce */ = { isa = PBXGroup; children = ( 9D466A580B4FC22E0038B56A /* dbounce.c */, ); path = dbounce; sourceTree = "<group>"; }; 9D466A4F0B4FC1FA0038B56A /* dbounce */ = { isa = PBXGroup; children = ( 9D466A590B4FC23A0038B56A /* dbounce.mak */, ); path = dbounce; sourceTree = "<group>"; }; 9D48FCC50B4514C5001800E8 /* Source */ = { isa = PBXGroup; children = ( 9D48FCC70B451508001800E8 /* refit */, 9D48FCC80B451512001800E8 /* libeg */, 9D48FCCA0B45151F001800E8 /* gptsync */, 9D48FCCD0B45153B001800E8 /* partinsp */, 9D48FCCB0B451529001800E8 /* dumpprot */, 9D48FD4C0B4518C0001800E8 /* dumpfv */, 9D466A4E0B4FC1F20038B56A /* dbounce */, 9D48FCC90B451516001800E8 /* fsw */, 9D48FCCC0B451533001800E8 /* include */, ); name = Source; sourceTree = "<group>"; }; 9D48FCC60B4514D4001800E8 /* Makefiles */ = { isa = PBXGroup; children = ( 9D48FCF30B4516F7001800E8 /* refit.mak */, 9D48FCF10B4516F7001800E8 /* build.bat */, 9D48FCE40B45162D001800E8 /* refit */, 9D48FCE30B451627001800E8 /* libeg */, 9D48FCE20B451621001800E8 /* gptsync */, 9D48FCE10B45161A001800E8 /* dumpprot */, 9D48FD500B451979001800E8 /* dumpfv */, 9D466A4F0B4FC1FA0038B56A /* dbounce */, 9D48FCE00B451614001800E8 /* fsw */, 9D48FCF20B4516F7001800E8 /* Make.common */, ); name = Makefiles; sourceTree = "<group>"; }; 9D48FCC70B451508001800E8 /* refit */ = { isa = PBXGroup; children = ( 9D48FD3F0B451880001800E8 /* lib.h */, 9D48FD400B451880001800E8 /* main.c */, 9D48FD3C0B451880001800E8 /* config.c */, 9D48FD410B451880001800E8 /* menu.c */, 9D48FD420B451880001800E8 /* screen.c */, 9D48FD3D0B451880001800E8 /* icns.c */, 9D48FD3E0B451880001800E8 /* lib.c */, ); path = refit; sourceTree = "<group>"; }; 9D48FCC80B451512001800E8 /* libeg */ = { isa = PBXGroup; children = ( 9D48FD2C0B45183F001800E8 /* libeg.h */, 9D48FD2D0B45183F001800E8 /* libegint.h */, 9D48FD2B0B45183F001800E8 /* image.c */, 9D48FD2E0B45183F001800E8 /* load_bmp.c */, 9D48FD2F0B45183F001800E8 /* load_icns.c */, 9D48FD310B45183F001800E8 /* screen.c */, 9D48FD320B45183F001800E8 /* text.c */, 9D48FD300B45183F001800E8 /* mkegemb.py */, 9D48FD280B45183F001800E8 /* efiConsoleControl.h */, 9D48FD290B45183F001800E8 /* efiUgaDraw.h */, 9D36F0C00E97540B001687BB /* efiGraphicsOutput.h */, 9D48FD2A0B45183F001800E8 /* egemb_font.h */, ); path = libeg; sourceTree = "<group>"; }; 9D48FCC90B451516001800E8 /* fsw */ = { isa = PBXGroup; children = ( 9D48FCFE0B4517A1001800E8 /* fsw_base.h */, 9D48FD000B4517A1001800E8 /* fsw_core.h */, 9D48FCFF0B4517A1001800E8 /* fsw_core.c */, 9D48FD0A0B4517A1001800E8 /* fsw_lib.c */, 9DE638040B47F22B006BE837 /* fsw_strfunc.h */, 9DE637DD0B47DC77006BE837 /* mk_fsw_strfunc.py */, 9D48FD010B4517A1001800E8 /* fsw_efi_base.h */, 9D48FD040B4517A1001800E8 /* fsw_efi.h */, 9D48FD030B4517A1001800E8 /* fsw_efi.c */, 9D48FD020B4517A1001800E8 /* fsw_efi_lib.c */, 9D48FD0B0B4517A1001800E8 /* fsw_posix_base.h */, 9D48FD0D0B4517A1001800E8 /* fsw_posix.h */, 9D48FD0C0B4517A1001800E8 /* fsw_posix.c */, 9D48FD050B4517A1001800E8 /* fsw_ext2_disk.h */, 9D48FD070B4517A1001800E8 /* fsw_ext2.h */, 9D48FD060B4517A1001800E8 /* fsw_ext2.c */, 9D48FD0E0B4517A1001800E8 /* fsw_reiserfs_disk.h */, 9D48FD100B4517A1001800E8 /* fsw_reiserfs.h */, 9D48FD0F0B4517A1001800E8 /* fsw_reiserfs.c */, 9D48FD080B4517A1001800E8 /* fsw_iso9660.c */, 9D48FD090B4517A1001800E8 /* fsw_iso9660.h */, 9D48FD110B4517A1001800E8 /* lsroot.c */, 9DDE57AD0B45401000B859A7 /* lslr.c */, ); path = fsw; sourceTree = "<group>"; }; 9D48FCCA0B45151F001800E8 /* gptsync */ = { isa = PBXGroup; children = ( 9D48FD180B4517DF001800E8 /* gptsync.h */, 9D48FD170B4517DF001800E8 /* gptsync.c */, 9D48FD1C0B4517DF001800E8 /* showpart.c */, 9D48FD190B4517DF001800E8 /* lib.c */, 9D48FD1A0B4517DF001800E8 /* os_efi.c */, 9D48FD1B0B4517DF001800E8 /* os_unix.c */, ); path = gptsync; sourceTree = "<group>"; }; 9D48FCCB0B451529001800E8 /* dumpprot */ = { isa = PBXGroup; children = ( 9D48FCFA0B451747001800E8 /* dumpprot.c */, 9D48FCFB0B451747001800E8 /* mkprot.py */, 9D48FCFD0B451747001800E8 /* protocols.txt */, 9D48FCFC0B451747001800E8 /* protocols.h */, ); path = dumpprot; sourceTree = "<group>"; }; 9D48FCCC0B451533001800E8 /* include */ = { isa = PBXGroup; children = ( 9D48FD270B451828001800E8 /* syslinux_mbr.h */, 9D48FD240B451828001800E8 /* efiConsoleControl.h */, 9D48FD250B451828001800E8 /* egemb_back_selected_small.h */, 9D48FD260B451828001800E8 /* egemb_refit_banner.h */, ); path = include; sourceTree = "<group>"; }; 9D48FCCD0B45153B001800E8 /* partinsp */ = { isa = PBXGroup; children = ( 9D48FDBC0B4521A1001800E8 /* Analyzer.h */, 9D48FDBD0B4521A1001800E8 /* Analyzer.m */, 9D48FDC00B4521A1001800E8 /* ToolRunner.h */, 9D48FDC10B4521A1001800E8 /* ToolRunner.m */, 9D48FDBE0B4521A1001800E8 /* main.m */, 9D48FDBF0B4521A1001800E8 /* partinsp_Prefix.pch */, ); path = partinsp; sourceTree = "<group>"; }; 9D48FCE00B451614001800E8 /* fsw */ = { isa = PBXGroup; children = ( 9D48FD130B4517B8001800E8 /* Doxyfile */, 9D48FD120B4517B8001800E8 /* design.dox */, 9D48FD140B4517B8001800E8 /* fsw_ext2.mak */, 9D48FD160B4517B8001800E8 /* fsw_reiserfs.mak */, 9D48FD150B4517B8001800E8 /* fsw_iso9660.mak */, ); path = fsw; sourceTree = "<group>"; }; 9D48FCE10B45161A001800E8 /* dumpprot */ = { isa = PBXGroup; children = ( 9D48FCF40B451724001800E8 /* dumpprot.mak */, 9D48FCF50B451724001800E8 /* dumpprot.mkefi */, ); path = dumpprot; sourceTree = "<group>"; }; 9D48FCE20B451621001800E8 /* gptsync */ = { isa = PBXGroup; children = ( 9D48FD1D0B4517F2001800E8 /* gptsync.mak */, 9D48FD1F0B4517F2001800E8 /* Makefile.unix */, 9D48FD1E0B4517F2001800E8 /* Makefile.gnuefi */, 9D48FD230B4517FD001800E8 /* gptsync.8 */, ); path = gptsync; sourceTree = "<group>"; }; 9D48FCE30B451627001800E8 /* libeg */ = { isa = PBXGroup; children = ( 9D48FD390B451864001800E8 /* libeg.mak */, 9D48FD3A0B451864001800E8 /* libeg.mkefi */, 9D48FD3B0B451864001800E8 /* Makefile */, ); path = libeg; sourceTree = "<group>"; }; 9D48FCE40B45162D001800E8 /* refit */ = { isa = PBXGroup; children = ( 9D48FD4A0B451892001800E8 /* refit.mak */, 9D48FD4B0B451892001800E8 /* refit.mkefi */, 9D48FD490B451892001800E8 /* Makefile */, ); path = refit; sourceTree = "<group>"; }; 9D48FD4C0B4518C0001800E8 /* dumpfv */ = { isa = PBXGroup; children = ( 9D48FD4D0B4518D3001800E8 /* dumpfv.c */, ); path = dumpfv; sourceTree = "<group>"; }; 9D48FD500B451979001800E8 /* dumpfv */ = { isa = PBXGroup; children = ( 9D48FD530B4519B6001800E8 /* dumpfv.mak */, ); path = dumpfv; sourceTree = "<group>"; }; 9D48FD550B4519F0001800E8 /* partinsp */ = { isa = PBXGroup; children = ( 9D48FDD70B4521D3001800E8 /* Info.plist */, 9D48FDE20B4521ED001800E8 /* InfoPlist.strings */, 9D48FDDB0B4521E5001800E8 /* MainMenu.nib */, 9D86CB270B92B85300D8614D /* partinsp.icns */, ); path = partinsp; sourceTree = "<group>"; }; 9D48FD750B451B7E001800E8 /* Documentation */ = { isa = PBXGroup; children = ( 9D48FD7B0B451BAA001800E8 /* index.html */, ); name = Documentation; sourceTree = "<group>"; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* partinsp */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "partinsp" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, 9DCA53460B917E310029FF6E /* ShellScript */, ); buildRules = ( ); dependencies = ( 9D48FE4D0B4526E9001800E8 /* PBXTargetDependency */, ); name = partinsp; productInstallPath = "$(HOME)/Applications"; productName = refit1; productReference = 8D1107320486CEB800E47090 /* Partition Inspector.app */; productType = "com.apple.product-type.application"; }; 9D48FD5A0B451ABF001800E8 /* refit-check */ = { isa = PBXNativeTarget; buildConfigurationList = 9D48FD650B451AE3001800E8 /* Build configuration list for PBXNativeTarget "refit-check" */; buildPhases = ( 9D48FD580B451ABF001800E8 /* Sources */, 9D48FD590B451ABF001800E8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = "refit-check"; productName = "refit-check"; productReference = 9D48FD5B0B451ABF001800E8 /* refit-check */; productType = "com.apple.product-type.tool"; }; 9D48FD970B452015001800E8 /* lsroot */ = { isa = PBXNativeTarget; buildConfigurationList = 9D48FD9A0B452034001800E8 /* Build configuration list for PBXNativeTarget "lsroot" */; buildPhases = ( 9D48FD950B452015001800E8 /* Sources */, 9D48FD960B452015001800E8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = lsroot; productName = lsroot; productReference = 9D48FD980B452015001800E8 /* lsroot */; productType = "com.apple.product-type.tool"; }; 9D48FE3E0B4525BA001800E8 /* showpart */ = { isa = PBXNativeTarget; buildConfigurationList = 9D48FE410B4525EB001800E8 /* Build configuration list for PBXNativeTarget "showpart" */; buildPhases = ( 9D48FE3C0B4525BA001800E8 /* Sources */, 9D48FE3D0B4525BA001800E8 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = showpart; productName = showpart; productReference = 9D48FE3F0B4525BA001800E8 /* showpart */; productType = "com.apple.product-type.tool"; }; 9DDE57B00B45402500B859A7 /* lslr */ = { isa = PBXNativeTarget; buildConfigurationList = 9DDE57BA0B45402500B859A7 /* Build configuration list for PBXNativeTarget "lslr" */; buildPhases = ( 9DDE57B10B45402500B859A7 /* Sources */, 9DDE57B90B45402500B859A7 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = lslr; productName = lsroot; productReference = 9DDE57BD0B45402500B859A7 /* lslr */; productType = "com.apple.product-type.tool"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "refit" */; compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 29B97314FDCFA39411CA2CEA /* refit1 */; projectDirPath = ""; projectRoot = ""; targets = ( 9D48FD5A0B451ABF001800E8 /* refit-check */, 9D48FD970B452015001800E8 /* lsroot */, 9DDE57B00B45402500B859A7 /* lslr */, 9D48FE3E0B4525BA001800E8 /* showpart */, 8D1107260486CEB800E47090 /* partinsp */, 9D48FDA90B45210F001800E8 /* Doxygen */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 9D48FDDD0B4521E5001800E8 /* MainMenu.nib in Resources */, 9D48FDE40B4521ED001800E8 /* InfoPlist.strings in Resources */, 9D48FE490B4526DD001800E8 /* showpart in Resources */, 9D86CB280B92B85300D8614D /* partinsp.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 9D48FDA80B45210F001800E8 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "cd ${SRCROOT}/fsw\n/Applications/Doxygen.app/Contents/Resources/doxygen\nexit 0"; }; 9DCA53460B917E310029FF6E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = "/usr/bin/perl -w"; shellScript = "# Xcode auto-versioning script for Subversion\n# by Axel Andersson, modified by Daniel Jalkut to use\n# svnversion instead of svn info, so that the current version\n# the highest local revision number is always used.\n\nuse strict;\n\ndie \"$0: Must be run from Xcode\" unless $ENV{\"BUILT_PRODUCTS_DIR\"};\n\n# Get the current subversion revision number and use it to set the CFBundleVersion value\nmy $REV = `/usr/bin/svnversion -n ./`;\nmy $INFO = \"$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info.plist\";\n\nmy $version = $REV;\n$version =~ s/([\\d]*:)(\\d+[M|S]*).*/$2/;\ndie \"$0: No Subversion revision found\" unless $version;\n\nopen(FH, \"$INFO\") or die \"$0: $INFO: $!\";\nmy $info = join(\"\", <FH>);\nclose(FH);\n\n$info =~ s/([\\t ]+<key>CFBundleVersion<\\/key>\\n[\\t ]+<string>).*?(<\\/string>)/$1$version$2/;\n\nopen(FH, \">$INFO\") or die \"$0: $INFO: $!\";\nprint FH $info;\nclose(FH);\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9D48FDC20B4521A1001800E8 /* Analyzer.m in Sources */, 9D48FDC30B4521A1001800E8 /* main.m in Sources */, 9D48FDC40B4521A1001800E8 /* ToolRunner.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FD580B451ABF001800E8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9D48FD680B451AF1001800E8 /* config.c in Sources */, 9D48FD690B451AF1001800E8 /* icns.c in Sources */, 9D48FD6A0B451AF2001800E8 /* lib.c in Sources */, 9D48FD6B0B451AF3001800E8 /* main.c in Sources */, 9D48FD6C0B451AF4001800E8 /* menu.c in Sources */, 9D48FD6D0B451AF5001800E8 /* screen.c in Sources */, 9D48FD6E0B451B04001800E8 /* image.c in Sources */, 9D48FD6F0B451B05001800E8 /* load_bmp.c in Sources */, 9D48FD700B451B05001800E8 /* load_icns.c in Sources */, 9D48FD710B451B07001800E8 /* screen.c in Sources */, 9D48FD720B451B08001800E8 /* text.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FD950B452015001800E8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9D48FD9D0B45206F001800E8 /* fsw_core.c in Sources */, 9D48FD9E0B452072001800E8 /* fsw_ext2.c in Sources */, 9D48FD9F0B452077001800E8 /* lsroot.c in Sources */, 9D48FDA00B45207A001800E8 /* fsw_reiserfs.c in Sources */, 9D48FDA10B45207B001800E8 /* fsw_posix.c in Sources */, 9D48FDA20B45207C001800E8 /* fsw_lib.c in Sources */, 9D48FDA30B45207D001800E8 /* fsw_iso9660.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 9D48FE3C0B4525BA001800E8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9D48FE440B45261B001800E8 /* lib.c in Sources */, 9D48FE450B45261C001800E8 /* showpart.c in Sources */, 9D48FE460B45261F001800E8 /* os_unix.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 9DDE57B10B45402500B859A7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 9DDE57B20B45402500B859A7 /* fsw_core.c in Sources */, 9DDE57B30B45402500B859A7 /* fsw_ext2.c in Sources */, 9DDE57B50B45402500B859A7 /* fsw_reiserfs.c in Sources */, 9DDE57B60B45402500B859A7 /* fsw_posix.c in Sources */, 9DDE57B70B45402500B859A7 /* fsw_lib.c in Sources */, 9DDE57B80B45402500B859A7 /* fsw_iso9660.c in Sources */, 9DDE57C50B4540A600B859A7 /* lslr.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 9D48FE4D0B4526E9001800E8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 9D48FE3E0B4525BA001800E8 /* showpart */; targetProxy = 9D48FE4C0B4526E9001800E8 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 9D48FDDB0B4521E5001800E8 /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( 9D48FDDC0B4521E5001800E8 /* English */, ); name = MainMenu.nib; sourceTree = "<group>"; }; 9D48FDE20B4521ED001800E8 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 9D48FDE30B4521ED001800E8 /* English */, ); name = InfoPlist.strings; sourceTree = "<group>"; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 9D48FD660B451AE3001800E8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { EXECUTABLE_EXTENSION = .checkbin; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; HEADER_SEARCH_PATHS = ( "$(SDK_INSTALL_DIR)/include/efi110", "$(SDK_INSTALL_DIR)/include/efi110/ia32", "$(SDK_INSTALL_DIR)/include/efi110/protocol", ); LIBRARY_SEARCH_PATHS = "$(SDK_INSTALL_DIR)/lib/libefi"; LINK_WITH_STANDARD_LIBRARIES = NO; OTHER_CFLAGS = ( "-fPIC", "-fshort-wchar", ); OTHER_LDFLAGS = ( "-lefi", "-lgcc", ); PRODUCT_NAME = "refit-check"; USER_HEADER_SEARCH_PATHS = ../include; ZERO_LINK = NO; }; name = Debug; }; 9D48FD670B451AE3001800E8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { EXECUTABLE_EXTENSION = .checkbin; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; HEADER_SEARCH_PATHS = ( "$(SDK_INSTALL_DIR)/include/efi110", "$(SDK_INSTALL_DIR)/include/efi110/ia32", "$(SDK_INSTALL_DIR)/include/efi110/protocol", ); LIBRARY_SEARCH_PATHS = "$(SDK_INSTALL_DIR)/lib/libefi"; LINK_WITH_STANDARD_LIBRARIES = NO; OTHER_CFLAGS = ( "-fPIC", "-fshort-wchar", ); OTHER_LDFLAGS = ( "-lefi", "-lgcc", ); PRODUCT_NAME = "refit-check"; USER_HEADER_SEARCH_PATHS = "include libeg"; ZERO_LINK = NO; }; name = Release; }; 9D48FD9B0B452034001800E8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = HOST_POSIX; PRODUCT_NAME = lsroot; }; name = Debug; }; 9D48FD9C0B452034001800E8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = HOST_POSIX; PRODUCT_NAME = lsroot; }; name = Release; }; 9D48FDB10B45212D001800E8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; PRODUCT_NAME = Doxygen; }; name = Debug; }; 9D48FDB20B45212D001800E8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; PRODUCT_NAME = Doxygen; ZERO_LINK = NO; }; name = Release; }; 9D48FE420B4525EB001800E8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "PROGNAME=showpart", NOREADONLYWARN, ); OTHER_CFLAGS = ""; PRODUCT_NAME = showpart; ZERO_LINK = NO; }; name = Debug; }; 9D48FE430B4525EB001800E8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "PROGNAME=showpart", NOREADONLYWARN, ); OTHER_CFLAGS = ""; PRODUCT_NAME = showpart; ZERO_LINK = NO; }; name = Release; }; 9DDE57BB0B45402500B859A7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = HOST_POSIX; PRODUCT_NAME = lslr; }; name = Debug; }; 9DDE57BC0B45402500B859A7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PREPROCESSOR_DEFINITIONS = HOST_POSIX; PRODUCT_NAME = lslr; }; name = Release; }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = partinsp/partinsp_Prefix.pch; INFOPLIST_FILE = partinsp/Info.plist; PRODUCT_NAME = "Partition Inspector"; WRAPPER_EXTENSION = app; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = partinsp/partinsp_Prefix.pch; INFOPLIST_FILE = partinsp/Info.plist; PRODUCT_NAME = "Partition Inspector"; WRAPPER_EXTENSION = app; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = i386; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = 4.0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SDK_INSTALL_DIR = /Users/chrisp/efi/efi_toolkit; ZERO_LINK = YES; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = i386; COPY_PHASE_STRIP = YES; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = s; GCC_VERSION = 4.0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; SDK_INSTALL_DIR = /Users/chrisp/efi/efi_toolkit; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 9D48FD650B451AE3001800E8 /* Build configuration list for PBXNativeTarget "refit-check" */ = { isa = XCConfigurationList; buildConfigurations = ( 9D48FD660B451AE3001800E8 /* Debug */, 9D48FD670B451AE3001800E8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 9D48FD9A0B452034001800E8 /* Build configuration list for PBXNativeTarget "lsroot" */ = { isa = XCConfigurationList; buildConfigurations = ( 9D48FD9B0B452034001800E8 /* Debug */, 9D48FD9C0B452034001800E8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 9D48FDB00B45212D001800E8 /* Build configuration list for PBXAggregateTarget "Doxygen" */ = { isa = XCConfigurationList; buildConfigurations = ( 9D48FDB10B45212D001800E8 /* Debug */, 9D48FDB20B45212D001800E8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 9D48FE410B4525EB001800E8 /* Build configuration list for PBXNativeTarget "showpart" */ = { isa = XCConfigurationList; buildConfigurations = ( 9D48FE420B4525EB001800E8 /* Debug */, 9D48FE430B4525EB001800E8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 9DDE57BA0B45402500B859A7 /* Build configuration list for PBXNativeTarget "lslr" */ = { isa = XCConfigurationList; buildConfigurations = ( 9DDE57BB0B45402500B859A7 /* Debug */, 9DDE57BC0B45402500B859A7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "partinsp" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "refit" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } ������refit-0.14/TextMode/��������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�11344764611�013645� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/TextMode/TextMode.c����������������������������������������������������������������������0000644�0001750�0001750�00000004736�10424641257�015552� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TextMode/TextMode.c * Command to switch the console to text mode * * Copyright (c) 2006 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "efi.h" #include "efiConsoleControl.h" EFI_GUID gEfiConsoleControlProtocolGuid = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; EFI_STATUS EFIAPI TextModeMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl; int changed = 0; if (SystemTable->BootServices->LocateProtocol(&gEfiConsoleControlProtocolGuid, NULL, &ConsoleControl) == EFI_SUCCESS) { EFI_CONSOLE_CONTROL_SCREEN_MODE currentMode; ConsoleControl->GetMode(ConsoleControl, ¤tMode, NULL, NULL); if (currentMode == EfiConsoleControlScreenGraphics) { ConsoleControl->SetMode(ConsoleControl, EfiConsoleControlScreenText); changed = 1; } } if (changed) { SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Welcome to text mode!\r\n\r\n"); } return EFI_SUCCESS; } ����������������������������������refit-0.14/TextMode/TextMode.mak��������������������������������������������������������������������0000644�0001750�0001750�00000002360�10633422241�016057� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # TextMode/TextMode.mak # Build control file for the TextMode command # # # Include sdk.env environment # !include $(SDK_INSTALL_DIR)\build\$(SDK_BUILD_ENV)\sdk.env # # Set the base output name and entry point # BASE_NAME = TextMode IMAGE_ENTRY_POINT = TextModeMain # # Globals needed by master.mak # TARGET_APP = $(BASE_NAME) SOURCE_DIR = $(SDK_INSTALL_DIR)\refit\$(BASE_NAME) BUILD_DIR = $(SDK_BUILD_DIR)\refit\$(BASE_NAME) # # Include paths # !include $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\makefile.hdr INC = -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR) \ -I $(SDK_INSTALL_DIR)\include\$(EFI_INC_DIR)\$(PROCESSOR) \ -I $(SDK_INSTALL_DIR)\refit\include $(INC) # # Libraries # LIBS = $(LIBS) $(SDK_BUILD_DIR)\lib\libefi\libefi.lib # # Default target # all : dirs $(LIBS) $(OBJECTS) @echo Copying $(BASE_NAME).efi to current directory @copy $(SDK_BIN_DIR)\$(BASE_NAME).efi $(BASE_NAME)_$(SDK_BUILD_ENV).efi # # Program object files # OBJECTS = $(OBJECTS) \ $(BUILD_DIR)\$(BASE_NAME).obj \ # # Source file dependencies # $(BUILD_DIR)\$(BASE_NAME).obj : $(*B).c $(INC_DEPS) # # Handoff to master.mak # !include $(SDK_INSTALL_DIR)\build\master.mak ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/����������������������������������������������������������������������������������0000775�0001750�0001750�00000000000�11363100500�013341� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/back-normal-small.png�������������������������������������������������������������0000664�0001750�0001750�00000005470�10411707416�017365� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���@���@���% ц‰��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF���UIDATxкьЯA �� ЕЇЋf nа€NRŸM=' po��џџ�BНЛп№š����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/back-selected-small.png�����������������������������������������������������������0000664�0001750�0001750�00000007125�10411707416�017664� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���@���@���% ц‰��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��rIDATxкьšЭnЋ0…Чџ˜дMЊnњў/вчщЂU)c№]L™8єЎWзg)ч›Б${‡{YkыК–Rj­a !ФЛЎѓоЏІфн)___ЩwJ)Ц8/J)=Ь1cŒ/ТRj­ыК!|~~Цџрœ;Œ1�†Ёя{фŽ1ІLqO’R"@UUЦ­ѕлл[г4mлоœN'ч�Œуј§§эНїо#Р4M)ЅyžБ'��Ю9cL�жZkэсpPJN'!Фљ|ўЈынУаЖэѕzэКЎяћap mи\BЦђуœ3Ц8чB]зIЦищtТкЗmл4 ŒуH{рaх_5а§8Žг4сИRъx<zяЅЕV�зыЫŸLг”wр‘�д!„R K‰ю…///RJk­Дж@пїИюЛEDќјђЏš „Шн+ЅŒ1жкЊЊЌЕ?‡}пїШ€У0 �•Ÿж‡YЇ>pЮЩ=H}пWUЅЕ–œѓ”RШ4."юЧ—еМ–Rц>SJBЮ9ЧГ“6йЛ+сOЃ“išШYeŒq�Р9њЛЭЗь†юs†мёќœHљ4=5ар„ШЩœ‰y>‘УЮ”ЃZп:№ћІjeяж|­юо•ѕПZх№Ћ�€P� @(� �€P� @(� �€P� @(�џ-�НкЇ‰ќzs­ŒхV9мПп›ѕп+З–PНп'CnŒђ\ЗP*!'й 9с™nƒ� „ј ,4Н9йXU=�ŸчsiJ)ЙˆxЖeШ йГ•е”’D�)„ ЕІЗћ{ˆл(ЅДжјIbŒХeAJY-Т хsvxТSu/�!Hя}]з˜~Ђ”,щЂЭ#gRJUUU/ТИ�xяЅї>Ц(Ѕ<TotBР‘mCBLiеu§єєфœ;�cєоЫ”Rг4иХ№%­9ZN›Ч.)7ъœsЮaLЎiš”’€ЎыаН1†ršДv|Х`№�кЖэК(Й{>Ÿчy~~~Ц\ЌЕv=о €ЮMk­1=\.—Ых‚7пВг—ЫЅы:\KЦcЬ~ТпtА†ОООЦqЄ;явы1Цмци8ьзцТЕ€БжедŸ�Y mњеXг����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/windows-bootlogo.png��������������������������������������������������������������0000664�0001750�0001750�00000003270�10430651503�017375� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€����цU>��IDATxкэ›лoкvЧПО$цbs7„„ЅщвfjЋVе4­ЊДэaїЄ]њ4-ЛHSЛЌэ–Іm `sЕ1wГ‡$рsˆY^№ВљљУ9ПяЙйпуvk€5Р` АXмђ!3ЎЕы–гЕ†� ДH"є?И ЃR\}юZHoЅnlAPИFСlЯ>мйпX1РАњ1п_p^к9Ќа§“іт+яѓћŸJ+xѓї§ПOgV%CƒДHћ—пкЋh5ˆЫф_И+0ШыHТ-dV0 Є ?№YЕ>йq�ŸЅ‡[ОZрŒМLR№ЎуўбёР$/Ѓ–�|ќс_o= ЫЏj4-њ`З їъјбтйЬŸк8љVё(’я(]УаўіМе)Њюјe_<Ц��чЯП2Y§Z‚шUMѓ2ВЮ.�”YшUЧѓУщЉ‹GC‘‹ЯVЛйЈ[юф7М�ЪdUЫ1�цдцы›&�D�4fяZ/€]в|‡ЭЮ&б€З ‡є0˜0,pдŸ$Фf“Е]@†�@ƒZ€х0�Jœ�`ђ~ !zє+,€nАEШ&ЙФйŒ�0XQŠ�@7iJb9 @\ё`ˆp” yе‹€еb-Wыј @aTa�‚�S„E@R№шеX� K(ЩшЊR4�Ѕ!Ї L�"й"м№py ЫкƒBUlwX�ѕюВ"œчй“ЅАJ�0V(Bаšu'UPТR4Л­ц,€–Нќ˜ PЉj#‘ˆFхЋРбЋWŒк˜ц‚*W„R‚�pЁЊX:™rбF*uа:§аœj, Є$o�з�„Hv{Ю 2xoп|]НЊ,мђ <0@м;ЩхД‹КnМЉ�S�Њ=Ц§…e>ppфѕЁc9Nп ЊJ0Њ^žаSЇGm$dЎдi@!\іrѕFobgl&вйѓH*фВGЅЛрnєЕ[Э›”Ж ХъЬŒ$ІюЄЧѓiћ;Рѓ$Щэ|Ё:o ЗTвЖ„%Ђ&�9I™Нї(‰­_#Ÿvsљap&Р№ЁКhќ’y^д}z7ssC[Бјгёy�|–`ˆ0A� ж"ƒ—ПŸ ыљS…  \@/†.ю+фєЗЧД<Аo€A…ПЃ”Gw^<3’’Л �TШƒ™�8A€њЙѕюуЂoЪщlffэq €X“"€ЃЗЩ'a�а?јX˜КŽoщѓЊШЫC:€ў1Ъ?оЛ'€МЗз1*UkЊjзЂё№"гLЧђ`FH0€ћњУхlTЩх0Аьољ"šЈЊВз€зДрШ^­УШС(ФHБиЌдr–=– �tІЧ/oЊЛЙЭyйЃnCTУо�ЎЩАЏšxћеQ*›ИцэžU)з.RzœрЦ`&6m/ЗTB(U4Aрє;лЉwм9=с�fOxэrЧ™?Џœ­DqйБ@@5''Sslr‹!І”YЃ1�@7@d“л•Oѕ„ГЮXрЭЇux ЊЌ1‹Эe�єLPЙ '�аWL `ЮЇ“2€7шж|№Р€эА]І"œ0Щ}~rƒ+B-D�(В~o>­УРх=ЂЈЕ§иу�Y„j˜ы9Fре"МљДD� ЏИ ЭzH”…7@ƒќˆB‰0†, �ш>MŠм0 �JЌэšОˆp  Яы YЃ1d}Сє#Šр†*NыктьZd3JИJœБxLН*_:VХЈЛг"dM†’"рт'EѕttRГŠ’:шпз&ьщ8>y``9€ mЯЯ*ЛЛеwљsс5Жu@0mяьЈ .ŒЧяѓi–c @ўrшеЧЊ_˜/­ѓ 6(ћ…&т�сuИдWЄ`@Ѕяз`НW Hћ;’ЬсFЬ?� РЬ[�в"ЭŒЃЩzH”‚я�’т——|“cdТ€џ�Pž>гќ1РвЏїы_?ЁН\ПЕчQ-. �qwЛ№Ц+#sЛAЌ�?й1N$e;ѓ6№ ��1“щœ–fН{+Gt=FZCИљџ JнЖGC Єiq•ќОН|ућCŠЧ ЯgФ›м?ј�paЪШ’nФ-k€5Р` АXќ|й�TxЈе����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/�������������������������������������������������������������������������0000775�0001750�0001750�00000000000�11363100500�015141� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/linux.png����������������������������������������������������������������0000664�0001750�0001750�00000000343�10411745112�017015� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���%��� ����РV+!��� pHYs�� �� �šœ���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF���YIDATxкЌIР0ЧQџџхщ„Ж‡.‡FB1Ши‘o№‘•ЄpžX2]яЭЗF!dж‚G.-НhАЄчшЄеьKS у-јл%eпqњ[еЁЭЗп�Tњ'го����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/ubuntu-linux.png���������������������������������������������������������0000664�0001750�0001750�00000000426�10411740575�020347� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���V��� ����н(К��� pHYs�� �� �šœ���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF���ŒIDATxкд“ЩУ DпDљџ_žlЗ&›HЅj@`№2^yƒ–WЌВ"А�ІqЋdхkДŽсKr!№ кnТЕb‚2˜x8­яs;ЖмЪa ƒƒУиЎЫ=hтQ/іЕЧ6F:KƒdzјЕєМСtЦkЮUф9sџщ1UПUIZaš›вPIІ^VяЏ~й6�ЖВJГ›юѓ����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/gradient.pl��������������������������������������������������������������0000775�0001750�0001750�00000001656�10411740425�017317� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl open(OUT, ">gradient1.volicon"); print OUT chr(1).chr(0).chr(128).chr(0).chr(12); foreach $y (0..11) { foreach $x (0..127) { if (($x % 4) == int($y / 3)) { print OUT chr(0xd6); } else { print OUT chr($x); } } } close(OUT); open(OUT, ">gradient2.volicon"); print OUT chr(1).chr(0).chr(128).chr(0).chr(12); foreach $y (0..11) { foreach $x (128..255) { if (($x % 4) == int($y / 3)) { print OUT chr(0xd6); } else { print OUT chr($x); } } } close(OUT); open(OUT, ">gradient3.volicon"); print OUT chr(1).chr(0).chr(32).chr(0).chr(12); @tab = ( 0x00, 0xf6, 0xf7, 0x2a, 0xf8, 0xf9, 0x55, 0xfa, 0xfb, 0x80, 0xfc, 0xfd, 0xab, 0xfe, 0xff, 0xd6 ); foreach $y (0..11) { foreach $x (0..15) { foreach $wide (0..1) { if (($x % 4) == int($y / 3)) { print OUT chr(0xd6); } else { print OUT chr($tab[$x]); } } } } close(OUT); exit 0; ����������������������������������������������������������������������������������refit-0.14/images/vollabel/vollabel.py��������������������������������������������������������������0000775�0001750�0001750�00000001746�10411714521�017335� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python import sys import Image table = ( 0x00, 0xf6, 0xf7, 0x2a, 0xf8, 0xf9, 0x55, 0xfa, 0xfb, 0x80, 0xfc, 0xfd, 0xab, 0xfe, 0xff, 0xd6 ) for filename in sys.argv[1:]: origimage = Image.open(filename) (width, height) = origimage.size mode = origimage.mode data = origimage.getdata() print "%s: %d x %d %s" % (filename, width, height, mode) if height != 12: print " Unusable, because the height is not 12 pixels!" continue basename = filename[:-4] labelname = basename + ".vollabel" if mode == "L": labeldata = [ 1, 0, width, 0, 12 ] for pixcount in range(0, width*height): pixeldata = data[pixcount] gray16 = 15 - int(pixeldata / 16) labeldata.append(table[gray16]) else: print " Unusable, because the mode is not supported!" continue f = file(labelname, "w") f.write(reduce(lambda x,y: x+chr(y), labeldata, "")) f.close() print "Done!" ��������������������������refit-0.14/images/vollabel/refit.vollabel�����������������������������������������������������������0000664�0001750�0001750�00000000605�10411740575�020014� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ � �������������������������������������������������������������������������јжжжжћ�ўжжжў�џж*іћ€�������������Uжћ���їжў���їж§�UжU��������§џћў�€жј���јжњ���Uжњљжжжј�������ўџжќ�§жжж§�њжжжџ�њжјї€џ��������їжЋ���џЋ����§жї���§џ��ў§��������љжњ��јж€����џў����џў�їжћ��������њжј��њжњ���јж§���јж€�љжU��������Ћџ���Ћжжжџіћжњ���ћжњ�їў§ї�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/refit.png����������������������������������������������������������������0000664�0001750�0001750�00000000462�10411714521�016771� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��� ��� ����&рe��� pHYs�� �� �šœ���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF���ЈIDATxкŒAУ0Dп//‚)˜B)t!ЄL!–BBСЏ‡6=ЖУH#=4ђ^'Ожˆˆчˆ8ѓ}П§рЁ™IduP™UQ­iЪ^Yд…ІЮД?`9€œИXj’e\“GУ ЈЉЈV†Z“цЊъ ш\`н @Яш‰m+Џ:Xї‡зg~Ќ(I-@њŸhъDsф:Tуг“ћ�м{Џ“‘х����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/linux.vollabel�����������������������������������������������������������0000664�0001750�0001750�00000000701�10411745112�020027� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%� ����������������������������������������������������������������������������жжж������ж����������������������������ж������������������������������������ж�����жжж���жж�жж��жж��жж�жж��жж�����ж�������ж����жж��ж��ж���ж��ж��ж������ж�������ж����ж���ж��ж���ж���жж�������ж��ж����ж����ж���ж��ж���ж���жж�������ж��ж����ж����ж���ж��ж��жж��ж��ж�����жжжжж��жжжжж�жжж�жжж��жж�жжжж��жж�������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/vollabel/ubuntu-linux.vollabel����������������������������������������������������0000664�0001750�0001750�00000002015�10411740575�021357� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������V� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������жжж�жжжжж�����������������������������������������жжж������ж���������������������������ж���ж��ж���������������������ж��������������������ж�����������������������������������ж���ж��ж�жж��жж��жж�жж�жж���жжжжж�жж��жж����������ж�����жжж���жж�жж��жж��жж�жж��жж����ж���ж��жж��ж��ж���ж��жж��ж���ж�����ж���ж����������ж�������ж����жж��ж��ж���ж��ж��ж�����ж���ж��ж���ж��ж���ж��ж���ж���ж�����ж���ж����������ж�������ж����ж���ж��ж���ж���жж������ж���ж��ж���ж��ж���ж��ж���ж���ж�����ж���ж����������ж��ж����ж����ж���ж��ж���ж���жж������ж���ж��ж���ж��ж��жж��ж���ж���ж���ж�ж��жж����������ж��ж����ж����ж���ж��ж��жж��ж��ж������жжж��жжжжж����жж�жжжжж�жжж���жжж���жж�жж��������жжжжж��жжжжж�жжж�жжж��жж�жжжж��жж�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/mkeei.py��������������������������������������������������������������������������0000775�0001750�0001750�00000013027�10413730520�015021� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python import sys import Image def enc_backbuffer(backbuffer): """Helper function for RLE compression, encodes a string of uncompressable data.""" compdata = [] if len(backbuffer) == 0: return compdata while len(backbuffer) > 128: compdata.append(127) compdata.extend(backbuffer[0:128]) backbuffer = backbuffer[128:] compdata.append(len(backbuffer)-1) compdata.extend(backbuffer) return compdata def compress_rle(rawdata): """Compresses the string using a RLE scheme.""" compdata = [] backbuffer = [] while len(rawdata) >= 3: c = rawdata[0] if rawdata[1] == c and rawdata[2] == c: runlength = 3 while runlength < 130 and len(rawdata) > runlength: if rawdata[runlength] == c: runlength = runlength + 1 else: break compdata.extend(enc_backbuffer(backbuffer)) backbuffer = [] compdata.append(runlength + 125) compdata.append(c) rawdata = rawdata[runlength:] else: backbuffer.append(c) rawdata = rawdata[1:] backbuffer.extend(rawdata) compdata.extend(enc_backbuffer(backbuffer)) return compdata def encode_plane(rawdata, identname, planename): """Encodes the data of a single plane.""" rawlen = len(rawdata) compdata = compress_rle(rawdata) complen = len(compdata) print " plane %s: compressed %d to %d (%.1f%%)" % (planename, rawlen, complen, float(complen) / float(rawlen) * 100.0) output = """static const UINT8 eei_%s_planedata_%s[%d] = { """ % (identname, planename, complen) for i in range(0, len(compdata)): output = output + " 0x%02x," % compdata[i] if (i % 12) == 11: output = output + "\n" output = output + """ }; """ return (output, "eei_%s_planedata_%s, %d" % (identname, planename, complen)) ### main loop print "mkeei 0.1, Copyright (c) 2006 Christoph Pfisterer" planenames = ( "blue", "green", "red", "alpha", "grey" ) for filename in sys.argv[1:]: origimage = Image.open(filename) (width, height) = origimage.size mode = origimage.mode data = origimage.getdata() print "%s: %d x %d %s" % (filename, width, height, mode) basename = filename[:-4] # TODO!!!!!! identname = basename.replace("-", "_") planes = [ [], [], [], [] ] if mode == "RGB": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata[2]) planes[1].append(pixeldata[1]) planes[2].append(pixeldata[0]) elif mode == "RGBA": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata[2]) planes[1].append(pixeldata[1]) planes[2].append(pixeldata[0]) planes[3].append(pixeldata[3]) elif mode == "L": for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata) planes[1].append(pixeldata) planes[2].append(pixeldata) else: print " Error: Mode not supported!" continue # special treatment for fonts if basename[0:4] == "font": if planes[0] != planes[1] or planes[0] != planes[2]: print " Error: Font detected, but it is not greyscale!" continue print " font detected, encoding as alpha-only" # invert greyscale values for use as alpha planes[3] = map(lambda x: 255-x, planes[0]) planes[0] = [] planes[1] = [] planes[2] = [] # generate optimal output output = "" planeinfo = [ "NULL, 0", "NULL, 0", "NULL, 0", "NULL, 0" ] if len(planes[0]) > 0 and planes[0] == planes[1] and planes[0] == planes[2]: print " encoding as greyscale" (output_part, planeinfo[0]) = encode_plane(planes[0], identname, planenames[4]) output = output + output_part planeinfo[1] = planeinfo[0] planeinfo[2] = planeinfo[0] elif len(planes[0]) > 0: print " encoding as true color" (output_part, planeinfo[0]) = encode_plane(planes[0], identname, planenames[0]) output = output + output_part if planes[1] == planes[0]: print " encoding plane 1 is a copy of plane 0" planeinfo[1] = planeinfo[0] else: (output_part, planeinfo[1]) = encode_plane(planes[1], identname, planenames[1]) output = output + output_part if planes[2] == planes[0]: print " encoding plane 2 is a copy of plane 0" planeinfo[2] = planeinfo[0] elif planes[2] == planes[1]: print " encoding plane 2 is a copy of plane 1" planeinfo[2] = planeinfo[1] else: (output_part, planeinfo[2]) = encode_plane(planes[2], identname, planenames[2]) output = output + output_part if len(planes[3]) > 0: if reduce(lambda x,y: x+y, planes[3]) == 0: print " skipping alpha plane because it is empty" else: (output_part, planeinfo[3]) = encode_plane(planes[3], identname, planenames[3]) output = output + output_part output = output + "static EEI_IMAGE eei_%s = { %d, %d, NULL, {\n" % (identname, width, height) for i in range(0,4): output = output + " { %s },\n" % planeinfo[i] output = output + "} };\n" f = file("eei_%s.h" % identname, "w") f.write(output) f.close() print "Done!" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/refit_banner.png������������������������������������������������������������������0000664�0001750�0001750�00000012045�10411707416�016523� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€��� ���U@чr��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF�� BIDATxкьYmPw6Л й$›ЄD@ (X‹ЕZ=рN[_№Ѕxз)Нvjэч^œ:ТЕwЛёЎїђЅvцьuкKfZЯN=nnМЮМ"еФ7JmЂ€М‚„%й˜lvяCІЙ–$~ЪџгюђфПћџ§žпѓвмм KКX–ѕt]™щ<ЏођlRцJH,С…-с^AлгнF^џŒ яaО`РЕ%AРwD�==сОжфНy6EMoиЙ=ЋфgŸНљ†8-;oм <sЗ§‡њК1Г х‰У{гW˜ЭЃОЛг.Џ 'јЦ‘�џФАћЫzЯЫ ‰•Џ>Ё1fC€†ёГ@f˜dmŠѓдQЬА†XЛ Яy,є| ‰- =юс/цуЋžЪI6Јe€ђ€зд[AšЭ0brм1и~нvЙ9 -N}ъeБ:#о‡Бйl‡ЖЉЎЎЎЊЊ ]зееY,a{Гйl4РbБдее…ŸзддTTT,ў›E1ђ–$Ч‹Ъ|d@ІФ€Ё€ђƒ�"Р`ђ& _9ЏЉTиЃ{іWМў‡ќ би‡GЉоŽx0::К MYYYфіFЃ1„>�иэі№s‚ JKKgлЗЗЗзжжкlЖИ‡ †iї™8GœћѓЇхЏ:9`�‚ аурЯ№З‚,;)cЉђЧš ыЅ3oІTўZ–_Wpoыыы ‚Ÿ‡H’œгоh4šЭfЎЅнnoooпієє„ЏM&wgЛноввваа`Зл ‚sG„–fћЫtоsчџrkj`p–ХФ$ ЈqPИnУ@яеЌтЕЅЛ]ŸќЩяˆ\'5Гб9яœ˜L&žЅNЇ ’$y›s-,KШ кИ$Zф™SЪŸEз:їюзЮ^7(0�`XЖщЃЎІПпэПOВ*Р§аsю^1ѓзЌ-t|z‚Ёщ8РsвЈфТ MsЦю-osnтN��Јп#лќгѓяпvx@‹г43эС§ы~qљЊє‹їњ“qHУ§k0~Зhu‘ЪлчщКє…Tгу/№ŒЙФыѕњЅ/Cщ)‡ЇЗhцл ТѓL˜J6PЎЏИ-'Яl~о(KТPЙ†(к$Ы-v4МkmИZЖ#[LњaЌбхфg]ЛоЈXU† Hф_Щ­@BхGИ€ W#ТN:'aБЩ…dЪЫЫy–Ё2ЌЂЂЂІІfЩ0yс$vѓу4п їZšЇ5аjžљц2Я&uлKЂт/˜яt4 ˆTZ�@Ѕ2н^sЩ7ЕЕ ƒ^IpіхdЧ-П§^ЬСнd2ежж†а'" G$ `>D%—АБ@ЕЙ"R€ЗП}}1‘НЫ†­ Я=wєiFc˜mІођŒє‘ќћŸМЅzМ ќ0mїЯћўњ“хvЏ>Uі11.7hd#нmIњќ‚;A---a8ИžЫ…УfГЭіMn@’$зоbБ№‚ NŸ>bбfГЭ)ЃбиммЬm&ЊЊЊЊЋЋ—>!„Cпч�’`†rf’TЭгUсЫз€`т№T*Snxњ^зGњRˆМрїd(Бў‘;Бw…BСEŠыЙм@М`А`ЉЮ-4yй‚Ї-n3mŽЂ`Q00"–š&ШВЬМA- ч=‘Џирhћ0ШАЈP%ГcC‘"їќvЛнd2еддшt:Ўѓ2pИ}3т/ииl6.ЌмыййBИ–]"рjПŸ €Я‹2Ž‹ш)ЇD›щ;_Ќђљƒr1 О .Aj*цъўјёуag xС’†чЖТЈqрйlёx џ5’Фc–d­!= МSKЅ=’ющПљ;X@4‰2ЁЗЁHИйН{ї‚6‘Ф.aТ “—-xlE•Щc'@ОМищЂР@:€rgPЗ/0>w(эj|Я?1<A„Іd ��†А� Bc AsN`Ђ%€—T…э…ЕХ}oД@р9ЋЧЇС;CУŒ \кмќeZzтќпТООџ9>ў•їоѕй?И†Су"G†gFœTпИ‡Ы#wџ0X ˆЈZ0юЮ:N`Ћ@Є`Њ4‘a}п С‡рш ГnћїE]ѕ“-ЇC]c+6šж•ŽŸzƒь87+-Ы‘e.wk.Nf^œ^v#+/йƒћЯwТЈ<:ZЙ|�7:E;ƒ‹К "жlыmМRT FмvЪ3В6ям|ўЬЌпŸМх‡єЇlUNССпˆDЏ]ўчлЈ2M–їџoЋ3вЋ~Пјч|'фѕРГ§4цŒ—�2ylшG1 ’х•Š•]wЇ�eaМœC+‹wМАl}ячN›\ŽC@œ№яНєќDня<=_.Щ„'’lЩУHИсЩE8^E>оXѕХ*�A1эЎУЇ^еЄткT†;"5ЫђŸ<ht9њ5†х`k„щСмЪ#bBk5џ–нћКbuљ"чћaАцг8I’\˜H’œн—••;vlNL…=зjЕ  l2™t:]ЈJЖZ­zН>дОEEFгP‰nЙjЧ‘џ^˜ €”…ё.А]ЧН4CfсЮJЉ6ЦОЮг№љ/—mњСжЃЧІоruvЉм>ЄЌV+ЏЩšГ­хЮю#є\Е:nЖЖЬfshМA’dhb­ЂўŸ№tG“ЇщФЦ’дь,РT25(4@M�5@ƒ”€ѕЏ8'ш–wў(YџŒrу~E!БцZшЂњA’.еvЗЖ?“+ЅrЅ0� n;ј)@DРb@ћaЈUžž.гvБHГV‰Sє Ќ—FЁЄfм_еS7SD.­VžkP$ЫФр †�*&'ЉЎў‰!RœЗIUњFЄ$А^Tц WЄ”>Ч<ОЯ{џvgУћ*™/9 ыpPн§юAKZЕ/Ѕd—D“™@yщ јЖУ’) 6-'5p`Кo`zЬЏРЋL7э'kјЦ—�� gІ˜ЩСсYыш”,OQ\Љ+оŠ*д dП#и€/ˆтžLх“ћ3WnDP,iTы�Рdqы„;����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/imgprepare.py���������������������������������������������������������������������0000775�0001750�0001750�00000006040�10412203437�016060� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python import sys import Image def enc_backbuffer(backbuffer): compdata = [] if len(backbuffer) == 0: return compdata while len(backbuffer) > 128: compdata.append(127) compdata.extend(backbuffer[0:128]) backbuffer = backbuffer[128:] compdata.append(len(backbuffer)-1) compdata.extend(backbuffer) return compdata def packbits(rawdata): compdata = [] backbuffer = [] while len(rawdata) >= 3: c = rawdata[0] if rawdata[1] == c and rawdata[2] == c: runlength = 3 while runlength < 130 and len(rawdata) > runlength: if rawdata[runlength] == c: runlength = runlength + 1 else: break compdata.extend(enc_backbuffer(backbuffer)) backbuffer = [] compdata.append(runlength + 125) compdata.append(c) rawdata = rawdata[runlength:] else: backbuffer.append(c) rawdata = rawdata[1:] backbuffer.extend(rawdata) compdata.extend(enc_backbuffer(backbuffer)) return compdata for filename in sys.argv[1:]: origimage = Image.open(filename) (width, height) = origimage.size mode = origimage.mode data = origimage.getdata() print "%s: %d x %d %s" % (filename, width, height, mode) basename = filename[:-4] identname = basename.replace("-", "_") planecount = 1 imgmode = 0 rawdata = [] if mode == "RGB" or mode == "RGBA": planes = [ [], [], [] ] for pixcount in range(0, width*height): pixeldata = data[pixcount] planes[0].append(pixeldata[2]) planes[1].append(pixeldata[1]) planes[2].append(pixeldata[0]) if planes[0] == planes[1] and planes[0] == planes[2]: print " encoding as greyscale" planecount = 1 rawdata.extend(planes[0]) if basename[0:4] == "font": print " font detected, using alpha-only mode" imgmode = 1 # invert all values rawdata = map(lambda x: 255-x, rawdata) else: print " encoding as true color" planecount = 3 rawdata.extend(planes[0]) rawdata.extend(planes[1]) rawdata.extend(planes[2]) else: print " Mode not supported!" continue rawlen = len(rawdata) compdata = packbits(rawdata) complen = len(compdata) print " compressed %d to %d" % (rawlen, complen) output = """static UINT8 image_%s_compdata[] = { """ % identname for i in range(0, len(compdata)): output = output + " 0x%02x," % compdata[i] if (i % 12) == 11: output = output + "\n" output = output + """ }; static BUILTIN_IMAGE image_%s = { NULL, %d, %d, %d, %d, image_%s_compdata, %d }; """ % (identname, width, height, imgmode, planecount, identname, len(compdata)) f = file("image_%s.h" % identname, "w") f.write(output) f.close() print "Done!" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/linux-bootlogo.png����������������������������������������������������������������0000664�0001750�0001750�00000022032�10413731303�017035� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���L\іœ��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��7IDATxкь]щ_SWоџsюНйїТОЙ (jЋщЇЯ‹чЏ~fЦЖc[дR *’}_ю=Ыѓти4 HHˆгœWЂ˜мћћўіэ 'OžР№\пСC 0<C�†� Яѕхгz\„Цу?№јэpЮ‡�єŠю„„PГйЌVЋйlЖеj!„$ѕЭfГЯч3›ЭVЋcЬћ„ј�PUе0Œ§§§bБ˜NЇkЕcLб%fГйсp„BЁP(фt:9чП3ртŒtt‹Х’Щ$�B0ЦŠrЦc7›ЭFЃ‘JЅTUЛџОDnРEнŒcЋЋЋёx\ЪСŸўОDH‹ХЪхђ7"‘H—И Н Ѕ>чќйГgћћћŠЂœЩђчШЊЊ…BaeeeuuUбeД‡№чЄ”>ў<™LjšіQџ—sЮУKQиййбu§СƒЁС”ƒAd EQЖЖЖŽџTэœІОЧуy№рЧуЁ”"„L&S<пммќ(њK€1ЎVЋЫћ�@) 7oоќц›oЦЦЦЄ3ЊiZ4Эхr„!�Роо^ЃбnўЧŠŽзыm4ЅR) ЪO -І%,СDЕZ­D"qbqЮэvЛЊЊпџ}6›•СA;’H$йlжыѕ2Ц†pћW*•Z­vu1ЎзыOŸ>ЭfГ2\шќWЦињњК4 C�ўD.ЛЉrЙ\>Ÿ4E„њЙ\ЎG™!D*•JРŸ�аl6{фАB2™Ь iЁѓŽЛЈ#„`ŒЩTш9оgГvоє}†šs>Pўш@'у(ЅšІ|>Џыњщ`Jж�&''ƒС Т0ŒL&“Ых У8­ыe„Q*•ќ~џрјBƒ € k———}>_ЁPиииHЅRЇK1wяоНqуFћЧ7n$“ЩчЯŸŸ‰С�f#4K%„а4э‹/О№љ|†aИнюX,–NћL)ПyѓІa†a0ЦcКЎŽŽ...ОЧu]№AЪgddФхrqЮeMгДббб6Y…ЊЊЮЯЯK A)—Ы”REQt]wЛнЇН)Юy:(OT@о—АZ­­VычŸ.—Ыccc‹‹‹ГГГ‡‡‡†aШьТФФ„ЧуaŒUЋеL& …"‘ШшшЈЂ(сpИX,žІѕа §Няїћeй= Ў­­эээ…Усуууx<юp8,K!UUBЁЕЕЕX,&„…B’Ч=Я бњгPA&“ЉMИVЋЅ(JБXœœœ<::т\tYQŒqЉTЪчѓfГй0ŒЏз›H$�Руё˜ЭцС/ уUARѕ#„ЪхВЎыКAхп(ЦQЕжф•Ы]зЅћ_ЉTvvvкIPјЮ€КЁBˆRЉЄвпxЛ=6тAе_юЭ4Ћ •`Ј6АрV?pЛ=šЩТЈ1€Z­&ѕўћ�к€‡gff(G!/БiхxќРяТг#x*ŒVl0ЈІБѓ—7fЄЄiZ$СSJO{Ђ2н=P]C*„t:†Ууѕвсч7Щ^BИˆqЏ!DЎ—чбx@н=fй'˜ШтW45 Ѓ+xЦчѓyУ0dХxРљB@^Н~=тEŸп$Њ‚nL .@MаTё!.€ Єˆ ьSRyОsШзж_ pfxаTа€Р˜Mxy‚�?m$€‰пџL�@ФC\­“r]lФXЫ€.jЫЂЭ@ЅƒБ&Œ1fLм˜Р‘�цёV”ЦрuЁЉ0ўл айЁЦ@eЄ.s:‡€{шcЕДB бGiN8mHSрЬOЈ•Сmл9тљВP> u(0†RMќє†эsB XmдхіФуёСq„Е5СAŠ?п ѕМIw…@K—ПЬ^nГH�=ОЋ!rЅп‰ьp8кЭвЁd2)JC#|^0Ќ*PmРOЏшЃ;Šн v#�u2žЪ J…нŠІGqРЬ*вuZkрX‚ В1єЫ/ПŒЧуoпО•њЇеjЅRЉщщщAHMbIвd2ЕuzЉ&~xEЧШчТя:‚LWЂTЗ …§hФG,` ЉМи;jн\˜Pн“€ž!У0’Щф§ћї§~џЮЮN&“Ammm…B!UUЏ=PїUU ƒВ}AAЁLgрэmы Ћ…<hn \cрŠUБsDї“†ХъVœw­6‹лэ:99QcFGFFЦЧЧУс№“'OrЙ\БXŒFЃKKKз>@0ˆѕ€RЉ$7!$›+ИlЪЗЪ„ ƒРnA&0BЁ$т'lїЈeБy>М њUUСGFFфLЦИйlў№УїяпЗZ­•JEzК333]UЖП:�2PJЇг2Йћіэ§ыŸйbэљ,Ю a €1hшЬёDV$ГBфжэЛГ3г‹…R* ‡­VЋЎыВUНVЋ={іЬd2ЕkХѕz=™L.,,\Џ%,�TU}ћіmЃбР[,‹ХrчЮнgЯVђeёŸ_щє(vк+‰r]”ЊœRУыq---E"Ji[ŸШ>бХХХеееіф чМ^Џw6ŒnnnzН^YV�ŠЂьяяGЃQBˆЂ(ЁPHзѕH$ …‰cUеі\Њ „�€+M,--йlЖг\L)žžN&“‰DBF^В|жiэыѕњжжжЃG†q�BЊеъЏПў*{ЇdE^œоПпэіPJЊ ‚ С>|єш‘Ќ…НЯœ,--ЃхUUM&“вVџеРПzѕЊйlJ‰DЄƒШ9Зйl?vЙ\­VKв: >|јpllЬ0ŒsL(cЬщt†Усїiщh­ЏЏЫšк_WЉЊztt”JЅE1 czzztt”RкV&6›эбЃG'''�`ЗлƒС �|ˆЩ›˜˜s–я“МbБИЙЙyяоНkqI•AP>йlіХ‹ђGMгцччЛт#JЉеj››ƒпЦ№>№Уc@  Е-С™№яььŒŒŒ6ъ-ДЕЕ%“3Œ1йSušФœѓvмЧ†ж###чGМœѓЭЭM9^љз@гДƒƒ9)уоЉЉЉЋŒЄt6СЉ&QEQRЉд‹/dЦ_�љкыыыВ_œsюvЛЅѓs…пТ9w8FE†f]0ЋЊЧWWWEщ'з�!ЄеjН|љRЋmHzдМoБX:œœœ4™L]hšЧwwwћ9@p=�`Œu]_YYЉT*ЖQWўuВуБгЄgГйљљyEQКОŽђђхЫ\.зЗШрк�§ўя)ћ Ћеъ•[BЮЙЫх …BR aŒ …Тёёёђђr—.’‘СююЎьЪўя@ЊўНН=MгКд}6›!Eљт‹/‡ќF94™Ыхф‰г‘WЏ^ѕG]�’ХcVЋurrВЭ€ŒБ……Y>ь…2›ЭsssэW%ЊЊ:11б‚ЉЊКПП_.—ћ€юПђЉT*љ|^‰Dl6›dI֘ЫхКyѓfяJTrЂF}ДЮіііЬЬŒЂ(]+Иt]пннэCXаo�фЌzНюvЛƒС`<—\†КsчNO;…&“ivvЖ­їЄ24 CfГЛбссaЉTъ5} s„йlоии&—R‡GFFz B 7ЪЕQ‰Хb]n|д>ИЄИЯьŸЭf‹ХЂЊЊrq€|=ŒёщќOя„  Е…@vЛ\.ŸЯwZŽŽŽЊеjOнЁ~K@*•’„nЏџ”ѓx}kжфœOMMЕћ!фl~&“™=3б'~к�Ш9щd2й)ьВoGІ9ћs8чVЋеjЕvŽтŽŽvкgјmбассс �„нннzНо)бВдыѕі­5AjЁЮ!VŒqЙ\–™ЈЎЧР'“Щž–kpп”OЃб8::ъВiœѓp8мхіƒ@ а%šљ|очѓЌT*ЧЧЧНЫLрОБ>Ÿ—э]†.їП3Їы18чйlЖs@Гѓ$“Що=aџ$@šпN“5л3Gк{-ЊЊvb€1NЇгNЇSгДгB g№{Є…pЈ_ЋеRЉ�ј§~›Э&)Ю9їzН§oа”k@L&Sчї†aГйКьpЇъQ@а�E‰ХbЕZ !4>>ожЇ!Пп]эБ]Й‡VЋЅыњ™м „ШчѓŸЊШnУ§§}ŒБІi~ППЭў6›-єп�HGШуёt:Br1ў9ёc{aўЇ€є>1Ц2ъi{ur)єЕH€ф†ЮЏ–KйЯ$q{гS/‚о@ЩхrлллRэH}кКlђ5Њ ֘УсАZ­ч,ŒэQ о[�B;;;эъ’Тхru5( ШС7 йМ~&ѕ3™Ь'&Ru&‰vТYіžі4A&&&ф§9 џ>1 РgГйЮWbŒ•ЫхйЌЊЊм'бjЕќ~џддT"‘ш\Рx`Wщ"іZuu„Їгщ{їюEЃбы‹рœЯЯЯыКоjЕТсАЌ,--9ŽX,vКE!tmюзР™ BШђђђO?§дџFЬN�œNчђђrЉT*•JЋЋЋFУэvЯЯЯ—/_v9уЖ§) Х–qрђ.љўцЭ›GЩ5Ÿуk1Ш„НННзЏ_ЫfSЩяЅR)ƒAЗлнЗ%ЧJOЉoЕк`Ÿ Йl(™уЕEнппз4эГЯ>cŒѕП#\jEJщжж–\‰жЅmвщtчъћіЛ|z6€2љџБь№й[š†чы8•[МСЩжж�,--ѕљjy7Ў™LІ^ЏŸ™d>ѓ‘]У]ЙЃO��„nМ ЙšLн�Г ЭFPШ‹оЄЙ’*1Иwя^п.О“эяЯ_М(фГr­мY ‚Г[ЗnЙн>J[ŸŒŠ0iеВД‘ЄœHОс Vќуž2ФЉ[[[Пќђ ЅД?=h„Зo7“‰Ѓ/oЃџYЦ>ўSgXP <КЃн-ац  O'У­Но)–)љу70рі Ж›&j4}њєiЋењи “.тљq’Ю†}Њз…­&4?FЮ—!Р pkŠD„6ВМВ‚} м\3�уj­–ЯeU9­5Ћ -ЭB@UЕ|>џєщг“““žb /cl2„@Їђ"Ÿбї�  nMтщм2�АŠxMат• юХЋЊЊКЛЛ‹ЁхДс3е;e0@З' e WГўјуВKЎWiwŒЋ•ЊЁW\v" c˜aЩщЇyŸRИ1gˆмзЅ`и=fљ'x№$�wЙNxkkk{{ЧэPЩћ?^7`f‡МHb „XYY‘=Щ=jЬ2›оQм 05ŠяЮЪqр8.Р ��З&ёвоNСŽвЌPЈрЋ@Й<щkЕšAF@d2™x<žЮф&scч™V€м%пџJ9„М@OБИИHщEОHˆw[/ЫMСќ8Vи;цќЗ}Œ.;šС!/ЂФ$*•ђ• Јrъ‹ХЗ›лЅBN!Ь ад…ЎыŠ‚=Nu~ {gl;ь2.;š уш!W•wКk{{;ŸЯўљчNЇѓœдиUсALрё nЏT•wђqZЕжыu™[МТЇR.ЌшBыыЏы•фУEЋУŠыMQЉ#„Ьš‚<NЄ РСŒСiRЊ‰Lснz8UUѓљќЗп~ЛИИ855uЕiH„р4Sщ‹ї9ж‰dтрр`nnю 3‰јТ�4šЭj­voСpcŒ‘У†Ч‚8Р~BшƒЈ/y!И;CдŽ ‡„У0^МxqЕc*AA7ЮР@Њ&!р}Xc>'ҘlooП/„ю7�еJЅVЋыєнB[Ю2  ƒbYЦСу@7&q'fВfЛГГ#ЏХЛ*�-QkŠ Јq.`fл,ЄTЎЌ­­5›ЭЋzЊ‹ћšІЉŠr”ц2ЖК\жІУФeџУf>„чќррр "! TН�lf47F�ЉћёяџѓŸZ­*]Оы@nDrЙь'9ZЈˆK’HPИ;ЃœNd2™fГyЩї”эщtZзY­yСwІ fFёЭIlЕhХbљџўљэЮЮžœљО�фмЁпяз)?ЩѓЫѓ(e№ HрŠH6+œnќXom?›Э !Е&а ЅўМ3Wп,+ПgАЗoVјqхbW^ ’ž;Hч…t$.юЯЇЩHе0 “ЩДААp™д4-›ЭЎЌЌФb19R­_ќiЅлjб ьEЛЁўяC Ћї§э5G}€sюѓљ4”jМxi-$ѕЌІРнY"Й= >~ќ8 ^8"SUЕP(ЌЎЎЪu\2щ}yFс(ƒ!№јžХBJЛ{ћ‚KЙS‹cD)шWTмЅ Т>4Ѕ–їыЏП–kW/јHщЬчѓ+++ђR“v{РvœƒХ~n4šзЃ‚ъѕ:cB!ШЌ^й‹q j­’‹Ч9CљQI:™U}ћіэwп}зh4dЂЩl67›M�d6С•xUЊРIžЧг" ^иJ)— ‘HѓњˆЫЎ �ЦСaEЗ&ЩкњЋp8ДПППЕЕ599yћіmUUOя2hп™$йœ1–H$ЖЗЗгщtЛо+„pЛн‰D�ЙэH%gd>Šє„�gKkQ63wsllєТ@Ž-$ŽšІЬOŒ.шZМOј•7Бњњњњмм\4нммЬd2KKK>ŸЏГl зhIMUЉT*•J"‘Шd2rЃэАЉЊъїћх§bьЯI0 ƒФ лмo1p>ќr)2:r™МсЅ�Ј7ZS-тGЦ•6јxкюоОпяј№сгЇOKЅв?ќрvЛН^яящFЃX,JЦЏзыrпеi{(чa УРЙэ-ЌЦР9”ы"‘сБ„NЙ61Бpћі Гй|ЩюІ‹'у2™ €˜ХНШWb ~7Nц№іііз_mБXdпr>ŸЯfГбіџоч‡0ЦфВ JЅ‚ vXјвѕІШE,СrEƒ <77Л0?яt:c—я-ЛИ PU• QЊ П)�экХUM„qГйlЕZ>Ÿ/ЫАѓc>ŒёЬЬLЅRaŒaЌ|р3"�B о‚ƒ8%iЅF-ѓєЬD$2*Ї ЏЊЃщ‚�0Ц&''їїVпVГES$€НNlж�Ёw‰9qi‡Я €�щКоh4Ьfѓ…#vUU=,ѕHѓ!ђ�{ Оч•5›е[7ЇgggNЇтj;*/Рo mНzѕњ(“%šv rXQаЋи,иmЧš šђЛgљБxp™Ч JщeFДcЙ\NЮ(0Љ<ѕvЎЅе)ЌEйaš ЮМччŸюїћ;—ƒ_?�ђХмnї?ўёїRЉTЏз3й\ЕZчšBРnAv+ёЛАеŒнЄ*`RAрчІнл XoˆrM $ЬfKБX, f=!ФгЇOe>Ž Ш…NЃГŸA%PЈŠчЌ\cјффјgŸ}&/‰†оєфЩ“KL,}p!DЃб( Й\>—/‹%ƒRf& Y-ФыР~7vй‘Э‚4х]ќ4Єн[yУŽ3\! „`ŒЉЊъrЙЌV+ч< ~`zNКIЙ\Ю0Œl6+eˆqИ5IюЬр–ёћЗ#єЮеЩ—ХГ VЉQ›е$KrBˆž6ю]�]я,ЃV9јPЋе …B&“-KЕzУ0Јй„эVєрАЛьHSоyxяК?Дtи9b뇈3ЦьvћЬЬЬии˜ЩdК№D1ЦјѕызoоМQUUРюЮ’Щая 4ƒBН)іќ0Э[-ъpи?~ьёxњ0ФpХ�t!…Cбl6хЌv*uR,–tƒš4ХbЦn;ђ8з‰œ6ФФS<–рЕІ�ANчќќММCРїe2юпџўїo7ду0ъGV@О"ъ ЁSœкlжЏОњЪхrѕg|Ё‡�œ †aЅR)‹ЗZК�Œ1&й-ˆqЈ5B‚QУщt~ѕеWnЗ[зѕ+)ЪЫћ2жжжкŽ,э(b  jvЛНŸдя�]H „dкр№№PzшŒ @€ЈЊ:22rћіm‡Уq…TрффdccЃP(œ™=•Зжє“њз�@—щ–9œ\.зh4�Рd2…УaщnїТєЉЊкl6ONNdЃэ&9NЧуt:ЁgѓР@—@tNRіжыјЭMшrUЅЛе \ѓ§э+e/Ћ `x†� ž!�C�†gР€с0`x†� ž!�C�†Ї/чџ�}"‡ѕ����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/back-normal-big.png���������������������������������������������������������������0000664�0001750�0001750�00000005715�10411707416�017020� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������h$uя��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF���ъIDATxкьб ��У0РПЇ[CЁ“Аv’вЦ`&`РLР€ ˜€0&`LР ˜€ 00`&`РLР ˜€ 00`&`РLР€ ˜€0&`LР ˜€ ˜€0&`LР ˜€ 00`&`РLР€ ˜€00`&`РLР€ ˜€0&`LР ˜€ 00`&`LР ˜€ 00`&`РLР€ ˜€0&`LРь{ ��џџ�Ak]уЪsТ����IENDЎB`‚���������������������������������������������������refit-0.14/images/back-selected-big.png�������������������������������������������������������������0000664�0001750�0001750�00000007530�10411707416�017315� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������h$uя��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��uIDATxкьиЭrЃ8@aўn:юЪІпџEђ<YtWlЇfqc IѕжNІцœ…‹ГбWWVм<==Љї…њО7Ц8ч}F)Ѕœѓ8Ž1ЦЗЬЛ?Œy||ЌNЅ”œѓv­”ТRоЈІiкk2*ЮЙОяSJП~§Ъ9џl†‡‡‡Іi”Rѓ<Oг$Ю9чВ‹ХН…VЭ#`]зyяs?ў<N—Ыхиёx†A)Е,ЫŸ?bŒ1F[зЕ”Вm›Ьы{ 0ЅTлЖMгh­,„B8жкуёЈЕ~yyyыћ^ДцyО\.ЏЏЏу8Nг4ЯГl‰Lин&LЖDя}]џaМїУ0Є”Цq4MгG™­Ыхr:*иВ,ѕ;ŒёКЯ ˜h-ЫВЎЋМo­}xxˆ1š‚жZ)ѕњњ*уЕ[зu?aЌь­‡Ќm[­ЕЕVFEДДж?~ќ0Ц„LA)5M“|oзЊ0уuч!гZяЕЌЕоћBзu!„ЗЖІi3ɘчYРъxеƒ>+{#Њ:gmлV­zbœІЉы:чœiлЖ”’v-зЊ3Nw2Й6Ць]J)ZыЖm[9Л‹PГЦ§“Ѕ–•_зЕZTšІiZЅ”мЋ?gьh}Šй^ЁњНїЗыЏPѕMV№SЬіЃЖЄ7АN ж—5y­@эž­/kV/к§юЉ`ћtЊПвДЌЮ+Р�#Р0Р0 0Œ�Œ�#Р�#Р0Р0 0Œ�Œ�#Р�#Р0Р0Œ�Œ�#Р�#Р0Р0 0Œ�Œ�#Р�#Р0Р0 0Œ�Œ�#Р0Р0 0Œ�Œ�#Р�#Р0Р0 0Œ�Œ�#Р�#Р0Р0Œ�Œ�#Р�#Р0Р0 0Œ�Œ�#Р�#Р0Р0 0Œ�ћпƒ5зъ§5нЙ{šv[. њRltZЅT{ ГЏЉе4MjїCїAЖЯЂzІ]џОЉ”вZk­ї7ъmЬ>kА>L‘)ЅкmлŒ1Цk­ЙV§0ЛПVЊ•І”bЬэJ)9чJ)JЉmлJ)r­”Њt‹3a)k­sN^kMгфœMJЩг]K)хœЗmъu]хЊЛ—жкZыНяоЇ”J)™cпї]з…цyоkcЌ\cYozаdьКЎПBАЃ‰1цœ1‡УЁЮ“hЅ”ф†ьЮп^Ю9ћіэл0 ‡УA)•sŽ1šRЪщtz||tЮ У ЩюYЗЧВ‹ХНщxЩЈ8чB!„a†apЮ)ЅNЇS)Х(ЅЦq-яН< Ј€­ыZJaШю0^MгШсАNисpАж*Ѕ.—Ы8ŽJ)#ЯМММlлі§ћwkэёx !Lг$`9gРюVЯё!яНЌљљ|>ŸЯђaS;ŸЯу8ЪошНїо—RdK”аКЉY§QУSњ)ЅпП/ЫR?iіхœŸŸŸхX"ƒ)ѓHwNіЖЃlƒћў�еёnšз8����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/font.png��������������������������������������������������������������������������0000664�0001750�0001750�00000007510�10412203437�015027� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�� ��� ���2˜.��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��eIDATxкь\й’у tІђџПь}H­‹E­І…Рf3ш!хБ9uKˆyчylиА6М^ЏЯУfз 6lснTЌЅJ§шйѓ<Џ‡ЊЅm_idћFŸЌJivƒКІƒЩ"З„іЌфjЩG(›СютьOYїrСет!*М•мыЁЂњЄМ/ЧєžЩtJwH2И6єЃxІвpо’Ђ/ qCH†ќ3жƒlj(ўЂkлье\?.žШZ~_BVВл–§D;\гˆ<WЪžЂFЁьšНšюžйЯПр)Sввыю‘љj ‡›)Гї‘`јWŸŸ?љŽlЫJ3BМйїdLћ[=”фрЋ_‹М{д„лЗ-›јЌxлю— B| З 1c ч!ВьRŠЃг!GJ/(яЁqрWЮuЩ}=˜\мКїq—Ї?пWщEZе*“n С[jЗЅш•ЋQ+ЩуС#—–P  ЫЙЎс^к‰xcГмЭ™Їn Оўѕ—‚r.јrъЂ І$ч Ш”RsЬ*ŽВнaЂKЬсщ›‚ JY&Љ_›7"-ЫO|vX›ѕ“F3LМ;Щ0MЕDŸ‡w^ЄKмщš}žXvkџеВ4:QL/Я№WКr,Яq­dЙШЖчYФІ›м‘7Ош>чЃ„GoУш>Щ6аBыОћmŽб5ZVЩЙRхПТЃНЪ4’q8&=M[v?„#<"}Ы|OsяJЫ*НT6†X"A ДїБоK›6ѓшr[ЬYџ%№абіиЅЯ#•ŸбPqIВ‘˜›„Г$v='Ђ/tZ(.H3П7№Ь)щ5’эУї6я­XњцI№mЫОУнЉЎЙЎpІvдŒд‘aъцц)с žЩыѓІAЯˆ[ З{ё єSg Ov~оМѓ$<qs ipл#:]%=UšђQц-RДRDіФўˆdјЁІѓFCдчЛ gZБh49iШЩ~ъќRW Ћхъ`99яt­жOˆfаQЦHЉ/BЛЩѕчЯ(lкj ›<!ЙжgгщbUl–YЖ—ƒH.ыhњдnц ƒ‡Ђъ=ЌЮ;џ…j §ЗY6r’ж ІЊбI*И*ВKNЕйЭME­щВ†j}ѓЙО5yэАкЂШуЯhщœWќKєgћj‡(‡!…мОыsе“ubw=мфw“ŽЎлk№Sшž)[kNMBѓŽЊЩPGЯoх"^�гЏЩqдѕ]“ѓаnЫv”СZp$’ј їыЊГџ&з…X–eYt‰ТХх:Q%-Ž:ЮКЃюar2A†TlёКЏqђН‡*I™žЮŸЭz)žТљАЯHН†дWG ќРєз1тќHдd§ц  ЗmџЃ››ЃŸяРѓГў „є„(џQ`q2Э8ћv§_2єpПЭЦ† Пй_љ>2ГЃБК†З2кѕN-1йЖmУ† bК;ЊФ7lxў���џџ�uШфDлŸ����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/txt.pl����������������������������������������������������������������������������0000775�0001750�0001750�00000000120�10411706714�014525� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/perl foreach $i (32..126) { print chr($i); } print "?\n"; exit 0; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/����������������������������������������������������������������������������0000775�0001750�0001750�00000000000�11363100500�014454� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/func_reset.png��������������������������������������������������������������0000775�0001750�0001750�00000007473�10411742012�017340� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡���gAMA��ЏШ7Šщ��ђIDATxœ­šyŒ]ѕuЧ?ПхоЗЯ›Хул36Ц0Ц6`Œƒ‰cт8`cHи‚кHmЃ6jЃVЄЅФ‰(j+T…($$i+UjЄіЈДnР@)˜m8%5fБƒ‘™ёx{і™7oНлЏќоѓloŒ ќЄЃїtпНg§žѓ;ПsŸрS[пn"Щgбн@† РŒcФНGьЃќУ“Ÿ†Tё ž•$w­БС&лХі'3уcJв9qyрUŒyС!ђо~xМєq”јx$w]пnA }ˆ"P.( Rƒ3Ÿ1˜Ђ�Œэ‚`ЂЃэ"џ§g˜iіЇl@њС›@= lРDIB”ƒnН З§JDj2–&‘ЩрЦуUх� ~ХЃ\(–ѓPЧщС;ѕŒWЉ@*т�†Qxє њ јz’tѓР. E 3 P WрДЏЄуŠхtД+5B[tДРТP‚ТFѓpzЮNРщqш‚С“g)Ÿ<ˆ?xфЄUG*0бјСCT~аћЩ H~s2ў,BЌ#№A@|љg‰_ЕK–ИlZ 7Џ†Ѕ aabDЦ" ьЇЁJќ�&ŠpДіО П>g†Ры}ƒЩC/•&AЧ�ђl#џиОo€ћрхИъq;|œцтн[щZеЭ†+рЎѕpeЄтжлQ~^�žoН?н�),ieЉтУСу№ŸoСў^ь9Eўа T?ЌЉзKhюЇєНџИxlЂО dёЫФ/л@УК;йАJѓ{Ÿ‡uЫ ГŠљ”*0’‡Щ’§Э“ŠЂj@ТЕ†Ч{}џ№ЯЏТ‘гP:іћŸВ7K‘ЙТЃџVŸЊ+%Еk5Rќ ˜NЂˆфU[Ytуv~›цOЖAwФ]({зНƒpjF&­ђABс<фљPЈ@Ўh .ћаЕ�ЎЙ* вlXLхЬLP)ЗЁ7іуПўюpKЌљgРgт+6вОaпМMrпА ”А8>3 P([Ѕ"c#r>хУЈš#Ц~ЏјPЌ@Ощ8Ќ]jsЅЏВœ4•С)жТЦч _9ПщлП‹_%єIvoІmУm|ыKАуZhLЦzЛoJ>8кFCJ(z„ћeЪл~hYŸЯЯ‡\й>пнaЗŠбмЦNJ}(‹[ˆ­пїПХњЄwнKрсЖ.%Гў+|щЩн7XхУzрьИѕL) 8ЪBCIИЊVuСЂ&ћмXОs~*WАМNТˆiЦ”rxƒН VPоы/ж1р…лќS0BЛЄжнЫіM-|уhЫ>8c•и]fЖ№‰”<ИљjXйinm€KкˆЌЏrŽKZрУГ6.Чю#œ)V 7ў+СО €Љ§>yйo!Ф„‰+7Гjэ2~g4$­Gп?i1oŒ…„X ЊŸc00й$t,˜‰JGСъKЌgН`ъйљ(mrЇуАэHЄ2ЋЖиЊ„hA‰зxW x0ƒфAЂ™h оu 7­ДсOХЌЮŒYЏјсL "ЮйЖ†ѕzЕ9юNх„|4љ!фЫV‡% [—[ДміR‚$w]  hP@ЎЦїpКжqэšЖЎБ˜(Xш�ˆY퉔0^ДхSˆЊAaэЋАёРTyЁЫРхэ№с Єёš[>Qф И xЛЕV*нBjљѕlXЭi‹зуУVБШXoз(26Ьƒ9№ЃiQ™Ї3uЂw!Tєl.Дe@7w’ъX‰0!BЈе|н‘Zнe‚ ЉKЎІБН•e ,nO AпЭp–g08a“VV=ъ‡6'ъ­Ш|Ь�1m СйIH,щІtњ=ђ &ћач5Mmы…d­p\dsЭае ^Gњ-$Ђh&Ў…АаЩ•f^їУм<HЦІz%y‘D‘MhG@˜mGК ˆB!ЄМEkGo‰TˆD3ЋЊх/W„ЩЂ }mзŒŒUЬ�CжИщоЌUЅzKЩЉFяb „‚ SЭЈDšА8j™FЪЕ@9ЄВ,kГЭжРИэsќШ*vЎ73SкlEjеЃоЊЕвў,j­‡С*X^Bи‚s Фp›S*cЄ\Ќ…T—c"„›$‘tiIУxž€œЭ…г ДŠИxžeЊІm…~dK_й&rњŠŒ…Ѕ7 BІZВ л’LЋЯЮ:жЂг€nБзЅlвBЉ%D•jЁ1уslЭ?=bБ~елк›рю АЄйv OНaЁwЋT!RЗ“6рћSŠЊйМОКЩђxЋўaЏэhе,#Єз}TЊщИ UƒRЁ]ЄДXЮAБ<•ŒAhKйŸне]vi\Б~њ2Мгё˜НovЕ:Їџ4еrщn-ЋЇ"|§eл =mV‹” ЬTџ%•ƒP „R(‰PЉRZцуEъШ@h шУgЛЇ”Џ­%-№РэpеЅ0Y=ѓd іЗJ•я—o€/Ў™‹ље]АЌНкUŸ+ћЮљŠ…šT Є%R!ЄB)i'"в6l§угvBsъ+–NРwю„ы–Сdљ<3aљ•|јн/Р}чЛб`L„іо3pt�ŽYФc 5ЉR -„EЉЌё&)ћ!•@˜„b`|BРK‡|6_ЅH'ф‘ЉќщNЋрHЁОZAкol‚эkчSžz­ШKc„BRіЇі 7fУ!0~ˆR—”ГpчBЪЅ`h\КŠšЂ'GЋЕ;ВpzџД!|6vыК‚у.lXaя]о6•pЕ5YЖЩПукљwтC=юџ'ŸЂHиќ“ЖЄЋъ@*‹\пћxЙ„RЧДђ!и,„ЁR.p6Ї%‰83Ж}Чбьў?(z%И-F697ЩмyН6{u6УтІљ=џкЁќмG$3ЄъјШбе,№rCHэ€ƒЅ~‰’DD?ЧЉ H% ›ЧЗJёФšнojўfOožluu§VаsmрpŸЧwїј јiв)qNц9йq+пuП@рAk„ЧeО\ўo!е "ƒ)Ž3ZБ‰ЛЈйŽ9Е3EЎ m ^9ъђ­ŸЉx5ЦЌЏќ‰ єFE†ІЌœ#SiыPз'Aq"ƒ’ !фЏ$ЧюЯ!й­Дfтt•’ЧDХŽу1ЫФqЇ‘MYХЏOХxdO‰Щв0ыЎЗ•јЋ'+D™F2)QW–ыB2BляЅбŒ‰@ŠУЙРЎT}@:.ЅБ1ЦOє2RЖCЇlЪbЏ56h^9Іyјп фЫoDп€Я_ь.3ЄЩ$КŽ ]ѕОж „Ѕc'ŽЃь.ќ4‡џ8/<eі!ФЈдšЁЃ‡91Paв‡ЖFH'ЋPЊC­Э.‡“ќѕžCѓДЁuжoŽ—љЫЇJјЉ,йДДUfoЅ­ч›г`„EТщCёŠ%ЄжЬ/ z&.ПљЕ“ёїЪu(х&ыяgЬЗ7ЅэqNx]{­1Ћ8pжх/V(\@$Nћ<ў_§~ŠLZжхыИѓM щB%7ЪPO*ц€яц№їСДБJ9Лe"‘М!šKу4vu‘Э:dbЖўњ‘ ЃšMвIХщIХђЌНT“Žз/7яє–yјЩyЗLJыfg“Tа”Д‡˜М‘„ž§‡?;Œа:4†{ЪћПж3У�†žї’wЧЅж7W %ЏLvi'1ЧжwЧБ[ЙЈ#TJˆЧ%У‡C'*Ќэ”Єfб;рёУWŠБ Љ„<ЏђI§‚О„ОwŽвѓж{(зС3ЃПњэЧj|gHЉф~d„xUЧ]{N3№a?clJТ‚tŸu0Ћ4f§^œGž+08-'њG=}ЁРЄJа’vМ^ѓZCKкЪ1@ЈС+–9~шЈUBŠbЉяOзyЮ–гєЙ':ЕжЏ‰ЫЅVЌЙщjЎ\П”Д„„‚r�ЙŠэPчлА*^D–"KR!ad8Uаd’˜+ЯЕФгWdРUCкЕыx�gŽђіЫШ M ”(E!_љхн3оЬйєЫ'žЬ%—н7$•мEQlєЬ0ЉЦ’-\ ™xѕ…†‚Hи*e=Xƒ€ы <э2р9ŒF1d"N,&fРFJ›SކLZгŽйT>‚‘<іюglps�ѓус_м§ws6зvЕnйs—RъчQ1ЌПѕ:VЌэ$у@FлфѕB(x0щйsCэЌ,˜лАsю}Ÿ= H:‰ALйпŠфBшячѕ=oPœ,ЁД&2цбС—юјN==Я7э[Ÿљ2ШЧ1ІKHЩЅнKИnЫJZš\R ’еІ+ЈvЌЕW%œšbР”ТЎВЄЅ§t”MB/„ЩF'|о~э}‡ORœ,#•4ѓшй\љоИЗю{фp,міь%еs@<№šлВЌлМ’KVДвœ„”ДЙPc4}ЪVJкпkяШjї`ДgŠМљ?ябћ~?ŽЋ‘JbТшлgіюќољєЛ  MћічК…”?‘B~1№CДЃXдеТђU‹ЙќЪv$ЎДPаUІѕ *x‘}ГsМwŒ#яžтTЯ ХЩ2кеc> 0єяЭ?їЮsЪО�ИawbqkіЯќ!‚Х"ЄЄea†eн‹XиžЁЉ9ICк%“дФм™оі|(”BrŸББЃCyњŽ qКoП …Œ‚yЪTЬc§/оzфBдКшП,кљlRъФ§Bˆ‡@ЄЂ0$ кQhGтИšЦц™†8ZлВiŒЁXЌ06\ \ђ ƒп @€ЖЇŸаDfЗWёкЛ§УвсP[;^^‚Ыч„”7ї�эІ ь(2„гоГкЊ$R Њa‚"˜ТаМ,йwъ™БУ—Oе€щЋ§žч[U”и*$ыД Фi9Чп ŠРИaCt8єƒ—Ю>}ЫћŸTіџь“ъœqЅё>����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_win.png������������������������������������������������������������������0000664�0001750�0001750�00000043510�10411742012�016466� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��<eIDATxкьНwœ]Wy.ќЌЕї>}њH3вŒ$%YЖхоdу�Ц6Ц66и$”$”sЙР мpёН  pI!8”�Ёlƒ{/’\дGвhFглщ§ьЖжїЧnkяГЯH–5@№џіяœй3жЬ9ыYoyоч}сœcхёђ}�Ќ�`хSXРЪc�+�Ќ<V�АђXРЪc�+—ЭC�BШ‹?ЖђхЗєGкЛЮрLт GШР™g№‰]&ЊРаЖеРš3dГšW™tАІъћШ‘kўюž2�n_+ јM@эЋoYЏФSgzmЅdЉІЯ‘РN%„wЁQ˜a-ОЎY—ж�L  fe^KєЌGЛ3лћдтЋїНџЋ#�и ~PЛїkƒђФг[™НTж‹7­t&IІтˆХН&`h€Ўк‹Ўк—xV­ŸW5˜:‡fъвѕе›дWmњб<‹?pўGџuъх†_;�ЊџўЇƒR-{1е›фzюЭ„ЈID@4ФR@$ТL№рbтЂk€€u_794а л@h€ ККП‚гюШїnљўŸ~ћщ<ЛO{9К‰_ �rї|ЅГ-s№rVœ{›œ9|3сz ‘(Ќ…O�‘ Ф€HPЂоn74@S‹­РрƒыКЕј&`šЩЁЊСЁ6�]]qЄ.Йіюќрyж;џъ �њЫ ПR�ЬџќЫЇє,О№{tzЯћI~b$ ˆЗY‹ЎDэ…ЗŸK’ќ;н]`�Эжh*LУt Л�А­}_UЕtіЅаvоЖoюGчпојЙ0lїА€“є щOПђсоЩЧЏфёh"qo—Gœ/,ОГўOНс_tзЌ€kt@oР0,ѓЏ›№оД^ �ЁбАў™Ћ ‰K_ѓљЇqЪЗољ‰џЛ�ЫcќжZњЋњEпљТg{ЅЩг‘­…Ї@ @$€Rы™Hі}  р рмКГОŸїпур&Р9‡}ыізŒX?nŸsћW*РШСtч№пџьEГO?№Фчџје�bічDV�№,Э)§ЊHua5”ЈЕр”  Т=jнЃ’�ЦМ‹3&�‹@№ƒТХьл\xцмЗјм G€ЖџшБгЕЛ~xп]я{э$HП ј• m~їВй�ЇВНЛЫйѕітЛїЈo7[ l‚3Sищ,фЕѕsЮnчŒ€ћ-€§Z\x&B�9 я+`ЂHЏаc[‚�œШу_џтЖеЋ ћЏ…$vКГл@8` Фgвэноlўƒ–€qїлЬv.FxаŸ—сАм7f“�§ЖW�pЛѓКО-‰ђd”ЈЗШтю'‚K Фѕџм5эжŠqп"3{•ФЏ­-,šxЦ‰ЯЬ_7Yћџ5u@ш3о32   @dХœ �њhљѕSСнХ&ОоєšH~ГЮLыЗБыИп€љL<чм№/юƒmt0O={іЉЛВТ{с�ШOŸ§Гзн}фУяК§ыˆџw—�W]qЙв1ѕє „РсЛ NН]яИ‰z ылЖ,�ђ ‘ ;м6чŽY\b<ЩVС$РЄAІ�дд�h�и}Oџг;єљ_ќ№Ў/}гькџр?ќч‡ЯГ­]@Шу“я|уІŽєОMžљЇЭfп эћ Эщ^азѓрe­&cмЗ“­лBJ(.6kv œм�X‡‚I•PЖЏ�œКџэ*cШЙїБЫіЯ§чŽ/нuгgо§СыWй1Y€`ўЅщГ"z1I X�)`lџO%€pлф‹‹о*рѓтТ-тЮ[LПyч!™�ГSE†˜ы6цќЫ‡†”�Tшwќ№ѓkцЊЯО†P@oФbРФШМє№уw~|№ђ‰=џяЮ?|лѕЗ\йі›–2оЕы3§пюOоћ‰oozќŽЛ>ё‡ЗџУњœПqЙЃZ:ˆмл)3ў?`і}ж hўУ>оlьэm†ЅvA“Ь ˜џg ШЕЏ™дДƒe�u�—ЎЉ`МS+[Ш!ˆD�j{^иЗzДgпЏ~їЋОчЖПћ_?јїћ~љ§oо_ХЏЉкј§g>к‰H[ЇЪлпѓффW7WL'&v;ОrХааЦ№a�ЕeРЗўњЃЋлЦј DфРNїœjCф‚QΘыc�NєяїѓФg Bу�б0Рˆ� D™ ˜>W8p wˆ€*�(Зp,0ыРіч>}Ич‰яŸwЫy^uЫЛ?ЋІЛћ№ЛП0џЋ�ТЯžџ›^I1Я<’Лџ†ƒеяќ~%—юЏзLР4@ЭЬ †^MШ�VX\N�ˆЙ1еHwC‰XНШ„JюЂsфаП!d №%г?Я”›рMVСdЭщŸѓыL 6 šЯŽЮВП @\ЗV"‘ЪЋЊYI2V!Q"€ZгБdч™ёдЮяіЏкPљЧ‡nљ.+ї§гпмі§s“Х“VmМsїЧh‚єЯWw_ДЈэzѓ!уŸпPUgк50ш&`š–—PЏ”s[†NЩGŒ5Y�ЋT–�zc7аƒu№XЛЫюY;žи@С№�-ЧЬ@@Œкќ�["п&MЅ}щ:P]Лyђй<<c›џ�§+пјјЅOЮ§Х™DВ8)bЧЋФ’дТэЗB@e ЬfвЉtiтНЉdл;џшkэ“m‘гvPЃѓg’кЙc~6—ŽEъgоћѓ% N?й§I5Ъ’V—T2†В#чЖЕЕпtTНk3зжЉЩLЛžЊСд­їDИu‰яЏšх04 3Оyђ—?н5g3›вВрЊ+.W:&Ÿy•�.,4wќ? ј}зџ3С0џт BРcљˆtНІx )[�L L"y@ХОъ�xЁ:v­ 4PgС]ЮŠд„}Ÿ�T"dJ†^ŽЊ(o.™3›cJьэбDЊлЩIPђџчГJЋ’›ћІя}О7uŠ)Iфjcи:x§m:9^y ‰JmJ':­wаŽŠR"‰СрРuP07Йр%‰•@iH$dоЗxxtd<@`,�>њцk6Жќђ"QЊ'rџ$`ў!TџL’ „ЄАюs&.8oЦM‹ ‹Yƒ №ЮvЕwйў ­9Q ? аˆЕрcYb[ъeВ0|K$YYށj’вF]ЇI%Lkшьx­D‹ ХръUШ“'KЦбЎD IŒk0Й0 ТЃ0И 0+‘Г>aёMыkЮ�­T2@W{:ќдє€<€"€њrЅd}_чЅЕUќ`гЮОМE‡Ÿќ!т;cЭ рBšЧсOћx џou ­?-їмўб ��њЗОїХЕE~шZPЫ^ЦJq]|q€AмbЇe)ˆu‚ ”HЈ‰*ˆ*)Ш’ YV ШH’„˜в‰FAˆИжqfE0рА(rGfњCІzž Qњ{O›\АPаX.�HЩБЧo–8ѓв?HџТ@с@™‰ЛŸЛ~0шнWыw"рј…8�~ГяІ&щ\3R­зKBњgђФk+8вa6‚oƒћп]№@\�п=ћЂжxї};HќY�œ3pnZ !ыi=/a(Ћi @~^йk[ЕЂмЫ€o}іуНГ;/GDія№ фƒаfЊ—…™}nW ХwЌяs?U ,zЈяЗжŒ#йЪ„§!UlѓЯFюbІ�Х9€Ъ~So-ІчџнX€rЯ*P�т‚‚РзЫс‘ q{Ч3Ћz!\мKˆЬ�yjg5ЅE еžbc‡fЧЫІТu 'йќЏK№-)-гc…Ъ’'ќ3џЎ%€Pћч~В'Рї7W yРФ“цЂ DbєЋlj�аіNЬи?uЭР*)лиџ ЃTгp=šЗѓН Яw‰?ClнK(Ѕ-Aр|ЯЪ…EчТ3gЭЌИq‚F(ч€SзU™ž2 �_�є™йыЈ^ГФ4Фд“ pјр ФЗZЌ%7Р}е?/џї—|НКП'0fэ-]д gL ]А-@ €ёППєОmErpЋ^LјйM ƒˆСЁWйnЖ�‚й'ЧјФХцЭ `-cdŽjЦЊmЈхдrЙRДп[–жёфз6o”{в{n BЅ^Kтїд?­ЊТН0ЙWsљ—Зvvњ7С“#іЮwи?FхЦеzЄ†F‘јЄŠpпїП�|ЏГ гя]дяџa‚ћЬ?`z‡йl0MЈ,ё˜‚щбтa!ЕU— �пИ§S›;ЫЃ› G§%^QќбT "Пщgk ьІэ #‚|џЄТNџLLM|$-6Ž^Р9PœЈтљuwW;ёЋcаœИ;Z\и%­�Е]€•e8 юФЖ§В"жЄ†sНЃQЪY ЇkЕ:6:=+И6mЙЊЄЃОИMбŠQюVџЛоке?„аПMEыM7[ƒцŸ1">ZЇ}ЮЯk*`l<3ћ№інGѓЏулЗ.jЛ^Љз�ЕЬНjЕНуЉMњ @ ;>$ў-єЁE ш™~ц˜|GХyЈ@Ъaыy ^жєœ1=9>—ќПс0'�Rчтž›%fњ>тѓћ-ЊL ~н…7[ЫПњ7TмЩ}й"gЭ$ 0IS‡MгЌˆщ_Њ›]UфЃ)ГсmqЁ!ьtgС]‚ˆ"њSНуsV! bъчЫџЙŸ8і‹iхE@–€Т‚ДЯЖjŽk3–Х<ђ_пд5ЗѓЕP$ŸŸчt‰�0,§ГWŒј,o–„ГfэPмщ“‡!P Д-ЊЎ�г™Њ*�,\Hc@qŽ€Ъhэћb�BР‚ує§‚џ‡щњ„8@L§|i L• И�tДwАёбє”Xиы'�$Жx№œdy"%Оу›_š?š5џЭщ^39фљі@№ЧZƒ~БЈЁXЗ^л=2qTјдЕЋЅ‚vш ЃTЙ?§ЃЭ&пGЕrмЛb.DўЮТ›ž[I§іЏQцЈц€ўUs;Зяš ІЫ�к…Ъe8xАУ‡†ьzчО ћцџNDQh >pДfX‡‡а MЕ�;§г�vкЙSŒ/ˆтЏ|уЯЎ*№с­zУЊўљvw‹œП)ЄVсШ5љ ЧсѓНяyЛоЮмXРє@~M,8jыcMа ‡c>зЖ,’Аm[OSкfŸ=dиэaЛ_�и‚уцMЪ гї=/Ш#жХ–‚_+`ћJ и›­ јH>“}сB#ZEЃ@|1+h8бу{~З�ДfўТу€jЦ�учІœЙ…ž`ё”1 АЅ4Ыиїќбс€АeY�@О№ЁпПЄ3?|фX з—Н�~`Ўюѕе‚Ѕ_ЦьЂˆs›{@юїїA0ˆ’г�а›ТLYЭ?�ЂёќЅ @a ‘�Љ#>YARќi‘ў-ќ‰О^ў:8шѓEѓЏе€rш_=XŸžJЯ‹К†х…’NНpAŒ7ь€/ЄЈI .йN’ЄЗRўŠхсрт’Л=ј  Љ•5ЇЬнѓау#Ђјѓ{?љЪЉY}Я•zP+мЭT!цћД9є3„шџ˜ ќYџwмЃ}ЙU§Пi'HЎ—$Јъ`pѕ““у3щ��јr�€vжgn @ Рkі§DŒ дiвћ5G§ЮъВ`Doћє0UŸ №4‚† ;&цŸEЕ›jвtвP­Kм§VЏй Pб"`єO_HlBЩЫљ08l ФъŸЛoˆ.•г‰Хьбк§k2џ' �?ћЪg7$ЧŸМх˜ўŸХŸ”ЙOўm†Hx§єoгюfЧЮ�3Ь”Ц�Ршќ—ѓPš%  ёћ}Ÿ(Ф"PЏ4ќтв?бjиY ќПум=у-КлвІq”€ЮіОъƒї>s@ЖhaВГ“�ВЁ\”ЊN'!GšщпІњ{џ™'щ†iиC€І‚ш kрƒЁYcblKС|э^$ bw(ўqЫЄdУ6<Е8)RЄёщлRecђ\SЕxtQќ‰€hЪ§‰X§#HkШY ёkБіяj�Фт­јqMП­*TЫ@%ЌY}J)—-фькЈљNNЗ+.|ЅLЙпџ“@чЏJVQp[+ 1 žВ>qIБла@jEы•2@)˜ІkL†ІRp“nT�‹eH,  щ@nЭІбмП TШŒ-чu]ИЋxdƒЁІЮ!E) €юkт D(^dюя]ђЧЗјм ƒšбV3vш і:™HџтЄрОћїтm {Ў‚DBT> d€* В( :РU€0˜œ ЎR44‚jЕ“œp0ЦЌн Ч ›]HЕї"йЎ!n”!з  хxЁ­ЊYђAЖDњ M€Ф#5 jџыцм­fЂ†њ‚gР|щ?ычЛ/юtМX@(ѕrзь3n@-тc+Ћ!(.pєvїђс=ГУf“-�Ш›/кД­gзЇCŽљwО=ђ…H ы�ЋхUфвeфsuTъ&JU†\Eƒ!'љbE­$ћO1G-”4ЕI$ˆV­ВžT*Б~§КN=;­tЧH2 н ŠіаMЂГ[^Ћ#WaЈы&у!Єџ2 Рьщ6іŒ7)dШl~зЙЄЫJџ$%`цCJН ~ж„“§ѓЛKш}ћR@@gї‡qџр€^ГФŸ§]ЙŸіБz+йљK@O ч+Z<кц-К,q�ЄŽJzГ39фѓц+‹шlŒ5”й‹ч3+Ћёђи\63>[.жечUлT™ж p NА#MЛк’‰ѕ§=Cн§§Hw/UЛ‡”њњu>1aшK]н™ СB‘У0§z?бBш:P_wjюљ;Ÿ§џзПѕщ ЃЦзOЏх�ЕDш>ш šиA~\е?GщY?QФџЯC(д €Zz6 Э›цhEtm­№Ѕ€ІВоh}HH(@ŒЂ\,`fЄ„йœŽ9ОЪчцЦUi.'Ѕ2<Лo<WЊ:fIІtЁš}ЯymкаЇ�ф|ЙЊфЫешnЋ; к‘JЄ^qњ)Їнп|–^9m}v,>дСБЅ˜-Ьф9t3ЄA„Г‰ОіТЛiЌЃњFНœюЈЭиDž˜ї Н�NХСК@ §sшРуc�ѓЯƒљП]Аг?ПZžXЌ  ”8RёВгdїё˜џ— €ћПёїЇЗяљЛ бп•)˜š.b:Ѓa}ЦЮœбшє“'GЮЬк>жщЕЏй~ЭўХKƒ7ЃлŸЂdџ­ЛЃ% ^Ќдї<;rєрЉU]эНзСљgiе­TFзoN8gY ˜/ZџŒ&ЃxђРшЁ€іŸdЪ‡_Iт@Ѓ`iџФ:?KНТЎЇФќ‰б?%­5”вІяСu�Ь§O ™иьс€–Ы3TKќйžZU}ќ—ЯŽ˜MО� зW•e=ZЧс5ЧxџтАxќhўРид aЁ+"bЂXpн3џОй|bЅ] РГ1XГ{кгљRч=РCoўѓ/Н’еЎИА6кЗЅЯ@W88 Ј†ХўЉkћЊSЃљБBіюїо+щЗЈf­ИU$z ˆ?EўЎ$Œи=YЭЪожЉŸПV`эxгŸі9љПЛћC$рмrYе<pкщCљlц 1§3– �Џњу?лѕŸў№ЇвЧЎyЌЪ‡яъ…МН NњQАЏ’ Дi8Л=бжЧ.ЙтЂE.’?ђС›‡І ›QX* œОžащ-џ№CїM_|СЉќsЛиР V!j! @ї}aў‡РЗОтЬ+ЎЈЏЙDэКl#ЧОY`d ЈЎл29ѓФ§YQќљЦЗ\§š‡'яЊЄэоПhжmngDаџћО>ёЇф…Pт >И[sД^љ7иaс„ šх PЭG†[‰?–#ряџы/§Р~ЛлTВ;/ДUдЖ^pг|a)ѕž%ћжєЪ—O‘ОTŒžQЌ КkTZУ8ˆхhшЛFj=^лАѕжl‘Бм‡ўЎЖWkhлS }ЊЗS?thч?}ѓџJЕPВ–А�  РЊџzђ@ц‰јіџyг57oЋьО№‚Е бИ |Ѓ&э>$�ŸЮnПйŒ7 N ГЊBъќh%џ @�mY§ ЅєЯЗѓM0nњYqгЫўЌ8ДЗuїЬЏљЉ�ріn/�˜ДмДyiэ†sДџёЩOžгжб~q[*z}2F6EBЈыРаZ‹щHYЯК DdУДОN%HТ0IBешК†!k‘wфMЬdИБюДџoЯ_ўУОлнV{т#яzNА.Ux9�щj­žљьїю[Мфœ3ЖоизvCз`в|tћў§іп]Бп/ю;ƒvYDŠЄђzкl,З@МfPŠІкў‹‘Уіќюю‡Uїw:ЩУjџŽ%pвПСоОтУЛ‰тO}9���хезўnь o§д™*Ю\,&пXтђЖСu@[‚ bQKЋІъі hУЮЫMяОЩќЏБ‚CЁ šjЪ›Fф%чјыь§=хы’w?ђб?Й)kПё† Ц€мŽ=УљРaX j@кщ§ћю§§i{K_МА–e ’Ђ§0щ—Ћф^я9~іЏU№1њ‡гёd—ƒ™з‹єoНРЁVЕ[ЖޘцСуJџN–0ЏМіНъЕЗ~њьЊжu•ЩcяžЇCБ(Š‰�ВM2гЊРq~ьЫGпТ.Ž0ыЌ‰„sh•йПзИ$~ЭЦЏœўќ7&џvїЎ{№_§c{б36��эћf•НЎ*OХъ‹№ЅyсњўqhАњ‡P�s34ђw{џL?щУ„šЅ ™ˆр№оХ=єЯ\6�ќэП{ЊFьКLAzзЎЃє*J1 •�bKъЈbнЩo8ОХч!ƒЌї*zŒƒ™мВ 2Ўjиѓ\upЯ є+kжпјоџѕхƒџчПОљў;їяzФ „ъЖ5ˆиLЭО‡Хъо+IТŽўЅТЯІX€xma'Р§ћ]ьВЏPёs›AСŸщWШщu‚т<ЧЊžСкі_ŽŒЗžL�§оьew=ŸќyЎ"u'ЂоЂGoњЋЌo4KXo~S3ќгОИ;дЉ‡sЗ)дтЬ%B Ћ:Ці5Ю?Є|{лыОїр~oєЏnџГ+v й‡SuвЭHAKЏŸ< H уNкОћƒ•?Дъў=Іœ A!їяx_ o’DˆZ€F ЈdwїТьЬXNд5“w"�›“п2Й(uЧ"@4пррТKі…‹-Жjѓ №†…q{‚qпЦA@ (fНћЖpе­НџŸћЋ›оњБn!nQ…ќX’пzGЌМ)[)‰oГ‚Ž фKŒјy�$/ІўOеП@яŸ хœљл#„g�ЈdЌ8$ŠѕG^LњїR� -ф• ЃТм'‰јg?Kі=I€0ЙЃеœž яї†"XеAk7xЛB\РѓˆF fЧrБљjсёолњрmГйц ФїЭџф=љ“ЇяnќЩjх’ч+щзTŽD‡ЕMu“E !СљYzњ?*(,Ф‡‰?-`„t§к›Ф,х ЃН[єчі [|9�@ўх›/œ;“OОТ5їД�Ўљwt{XJЎbwM?s•АЂ%рИ/Xфe …˜ИяЧc[ѓэ\XƒŸІc�jуcг“w|mЧJc[ОžдЖ,ц'e*G4HQтVј|-сBД~ЭfПхрЧџлfпIƒНЬўм`wаыE‚кЖZПз ŽN/ДвўŸд _я|mІ"‘Ўvџ—‚ Мз„ДžЯšР›ЃЦЙCrW§Ы„цnˆ§=гї@bkЪЅ‡ќЎ  л6‘NƒЄaяšY�ьё‡v7ЄЧЄсЗПћКkХ=WfrгэЉ~†T1lю§ГLХRќXѕM­п&8a Аg1НLPžс(Ю�ЙY­ DЄvmЈwѓЬјЎФ#Іi:ЌkэxЂџ€ДPŠŸO%ълщ’#ў!~HЩ/сžцйђ.јмv6“/�1aзsWљуМж4Їmœ?њЃчFc�№fњ:влК"Њ�*Іaюј—ЛђбXфбыпtщkˆ<ћŠХ…™іXЏŽЮЕжQF~Ѕа‰uўXжСк§ЁDЉѕцMЭDЃф' rG9rгх“уL!ЋЪFЉѓрі''vg3Яхь”vб&уъЫ€л>єљЖЉДпќKі‡ I^0(2АО<Ÿ'{‡Y3єЙ€`!�ivŠЬP.=sXXt�“Лўя–„љ№лєјѕїЎ9ѓЖgэфHyЕЁeќнЇвёDьбыnКb›"-\–ЩЬєš‘ЂмЕHЎЂ)%fWў…dWљм‹и—=#‘R ’D!+ж3ЗЯE0tšŠrЖŽмl ™1Žь з˜œ2Й‘Ќє*ычw?3џќшс™9гœЌ Dз<€i�Чmў_,�ШЖ+оxнзя Ф‚й'Ј`Ћ ъ…&kіŽI9z>гѓыpв@зфУх,0_РШ`h] svfпŒ7�=єуЖ‘НŸК‡ЊћO/nџєž‡џЧ?љПяЛ§ю†zИъдъЕЦтПї№<!ф‰ѕC}ƒg_<xQЅV>Н<Zъ4ЅВя5аБЦDЂSG$A$ЪE Щ�‘ˆbХtAS ˜hu ХBљљ В3ЪiРЌШˆ3™Ж7њ’ыkS3х#У‡KGЦЧц™Йр”гЫнЕŸѓі}§Хlъ€§б‹t&Ѓ-$№ѓ.в”ў…њz,@дћ31єЇ}~>�nl`)€84ЭРкОйљЧк1-JЄˆzреjхаЉЊЯ“LіЫ§иЛЖ^лЛоњёзНу?яДєeћ^фœїLŒЭЯMŒЭB:зЏ^НёŒfІОЉ6V[EЃF‚Hѕ‘uХ$U™AŽXXnmє†еЙ+SšЪЭˆдfГW‹*h=’Ю/sG'+ѓsгЙ\ЅКГЪWmГ^^ЌВ:У,еc•~_*�ф\%~‰,‡Gџт (ЧєЕjнfvqРŸР]x7 А›3ю gеблuјА KЈр•ЬЎ7ѕЕ8<kq:іьпzЯс;Зџєъ{'цЂў–мЕ_�SmlаС9яššXш˜šX8 II$’БD{gЌm§PЏЮђЩ‹/КlѕдиARЋ—A,EАnэzhtИP)щЅBЖV.єRЃ^гѕ…чмА­CZ‰ яŒЎЋоpЭй(Wyщб'ї•ьТg7�ОўOOёГ}m—F€G[d(š3Ž#џЮћgЮLля;C \яK§МЏ ЃГг0іьўйQ§ѓІ›^Ѕhхс+”n`1(ВeЙ‰#WвQо}џЕkWХЏ~сЎз§ш…ƒф/пѓБ_ˆkоЎ'$эЋ @ŠsžЊVъ‰jЅ››ЮG�(Я?љХ.U ЧЪŒ:1ˆ)aœ&ЈІЊіы:€zwWЂёХПИxЭЅчwАœн§v-rщ}ŸыXѓОЛяЙпРKx/�ˆ.ѕП6S–ЅюvaсEџ$‚ЈwьŸ˜вAtBєЯЉŸыџ…C ќQ>|ќ�ѓYыYзzзцJЯя8И`›Ю �§­ozХЉ‘ЪWГe о�т1oм‹,HG:_Їхъ/пМОГэКчяМќЩŠ1tћОq`ЧПxС‘Д•Ъ$чr5‹іГёСьХwQAhё˜Ќнђњ3•?њнчЏэ)ПUвG.6;xО[\йuєmєЖї/о}Я§§bИџ€4‘NœG%в|ъ[ыч›ќм‰ ну'цо ˜`’ўiиД1;Л§IН$˜rГ#Y{ЂcгYoDЁУі9%^й&y ЅrЊV}ъкЖдЎз~ъзN~цOЏМЇЌ ќћS/д‡?ў7?­YP)‰WРИ�0 œБuK/НхѕgЦЎПъ”sЛ“езFЬ=—ХшЬnЏ6Tш&`0KƒАX”Ђ`d,S†5їп<žкџ рCК=5“O\‘§баї//ˆ#с“М˜`šNё№X>—оe‚E˜{ЋeŠЙ`1 ŽŽv`ќш}ЛъдK{nэI�х)'uЕПАžЁŽ”pШі!fFMв E•#%оїКsЛч_џГГGэ~иOнY,ы*+fsЕZЁš"З}ђл† &—]АVкМyЃDЕ#фВЫ.Гu`][ЌvJLЪŸGЭЩ c$Г.;дЁл;aЊ”qK/ЁštўЄЁL/2Дw ОіЏOлъЇ‚mиr�€œ}с­зоёDb}4&ьzЩ‚д‚ Дг?8цНeЊч„к?ФEцлЧЭ‹тџWї+і=6&jџПѕЯŸытоh(@Й(В%ЧЄТюЗЖ4ї˜=Т!Q@Ж…ЂК^“9Ћ FгƒВ„W'ЂЯђT$^уQЙМБ3^%$Ђэћa<IЌ!F}Ž)‰h{<QKQ3BтЩ‘n…юIHЄ!М™ дИ5№п іЙEL8ј‚YWЉN+2ЌъяШNL–ДіВФ�d2Л@5$$i8б#-Q§kEю0О”‹2}ўї}ЌiОу€ЊъXПЎPиџBК jџзіѓmlnvеLжњ€#>1Їx№ƒН} wF§К—dЧ T" с*ЁмHJTJЪД IІшшMBЂ%H’ЅЗeЅ,фHЬњS˜-‡т€9\9gІwЂ‰k ­o,$˜ŒЩычКўаQїЧS ’ фe>–/ффW‰„™џЅSНаŸa^ шЋўй˜` р6I:ƒЙъY2 гіzџДЩw$ Й2qE+T\|AzLЈUп{ўЌqpAPHжјw*ƒH XЌŸЄ€К§e28€s",И's‡A2"16вM‚™4CWзjіЫ8ЎэИФŸ' €П§т#›GfлbбтGўЈр (Yz‘ƒ#]›t�>пoѓі™€ў* WbЂљ7z{t§…чюк/є"ЈoКљ5‘вТуч'–љ—Ј_жM} і‚S6Лщj@lщ—Јьq^SŠ€ nЃ^BўРНБЗСiјvzTmЬgфшкЬOWяпK�‰Д­П6[U"J€чЮzСAˆXЪmNџЌХ&ўЪŸ8юMЄs]‚ўвЏЯ-0їД Ц­єЏЃ}Б0=uH,‘ъo{Ы•ЇDЩьКlЈЋмЕ`dЉ ы T­т ѕЫЛБД"˜ю?CяcЫуn8ГЌQЎBQЉ3(JзЂ@ЗњчD� MfтчIu…„њwК/ј#BѕOЦРС6ѕыњxQѕУ„ь€ Ђ?mф 0 ызЮL *u�fGЌtkB.DчѓТТ‹ owЇŠ жєжbOJšКƒ]Ыр Хцџјf1nЗК7Жцrёx ЪШёіўН$�|ф#ЗЇKЩ+шW јzЉEњЧxѓ‘-< я њ}цІ—Юq=\H=щ' ƒЃГƒ XxzpєK9Лѓ5I RЗг?јЕ~T˜џKн‘m ўљџЂШУi№hжO?рQ`Bл7w„сMЧ$3{iыšхџ“ЩўЪO~Оsџ‹iў8Q�ЕЇ\џ;“™Ф†˜Rч'гOš§ЫЩнaz�Яїм†ѕГ€л“DyР˜:G[2[оО§ЁЃBы—ўЙЯќQ'дЃ[t”Њ–Tfxbші ŠCC,€шыC4‚@њ=‰oЋƒЌA€l™ “7ЁФКГѓ Й\Рќ/�Воы†dEЫДE(№:X§CЈцŸ‡+5Чм‹:@'њЇƒYэбжЯЉšŽuщtЙ”/иєo€qі–оK’ђbпlжкUО_Њ юv KхƒVC fў9x“ЯgŒx“ПсЄ€Е3СЖі—дпПTњ7‹ŸQš)_b |тРјЖ&_иqюu˜_рсјX€їgЎ,a`Ц тxД:�.ёщwІЂђeтЊЭООEˆ�Xн_ЈЮ­~рM~пЭ€ “а F0—сшщ]ƒ'vLя…џL#Ж,�јТ—юФЗ:�pX?ы5obўœјРW“w˜>&žфЭУхрЂь›s_ѕЯы€Ÿѓg~} Ё] m|ьБCТ‡ЄНуm7(ЕмЎѓb1;§“HЫEwR<Š@Pф‚Ллm7џжџЯA0їŸћІ1-е)r"Б5щ‡н=~ВЬџR� $~к[sU%‘ТЬ=i(I"gMBъ§Ф-ў •{LјвЛІŠєЏѓГšj`эšBё№сНОёЈ№ізŸ“ц6fK@MЕsћАХo5і…Љ/‚оqŒ€ёЮr Ь§qGB„Ь56™Е@щ"EЕЮAхЎŒa˜Ђљзё­� ˜Œ]H%ъ7ї-D2ѕЬЂkюPџД`Зќн?м5я<Pкu˜@Ÿ5р№Й pЉј№HРG2ЎО6FГt!пМј4Ь€Зtn GЉO ,NїХюрGˆEoлјO= ŽNф˜Ы$тQЄ ]#№OўdЫ€оі™dХHž-Ы­;}‚T0ЁСj^k˜5iќцЩWџЙ'U4LŽŽ№‰Ѓї}$QK{oщH•šГј(п@€GCт mИ(Тg8Џм§ЬEш„s'§S)цВ&КzNЉ|чяџмО� C›oОr.]UќЛ_„Ѕ…­<–*ўјHЮ}:БРЏіvО“>щCwgО<1БЯw8вўу›…чЖ (жь�Эљ}иЄъуаВУ—†JУЉoєЋ/uБ§?Б)сІОћЧ€\™ W4СЅu3ѓ ймЩ  €Мж{c]—\іЏ)ђ'KЇXBчМч@&š8~_њgг…ў^gD:‡ЎщшŸ_(sОъ_g[ќ‚„RˆZщŸ­X1эсЛ>ШЛг7и_ЗЧџ ќ?i`›ўM)#Ш—щ”ацў’гПЅ� Yˆ‰а\?ќ™з65wИЛ›ћ"ў‚E›&hhдЖя АМ’}њuнm@оЎўy;œИl_>P�О:@kІ/hФнЯЉŸщЙFм:t0 “`&ЭбллЫ*Žzџиr�€ќЧwvž]RS*ВИуЙ?ч—E!ъРБdЩa§Ь‰юsoТG;р�Ј~m�i*УњZyћ3?о/šџяћ3ЋЬъўз%b@БъќЭD0ѕ<АУ‰Є>Жа mђ§~w@CњХПќС Јa0…,‘�(дцГЂЩгgяОwЛяHЛ“aўC-РШ\зЕЙŠ‰ˆх]!эs\€Џ(„ Ѕ{ Пq@€ёsGЃњИг bПж4Ннs хr^LЅsmnc\šяI—МъŸУъQ_АЧ]=`D‰ћНЅћ§§Р<њ\8 зŸџѓРф/гd‹Њu@елgр?бдРIz хъ]WpBB{ўƒMŸAэ“‰g!3ќб"§Їy х]?3<%Ьњџ(б (GЦ…Ц‰:�жпз{kTв1Б�лќ“І`@АщY†5я№%ЈaЇ0ЬYˆ Аш_œtю|> р„`6KLD11Ћ И6Ж,�ИэC_ь\(ЦЮF‚Хю™џ@�HЈ…XgИЁV'L4 $@2$“@,(O+ 3Р0�У ЄtЬЏ№m–…1їgуаTށ5мLЯ?-ВъeлЮ‘ђ3ї_“J�ХŠЭb†DјСƒšІ€њЊ€ф˜€xe?Џ�њЬѕАјІP§ЋЉР\ЦРъ5ЇзztяШЩNџТ4фЬsЏЙтљЇ"kЩрЮ'ž�„xq@<a ƒr4€jƒЃV1PЋhЈTt:GЃaiœp"!™Pай‘баBIBБРаЈІС}’я&Y˜`%ржўбёЙэO?:!ІHŸњФniL}j#[SЩЂ1Ј;жE1BЋъ_Ћ)`bэпѕ‹Еo2ёгцЪrEбюСЃу“ЛГ'“ўm €Щ\Я-:—}МП8ш):лЌщ_zнФШў цЇЋ(4dг d3u”ЫuЎШрš‘Э.VR)œ•2УЊОў6г”%BeвжGїЊ8’Qtє&1аŸD]•‘^h@­i0Mю“ћ2�юё†ІЂП/ГPШ0щm ЅЄLЇ­–Тіья@Ј�Ф,Сђ…Х�Ю/рžžKH]іЏщЬc{,ђV7q6oЮžШш—€<“‹mVdжЅˆЧžN@Чтd{ЇЪ˜›.cnКf”ЭЈ2–ШL&Ђ+В\ЈF0W,ЄЧ Вdъщ™CЅД›ѓЄbgvЊZ$Вn№ьеjЙЛНdЎi_œ\UWзѕKбvЅ}КћлАv}Вщ:ђщ УKсыДjџ Хм“{…жЏ�ЎVіпаІ�#3Vы—?тхп(” ђqЬƒx(№аN˜pјѕl†ЃwеjОѓ`m,РlђeР—ПђащїŽ$Ю•%Ыїt04ВU<ї|ЃУ‹Ј— †BgВ§§ЙЂЬž™ШewLŒgŽцƒ—tЁSХЙРЩјб§€27ѓ‚bый�J_пiн›NЛхьЙУgœ:324 ДѕDзmщEЯš*љђ‹0г*љŠs4aшдjёЙgЇcып§цŸЏвJп}eЂЈkbњЧ}С_SўЯк‘&ʘw @|єo@b-юxг™Ю-ОЁT#XЬыXНvѓТЯю~lYвП �HбКЎ%ЖЖ`е*Ž>›ЧиYP3ЏuvЬdRђоЩbх‡&чЅGC…ќЛ8њ].q8а<э; ЖАp8БАpћ€дРр§[пwљќ­Ї7xчЊЁUшьBaЁŒFІjUmшš‰ідЬBЕZ[ПŒT*К‰Tg; Uыp9&ІzФŸю9Л›6Ї€tЉСЯђЏŸ�ВЅ_Aа� ‚ В^ѓ%@ЖDQ­1TЕŽ)aРI7џ"�ЄD2ЖM[XФsOЭC-ЭЉэЩЩє@ЯЩ‘C?=8–ƒ7чП"шбЫТы†Ар†аћЦ„ДХљю�A<  cfzxzfњУG‰Жž+~чƒл2ЏКl‘іtoXюx ™Щ, ]gŠЌA‘Еџ’1}cDб0ЙhЅГ“GšИ~—@јI є8wОЯ583qB„Ьзьс2‹s™ЭR$QLЯЉ“'Kќy,�а}ѓ]Ÿм№Ч‘Tп|jЯмзїэй_ щO/Т?њН. \2<g ўi[EџШw"€!jЯяIшЈеЪ=ї§ті™dђkO^}э'^uша%—БдP{чњ~TвyЄЧsXеЋЊ{їмНO�Ѕ€жѓ;ЎюJYьŸ,yѓ|iH-„Ÿў"QыСOОE,‘€йѓа��jСlFЧšЕч4юўСиШЩ3xњщ{Ыxњол шДRœFсьірAт‚ы!‚A,f8@pZЎуАЧОWЋЅљŸўјЯчV­>хЩKЖ}ђњ#учŸOЛ#бў(z&3юO§жяНыkgTЧў|ЋеHЩUDЯ›<z\)aРа'€UРцйA!wѓ}wœmў`БH‘/™0фшисн‹№Oў\6�ˆ“В`›ф†АлAтЂŸЬ?† ЎCќ^Сž“N/Žgюўљћf.КјцѓiэoHu:Jюл-X'KќЁЯŸ“ŠђtкњWiи"‹‘~‹ˆŸо2њ_њ@kю?q #№І<;щŸя$\ ˜ЫPpЮ БŽљ@њgbВАkАF•э Ѓ ЃJ–cбгўнŽК' ћьЮŸцЃБuДїЌоЙ8‘…5іНрhџ‰~єbрШœнЭыњ}№чЖy9ї}АƒС`‰xРнO<фйп№a2Пј“СvЏbї=3}@`џ–Хџ‹�p0э_ˆ@тњыx8cTœрв @ jЃ’]lT:эПЭ€њ_пЙ}uqюџ]АОЈЋФіџ<ЄЛ‡ИВ/_Ѓ' ŠсšП№ђ/wJ'љђ…Cœ5Ысэє� UŠlбDWп†љ'Ÿй!iЋ/зц“CvоoкCДJvРH avwЪчGєйЮBйSд’%U?жюѕwQћƒхпцшŸКCЅтOЁ2цj#}E2ЋќM 0Ÿ“PW5DЩЉ€ЎqйжEЦŸ‡Ч$ЪЖЋrbогЛfефИ„Cу&zл9 FЌ:И/­Ѓ‚K $ˆгBТth}ˆнщУC­�gf@љыŠB0—ёrE:+d6ъrљџуi§Mƒ7MЋ*Ф(8wл;юzjьѕ7фѕХ…МѕwЕq$Ђдэк БbкБkxЉ† ќЫ*BЊо№чРШ\чьljЁ4Ÿ5бн3X§Щ]/ьХ ~~9� ,Ѕ?vћ~њР—ПUћh…]О#[M™г‹V9ЛЛHЦьоE;% ]О я8Ј_џ}ъЦžp‘љ-€(§цоxљКF0•!ž�tУ„†ЕGчryœ„жяп6p<€h�ШЭЭeFnџrцkЏ|Хж ЏО"ђЦЉЬСu Љу”5@wcІ—” щ YxёXј0aˆЏыG€кCў%’ІsdKРј0ŸчАц�Ћzbи78Hm—�„sо4гўПщУ!“А&gѕ�аџћoПўђГ7хЏжkЛњ"Јah-азeQgš€iZi ,YУ"‰@–%H’uЩВl=+дН'Щ2dчЕD!K†=шЩљЧu€ш�г 6LфKЃs3 ]� €ƒro]'чЬќтЁ‰э;Ÿй р€a�ŽŒЏ�рјA@mZ9ыl€~�§В,ї]}еEч^xfуеqib€˜yЅЏл:ЛАЇ ˆ*ФЎ4Z|!5ѓG’%Ш’ Y– +D�„ь‚D–%P‰XI з�S3Thš†\QУфЂ‰й,Ч|(” N’ЊI7іŽHћя{№аpЅкpˆЏ�G�ŒУšQЌ­X€‚l3š6VлWяЦЁ5ƒoКёЌ+лc[ˆ9з&“ŠдлЮ1Дшя’q ЁP$ œ[Г Е.j_’фŒ„З†€†rЕŽBЙ|ICЖh`!фJ@CЈhWCуЋ {У=9y8“Ћ~У9жnРœЭ€ж–›‡љm€XxRькB› „�Н�К%‰v^pоІSЮлк~іР*uAКMF!*•ЦЃ=э@g H&€ˆ(Š]СГЛЌЋжЈйJнвVыіеŒ@RœаЮFЕ.UчГЪмєbђшѓЛІfв™| сгПŸ‘Ж_ћњл €V@p™юДб ]’ЄЖŽŽdћањŽўЭCmжі)бHЃ“№ЊТYUIЦEгќУ8e) ƒSVЋыj"бЫ idѓ<K"ŠћЬЮ88ЕX,UjІЩD§DUЈЌр5{T•UўЋ о_�С9qм)=ЗhЎЄ ”˜§s!П[ђСЂ–Г№5ЁАу”wЪjАœЮЅЪЫ�aƒЃCpЮŠлЯтƒ7є™Д�jЮєNG-UЎМлЏmбW�аl(ќ %GЎEѓФoВ!Х„IуŒ_Ѕy_РK„$\d‰нa1ƒ AuдoоцœЏ,ћЫё+�XРЪЇА€•Ч �V+�XyМќџџ�а‹жђ‚\}����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_linux.png����������������������������������������������������������������0000775�0001750�0001750�00000022336�10411742012�017036� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���gAMA��ЏШ7Šщ�� �IDATxœэyt\Хя?їіЎжв­}БKЖхMЖСŒ1K€�1vР@BцAfоР0й^BxH^2IШ™ IfР“d$6ŒcРo,о№Š X–lэЖЌНе{зћЃњЊ[­nЉ%Ћ[j‡я9unпЕыжї[Пњеzс3ќUC™ш$�+@EиqэнЛ€ƒРV` рIŒп„т|Р…РƒР* `йВeQ/lhh ББQлэў ќи ј8ЯХpО `%№pйЂE‹Иљц›YКt)%%%ƒ.B Йёƒ>`ѓцЭМњъЋєііМќ�x№rž с|€и�\vэЕзђЕЏ}тттЈD‡#жљ?§щOЌ[ЗŽжжV€MРЗ0ќCS чƒ�.оЖZ­YџєOџФМyѓЂ^NіpТаЮ9žyцЖlйа‹,R^\H?сМ@Њ рBрэВВВЌ‡~Ће:p"^ТG:Пmл6ž{ю9mї;РПЄђж@?б8ф�ыЌлoПЗллэŽyёXEPSSУмЙs9|ј0Р�№k ѓ@Љ*�ј9PЖ`СЌV+1/> �АrхJM� Уfр5ЄМqЧz"UPм 0mк4ККК<WТЃ/))ЁЉЉIл§1№в1 Т>A* @вvњњњ† у%“Щ~8ј{рQЄp‘ЂEA* @мЈэ8КЛЛN&"їƒў#ˆ[€пrSВ(HELJЕііvєњиЏqЎ‚арp8"Ѕ_CZ')ъІš�dkп�Nœ8AZZкА7Ћ:::pЙ\бN]ќйŸрBŠ ЅjPЉсмn7Ч'???ъ ёц№Xїx<š››c]š,кEŸ Са—FьююЦыѕ’™™9І‡Ц‰ЯчЃГГ“@`иn€Ял€ГЄ 3˜ŠˆкzйпплэЦd2ЁгщЦ”ѓ5!№љ|У6,…a!В/"lHEdХ:щїћщяяGQTUr>^QŒу#aІ�Ї�Ÿ ЁP™#]$„РяЏmцž{юaХŠTTT�АuыVж­[G}}§hтЕ8�‘5‚”*R 6dт›Э&žzъ)QWW'ъъъФѓЯ?/***Dфuбюћ№УE$€№zНbэкЕ#>#,l–#ˆtЩJŒПFи‰HќЇžzj‰gЯžхххУ’6љ.—K455‰ВВВxpИй>aH^rќѕ!›А„ЏЈЈBЂпя.—KlмИ1&a=іиАфїѕѕ‰ЎЎ.ёкkЏХ+€:рfd#•9™ rЎъ)ЅnКщІAћ@�Џз‹зыхЂ‹.bѕъеQяЛћюЛэk>ƒпяЧчѓсѓљ№ћ§,]К”‹/О8žЈ(€™ћSЊHiЌXБ€Ÿџќчиэv*++YЗn>ŸЏзЫmЗн6фžЫ/П|РсXЗnѓцЭуЛп§.wнuO<ёФ€ќ~?Зоzk<QQЕŽKгTЋ ‚Эfcџў§lйВ…M›6‘••ХЫ/ПЬkЏНЦеW_ЭЂE‹†НПООž?ўё<ћьГЧŽ=Ъ/љKюНї^|>W\qE<QQФЋЄи(ЋTР'Р mgУ† ЌZЕŠКК:@Ž8qтФ@Q BжЏ_ЯђхЫљшЃ?|ј№@Q>Ьь|DЊ @ лмYцчффpќјёаBp№рAVЏ^ЯНi^+ѓ;::№x<ДЗЗ9WраЁCܘ1ŸЯЧЬ™39vьиpё:Х`Ї0eŠHр}ћі‘““Уў§ћхЩ ЭЭЭИњ:i<А™[ц‡rх™ЭД|Дœi!„`пО}˜ЭцАk­­­tvvј#ВH›Qє™�ˆAmДћїячЩ'ŸфпјfГ!@€ЋЇ)дЎ[Х”EќрЧ`+ѕЫ~:tžЌчјŸЏуƒ–Љ8к иЛw?vЛ=є� LŸ>Пп?ьXУ0фуі™�’‰элЗcЕZЙѕж[yц™gАОsU:W_'XјU†Дrрž lV€€ќъ­TЏиOч'ЏcљУ)дљ~~Зї$эЩ›‚ЕkзbЕZёљ|lоМ9žЈh&Dс3'0ЁРn`РЉSЇиКu+<ђНMё…мЃ,]лOхU.фрнП—wЉС;РВ,`Ÿ€ksжP}AWяБ№qь>хEWtпўіЗœРз_=žxjH)ЄTЃВЌН йљH\1нШLЯЌќ?g(МРМ�,б#C lш`ЌЕи s™6лЭ…5­,Ќ№23§4Чп~‘оЖzо?вШя^ќCМq;ŒЌЁt#ЧЄRЭ )cЋМ‡ш?є—|ЋKN№Я@:N…\Ц@Ф6ќЗe ˜–`,€ЪЪуT6џZоцxэЋє~lрт яжЧеГ80!гT‰ŒчdEЊ @� кЮ}ЇsзѕF–<д‰оВX ЂSЭ%‹7�Ўє‹™ц§)eљ.њ=&і7шїŽШg5ƒ›ƒSbxXЪ   CЧWXXђаYє–Rрs : аЊu+TАе`<Л‹В<(Е+||zDLЌH‡№3$šёfA‰‘’e.є–�PЂAOа–}№…ѓ€Г њлР}<gPU…ГŽИЌЙ Јj‘V ЎёdT€fАqxЊцoРчfˆ`mыЗpvIя�gwд ^нНК*bИи‰tVSТH5dsМнKћ;хзє‚їЄ >#јѓРo•#ѓ|С�\}2x§ђ:/QЩ?гЁчшY+rЌg\И9sиDŠЉ(�?@kŸзvz(кdЃxyWHx›РЇ€Я�^5xм^_ˆpm2W ђН>…ƒЇažy=Міма ЂЃйQе�t’HЉОk"fтnщ*Її“Kшќ0#DІ— й№И‚С;˜ќ№…ќŽ.яэЫТ8яoXєЙ/6ŽЗ�Hgpв7 ЅЂшаY2™vп œњЕјZп#oё™ЁЙ;Vаќ€0œlШ ЉЭ‚Пp9щз}Ы” ˜1c6›mиШИ96№4rтшЄ&žj�"+9“ђЏ§ЁП—іmХ#%чїіšљ№@1э™Зc_ѓ y7<Azљ"***PU•UЋV&~`-‰є&ЕHEмy@5g’ѓQГюсьЖЉˆ~н№фmˆпЏвм”У‰жЄ]џЏd]љЌyх2cЦŒnт|pДqМЙ(Ѕ•IneSM�*r.^TdЏzУ”;шйS…pЦAќоЎ,ъ—уЈxЬ;_РP<ŸТТBЪЪЪАйlƒf-XА``ќaœА�ї л&Е˜Д‹ШeY�9Р3ИŒл xПŽчЭяaДw ћQ7Т "�ЮО њzгё–eСвђ0›ЭфччL'‹œB&„ ООžЊЊЊбЦї6`;аС$ѕ&ЕyŠ€ќ,ž soФPК_У|Mј~|ў�>ПП%%КД<�y991—— п///чбGхёЧMœОєѓWЖq"p2юЙчž!<Тсёx„Ус===ЂЃЃCœ>}Z477‹––бее%ќ~џЩ!сСяї Пп/|>Ÿ№љ|ЂНН]иlЖбLРї“GM‘/єтGrŽAsћъъъ†€ŸЯ'<pЛнТчѓEНf$ђН^Џ№zНт­�РeШYMЉ6ўbR@EЮМ”АызЏ‹ќx/љ^ЏWьоН{ДШхшЕоТTѓЛ& r%Ўчі%ƒ|ЭŠЬŸ?,"јPТ$ЏL&(ШUИ%dД ЁЩ$пэv‹Ÿќф'c€�ж�Й|6ƒ8.,$J"nйВeBЩwЙ\тƒ>Ћ�N Ч3fђ™?0,r€“D$рх—_>сфЛ\.сt:G\`˜А (G6MxQ0UЈ�/"—_“EQXЗnн ™НcˆQЯмjПcяююfЧŽƒт'Њ5ƒƒL‚/‘LИ# �п�ўYKPm[QQAmmэ9=|МШBpђфIцЮѕОhџ~рVрфwŠ&lмРdы ЈQUu Wia 2ƒ0žф !(++cљђх+’EЦ7ќXЄџŠtЭL “ЉPEй ЊъŒШDTU•ЇŸ~›Э6І7љсЧ6nм„,еHл0и‘Юр{ШЄВфќЄ)t:нmРKбnўќљькЕkLЯMљкя .И€†††aясWя"g%НУhВ:р'с9>|;ЪЎи$š|!їнwРгk€'™РЂ`2@QUѕЋ:Ў,VB­]ЛvдMљBnП§vl6[TrЃ‘хи\р+ШP $й*OЈ:ю‘X‰gЗлc~ .’EО‚ЬЬLќёЈТтФW‘еC+IцdЂ  †{UU-‹–ƒEсЦoљ)aH&љкўmЗнFiii\f?†5ШUх>Єc˜дО‚‰Ўш УѓЊЊцЧ*7_|ёEВВbЎ=A~И%xѓЭ7уЊDVƒПЋ„›ѓ <$ЉhB-€^Џ_ЈЊъмXфпyч”••ХѕЌ‰$_С­ЗоJiiщˆ іˆМ&MЇгнK’ЧNЄPM&гTU­‰e&_xс…ИrџhЩюКБЏыщщaїюнРаыXФљЊ@ А 9†аMЌРDZ€\EQnˆ•SюИуŽИrџXШeЮ…|!ФРДёжЂќЖшѕњЏ’D+0Q@БX,wъѕњ[Ђ%„Эfу•W^Д|[4L&ђ…F>ўјcъъъ†д^<ЦяА§BПпџr=Ф„[‰В�ЊЊЊЋb•‰_џњзG4§“|-,YВdHЎЗXV ьžNЗй. M3O&J�ЙzНўКhІвfГqџ§ї{ѓd%_СЪ•+‡­њ '-шѕњЯ!‘І‘`Ž&B�JzzњWb•“kжЌ6їOfђŠ‹‹ЩЬЬЖ-�†Z„pK гщfЈЊ:H'СУЧ&B�:NїЗБgИм?йЩз~Яœ93.Ч†і!„Y+‘Х@BСЄ 33ѓJUUKЃхўššJKKЃо—*ф !XИpa\&?VQP�+Е tж“=5LUUѕnm^ЄYдFиD"•ШB‘‘1ФУзоWЛ'ќwДыE)QUЕ:4!'Х$dдPR-@FFЦ4NЗ&R§ _њ’K.rOЊ‘/„`њєщqї g єz§ЄАеF’iƒС№hxюзЖкяыЎЛnа ЉH~x'Чg єz}ЧубšPIРЈЁЄ ;;ћJNwG4тEЁДДtаЗG"?жЙ‰&_С‚ PUuLф‡гщt3УЦ,HЎRV�ЊЊЊп$=|?ќы\ё?ббŽ%ƒ|-„ПgЄТŸy]ј;ъt:ЁЇє$`ёЩd@ЩЭЭНWUеKЃе…Еmˆuј~*‘Nь@"Dфіh„GƒЩdZшvЛ‘ і€d@UUuШˆŸHЬž=ћМ!?š�ТЭєЧКGa$dЦ}ѕбD @Ы§eбr}јБHЄ2љBШЊ`__пЂ‡+їЃYNЇ9zр&К8ащодЭL™2eрІT'_AUUUдj^ј;дЄ( :.‡аєуЮWЂ-€^Q”ьсLПі[Рљ@ОfЮ#Ћ‚кЛjћУUЕgј|ОV$љ i LД�t@пpЮ_јёѓ…|М№Њ іо‘яЫWˆИV‰иŽ-�UБWUеЋ`hе/|ПББ‘’’’ѓ‚ќ@ 0№~к6//ъъjьvћРgъšššшььфшбЃtvvђДxИ\ЎZјMТD рvЛп7™Ldšќ,)шaЊнХЛ]ЇвxЏ-—>ЏEQhjjЂИИxрЦT%_{Ц‘#GP…’’–.]JFFЦФ)--ЅДД”yѓцбииШЛяОKGGЧРyЏзлŒь№ eц.€юююƒ•љ&Чъйэже+”ШWЖѕГag#Џ|\DЋ3mаMA~јŸkhkkCUUВГГЉЌЌфЬ™3œ9sfФФZДhЄЕЕ�—ЫupCB†Š'Z�ў;2mхЌгтЮЋСd (+€ћnanтПГyѓf/^<aфŸ сЭ‡оЂЛљшРГ>8№ =ƒaдk˜ЭцЂУсpAЎр@ ЕŠ€Џ,Р6ЏŒ—oНœt“А”Р”›хIgІЦѕ|љ*шuЕђћ—ŸeЯž=<їмsЄЇЇ“Ÿ|O7;~ueцc\Xzяќ"ип| GŽuš !pЙ\Tк}-НFсшvгE—OЄ�”™%ЪГ7\Lf–U@Щ`жwРVп€iп?Аze/nя)^8nтѓŸџ<Я<ѓ 3fܘдф !8Й{=—”Ѓ&Œ|€Ю€ƒrњєщAХKМ(Я<ѕ%Qєоўёеƒ|sGћIашрD5)џяѕKч(7N›" ЬљЈF№ЛCС6џŠќМ nКФЯEєѕѕБfЭšOЖž љAОЏГ‡Ќа2УшъъЂ­­ ‹Х2ъgfYo?"ИЄОДЫВЉЌ%є=Тqч+! ?МоААРЮГз- ˜ѕжBX№PTОЁС`k9ЮЭ…—ж…гю ЖmлFKK +VЌ3љБyИsЃ Пљ4+g6Ы—ЮY YГР”ЧЩSMЌл еее�8ŽјгnЕркљђwV:4Ж1хеƒМ„,Ц}%‘q/~vƒсТєtБљЦKY&0ы[  0LOfЮЈИ‹•ќ†І3gh<bЃгkaуЦ8~јaвгг'љƒL{іbXіa)яnр+ђѓѓБйlєєєрp8№zНИ\ђгТiiiЈЊŠ^ЏЇЋЋ‹Ы/]Ьƒ}]>уш чfщ8 ?Aг‹tЧ уiR”НХєеЬLхэ›WњГrГT|2Ћ!р9” ь5\ГLА<Пi hЧŽ<№РєііN*ђЕЦ�ь‚п5V,ЋЁЂЌˆКК:„˜L&rss)++ЃЊЊŠйГg3kж,ЪЪЪАлэєєєА`ю ўј›Ыbб6ц<žЖ9$шы#чєРЇПhZ)ъTeEf†ИljI kсlFЃ€МЫЁє–сs~$Іџ-yЮor§Ђ~ЗŸс@Зl4Ј­­eЭš5ќьg?ЃЊЊjR/„@еšq…O’†?Ўћ_МћЛœ8q‚ЂЂЂo!›§~?gЮœЁЃЃƒЛЏ)фљ,†аsЌхс3ъWŒJ�?М{†йtГNсюќ.+ЪcPœ н4‰К4(ИJn1ЪЏЈ3ЁъБD<E]Seбщ•D‡ƒћяПŸo}ы[\uеUРФ’/@а†z!рє* fOaп[Пт‹kПЩ;Лj1 Ё1‡ƒŠ<xі‡ЫXЕіл Oђ TjLeЂ…~џsdкM[цЭєЯ›[э—ЙИще`)ƒє™r ЃЫљсШЊЌjЎМє>jkс/mгЕЉџєЇ?хрСƒ<єаCJў€ајd1[†žЗ_y’њНџХЋ~›Ўž3И :U_њШYLЏ(™EхE ЋцŠЅЏf!!Œ[ƒPМP ВЬџї’ХОyг+ƒУг3чAўѕ`‰˜Ш1к\ Ѕw’ыўз\иCуЮv>ъЫ$‚Э›7SWWЧ“O>‰еjђ @‰.��T‹ятСХwћД І| і}�\8Зžы>UnъqŠwЖдr’qў$mМeŠў s п§м•ž2TР” SН•ј?й=Š 3‚NOAкQz[мъЬ#€nа”ЊЎЎ.vьиСœ9sОђ•Lђ…œ=є?дT4BF5ЄO^Э :ГхvЄk…вЋаїОOy‘ЯрьRkъN‹7;œtj\Ќ@М0о8Чє•… НSP€ŒYвьљ:ѓ8ЫtЎ#игzшhєSяЬOЊьяяgчЮ\}ѕе †Є’/„ у№FцV6Hђ­•уŸz+dЮХъннъГЅyе•§тж^z'Ф[ш|Z:ЛuиГ§ @ŒћхЁШЛ†rп:VЬършž|к<rо@ј˜ЇгЩюнЛЙьВЫ’J~ @Uу(ЮІ<˜іmf™žЕЅJUєаЋО›v7PИ8Ч&тИ}�ЗŸЏ_ Kд–АI0,E`[Ьв‹їpМщ$Џ4ЮС+d”УEаммœtђЅ€LCЦјј>Б ЗТд`VњЋфхэœ–iеП?ћ„яЖџмЭvЄЦм:Џ�DП[iьюв‘_ьœЩБ��YKHя?ШђЅŽvŸц@oЩбФЇN’‘L"љ�FвЌHŒМkШMŸСі-щЖѕ ЇкХП<і†џQфђѓ>ЦP$Ф+€@ŸGœђљд 8CR^фџхЌdіќПpеЇM4ЫІг'U4+`4“NўоН{™!> zQžФZ€p˜‹ШЈў2ЋџvЛ6Н§@ЎMwЫ‘Fџк_НЫ{ŒaаHма)•л˜, �`*s!‹—ŸсhK›:fa4),,ЄДДtPы`2ШпЗoЏМђ ,‰І‚ф @CЦ<–\є&•г”’—_вНzг\џ5s9z(ю"!nМ[ч9ИЊгjАЕ*pд(}Ё‰BцR J7ВrЩY ЫР>}р”йlN*љјУ(Б8ШЮ €1ƒЄYУpш З@pљ•"у`ƒюF№7"ЩwgqЗ�Ждz;ќ>kШИіCкЂ1Ф< |СёrjZlQщ ЙyНOл›/бŸї0щі|ьv;EEE #_ �ызЏgпО}(Š‚EРdВMd"аЛ}€ EЏŸ2 щhƒHGDмNрOПuQn‰7дш­GЄ-e”ѓ…МMрi�їрsŠєЙ`(�}Срgr0к*ИјтZопљ4sюў :sFBЩИ\.6lиРбЃGЯ<““м)>0d"­ю9РзОг2WЋV0L‘]шбрw@џ>№6 рф 6љк­)їВИћt:PДzЏбЮm`ž:ћШ^qЯIйвQšЂМhw xє Я—Aќ\ŒоŠНРOuѕ~ŽОќ]цмљ‹„’рРоyчqћ Я“‹ДЌ�ˆЦl|эр: оˆУŠЬгС<3t,аЎcрЎ—ћСŒјсЛ6эриОFбЦІХн—nЈIЫђDyМ\{РPњтш&\ИСз&sН№ЩюŒИњЖ|рo–!*Tжxщlџ ѕo=Mй_wђыъъxу7hmmE1d–OnКK–ќ'!Pъаqџ1ся�їЇр;+їЃeЯGрЋ—VŸД–aзzм яn4ёњ;кЇЖyў9XD=wM ^ЈfZ–‘я‹нxhO+(&PУО”.ќі‚ѓˆЖ…WЙxыПџ…ЎŠ…dV,:gGPСБcЧиЕkѕѕѕ@ьЅ^Ії†вТНLГ@M&Ж>™у}-ря”‡Flˆянk?йkbћ[zЧяwyоѓSя  hF.2э$аЅ›•‹гѓу™ьfP+ЁBBW$ОьV'ыџуоєkJ+ЋЧ”ћ;ЦЩ“'9pрРРp--ЧG#ŠЙ—Ќ|_˜ {СНKUЊ5dni§нƒ}1f„іF{ў’ЦЋЛ<^ќАџУ.Ї8ƒ$ПљЅеvFQ€Q pЊж„_$ Œi‚й кјэ3пуlњ|цЮKQQбР'ц щььФщt"„РщtвккJWW­­­ДЕЕ 2эёLжДМDЕ†тtЈS3ч œ=:>zЧЪ[лiјЗw{о­ы­Шмо4�H!є2ЪЎтИ`0‹‰џОH T/ѓPВЅк`qdSёHЋu„ЯNnЪЖ›С‹ХцOxzјм*Ї>Lcяfsпг;zЗo­uŸ@ЎxhBš§VфWFњ‘“GFеЗpЖСиьїЊХ:г„~ъ6*Œi‚ъ)эlЏКъH8љБ„iт#Зс5�'жяИћ4сшn2ёсŸ2=Ппщ:№ыwлї!П+иŽ$Н ™уЯ}œУpёИЋЧ›/–ьДџудЋЯŽхЃ%њєs ёЎйќ№пB,К�zKb2‚п­в№A[7щлžидљЮёГО$б-Hт[3Ш9ƒ.Ци Є!^јПђBлѓO{ І~ЮQtsў‚2+уŸь hEДп‘„'€hЯŠFО†аXРё…ѓŒ‘Cыs<Плъ<№‹эgі ЫљV$ёMHгпEhЖpв„xоП{Йэз п7М{Iі ‹ЊrfTЬugXЇ8Б;1d&§ЋЇƒ (БПЮ1œ%ˆ•Ы‡[оEU•q7џЇwйй§—ŒЮ‡ж7Пёщ_ ЁrўRэHsяegF�н@уоїюН -m@ўeг,U—UZ+ч—иІдLзй‹НFKq?Ц\7ІтфZˆю.гѓяѕz=‡Ѓ@!4 бгггсѕz=кq‡Ублллл|”�((((”ЬЬЬ“Щ”žžžž­‰Ёз\л��‰IDAToТйaФ’wю“tn•Ц?ѓђоЃп|ѕдVBЙў!яО‹аРq"wgвЫlEŠЁШпvмйМэИѓ�rжŠЅІШœuuzEu-П*З0wо Х§r\rrгirj‰лr<ЇNЊ­­­§Є­­­•С#M„–XaћўА§№ы8yђЄŠLCpk,++Ћ((((oаІ:лMй–Тs€чŒ™к …ž_lьйѕЋ"Ыі$љM Юѕ q:F3й@A&„ IxrгЬ`Ш@ЎlmE.lhЬWLK/YY^6=з”ЗtŽЁ"ЋТi4OэСRй;./pb‡…7gъќЮŸКџдэШг<c/вIвP& _№˜/bBфk 5š‘Гtгj %Џ?‘§ПЫonsМНgЬœј§ЯНџйќ?;Oєз!М“СаŒЌк%$з‡c,ГM4!b0#Пmc k” Г\1#НtѕЖšЅ3Ь•%5§щ :0цЭ2|)ƒ ыЉ§ўЦоЗІГ YvvjзШеˆ–уУE!‚яЈY�R†р{Zмї—=~љCmUцќбŒёЖ›9іл)}їЛ–ЗЖŸp|Š4ѕuHђ[‘6)_=зщFZCЏ>ŒС  c з -DxHџкВьљ—MГV/™­ŸZpQ—б:­CжШЮЄЯЅrјЅL~љ_о]ЯМчи$]3mHХM(GkІŸАпбBx‚k"а‚&z3ГњТЌЫxЗэЉВ/7 ŽЂmФy —УВ;oјЗкзNїљ[‚qЎ nO2љ ЫѕсЪŒfB=H“хDњ НH%w#sdВL;мяйзшl\АчиЫєщјдвgљ4зfшNK ј v/ЊQ І@…ОV‡~kчЉџvяXЗЫБi.kO‘9Hsšњ‚qqъ pущA&ВVD„[‰pџ@+>ДwsпЭsИХн™цз;ЇД-0g НоцE‰_-јъГшпZЪя_PоћТЉЗNїљ‘mјŸ"s[0ЮчTЏ-’ё}кH+ЁYЭШ;`Џ)2NЙ~nЦь%Ѕ–iГчŠ"}–sЁoПJW­‘Л§ ЯяъоЛЗС{Iў dЖЪљ‰N@ T•fщоwiюѕЫІZg-X,ŠUEAŸхEgі#кг�…кC†Ю} ŽжŸОнr№P‹Л™‚ёnюj,пx!iŸ)јO­И0#Ыд ф’В‘sсэСciШФжšщEц”6ЄйЌ'Tn&ЫtЊСИ�@9PHhm-О*Z<Сxw …л€­6Щ"щфУФ *!Oл‚ЌEd"kЖр6ањ8dbu!IзrSвM'RФiHбцƒ)ш№ѕ|Д"вIЈ=џ В(дVќ˜А–‰€†96„œG­іЭє#s|/IЈ* ]0~š“kˆ/„jZМћ5”snЧL„#вgажЩзюœ…зл' ст_9–сNч„ЏсџJ4‚JКf����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_unknown.png��������������������������������������������������������������0000775�0001750�0001750�00000027404�10411742012�017377� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���gAMA��ЏШ7Šщ�� �IDATxœэwœХЕяП=yv6JЄ•Дв*ч,”"XpБШ`рb[иDccƒ _c№5з`?АŸ/ќАБ &šl$$$ЁWЋ•Д ›s“CwН?zf'ьЬьl’ЬOŸвvїTwWељSЇNWWУ—јЗ†tЎ 0dpѓЩё$%џIЗ Y.Єѕд]М{С!Р (чКxƒ…/ p[y>’ў1$§7 Шr'U›Ўeѓ7ї�N@>Ч%hЯuЮn.Ь`щO‚Ц№а-N1Т“7Є`Y“BZЛLu“lФ’w УчŸЂќrР‡J/ў-€ФэеЗЂе?RZŠAтЖѓЭмtЁm’Ћ€gкЁўЭіьwЈж ѕшCќывч�_0"ќ{рŽЊkаžЭX\ЛРР—YHЫд†йw›€‡лРљf;Ч8T ёаOјdэs€/ ў=pwнjCЃ[…"X<NЧУз&3|Д_ŒSl <k…œ§^њG›*n[епљ`щ}€е9ќм“р‹M€лЪѓ1ŸAЃПcг5ќт y“ ИМФѓV`ЏƒЗ_iUХmЏ{ЯЛш<|ЮI№Х$РЭ…dd?†F/Bf’xр?’XЖи„­5~Ц š'ћўбJЇC{нћœјУ”§Н‚Я9 ОXИЛ0MЮ}h4ї‚&ЭЂ‡Џ/7qхj36cџЊњЁD™—w~п€еЁ€лzŠЂ'Ў ќ•� >—Б‚/Ъ0Pт{uпB—ў*эЩtѕ<~=…Б3 иД2є+MаAMЊ–ЄI&<'œX]Кс ;o жК иŠэўlŸ;K№љЗ�п­Л­ўi$Эl„`eОž;ЏLBdiё ТэvК ЂMЁцwѕWz@ікЈ]=‡Пџртs0њќрžšљш O#щV!SГ5мБ&‰ЬЩzьƒЌ‡U26+œyІŽт ? ЊоП‘ЂЖё9‹~ў№нК|tКЧашО€Щы.41w‘њГh€Ћ}АЉIaи?[иВгЊ’ ѕаьПљFCŸм]‘)щ>$эН Ѕ™tЗ­4В№<# њsSZікСќr#ŸюА‚" эшУьПц9РЮч `єy €Ф§їЁб§ 4iСЕs \u‘™В~zі—;m0z}+ЏМлЊ†Ž;N>ЩОЕџ5`4ЄIpю[0~иp УS EРŠqZnЙ,‰ІTMТœГ—яvТy:љЧ‹ Њ%p6ОЧю•ЗЁŒ†lдphрІе y,ррMЎсЎЫЬИFъшЂЃm—€Яь0m_'џјSНj \ яГчќ� †dРhhрюŠ R’_Bв]€бiW/3’?У@…ї\.1ьЖУŠz7zЂЋ]OчAЮ<u3ЭЏWn† †R Hbеƒї 3/е(qЫb#ІЅfўiвaб€AY §4Rѕ:ЮŸLХОN<>}.i‹жрjй€ѓ„5b8dH0” eбїзЂ3ЎИgЉ‘+–9ю•(tС7€4ЭЙp")OЇЬ:ЯВр)sбв! 'ѕМ5HУvcнйТŠ%шYpзW0$/]šЇусс:Оž Љ2uBЅ[ѕ­R5jЫk!ї”†iЁЬЌcъЂT<ЧэДvHУБЬИгИ§ДmЊcˆ`h`ў]k0Є.^:VЧж}p[ ,еУV4xсД 2$IjсЯЕ уЅT-”ЁaиќT†U9Љoђ0ŒП§˜tlЉe`ˆрЮK0Ѕ/^šЇeї�}0С_7УЦPhѕТ'дј]*ўyœЪаJ5nh№@БЌaЮЪt&Y=œ.sHšr3)чЗгђжQЮ1 tчъЦQЁ J2/КсzМ1nЋ„NЄНCУўбAЊВѕЁSгЙ€S6ŸšНр ЉЪGV˜wУhVЪ№й–VHšі+ђžЊЃђўPЃ†чdœ3Д�1}ф7=p\  З—I@Ї!M˜Ёƒd-XД`в@к�л:ЗЂŽ§;|`“С*ЋЁx8ь€ыП1šKlид њсk€нЈбB™s0Ї`h †р˜ ?^џ] ЧБ/ецЖˆc:TB�$iAз‹(ˆ]VћuŸ�{ФД V ‡mz Ы ’мз‘dЃ†Œнќл Pџ8$8.У<?~QŸ‘№юЃЯeьr №У<ШN‡WмPр„Й жQq›tРhЮR‘Т0Ф@\са)рN7<7ўRŸДŸ…rѕЙИmŒЭ„f ъ€г.*№’"ы�# чEe‡Œ“u Ий ПЮƒT ўй<ш%K# АnLЯ2 ж\jB§–`5!YЮ:Ю‰й‰ ™„,@(tСдбА.•<ч(%KА.Ÿ š8‰ъж{PGMВъ4СїЯyhЈРп"Ђ—$ј7tцР“љœСп> ~;2Ч@БЁ&Зn ЁС> Е. `ўћа8oћ@ЄТУљ№‡ruX6˜HжТ #aю(ЈдC љЫ-ДчПхaФФБ�C‹� ќЁOѓŽІІРІУw‹Р:HГђ.ЭЏфCЉ_№ˆшBГ*p&4Ь Йrю0Д ЈУ@!шѓˆИX'4№аtxЖj\WМ+rрќБPn„@ђ—Q$)d›р6РщШзF>РРа"�;Ш~„DŠxј§lјеQ(ЖѕЏHkGРђБPj„}�JB„Ѓ.Т-ZW7wюI0є№њГїКрЧгсяEpВ$X˜KЦ-v фpўЦ#BЙW ‡A|щD‡п4іЇ …јЉ Ϙ ћKр§КФЮ[—цC{ œQ�ЙЛ %ТQнъђх( "ћЩТ#vИk\ЁФ'С”dИj2ДЄРN$_эюСёC‚Џ:wЁ†P`h�BТЄ{йчАv,ќ<- џ-з _Ў,и.ƒфїи‚Œ+шљdЧb=ЇшєЗV§Ч#€Š?4ѓj-№л№Љ?F;.ЄисЩп›еюžLџ 7јbеЁkxю0Дњ8xкц Fšрб™pЪ9Рр*&Њн=§отƒцxг;†Рј?€ЁG�tѓјЁMlъ­мD5+рЯљЛK@I"Б‡!т-€кР 7ЮI/œђ‚NгнДїХєKЈБџŠ%_‚b Ы; Vu^ШбЧjOCНТиdhі%Xь/Gнёќв_бNл.FYјŸцyфž5>ояBЈKЪѕъс“28#О`(@r\У}јY•юDкv.Sуl4Ž ›ўШп=Š:фыО ЋА_Х5z-Oc˜ЬСЉЙmб8OШРпxО"дЙ…ОўZ№!28'p^УjФcZ‰UŠ�‘1§…ЫбUфСбГh•юыИHQЖ%‚s@ъОРpЯ*кж’o1ёŒЎ^{о|4ЙУaє… О… њљ40ФzоѕЁн€п[ сУY"@ХхdŒ0ѓ˜^УНPLIHsgЁЭcVAоjа™I;-ƒаВљˆ“‹F˜йlв^Ёю ŠH�Sм#јў„Sэz™‡j^BBxVWTјŸVт^DФь9hчЯ�KŒПLУдЬВ—u }ќu—†‚*AЭЫ|}]зЅlёЭAзЭ@(xЁo ЙЉ_Фѓу мYўъ2sgm]ЁСš*9Џх[Ѓ’8Ќз№ˆF"Љ3ОёŸh.‚Щ7С”ыAŸВdј<Єм|zO+L№`uШМћчFюR`р'tŠшЧХ@п'VвЕIЌЪ™Ќ–eМёџ№FўK@*gё='€ѕj.є^GQЫ‹‰БL˜‚tхZЄ3aќх0ћ6HЪR…о•М])нрцгя4Вn‘ЋCцПЏуЪ:)Ёžи�$…�gOјЊ6кЧіiяБjкhЕ@iњЋyyьŸ4д—žF€ЖЋ™яОŽm=›Еf3l8въѓ‘Я‚ЩУМ{ et—Жwi~зО'lџ/74ВnЁ „рхзšљЯSŒ ЈžaGK~ђUˆj�ЖмФ=‹W‘ІM‚с†+x#=—ЅŒE}khPIаяwfлж’џ‹Yќ.IЧГZ‰Б˜“–/GZКrчТ„ЏBrЎЊ^ŠЌ&сOŠБя?цпПjК•t“ЬЦI(tpнH ЖL-0лїв4иаlнГх“[œ> ›ыiЏt0e…“VNт�иo<ФХУчбXчТ­ѕх2гД†пJ<ƒКЎPŸйеЭСЄUТШ4HЪ…М•`LS3‡=2‚ВѓoОt [_Ы,N&хвl>hэkЩUќn|П\m€Г!ќl=№v%іkБ[} ПyйШъЫuМЯћќ\ќ€™ГсH6Ee`їf“ѕќПжBд…Ј•xїш њb$зѕмŸЎч†ЏH&ц-DZЕвв! dЯ.ŠЦћ‚Ч”(ћBŽВяcю;увнМw,ђ*SМ>&ЯАpЪAp8зЫtilhэћљ‰&‹2v7Тг'hмн‚з­0o9ќъe-sWdd&2‘вs˜jc FцcjLЃQщЮx§ŒдяgЏcPжъ•А_Ы5F Oi$Ц0a вь)ъ3е1@ъh5cWуh;„CBЕ?кљ ъЬЌ~a*эN- І˜˜S.jщ›ѓЬјAIŸNM-ф—wвјзRЯиA&Юмѓ?2sWD?ч gИOм‡ 3<гшм•LUG3xeл­7ђ‡ЖэЈ QXЌ !8ЏaЕFУcz Ћ�6iеJа)52Ї.м3oзQѓд&БњХYД;ЕLcрђ;Ч№tCяI№є$ИяtЏOKљMvxНœВУэ gŒЬ-zљЪM=Ы­„`ЧЮ 1™б‡fББђ к†ЅЎѓ`УѓЈKЪ ˆ5ˆK€Ўа­Ф€*јEчAV:шВ {ш !Z*ш(Bьњƒ�=Yџu ъ,мњЮ4 ъ’™<ЦРЗяХ/ZєнчпЧС``ІЫ TQєI#%EАі'7?1EЈЕ+Ѕ”п‰пQFгХdF˜ЩЧœv?Ь5 иjфQ‹К0'!-Z Y) O‡‘ѓС!фxц;VОˆsz"PHОv—žе/-Є .…ф$ ?И?gЦ„I№дdИџTby{BО№aй^OбkU~С+ќЧэ6.ПУ%-Žп‡vь<&Ѓœ RE2ŸОœЗ wЉэRыy–ћa�V#,‚фМ–[ѕj?ЏК№s"Эœ 6ф-ƒ%ЖРвъ– ™bt!э.ЋџЖ”‚њT’“4<ё“<~я0qкоsХŸš їїœ/ђЭ`љИšВеuyі+ЏЗrЭ;ШуыЙƒэсwv—IЅЈ •dЎЎИŽПмЄЖG‹я=ОW* њМudДюыјTЏa%3ч"Э™ +dЮ�KЖš#­Ž$B\ ‹1Ў…\З~А€— Ч’œЄсолsYŸ–Тсњэ4јс‰јyb!л9M4МWMc­ LYbч[Oе“9І‡еоuЛ§љТСЋђkьRv‘B2U~…Э……X=vhёНЯїnG]ђЈO$ˆ,Žб~ [Ь:–IO<7”•CrОњkLaGбјИ$ˆЁс1ХXж%x[?ZЬKGѓAўЮ(NgCSьŠї…�-,iщфш %4жЉkзNZlуђћ˜ВФ’3BНz4ќеї7іШ{A‚[:ОЦ{;іcuлСЁœтЭжЕlієi5ђШЇZ@gp; ќфЭƒВ3ъгЛH­e Ж (’‘$ёяџх’эЄk<sh:OќЁš‡юфqщМUKTH8ЌbбТјњNьыkи\и†хКXso-‹ЏkдuУ*Ьx"‰›/xрFЭзe…§О§Мly›—пРлїc5л's]њикЏbЏЇœ^.7ЩЙ”ЖЋиœf`‘єи/сФvаъaтbЈ­_Врш}~TЁЦ"Mшy‰јбЌGФя^:>‰[?О�„рвеЬљкh~ХйћЭLјQQїу‘X"ЙaS {>iE`Jёqёw+YЙ.№’a 7�књћпAоєМРMЪ5мQСЉЖ pЫuv‹:ЗЃ’ !w8вH"p+!@ xрд7*+ нщcU"ˆiFЂk;єїXФˆ'м˜#ƒш]ЫКIGСчхжЭГasB<xуž- M;єДhXb–aK {>PПўaJіВф–J–}ГSŠwрZ,рˆvУ,ЭL|:яИпуUосќЅЫ;ѓ8нV1’†7љvЪзxбК?_{Bˆ€РŠ(n8Н&.C§RFBъ0Ѕгc?Ÿˆіўі†1КЁuу gjцъ WБqs6›ЬЯП=†GЯhƒ$D5”уЕ29‡ъ)мPн*ƒЬ^[ЭЊя”žЋОэщщЩРіŠ1Xч3Єјt2ŸИ7БнЌ\К„GцѓYѕСd_Ч$нЩџv~H0`”pQS[ЏbsК…вЯ‡Т­нЯШТ�Л>V Џ5e8$ Sj0Ÿˆ!ЄH’Ф$AШЙё„э˜Ы Ж6 *ѕЌ>ђKкН&ф›ЙћП&ђЧ*-%6јѕx№HАИГв чd3Gп­ЅЁNѕь'ž_ЫE?*"-з_Ј§ю…чIœ J#Џ9оР›ЙК™$fВЃьАк^хо‡xВу9‚п0Œzсиxфq8В%zaВЧ)v}nWP@’V%! ŒЉъv4'.fПOѓуœчВЉЩоі6№8ЛЎS`ŸРеЇЇмУ„|3>>‰ŸŸвrч$x№0ф˜`ЉнЪю?—бPЏzіЃц7ВјЖcŒYаН•щЏр{EŒшП5ЩMќгљ.nсfЂv9Eyь  Фћ~лљ`# тр№ци7ЗЄAюtиђžŸt– 5ЈсbcŠJƒY§Mo6ŠЅˆЁсnШ>№КСыђя{СбМWЄя �žіМyЌоr? #ШЩвѓУŸL`ќx3ЯoЖв№q-…G:еМ#kyьa…ѕгŸfКqF)b>Ђб~!рhљzIŒfЅ™OлhQZ™ Ч%ЭѓмžWе6h‘џЮЃїЁŒК}О.6~њ 8И)~!,щ0jlп�Vф%l§N†hъ–'Т D#UДc‘їжщaќd•’‡іГњщe”АX4Ьž•Ьюэ щ)э?ўoИњ_ЬеLуiљЇќЈњІg`шš”кћО:fООj~œѓ<ТЭzЧЧД*­фhВXкМ„wїmVлЃ]~ŸuоN”ЯзEЮ0ўx*п4iШ•V]5%A-Œ–<.hЋ‡…@cиmъШЁыOсŸ"(E„фQ‚ћJˆ№ТіEќ<J”<cЦСм9Ќƒœ)0сLiУИqјыœЌ3qД.“ъJfХŠяъѕ<єЫFЖ.ў_PЏ4sD:СSУрУ–OБЪNL‘YM""Х:/%’?кuЃžчC2ШгцQч­ЇYnЅЪ\ЭК1зsВІЏЮ7•х†…им;ЈХFˆћл�SјІACЎцќеP}&DЋb$E†ж:˜Е::TK Фb"фˆ&д˜dй;цЮ… 3dM‚ёЋ§s$PdLuЛЙqт:\fR›ВЮv?›Љу‚ЌЉl5n!ЈWšyOоЬ‡џ”--ЛйaнŒ’ „ˆ-œШOxбђЧ"XМѓ„в•‚бкбXe+­оvNjЯ№эё7QTqЏЦ—OŠжЫ^яAдЎ@(У@ХЏ”к@Ѓ&ŠїТм…`ВРщуt3эаГOФДG;–? Ццlƒє;tF5ŸЯЋОчэЖГ€ЇЯ‡ЗjJЈjЗ†T<мОЖcхjч=М8ў—МWЕП5}ˆ^:ЪУFшГaШŽо}щЯ{{^ЗсЃ:БЭ‹ovЏdШзчбкРyгц№щс]рe ъ*мјПRв�јх.Dя_{=yЦЯTћпЂC1„ь/|\п ЦБШke„I“@rCRфЎTS#Љ3ЛVt ­*Ќ>BУ@дбr;VЎЕ}?zœT)™?дНF•Џš*ЊбktdыГШаeЁKЧЌ5Хn—XТьэqшцˆЖЩэДЩэ4zщTЌ AЖ.“ГЎЄШxŒзy“bЖкfN‘d­јgu'@ ­ЛЕP‚()„ь<Xq lлиГіF:…ъЭу&;WМЦ Щ0b&-jЫЩЁOуBа^VŸ€Ѕ ˆнъЗлсžЌ[x.щю:ѕ8�^YІЦWO ѕ�˜4&RД’ЕЩЄщR1iŒ5Іо{тЂУзKИБ+vlВ6Й=ьїl] _ЮбЄ"^у-&IA–‚ђє #Œ:н\QК€.ХWњH�€њr•K.€›‰.dz&GЄжчŒ„‰“A'ЋCШмљ`NWѓxНAa]Ы{HаRЉ~Ы­Ћž"H�!z šўЏуeўгtЯNќ/Оsђ—СќЗqЩn\^7MД„ бЂЕ “Дh%-­%ьџЭЛ] Р'dŠ:ыеЎ8№‰(ѓ ќuЬжgrQцr-ѕМЊМС&pёn&k'ё}ы§t9эŠа ОuЄ м-ОшѕЪ!ЈЋ�K*ЌН>z'0JФДGj}r LœЉЕвYгС’ЉVСX”'†р‘ ­RDдS 4 ФЕ�Мтќ€ C-яЯ§_?ђ_tјBжŸ•Кm€vйбЕнJ{”ќˆ,‚БmK‡ЯCdјxU~ƒ 9;ЬЗ3A7 ‰zЙQ­—вЮˆщв'0Ќ œ‚ .ЭТF‰јЩ)0}6Є˜Сэ…aС2ŒА>>а*aкјЯМЉД™…њ:B№<лђAкuПсЅйГю№#с$)BЗэА§hZ/E9}пЂKт’Ќхˆ4™їф‘юKч*уЬзЯР#ЋJqЪ{ ф`ЏMžнЛ�BœРОvЁАЖƒУkЏ‡ЭыЁЉБЛжG!9fЬ†dГzО>2GвM№ЁкЙ з нg† �ъz‰КыPф9Э:яјѓЂ_ёГ#ЯqЬ1П<TаQЕ:ЪСžF$k“И8g9ЄћјФЗOЧWM—3Ч0 №"!љO•ЈіжЊѕ эN#Е PFщ_ й'РВ•А}47Dя F˜6R,рr€”c&ЈЕїzxфёКтЈѕPš Ÿœ8�:АskыCМ8ы -xžужRџ/"1­Žv,в7й_–5Ÿœœt>ёmЦыё1п0—хІe@PуЅ€ј%uЛи} бЅhн{и'0<8SЋ.€ЃGЁИ(ЈѕL›™УЁГєiЊЙО7пѕGRћ§жšЈХ Г�BєщЅЋNl\пќ=~3чavŸ9Ц?k6бMЊ hvHЉК‘ч+#V“СЧђЇtw0л8›Й†9˜$#nХІёЁ›фf:М]—% К@Ё]Р�Y€Pœ*€qу`Ф(шьP†2ш Е œ>>^ѕ№Н~ч.Њcѕљ|ўэšc1­X˜�Нъ"ёЃІ'љѕј#xЛjsЯк94Œb1жфЎ ''ƒОOisw0У05ц5%#’�j}@уC)pдu,XЇаhkЂEРШhBQ] SРфiPx�l^6NМOF] ?Šру ѓ"[[Рћ‹’]]"T аЯ—­lќзфЎсс”лxтш‹]EыtŒ!\ј1˜“1•#г9Ђ+ обФxC>ЫЬЫHб$ƒ<AAKбД_н.u•uY5Cјo0X €ц:0'ƒO І№љ@ ™gеaG—НаTЗќ]q€Ў. я €З;?цЊСCГoхЩУ‰АLt'AШБЙУЇ2gЬ$ ДEltЪX‘Чх–ЫАh,ЊƒЇЈ]aЄ AђЏYќЅЪ[еg^МkИл]Ёу‡‚вˆ„гh ў1z„0ћт№IЈen.WŸФAp”ыozнђніO˜j,х™eђШžg§‚ˆ@&ІхБbТ ДGљЋыuFыGsБљB,š$$EМ$Љн^фџјЗ$)”pЬQVŸ. ˆ ˆEЈ“EB…/Ej СЧъZЋƒ3‚т м d@,@�ХЮRўЈќŸ/Н‹Gw<‡еышІ§#,™Ќ?—г–3Мф| m:‹L ІцзxЏП–Qм<)Кы'ЭОV=M„нА7Ѓ€PчhP-@`uO„Г—ˆІwэ‡ф t4€/<т с о{ТIGКŸцў%Зѓъ‘ъдmTС_6e9ѕЩuМйљ>iЮTцf‘ЁЫ@<>oˆisИіwџ$ŽиvЏ‹ЈpїrЦ(ˆ†Р0гу˜!XˆB€$‘}ЊУ'ї№ZVиэEШsЇО {‚UБѓTћŸxіќ_ 8$:Й7ѓ—ŽWIъLbКq iZѕЬncyˆ0э!лRЄиеUžj:НV"бЋ8€PЮЂe•�Нqђ"+ <Ž˜^n, ЖР*;xА>ф#№��ЏIDATтIоšќ,/6ОСњжmŒ2ф’­ЯFріk|tЁњЗЄ(Ч"œ@ЗтЁФQ"J=BƒnшС < РђНŽhТF!Tmїyz-јАлwyЧ Š Юе„‚`{ћ~’H"MJУуˆйŸЗ)ЊаЭы—8ц8O‰Оz–ъу@4DX0Xq€ЎЩрі$цмŸ”ВjІњ‰Гe‚їœБW0L—Gі†‹UŠbцЃv]gјЩсіЙЋеY@ФЈCиќ‹pD дnј”œЬlДM §ЊxL‰t3}дђž.йпPpo ј§ Y–ёHС1НJ€иЮ^xза§œ:wэrь€—џцўЇ|нŠ$€ђN-ПКaѕ.JВчŽdќьёhk+ћ\ёи… <„‰гђ]уєСЙ}0<ј@ёпCFСƒ—pMŽдю!Фє !hёЖa•­Фд|?т­Nо�O”QPъф‘{ЦђHJu]њ)E0yйlД'їЕюб:Л7zЉі~Q.є.@Н‡З№Цаўиf^=ЊZтЅУзщ$PnбmЃ ‘№ЖзыйЛЃ•Gџ4‹ŸdUзч}тbвЪy$• аЂ:ряkD”Ёfь!Ы@"lцгYщЕ @QЃ{1њ~ˆш‘дЧКй‰KIфЛtAє&(ЃОBT[уAћQžxngЕДчmиЭŒЏЎТRz2јЄЎ?шšћвђƒЌѕQб\ pЦ^ЁvŠ‚GRНѕxёќР_@ >сУ'zћNКЁo"а­ @]’Д 5”ЛѓјуљюDХ5Ѕ№§эLЛb5щgŠ‚МО"рЪg™�:Л*НTе_eы№иI•,tF‹лЌ^;(*й|!Њ X‚ЎmТ/Т"‰ŒP­€hфj7ђКc<ёЇ№ƒYŠkюсWз3ѕђѓik€ж~,иЋˆ`дiНPœr›љрH'ЫUЏЙ=IВ#АќЙє_м:ў?јИщ3jœƒ3ъ њск+ТЖ…џoh4�–)яˆвЭХZ+X С‹џ-’ѕ-ЯO!?SЯШ†“˜чЭ%Eё€гМAo’9 22ЁЌ2dТТрЄ]2меСћšhiwс�ћиЗйЫV„вЩ ѓИ‚ж3,ޘQЋЅйе6рeИhФ26зэBRЬ<a}ѕ�І W2mMаLЇй4р_c0о'cнA‹лwя)~}g.з]“ХЕ…џм„§ќ…LЪO‡’3q.ыъ'pаVBЇEбѓaЙТЎТ2„�/xJрФgАѕy+ov–aЌ\‘ЖvSэ.Б€фt ћ[X@Ј>qŒЎбAS?ОH€XQаг7ƒT аъп–ŸЏхu!PЎЬфњ“ŸРЖ`ѓђ'єž!р DІ$ЖTљјpo}—ЏY G@S­K+jз xxЅЃŒ&_ 7ЇпКЙі€ёЪМU\˜eaK§О+SxД1TШбЂꛇAбNG}ЇМ? ^ЈуV/іЋ3ЙЉbп1ЃЂLgС’eАsGт…ъŠ L&>Њ№БхDv‡E@… d?hUЭ^ъпz •^ э6ЌŠ•л3ю}Џ|›qJZkG]Р•[ЄhСigБ}€ACДD~$њеА� :№“реfоЎpбђн\О[ОяИБЕК‰ .Y€ўаФЎ3а˜Mьmг№боš[(švУюЈF%o#AС7Ђ’!№5ŽРХnЇТmщ?8ЉT…"ИЦ7yъшпњ]Ф№I'ўh‚Сдќ Sд;Ј­)‹™Ї7ŸЈкв‰ŸЛlШš:|wfѓ_u“qѓЦ#\xУХЖoэ9V0@ЇуŒ’ФлmTеt hRh8$8TЅЈ‚m&(јT­ЗО–žм•і8eJн<<ќСSJEЮЋn;ЗMО–зЮЌЧцut/C‚PCС.ќСIg"УeТUвB[‡ЄжL[йEp­ }ћbˆ№_Ф И+=ДtR:нЬ asXj+šШ\2sSƒ:У7–wš”У3сtEя=[Žs;юb§с&::ниь‡іm‚mmP*єr (CЕЭЈоoфjšŠПNР]И9ь:Э|у<›ж•|Њ­’яЯЙ…УХxd…$z“.Ø­•ћќЃ€РH їз‰—LZ3yКЌХ5Дздуr;Ё‰Жђ[иŠ—  ек�ЙЏ 4˜№4љАДsz~s…Э‘\Z\УшЏ^ˆЙЃе?LнSRdfСЉђшПЧH­)щМ[oюЌЅЅн…[СsDса‚uЊжзЁ u?PсNдQMЌщŸЁФі`ŽИN2Q?С“,gn<С­гЏЂейAЋ3А0UтщќМѓиVОЯ/ЌAъ‰$RZUЇNтѓxеѕцїБѕlЃ…АvЉFЕ‚N@єчЋaaZcWptpj†‰щfEN?SXЦш5+HrкСf‹aВрtyBtf уЃN/oЏЅКб[СsLІш#…MePŒ*фJTЁ—јЗPЛРз8{‚@%H€NЖ93M?Ю“ІŒиWWШMS/ЇейI›ГГWкyўиѓиVОР5|ъ2Ќ:ъЮ”`ГvЈ/тoГ‘š0…(ѕџm Иl\П?h0рv(8ЗX)œjd\ЊGл{ŠфГЩL1@Kk„АЈрdY\wІЄАеnфх-œЉPћљR™’ 2[NРQŸZСъСЬ;=,’˜@\€ЎbІiѓIзм_[Шг/c˜1’жъ„Еjм"Ж—0СLЮ&лmЂДш(mэ-рŽQФћlтLT…ЈB ёл Y)Ќпп $h:еўМ;эO5’ŸЎedIQ)ГЇ‘5мMЭс Ћ  {JOх 1“W к8ZжŽзЋа г№Ж— NЈ!\№х‡v}|dКˆ xйщ>‰ёњщjВtд\В-™”ЖV'dСVŽ[ШgeњmъG&g“­˜i*-ЃЉбП`uЉ(с жs’xЉCv<…шТ@ jƒэrp"]ƒiДžЩЇ‹*1ŒЧШiyPYД�YQ,€ХLiF/jgџ‰&N/2 [Н|іЉТNЇ*фZTЧ.рреЂF,m„Ќ€5аuт„З30N?ЃАЁ˜ёЃИpќ2UŸшQcWц/фГ’ƒ}жј s:Йњ4lЕuдеUтѓzЁFTё9H>ъQ_†*ќrPˆ"@hƒyQMЇїЈ›*“yzf”ЈЁ=“VЬ‚ъZ0™T P\ІžЉзS–žЭ[ѕАi ЇЋŒ}Џ—}ыeЖЕахШ”гнГ ыуЉОB№™ˆ‡уоj,HŒдN*эЈвЅ›RX;ѕ"іVЦемАЃф`Џ5оЌ31%c4жšъj+pЙа јT|ЦVір жп…(Ї 1 ŒХЊMiŒžѕ5mДЫ&_В›aи0(­Ё}Ьhўe5ђсОZ[И<;НьyЯЧІбЭГ/#шй[‰яйBIрхИЏŠ&Й‘щКeUКF[w.Й‰‚Њ“x}ᇉ+&,`ЧщC kМYoflj6:ЛƒвВъЮІий&vА4S*шђvЉЁ— 1ˆl0ЯI/5ѕ^j'ы˜пTлІ+Џщ`ЪхKёI>Ўrђњжrjы­И<E^ŠоѕАЉLpЕяЊ$ШюPЯ^uаЮuђ�^ъ•vZ”:ІjЕЛ;u5эЕ|gХ-(?ц'aiљФљь<}(!­_4v&:Їƒ’ВуXmЊƒЗSйУлlЂОKУ#Ђ uЈ›№Ч"`№�с цiTшh–ЉŸЈeЁЕЭЎ+,ЈфГmЇ(-kEPтЅф57ыO(œ№цШ†/§ёь ‡Wэъ”6J}ЅLвЬhWl–ђ–JюZy3ЭѕtиmaНlв<v:WыgŽžLŠяЇ­ГE}луЈ(тБ‰в0…q4  >ЁDDb0 �с цnThoѓQ7BbВpy-ЏB…—ЊЗ\lм'Sр%Ь‘hЯ~ N‚6aЃШ{š™кЙŠ5љ@ywЌъN‚e“чБыdATСЪШfZіHŠЯІБХяй—Ш%М*жs"ЬГ/!шй7УГя ›�l0рnД{9m‘0яrsp“НvU№‘ŽL яйТCЧNœѓžbВvКз(Ї,/роKжсё)T5з€Ѕ“чВћdA˜ЉŸ8b,ГsЈЈ>FE]>ŸJ”о‘?a‡ёіЈн–я-Ю МС<npЫœi4  9`ю#CK№Ё&:qВЫWШiœ7YБЗф�L[Ь№фс”жеАdЪ\іœ8BbXr:ГђЦQгp’3UХј|>Ј—и,ЦVБ;ЕЈэK!| PЛHq‘^@ ˜ H!8ЙХџ7Ж=зІ>Qh�0 Lру§фiч!ы.ј:B5<‡чжПЮЄм‘ДtжpІњДїА ћvp"ъгЫFTm<Р№v9[ €€жИPMX;Њр[ш‡#sŽб=`tP>Adiђ ЪŽ097ŸQ™#9]SHaщAZ;[еwЧwЫћxSйD3•cЧЗš>zіНСйЖ�Ёї ЌWш‡ЊЉOъ"ЬiРh`k4зГдp]и"˜nсЁH>Сvх0Ж.ђ7  оПx€ея>О'œm Š€ај" t&Е‡Q‹AРhЭ „€уђq^ѓmф˜8‡Z‚ž}ш“Кvzйoœ+ №E†P§›\ ‡КNПѕi\h?п„*єРhчЌvН™і%ƒ |ўЄUЃ›QллŠ*єРМФаАэYЗ„_Z€Сƒ„*p Њ_Œъї8QI`g<ћорK .ЮЎ• A?aH uџ?‡юpAŠobі����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/tool_part.png���������������������������������������������������������������0000664�0001750�0001750�00000011121�10427435414�017200� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡���gAMA��ЏШ7Šщ��IDATxœХ™y\WuЦwyяuїыezіE3вŒ,Щ–Œ,Ы 6Ж…жPbSљŠP.ЉlTH*U I)W(B%ЁHIБWŽmlŒБ!ёОрM–%Ё}i4ћLOO/oЛ7МžжH–mЈТЩ­yѓК_їы{О{Ю§ЮwЮќ kkCеšќѕН'w:НМ1HLСZШyЊвх5іX~lзЎЧМ§іЯMўВП-о ƒnЛэ6ч†пЕЃoЫЮ?Кgц#OЊO4… ` ždыклхBхшгпмџј=w=јр§OBњ•џ�жкэ?xъшWўъюзOЧ::Jє•<.ЪrщP†œ“N[-{'šь=]gf)"h4иXŽИuSхлw|іуПїЪЩ“ џч�Оuч]єDѕт?}фPГ\юьрІЫЫьм˜eЄSг“WИъм)УФ2Лœp|>цбC ю~~ŽъЬ4з ?ДЗwjљ _МуKп{НљдЏвјOмўЧŸ~AэќЛ&Ш^{щ Зяьфж+ є5J ‚ъЁЁYъ‘ЅYЂ\-,iЎЭ2Rіљщсy(ў|яцЫGoотo;ќђЎ—їМщ�О№Х/§сщхh-У-зєђщŠЌ)kЊMУr`hD– NАuЌМoD–ZhЈа•mВѓъ„чƒŸёЃŸџDНэКЋnООoЧ‘g~іЬ+o€|р=[’-Ÿќч=ѓŽџоmн|№2)Е 542–(Б„ чТЂb+™]Ќ1яEК!Wv_Э {’{о'/Л<ип3Л8[љ•иКѕ]ўgўтЫпЙяГхВ‹КЙyЋ’iЈDЦ™дРєАФI P T”Xb+Ј,ELЛXvŽАдp•ЫЅ[xjс)ЦƒSх_§БСџy№‘€hѕќЏкФ›6НmpppєГЎы^i…ЕZЩуНšеТА™мtЫћџcbx[Оw€lы`KПK”X ­ПіŒЋ'RP_Жœœ=€щ{ + ЦŒ…œЮёшфcќћѓпсы>BцЇхп§ъ?}ѕVл Я7jэшиWуCПyгШшZЄ�- B |пG*‰XA- uИы…–ЦЎЮ3XT, -ГфjЃЯ7^�БтиЬajХџFВ€‰5ЦVS —шёКщшюрОё{ЙeЭGо| ˆ/ “щXћžїПџлЎоNГо ZYdrz‚F#рЊkЎ&›Щ�!@ R’#ѓ–‹Fћ*)bЭЄАщъKЖ ZШsK ХјЉІГїсј‡!і‰C=8Кt‚§ ‡8^9CгDшLТЌ<}yWЁk§\uюРєіl(J~а H’„B!В§x™ ЎуЌZ6АbжЭвл‘С‘‚ха‚АH!R Ь ижmFЌмŽЃS3!Ч‚ЛЩ ОD3œid|љgj3Ьды4B0Ќ\—ЄhЦ6ЌНrюХз�`ŒэQZЅжЕ\юјY’Љ™йtr!B ЅХѓK$B“ѕ$K#ЖH™z@ZЏSЃг[- PRАДЇŸAlњГfž™њ ЇыgЈG#ЁрЋ Єц$жyщeoйўм‹/~—–д8€жКлu]ЌЕhЅ˜ž›ТU‚пџ}‚FЧqJ!… —qX{ХћаюЎDlbVЂdЫxГN)йе р™=Џ 7пAЈždБy Э-аЦ@ДBЗ2 м]Zx@ѓU�”R)�РZC&“eќш~~ід#(Ѕq­5RHŠyžЭ7’Эi”€ ВeвZ”H‘-H Z(цч+8Хo‰]$QˆŸ/0j}ЗЂ+aъ&`АИŽƒ”Т[mї9� …ЮNэшінННœ<И›RБD6—C+RЉšЬyGX<%Zƒ`„Рк4СX@ $щйK&ЃљфЖOrtю*цъ™rŸcЪЄТ,в‰H08b Ў') n–$J ЋШь�хо5Z+Œ1ИŽbИПLпЭ7qы-7З6ŸhгЁ–‚‰Х„o<ГDЦ)E)ыH)⹑iЌ+еђ‚HЏ ЙŒC}1УКЬNоБсЗ1q“Щъ~^<ѓ�—уŒ{€Ig’ iІ<,Ё }КT‰Йй…9VIэе�Ду8нJЉ6Ы4ƒ4ЂГ ‰жj*)Ш8’ŒЖјЎЄj,Z Д8R m�ЊEЛR’жŽ" ѕЪi&ŸxŠ#d{6pнаяsiуC<ЛяЖ™?7zf]s/p8>EЦ)QŒs<ОћЙc@r!�žŸї{Є:Ћ.NO. ЅLYЄЕЕ’() ‚и’fˆ' Ё“ы(V)�-eШYd"!–ЬMœФyјгxNФОz/§зоJз[?ЪТ+]бюрЮыoxkюƒoпyuа=Ец”< єЄЊ8tќ ^€“Я:SX,iHиЅJ)QJ137ЫјФ…}]%l1~zžбБ>aœzA ДNУ,"ЮRЊ(Wa—-AQ,j.Лэoи—™yх‚ŸќяX мђzgчЩ‰=GNОPzтLЅ6s|ЂR8yќЅхZmiзky учѓЅ$qœД˜ хm-Ыѕ:ЇЯœЁбhВfp€юЎ2Оы№оm†}r–ѕkЛ№EЮ$6]mGЗМ![^h…Жk-q’Є<ЉrdFЎaxє ЈŽsбўXЗчйЕ““'з*А<Кqђоiљxф•OєПћнХ‡zШЁ%ък�\ЗP(uthЅ5qЇ^АG+цynзЫlн|1—\tH1 Е dЄ3У;7w03ЛФшњ„1h%iš4Љ­„”\Ёк€д:] GТт0’„†Ёk\s%ƒI3}ŒЦсGћз­?~ыёuыryћ_ўйЇОyял?єБпъm�жЪ|ЮїЕm†BIХємЧNŽsэ•лщ(‰ƒHRfRRmФ\;цѓнчЉЮч(vћјtjIhDЌTˆ@'ѓ}ќl]№!‡% q‰MНbS%•ЦпД§х -gтЉћФг{њ-пб}Хђтьуm�ž'}?я+гŠy б 8~rœuk†(•Š­аjeU!Brzj‡\жWfпЉКГ$B#tчвЌк4?V ’аагнE00€šШA|тФIšvWŠˆ /Z‚(˜a–~јтс–gkч„#Еяч}iiпT­VъяЇПП$I •Q)%ЯэzЯuЙhlЅœGЉш№№3Їxя У„вЅžXКГ‚’lщ!Ы–ЅРбšrЙŒ.њР)gRЃWJЕf’ІїШЄЁejЬдrœЪоШЎёуGSJ_Щd2™L›uЌЕ8ŽІГГkЭY…)кбœššdЁВФцMЩzš‘e `иБоcџYjѓ5ЄT aSка\ Ž€M7z>N фˆy`ьиY0Га<9№˜Дыйm‡їНДkїЃ@хј~)_ьшРƒ@‹ŸЭсzn‹Rг\p6(ЖmйŒRiцRP †K’Ен.ЯЏ0=н`л%e’œ&”iDh ОlпNЁ�y ЪB`R‹T*>АqЊЇsиu$У3сњЙПўЦЗў…$иХљjдuНBЮїгш‘�–bС''1б`ŒЁЏЇ›b.G3Žˆ“ЄЅ86fЧЭд’Ѕ:НЬLŒ”єwzє–L VƒT ]ШCоI•ž“€ ,˜мІћvy^o\јЧћŸјv­2{аnxнžыk-SуРbё\пЯrfaЁe<mmR(GвЯ'1ЦІa—0)Ib І*†ЩЉˆљ9Mже,J)ДяЇ�DвZљdђбXюц№‘ ?wІюИїСЏŸ9yєћР‘UЙыфЅTЉh“ЉрЋ5›lXзGl#ц*Ы(Љ­њP�еzƒFтЙš|жХu4Ђ„fQk†$‰AJAA0в)06!IЂШЁУїQqŠа|‚’кЇіT8v ЦчJ{ўіыwў[мЌ§p‚ѓF@GGwIH™КЯІкЅжlrlbšб5нXkXЊ!ЯVX­sЦЬbЅvДiвBр( ‚fXƒыhzЫи…&С|7IД“fЅЦтЁiъГ Кжrп+S•;~њ‡Яя~јЎ$ ŸІЮ7ў�=Нƒ§ВХIVЎ$3СЉЉ”ЌьdrОJЅкHѕО<[*І‘эz—•ЭN h[О[rй хb–F#ЄВTEŽЧЬв„AФ[Ў&щйЪгwнБќьѓЯџ'№# ИёЋ(зs{Ѕm§гЖE*ЦЇЈж›l^?@_gгг‹4Уkiя‹•ВQЌЊVR"<­щ*хШx.“3f–Q*Кф3HЅqн Щ™щdm™Ю|6д_Яје�зuJJIŒ8Ž ‚Яѓв^•,еšь>4СšОzЫE’$!ŠТ8!N IbЂ^Єѕ‚жGkД’8J' GЧgЈ5CTЋЧd 0:Ўчтˆ)5^6—ŠЏgќj�/“эSZдъйПŸ$lb„У[ЎиЦ ЅЄDŸСQ ?убе‘ЃшgШИ:­к’Ž0ŠЉ5BцЊ5j0еQ2еEц•8ŽиЛ{QаЄTюdЭи(‰…\.яhяух_ @6›эJ–њrўО^Њ&Ц$ШжцX1вZKЕбЄZoЂЕDЋєR"kгУXЌIН"хйLОYЖfжB.WLІА)ё2ЎыvЦ10Џ  TєѓХ XзaыUлiжъєфВH)Я‘+ЩLДhШKhТ(9лРgЋ8)DЛЫ „MћЄЄE;š‹/нDГж T.Фk-9пЧѓ2ѕ:ъ Hщ ј~Ющяъ ƒ+XЉ ^5ФJЯГн)m‡lэ‹+lЕ6œУPВиКf Т˜Ф К{:ёМlЋєкkp]н32иMuaŽЙљ BІЁєf k-mХ{ўg­џ…МЯКЁ^r9ПЬ<а�йlЖg|b†Љх: sѓDaИ’^sšГЃ•И”ТXƒgышєЕAЩжgHЄVфrўы‚”JRЪх(—ЛЪЄ]ИњыpЗSЙь{с9юлC&“Akжеjh)žгЭК"­А–Ÿџ|7CkF˜™ЂЏ$ŽЈTцр}Ќ];ЦЉёуМѕКыYЗікДОX1Bi‚иФщ>“‚0ˆЩц €Я*ёvA�RJ›їs yŠХЪнK%Є”hЅаŽЦбЎчтyJІн9­Ўчpєш~†з гl,3Мf˜ Аж2КnŒЃG244Ььь$##C” yТ0}а"…фдщу„QРШšѕ(­BЊ­p^Я[ ŠšSQ3 ЛГ ­ssгєіѕгггO.—kЏКуЄ§Q!вŠLkM&“AСІM[лˆ’ББM„a“|ОРшш.ОxœББAƒЕ#ыШјy"7B+‡cу˜*эEЛŠЩ%Щ[FЏТb˜™šea~jš_$Ax(Ž"JХ…Bљ…9мЫТТ]]НtvvS.wсy9Вй”ZS@йljУУc “$–ўў!Ђ(ТuГєі2:К‘54uњћH„GХx*ƒ(ќd№A™=ё)ЪЙЦI˜Ÿ КT™jo`vvъ@ЕВ8“ЫdzЖoПœŒ+ШfГИЎ‡жзѕШћy …"^&›6x…Hѕ|k_KзRюшdhЈ›|О€1†f0HЁP _xЅR™ў2=нн,7LЛђЛfгf–'ЈжЋьО‘ЌчсdЊ• sѓgŽВъqв…FЛ‡ВcЧћўўЫ_љкэ##Ch-лээ4ЄэvcЭЋHшlчЎUZƘh3’”cгчqœЌЂQ!$*IIС(ƒСВ\­ё'Ÿћƒ#wп§ЭЯїpо“Щ �їтЫ.ЛќЯGFжmB"[нХ7eˆѓпЗ[YЌELOO7_zщй{ТАў=рј/ѓ[CРрђfeВ7‚Дy{˜x#;ў†ˆЧсu­э����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/tool_shell.png��������������������������������������������������������������0000775�0001750�0001750�00000003731�10411742012�017340� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡���gAMA��ЏШ7Šщ��IDATxœэ˜пoзЧ?sчЮЎэe§{]œ„Pd хWl'Є”6j‰ШCЕmPџ�<EэЂQ_шKв>б‡<Дyh@„ЊHU"”Fvp+ЇХЂCmмжЦьЎэ§53ЗјNяЮЮњGƒгTхHWsgvюЙч{Юїœ{fсБ<–џoБєфрСƒЉЖЖЖŸ­_ПўpcccRjХЪў“5ЫеЉ”bjjj|``рW}}}ПдПK€–––ЭЛwя~я№сУл;::H$X–UEхЃ7Z)UfЈЉSЯ}пчў§ћ ћіэћХ™3gК/^Мј:0;~ќјGїюнSџ R*•дРР€ъъъњ1€hooџўОгммќЅ=ЙЂ"тyОяcл6[ЖlЁЗЗїАI&“Щ6lЈXdRШѓМU3Ўк3ЫВRbYVН,ЫЂЎЎŽЖЖЖoэвВ,ПЖЖЖLI?зЎ]Уu]‰7nЌКсjˆeYфr9FFFPJбееEOOOЫВАmлje”‚ЉЉ)Nž<Щьь,GХu]JЅвWbМрyчЯŸЇППŸcЧŽБџў€N&CЄЂЂт8ŽCЁP`Яž=ttt099‰”’ЈwWC”RиЖЭЁC‡ІP(Яѕ5� ›тћ>ЉTŠНіп~с†††˜gњ‹/АЅФЖэЏH<gЧŽ!Ъ�јОМ#-ЫЊ0F)ХЖ­[IЕДАuѓf6mоL:›х/ƒƒќЉЏ™™\з%‹a-(_ ЩчѓtttаддЎmе Є"Ибт8‰D‚‘‘ў~яыZZhJ&љ^OнЛvqgt”O‡†ИњЩ'ИЅRХњG%КЕЖЖR,) xž‡щєШ$ЖmK>тЇ7oђнžіОј"ЭЉЩd’юЮNК;;йљьГœyы-\з]5ѓѓѓС5“Щрћ>ёxќп�"7Яd2дзз“ЭfљЭлoѓЛѓчйѕќѓќреWIЅR`ыЮјJ1;;‹mлмxЫВШfГ<x№�ЫВЪИ_V…Т�Є”LLLPШчЉoldћ3Я№­mлилгCукЕи ШoнОM:&7?П*�„LNN233S–ШЫ*ЃуууЌ{ђI~ўц›Ќ{ъ)j…Р<ріФяНћ.^ОLn~~е*’”’ббQ:;;ЫŒWJ-N!!nЉDыOАщщЇ˜.•И>4Ф@?—оŸLLPS[Л*žз6ЬЮЮ’ЩdАmЅОя//–e!„Рѓ<2љ<јрЮОѓ7Ў_ЇX(рФbH)ЩчѓGEcЅ-ˆж166xлєў’™‚КD‚._fЯsЯqѓГЯhЈЏЇiэZ�ŠХ"Хb1(sЙ\Б УдЅ”Т‰ХˆЧу�eд#ЪxЅгггЄгщ2]z˜чAU�Žу066<{Nу+E"‘Z Ѕk››yщ•WŽJЁЫ‘’‘7јѓЧWxQƒбWгаt:M.—ЋшDЃ@GV!ѓо2<;77‡ыКФb1ЧСѓ<šš›y§7Ј•’pгНјѕйГ|xщёX eb№<Яѓ‚ШъУЪ”№šEOb31u>HЃвпRJnў9/їіkЬ…e133ƒ”/DпїЫŒ/•JИЎ[F0€Њ9–ВЃzСp=„СUAБPрЏУУъu†іјАѕІƒњќ�Шb�ДШЈSXЉПŠt+­ зї:jjjCЬ­7›озTа€tх*@TЅP8ь№BкpЧq"#`FСєdXŸ РЄўКвCSгŒŒыКИЎ[sШs@{Y h1�&АD%Ўmлг№А=@иK–бj�ТЦkЊ­€N\Msчy<зхTSЊ,‰Ћmjв( € "…Ѕ�ш5&їMъDйbъYђ$Ў`ЉŠeDTщ4˜‰e‡ЈзjeI%ІзУtЊ‰•г'ќОўИзŠќЈ ЛF6> Р,ЇaQщЄ­8мRшdjCД”EРDіђrЈДT4Тх2 РŒ– 2‰Э˜ ТЪ6 {~Љ˜M[ј4K8Q ]d+Ёt‡ЦЦFцццЈЋЋ ДХшЎFQ�ЬКяКnPNѕЅџ4ЏRJъыы+’8 Т2“D)Хš5k8uъT…—LoU›/хЙ№N№№мu]RЉйlЖ"zЖm#•R~>Ÿ' “Щ$ЩdrY/uюћ—z ”ЂX,џЭŽQ�bjjъкнЛwЫJ•й6˜ДˆšGDQяF№‰nЮУє„‡э„ŽШ;w&=Я›ƒƒƒ—.\Иачћ>Žу”…)\“Ћy(Ъ{_f˜ž™7њ?[!чЮ�юJ`њєщг?ihh8wфؑ憆†�m5�еЈГи:Г ­ф=Зm›ІІ&&''9qтФ№•+W~ мбйgзддьэююўa{{ћіx<—аХD—Е•ЌY‰јО”’L&“ПzѕъЭ[Зn§ј#p?\>ОlрсчьзM, ќјPјяšѓXЫзCўњЋ%žMЫЫI����IENDЎB`‚���������������������������������������refit-0.14/images/icons/os_freebsd.png��������������������������������������������������������������0000664�0001750�0001750�00000051655�10443061320�017315� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���bKGD�џ�џ�џ НЇ“��� pHYs�� �� �šœ���tIMEж е\†���tEXtComment�Created with The GIMPяd%n�� �IDATxкьНYeЩyпїЫЬГм­іЅЛЊzŸщ™СLcƒ € 4D‘T„dK4eЪVH[ж‹У)ќцћA~q0ЄАM‡#$6)–Ѕ€I@f�LЯк{wUuUзrї{–ЬЯ'я­SЗo-=b(єрŠШ8чЎчжљпџ[ђЫ/OіЇNёсџџћwёї'‚…z‚зе)>#ЮхпЃ›Ѓžр;фп#WЇ8?ъwЪqП]pQ5vЎ'М6~W:—GТ0њ?цццШВLYkxъЉЇддд”rЮ1 FяЭВ чмшsZk УptEZkт8–›7oЪіі6J)Ђ(k-эvћп…@ЈcАP”RЦю§јxьїЊР‚nќq8ЪЏ—/рJG7іœœ$U#Ў^НЪ`0PЮ9VWWЕ1QišЊ,Ы”жZYk•sŽJЅЂEЅTљЂЕ‘,Ы$QJ Цт8–4M%Ы2ййй‘FЃ!нn—ЛwяўI јQ@ЋвНзcчŒaсŽс ŽјУ/7~Ѕ1ˆђ ,_Ф–†+нi$ђДxѕъU­Е&Ы2UЏзUЅRбI’(QQi@ctžч*Š"m­ежZeŒб�J)%"�p""a:k­ѓЏ;чœЄiът8–8ŽнооždY&333ВЛЛ+~јсGa<5с8ЖЛџfLЪ lМtЬ„Ч |С!№QiФc‚P€ђХr {\ˆqf8ъf)€ййYe­UЋЋЋ:Žc5 ”RJзj5чЙŠуи8чTЦ9Ї1FkmДжZ)uшf)ЅŒˆ( �жZбZ;Ѕ”(Ѕ`EФ)Ѕ,рВ, Гs.Œ^7ЦИ^Џчт8–jЕ*ЛЛЛђшб#—e[[[rJmзG`0<†ў<,=oŽР!й˜  jэывХb ъGЈљч†?@•Р‚žљ &Ѕ ЇcBa'0УИЈййYUЋеддд”VJik­ЎзыЦZЋУ04J)уС”RA†0JЉPk�жКЬ`F)52iЮЙ! ”rCрЫ7R)e­ЕVDr ‘\DrчœuЮeZысyЎЕЖЮ9E‘Mгдi­ ƒС@~њгŸŠїA8BлЧAJ –№KЯ••џ›‡їЛ €ž?OJ8 џG™do†рW<№БQ-§UКp^>ё”Ю‡Џecь`'А—.]в"ЂъѕКЩѓмcŒR*ˆу8У0PJ…@бZG֘P)c" RJ…УчМ „ž 1J)-"C�Vй„х"bE$ѓрgЮЙЬ9—Љs.‘ЬZ›ŠHfŒI•R™Е6їяЫЕжЮZk1nwwW:ŽмО}[Ž№БЬшeжŽŠ?FcŠ8€Ё’ѕЎm?†‚–™ ЃЄс‰JрЯ3gaэ­>і\<?…Г­uЌQмKВЭ;YЖНхdџЖcoGhЛƒ §’T&уТ`ŒqQЙХХEЅЕVZk‘АVЋ…Ц˜Hkj­+Ц˜Шиƒk­Ыч‘R*ђЧа.‚8ŽЃjЕyPо,шP)чœЫ[­ж`Јэш\DЩœsЉЕ6ёчмР9—��i ‘L)•%I’W*—e™Лrх нn—НН=•e™‘I WJŠV+3№”Ђў”fўЌbц|,Ў}І!27p8q‘о]'7`хЧїDюЙтЛ))jй8єЂ€Š€™рcŸSъWž­з?;??kffg˜žžЂV­R‹#Ђ~лэ šіЮцЮЮЦ{ЭцН–Иџec t€Ž„.‡#R­uZЉTl­VчqыJЅc ‚ AEk]еZW1ЃЧAФATŒ1Б­u\ЋеЊ/^œ›››k,//OзыѕJН^ЏФqзjЕъ$'X)%Ю9лl6;жк|ПлnЗ{ЛЛЛ§–s.ёc`­Xkћ"2pЮuEЄoŒщ‹HoШ€ЮЙ$ŽуLkOMMЙNЇ#Н^OъѕКюѕz&I’ВІ—MэpдкГš…?ђЬsгSч/.ЬŸŸЃ3Z™ZпziNЇзЅеювIR.в/^pљлoпјМ‘0n2f‚G0nџ‡ P_‚3_‚_<EŸ j5Cр 37Gѕт%ЊгS„JUЮ6їжžoю­}БеќјЏПџNыцƒћ~Џ;xыыИыhчBл CзћЦ˜1&r­Е‹Ђˆ0 Еж: УАЂЕЎAP7ЦдŒ1u?jQUƒ ЈAPуИEQхЪ•+ зЎ];wсТ…ЅХХХщjЕZ У0ŒЂ( ‚РxF)~8sRzMD$MгмџeI’ЄэvЛЛБББѓілo?xяНї6лэv;MгЎЕЖo­эXk{ЮЙЎsЎуŸыFQдѓŒ‘цyžc$ Cв45JЉ ‚иZ‹Шl ЁЁ+ПPеЃЊ_ОЖzювЬгЯЮ›™йj&ЈДR%35Hp;Лєnн"нк!ЄфжЉy'/ќ TРњэeGќ8˜1h\ƒЇŸ…ЯЖ­5IПЯ�!tŽШх„ЕйYj++„ЫЫ„бØС�нмg>ёЩЅЕn{щgюМїв}уGџlkчЧпxИџіЗкrЗуh*ЅкZыЎRЊ†a?Žу,kŒQ֘ У(‚ZЧ5cЬŒ1ІA# ӊИкєЬЬє•+W.]К4экЕ —.]:355UѓнбюЖVG:ухЯ‰ˆЊT*!ŠH`iiiёЪ•+_§ѕOfY–onn>zџ§їянО}{ѓЮ;[›››;išvЌЕ­,Ы:^:yžїђ<яk­S­Е ‚€0 ƒ8އп]‘†ЕЖ+ŸЊБіKЫgОr~эу/=ѕЬѕмЫЪUd摇КZC;‡юѕШю? [п`АГC6[С ЈexъuјфmXїJGpС„PЄ,• pЎЕ^ž“іЄЉR Šо§ћT‰а‹K˜0DV`oš{ЈхeuюХO,§ЦюњЯѕЦѕПџўЛя§УћћoџіŽ~_ДncКZыž1&3Ци TEaЧ•(Šъa6Т0œ ‚`* УЉsчЮ-~ъЕзЮ?ѓЬ3gжжжчччAш!xN~|ъlЬaaxьЧqpсТ…ГчЯŸ?лыѕ[[[;їюнл|ћэЗяНљц›ЗТ0ьdYжЮВЌtЃ(ъZkг0 ѓ $у§•ЊˆдФйЉЯЮЈЕџєlјвg?ѕ™gЏ|ьkсљg SѓHю DEL‚€ыvў’Н][[dЩ�Ї5ЮZœџo#рc№№­јfЈ ёgФgaysєѓŒЄ/D ŠЃїр>qЕBTЋ/-c.]FW*АЕ{;акƒnцXЛђЬђ/}ОЙ№хwПџ‰ПјЃОїПм|џ{-жЛ:l…a˜FQdЃ(в^�jqзу8žš™™™Лxётђч?џљ+/ПќђyoЫƒ2HХЉњШ€й‚bŒ ƒвšaд0ЅFЃRЏззЮŸ?ПђђЫ/?џs?їs[oОљцћ?љЩOюnmmэ ƒŽˆt­Еƒ,ЫВ(Š\–eA–eбtд/ХjсЏ\™љФз_ћфЫѓЏ}u&\y* :V@"TЂЃ”ЦЕšиGл$[щоОEwЧ{wЊ0юrрШ5`Њ6šБќ С1™@SPz(J ЫsвО+˜@ Bчƒї ВŒ0ŠІІЈМє2j~vСУuhю@в‡~ “ЯšщѓWІОњЉŸyѕѕїПэћя№оя|Аћжw;сC‰уЌZ­ъJЅеjЕъ™ххй_ziхгŸўєЅчŸ~Е^Џ‡‡5§O№сŸsи^7шCž„@A™�„(cPўqYТ0дATŸyц™‹O?§єХ/}щK;пћоїоћсxџцЭ›DЄo­Эв4uи,јTЃЗ№g./?їхO~тљ3ŸљкЌКњšТ фœ@ !ŠQе:Ž‘GШямІѓ­Ÿќ˜оƒX'XQdyŽ•ТНЏxдгƒа~<kxЄ�њл…цаM5УŒuЄƒФ›Hєnн в Г’•W?^>qыкћP­€Ы эAxЦЪЅЪЯНђ№Ѕkќ№вїњіПGпиP•A­V _}ѕех_ќХ_МrѕъеЅщщщј�x5бћ“јГН.щжј‰ЄCY2џ@Цx!Q• :Ў тёЬ0d‰•••…Џ}эkЏНќђЫЯМёЦwОљЭoоuЮ ІЅЇџмZћђы/Оtщт/ќхE}сš&ЎC–РЧД•*Њж€0ФэюоНMџЗiПѕ#њы#OћЌЄYЃчЅэ9‰M(ьC+.eњтГ ж’ "„H‰st?ќ�нjТц:<м$Кі"цЬ Њ>U\Вп<…њ( Н&д,Ÿ{vцkŸкОіљїџѕ3пм ,|іWЊЏОі™ЅFЃh]xm…sї$ГбaтWыˆУф@9ЩЎ�ЩsШѓƒ_бnПЭT­ŽЎyMUбšJЅ\Иpaёь™3sЏ<wщщыПџ›;Ÿ‰ВхХŸћлЕрвЋšЪ4иМКJь%Mƒ Ў@Ѕ‚фЗў€С[?Єї“ЗшќфЧ >єšƒv›4MŠјЮгџГ&ь33�9b&Що†G ВТШ№CЉЫ#KRR DШ мІзХьяС­DO_Х,-ЃЊUˆУƒ|D\‡Ц,$Ає™ЋКўЬч*ПзŸRГ+h­GšwXлхЃйєSЬ3™jha‘twIгCР#WVˆ?”ЈтмZHSилCEКRAзjЈ8ЦhEeу{цЉ‡пЙњљ—fд'џ{ЈЬ€Г…Љ1!„•ƒпЉˆ"0йпЧЎп'ћр=?y‹Сэ›dћЭ‘Няяэ‘tЛфТˆb VŠJА•чБGe\ƒ1Awу;Mшv`7†3Б7VР*/ж‘% )ŽT‚ЩяЃїvаыїбO=…Z\„ЙYX\‚Р€s 4Ь,сД&ЋLЁЇцбa4ЬЭs<ЫЫ Ѕ r №žЅИRтxгhщЮ#lПž &_IшоМСњџћOшоК JЁŒfц…˜~цц_y…0Ъ n§.:n Ў}žZ†ЈтяМ—Ас,uЏ‹tкШƒћфЗo‘оОIЖЙAоыcE №ЗЗщяя=ј cј(ЂМ•чwŽKЛ—M€›0Б“<€§-c<%rІъБЯ&фЙђЙ\'dIV0Т`lŽщv17PgЯ Ю.Ут\ИgV ъИ™E‚(Fi}иЦ‹L`|9ЦjЉ’ЦЫФЗЩФ:–У,a**+ЋЄ;ШкmœЕ‡bхЁуїрпрнП§?‘wКhSаЖ2†Goў�hЎLёвђ*б~Ю}Іxg‹k™џиIсa#eак‡Н=d{‹ќо]ђэ-ьў>y’[KюЛwщnn’;!“„5PеšщЙ9šƒСУ{";ЅДћИ<ц”Е?вmhoѓ№cA`у^ЯŒР UўЭ"dYцY�2c•" yЋ…‡ЩаkA{d+QГ‹„QaћFIœr&%А”œрё ˆ;ќ™Охк‰“ЭˆRŠhaХ$Л;И,;tхt{›џћџAВЛW8†JЁ”­1:aэх3\љѕџˆъ—+ўђЌЇН–;{0Ё*§.4їaoyДƒьюр:\’`гksЌЕtямЁЛЙAюЄРРcс*Jб˜šЂ>3У­^яўN1”N€ЁБ™шŒfі,єпЪВЛ?ГИиЎfйl%ЫK ЅЯŸgYNІђ!3š( БYŠЫ2Ь …AŠ‹ЊЄ—>†™?ƒ ‚№ЁИIЅ—Т!ѓL ъР "d…q“hПѕФўƒТF…єnaгdєЛ?~‹оЦЮЙ‘аj„J-чЅПєЫсo^љьaлЎЭСяu^PХŸwZEоЄн‚fщvpi‚ЭRl–‘gљ ЁѓСtюн-Ртр1�ЈЧ13ЫЫ„qœпьvяю)їсTА›~?Ф�2Ё `�єџ@фжЏ9З5wцЬlg}ŠsДќХ3 SŠ"QЄЙ#IS‚0 M3Т<'АƒЦ]}ьkПBДvўхСf$qоF+…B 0œСV‡Е^œЅьІЖц‰Шёwщ(ІКВBВГCкnƒ{їАYц[СNKO…МјзПЮь_ќM0ё˜ЫЁ ћ>~ј—ЇаnЃз…С�’Щ2\šaг”<MI›MšoОAћСВс}—вtЊ@†Ь-/3ЗЖFыЮX{Ы„=(БР!!аўwW*,H€С.ДОПЗїоєЪ FƒЊwЪ}”чEЎViя ZoГ iM>љ)ђ_ќеЧС?DљБyn‰“Œо#%ЏаБ™ЗЅюёсуrqюдcвїh­ЉЬЯЯЭLљœ€C}Ў§ч_eцЯ§|u@‚?.Y6/\ьAПHўX ЙEђ—eи,УeщжCZпџнѕќВж[юLOO3{і,ЕЙ9ЙПООё}xpD1ШшFъ“LРpїwвєЧ.ЯГчЯS C"яИŽL�Š\krЅЩ!rЯ‡йП‚њѓП>ќFч4CВМаўEЪHJ‚ VpYЮ Ыhф~xqЅЯrШ„жD33TЉЌ­ЁЋUT€1Ќ}bŠЙŸљгЈЪќуZ?юГˆ@–BЏYжPпЅ)vаЇџСћьыŸвЛя€q‡к/†=ЎTYX]eюм9d{л~+I~м+ьПФ�™€Ѓ /1@шойњщюю;ГkkЬ--Qѓд—)E†"S…ічк›�Dи(Цжы№‹ПDќkПAДИ4Вї#ЇШпЩѓ"ŽЖcZяччХЙ‚%r‹ЄYОГcр‡Г…ŠЁеOЪ8‡!j4Xzэ5*KKшjТЉ•)ддeŒшјўђЌHчyОѕљ€,CвBыѓv‹ўџ€ц?њ}’ннТЩі 7ђњ§Й Cf—–˜?wŽЦТ;wюьў?№NЉ#9Ђ&№1` €žƒюt:?yIычf/\Јюьэб HЄ ~Ћ4Й6X`ƒ�~ѕ? ёўбќBМR…S7JІ€diqP7Md”rQN|=Ѕ'Hf§c :Ÿѕ‰ё~„ћЗ^ 2ўњЬ3Яpюg–оƒ8чЈ.7 УЈ^Є�ЈѕCСR–#y†ннЁї­oвљСЄYv�ќэЗZS™žane…™Е5єЃG|goяЛатhћф\Р$GpX_жўіюю_клЛyѕТ…чЖЗUяю]RkЩ•" @тЂWoщЫЬўЦ_Ё27жќrŒ.‚$$Я саЪgзМэWŠэ§ЉsИм7Pz(и“’ћКU<)иC!-bt5:z†aхk_цбПњ#LЕJ8Кл…ц?KxгbГB�œѓ>ЫPѓНіїКdМOчw›юћя‘Є9ЉјВ^9e!P:skk,\ИРдм›?њбі?яt~B!�н<fџ› ˜hn‰l§с­[зŸ}ўљЇЎ\ЉД[-z{{$JcЕЦ6 АaDќђ+œљЯў*ѕЅх"OЎЭ!№Хйј‡ЕЦ/Я@ Нўaј'‚ Сš„Ё+:‰ђˆƒќиiЪyvTntЎ•;RbІŸŠюЗ+фzй|uѕk“Г’ж;y#­їvпƒяіїЩО§/ќЋNџж-вЌ�tъAЯKѓ0ЄБДЬТЙsЬž;‡ъvнпџњл eШJƒ?$лr‰ёАМИѓnmНѕЇянћє™Ы—/,ьювьѕШЌХOџa„Y>УљџтПbъмљЂт6 |Kвя‚Е|Ц2в>,TYё."@Wп{јJy‡oRњп R€ЧДЄЮЅ2Ÿ]:‚'qƒFзчh<ћ§ћЃЩЗЗ {{P›?ќC†/…џRC<I‚мј�ћOџ Щ›пgАНE–f‡BМДфlД_i‚™YцWW™_]ezmпўэжПnЕоmСО€ўсŸœ4шJ,ј/ъ�­-Ѕ§Ѓя}яЭџђc;ПємsЊнj‘llС_\тщџцПeсщЋhLЅтёѕрлзы7AыХГ›jЄ…AсœиЭ’�@*€PˆX{4э{аQ)jмLЈЃ”^с$@$B\1БU{ъiŸБvЄл›„ї~ЯўьA„cэн[OїiRTLнЛƒќсЗБo|фс&ЩЮIПO"Bтщ>‘УєŸ PЈЉifЯcљтEц/_&иоцџјп§‡Z_W"-щCџЇЊp“œA ѓћIђг_}яНЯyщЅ3‹—.бщѕиMЈ7Xћх_aх•WPy^L}(S'НNiу(ърžšБір‰E9ƒŒiўШS—М�rhљTыјjШ Ѕ ЅP2A@Ž№пœ]$Ђ№ŠœОЉеˆWV~Ї^РНѓ]є•ЯŽ9q…Жя=‚§Иљ|јМћюо=ВН=ВN‡Єп'ЕŽЬи§!Єx№И(ЂКМЬмъ*skkдgfhўуœ§=ЅўHљЂ[96ќ;‰(™‘�(ЅzZыю†ШЮ7oп~ѓз?ўёЏЬ_ЙuZ-Вѕuf_{§љџ( QZcЊ•CTшz-$эа~yтЇ/k9Шћ+AЄПЪс™†lЙЂLЏФ§КрLЩЧ4ОвiiО`dlŽИ ХќuœФ^:ђЧоmffH::ћ†СџŠЅЕaі, zаяОv vwawжзсбђhМн&mЗt:$йdЇoЄ§rc˜][cём9fЮŸ‡ѕuљС‡^KыZЄуœ_2‘ўOb€ЧœAcLшZ­лџїН{з_П{їйч^zщЉхnW17ЧЕПё7˜šž†4ХЬЮЪєЙ^щЕ‹Ьй00Tћ!ј#С№ѓZC›щ2pњpи4:*D …ѓ&<‚мyбЂє�Ѕћž’eЬй|vб}ŒuU љ2ЩpŽцэлмј­пBяo№КљŸЉџъ_+вsэДл~’gі›АЗьЗШZ-’f‹Єн&I’ХhП$‰*ЈПБЖЦђ… ,\КD}f†лџрь§NГљ†AW[;Z f­=Vћён“цCF5‚У8֘Z'тљ§§Љз^|ёR83cfОјEж>ѕ)шї1• сTур&%=ЄНыПЉˆPОфIщУeVЦŒф�<fБъpg˜<БХtЊ’% 8AђqŠŠŠn‘0ВжГˆ-йц"‘$юРV‹—WАyqjФ<2ž@AќwГГdн.ћ’Џпcq&BЯ.CЏN!ћ-hЖ‘Н}ь~‹Де"йпgаэ’XW,—’УЃX]RTbйj•Ъъ*K—/sіЉЇXИrЙ{з}ыї~янп7ц'lQ8€-щњKй„5˜Ї�UЪЊ0 ƒсв+cL=‚™­uЏ†скх?ѕЇfц^“$E9ђќ<: |(–сvз‹›ЋM1gЎЕв„!Ъ„EдP8š9зГсqx.RФќЮA‚5hйGI х’‘з-6їБxq<"?ђ—+ђЌГЁ9mВуФ Ÿ”ЮЕ ё™3є>dћС#Ђ[з™={Ѕ‚‚і[ЃawїIїїIšћє[-Y^€=Нtьy№ScˆЮЎ0wщЋO?Э™gžaj~žПљ›эџЕгљСК1›Р# Љ”ъˆHG)•њЕŒG2РI&раК9cŒгZ‹1ЦAрВ АџзУ‡З?ЙВВG‘vЭ&СЬ : G›ллDв%ЭC—OiU€†Ј <œ@QІ˜СРY”XФщаЫЃ4‘$ƒюЁєHzШџ8<Pš5Оц)?— ЮWPЗл(œФRОBЉƒ" ‚zеЏ}w77ЙО~›њ?ќ]Ю~хы…?въ@ГmzъoЕД; вьАж—ОО+Д?S=3CcmХѓч™ПpЉеU’?јо0fћƒZ­d™ђsИ ШВьФ>'VA ”Rc”жZA ќ НќЙЯU*—/+щv‹їжы…†‹р:{ИЮ^Ён>БЫасSУ špBіlшzУЇЬ"КQЮ|t<pћAuав.4нљјnxю?9ШHZЉ’Й!їО“РG.C№E)œs8Ѕp"Dssœ§љŸчо7ПЩ7n1§­oR{ў%ш%Иv‡Мг!ŽСрБ/XшyHWЉPY>Умъ*ѓkkЬœ;‡iЕhЎЏsю/џхЉ™Пћwунн]cŒ DФ�ZDTЪZ‹sGgCЭiьPќХ~]о”1f.‚ЅЫ—/Џ§­Пљ7?І^Г§}ТzhiЉИ1ƒ.nыNЁСAXdЗћЦ ТЦХ”ъ„,ŽфШzsуЄЪЧаi|šЂВ •ч(зGЩ6Zі!O„#ЫŠЯЯгсs)ЄЄХs6 Шв)$sHZ\o8\iŒfъђМx­ttЅзЬє4Ф1[ійк|ФќіC"eШZэТцяэбяtфЎаrOѕ={@љЯy­ЌАpх чž}–хЋW™Y]Ѕї­oсО№ЊŸјD єЏ_ПОa­mуч\_)•хyn}3 љ(  ŠР^sК�� �IDAT&jиi#№kяу0 ЋПќЫП|ѕќкZ-поFђœpnnЄ'іб}\П‹Š*‡ЋtFbх…aЂёq <ѕ€f>Ж$eЈсЬЁJPzЗy‡SЧжGЎœ7бqФNА6$ВЮФZlПsЎаьЁі‹/J‰"VќVЋkќ{GkЎ­eцщЇIњ}жП›ђoЖ6xЕѕ!q%&iwшwЛєRKпyРНєНз?ъЌЁznŽЦъ* kkЬ;ЧдЙsи[Зшіћ/ПL=‚—_~љТЗП§эwoмИqO)Ub­u˜чЙё, —N= vс(uЈЈ�ечž{nљsŸћмЅШ93шt0• І^/˜ЛлЦ>Z/ьўЈ€ct7‹ъž#С$якŸ Š„Jš" цЈ$A’•g н|я§ŒТC/І‚e”B[L!Л‡їqћHЕшvgШs]дм9‡ЫsЌШc u A€ƒ…уЊk5ТХEТ…ТЅЅbё†ж8ŸГ˜О|™AПЯц~Фmочуж!ЗtК}WФѕ}JЖьшЊUgЯВАКЪ‚љу0dыї~СЏ§• Š".^МИќъЋЏžЛyѓц@U)Ёж:№и CAuк<РHOED;чB­ѕp§z=‚Љз_§ђеЇŸ^ЪJкЏДFђ”ьжO‘<+œ;ч :FI=ЙАSф=ь#Iв>d}HвТфШ`€J ћ(ЕуB2КŽ чџsd€Д›ИнмУИ­uмЮ.w8ЇhЫyRiсDp"РћВыC-Ж†ZЎN)Dkœ.8c0$˜ŸЇВЖFДМ ѕ:DГWЎр”bы-УwЕстњ]"'#ŠOJЧAщhу˜Ъ™Г,^МШ™K—XМt‰Цв{џяqwЖBuvещЮЯSЏзЭ—ОєЅПёoќ0Mг)Љ‹Hе9з/…‚OЬ�Ѓј_DB‰ќRцкдддєПјХjA`њэ6Jk‚F”ТэnтZ;|_дY6AЃф ;qyIі‘A’žП RŠ– )jаЛчС/ *”ѕР[‡Ъ-ЎЙ‡lмУm<Рэ=BіідтЌCЌ 2CŠУIЇа|~YћэиB Q ;Є|Ѕ €3†ЄнІѓрЊVCЯЭЬЯ­­1ЕВ‚ЭsЖДц(цьН[T›­Q›”2Є@І сьГ++,љ*ŸЦкй;яpѓћпgѓчXнDEищi‚ `uuuсеW_Н№/ўХПиjЏPDL&ЯsЫ„оŽС1к_XъЂKGшmKMDъЏМђЪХчž{юŒkЕpiJ8;‹ЉTЄOір2шAЕихЌЏь-eќќмИ(WЄ…Х"v�Yшї‘Є_Ќ!LzH7/2мƒ>Є[РŽЯxMЯsші‡ыШ‡з‘§=\o€єг№мoAЌILЂBФuFх^Cg�;Ц�жяр@�JB Црz=ьоrя|№faЪ… ,>ћ,;QФэ0ІОyŸЦі6Yšf€FƒщеU–ЯcсТfЮŸ'с§ПѓwxЏ1…ЮaАw›РФдЉЭЬE‘ў…_ј…П§эoП›чyЭ+k,"oŒЅ'UЦЧ�У…";ч*Zыšˆ4ОўѕЏП<]ЋщСц&.Я  t‘Џп"пИ… "дhў[J%Ržњ•щЕфт2яьѕAщї р=єЖF:9*йFЩ&Ъk;iЛ;Ш§лШ­‘f I‹‚Щ)UNfœS ЩIŠ№­О-?nЌ[6C№•*€/ ‚3#ahоНKДКJcq‚€f­Fsfžxувj“њdP†Ь./sцќy–.^dveНЕХУпњ-~$ТЃ™ІњŠЄЙNЅБJџсCтFƒJЅТкккЪ+ЏМrўџ№њІБR*rЮ J+ƒŸШ0"–zидЎ]ЛЖђьГЯЎш<'kЕ@)‚ЉЉbБФ­З‘ЄИ–фЦ^ѓѕA- r~ІOyaСІ`‹АOњmЄчєP§.ЎUAѕл(ћа'€ВП‡мx6ю#ЛMH]Цe‹ф$ї…ЃЖ№јХAJH†CdPhўаЫї>ŠѓG™`Ц§€‘@”˜Р}‚Ё A! iJчцMЈV1 TggщjMГо@šMмцљо>к9ді6йЛявлоfч;п!кирЇJqћщЇ‰Ќ%Ы’Ю>6k’ьжЩVWЉ4LOO7Ў]Лvю;пљЮлУ&Sо %?@жŒьПR*‘ЊˆдП№…/\=wю\#kЕШЛ]‚ZpzЛЗEvџПў!(B7ф 8R)а‚ ЌЯєyЇЯх`“ТыOкHЛ‰t:аяAП‹ыѕ‘§�mBž!{{И;Т[ЈN‡Є…)L|1Аї| Ў�'0P'щˆюЅDћу§n'Ў˜UъАY(љУЃењ€М�8=и$!щv‘J…paІІHу;7GжыaіїЩšMК жзй юœ=ЫњвRБјФ9ВмбяygƒTM“ььеj4рљчŸњТ… ?Мyѓц†Ч,‚a[М“jЧщ?š� :777§ёќќtЃѕюп/’Е: щјЎпC!bRПШУkОж„RдЬЋРЯ№eОHb€Є=Дq­НbђЄз…^зIPƒвk#ыї‘пCэЗ u…сЬ рЩЫрїчХT4VЙ‘ЖK є‰'TЫŠR‡Ѓ,cЮЁ5ІH С‡‘.ЯБiJвэЂчц ˆ"œ1dычЮqЏTСжhЅ+/ ЩђЌѓАr‘to{ц aВККzvyyyўЦuВ‡^�Œo{ˆ‚c–иŽ3@|ётХ…‹/.­IšMФZ‚щi\{Ÿєў­"‹&тSСЃТ^T˜ЁТ�жQсTСYЗШійЩњvЁп.ЈНлnеэ ’йкТ}јl?BѕRФчNUъŠrРсЙјeр‡љЁbnд࢘ЖЛ BрЦРž$$2&�тSУтмЈoSLљЃƒhMђшt:ѓѓдщЕлиС�WъQPЌЄV#ЄЃˆt šm*г;d­iђ^hf†щщщъЕkзЮїЛп}ЫkЙ7:M‡QЛ8п\1‘XDЊЯ>ћьйЫ—//‘edћћ B4;CК~›ьс=TžсD 18TЂЋ]TXEEгЈxжЯєQ0ГH6€Є Н=ЄЙл~н.tЛHЋ…мП‹|ј ,*IЪWE–ї:”/C@‹›XTжHQcZ ѕŽеіёзŸ)|ŒМ�Ша4x&Я ж’gIЏ‡щtЈЎЎNMб H’„ЬкQўD‡!AЕZN/gPЩЩНC!нп'.Ђѕёќљ—Оѕ\erИг;Ф'6‹Ж”R•kзЎ]Јеj:йнХY‹ ‚(Ђwыlk†ХJqЈИЎ”ЎŽ l€?Њ‘O!-?К{иНmмюєњEHwћ&ььA?GЅ‚Є RWд€њ•УюОЃ5&юаЯСB?ПWжр“�?ъ=їљЁ0 ‡ШHDЄ8И"KЉ53Њ ЌЌЌMMЁ+Lž“9JјІ6ЫШ•bаі&е•Я’ээс.\ Ю;wІRЉдКнnфјёю`MРЄvqC)Ѕтgžyц|ЕZЅ}ѓ&’чшF—є|№“§ Сд&6(ІQ(Ѓ‚јpв/ы#I4ЁЛ‹ДЖ‘н‡И‡‘wqюЃ:H•8$•IqЬхPпqБ‡— ‡W—;яхф9NЗЛТq‚С$b(CпAф ƒX.,ёL€sфyN+M‰—–ggдеЙQŸЇŠЕ˜ƒЎ#KšHКEЖ[Ње*еjЕђЩO~rѕ;пљЮƒaBˆЧ;Мs”PŽ�†§уFЃQ?ўќrE$ћћ8k ъuьюН§бк%ДI &žUэ(чМц—І|m†Д"ho#ЭMdoЗ~“ь­ыАГ_ДЗJЇ}A —Рц~™}‰ъЧfvЧN(‹qЇ„уvК8RЦ§‹ВyАЖˆ6†‹UEFїiФЦрЌЅ5u:D‹‹Х,ъ0aUŠD+фAМѕ�Ќb›MІЯŸЧЃ_~љх‹пўіЗп:Ђ?рЉкФiŸE E$Мvэк™ЙЙЙих9yЇƒX‹‰cя§зя#YBАа-*мДЩ/ˆШSЏІІЈЬщl!­ЭB�Z;HsYwѓЇИэ–w№dМђ‹с$ї)9ДІєP`3 ˜lBbч(!8Ю4И'0Б‚_њ>*%ѓѕNыЂ9Uy Ђ)ZшєЗЗIг”кќ<: Gп7ZО­‰ЫА­md!%o61—/Q­Vе… Ю”r�СЄЧ1Рјn!б /МpЎZ­’їћи4Хх9CчпСІ)Z71І‹d3HfQYБъEВщэу‚*ЪTўвк@Z=эo ЗоBМƒДкИ^сфIЪHыGРлƒN*ИУН"ŽкœH|zѕ8р'=–БЪX9ЅіOb‰Чќя”W"Њ•†Е‡~aВЗ‡эѕЈ-,ФёˆбД?vїћи§-”NА­бTЋUеh4І[[[!E‹ќ‰л§œи(вчТ•••ХzНNоja“ЄpУ€ўЛ?†Є‹fIfИ$+ІmУ*ш"ъQQ.Г|§}мўCdћrџЇШƒаjуњ7TюЕ>ѓ…>і€іЅT1.r|MћpЄ%э)С}?б˜ R*K“бъgёk%5Ъ9lžг ЈЮЭеjEЇR Я2вŽ+Њ­Ѕ iB(BGDQT;ўќьжжж8Lь:isЂCЛW,//ЯW*К;;Ѓ ˜t§Жг"P]t#§ЈHХ$ю#AЇ"”e:Х?—єюnѓCdѓВЕ^”J'ƘеKНЃg‹ъpUBLœorЪМ2a=єQЛ[ЙchŸLРIбТ8Œ—”KЉ|^МЇ/О›ˆђL yЮ`{WЋQ™š"0†Дй$э;l+AЙ=GЈ @МААар№>CњIђ�#№kЕZeiiЉЊ”"ыtШ“e ƒл`Л]ТИ НLъЁ‚.ЮДСшT  JC–"=dчђш>ВГьlB7AйbЦа%t/жOјЛ7_=�dcыЂŽкЮl’@ИLФ“ Ц™Цћ”ч!ќуHU]бdЎДpжZВ4ХэяНšЃЂn?ХАƒBаcЈзы•Ё�Œх�8X.1/^œЎT*1pPїf йі6 ƒЗпB™g5JЕAU‹Л?Ш hЃЌEКћHѓвоƒнMdwЋШјх>ƒ— Wѕ–<}9 §r™В:јRђўЂјIёQ�vO( ”…Р'0*(П/аrŠŽ PJJ}<0"~ЅЕŸфъf(щФŽАfŽJЅеыѕjЩ—›$ъЈT№ЁŒ|7ь`фРјxtpч’єб‹нkЁLŒЎƒ“Ињ9vЉЁ4)–Ju[H{йл‚neн]w УЂ(H•Т;5VЃЮ)€ ыЂŽ�wŒЉ8Jћнi"“XA„XС‚Р4B  х`K4‡.э чш 4•цR„њBa'ж„ahЂ(ŠНіOкїёT  �=??_ ‚ іёqж"YŠллAВ• Ў'ф[шJ ]лGO5бA„2О \ю @З]ŒAџS'CЯ>є@ЄАЪс… Їiј %РЁсі „сIs'=ј™š`Кєџu,мTŠA+–Ÿ(kЇЯвaмо�9… Иœ0 У0 у0 ƒ,ЫЬ„@• O)ПЙвA“чИц.vw‡Р1;пДЉtћHЋ…‹Њш .$8ЗЈlрЋz}Гх’‡5мКIW} Y=ѕxGР�&яMwœэ—#@џ(&с(7Cа)і†1ЅkЄTQ! ‚A+х5]ŽбER{Љ P™™:” ŸžžžЎеjQГйœДыыБy€Cц@DЈеj =­%Я,6w[xэЃvФ^ж\šЂT†h……Ÿіо=b›Huх•л“lџуэ$;aaМ;EрNЈ SМwјаƒ>яSsjB”Бьz№•~Dѕcш  PО•ПбдІ<СHY™Мхящзј/RУюнCw;иn—Р .ѕ§‘мј/-эУ‚P9žsT*л›№kOйуЇœ , �'8„OjNz_–3эЕоcњM§†ПU{рЕRјЅ>“їєPLЭЏЫэ\ŽQё0Џ Цj�дGZF9~ѕлІи<'Ыr"+иМ�_rv!špйсF yЅЧ:RЈX!=yŒўсєћ‚Ш Ž<�|sPЁиpБс5ў8vpР†ЯXЪX>d�3|уЏ7"ІWЮ7ŒСo\Ю9й№<8Х}DDЄпяMMж8чŠо†ЎXБЈ’Aгуk‹к� еСsУЎУх‚iH›Lьюі$Ž`>aш$л\x('‰ђ…“‹ѕшSd Ачщјzp3v^>ža*ЕЕљхбМx–хЭ-Ÿ"сЄ&QгъУ}ou˜мсЌБіaŠяюІuщ?дШЃл†BрСWcя ЇЂНcy ћ”�”ї=Ю;?ЮШ aтpT?Ь›ЄРC”БzМё …ЧGрІБДD<г8ш|ЂdЪI C&EQЅЂ—тхА^ЅАж’ д K›ƒцх…•*fh5lм]Сјn˜XaЊЕіќO#�OЧŸ”ѕ;ŠДЗя3žъЧ‚›#'†Ч6а<|sја Г/^ Z˜*­ў*˜Жлэv“$ЩŽqQŽн3h4оnЗН^/ˆІЇ‹9kW43ВЎXЪ” DКсД.Ріѓ+Ј!n‹#NаZY?UZК  ВЌ‹‰™ЌљrJр(x8 ј9`‰ƒmWž4›шМічcB~””ї‹жъЯ/MБєхЁB9ЈtBžчtЛн^’$щЙ09Ъ<цCэююv[­VT*ЕЂr‘ЛbхvБ[ˆз�oЄt> ЁЂёЇьцщќ… І05ШК“ѓ�џ6N œb>рИАЏRŠхсЃ—ѕ|?—ЃР?Š †‚0ЬНp–ъхХЂБ–е Yn .ЫВєˆtЇe�иэээNГйucЈ.,MT•f ЁVt€ŠS~hлEЦмл’НW>Ÿ=r JMBЂEж“У›‡<сd=" ќЈўРь1Z\эР$ићьЄœэqОР”Qœ§х—PеРЏЕ, ­њ§~кщtzо,њ1 O`ЯШїїї{{{{НдяЄ5}сN zОѕmз76pЅ’lыщ8zЎєМ;є^9дD<š)X𪘞('m|}пЄх^“Ц$/?�Vќ>b Иќ{{оћ/{ў'^~Ў \јђ34^ZƒZ͘9Г!(E–[Z­ж йlЖ9zУЈ#ї п=,лппoюяя0sсBV’8СњU7-пвєPы}ї8№G чW№ ЯMЄˆчTQЪ}ŠМу†ћ  XѓкЏNЈ<M!)ьу"ЧPџqŽрь™)VџЬ шЉJБП ЁŠ<ЗДлэСЮЮN{ ќЧLРi В{їю­ЗZ-€bчŒйYTЕFŽ!БХтЪОƒІ_š'n‚Шуь0љ\FЋѓS9> {œЖй ЫМ' ЧЄчФлйs>o/Ї4!'9„ж @~ ˜4bЃЙќЅЇ˜§ЬЈFХ uаš\4эn^Џзпммl2yЗАc7ŒБTzd7nмXпкк*&4‚€ЉsчаѕViњЙoч'Bлг™NŽжx7‰мИЩбЂŽњY Nч]kѕ$3pЪw>Ц>ы“;'QН;хoЦўэIYП c’)XО4Ы•Пњz:‚њŒЏКЎ‚6dЂiЗ;ДлэцЦЦFѓˆš˜Sљ�хНƒв>ј`sooЯцyŽCцЏ^EUЊ…�иQ7rš"ДКЕŒ�.ћЎtœИЋKIТК"ž-LуЃ{Jс<нŸГїЕdм,d­МЃљгŒZhји_{ЪгsEњЕ:м<­Щ4[-ЗЕЕЕ=ОрЃЩ�у›F$ЭfГ§рСƒэfГ‰вšй‹ЉЎЌтL@пћЫ К\`з ЛЎШ”КФL7й4 ™@)Ј/*‚šњH6v‚рŽ`ёё§ўqBљ9Na†яэњЋŽбјIЖП^ј_bхЯОPl:GOкЏB0!IъиййqзЏ_ПEЉпдiLРxєrhII>ќ№У;CGpzm™‹1Sг$zЙ”{4aš"<rEЯ;7Ќ“Щ€Л#|*ІЮЊ‘)8 ееъх8Лп№až>eqRxyв{ЛЧ€?)їЏ)”§ЉЯžчщПўi‚… „ *гE 5а KШ~ЋCЗлKоzы­{Lо0ђX'p\иGрœМ§іл7ЖЗЗЕ–Ъь,3/ЬЭcКжЗѓ?hЮ…ш‹аq‚1 јуќWb‚Аѕ%…шгQОœ�ј$›І4m{кPяЄ‚бqэъвуЕhVІcžџяО@ѕЙ0Ъ3РLQ{ЉŠWs"vїšlnnnЕZ­і1pЂ0о*>њїюнл|џ§їwƒJk.|іГTзЮсДІ•УРЩИ2р2ZЦ5N§ЎœpG›†сsЕyEу! Љ`{Œ)pоЫ_ё7л"зрžР'>™к=jдЫѓU^љОBуеUФ(ˆФUЇ@ЭњХЅ§Tи~ДЫѕызпу`ЛИёУЩІ>!<‚HюпПџшњѕыэv€ЙЫ—™}ъ)T­ŽšйaMvlгп‡чАГ7)RpGœ…�ѕEuF§‰8„УТЃх1№Ÿдй;­CЈJY?}„ jўpi:цщ_{‰Ц‹gp{\7-@ ы | `*ьюuиооюНїо{7�џTy�&EР`џоН{ыЗoпЮ‚(тщŸџ сьV m‹>Зe!8Ђ“ЧCС1КŸ”=tхE ~тhzYQ›- ŽD•–PЙcТОŸY“О'Ё§IЯk3ѕ1Žпц‹цтЏ|Œ™OŸCКnЗлр:9ТЈщбfдNbЖwZмИqуСЦЦЦжЙeЬq&`|бˆtп|ѓЭŸўшG?jgОQѓЅЯ}Žљ^@‚€ƒ§\ШнілЧМ9ДэЯЁ-€мб‘Тј{U�3gѕљ!8.АGxџ5яѕŸ&}ыžАЌL&Єzе)h ИT Y§вЯ-!эЗгЧ>ъуvzHK!љйbc шvЯёрСКНuыжЭ‡>т№ŽЁљЄ№8wGIпМysуіэл›<(В‚33<§е_@зъX e‹ЈхˆрPюпћюЧЏь$>fЪ9_{0НЌЈ/*м„Сpтш(3 |М<­џ(Тхk9| ЬGѓЯ/S[›Цэ'ѕ—†pIkEW4РвleмН{Зsыж­;жксŽaЩ„T0Ї10y'ё^žчэ7оxуп~ћmЩВ E\§ЪWXxўyœR іђТ%‡ѓш‡L я&Мз“'PІ—sgUБ?㘠рэЏxm;iRщДu“d<гg?PPЏœНК@uКŠ4dЇ‡лщ†ЄSˆ\Т%‚$9’ Нžсо§MюпППўУў№}ЖŒKJ9�;Љ”BŸb:ИМdшўр?xчњѕы‡ЉсЅgŸхЙ_ўџкЛђч6ЮѓќМпЗ.AŠ—ФCgœHВS'ЖcЇIгLšщЄэtІгIџіjЇ3uвЄеd(ы0)+’,YЖdK–(JЂ%ёї^_иoС‹(л’,'Х ЫХrIр}оћњG@гр(y@CŠzЯО‹рЂ‹ууєП<Ю†&Œ$uдшБ>Ў`VсЪНИ§ЋєюЅы;Њ{ˆ/$1utzжZDЙйA|oл…o‚яY-ЂхСГ Ѕ’ƒћї—qэкЕЋ­V+\лˆБ%alдzt•|@НVЋ•/_О|cqqбї<ŒsМіы_У* ЗЧБlЙr­Й\}жEXб5р{WUD%Aф:?Юp`І€Т$!Zj„тгGA@В c/§э?…A(њш|Жё9�Cc˜œJуРСЄв\ђб„фpЉœRЖŸв“€уKюї`;&?)тсУ‡ы~јсgш\ыєhn?ОЬвЈ0&ЁћОЏлЖЭђљќє‰'2‰DV6 -‘ФнЙЙ ^AАЪ ‚.–"ЕнB9'”7„кB ОЉ л]уВ{_Ў‰ СLь–@нЪЂ›X9ХјУWiѓю ФФvd"ˆАtТ№А‰й#Ж qж6п›`{>Ж‡8Roќк№ЄќЮ‚›Xoшјфцяєщгѓ7nмИ. ŒKv‡RРC кOГ1DmF Ї†™еj• …}“333 �2ЃЃxxх JbC�iшDHBЉ юUсЉ""†№]uЭyХnэЁn�Щг’KAЦRaƒ}вѕлЋxS|‰ѓД‡_Њ› sHbџT ‹Щ>@Šщр FъšЃSШМѕs0Ц@F[FїзЊИxё+gЮœyokkkY!~–х��љIDATUЩxНTРгl SЅ@Мв=Я3Ъхrsbbт{‡NЄгiЉќfKѓѓplЛ=™+Э )йХr6ѕ lЧiu…+Х_P7дcІ‰$ƒ™tЈйAЊ+ŸНˆџД@ ЇЈтс$2 љCіH 7Јƒ3ѕšn�p�Z&‹ь_§ Z.п&ОЏ'АХRИ~ѓswaaсђхЫ—?є}C–V$�т\@|аKp�њЮЮŽoYVrxxјаєє4щ†‘cпСњGзАњљј5ВŒ`Љ%р5аUёKд-(вLŠn -d�IЦ ‹кэZТћr„я”~љ|‰$a Р1zдФШ F–Уа Œ�!zH€kв?x‰яœcZ03•TK›Ь/,<њЭo~ѓлjЕКЙ6NПЁx�тЋ N Дm�zЕZѕFFFfgffђљ<ИІ!76†›џёя№ф”K[�idебQ Шб]ЂSЧЙшŒ�F‡$Pь„�›‚/<“$Œf Ci‚nŒ\ЏНfhOnJЌ^юœ™�r# #S…i љ:ЌX№}„‹SойRЉ‚Рš>Œє~žHXР§Ž™РЊžТѕ›ŸyЇN:uћіэЯ�lЩg%Fїї,І~Z  €VЏзADм4Э™“'OъчHŽЁvїжnнDА„­!€1FA ™B ~АkЏhS5ƒˆW Ђ—Э@СЗаTЄJ’iƒL2YBnˆ!•€а”Šf9E(­mс+g€ЮКX&Э у “GF1фЧвyУbса/0lкяЂ_tЈžL#ћЫ†68,й”{ JЙaмzД*nЭЭЭЖm{M?\пŒИ=OлЊЦBwАР№</yѕъеЦЦЦf?ў§wо~›˜Ўу­§7l|і)юr3gцЗ]W4‚IЛfГЭ#эстsЄƒJВo L…+„r­`ђUЖ™ЕMфпаdцО�gAШа—зЪ%І0,ТР tрИ­f�лЛ_тШ0†I0LРА�+IС§А;!a…0X3ЯС”-Х rД”> d%‘~чo Fхяѕє�V6>њшЃтќќќЙJЅВІш§z$ј#њ‰џ/+у0�КmлT­VыЙ\юфффЄ‘„‘Щ€ћ.VўxvЫ!( adЄ8ŽЏGё (XйоћZUˆˆЋ(�д;#![ЎQ'j€œkг"X)Bz й,a �%=@HЄ�3Aаu €)vв—ЄьЪ”ЂпйЕяA’уUuРИ†фwыФ[`†Ђ€ћ]+‰b:ЋŸнvп{яЬ…ЋWЏ^і<o=ЦђпSї#0ЊЙ;rлллЖчyОeY‡Іgfx*Цр‘ЃАПxˆ›7кЭU?А†!n™шлил01 Jм‚ 5$н?MБ"EЬЇSНQFЛLmн­YоЁЮёiпC“ ФНhЋрОѓ№ЋHО§З`VDСЎ�pŽL/Џˆљљ…Хwп}їПZ­VИ/И$‰_ЫџыH€~6+—ЫM"Ъ%‰бЃЧŽ1M7?z [ чPл,ЖAPён“ ›Cc@@1–Н,Š u�C•�ВuЭ–їMЖ#„дтDVOƒ б):Ўэ@Ф$}т R?ўАd&0њфŽХJ:Яы.|pqудЉSП]___Š}Tёя?�PuР�АVЋ…ŠišГ…Ba`џФŒtЩЁ!”?М„ЦNЕ§‹u?јуЩ шЅіuКšЁиwЄ`�вЄКœЛїъ"к›nКЯХ]ГЧНBuрЪџЊу $‚66ƒфлž-Д>"†F2ƒЧFg.жЯŸ?іЦз|пEПjјй§Ђ~ЯZФбŒU*•ж“'OžpЮчЭббQdgТJ$Аs%АBVdе№�ЃŽ(Ёъ!tIƒˆwB/ љвr %�SQ,Й—ѕ ^Чx­я#Ц­ U€њ~и! 0Œкј!$і/рCmБODhšI<аs˜ПіБ777їў… Ю8ŽŠўrФэsбgРѓPЊ$hЋОZ­цјСуРијИQBішQјл%To~ЯѕлЦCSrЋ%]ФиA6дВ…+шRЂ[‚јК‚  Gcнq ФŠuжKZФиъНТЯSІЃ0bаЦТzѓяСђmЎ'"јšжЎ..ћяЯЯпœ››ћдћЁшW-џш8Єч&ЈO4ПТ.‹ЧqЈR­˜=tHЫeГШ=†жђ8—рzЂ§ДфЖьЦ‹б1 нСjR)ДЇ{ŽRŒЖА/E�]ЂкмЪњpМЊдkеєj/‚: Рƒ6vжПЯДч<Ўу‹D=*ŠsчЯ/={іїЅRщО$ў–Ђї›§ъўŸ— 5эcзuБМММЪГjѕњ‰§Xaп( ё:мRЭ;ЗфFярŸpД”˜Œv7‰^\%эrЏи}?<Ч%›јRЃŽE@а›ЛћGн@Њс н„>}ж_ў”И^}.7№аШуъу2~їћпп>sцЬЛ+++w�l(Ÿ0мkбџЌl€((RE[�2еZmпјў§|ht љу'а\~€жƒ{чJзvD{�,ъT $v‰Щ"Ђ˜Е)V_‡ялв W їК6œЫк%$”у>*�БРˆи№ЭєWо†qќ'Ћ'CМD ‚q<а ИђЈ„ГчЮ?8sцЬЛЋЋЋ‹’ѓ‹ŠПЏпћ*Ф–�ˆ~E�„у8окккšmлжкњњиијЧаЋп‡ПSFысШsл6Щ4rн—oЌ“Јq шD$ЙЂУ• 0$h—АЊnя№§AО}[ьGЎЕOƒI§DœРВIАЗў кьI03 і'Ссюѓ!\њЂфџaюєнѓчЯџїЪЪЪmi№mХ}Юз!ўГ@?uрЖmЛ=zьyžООYMe2њдсУШŸx ЛЗAž�Wf5Є— AЇn_œѕ� ŠзН�ZR$бЙHQDЗ+ЊЅЏoпG5Ј6™јwGРџњuPњ$ˆiЮ—щнЗ№ђИєp˜;§љћяПџюъъъƒDЖњ„{§o�]IКИњBпї§ѕѕѕuЧqФњццD*;`ьŸ=ˆЁ'@BР~ђЂQ….˜@GeŒ-›L %}кˆ‰lЈKxђ›c$dšš"Q; DюGltЙ•‘ksДŸNAћС$„9 Д ви Ќ§ Oрђ˜ПѕР?{юмЇ/^ќнњњњЂb№…)ок—ѕПH Њ Кšp<ЯsжжжVJЅвЦњЦцJГ™и71I“oМ‰фјмт&ќmX№ љЂCїКR-@і'ъ–�ЁTЛ™7ЎtУЙ~zО[Ќї ђФ€�e №зіAџхAА™A@ЗряLnАіХcOи�Ў48}љуњ{яНwсвЅKџЛЕЕuO|QwЏ‰н™ ўз%ўѓ�@ПъbЙ(CxхrЙT.—W767sы[[ƒљ‘6ёъkШЮЮТЋе`зkа…гsa ЈnK„`kl0Ž$С?6ъИR„іFнœмппЇžзvC, ќ•<Дw&Р8JъСˆнжDu  2pŸх0ПaуќХЫ[ чЎ]ЛvКйl>QЌ§э˜@ћ,8џE��ш=}Э­VЋЕ­­­Gл;;xВБ1еє<š=~…я�г8šХMi@ѓ\d<З§QCQыЩm Ž„``ŠaзiрQлafA™в1КŸХф�:9ŸКУЦсJЮР@џй$јыћРіЅƒxŒ�a@lOі�Š”РЧb їзФйѓѓЫ|№Сџ,..^і<o-пЏі(яіŸё_Д›œ№йjЕЊ+++ŠХтњƒххьнЧ†ІІифоAўШ‘`C™ЎУ7t$9!мѓ;*g€ ЮЏхŽК�*�ъ:ˆд4ІѕДОНъъЩм1љAђŸВДc9шϘ„іж(иО$ШфrѓРсmOЃВs�w‘ХмІg.]н9sіьХљљљџ,•Jw…k}8џ™|п”ˆ“:лллХэээЧ•J….oеjњШ‘Ѓ˜ќС0вi8Ѕ]ЅгА’,& Лn ы#E”ž€,ёЂŽў[ ”” ؘ€#ю”…Q‹F�Єq№ЉДзЁП5 эѕивe@'Ьќ@ƒГ3{лЏрУFчю=Сќ… w/_О<wїюн ЎыЊЁнавW“;ЯЬр{юYп;š2жЅn"hHЫч €ЌaУУУУпйПџЮЮNПёкkЦOOGОVEэТ<ЊзЏСЏз@Ў h2АY…SqрКСFN’ГeУ� №Y ћУ*Ђvy HвюЙŽдmXГ Lg РЧL№Ci№щ$ј> ,Ѓ:ё KЗ]КХaсЩж!|К}Ÿ­T§+з?.---]ЙџўЅZ­Ж"„(+F^XЩлŒdіž чП�D GЂН–|&щІєkф8чљЩЩЩ燇‡_›ќХ;яXЏ;Š}ѕм?~€цУћpŠE\4З V­Cдšѕ\лpxЎЯѓрAьW!4 h“!FС§X‚%8X†ƒЇ8иА>•€6™�Ыщ ‹œЕѕ;ЩкВ€ыZ0АnуњЪ ЎмчўН{їJwюмЙЙДДє~­V[‘œОЃОІXљъTџyqў‹@ДxЄc-Н" B‰EаГ™K&“cƒƒƒGЦЧЧпœžšš<~ј0{ѓи1фЖДˆњЧз%DTa $„cCxрЙrwБс:Nn5с1ШаЁ™&ЌЄsl<эƒe5P‚ƒh tpЬŒ]"„—OЛ�hcCdpsc—nyИ}ЏИsяовG+++7ŠХт]пїУЪХЏХ}+к}юФ‘�шЅTi`Ji–`Ш�ШQЦ4Э}3…Bс‡ћFF&'ЧЧoМђŠі§ё1dwЪРЭO@Х"DЋсиf ФCт›x–Ђ=$&ч i=[ƒ9ў<е�i>ˆS[Ќяr:Е9н#‡8Ж=šI,n ˆЋ7ЉѕЩЇ6зз‹ŸЌЎЎ^o4+žчmGИ=ьоm*йМ=ћјОэ�ˆІ’ЃC1Bi€H)Я €4ЅГйьЁT*u8—ЫЭŽ ЮюпŸ<>3)гФ`e…jfЕ ПВЌІ#pЦBђ� ŒЫ§Мœ… 0|шЙ2ДьXКfк н1‚�С&ŽщЈ Ыw6–V…џљЂГБtПИ\.—‹Хт ЧqЖ$—‡œжь5"яєаѕтEп�zI9ѕ–CB‚ Њ "J™І9lYжx:žIЇг‡sйьиXЁРї O&А?™ФА№1т:HзЊ;eы‚k�œэJ‚Ш1ˆм 5УУ–ЦPJкицжjЫM<омЦЪz­ДЙйxАОБ}З^Џбh4V\знVˆ­rЛ:БC%Мё№ЂˆџM NЈіІ�СPЄBh4†Џ "J�Hjš–K$гІiвu}8•JЅ2щtЪ2M=“J#†СLЧС01h<А‡!A„gЈ†ЋNУЖЈ3†ЂЂiлnНбАЫлхfЙ\nTkЕbЋe?hЕZЫFуБяћ5!D]сю†bа5•Д­Ьщ9Нћ›"Оa є’q`э+циJ ШтœjšЖˆ2D”еu=ЅiZJг4]гДД‚Щ•j "pЮAD‚1жl6› пїэzНО#„Ј !ЪОяo9ŽГсy^E3|†тМЁœk(œnGя#~‰Щ7Ъ…/Ђ`р}Р zalСˆœSŸ�ƒˆ,ylЂ{‘Ђ "РBиђЕeX&:‡f9Ъqєœ­ќž‹ю%НZ џlаН†kщ (:LјŒлЂM=rъ|$/BL'r=ЮьЃїБ—ц ]I6D{*б^ŸЋЁ{ЁVЏ!\<FэФЅБ…ТН*Qн0њMŸv/)Чс%Bœ­АзŽЅИŸЃ]иНXqy‹~ѓІћ­ РЫHјo�т€чEФЉ^чбGь5њivEПє„џ6рЫ�ЂЧітОЋˆћ­�zšMpп ‚џ) пч >@yšЯзiжЗћьOх‹ћSУз§Ќт)Я§џу[ њs§№џФХ6.џЎ�7����IENDЎB`‚�����������������������������������������������������������������������������������refit-0.14/images/icons/tool_rescue_base.png��������������������������������������������������������0000664�0001750�0001750�00000011127�10427440661�020520� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡��� pHYs�� �� �šœ��/iCCPPhotoshop ICC profile��xк­ŽНJУPGЯmEС!ˆ7ст .тЧж1iKjIВ5ЩЅŠ6Йм\?:љ>„ƒ‹Ѓ oPqœ|7A"dpС3џўќ БтuќncFЙ5AЯ—aЫ™GІiР -ЕзяoфEЎјСћ3рiеыј]ўЦlЊ>ЭL•)ˆu ;Гк‚ИмфH[W€kі‚6ˆ;РV>œЄђР1aƒxмaХа�p“Ъ]РЕъмД =6‡У+7Z­–єВ"Qrw\Z5*хVžFf`UTћЊнžжЧJ=Ÿџ%ŒbYйл “КеЄ'цє[…xј§ЎŒяС `ъЖnћpН‹ЭК-/Сќмш/ёРP=њ‹цц���gAMA��иыѕЊ��� cHRM��z%��€ƒ��є%��„б��m_��шl��<‹��Xƒчx��’IDATxкЬ™iЌ]зUЧkя3оsя}ї=ПСіѓ;Nэ8uв&ЄM!Є J -(”J№Š* T-•� Є‚bP% H T mг*tІЅChЇЮф$Nт1~~ѓЯА>œg'BMUПє[:žЮ}ћЌџ^k§џkэ%о{Опњ7я"PТŸ\уО[w№КЋ:xOяГ22ьšNYщŽЩ’№ШDЛqлЛўњ‘\™Ёж ч—іUJ‘$ эv›……оsЧюЗМї­ћЎ‹А_\ы•O~јsЯVїмvёњ*‡іЭб_яВа3(O/•|рў“�М’›X•Б`ЊУёППџРолДыяи5“НyэєњЧЕ'<, Ю91ЦL9яіЗ;гЗЧYѓE$s=7ЗИT,?wяэ‡?ЉMёэЂ(rЮWjЫ РZЮQsУ\ќёмО§7н{ЯЯl!hCџq~уЬ№юнПrwК‹Р@)eЃ(’4M%Žу†Ј`кyНс0y§n˜П{– }ьЋмв_ZшgYѓТЉг ЧІ;СŸумБژъUўи0vођдЉўЏПщк›oxЫэ:ƒЪB5‚d;wоВ‡OWœИ9“цТ0ЌНUU ЦЅcїЬћЗw aŸў*LцШ7‚6-LоЂШЏ~єо;~юЬ‰Їž:ѕe$,o@Q9§ЫoœлмDђ~гоvУ=П§vСGPZ№}@@� ™пЗ‹ЖтјџtwыwБыН'jL0йПcФћАЙТ-œТ&Кб@G№}уЭСблoЛі­єЎ§Гп§›ƒoѕ&�xяеŽ›Ўйѓ‘7§Ъ=3˜-Pцрm§orйOрCєЬNnyM›?жЇŠRpyi?Qо*4f'!™$ <Љ†8ЇQ>3@PБ>,ЌЌп€МђЅkŒ|ЂщЎƒ-!л\ЖЛІх˜“/ph*d.ѓЌѕ"‚ˆрНG)оpыkкјA…-F­СllЇРyPЈ Ц‹<ірc<Гœ r›ё€Еxя=§Ы…я€šя@рЅN �ŒJЊ•EЖVCvЗO\b­k�ЮcQьj+Ўk+>§ 2}žй;nF<p‰"аdХрЛеЉхёЩ‰XНфь+ Ю Ю‚­ Й‚9(G/еЦз‚%„WEŽuй—žХmœКїЅ…~сЙywФьДЇЮЮЮу†CЌЋ%ш0D‚§”ƒj•~w0zaЕ\TJ6РZЕЮ{чaМaТДі‚Јњqudй*G1С‘Н\ѕєEдЃСЉіќєўgcšћwЃЗюТч_VИ|ŒŽ„Ќ‚б"ХИ––Qn§ц�Ќ+†…йВЈшž4€жŽ:‰EР оƒR† 9чiХ†0Œ­уЪsѕ”bowР‹_шб>вЇЙћVšwаq„ёŒч _'/Ьиy ч7Љж9œs•q8еЊpё/ˆЈњƒ•ЋC­ЛˆЏ*Т0BL "8Q\еQLh[І№й<E™ ”сLЁFвQž•биŒ уЧ 6УBЪ{”ї`˜В>a[ж 'МLаѕпQŠБЫ("NЁжькв ГУЃцgё —ЅPЂт|}Њ)TghSрдЫяЪ„ЬзЅЮ‚Бѕц—Јš}DзЌЄТ:?† ‚В@KPПЧ!DбиУ\“|­Dl‰ј�œ ЂeЋkvѓТ”ЁСиš\7YJ\т^ЗDB|Yт­ p„xjox­Ÿ}ђ8л}EЂ-ЙSˆwр…� Э њ­JpbˆFp ЅіДѕЕIIТZюЧ*йМ|§8{Yq}>Цжx\щА…У‹)ƒOХCіwRц"Ы F ˆƒL›:д` Ф–р‚šІEРЈ„ЗŘљ&ѓ™Ъ"JЈдІCШ{pfуt T_|хСжPsœ"л>Ei˜stВтщAƒ8œ\9†МzLІDJ ^!h” 6^C@аd"б[BШ,Ќo @рї‚suƒЏО2„q€ŠB$Puˆ‚g ?Яm[ЯѓogгЫjэ*k/€nя8€э­дПѕQ:‚ ЊsIb2Іg&чn]м™;жхФа+‚Л0tМ8єUY:‹ГрJФW„‰ЏП…AlU'Є-Wе†Lр†]ЛCх”ЮcMЂbаФHжfxъЩ{0ъ‘ЬЬЦзЭЪ-џЕп^к„Yqє УюиxUŽBРЋšђ.ЉБ ыггTCf“.[Ю­+Ді J^Ърф#'h\ЕЃ>yч^:Ч „ ƒ †С2Gn:Ф5_єWw?лџћ‰{хЕPЭ_ЕYUѕR2{…Gс pОТћoGX‰‰ЫsHб'P“—+вЪ�е Э iї@§ч€tk El‡ƒ;гCwЬіЏМЯCW рЕА†і–T2$м3_+0яUЭЕpœТ{TEŽЗ рR]KEgЄMpеУы—UЂОЊ;М|ŽsЫќZы[јРЙ0W`GЗяфЛw$лБИq§‘аQ*„@ЃУД.є’6ё…у?OюA˜EД€ккдТЯ@љђrЄж‰K�ќЅJЗь!ƒ5АТMгмјO‘пœН"�чЦЬПf^ПяшuMeъUЧЋ(<ЪЄ_S`Сp ) о*P‚…Љ™B4-œXdМіR7‡р7ЄJ” fуeP%$j5вŠфŠCшф›]SѓЩг{fSЉ Ъn—Њ 9П!џМЏЫPЙG!(U+mЄЂ„В‹Jg№U‰”НЫžИL“U Ѓ.]›ВдkrђЂс›‹arzTю�žН"� ЂпќJEђѕ%nм;ХMћ:žигQЬ6‰Ї@#№$Ъ x ЃYX и*†PзЇiХLфЁ‚“KŽГ†8ЈŠˆQ^2p}в­b‡žsХnNі3Ž^ус^Є7NZЛg3Зы€ЫWп<]№xЯ0й٘™lГЅн`2 ˜J­HШBшDŽsЋ#žYкЦŒ[т‘ѓFUjd|цbЦKѓ\Шіp`R1;йfLШАђŒlШа…tG%ЫН!ЅёdYТѓ§zынZш…бЋКиJ"EC”1xЌ5,vы0Š“”8Ž ‚ˆю Ї{~‰•>gbЁ•ХhБ|e9СJFкэrbAГ}{‹0єљ˜ЊьS }ђ<'иО,…sDW `.Ђџњ95xn$эЎвIJиhЁт˜4‰№ЖЂЊ \a)MŽSBЄ„I_r_бч“Џca8ЄПЖFœ&„Ђq…ЇнnSєWЉДF�o*ЊЪ02`THжiр=$vФkgBvh;xpе_Мb�‘тТŸО.ZЪгЄ§дšgЅъВц +>усnФки*˜ˆC$ 1д5Q59УчuBЅцІЗ0ˆBœŠбQ„ dYЌEЙ‚сpФ`4Ђ*KOxіu„-КЂm‡Дfrіэ й!vэЎЏ•ЇЎ@ЊeМVЉё-ЛіfŽЂ2”І‹БыќоyЧЗЮhb-мu С/ьmбѓ!‹UТЙЬ‘N[ŽїrЦzŠ™щYЎб+ьl PщЁ0ф<zЎЧп<КDaћлТћŽ8ЖFя<‘RDЂiBП+т=юŠмЕU1,=8ŽRšq€E(nлkx`Ѕ ђА>ђмŽh5&‰БK+МА“oѕSкОтЮйчxУ–1хЬAДhšAХcЇ ЌŠHRс†­Š›ЕŒѓg=о‚йhзKЉFюћЋ№nъEX‡ѕ gј(ƒv‡§…aъФ)zЅЅ7№л:4е2Юk”+(bM#NUBУ лŠцф$ЖнAl…ђšES’f‚срЄCpTNсЌНмЭ‹cFЙл Q$Zа ‡ClYсЂу[$fЂ™Rхgд]„ ЁђTуŽКг€rTуC”wTЦ2ДЭTсvv ˆСbы6O(Bр1?>Б‰КџE“œ*ГДr S4T љ:ЫiЛ&“YЪHЇ-cГбЕy‡VББ‚A”†ў:*!aŠУ„ Iт№(ВД@gЭТ‚ГЅЅ[Тг]ХKД>НШ•гЈ‡‰?y<Ÿўшs%‡цšмМЃЭЕ€kк—DQ‡Ф)ЂРј!xCр`h<™‚щHP.$ѓ9Б†Ю#гEЂти‘$ѕнRŽчЌUœЈ2Юі<ЇŠG.9vn…хQИнH1<ЅBцsqьИxОтX.LMЖи:еb*KБЁb*p"м?jђ˜XЮїJОЗцйхW8БИЪђ('Щ4Ÿ3К}ЭгVqhвГ}r Н`DЛQ(сГЃ-ќчBТBwDi!kЄ|—V­ a ЭЫ[Ю$€Ф—P Y_їуh53p5=|iЅХзњ1ƒ~отEYqофД3ЫЊd|јљя &šы;Џи:п$&"д ,їЦфХ:НѕuЦуsssДЂДТ[›�ёf�ЌЬeёя‹Bт•fЈ8ЦŠb}8Т”Q–a Q@:№ГНeОpш0 у1Ѓ~Ÿ(ŠъPti6›фыЫ”Zc­ЃЌ*ЪврМУ $­VXSБЗ“–уХgЦ~u3�З…ќэо8uг‚%xfXВ&CFЁPF}+єМF‚�б# ‚�?9УƒTQТLšвBŒ ƒКСЯZ-pя J VžF`HХВ%бЬDYy–щNЋ:џђМќѓS#џф+ЗОЏ0"aњО]Щы№ф;wuЂЩ‹…aula†Œt] }@!!}rО HmNПVГ4ДАл­‘f a’` mEJE[[2Б4Хв ,mei‹ЁбpaЁ7ўШГНO|tС~(ї<їŠvў �kvoЊя|їеЭ_zзеŸšЩТ`lЅ@ааXчБоSYOi=Йз4Х№х՘ПшmeЏ]sА}UM: I‹аW$тH\Ilst=`€|LеrтЬњњЇNіОѓЏŠЯ>™ѓйK­фЋp)діjъЗМћРФ/оЕЇu§|3nш,  ЮљKѓ…ŠO_=ёіЏ]ќш Лћя8№ыЩoМƒо,.pvayДи{Й1Хъ+љѓп].ŸxАЫC=8ОaxўђЁуЋtр™'іь{­~хяNvoПggыm?UчuзюjOX­›К№"D^ˆœѕЮќ%ЈЛ”оУТѓtOŸу‹O]xђўгƒя<МюZ6МиwŒ Xн˜ЏЃ)џvRПБЦР“ѕэЩЧž\рžяпzїЮцїмђ“зЯ7З&Q@…Ѕ Ді ШГ@9ЛкуcŸyќЏž|ђЁ!_*рАіJW%WВ~иzЅs‰pфЭsщoл;љoийоПw:kюј…џјЕoНјsлbnкqзчЛ|ЦУу@3†Окјa<йvэŠебЃSщбGхwъVл�У—MўпxљвЪi7. $ы•ьќп�Œhgšл~‡T����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/func_about_base.png���������������������������������������������������������0000775�0001750�0001750�00000006432�10411742012�020314� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡���gAMA��ЏШ7Šщ�� бIDATxœЭ™ypе™Ряuї\Цж‰ЌЫВ�иŽИ|H†`ט EШХbH%[Х^Ёvk+U„кнЊнeџXиTˆcœР.йT­“†,Že›У@LАlYr$ю‘43šK=гЧл?ZДиЦvЦ[ћUuЭtWwпя}яНяhСџЁlя I—ќŠ(ўњkћ9ќћОS/…aŸ';жв&5Ж86‰NЋдСuйџЯž^C‹a№mЇШ}ТЭЫ*XPЁчaGM•BЧEибI‡pyФ.rƒІS}щšj–lМ‹Eїpђ•ч7{џг’БRш*Рc :ИN*Оbx(R%e§В–оА†š+7СТu 3УН(—"0Z Н%ибЩUТхIлdНDЌидШъ{n'мвrŠ03 ц8Љи�JХS н №шЭИNЙмыXќq(Њ…ыЎiрВы—вАцJPaHўВуPЬB§—!Ѓh:E%~НcЏ#xSйьј†/Фq!m_ЯCуYхаЁR4ЗWsѕНэ„kЋ� f“P0Н‘/Ю‚Џ jntfIт§§œ|ї�У=Ч13&ЖУИючя_нЧїwq~žЙ €ьP.л–__ЯЪ›› /ІU�з$и.•w-азh!№•AбІL?бЧрС7щ}ы0JЃ[Jžиv€ЎsЕEЛ€;›H+—› Ÿ 7­ЎФбЁh„є~РUр(P ШOƒ™гЅЁЫЈhК”цезRVю';9к”ЯЬоОЕ•Фц0Н/ORМ(�]1Nn]ЬСtМАЅяРxdAmŠж(XЎwƒТ3мQр o фЦ!33ƒ0}Ьƒq№%ЈК|5­ЋЏ$7>р‹Oпц/giWŒџК(��/ЦкК˜У–Љ6O fЪ+/ Ў RоШŸ}G  „˜›Z6dЦ!бfж3Ушeъ—,#79DjjjйMјn­aпю1м’ЬA мбHWaжОўФ;ёКъЦ0‘цr(К`Ÿp=5(ѓ_ѓЮmРr 5 S§sІја}~_н›O2rbhƒ 2ђRŒї. �РKУ$nkцeса>єQЂХoHЊ–-є ŠЎч @щ’уЧ13‘к ”ћСЇy 9ІСБA/зІІi1ЙЩAІ&Rюnхш‹1z/ �Рю!fnjЁKмЋЧŽ'[Ce: ["Ѕ р€&q…рW?щЅчРБ4B)|a_ЅЗ!1тAhAЄЁSпдЬP_O Ÿ/^і%?ЯНšјь[�€_Ф0ПиР.–О7Н<PЎSГВ Lцfг‘}#XїйtЂјўЩcЉіўЇˆD§DW€_‡tq№=уЪЪ№й&ПЙ$!гcџE�xmћŽzі іБЃЉV]BэŠ…`hЄFГ;8Ž‚G:РПонBOБ "БЉ6ЉЕ­а5Ш —#ЎKtA„Фј0Щ”ЙњЖХќxwŒьЇuЮ dЯЌЃYhќƒSЄF‰љ+_€:E ?xp?/ ф^аЖЌуgJqчъИцОЫи7ТЯіц5›Ѕbшc<щ:<вОЎ†ЋЏo€щ І ЌЂ PaИЏŸ_О~$їoыц?>­k^.$4Оmјф5,_ф‘Й({ŽS%)Ь: ЮА œ4№)ОsјЕсGЬLM—И.Ч_;4? кЯ_5uќр`ќБ ,YU й$3лЄ6dAФ ‘ЕюžЧлЧ> рКЌ—ћйtЫДk!МШ‹ЌОrЌБјљЃЮlж<›ёЇф›н$З_ХЗŒ eНoХџ@7~ާя\чqАЗ›ќГєГљаўБѕUЕeTд•A> Йи&†?ШЅ ь™кИЃ“ѕuВфЇ_І`IР'аџ>zњŽх-ЬФгвBуЗч�№ѕїАьf›аљSз%Ѓ\^9У}yЁјУфД•:ђ~  ќžn3 љ$muх”љ…”pзЇŸ€Bз5 †Ж‰Ѓ+Mvl�ЫBсrђ\NЩЖ}<k .u??>у=9ЉœŒчQз xrn‰кEšK8h  љЬ�Їц–&цТєr($(І“И Хфљ�|}cŸ—*KС3I“™”  4щYЄМ™\аq]ZЮ s�Žы%bЎ … †юЂiBRw!�ч"Жт3ЏfЧFВр—|М^Ѕ$шзp•gЄ-ЫE МШcЛPЬA1GЄ"ˆЎ‚K/РыTŠcщTСKќ|к'ћ�Ÿ.Ђgаg”&РšKФŠY0ГTTзр ”Ыђ‹А )˜Шg-/‡вФ<�M ”šПsЮ’CГГ6ІхzkР*z5­™FW­ŽтК\ЩVrч$…gг >}2МU0т гsЁeA.…јќTжVcлЌкбЩЪГ™№Ьzж=Нfўb;WQŠ€?8ЗйjˆR|l@&ЭЖУР@,эUWЖ 3#щKЏКœЪ…ТЫk&p:vvВIjь3tКŸщф+чcќŽЕ,TŠ‘hРKю\МiЄ Ыq‘?#Р_&%]#c9r™ЂWЫцІМžЯn^ЪЊkZqж45ђРщŒPАXг„ БH9|g[Я@ъl4|д˜y‹‘о#УiFІf™œed"G2[DJ’g�{ —‰ЉYЯE вc`fРбi[ЛEѕ>l‹лйС§ŸPTщ†ЮЦ{жSWЈАm~ОГ“П;GCмоГчg§ьywœ=‡уьљЭ{>˜`,iЂIњЯ +АЯu8жл—Ф.К€€T вЃKЁ—UВёОлЈП$ YплЙя|w9с@q…Я'Јнјџц šXўі‡xђLгю”ФКйх(ЎГ]nЖемсЮ?\›Gц јщ^єЬОъZќшКŽ:._^ Y|aЈ]„ЃЄzёп/ьebвТ0иЋlОёклпМ†ЗZк*Ўоќјsаp-ХvВїЉтw§Y|}pџrŽо8'9mAsk5G„С­Й\ё’ЫкЂHЉyН+FE І‰–ЫZ№“#=l™-№@[3ЗиЋZл‹6мазгxХ Ьў_›нИЕ•šЎищ“К’ьУНЛ™d6ямR,XОEЭ% Ÿ…bЄа0"U\Вb%MеhК0ta5 З`,ЛbЋo†ЬdЦбšзгђ…Uфо•гЃ3зоɘВ[ЋйП{ ыЂ��МЃчЎь‰xasyPЃЊ%ЯC~юл„0�ƒ@M#ЋкЙєЊkXЖz бЦ%ˆш{=х…žЖ;h^{jєm†ћІ:є еэ‚зїЮ`_�€Уі…h›Ш]QЬ[д7GКг‚|ђ 0gРЖAњў0rAЂМСkdM…ј˜ъёў7vRЗv+ЬЦO ]UeЫMМб›П5– рхIŠ›ќь–!nŸ­ћUMх K(И^z6сuйrS`ЭzЭ]!Н,vќCяКа!б“!жRћЅ?!зћ&§‹„Ю6зёв+ЃЬ–�реЮ]ЭМ!‘‘ё\{zЪЄЎ6„О0рХ g.ѕ6гоV›€Щ^ˆї@nт“ј/}^^ыЁгpг7Љ=ђa‹lМЅž=П!Ur�€ЎЩЎ!^МН‘аdЂpХШP&р—’PЙ=тѓ<Тмс:^K͘›kЕ‹Й~) яњаA„сЃrгWбЭiF­з 6оRЭOvQ8€ѓЮ*ŸYGЛ’<'++Т:ЫлЂ4ЗD•ћЬyУšы*ХЧ™хЉђPѓЮнй<Sv”C}EЦћŽ#$уJБъkнчWё]PZќнх„ЫrГ­јВыrO8 EE…В2+лЂTж„ Sєrz)>1^ ,гциЩ уYЩЖMдй^ДшњЦл žЏ-Пw^ПЃƒ/wЛ.[qiивYGs[’ojщв›]—сxŽї{“ŒO‚”&љЉrylл џbYВТdG'O5ё­­7ЖЊ ЮЕеЮLОXšУY&S&–EЏЎё”-xхс} ќОzKіXЙ\^1E§ йщ"ЃБ4Gf˜L[(ХaM№‚ п{И›xЉє–р‰U”)E{eд=ksфН zgШ™.њ4јЧ“)žМчѓПyЏ”d m_ЯMrМЊм�ё )јЉ”<я:ќjл2Ѕаs:)‰\ЧаˆMeЌ WёЖ!љснь*ХЛ?Oў;ўšЉz­X����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_hwtest.png���������������������������������������������������������������0000775�0001750�0001750�00000013724�10413430024�017215� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���gAMA��ЏШ7Šщ��‹IDATxœэmŒWyЧs_іХыЕНvМŽl‡$&!/Jj‚P#BДP$*EЈUE‹*hUP*ѕЊњЁ‘*$ •ЊЊ№Ѕ%ŸЊBEЁЈ%•"0* i”ЇHьШqжБcЧоѕЎwїОЬЬ9ЇfЮмsЮœ™;зЛgљ[ы™ѓ:Яyžч<ЯsЮ™{/дЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQck#xшЁ‡цЖmліУ юЕБ”rсЬ™3~ќёЧ_b@n>‰5Ц‰ждддУFую§ћїsрРЪ 9uъдЁыЎЛюЏЯ— ЦDk1 ЧqЛеjёрƒ2111RуЏ§ы(Ѕо ™§1ЮcBKб‚€‰‰ ІЇЇЙс††6ZZZbii‰ BL“(Р2АJ­�[ - �Эf“™™™Ёжжж�HлЕ€Рtz_c ЁЅ” Д�(5м…ы:iЛ�˜�šщ=<Ф}Р}(П—Пr~ФЗ8 в€Неh4Д + пDк�Ÿф^šќ`гˆЎБyhѓE>Ъ№=ў•$`[Эd`4%HРЪЂС'�~ууp№эNJ%Ы}еyфgїКLi:ѓїeэЪњАш0hШеѕѕ_сe4КэЪј`ѕ9"Oт,? Hо ќX:–шѕzœ<yв’йммЛvэВхhЛ�Mmꉹо–dюр�wђБœ`мЋiiБW@CћбџЙL&д4mЕ …0T)ƒЉ*Лt+љgїйЃŒчхhѕŒKзїц\ЋŒ?О№NЌО€RаRРГ@Ÿ=Р~ аЯ,РТТ‡b}}ыыы„aШќќ<.<  mfьр�Ÿт_˜d6q ”щ44”uБPd” ѓ=)чf–НЬr]*h• кL›љ'^ЮгWDГb0жНуєv–ЇН(ЯM>tј3<ќг?фиЅg!ГРnр5 бZ[[ћхммGѕ‘Ъ<@ГйdяоНƒ‡ЄLi44 Гz‰•ёv>Т.о2 Ь*хЩ7GxЧ A1#|§)#П­&QR!ЅD‘К”вJЧэШэЮ/ Y ОКE 1D‰‹h1“wюК—cKߘ–Ё Lm h}ћлпўў§їпџШдддЛћ§ўЅT`vvvћсУ‡Єk}olржK%˜v{†чДr0ъкСcMмrKЇD)%aвяї‘R–ўХ3Ž”ЬМœ  eЎЕ—нэyП•fнxгS(@HaХ)є$ Z@ї‰'žјрp=А hмqЧ7пxуGВTS�‹"Ѕ@"QУ†ИБтЪ•m!%j `^ѕŸ•VQЎkЏИТ.1лR фЈт/sш~%‘ŒВ{3іqбжsiњ"‰yhMOOO З$4ъhШŒв.’иOќ(ŠPцџ‡d* ­Жб’S!ˆу8'№œRЈ(з‰rњ*|'-ЈВѓГ КсЋ"(€PТД€>‰рЛ$ŠаZ;vь˜7gx‘(#L)AjвцKъ]VKg†NПѕЅТюKŸkbi',ю2Ъв {дAцф[М „Ш)�*.ЄS'ЪЪ•ЪзM„“$zЂУйўТ№О њМaњгЭmiО$V1(Rњ\@†ЩоН Q„‰7mЯЮЮ^Ж?ZФi `ЖФUьOM!ЭЌј‰—Ї v-€вОQхРќ3ѓкŒ"ќ!u…№&R!+сRЉ›ЩЙ#=?y=SЭi q-‘ŒPо ƒоЛ—иgљbzz:,R�г sn ˆњМШ5ЃЎ"ˆТЎ+CЪМ$Œ=Žуœ№нП–ŠЪ…‘§W |•П—к№)RО”ИГNтыгОt PбЂLИКМ8Nа. лvN‰X€"цd—MR�сБ0BfxE^Ё›ŠŒŠ…R03Ыт€ЬЈ„7RIтЂgИ.Рѓ|™ўF_U-€E1@ )€X�ХРЭ+ГaH‘vЃŸ•^…зU�-xScvZфЊд d4@Ѕ lіЋтќŒЯj`и$ pEЫ@<. Е� ˜oмТоЦ-Йvkw/і] ˜›šfчдtЎнђкЅd}ЧйŸКЋ�qг4тЏ Ъ„_poцвЭ­?L 2а.�Cф№e ЭfГ’Ae„ K$11z*@яФЛцќ3Dr&3_ћLѓ—\žZLНѓЖй~ЯьGВzЇћЧ9н;>ˆ#”G0Ž0|ѕЙ™zЂФ2ВъјЌHQџТT�iZ€сЫРBTйХ€Н ­0\АUъT1BХщwEЖХФЦ  ’№+*‡06‚L`ж-{žyoђ9Г�ŠtKћ*И�гш 0бШ4PZ;тё яz9зЗ*I{кh&šМ=Ы*Ю 6эKљR л7ћS"№CG8и>т=dšгАж@)ХŒмЩ;яEъrьКЯЉ'sŠd*œTvЈ`CA PКT mв@3JЊ8лЄирtќГмр,Іћђ№0Є ярФр‘всŽcd<SAџОН L2ЭюЦ|&H)5?в{ЁRбP-vВ'ѓхюTЄт\п&Ь§–d њFP!6ь0b€”�э2Ђ ˆѕђА€ЙоС;3о7;ЗІ`у,шЪїч(€c|VУzІqЏ7{:kkkЅЛО (ŽnqxуаьлP тдaьA œ@Ђ�1Qj Pе ЌЌа$;‚SряKe}& 8FЃоoУNЇSИЯPД!Ѕѓ2e-Џ(I(вГ�)­v.6mk œe TaК�ЫмЦ6Бщ�Kgў0фšvЁїїњfНнэynоv—E“qБhpг иЬ[3кЗЧPV–хЅ<+gц:в{!уь~C.рŠ7‚вџDъжй>€ЪBE\пzSЬцњЩбяВЎПe1~-Ч(ћYiшQ Гоюі<sэyЃRСXН h…“ЈPYN^ЙFЂм#”JъгРє}�ЙQ 0jЙ~hЈ†щ•=‰ изМ™ЙFў#jeLvГ„Œ9-xРЖ6кДчf•Љь…RžB*E`œ9” К,ЏВ PЮY€’Ш+Б�e1РЈћ�цt Ц�КчXEЙ}ƒЌПм§,2ѕлf™kкcg‡/Vр|јЊ§\зФ7>КLrvЦ{и!їd HШУвnРjКРЉOžЌ—§ИЯТкB2ОZ€‘З‚б 0№ѓ {+иZ(в|iх—‚‡фЫТ6яY?†БПŽ‚'Пiѕ›uFК0`MыНsъ§м;љОDˆ† pџŠђs роU�єD—ЇЮџ„чŸЇ'њЭ.Ў(№•Лаеs‡AjА 0ЯУ!Е� Lй‹§'yЁџЄŸЙЦр•‚OьўsєCЄ2РP{ХчЭЊ[_йЯ(Ѓ!чnДХ“qюдБLаe S@уЊ]эzМЮё•у<}сщ§Q�FyР є”hы`ьЦЄ.@щ­М s&0cњ`ї.[К9ТДыФжњо~0НBwѓtН4ЫќьжЎР+ш‚ВШCO(Bћ‹ДЩіrљ›Т/ВЂоЈ| Oœ,П”Г2KaО$!вМAŸEBq—x‘ЙЄєд‰Uœє]СК ЗШь›y—тEN'YT‹,Ж‰ˆ F4qS Zz5 "6юБˆщ}$ь%ЋжЃ5N^>Щ‹+/pяž_cядќ аўиі†)€№ЌѕѕЌvЫм аwSЌƒ~М.@9J"§.Р;Г№е-ЪћПог<п{еЎ/W–В>•^™*Иа{у+Ч9Г~fаоф‹бПržхЂr `bЄЗ‚нг@cљ•Г�N `*€ЯDлЎAeЯ5]@F‹Y‡СN`‘@МŠр<л+,}_аОP}Я6ъwт ыЏААі ыQ'зV отПгЗЖ�Eа—ЙЭЧ~9Г�њ5)†Ч�_gž8Š‚ЈYfїЙ p˜€œчnT 9e2ђtЛPFœяžчдъIVТ•A=WјЎh* 6!(н &= ШFeУКKФdж:.@FхТШђєY.Рh#3ЮУoэ§є`Ц0IyО<wЬeU4=EKж№!}"dlYщлўѓ>{ЃgсУZ€Њ[СJСЙј%:r…4ƒЖu#UlЛ€l Вrї,ом`і њБvљЌzŽИBѓ O^сЋ\oЇ‘ŒˆUD$#„В?TX&|TКХЋьsмУ0ЖЗ‚Э*• Є‹R]NF?хѕшгС.Кэ5[ddm пL.0ю ^фКŽЈ:ЫK…яd™ІМЉš4TѓуцBФФ2qS‰еKˆ”(Їц !аšmкЯq,a™т–aЈ (rYј” –1+т"+ъ"тгЌЫešДhВŸ%T}t8гиХОж[§Ѕѕd‡ сЋV№у БiјчsZДaДЧЁuXДю^s. ˆЅр=ляу§3Вжєhˆ-б ­ь`H|&AJЩп№W(рƒ>Фoxp0щFEхUРђђr–/г3ц*A ЩAУ(1gУ—И,.в+4Йqђ.nšМ‡€€€Fњ№jџ8пМјеŒщžњ SЋs)Brgџ>pч€"=Ž]МЮi~2ѕ7Rba<љ:Џ/CBв;ФRАЏв}zЂЯмѕ{ywћ>Кн.нnwфm`]іќЖc(wЭнc[ы• т8.,ѓСЁ*јђЇeЩзЮвn3˜•TВqфZюЫт Нhг4hВЃ=ъ5БDФŠmb7Sr—їT- BЂ‰иRBЏpIід…L>KAOtгш<x(Cњ"є*‹Ьdњ.\р•W^Щ>Žояї У0KЛљюНzШЯЯlЂ• В•b€"!WŠŒє0ј’ ЄD2d]ЌZC)шЖ;єшqсТЮ;GЗлЅзыбыѕшїћй}Злeqз+,|рDІl=бЫ^›ЪаdlбŸЇ\г'­|e}-ŠЂlЛзНїmы{нЏЩ_ Џ#ЂR P„ЁЋ�FPв|явп3lЯ1јc{>Чўі-ЙњJ%/=%шt:,--бщt2“ЋџtоrxžNœ| Ž”Ж 7[јI”ЎЌУ SАІR Siаw%б~*Н<l5рCQшЏ<P˜3сK^ІwФцЗ™ТB&‘YІе5Бaв’“м:sONnŸІ‚™ŠЌ(Ю7—e:НwbŸѕ ЄQfНyїю„ц}гћ†ѓsŒяУЁ8Ь)‚Q>lжЙ}ыЋ!(~Ппч@ы0tг+-ѕJгz|n7NоTgЙšЗ�E QЄ_}їЃе,щˆЈ•Т4Y:Ыe˜+и2с;`ЮD)ˆуИTјaEбЏLј Ќ/Ђuж› 1сУ&(РА/ˆp—Qe(ѓЗVЇnВќѓ[�WЂШјrŠ1 ?™�Х1Р(РѓˆMAхГ�*эшФ” пUЇž^ч› `.ЁЬМ“—_рK'ОІйoZ6Йє›ƒ|ƒN}Эez3Чl%WщсвОмў1˜ўша—?†)ЧчŸќТp&^6l†}<м5ѓоЊНТOЏn›ЬЈ‰u…ю*DЏ‰•еS•Ђ§ƒGŸ+ЅЛЛѓ( w~УVHЇЯ{яBNкo_ЩR№иХcЅД\)Ўш}€*хЎ H2§ѕrmА…я3Й–0Llб‹щZ„_ХмZVЃ ЯџZўЯ­=УКъаyK!вo!Kcƒ$~бnBfGжНп/ёŒЭ˜Ьа 8qd;]™ќо€r>ўѓд`yіRч˜ЭXЃ_—щЇе‹Мuлэlл3ЩžƒЛ8ЛКТŽhŠ]ё,§~ŸKEN,Ÿ!ъї‘ћ:•зљUP&|Мžхlx6IOл<ЉBCU:Ў•b€ эъ™œfџэчoсЅ^"мю„tuŸнџhжќЯNмч\зЂќ[№w<xфwИэШanу0џ~ў1nЙƒЗЭмР kЧјвёявPЩVТІ1~ˆ№•є—сЋ„P№6G‚Эrц8|ƒѓ 4ЧXнигOЮdЛЬ+Tу+[�_Ÿl сУїŠтcDЎ­O*п‡WXžДKOсWРV>Œё0Ш;ћСI OЏ>Ю‰Ю1pУФ-|ќКЯ2*ыУэп,зLдѕЊ0§ …Ÿч>lТaP!ŒA=0)“єbtŽ‹сЙlжКn!Ч Гяс›Я7.# П’ |§”єїF>Œs'џŒкпО95јRtŽХ№мрНwноУ$нБЫ0ŸЅб4јhё1ўіїфrІої{#ШЙN5—й6m,вgŽУ—іrБ:ЖЗЖ_QЛБSЈЋеПНћsVњћKё§‹п( M&Йq€ОцЮЩ=ж`иЬџЫлХ…K{F‡™цїsж&_‡Т:Waв[пN y№™8KРр!zfщreДu_‰6ћа ŸB ѓље„я<sФ:W[јА—BЁš0гО:ж Ьё™вЌЁ-ќœ‚8Т7щЉ…oclп2гиЦн3Q ;џЧжLџјіпу@ѓF�5&Иgћ­мьfЖ{�еlqяŽ[-э•fћgAСО ф;oЕ8л?›=ћІіћ‚0ЫЛ^uјѕнЗZж�lиІэќуйЧxЙѓ џѓњ‹ўјС—Їђ§Об>Ццnž:Ш—o|ипёЩga§y�ŽьЛ‰Oz^? чП›”ЯЬёЗ?œos)isыО›ИџnЇќgпЭnoлwp Ю? Рлgцx№]ДxкхіРЬѓпњЬЕ#ќ‚/оыaаVGДы?Oю‡Й_^ЁыИшЅз(ЛЦ\!o$ШЂХЋMХ&!"ф /ђџ „$ПЦ ЦњZј5ƒ<ЯS<УрчuЖтш$АJђ“Б+$?$*W№ЈиŠr‘™§�,Ы$?Ў5Оњё@‘(ю*Щƒ'љЕ8YЊ�њw…‹” №Ѓсз2%nаЮ�ЇH!МJ$m’dжЏb(ђ†п ,ћ~€­УФ$ІѓU’пмэ6zуB[У•ѕ -H’Г\JяЏ ŒѕЅа­Žk`C1ЖУ Ÿ;ЭŸМјkї-л,щЎЂв<rњ)дЙiTи…А—д[kЁVŽ&uuћЮ*ˆДЭхЇPЇІэИЕKƒєтSЩ}?БдЊбB9šm!ЛЇpJF{uіhД‘aьлњиь}�Х2џЫ,њмуž{ќХM&їW…зэфkœbљ_S†aГwGљ1яр/иС§Dь@2БIД^œчe^цч$~?тЭЈ�#М(€.Яё#р,А˜!љ=т­EВ^~A№Зеі�JБй;ш`џ§4Cо>~CGџ—HЦдaS~аіƒЁ1€,љTJєHжЬњчшлžІ[ ЩX:$c{sY€гЇOгэц—НN‡ X^^ж?ђžЦуФ$Ьъ“Ќ›ЖЖ P$BЗћA‘`ZРоЏ}эkџДџў5^^^^{ф‘G;qтФ“Р1`X5Ц„"hЛ›€Л€УРNЇО"™хч€€_АuЗIпД(rІ/_ ёƒГ$ŠaжщH"ў5ЎБ�щЭ€2пм&YТЭ‘’|4’,“V€Ы$JsM­“Џu”)@@b!кщеg-$IаІзk.HЊQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF76ў)'"XHe6����IENDЎB`‚��������������������������������������������refit-0.14/images/icons/os_netbsd.png���������������������������������������������������������������0000664�0001750�0001750�00000030143�11136612471�017160� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ��;iCCPICC Profile��x…”KhдP†џŒ)‚Д‚ЈЕ”рB‹Д%>аŠPлiЕж‘qћа"Ш4sgM31™ˆHAмљZŠˆ‹*тBКPpЅ ‘BыkQqЅ"ˆB7RЦџ&эL*V/$љrЮЯы†�USŽcE4`иЮЛЩЎЈvш№€ЖxUЈA5ИR†чД'ћ}ІV>чЏщЗPЄeВIЦŠѕ˜јДmѕ§Kbяыžіњžљњyo5.ŠFыŠlР[%МWђЩМ“Їцˆdc(•&;фFЗ'йAОA^š ё`ˆгТ3€Њ6jr†у2NdЙЅhdeЬQВnЇM›<%эiЯІ†§F~ШYаЦ•­k€E/+ЖН ЌZ_Б5д+ћБ-лЯЄ?ЅvмЫlйь‡SЊЃЌщCЉєs=Ај0sЕTњuЋTšЙЭЌу™eмЂЏeaЪ+ Ј7иЭјЩ9Zˆƒž|U p“sь_Ф.�з?�Ы‰ g"чйnpхХ)ЮшШ9Ї]3;”з6ыњv­G+ДnлhnдR–Ѕљ.Os…'мЂH7cи*pЮўZЦ{ЕА{ђЩў"ч„З{–•‘tЊ“ГD3лњ’ЛЩф{sO7ЙзTЦнгАВбЬwїщГ­8ЯEj"uі`ќ�™ёеЩGх<$xХƒ2Іo?–к— згž<ž‹IM-їЖъсIVЌ3CёY~э’2я:jю8–џЭГЖШs†6я64$б…(šрРEzL*LZЅ_аjТУёП*-$ЪЛ,*К№™{>ћ{N Рн2~ЂqŒ4–#hњ;§›ўFПЉпбП^Љ/4T<#юQгПќqefYŒд(уЫš‚јЋmЇзB–жa^AO^YпЎ.c_Љ/{4™C\ŒO‡КЁLMd<йЕьОHЖј&ќ|sйšЕ/Ю>ЉЋфzЃŽ™Ќ~q6\ kџГЋ`вВЋ№ф.<kЁЎU7Љнj‹КšКKmS[еNОэTї—wєrV&NВn—еЇиƒгєVNК2[џ~1ќ/u [ИІЁЩhТЭeLKјŽріwHљ/ќ … |K;;��� pHYs�� �� вн~ќ�� �IDATxэ} œХЙoWwŸ>ЫœйDйдˆ‚AуЫъ Osz_rуЭЫ‹й\PЃŠDA!bдlЦ„‰KЂq} 5ъuУD@†uі3gэюКџЭщу™•йœ9ѕ›žюЎЎњъЋoЋЏОЊюЃiљ”Ї@žy ф)Ї@žy ф)Ї@žy ф)Ї@žy ф)Ї@žy ф)Ї@žy ф)Ї@žН“ЂwvkŸїJШˆ&Д*MзбЄЈдœЮZ”S/MЅ[uгі`iЇшcП7MпєъёЩ еЎf ]sЅд SјF)eѓŽн­е+ЅЏ Ц5|Ÿн^ГГ=LYЎ™ZЙцŠˆцЖЖЇїyш!хР*ЁУ‘:cИМъАсIЇiДДэ1RЪуqŒtЅ;DHй/hhBзЅ–ˆiZšѕЭlЃWRІ4 h†д…–tР\!ъ„а?ж…XiјЌ—\3єbр—;жfkБRDгї† ф —Њ9зрŒаЈхšbz­sEъч§qгё/kЎ§5зБOFС/ аРh t4УnеUWшЛІC€ J�@И†аt 9†ЩьЅfЋKdи“ZТы„a=% sљ+ec_ЉВQт3ЇL ŸNЏ� ˜^ЁщU;41ЎJkCр–)C™-;Ou]ї,зuО† љ\]1�4—v™CГЩfZ в—Ь&w…)4#@эЧЧZмQhњX'„јH3єЭЎ4kQЅжАќ.jIЭMJлqЫ с1„0EB›šѕTqЊёm™fГ9@нЃDїG‚%”кЬ™3E$QЂFRДбЌ§HnŠс]kЙЛbР‰Т‰ž!єY@ѕд!‹4!5Ђ'ЋЁр{ЬішЉ˜Nј~ZюCIWh1Gьдu§5GгŸ7LыUз,{ПрŽ [Єнј'' Х ’Ѕе-ЕлO^ІF•нЈнЖЈ‡pлм}x'#хІШ1_Ыа&W~iокСжq|4ЮЋ::otк’MЕЇ‚Џџс8ЮBКЧ}WќХСtМGdn{†{MSИ]Xn3DІЃ™И-6УxFПЇќ…/uъмUРр'/7я’gZЄђђLN'xgžьбщгFїЈњ.+)јSЇN-1t§a[Šц­3ЋБ,XYhЙ+RОA оО~C.щƒDc7…‚ZЇШ7S1YАUUšV^ЅСшЖ%Ќ\XLozvД›JaOŸ!]їKЧŒуmДœ0?ez.КоЕВУ9ьZ"­7k†ёЄЋj‘‡џcР’UQЏрgэ_pjпяйюœйБ}–`юuš|CRЉд&њ:+‡^tШc+§Ў^ §*ж,ЂКaМ$tуяЖЈ*јі•еb\ЄЭиы!Ї,Х*0крхЉs9ў{SICл–ЩЙeх5ƒњЧ“Э#СнS5щ|:}В.нa~bнM€pк”Ѓ]0ќvэe�ВU c}иBА#щяKнї;-Tєчр‚mыYTеЏа|o”jrlЮx­ђ#ЈчѕЉ…3BП7М{Жн“д–˜=ЉБ›e–/_nŒ?о™>}њ]………—545н;юм M­З DъD‚гсёЖЄр уCL˜VB{^з ыЄc}”дlЭе ]5_Cзf-I5ФЕэјpсШcЅc†ы}<И|”%dЉ Ч_ Ђ–rp%”i'-<гОЋfЈёFиˆЙД4Ÿw џнСгюX ЏнUц ‚ЯсєƒЎг ЬљЫnЫ!д­6­ыТŸсЩ>�Я м|ѓЭЧ&‰•†цŽ‚БG/йјНСЎpŸ'нHBТ›0ЁšЩщА’ l‹-шсBчuъ§6)єFЭujuУL!OИJW!9ТшM.Рэ!Јн•ћƒf%&jeІeœeбSЧдŒ^:™ФОгŒvЉхxо&QRL”Z4ѓТ‰`щkсіЗYPFЦ†RыGиЉФ0X˜сТ•Уаь`…дˆ_ќПd�ШM7`^D­А€›anжъКЙкoZˆ;ы7ц6Ќ† fьТТхжщщ5‰АЯSEE…QYYщL›6эAXяG›џtЫмљ6L№?Sl$ЯjNk$@Б !y˜h‚u<0gЮАL=kћ/ЃKd255їЖ[ѓШhu•a4 )ЦЗ­пГ;ЉОiѕв >Ќ[їлšБYЦkЧ`Šv†ыШ/JщP‡aЖ�ппC 9™Kт–щ›ъГB™О1fvє„ тEЭ№=ы|ф bкЛѕŠЈусAєrїќЬІїyЪ�}БЖmП эбРуЙѕj'щиеŽэєнcq.>jVр‘’ї˜[HеЄzЖІ\8^^›тЛ##uщr ІяцSNЭ5КH§/hђ‰АŠУш�†-…3RV№ˆ‘�оьоš>]8” 0ЇЕ_­ЃФт aыКёџЅцћCR–=YВtcVPт3'"Г_’7`F№8ЌРЙёhѓГчЮ;ЏaRроb#ёГhR^иэƒ3+вд,;Іљ}Ар`1Ї†рЈЧlв2{ДВR1œЭ ЂgjxCЁ†Шы'p~>B шCј‘вfн DTЂбH'Ђ6Z0мOЗ”bищr€ЋыѕЎ|4иЏю-ВwІЬћрЃFRТ ЦуёoЁѓпšzум1ХБiгт-цІn‡`= 9ј„�у‹HДhˆЪJ /˜ЊЌ7Ѕз’Mш$BОъЙєЁ—†І#Œ щ6VУа=ЏљЬ™ўа›жб_Z/Ўx >@nJфмp2дЙOgѓхф`боb>*ІdЁяу‹+PUPPpZ"жќмœЙЗžе0)t}Б›}а[ющCЁа,Фќ%mШ‡0о„і>j›Я„О=yeћ)ЎšкVAЪИ Н~ЄJМ@ЪЊ�ЎJYI•ПЗўэW№І„7нtгyˆЉџТ*Ÿеpг+бЄЕжЏЅ'[­�ЕыѓШ0šx=ьCWрЉBл7 Уїˆю ?dнYћпЙШzѓ{рЪ…Г7Џї+Ёр<ё№ПУ\iљ1#JGg‰ХP_`КЯ‡ЩqЋГД7ћИ/`‘ёДбA ˜z!’ТїяДњqМdјё%ЩЋ<цЫrЭЄІЃ‚р2В:"нЌіТ]СмЏ€H`0qиАBўHЗоЇычޘ5ыя­з чŠŽU›Б•u‚DЦsЪj†‚™O#јћWi†–5Ќ№№[І——ƒЩ`Д—wАžїЋ Р|Я <œNЇ?єљ|2•JЮф3нњЃ4ћ]*йxїIi<ˆ%§3aСZ’вЏє?9А$UAцSУiтy‡БњѓР|vyП �к”X6 )0џv B˜ОБ3ЏПў;…w5TEыo˜[SћibtRŒЧаЎoFKR н- ЪN‚™ŸрПsћ;4яЫСx­кЦѓFzwк?PЪІкНэЖлBЕЕЕЋ-ЫlЇSяŸyж7OћXХ‘VЂюЧuMЬЇXю@рH&:рЊ™ ћжщ>ы>Y8dY`оКЕ$pfUO~^48w–„ РИікk[ Uwв14LпЈ=їєEwюќ .ЫB–ВNєіgjЃёXnЈKКж|щ/=бwr ™ЏЬ<Доsці'rћЂ­Ё]Њd:ƒк„вd2ЙУA™JЎщ? 5цТѕ‡‹Rып7ЅSš"KZƒ.ћЂџLNхЄsј�ц№ [ЏКyЏk†я -Ўћ„…>OŽзЉžœ”рІВ€:8UїYнДќ#Ѓѕў‹.^Л#i„nХV*юЙлWžД2ѓhзё#ZWˆ]ЙX•лšСyZЩacKSSЩ|ЅёŠ>OŽ]Oя•9`A€Ь/3и„р‹-TПXјѓŠ`ЫQЧ-ŽІЭ5мeƒ2{e(€Й#гйfыо‡5}KЎ0W'e№щв'јяŠO ЮЏйш1^™њНИњ†ЖЊt@�кя":ЈпpУ ›1$ќ–@7MѓШ†р†^§r<eмhb+,(жэNŸ]Pдгtf^У}S9ЬхвиYћtЪ(Ј№:^}ќіТЙkwадЃ\kаІ3оЃй�"Q]]M‰ЂЂЂ;ˆc3ІLK}Ъ=ѓЎ+^< ЁВй1џhXЫj.цJƒiЈЭЙѓxPУyИиŠ-ІхюШq…я”˜ЁћKN .Mэ_§ e”Ц{sј>РxаFЅцz№ьmСЖБпbV№CЕу!ОіцЙsьМДь”"Yџ mЫЃ‚Vыv*rnўPœЧ?J'тjE:г+ЌОa}^Џ3 §-Љџ0Ќ№ГО…;о|VUoзЈ=yћ`Ї св~[ю1тЗcѓ(CФФык[nЙхўгЇПЖ*RqмjŸ;6с$N”Ž{ќТˆ ТЖэ0BБХрЗHЙvћПЂаџm`№У№U~унPщРе"ђ!оГK$–[ ѕ†™зЪ?Ёка­wЁ`OАmьЏ№ $ж $,Т е;ь.юЊ—kž\ф—8КzЮ|X;Е(ƒлƒТъu‡яў|vа#gлиЉА/aB€Qzm?Ы:›ъыNгЊєrЕhђpћt'fŒXHзежёђLЙ}МЋ­фгоЂ�fJгaўy§ѕзЛД8пFјxжщpEІ+Ця-$њœ.Mы ƒЗm QС9Ч"„pф„9sц „�8ž€фтІ6ŽццхЏ{NƒJ�Иa„Lž5kж?0| 3ЮнŠЂбшTtIzвѓюхKюŠ]šеŒs�ык6бмRыкцvМѓЬrWeЛCЁtСќ[р< +рB&рХ’; S@pЈi\ЧV{œ“щ^‡ђЛьW‡Ÿf№ЭgA!El# еЊUС.Мнг§›@0йzŸ‚Э^э6nАžяc(%gМЅ3Кu*�]1Ј№Y7ЬЫbл NЖpЮDФNт…ЮЊ'ž}ійjТ18БXь:›їиj–IŒ=š'="zчœ–еЅ€3ЊЃМ`=ОЬвО@ћ{тšйп`gкh_„ыž)Мqvщ№т№‚`|ц tWxfЗL|ЯТЋзЁM<УFTМ#лцЕЏгЉФЩзяё‰“'rтм1ЁУшQwˆЊ:rХ SŒЧh\ЇЩл кйC iтАoМёЦС <€mфЌ€‡OТд№<Ы~g ГњЛЪCлA–<У‹ФYœ}ійЉЮДmu š?ї`ZаВc№l8f0ƒЗѕ­ˆmlСZЧ,}oїъuu^šэиБУзвв"БkZ1ТЈсHuU8Vdr–'JієPјSЇркKњт*oЖ‡гA�bгŽZ#w~<[пы�Б[›06 K› з.8ьŒЂ…ŸЈ7T мŸ6Ьuђˆц6^ъ?ЪpœзЎГБЮК 0Аž#“уъRіGd.d8цЩС_'жcŽоў{7ъƒЫ–- Ў_П~Т8.ќ‚? eІŒYЩn…›§ЯvфТ… ƒ;wюМu‡!Ь+Хa8и‚Јqš‰glщФ[|RюФБЯj`qосV`ђo<зrЭ{&/чў€up;pF†B!М0ЊІАЊ˜Щћ:ПпџBн са>!žƒ6N„€€В�mЃОФ9 ф1?„kе\7рй�м„ѓG Х{8ПќVЉF№ЯЃ‰‡˜џ єс‡([іЗ`j]p[0”.ѓъ№мapќ%7т5ЈсјžЩК§П]зЮк|Оogљm­9Жs P›Ър `|Њх‘VaHjE[ƒЂщ:SˆБxƒГ"dк%6иЅBЕЈ˜О'`бž ”C+ЫдЫAŒлЦLt&† аBuЌ€mњ!ђуxныhN6— (‰8ƒzp~ДЪ*Тр3-ЮZ<пŒs1Ю'AыŽЁ8Ÿgј%<ЛmН’лžw ѕu<џЪNx`№FX”EИШ„боwpќG?0МZH†>ŽіИ? IœˆЎеx№œЦ™!ыЫЂЮ`\Ÿ :œЬВФ А0љmДѕ `нœ(3fЬ х(AЙsaй–ŸoуКх(,ЃpДIDЈЫЛ<<йяДмKKj#uќ•єсmЭИUњ•т;k_у" —LЛ"#cХЗОѓЈн?рz\/ИЉрЎшœЎЪчф+м Щhб9 ”SЊу у7@ј5ИMv=„ˆ–рrŽxтmƒТёё~№ƒc=ѓ ‡Fо‚ќ qІЩ5!8,ЧљLZх•?˜GЃЬЋ n`Гќкттт3ІL™ВзйAОэўТВ.‡Ж”в�ц-ШŸBfтl - ‚Рq6Ъ<ыAО>oоМс№ƒNЧѕДw …€B—ф Ш›эў#л}О‚>+++ЋТ–ЛЙ€З ЯŸYЗnн–ћюЛo­—ч@.Џ0Њ++QЃ5{лж‚?‡и|]Ш ФŠЏlxЉЭѕЙЎn%/Ї|ѕ-єяЙ\љ9йЁ€€)ZoSGVж4O№U…}Ю1[Єэ@ЩђхQЃb4'Ђ‘p]%яъЋЏŽЃР_кB‡дsќЃlгЖWDДpЄ §ƒpWzљИзСфmd~S?ЦѓяУ<#јh}“ТЦЄaКƒ ќЏюЙчž/nйВХsHСtQџ—xV­O€ЉмGШќE‹љ_xсpщфQ#‚А �Ѓю@™~Ј[„gp0]Ф#ИŸ†ƒ0б%A!Бћѕыї>№ІгШƒ3jѕG<а 8Wо­(KЋУYв00љA0~,„рфЗ lxуЄ9(SAxJ аF�:xдb|Ѕ3ЊЏРa,?Д8•ФNЉfЎД…Vd€TћіК=2кєњoYNзКš­yIY…Sе;rЌНŽі 8;‹‚жіёД3дъŒWМЛГ У‚pHРZ}fE5"5ЊtЪќ @jš€еhё™•э/ˆЪkN“”7=aТяЁ93ifydBHру6nмx кw93Рљ(<? pY0€ГоEО^WW—f™LL#<LY„2яB`ќb>G= “NпƒC@%ДЩ†§l žЇOЇ—Ю(FUсоBРЉ�^єш9€o‡Ћ1,ЬŸєЪЦŸ†GKЏ>|је%%%пЫ4“=e ’ЭЩН–)S›s§1|гЎU№ЙГhJГУfђ;—†f‰*ј5DфжVзшv|ŠJЦuНIћR:A^ѕП'џd†˜œfa/@FѓС|€ЛnBi1hи4 BБ^gme…N сŒр=Ы–Ь!Сy‰ѓБ�ХIАЩ@з~D†iЙ4e№Šu%6ej�KЉ%aa<uHh?‹WцЁšУГџМЧйBАьQ\о�ЁRCЎ •iєu:,Ф7С|ЎЌž мЪaQ~Š2,i.Вxо6ес‹uLь[<ф,lІxЏB0jЬ7cxЅЛP‹пиxIбїa ьŒSЈъДљ'м:оKЧiжЪg№; dGћNЖЉвнœ�ЯЬo˜>џpНёУјХј сC(:Ћ"t–н&Я8›PюS$ѓŽМ†UШ• b Аgœ‚‰ЛœдЪ&o(М<УћuFBCЗтЩr=H†4‡ЎN8a„ё}’ђЯP—C>Vjп=fܘ:ЩU‚Їп+hїbњ1эсїЮ‘4Бњƒ5rрˆя&\c3>vШ7`\˜t# 1 Ѓд^6рЫJ8іЗOF’"XнЄGдм"j7f[ШrмЗƒE4ѓёmМ†ЫћŸвуПСћ№іuhЪWЏвLžY?~OЎЩD2у$К™a@UsЙWсuй@@Жcа_€†^.™žЖrщK3ž§Z˜kЯ nсsDуYŠƒ`8dРе…@љілo_€{ст]рХY ‡“\|•3&ЊЛ.ў6š<L+-ТЦŠ˜Џј|Мо™єeцџiš_зЕ œк‡ыЏ1ŒcПЧШ,8=ЃиhŸЭУLјЇ/MТ‚PЋљ… Ф},5лрpцЗ\YznаЎ{Ѕ�пќIкZ§8”]ЉЅxf§мvККALŒ§&™uХWаat;8Ь.ƒS`АƒЉЁ‰ыG№ь-jaРЏщt.йšxšHMПšіЯйГgŸœЖ<k Ъс9Я{+)ZљOЁэ4€*+@О@]^ˆ<Z њNŠёь_ћЦ•шДЯььоMтcXjHЌ{Ѕў’‚KJЌи§БЄфчp}шК6œNЫ'ЫШyпРT7СВкЬЮ ЕцQHШ№nу“ П.ь$^wNu…~ˆЁЩmиЂ§цЫEЄљп™ВЮЖщЧZмДю‘lМфŸ\lѓѓ7K.nЙBЎ‚С6 јб‰ёBё}MuЃZ=іЎ FЈ1'–q -#AЬл`BЉEЮЗŸ8pрЉэ˜вQАшnФlсЏ” xкœГћ˜qжј<УШЫ№ќ�s@>$pдЁз|Ж' А”Ÿvкi#dОшHт Xt ~qЧ L}Ž.ЏƒIш5мUhVщв–šмРbМ!ЫЭš6єРˆІ5;dЄЧЦЖ=ћ{2Ж 3­І‹†БiƒeъЏ8,q‰љW#}ояO] С§…Ё€ю”ћѕф–}Бy’ Ы6O4g–5Tзјeќђdк•iФuа+нС8T(ъч„є†Ч‚zУУV0њ>"v.ћ1ztu‡сŒ$8n гx<цocњtі мЦq#Ъ0жѓў„rЇcь>жЁLж@L—q� 6Бўцv;„„ЬW‚DKРс�Œр ЄуљJРž›a„Z ьН”Јнњ8„лЯДGА N%y=�Ч ^ мо�CrhŽ‹–ФЎlБ}џ(Дд˜KГkтЭЩtШHўWгЄрšтSј�@гоtѕрЃCёк—ќš§Ÿ|ћЃ%щ_h—Озоь+;/e‹h"-эА?yIѓ%\)ъ ŸџQМ+Pƒ8љС„Р”аЂvшЙ–dрwёTр‰&ыОЄ#ўЩ‡•к!4p*Ує§7`јЃ0=D†‚ˆ§Р4jД‚Žћ2|гˆ!d[хсьТфoсЯFбэаzZR лSІ–r�0ŒЉ8ПŒzЧeІЛЅt€зeЪФ$ЙЌЯ Ќ€Šv)„eЌь•ы аю#УЏ[№�dПabМoжЈomЂu_K3#qMѓЅсKGќFKpœЯ6œЙ’ ПдЃл*M75S;!­'УK“з”Ьk§о|")­ЗCІf"–aыNъчˆwЦЯ/ч ›р…N`�vТƒЧ^^šИ(Д4ёџ‚K“?+ћuќ“ж6Ы;�ђ9w&ЁšЁ­›ššNonnЎРљFУ;d�ю…sˆZ K№6Дј‡dМчxз\\sП zЏ€0™ :ЇŽJ§�ŸB!3CФ €З‚BРК555,ЪюqЪєЇM}рС™ ћйmњ”9нkћ&™{яј"EвWќ]ˆ`œN!кФŸfФЁЙ7vWгЄТs!�№—]хт!‰Ђ5№ц%–}BЬжт†ŽМ@шCТXX3љ(г”#ёAЦ˜ c1IK зД6TŸЃfПФп&ЩdУњ0Ÿq†аƒY�;дцj0cй­ЗоКbюмЙС1ћЬ3Я ІЯƒFыŽ4˜gƒqCСипbЬŸL і„РЛFˆv-|‡гQяЇ`Ф™KјФйТ—qвњуќgДЊЏЏoпнѓsчЙtJщаЉ‰<‡­Ў я‘�XЦC7Kэ|#.Т#ЮяAЋј€�‹t|у^ѓ‹иCqќ’†Ё9[h@8’КнєOё™5NЌ­f|'Ћ еpUє“šКш'кжCуkk ЃЏšЉ/`vk†M-(јkB”АM�!qл%сЊgƒ4gwfєўЫЫЫе,�Œ11ž:0яг@а?A|Ф„d”Z}ЛcsЭxЮ5Їxї:є$д™‹г ŽbД'€9 LЙˆѕкu`nЧЄСР“0Hš^o[xмК�Ѕ‘,Д' –@DЄщAŒћ'њуSš1� гCЗ@:сxМіqбя№*-ZЯQ#™ИсˆУсхOЋ) ыCœ9*/j–и є‰КеDƒ bр0'РP$R[uGcф‹iЏ€8UУ‰›O(м9ƒМЙА�уq&)\№!я' &>Є[ ‰Ћ(ЯК€G{юьйГŸƒЖW‚ё\`тsnЮ ѓIЕфќ|)ŽЯ”(œH–ЋЁо#�›&˜э0&Aœпn1ZЌюЎ{Ј[‹—щ8оWъ^g)Ђ9+Ъ5ГшWёыЂ­б…Vъœf„‰A9Гlє›щуDуЦуЈ x›ЧЕ›ъ‡ „gИў Р–˜Tx3Т8н&Nu‘2ё‡ж›Нћ $Г$ТТяЏ_П~#4h8™Fц  ЏќR†сŠљЙ­{ТФИ,ХыИV№2˜QJ(+Р| дбѓчЯ/МюКыš‘п9Mswq І* Ё< x–ТoQxВ8‰Š<Ѕ0 ЁlPZ%МуУЄk �� ТIDATH+Гƒ‡†-hСšљHoXЋфчЭsnфПЪеЧEzрЈФ]п:oP#,А�ы"N‘VЕШСj2ы(  №ёhMьX7„уЗ<[ѓЋБœуyюСg-wœЫС`Џ^ЊЉеФ‰j7дцŒ)ѕЬ'QNб!ѓўœiUu#‰˜€,”[С™‰Y"C&Uч�Єv$хдлэKX*Т“А4пЭрI!у^JyЕ`ЉИ?pщжbRŠКLКpјqlX xc--j`ЉшЄt$ЂЙ•p K#o58VПџ‚ аЬЉŠ)^ЉvШk|VН…пI…sЧ< ПаЕo1ТЇ …йЧ8Ÿ{Ј@№ УM­#*є:ЕDЛnђС.9вYLхƒyЙEpO›ЫWиП€uіёˆГ™ѕiњ;У…+SЫJh(7cp[iAЏ0†U@{œ•н єЧ™ћ ˆ3…ˆтж3зЈЯржi?НЦЛ�;ж…1Ls#€SтUъьЬ%^‰Ё pбЖїZєа,ќ.Ќ;;E�їаЃWуЧ’bќP2’ЧOІYZњGл>ф( ВžіsбѕWџЄaѓф№!ЊFЮ?F лрАЕZ&фё[ƒJлМЂ0Еmјal!ЮJQN•Ч=9§p=&› ”CГј}У7p|�! c8ЯdFлД‡њД$.І†ѕ€Уп "FiІпПьВЫК\�lОб%_ˆ#Ї‘„йФ0Л‡фл,Ю8žТ№Г„cfXbл]ІЮ}€*tКB Žvhh 3цjЮ šхjJn‘EњЗIЂЪs Ѓ4_šіЧgD’T$SшJІНXhЎі9XRv0ег}в-*Jl}ЌљšУЧ‹л7Ђ‰lrj"ч…њэxК*tЙЁёbДЊp&8м;јmЃYѓэЉеРƒпh­Я-к$Щ§uЬ№еwxЬИЬБZ%Й ?sётХIФѓЯA˜З˜о?Ъ‘ё\эг0Хћ=І†'`йђ`ŒУд№:0b>ї 4ˆћ”–ІЮqё…TчžAе6рP;яч ЪъЗy“($Œ&†МЕиФсC9хќxлЭєLУߘŒы‹€Ѓ \e˜џГОЧ@p Ах€юќВS #YМљ2эx ьVЬ“ђ˜цнэ˜ЂС)Є%Kb‘ш%жУVъ<LѕhОГІвБBГm;z~ђCЫ ќЊGtѓ+-“ќП—Кџ%iтnЂyP`ЫS?Е,їЄД/єs [Œ .јЅЎO Gй7ejŠœћ5|WџХњѕ‘ђ@ИцевC–ХЖVTŒЧЪœ&1s—.ї�’(&ЮДГŒќДdћšI\-š"мC@љ@\aтY њ&0„п4ЂЦ1ž0ФnРЎŸ{<�8ЋU:о9ђ20Д�LŠFŒ}‚ЕœЬЧс"ЭН‚”э>8ZœŸсњ #ЮmЖtnиАсzрwˆыџhТG•`ўOщ\>р€ВЛNŠШж_œPP’Ў‡ЫRск‡qОEЬ1C˜•ў-Дxу–юˆD4}FD“S/БЊW.‚)№ўтв|Еp™§Ђе818ЙШL,Тr2uИ‚^’s@Т  /hXhMЩРфт_Хят“шЅС єјЃ ФЁ�KlЭ0“ви€_рxPПŒ<§-|OњЧ‹&O.Šx<Д–_"у.\‚ yЅ 0"˜�‚˜џЬф}кz%ђRkIX<уЊрЭX˜MkЏš+ќЈ%…њЪ/ƒ‰qw-@pЈЯ&€сsPпa#ƒ^эпПџ^uеUмB#С?тѕuœбQ5†гЯ #Ч0.]w.(}„КˆБшУгi8.МУйдхБ ИЬ…>ШЖЩ|э- uš:@ѓs"oO–Ќ1oЫшЛЦИёМЃЖў^xр€SEЄ&Ьihи6‰УЙІKKПp_№сwЃ-тНТ_уgUi!`e'ќп€HЬЗt?Ћвji8aтЬэйви7Bг‹юj~€№рЪ#хVџšŸьгр6ЊЄ,XФ]џЃСoв4ѓђQ>г|кgY~UэЄ%ј@ЬьNCІъ 6BгЩ,ќ ЃX‹ћтx�}„eLsj пAўэЈ7‚Аж„0жр>Э|8€AaеЂь2фЯŒ†3СдGpF~Мˆ+a2Aˆ8\ЉЭŸМg;HlчПqќЧS€›"~8иСМ`…ЎRkk9Oc“ДС–сћfкЦф-г“qхА`ГœOJK 'юЗ“‰xxАѓi*rЊЗЙє„ ~‚џч…ћє–Єywё=ЩЇ1Ѕгљe HУдуK§б5пЦ ћ Xša` 4ъuнї/Ч7рЯќaEzІ„­ПЭSЖЃz2О4]nлN„ŒЁвыi+№HјŽ†Зˆ6hё+ŸngBFЩX<вЁ1мœЩie?\›а@hjQЎЛ лТ6С”~‚ч*Е ІftђB8—Ѓюз!XЧт{lOƒ“Ёы[СДwq~ књ f с‘Р02јž…ы$к&ƒЃ8W9,!П�8+Пg2п@9dЫœMЈЛІ~#ќ•ь№а?6u№$(]!ѓАSZэнtqn_†BаEQ•MскU™юъч>“MjVnЏ;Ыk_&їž Т}Зxч–яЩ5afІyŸ n‡ЪŠx‘ŒУЦ1ф&ќЃКE>Е7їQwзžЦГLћz^{UUPЇrL6˜lb[3T0Љ-xьеСeюXGFх~Ё›гЙЌуЩЭ™^DŒб1”эМ2\<Aн\иЪ"ƒžЖюЭ 84x…2Ђc3Лм>ь6^\т‡іˆсхТєŠьіЙSBь6”ƒАB† m0ыSл”Япє> єZпSVѕZ‚`•ьЬЙ9чч яШ%И‹gO е[ыЉqЊ7uЮ3§`јихѓ>ТЅяmоМЙїм�rњЊЂƒНЉЯŸЅ/НN�2%A0]Z„iУОДМgDю&<к+Югg!њСTЗз �@hАZїцшЏ` '\HЦѕ!џљЇвcЯLЭ&^\z�dЈЈњ`‚1ъ RhјzљЬBщƒДб^ыв p8xѓЭ7пBm4Ѓ}рwЪP8ОŠиўKum? LoЕ�$ŸЮс�CРэа|Z†bІeЬў`Р‡чОœz­�SгБЄjaE5?Ю —qЙаТ:gбO`8Е''zЋєf  ~žŽ‹&А�wв=ЧoІf@јM?/ЏЗђИл~ѕf РŽЋўС(Рвь‡ањУbТЪзиПƒgѕe+а›-�€ 'м?…И;cдV)јœо„g\ащГV З €Це8Zxџї`&а�+РнГ|ѕЫХ4q ,Тљя=~ MŸJН^�тВ-˜МзЫИ9‰KДмюХ—@gсПђI+ал‡ФТны€=і˜‹mZ‹aИ'ŸћдЎ\ #a . Р‘н?Рz}!ѕ  si2лМ~ šЎЖ|C шЮРы`мтЅ‚E}ё^ћ„�АГžРо~ў<ївГяќXпІ9bгІMѕE+аg€ЬEшWЧ;@у+Сtі"B~Zm ?0ћ>eњŒ�€Б^`ўэ`8ЭўѓЕmZсјЪчЅ}Э є9Џз[�Тю '0 <"О-‚˜пFаЖу‹`GOž<Y} їН>>ач,��|Х[ЊР­ёRY\ѓ“Џ‡тƒа—Т?P$>ьэЉЯY�2f^Н>+№/LП+ f`<_­Ч‹!Чр5Џ,KaрЙЗІ>gШHoлЌРќЦЊ/|С єУыWWёxёГзЧњЄ гi&–аєз&ў"f†\*І/@­o„S8ej‡лоkњЄШhНz…CР­А•г­Ÿ/СА№}–ыэV Я �Д›ыТbШ!BћзСєѓUsѕz„‚МWя’ѓЂ7Ї>+�`*ˆBчЁ`юЏТ, р€Џ“ЦžBо§ Jo€|пђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШS O<ђШSрѓNџ/—„зyщЈ����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/tool_rescue.png�������������������������������������������������������������0000664�0001750�0001750�00000011112�10427440661�017520� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡���bKGD�џ�џ�џ НЇ“��� pHYs�� �� �šœ��ъIDAThо­šy\WuЦїоЗіыюйg$vЩ–­Х–%d,/r"ŠBйІфАлЄHЈИbvb‰C B рФ!С„2˜,•0‹Ё x)LР,6Ц–,ЩZlйж6вhжоЛпrяЭoFv(›вˆМЊW5]ЏчОѓхћЮ=З…Е–—Кnyѕb)јЩсiоrХB.]бЕp`ЄЮd+cqШdЕMИыКЪ…-oћмџ:нЪšJIŒ1ЬЎ+Ѕ$Ъх2ЃЃЃмМmЩkоЛcљEњСщZВџ3ї>“юмВŠveŠеЫ‡ЈWЊŒж2$†Cу Йч0�/gЇУ9\iІ!Kз8™§ѓ•ч-лЂL}стшегG+_3ZД0Є€0Цˆ,Ыz5+Ын§[§Јј†иC5346O<{§ж5пTYќѓ8N~iŒчjЫYак€1ЄYЖa(t>1Д|хІыwОЖЇ ѕ}МѓXѓКн3yяšг@CJЉ=Яa пї B:§ЦJяЪ5Аю•K`јКAœppяял\­GQёд‘ЃЃЛњЛПט]i–ЅП1�! оЮh6уB9r78RџЫK6­НlУkЖzЈR i ‚lпМ”oэ‘Œ4ЬPжi ЙЎ›G+Mi4ДУ’.V.ш†N }ш‡аГ†u7‚ЪJdqчќн?z}ћйc8ђэ Lœ3€85ъЦЋ†Џъ nЭЪѓ7ь|пыжƒDƒ­ \†—/fУќ#ьљE•vu,6“ЛжZМBC~›• —ƒПн‘˜б#шРC (O–ѕW]цЌпКeэjkoћрЋь№е9�АжвŽг…›.Xњ…ЋпОs€Ќ’Xџ›8'А.j`›/,ѓѕ]uR/“!„xa=!Y3OPь ЯБи,ЫяД‰1 i;5AрЄTšБЖ€Жч� “ZтФZ6PT+ ˆцƒpЮигŒ"kuШ?Яъ^—ЁШ2]—!B`­EJ 6уŠ ЫиFŠŽ[8%A6ГœcAz ShБїбН<=бљ@jЮ%Zc­ЕдG5Їйж€tРŠМ@f�аJH'ט—6YR6<uJр+•0dqYrQY2њэG§# nЛ щАР,E @EyФЧв#эУ]О|!иs L†0t Хeр Aвšy(gо&РёQ^€Лb=bW•хсqЬŒз­ЕH%ЈЧ–Ы–x і[ъююр0ІйD›!ЪuЮЬzв@:EНкh=?•ŒIRœ�­-Zk…і4ИpУ< BцЗЩ3KЇ”ууЌ[ЦŠCЇ‘ЛO#!0@Ј,ПГ2РhŸтЪ%Јy‹БƒMRLЇMжlс с*аZcФэЄ™hZmЯ РT3Ѕ›–Nт”ъ1(-Ь‹XАkAЪ К :Pђ3\зb””ДSЫљН’eе'ЈQ^WЇИфZСяFљЪЋ!Г` t*tтЌm,ББчЈкŒ1)if0в6Є `fђ_ „Ь_˜š<еЊcи4Хu=D–€!Yб-щRњzБб0q HлТdp"tr&ВТЅеЮZqfл) Я……ЄЕHkAШ’мУ:Щ N№" €Ъ?{!™ž@*a$Ћ‹ћ t/ДШсAl!Тtк)‘B"cs'82ЇPЁ,F‚‘/"МЙ ™Э[Œ†Lч‹Ÿ sі*g%щцѕб,р$1J8љs,ŽувH }*в™N:AXŒ@…ЁUЮnVвЬШtNЎчиJЬrЏ™"\l’`Ес`pБфбАJвyux lJ 4#ж€8h(Юаoš€Iк€P (‘GZлмЄ `КcлRqюАљmєХЕ6:Nб™Х$lІЩbCурSD~“•н!CžцљLт "•хЉf�#tЦЩiZШdТъ\Ьl‘сHF8 ЄђœSШZ0йŒw2H3lœaS ”‚œу$б‚^BGКжїЄj№]1“ДЁSеY Y‚H4X‰@!Ѕ3Ѓ№ œ�œ"]ъs!вP9'�Ž58ж ŒЩk ЫАЉСІЎя =сШМ„„EЋ&ƒЮ[цpїё№ŒZ›4ƒщчA•№ž‡ЎMцпЕB P8^^KТ'Ђ gшŠСБECEќšzYpЇš†“M›&‰б &Aи7АљЛШ:Э RЧ“ц†єœЧ†Х‹ƒŒд:H!00y $ŽЊрЂсКЙ–МF:5hе§‹ХцMТЯЧЯ!OLъЭj[ЧXi‰�+sЪ›Ucх€уцоSЄMƒ*ЋJнœЈH”В4ЕЦс'pКRXБ0їМ1/јбqщиЁ1СКMЋЙрЧЛџ`Щ3ѕ/uyшЙїB9хBІ3HгŠйJ,‹ƒБ)ж&XнB ?9ˆы8ВчLGšf@:Iq@AX@Дk %ј1 Њ9ИК›U‹Телы—ьЋѓЫ9ИИtFЙ/Т3›+0 keЮЕ0 ŒФЖkЄqЋ РlKŽFE„E0щ УЋuЂlšя№:M8Е‡ЭУгЅ‡ћјШƒc\dsА0€­‹ИaЩТ`кгЮ_2“:RКр(”ц^PЦ?Е:ЯбБ D(FPVY.lў�$/nGr˜`g;нЄ†hLƒlъgуxv>p|N�NДОpX}h§EнŠ4Ы=&džЏBbбФ ъ9:4ЇI†еЄ@ ‰"g ЁР)a„FДЇ_иЭ!А3R%Є@dMhO€S€4 Sž’sNЁУM.л=-‡ƒC)K%НЁ@H=C\2oфьŒќА6o p@v,”Йвz ˆHЊШp�›&ˆЄv&gh2M UЅЊCЦkEŸЮјщ˜m% gцрTŒїЎ‡R‚ГqY/›–wГfаciЗdА`ш ,% Ž%Kœ)FЇц‰ Wхої”dРГТсqУЂС пqHcV'ЁaъЦЅšњќтx›нњbК—Ќхde”ћђг ПDІ—žЫTЂ˜NfхOЦьЋeєtG є”щ+ш‰zCIЩD.t{†S-žŸЯ€ч‰‘­4F"Оs:тОёaNEK9ЏG2иSІK3ЕДДKгИ;5FЅ2Эѕ;За78BБФ]wн…Ђѓ ЖORP2kбlXДЮЋцiф!Ояу8еF‡ъH…ЎЩ:Ч|A)ђQBѓаD€aЕЪСQХ‚%\зwкЄIА?ђ'GN№мГЯ’І)НННT*•й ЩхРЯI‰‡<ъз.’5}ŠўPс!nЁ„ "ТР#PЉcLм iVIъ“x"ЃЧ&мзYНt)nЁ@НVGк„€Зˆ\A\ŸЂUРФMlк"iеiubўъЏ>ЮЅ—^Foo?їнџ�яxЧ;r/ цЭ9žфдЇ/ѕЦ;aP>0m™LЋLлŒIёxеcК­q%tљ.ТuЩШ{ЂДg€яЉ€T: ѕїб№\ŒєQž‡@EаibšЭV‹4Iш“1aаХ%FМrнFјоЗ(vѕЯšгž3€P‰іt*л›—8,‹ qš‘dU2]сЯF ?;І№•рšѓ МqY‰šuKND†А_ГЇжЁ­zшф5ЩЂBvсЊN‡н'jмБ{œ83Ќ, ЖіЗpлŸсŸz;8+9јЏrяїЬvіХ9ИfžЄ™X0 х…}+$‘#йВ,уО٘дBЅeйьЖ( Yр!„&ŸфжЦ"~V)л”эƒЯre_›d`J(ŠNЪоЃ1ZzЁ`У<ЩХeЭеWЗ ОіvИ ЧхєЂrО?‡‹…ekmэЌk@ @‚6h+б^„Žњa`9+—/ЇЗњuП ;˜bOH9№шr%]ОЂрИ~@Сї˜_{zш*wS*(7`,ѓ Ѓ YеуђlMS1_‚‰зAevј‹lzпSЌXБ`9№ц9ёбq T*nbjSшк4YuŠ>гU hUЧРи™с„!3CоШ)вX2ыЂ­"Ю$MэP ‚ 5šННЏ`у•;`щАѕGˆ;)Dя|чЭГ&}JБщЌмs2 ю=šDOŒЌlBБSСЉžІœNбљТЃ|к™ЬїГк …BI_хƒ-)B*ЈWI != ЧЭw‡п=ЮMяНх%эИс†(—Ы�нР'…СYАаѕЉ}ўп§і4з§ цЃю-№DE0'xžOxA€c›сM3Ејњ=t\"]О‚юљДЌ’@9јОK4*St‚Жoпў’v pгM7Э~м|ќl…ЬйщЖсєHЪЎŽ ЗЇФМоНQˆv%НŽС‚{ZEі ЭH-сЩiЫb;ЩСБ)&Z‚Hёm7ЂZWв’е=–=}дœЁлЄ:5СэЗпŽу8/9тBpу7rЧwаl6ўPqЇЕіщ|пђ2‡gBˆ с щ.—)DAX X,R*F˜™•K8žOЃ^Ѓ6v11ХHжЁ…„aDKчЦt#ЌЬЦGsшРS„a={іМЄёišЂЕІ^ЏГmл6іэл‡RŠ,ЫnБжоіkS˜Šќc "WI„"Ущh!Љ4[LUы4к:е)тщ1dж!l7xSm‚uK—рKДZM<›CЇQХЕ)ЪSS“?>Т…kжПЌёiš’$ Iџ�žчсћ>РкГIЁБљ.ŸџјЦоMЃчщfТДhвr‰чPз‚šUЧA(E&$8Жg€GqHН€0ЄюИdвСuђ ~T*бЄз_’А~йџ=Н0ЦІ)Y–хЦkC§дЂ@pЩ†T*иŸU3ЗПџ‡kŸїšž^ЗРэ9ЧLЕ[42AЛрвъЮ[сІuˆ…KнКŒє8„хBвd2ЄЏБФLF>nс q2ƒъ›рУџrЇпЭw o}ЯпR№%I’eYLзЦш=њi*'№Ш“'ЙjУЖl+/ьн_Оfџ\Њэ7_|ылЮя~е@ф:эЬp m,кZRmIДЅcE‘ёƒ1ŸЌЭc™ž6]0%ЛVЏ‡ ФsућйМНэˆю‹@Ејб]Ÿхп[Х‡?ђq/ZHЋе"ŽcвЬдГ\ун<ђШЯxѓыwАџбo=ГщЦяnЕжž8�Г‘ZОКЈ^sгy]oКfiщ’сЂ_P‘CъJŒБГч5HРs%пи3u№ѕџsњЫ zЩУo8яƒW ЌссуpеЧоu7й; Јqы$ZѓЇМџнПOН^'IŒ}њ 6•џ‹`ЭЅљ(А­Сдй{џwїяјЃ_МщlК3рщ§ }ќНЛІњтсъж‹JзўоŠюKз..wi%ig:ŸF g%ŽЧ­Щ> ђЉœ›}Žъб1ЃгWЕюю!™К ­1№|ўт]‚#КLЃ™$ Эf“]OрБћПР•яfёиPъeнš‰е‹љ­Йўд  ьп[з‡їюЏмwзsѕ+Ў[Tмў–U}П}Щpq^р9ЄX G)[€NфHЃЇj|хёcћўљPу›;пЦхpt]Gѓc…6@x!DO~Я}і0УшшIрк‹!ьЛ @ОєIžМѕsмqКХWЮDџъ}–— , ;Ў™оvчцxУеЮЭэзЏ\poЏФ]rљkЛј›АјЊ5|р§oсЫ_НЧ&wбД жЖБџ№!žђ§вg …шЃaў‰tЫxыЖвнv c-vтq:;^С?ѓgэ<л8›Ÿ,”€Х‹}Й~}oИўd+yь—еє+3 Нмwќъ‰oфСš-—ђЊNŠџ“]ќчKLМЫзђіХ Y§аOyxЌЮ=жкl.,4зK~оЦѓџtНœџ чg#����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/func_exit.png���������������������������������������������������������������0000775�0001750�0001750�00000011304�10411742012�017153� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡��‹IDATxœХšiŒeЧu˜ПsЊю}яuїыющžющщY›ы З!‡EIT ˆ’ь2,%rЌ Ш"Щ’љфG‚�Jљ$€~X@ЂиA л‘‹Б%ХДbЩARфЬPУYHЮpіющ}y§оНЗЮЩћzRŒ quюЛUчTеYым'ьjOќэO6ї=№Ћ}іФ`У†м]ъ7ТџПцл˜tzОyїн?НВyїм,œџЏ/Zе-v€Щ'†тŸѓУЇŸј+/<5"‡'"yІИ Њ8ŽИn wЏIoѕ№>м?рwљyуw?;b8 ИЛW•ЫмRХџz}…Оzў'—Оѓїџnoѕњ›лаlHN|с?§юпљќ‡О№ЉЇкоˆ›nIЄЫ ЋHŸ.;Rў1mѕ;;ыГЮCщ™8.ˆ9^ІH2‘Нуя9HЏЯпkмС oШ&F&Џ\2љwП}ц3ПљЙOЛ•W�ТўG§ЏўђgПєЯО№ќ>ŒЋ22р2>кєЕѕM­Є).И ъˆдрюЈює"цИˆыpГ'† п7(к вn‰З[шHЋ’<^$бЪTLмљ@š[’UuwѓЩuh э| %Щши…э;Џўo ЋOџНПё‰'‡ш–юf‰ВЌXZZТ,‘\pW’AЂІ{њЪA%1ео`М-Ф13УнъaА™qpИ ob.T|�Э-мЁr!ЙSVнЭMzн.Н2ё—NЕЛџSŸN~х+_–8:<xrИМ2dqsаЪr‰dH7knЄmЫ’"т ‹Z15И!Э<ЗЊЊˆY.­VЫЪ$t —‘AБ^Yбэt$ЕёЁDZ]—ЅЂmлЕEs w7wСˆrwЃa [Ё J75,ЯDOоw! <€ѓZЬЙT Гид2M#A,ИЈ8ИЙЁЊ;іfЊюfтшxc•,kXQ–:дaq~ЮЎ_ЛЊcS'И6лГчдЭ<Гх•5Хal йFйеMkеІмЇЙMпT]On]еŽ cЩ-ЙЉ&Їе Ї Du JPЄЩСмI.”[ЊcЛ е"NIЩшаЪ , š­Ašydzzš›7o1˜їxђС&fЕ†‹УУCT)(Уq­ЯЇOs›‡ю№мцэЄЊ^_™Ж­_Qw(’{YЙ”Щ­LX™DЪd– +MЄ0Гj М–VeHK:bЩ‘сСІЙЛЙЛœ<yвЮ}УYлiUlppШŠЂf4ыYYQг4Ќ2ГТLJ3+Ќ^G•ЬЊ$VІ­ѕyээњM(+—Ђr/“k x™DЫ„–Щ=%еrЬЗ~ЯМЃUYъPЋсп}e]Џо.TР=ЊЫЫЫ:77чкoAХПїъ†оYDнЬ•дщѓиЂЉš^$б”аb{ІЅЙ—•iЏtйНˆ;Eхˆ:&F�дŽИ ЂШ.—mJ­bxEY%BŒЬLGFкRJ<ћьГ,,,011Сж‘ЭŒŒЖ#н5ЈRТRЂьЧ=эѓА~рСd€9UR•АJАdиЎDw( wQЕ Aƒ‰І`’Дя!њnмЬUЪЂ4 %U•фОƒ-s‡~њacccŒKJikЎмw07DИЖTIU•VTBйђt[єЭЭDР’XrГЉЉЊЪ,н#(*JЗ(IBt5uWTм<эђBbV6ЗN‘4dkЗ‡Рн­o`�&"uv7DДЊ*:Ž І›e“BЬ№>Љ=’И“LЬ*дЭ(+7+PKŽэо€™г+‚aPs,s‚ƒЈ#hпRњыwСХ)МзqіЏотвх+|њг/ bь>™ ЊJ…ХUŠЂ ЌJжг!JwФd‡‡ ˆуnИ™“*ЇЌKN*лЕƒИО™јуŸЎјЕezR-жўWЬ1QE‚ +,o kI–;nk›.йfАч‡п&o4хЕŸОaЯ>ѓюIњR€:Ч1ЏuK–W;vцЬkLь—љ5ЕNlтц€ IіЮA Jb KцTE’ЊrKeкЋBмИ[ШќЦš єtrЌСр`Д<ъ8ЙlXQ$э–F'5щyЫ‚ЂюfecFп^ЙР#Л№ж9uwž>§ЄХ ъюИЛЉЊ‚pwqйўјћпWKя]ЙbЋ?Џ##P'mbˆiSzusG{)вKбм\­rЊ„UeвTіUЈŸ[Ц-ЪЪЙЛj,uЧкs<7=Яб§B3И;Ы‰3ЗšМЙz„MDŒЋOаœћ‡ oуЪ{WyьФC80Ižч,//ѓіеы\ПђYщЌopЖwŠХы-ЏWЬLЦт*їЌ06(dQqw:НФ{K9WWFш•T9UA­JЛНа6ц}ƒёб‰wљдуб&Ž0:<HЗW"ВЩgU™ЛРПrœUУЕС[_Ё7їЎЃ8?§щЋлXUPQуюТ2—xŽец#Ј87Kюxює0Ђ\hх”UТНЧу‡рррm~tuKEƒ”œВА=‰јж5Х]Gь#оЕO=ЁR%Б‰ƒGэ™ЇOЩwпГ8|П|є Ћ$—§ћšі…ћо–k†ЙЁЙМ3єE{ЕїQЛ|7—…Ѕ5лX_БЭUYYYБѓ=;Л8%Џч_ВЕцI7qУNЗпВ/lіюЂ й}їЕзо“vфшŒ%‚ДЂ=lЮдКв+мŠЪ}з*„ˆcуe§иMБ‹—.ъЁCг€иБЩЈЙгЬ?zТЮПuIGл•==rYџlхID0ХtГѕ WZи5лTБИTSГ’}_щ`#В ЯоЄг‰<vъД 6дЬй?l ѕмйз9sіœ}ђ…_вfYђ№јЌ§фНi-ЋНžNыЫœ€OюПESг‡8ёрq~эзОШoœуsлЧСёМ 3N>ќ�нТИЌK[—Жяj‚ЃZX6д‡AD#BкuЇИBSг‡nP–‰gOr§н7љпј&_њѕПЦсщIzEтШhAЮ:E){7€@P<ЈШ}cЋцюvіj&?МvТ~џлПg_§ъWхїўлЗMD wЛ|Н'џшппБб‘ЖДrЕ§aо‚ЊФрVƒJTЗd;cTUЕЭнэмЕ†§ЫoЭ‰Š›ˆи…‹хk_ћš}§ыџЦцV‚ќлп^Д–хQd4_Г”мЭЗЂvЃ!ˆDS5­Rт“ЯŒйѓ•шў‘Ш‹/ОhчЯŸз­“;6еАњ7'um~У’™Fuьфѓи/ЦSйцХѓOŠ™‹9rФОёohГйт@0ћЪ_еѕх Ъ2žД2йЩl"YbTz=Ѓ,JЂŒŒ т@ЃбрщЇŸоЮщѓЬ98žqчZ‡В,1 Ц?_с%9ХЏі№@­Ц@žч4 м, уУЪм­N?zззен™™Š@T< .зWлV–…]П1+HЪ’RкNъAЄWšн™—ЕNЯж™ДЈHЗєтY@юћњМцLUe‡>лИЛKЏЌьЦЭ;ЖКО!ѓнЖЙеЕŠ �1SЩ3ќъцqньієвХ ОКбе‚КћvNпo~юЭŸiUnњ­!­ђqЭ‚xŒЊ5ќb< јœ<Ќн^Ё—.ОЅЋ]!дФїђѓs?{KЛ›kњж їЅn[q—нщ–"dQшъ~.-юCНфO№7nЭBЌƒ‘*EeќјхWЙљож6КмаSdAт‘>ќb<ŠSф“МЛЖ/Q%Цј>^ы].vNRVЮzзА]*Ш‚xEВˆнє'ЩЯШ# іЪЫ?тLо‘с+Š‚•ЕU‚ k]Г‹іœhоЖ€еfЙEVЃШЖ•…:ДЕыА] ›йнV_цјрММђђьLо`dxDŠЂА-^ЋГГЇ!Iž•VHŸdYЩ‚X#ŠЦL˜ЭžБЭЮ-=Јo3\uЌлнTwЇ— 6e‹љIuАм]A10 \}щыж[zWЅv*цn*љ0~ю_žg{<РТрslзlв.ыpеЁлн4wз"цЊ6чiЪd^Q4‹JŸvНGШЂguŸE!F(тЎ‡Уdi…( CH,  @Р№ўН%іqUЅм\с…˜ЧpоЛњџёЗ~O›dYŽ‹l@rг3[­МФDЈb‹26бdфe…T‚DЁŒuкАWA<‹"yЫЂ }u’б|BМОf10ЧMPёОCлТUAAФњЅ$)ЋЪюRЎЯKk|кЄя;|—3Dа`ФqњU^‹nh•$‰XrХЃ‹›X#ЪюѕяЈPеВ(šE!ЊXˆЊГўˆЂЛQч0"Д'fиwьД‰Лжjаз“>.*ЈŠ­Џ­щТќ<ЖИИЈ›MМъXPUaї\Јkвkw.швŸa`дŽˆУЇ>oЎšr15б*ЪRqШ2%Rƒ 1sђ,pћЬЗyll‰'&V™Ј.pыќŸШ‚аP'S!г]xD`}cƒ…ХEY]]Х1Ђ:Y&я››ЉаˆТвѕз+~Ц“+<>БЬеŸ|‹њjеkлъпЇB(žg}Ъƒ„ BфЩгOI–хvіь^~ы5H=Щђ†е!dK j\jЫ”ЂзГNЇ Н^ЯˆA$WЌ>МнsADEEьјЬ =~JЬм~ѓЗў НѕЛ204fЩu’X•‹шЎАЉнЈфQ,Ђ1‚ŠeъюмОuЧbuvv–U•eЁЉ”чˆ 6>Б_;`eбSGˆŠeЁVГНsыBJPtqi™лЗnY2гЕЕ5RБnYз€€‹‘TЫ({ђ–("dYmФY‹ббш’1СЙuћІЈ[˜_@ЂŠdŸ+мeДнЖЉS�2??oИƒH bњs$ƒквт"7nоsЗT™"YРъB…ˆ$Б,ˆьњиrЏ\c „ Š&Ї,f™.--"Ь’Хњ$?XАяР1;tќЙoР–W–Е98ZK C•€b‚ышш><hfu- bYЕ$ˆ‰EЫЈ{>NE‘:›Ь‚%A‚з‰sфшaђи`ўюјybb яЧЗŒi ЏјШЏќŠѕsМіъ+ˆЎ^ПХёЧž'шЭ{ч‚j]ОлЧ‘#G03$PЯ‰R—н!ѕ3п{m jНЈ *hP‚3~ŒƒS‡lђоЭ  JН:œoрvс‰Л+]ю^НЦђТ–Wжh6‡ъУPНw.ˆ8?РєTХбЃG)Ы‚ёЉ‚:QРˆ)jяЕ;u�A№ЈH jхц*yЃ)š иЉчПШŸќрїЅйˆvѕњ,S‡ ˆIЗ­щЖюшДДЦ4[ъВ<з“"kйёУ3Длm‰ъVЛР=уфўЧ>bЗ/~Хя_lт№ ФMЂb‰КРf‹КїъннUФ–ЎНІSC‹м~{жк3/шшФa:CлŸ§јЛКЖМШЬ#Я…`~ ѓњуЋ‰lу.b­FSЯ<ЬффД™Й6š-‡F,ˆЈИэП5_Ќв|тqојЩїьњ•ѓ:ВoŠVkРVf/jЕz…ТлЖoњiUЬwє/v ›-ŠtПˆ`kяА\$ЪЪэ7йр(ŽђЁŽЊ*iя#ЯsT@wйЁоcЯ!(Б=J{hg+№дA‘НуwЭцбгgцЁSdЭZЭХТ™msљђыЌ7іуCЌЌЌЄВ�<Ю_ўƒџљю§ыЃг“IV{™­/п"f™ŒЭœ2СhЖЄuhЦњ5pDD№dlѕЕэХё:ч‘нes—њ[и=уw=g1Вџ”јў)s мьШЅ+WlixVЋ%–ЬЎо.dљцЫзЁœGЄ НхkoЫєgџњЁёіБ™š NШШG|rњ!Х]\•~ёЧqtW/џ—јžga!ѓаж•хEёцQgшa}щьBКј‡џјwSБњвSO=uK�FяћєЏžјЬПњЯЯ?26tти�\<AД.~яœжЖ љynшЯ‹зЯОѓЮAН.Mš%б*СхџсљE;ћђGKяќсЗ€е-‹жЦ№‘ќ№?ќGž==596иje[rиЕіџЗЭяyr W$fч–КГW_Оqћеџ№ƒювх—€яsїЎIiДušп2ФоSњ jюXй%unя�€х­Зя;дЏ|љЫСЁ dєў/ y§7щНo~ѓ›{ѕ� Ѕa:ТaНГ����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/func_about.png��������������������������������������������������������������0000664�0001750�0001750�00000014345�10411742012�017321� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���Wљ‡��� pHYs�� �� �šœ�� MiCCPPhotoshop ICC profile��xкSwX“ї>пїeVBи№Б—l�"#ЌШYЂ’�a„@Х…ˆ VœHUФ‚е Hˆт (ИgAŠˆZ‹U\8юмЇЕ}zяээћзћМчœчќЮyЯ€&‘цЂj�9R…<:иOHФЩН€Hр цЫТgХ��№yx~tА?ќЏo��pе.$ЧсџƒКP&W� ‘�р"ч R�Ш.TШ�Ш�АSГd �”��ly|B"�Њ �ьєI>�иЉ“м�иЂЉ��™(G$@Л�`UR,РТ� Ќ@".РЎ€YЖ2G€Н�vŽX@`�€™B,Ь� 8�CЭ L 0вПрЉ_p…ИH�РЫ•Э—Kв3И•аwђ№рт!тТlБBa)f ф"œ—›#HчLЮ ��љбСў8?чцфсцfчlяєХЂўk№o">!ёпўМŒ�NЯяк_ххжpЧАuПkЉ[�кV�hпљ]3л  Z аzљ‹y8ќ@žЁPШ< э%bЁН0у‹>џ3сoр‹~іќ@ўлz№�qš@™­РЃƒ§qanvЎRŽчЫB1nїч#ўЧ…§Ž)бт4Б\,ŠёX‰ИP"MЧyЙR‘D!Щ•тщ2ё–§ “w �Ќ†OРNЖЕЫlР~ю‹Xвv�@~ѓ-Œ ‘�g42yї��“Пљ@+�Э—Єу��Мш\Ј”LЦ��D *АA СЌРœСМРaD@ $Р<Bф€ Ё–ATР:иЕА šсДС18 чр\ыp`žТМ† AШa!:ˆbŽи"Ю™Ž"aH4’€Є щˆQ"ХШrЄЉBj‘]H#ђ-r9\@њлШ 2ŠќŠМG1”ВQдu@ЙЈŠЦ sбt4]€–ЂkбД=€ЖЂЇбKшut�}ŠŽc€б1fŒйa\Œ‡E`‰X&ЧcхX5V5cX7vРžaя$‹€ь^„Тl‚GXLXCЈ%ь#ДКW ƒ„1Т'"“ЈOД%zљФxb:БXFЌ&ю!!ž%^'_“H$Щ’фN !%2I IkHлH-ЄSЄ>вiœL&ыmЩофВ€Ќ —‘ЗO’ћЩУфЗ:ХˆтL Ђ$RЄ”J5e?хЅŸ2B™ ЊQЭЉžдЊˆ:ŸZIm vP/S‡Љ4uš%Э›CЫЄ-Ѓеаšigiїh/щtК нƒE—а—вkшщчщƒєw † ƒЧHb(k{ЇЗ/™LІг—™ШT0з2™g˜˜oUX*і*|‘Ъ•:•V•~•чЊTUsU?еyЊ TЋUЋ^V}ІFUГPуЉ дЋеЉUЛЉ6ЎЮRwRPЯQ_ЃО_§‚њc В†…F †HЃTcЗЦ!Ц2eёXBжrVы,k˜Mb[ВљьLvћv/{LSCsЊfЌf‘fцqЭЦБр№9йœJЮ!Ю Ю{--?-Бжj­f­~­7кzкОкbэrээыкяup@,ѕ:m:їu К6КQК…КлuЯъ>гcыyщ ѕЪѕщнбGѕmєЃѕъяжяб7046l18c№Ьcшk˜iИṄсЈЫhК‘ФhЃбIЃ'И&ю‡gу5x>fЌobЌ4оeмk<abi2лЄФЄХфО)Э”kšfКбДгtЬЬШ,мЌиЌЩьŽ9еœkžaОйМлќ…ЅEœХJ‹6‹Ч–к–|Ы–M–їЌ˜V>VyVѕVзЌIж\ы,ыmжWlPW› ›:›ЫЖЈ­›­Фv›mпт)в)ѕSnк1ьќь ьšьэ9іaі%іmіЯЬж;t;|rtuЬvlpМыЄс4УЉФЉУщWggЁsѓ5ІKЫ—v—SmЇŠЇnŸzЫ•хюКвЕгѕЃ›Л›м­йmднЬ=Х}ЋћM.›Щ]У=яAє№їXтqЬуЇ›ЇТѓч/^v^Y^ћНOГœ&žж0mШлФ[рНЫ{`:>=eњЮщ>Ц>ŸzŸ‡ОІО"п=О#~ж~™~ќžћ;њЫ§јПсyђёN`СхНГk™Ѕ5Л/ >B Yr“oРђљc3мg,šбЪZњ0Ь&LжކЯп~oІљLщЬЖˆрGlˆИi™љ})*2Њ.ъQДStqtї,жЌфYћgНŽёЉŒЙ;лjЖrvgЌjlRlcь›И€ИЊИx‡јEё—t$ э‰фФиФ=‰уsчlš3œфšT–tcЎхмЂЙцщЮЫžw<Y5Y|8…˜—В?хƒ BP/OхЇnMђ„›…OEОЂЂQБЗИJ<’цV•і8н;}Cњh†OFuЦ3 OR+y‘’Й#ѓMVDжоЌЯйqй-9”œ”œЃR i–Д+з0З(ЗOf++“ фyцmЪ“‡Ъїф#љsѓлl…LбЃДRЎPL/Ј+x[[xИHНHZд3пfўъљ# ‚|НАPИАГиИxYёр"ПEЛ#‹Sw.1]RКdxi№в}ЫhЫВ–§PтXRUђjyмђŽRƒвЅЅC+‚W4•Љ”ЩЫnЎєZЙca•dUяj—е[V*•_ЌpЌЈЎјАFИцтWN_е|ѕymккоJЗЪэыHыЄыnЌїYПЏJНjAеа†№ ­ёх_mJоtЁzjѕŽЭДЭЪЭ5a5э[ЬЖЌлђЁ6Ѓіz]ЫV§­ЋЗОй&кжПнw{ѓƒ;оя”ьМЕ+xWkНE}ѕnвю‚нbКПц~нИGwOХž{Ѕ{іEяыjtolмЏППВ mR6H:pх›€oк›эšwЕpZ*ТAхС'пІ|{уPшЁЮУмУЭп™ЗѕыHy+в:ПuЌ-Ѓm =ЁНяшŒЃ^GОЗџ~я1уcuЧ5Wž (=ёљф‚“уЇdЇžN?=д™мyїLќ™k]Q]НgCЯž?tюLЗ_їЩѓоч]№Мpє"їbл%ЗK­=Ў=G~p§сHЏ[oыeїЫэW<ЎtєMы;бягњjРеsзјз.]ŸyНяЦьЗn&нИ%Кѕјvіэw юLм]zxЏќОк§ъњъДўБeРmрј`Р`ЯУYя ‡žў”џг‡свGЬGе#F# НђdЮ“сЇВЇЯЪ~VџyыsЋчп§тћKЯXќи№ љ‹ЯПЎyЉѓrяЋЉЏ:Ч#ЧМЮy=ёІќ­Юл}яИяКпЧН™(ќ@ўPѓбњcЧЇаOї>ч|ўќ/ї„ѓћ%вŸ3���gAMA��БŽ|ћQ“��� cHRM��z%��€ƒ��љџ��€щ��u0��ъ`��:˜��o’_ХF��IDATxкЬšytTUžЧ?oЋНR•=$А$IГЏYЃЖ[ЋM+іЬE@GєДкŽніС>c;эиУЇ{DŒQTœ ЛuFС†PA4$Ќ!„� IUjIНzыќёЂ42ЄЇя9їœЊWяеяїНїЗ}ї ЖmѓеСЋЊ&‹,УІ›‡7АћbўчLeўЃv&ЅЂФеІС‘)Ъ`YЌ…‹pцT�+g0\QxддX B фВ™Й4~в†iкЇ.…ŒAP[CЕ`Бда˜#Щф–ЭШeдм›(ЊžЯ‘w^fзўЭDŽџYXbq5—‹6ЗiюЪШХТЫ†S>gy“чAV%=mЭиаўg Ж†)‚Хг†J•фEЈ˜7” ѓo 0МФLHkагъ Ђ­‡БИ1џ_,Йd—лǘ:х K‚iХŒž]NёŒЩ` В'@K@с­kESM›lвlЊ­ф}6к wBлХш!\L]UХ(EbЕmR-)ЂP2)—ЉЗL"ŸшŠ@ZuV^Kkф]ШЄК#t8Р‘OЗажИ5Ўb˜œн<ўюfž]Ып™~:_ €Кjm‹%cg2юš™>$аг`™€†šэ\ѓ”Bh: €ф—4ƒt$JЧС§ДlнHѓЖниѕЂШSKЖ№ћС0л2љТбЁ‚Y Ы ј m}Ял€n9SгAЪ)l7HГС• Š\HЅhў№ПљђУ tшNШ.ьэтећI �€fQeъќЇЫ+_БЈœa3‡@Rw~ДЮ� [   лށ"јJ 4|… yС$нyœ-ЏЌdпЎ}(оX\ЯќAаbЎЁёJ(ЯSxљТ1”g9Іcи}&дРАP†ЊЊ šЖь€ШоDw џ^GKSР†Ъcїь@�_• М&ЩТ„+я§ХSѓ ЎŸV^7СДС#,fB1­Œ‚†L‡p(>ньxs ;>к‚шсЏякЬЊA№U‘&YМфђЩWLЛiхW s”ь5œUЗmlЗФОOтК(•‚ш˜\— б”Гkyу!З\> н ўПVГooKттŽE›љн �xІ†LХ`­тцUоVFYх„”сь†$bJЏ§zёSEЃ‚”MШЁ $ƒ@PSiшшU‡мБ3МДxoНМšH$БГЗƒЊeHŸ @МTЅФпд‰С КaПў‡їбИБ 2=р–@�ЫВБ VЗŒПАqнaо|ю ZЛ!Я CƒŽ‰k„юˆuрђЙ™0Блbr €eп$ї’�x`) юd>јфЕCьyћ0„]с"ж•BWMD‰WяоЦbYтV5iЎпјжa>пд> †@N6CМbЇ9z$%ХaLƒVЭbШ€™ИЎJ($~ijфйVПAe4ž[дР[ЙЄЋ+yнЖЙqТUХL[0šУ›ёСъц^Щ |бvŽ~uяѓе<m™,T™ЧдйХа•†–(јГ!\ ў кі`§ћлAфі%ѕМr^B#H<ЊИФП,[фЄ$KлшKP6­в)г†ЌsŽФ.›Чvoh[ЊЦ5$YФВиЗa{џ*єh Ћ&ђйжŽх™YFЯ…„"qHt‚Ё’і’™ЁааoжєЅЪsXA7ѓЎНЉb&Šœhс ЂџŒ7њЉ„йrЁ>Бj *^ќЭл:~(+ј7Mgз:П�c•Ъ?ŠnЎмоpМ*'пOЈРН1HvƒЁЂИН”‡икxjnm U@У7њ€ Ѓ<.iїzјb%xL‚Ущщˆ‘Žщ{.д'юйОЈž%‚Ь}–EмЖxч<їѕ 6щвЃ_юь�E€LЗ#[Ao„в‚ ~З ŠpгљиF–% КїBЌє‰у‡бul,Ž|[ч^В™е†Р˜wxѕМїlхˆЌАЕГЃ;m9бKь ы††GВxl(( 9Ж% Nъ| !н‹`йиt^L„Кg3ЧџXЉ, |аQщ‰ЊNц–DG#лБф GЦВ>�Ё€i%€eA:Ž"[HŠ R0XM�УцMЕзN?–�ЗёДПŠ"^З„e“}~�1]ЗАœњХА@K‚–$#фE–ВС№ўZl›ІX4 ‚�.щtМР%‹�сѓaПš6Б%ЁЏєЕ:Ј&хцсі иc РZ0E“Н ,лБ„3�HЂ€mїœ§�"лS)Uя+uЭсДj 9K87Œe1љ4s„!`#IАЯ Ри–VM:КUg u’N‚ЫMv~.†СјкЦ ЄТѓUTЎœбпй.МmˆЧээ‹@†нˆmŸЛt§�Фc|`˜>м;MDzŽ}MвЫЇŒ!;Kpcёмђ<чЁ›ѓD‰ЭŠL§ѓ5мі-ЙE–mS‘і€[vЌ@œ)шІ…НчmЋќэnЂЕUќўиёфВd\УrAђ”“вm@I9уЇ5Вщ§ƒ3† хNŽАђіw„, ’Чc%<[WMzqыRМєіїк†yЧКq…&КАš „O{˜фnтКр'|/w'Ihˆ"‘ћB‚Ф{щДЕьфЉ#3н)wxЋ7HщЬYl<ЪБvэ7uе$7№ђY&#+2sчOугїv†клд7ъjx|q=??[жшХ ЗMs*ћ&^3g(ѓІф“сW=t ѕ­<Йn+›ЗГаћ,Y’Š$r`Рr:™fГeвдМ?‚ЁYŽбE[!жЩ(В?›Й ЎЇpˆGвužЉ›ХcПKрtyЫw\.ќЙK™ћwO1lЈ=ЭO_˜Хгgšнш% З-ыГмВ_љy%пXЬМR…Й%P‘ЁR–чтОя—Вюљ›vе<оёHr{rТBЫ`щ€�–}BLTxВ­=ХСƒQЧг)8uR= &ёŽІцКђrП–fЙ'“Зkgpй- Y&ЃCa/ˆ|уц3їŸ1В4 j*KK†qџз;eZыТ#†‡ЙuЄS•ЦСЏ8Ёhއ]Г•Ѓq‡:?tяtЊПWхёФ‚-йкП”љFBcіђ*";›К1uгЉR шмНQˆEœРwяXРєЊQјмЬ6,Ж_YЩfУ "і‚,BЂз„EЬўщJЪ+ВбUўЁЎ†п”нљСBUёM\pеH")hэqцоSакх™5[Б§сЏЏЗіРu?ЌТ•“3бЙ|сЕ_ЌснфХŠђfebкtZ…ОLШю_™шЁfі~жDw{;БЎЊчŒaиэ+œіЂ Cб8жРІ_џ„§ЛP;т…ЃЎЉWНrzсЙ18%гнвщ„›6Ё5лжяЂххз7jёПŸsAЄОЎ†Ÿ˜O^^UИ‰Йет-ЫUЁb№†Сй…­i˜б6$—‚Pv-Дoƒц7`мэ0~!єьgЧ?пЫ­ЧV0ъЛѓšЉ|-ыц‘*зWœŽЬ—?В•Тщ•ью€ІюО‹ЊŠєфcъЏ„ ъNЇКyЦ›ЩЄwœМ-–а˜:­�A ЁAчA‡ЗњВ ЃBEо0rбD] ѕBo7ЈIи§tю…K™єу—аŠгЉ)шбгВўiЇU„\ц|џќh”Эg)фё`2.МН~#‰ЇKYшЫЗK?ћМ{jа+S>)ЯI,1 ’1Ч'ЂmрЯ№P?LzN8 ]K€–ал‰X§–ar<‘TymБ3Ђa*ўЭ™кВПнљРВЄы X H<КugЧ';UfLЯЧ“у…^R&&Dл|!ЛAё8гH:",@ђCGЌ�1ё]=:ЖЂєЋnbщ3MЧЮeЉDКП§Чтz‹žЏІГљPьžЎЎThтј\ІpgКvЁкзB4u04‡ ŠЂ3эО|"z aFА™џ9y”оќ‘g­юŸЕФЙ�П�иxб}Ё% <, ЬщNш{>jhч­ЗбИу$ЩИ†э‘œ@юU@‘ЉЏm;гъу‚ЬŠvсkљ’BП™ы?-+/ь:чwqл&€—ўЯ'4ПKРŸХ5†Э­–Хќ€GB!~П‹qЅaВѓ|зЅEс4Зtе щHœ…K91њ:|І�0,\и–†m;g ъNœx�]яn ђюњ]АbвЅэNWs№}Ытf,ŠЏЎ) Є4 ‘Д“ЬdбйчДE[G’ЭNtЅ‰[‘ќ™'0yІ+Пzц€2ŽќnэoЏ“`EЫ%=ЉПЋРЦкв^—№`nV_Юrƒ-`іЄйпу`[‚ЮЈŠЎгЌHќK–pъM—ьЮM[ж%›&UN&мhЏ“ ДоэŸ~Ссw7omпм +ZэœиЖЬP№…н $К4к[cь=мCgLЧЖй- МiР3wзгс<Е`’™zbaуЁ7яи“жЏ№†‚XКAтdзWћЌX}IO)ЯOЧŸсЇЉbDАxЦф|ОlьЂБЅ‡ЄjР~ ~u$Тš_4Ђ]’ХКфUŒ’Dіх ЃGGxMYc™|Иd ёKI›/љл*–‰ЉHДžŠы!ЫцcEф…;ыYћЇxц�Њ[ч|ЯЏ����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_ecomstation.png����������������������������������������������������������0000664�0001750�0001750�00000033337�10443006270�020230� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���bKGD�џ�џ�џ НЇ“��� pHYs�� �� �šœ���tIMEж %я"B‰�� �IDATxкэ]wœEк~Њ:LийЬ•$‚б“  Їч™1'юЮЛгЯœѕдsіTL(**‚Ј €$(HNKXиФц4ЉЛЋО?:ЯЬ’A№Ж~нг;ЉчyоPoНѕамš[sknЭ­Й5Зцжмš[sknЭэЈ‘пћ >ќє'Пћя/WTжv …ЃрE$U­№zЄZEеvДj‘VоІUњжСgєЬПўŠa…™)Z3Žѓ6ъкчЏ[ђыІ7ъыC) ю[хœ0:ч�РD‘"=Х_#IТЊДTџЏsZ.:ohŸљџИљ‚њfGmрŸž§П5 _QUFœЗЪЭџЙ >ИN�€spЭш $9š–т[ъїЪSЎКd№ЌGяНЅ™�ЧpЛ№–їЏšЗdѓЇŠЪHт[фЖр\м^ям�Ÿ[Dа�ІBС[gЅ.ЯЩޘxэegђзыЯЏj&Р1д{хЧ.яMZККЎ!тOx{–Фsƒ&рмКЎ8g�г,pЎZDр\EВ_ Еn™њх н_яхлW6р7j?ЏкэYИ|W‡Ѕk‹s7o+`WIнPлцKъѕNЉзœ3pЦ,№y јœk"ЈЦcU?g*$ѓіэ2чїю‘ћдžНu^ЫiМ™�GЈ-ZБг;ёлѕ}жo­ш_зЈœUXЏ`XэдR“8'�! аooЊюпž9дПI�fHПEѓ\Е‰Р„Ё}vњ‚гzpп—я?ИЌ™�‡ЉніфЬnЫж–œпTG4•гыƒZ€„ ”‚„B0nsнёsЈ~nЊ|xІY€Ч�oЋ1dА5§X˜IрЌKЧVSџtў€{Ц>t}a3Ђн9vfХ+v_SSНЄЂ&к™C�$P*€ "@Љ ƒO)Ё „� Цб2љ–гЧ]RЯ-‰7СgЬ9 РT§o`‘С ОЉ §9\AJ’дxв mžјzТ#ЏeЗЮŒ6`эЭO~ L™ЕёкЂВ†[іTGњ€H:ш‚A@”ŠЦQз�”PJƒ�$ц–И9ц7РgІЪwЯ,№™pѓ\ПЎZdрN8|ћh“�,Šm3V=ГЧу_Пku3ДgЧЭя8yц†лJЪƒ7жyš Ъ ‚ A” р%Ђdƒo€RЇєл 6рУcд>3%п�™išp L3 `HОІКР,шз`Ћ�S m`С$ћхдюЙо8zјЫ7ŒЮ› �`ь›?v˜2sУУE{‚з#бЋ 2Q‚N�‚|A4Є_�ЅDз�Mй~ЮС {ߘ­юcј*4xуБE|ЦTœZСa,?@uh�“QЎ snЫ™з\:єКGяЙЊт–�o~М(yтЗЋЩ+ЈК5Њ Щ‚ш=%“�2бб €ОM�С2д№ˆCИUПгйгU=sIНц�Z3 ™ kЊM�ЧбЅ˜ ЦT‡Ÿ 8ќХаQДHїэ>јдK'ŽЛХџ.Мх§+WЌ/}ЉЊNЭ$б Aђъ€EЂЄ›�б$€Ё„@Љ<ЁЦЭƒ>‡Ъч.[ЏiЖъз,реИs§ЈИI щ€sœ„а§�Хuг$ц�,Šд€9k@зІM|т‹џ <њвw­ІЬX7nGqУED№‚Š>ˆ’з"€(yь.z JВƒDA‚ Ц€ˆЕџ–нgм–zЦ,UЏiš tMuž+”x"hŠK#pІИMƒeО@œаIр‘€ОН:нѕудg_•e‰џn 0ќъ7FЌлВч“ъzоBќDŸzlз IВqnРд�‹�†ѓGЭсŸ9ь3ЅŸƒqЗкзLЏiP-р•ІŽs7 œ&Св�.Ÿ@Б5‚a РDХщЇuyхЙЧnКћŒўн: „#љцПЌ(з–d?ЙjcйИЦЈ˜$HI$?йQіC”§d?$ВьгћhwЏоed’ф,Ke’D!J’D Š‚h)Ј@!Ј €RD0Ь†;АД‡@2L‰.z4‘#v1Я]сfpЧуиПY/q>G'ъюЂ=^О1хБG§яЬщGз"ˆGъ?ћц—Д›ю§фуќѕ) ‚ш‡ љ JКєKВn$YяњЙGя’зв’$~€�QЄ€ �Ѕz'Фюж˜1УЫ 1Іh…ІщБЂЉ ЊjDxBир Ќss*йA�шЪЬшƒS~™ё6TПLРЉ~P#*ЩИўwфm-Кsм„яБdй†ЃЊ Ž^~wV›{Ч~§ЭžjЕ?•ј:йIђB”}јf—e/$Щ$n$I‚(" € р €1њГF~fф;Рg а4@c�UЊ�ЊE4bNp�ЂПŸљо�ЈёФьа&иЎЦ rR€0n‘Р$‡~Ўгkгжт;xђDЃЪ]В,Ÿ&р…ЗgДsТ‚…%j*@%|QђA”u Щ~HВ}tЋ{dВG„ь!=€,’й%ЛЋjВG7&IЈ�KSX˜кœ€Ž‹N—Ш�пФ)ўі)oТ‹тФТьJP"іыvя8чЇuЛЖ.§хИ#РуШymќМљЛЫЃЈ€nѓ}$йgHОOЗљ&јВmѓ=d йC!{�Щ�DAuU%vюФцМ­XНb=–.^‰Kзт”осO’uэ �u˜Њƒgъ6ЭБ*UЮЙAФэр\Їмі ,дА)хŒSY‡"pЮБЇМъмsG]Кiыњ…Ž№Ю'sвўѕђєЩЕшDЅdPб*zu_дmМ љ ћЎћ�’ЧguѕЏ;z"$ TEeE9ЪJJPVZŠъЪjhs}ІGXЋL_Я/јeВ sЈЊщ&€Јщ5Р91ќЦ9((у м|Ќ‰ЃSЊšч ”ТЎ?ŽЕœr—КсК-aЮs†Ј%‹—mќшъПŽ-˜јЮУПѓиRP,џщЦз>+ЏбP)TєƒŠ> L№ѕЁža d$ЩєtOŸR†в’(-о‰В’b(Šb}F’OдRž<BШТv-§OЪMY{RnъњoщY•uпЉЈШс0l?˜iїŽ"АШb:ŒB`у8c”1”ƒQf A˜ Кйср„щNž‹†!1џ§h_3IСt"€ЁЎ!ъ=хWї<іvŸŸМЕт˜&Р•{у_[ kЯЇR*ЈшМ ‚оD=и#Šf ЧыаzolЈCўц5(+й UеA‚6-|>Џ8НkЇдЩ™ЫХ]Њ`€ŸŸяїQ§7ДЄŸD4№мс$ВGQ`�c(uрЉбn=жI ‚QB™:c p&8с ˜%н„щз]РнјD4МF „0”W5ц|?{щ—sЎ~іYНЕc’�ч\іФyKV?H„dС"˜ЊппˆяKˆЂьЁЂ„ЪŠR” ЁОжrŒкЕђ$'IŸ ?=ћЋП_yв†.эSиV�г^oњ;xe(ІkjRІ9$n№f‚Zрыч”‰ š8 €ЉgBDЂNЈ0BѕT2Т Љ&NM XЌфD�ˆ!ё`ж–F0Ш�Q?ŸЕ)ПxшCџ~я^�Яs‘РзпћЎеи7fЌЏh[P)Ю!Ÿюёћ]Ж^іј!IджT Ќt'Ђ‘А!Сb0Зmр›~н3ЧђЬ…њ=^[Тч… 1%›iі№OUэЃЊ�ŠytіЈ}Ў*€е (ЈJŠ…ЊDЁ* T5 MBUhjд+FTPБц є9#:Ј)ж‘{КиЮ J!‹< Ю"№ЫD=XпS>zrљ1ЅоџlСkuhA$Sэ{є.Ъ ‚>ЋGE‚q^_WƒŠ=EˆFuр3г<е-гН/пєчЮяпu]ївu_мї№ЩhPLŠЙb4ж˜R}дG™12hЂыС@ъz3ыH!@Ђзt ть‚u$0$п№1›ЊŸЯхцпœ@� ‚ СHT\ЖrгЇsZqъйƒN Ит// џfіІЫ‰ "xA•A=™Уь‚(CQU”•х#j�ЄЄЊnв^љч•'џgєШŽ5w}}ˆ7!Ђ”*КYepг)5ќjЧЬсЁEŒ;'АDаŒР‘ Вfd"™С$�!‚aX ТЉaŒ љ7з`П^'‘щˆ�бАЋИђЄ{џѕіc�:œ ѓЂ5 ЄХЫЗПЈТG`€OЉЧ<$*ЂЎІ%E‡сѕJЯ.ioќпе]Л,ўјќЇFьXs˜ йv+І pьЙs4@›8'pGсˆD\Р›€&zsЭxlnзsœ "6чяОчowНаѓ7з�З=ќбѕ%•бSˆ”ю|Щ~ ”J`ЈЌ(…ЂшЙк$-мЗѕ˜џ}цке“Џ“ь Ф1у2~h]ƒлQtЭёŒaZJЈ ‘P ”p”h#Дhš†ІFl›o-.1ч (И&‡`Nm3#ѕКЩ`ЦcЭ0vo EЄџЮ[ў†ІБsjП fќИТэmя>СъdTЁЂŠŠЦЦjpЮ№‰JяЎ™оzљ‰Я_1Ђу™фШ№ЁА*lLЦ5eу м]M‹ЂЖЂ5{ŠPWY‚†ъ2kї T_HАJИ„+%IMMIB0.ЉrЊ‚”T+ŒlЬѕ„цмаТКSЧЙ>лH=�ѕ‚| д P/@=r8Ib“@7+" wэ<тв;џ`ъoB€пš~ku#:QЩыP„ŠG"ˆD"�€6YО‚=Г.ўъх!kц?rбЌvЩШп^Ѓлџи , iЊJ‹QRВЈ(кŽЊвB„ъЪ‘œф ŠЂИ] $_ХТŒ$oQr;q‹Ь%ЉЩнvп|эЈ№ НvŠЂР ѓyŸМНЃЖэпb‚џ1Ž1W-Ў6�j д€Ћ5@Д ,ВPŒ МD№лр mЇиИЙ№…ЯПš§ншK†G*І§АTОљюўN@х8„#QЈЊЎ™:ч$OћЧш“oИ§ЊЎеG:žн){~.BYTC+ЦКЊJьШлˆТMБ{kЪvР#№ ,IыМ^ymFZr^ЯОђNы5|уƒw\]$Ib“ъtтЛК'ћдЈkЪurвЮь І€ˆЩ�o­;‰ŽхшаСЃхрс R)XDwўŸЎ5ˆ�pŠKЋ:НќцчзxяЈЦ†]іФus—M rЈ€9ЯODшсSJаћфŒWo}ђнз^p;ZѓкOZџэгИpлКеhЌЊP3в[ ! кeg­ьqrюв1з§qKП>]y5јŠ7.YМЋз”јŸЮ)§4Q‡�Ў%щЮ•Ш )эJЕ•@ˆhЌYŒ 9Iоѕ{^Иш™лOYyTАe[†]ёмЏE•Є/‘R@Ф€ѓїCхКг'‰{e=rџM=ЦŽ8ГэQЭlYК|Ѓч‘Ї?ИœuW\4dё˜ы.8"ёѓ[юзkТт.Ћ!јт%?F§ѓ˜:ж Е X+’-_B”J№Ц|№аv@ 9|'іЛ&<`РР›?~ВзgGœ�7мўzП‰гж.cBˆ” *њAD?ёƒqQ 8яŒьG>{юЌБП„пk{љэЉЩюЋБt!^ћ'’~X`sыК]ŒТuфN"˜$0:‹‚‡ С7Š>zNЮъŠœžЃй)]’Ч^3ВэcЃўађШљ� —хпЌСЃл{"DƒŒы9s}Лg>2эГЧоРяКнuыХѕэЮ›U YЎВ7?@Я!&јФЮ6Вr cЦЂvrЛБс О\o6xh7РЃв{@cŒЎоRїhTaщХхс;ВГМ4<мЏ„I_џ$5kЭ‡Эыг'|М€�#2� oїЬїўtфНПgрџВжгЅћ9]{эЎM?7Ф23ѕ•ˆФЕ4ЭZ BY(Ф™JŒЮdS’ ;Ф]дЦ•\"јA?ТС(бF’ГPQЋє_АВJњњГ—чО§њ3‡W|<хЇ?UзkщD–�*дFМ�€к%џєњ§§џ1`тёђъu[1Г§šМ’Ю•СфЮ!žо%ѕvрдзх‚{ЗД )iIˆIzъQœhEт4�7ЄоLd.Ь›АШФвЦдВжГ]ъЊЫ@Рб*Їv–„|z|~€ЋаyрџM,(бЎ"Rˆ˜ .Зˆ€Ь4Oй§7іш}їѕнKŽ' Ч}јMћ™?ўzbiЏ[u$­sHѕw†ряжке$™‹щzp‰T3iњWуnѕЯ9Œ�є#wŽLћЛ8…ЫtЌ>6зšГ…аТр,Œ­:"Ѓѕ‰%ЪЮ:5}д›є˜uXАaSЁgа%Яе„ќ™S�O+@H‚,Qœ;0{ФЗЏŸ§УБ є[L=aЦь_{е&wkPгК6D<5xЛе…хMШ$ќF\о™4hЋlbЧ…эŸ‹Фў||Џ$HXЬ:К Sщ„ам…ЉL"˜ЋŽтga€…бЖуiHJmд€Xqхyй=юМЊcй!›€'_ž|fMНš IL@H�tl›ќЮБ�ўютrВ`ёЊ–Θн­2˜дЇ6’к=ЈјК2ъэuћB>"Ÿ В=9ШФ8Е€'Б ФЄ‚|вt ˆФ€ищa„›9тЬr‰3!•CžЫ,p{і œлгЭz˜XдуD@iс фv=Е оГЉрЯ‡L€еwцDж=)�™цЉМјœœ6~stС^Зq›ќЪ[“rЖэЊPLю]ешщ:рŠ)ЇUХжQє„€=c тuЄ3mіъ›�ФA€ФD€qm”І9"АЅž8F€>qЎЙУсГSЭѕ3}Ки|}Ь$’Ћ‹аДЪw­BыNБЃ$єЇлžп0тћКЯ:$д5DƒъсLн.=;Ї=ідm}jŽ$иљлwЫЏМ5ЉѓкMeЪъМН#,pк97M;Ѕ:˜рBG€Ъ6и”:rќЉ ž|тzpxѓqŒ p=†]}„ьE8уФБ‚„ыI œр€sлд˜:CWvо ю„хz.‚™JfпГ=YTWЕi-;УШ"Ћ7з=ОЁ ў‡ю’љA`ђДEОПмџЩ�3�-в<›F jїюя^РŸyх“мYsWі/Џ—T5HНЯМтуўURК�DВчЦE“ёц$ОcТ&Шю9yBмЯsР(@тЬ,s@\C5тЖІк'Nћo’Р№рЙс§bŸ›€˜JCЯдG цВъJб“Kœљ Ж�QYДmOŽЪкш€џL*<Рœƒ"РЗГ~э^з x‰Я–ўж) oпu]wѕPРо^Xь}р‰qНѓ ЋЯкS+і‹hžг—зVЅmЈзО!AtIЖ8H №ФЁоI<ј дќyЬ{ФŒг-№вOКгveнюspsй2a:№œЙ}H'_SзФ"5оЧЬ ЎB;ЁD'Acm "С*xќи\иxыA`S~q_N$Й…~!\ЖуЫ†|ъєЩя~<mрŽЂњСQЭwіЉ#žюU‘}DШ�ЈЄ3—`7•Ђc—кcˆr.ю$1™ V ‡§ЗЩ[bЮ­ўc§BШ^}�bHО9@Ќк„DЯц†р1‹LC`,сŒзХ рV:™fœ;Щ.ig"ъЪ7#ЋУ@д6(ЃІџT–qС VUL€šК№)М€˜Ќ‡"*чЃжW)я №WпžфYВl§  ›‹ЮЎ ђ!зп9ОOcT–!јuuN§†tЛ—bЧхn9rК(тrИˆ,‡ъ&Бvп­ H,fИLƒ|Ї {saЈrЇ#Шuщчœu ˆ-§Ьхѓ[iтІ§зSШcFєћБHрL/#"Њv EћЈ­Љѓ|ўэђЁ�О:`„"jHmŒxЕ^НЌі9БЯЋo’ЛyЃЫъѕљ–юЉіФK“ЯЊm`~~УYѓъ’юŠСэ э-QЯхдХЊ}Ј%ЩњыbЬ€‹Ф‘лч~­§7З) ЎА-i‚�Кˆџc1œ?fX�ЂпІ‹мв дXMDС ЂrkЙqlЗM‚ЉХЖ…O@SQЙю @Uу‰œЎпVУF@­Gc0м �ђЖь|bмщ›Ж^zRП+џXQUпYбє01ЁВэЅЧ ЏluОЗ ЭФ& VњIŒж pњЮчивncЏщ?ЎMsЭЉўIгƒ?lЊ=gX$0Е€щ'Z9ьŒ;Ь€!щ`–Фb8œbтФUMбГАЯxjxZсм#Рw?,ѕ]{чGэ щъŸзъ55. ьмчВWЮ:їЦKЋЊЋлqN�СcфЖЙ(tЏюБ—ьMG'M]!qЉџxаI“зb3|IмѓэїŽ5ЄщŒ WiZCБ�3 `з2АjN Б–QGZ9uˆ7“ц(H'‡ўf>ЏŒ8kЭД/^>0l+,KoˆxDШzњЏ_€`wQi7”5t#D6"ƒОФвJš^#нd/ЯmЂФ’„Ц€ŸHЕ;€І4xѓК„dpFISa!Ч€#ќЫ952‡в3Ь$�qŸаыqЪСЕЋN˜ojbh‘XПШI-�ШHOYuгЕЙс�MРђе[Г4šЌп ZDЬАВЗІБЖ;њŽU§d?I&mњš­іc5@BUOcAЇ†жŠ'q•Ÿsš’иј€ЛzsGn™�jФќMр 8!њ�wљ€њ уЦnЏj!T=q˜�‡�pз0™‚+КгпКeцЧ‚аєЌ“ C"Q%›ˆ)њW ю0вДД“§—fї$ЫОЭРОЬ‰ёмвыдж�fЇFБIЋ д(*Ѕ–Ј�AЌъdz™:ѓБћz\ЗЊš Fe3Гд­љYv­CJєяbU@)KœцЄЩЂV DX­™Љ5wўуЊ*\TRхƒkџэШqлљ„@"FЪ‘јšы‹ЛЃlФљївvЌчюHа д}ДЮcj S4–,1UФьš„hb8Ш]Ъ]ћP[0Ђщ�vRcњr ІвЭ‰ЕљN/x<˜�шrBћЇЎО|я[к4ЉŠЪъќt€GЫгЁБС‹0їщР§zз [lO@:фqJDœФа$АЄо–~A ˜5ˆЉY’VА$YEЂ�A ЃЌ]Œ2u…( Д„ръдќ\‡& ФQ“ЦfQЗЃ;Ћ*”tШiНі•ЇяќЯAЯЃ‚€h$Š+Ў„Ф�’&Cn™чњ­DІ$Ю.“xеяјбьТ’FaтЈ7LЭо& ЕoсHSГУЮњBЦ№€qЮtŽqB˜1ВАgЫo`FЬf!LN mрж‚мљЅДz№њuHM Dєэyхщ§zFš�\LГ—кh {‘R‡:Œ'|L$VРpc"œбw—нwффЙT4%.ЛO’d;JЭRxГњЈѕ\лБІM ‰‘ Гч�eœ0F@™fМ‡5)lM�й3 К)0яЧh?юd WРЊBСџpњЉ7Oњ№щМCЪ L ЄЃЊЮ$РОжSФ Чi4Ё)b“/˜kюјKЬP оЃw*X S—)ˆНN,№‘ HŒ#K�Г %ЬктЦфЛі%œƒYЎk�B (Ї`џ†Чš>ЎAЋјTЋCП~=љюЫWі;CГIДl™Ž]&Рі>йпЌ3ч бгтСЗ­GМНЗ,мšЉЈуqш‚ОI�Gy9Š&Е�i*™—ЛKШ1_И’0ТНМ€A�чФ�ч‚‘&Іkfj5Nуц'8з •џ�-СNяѕвД/^~&5хƒCЯ юдОЕК"Пт@rGK9йз$œW™‹wJНЫщKм)‰ъ9 8†~ЮЁ˜ bˆy3Gх•IРЏЈ•VдЉЇPСc[�_ШI�Г†…Fݘїчzею�Ÿs b„‰eЬЯ‰B+§4В‹:рХп|ьўд”Р­Рn’�ЕAиЛ]Й� ЁDЊ)I v‚љuы?ФHНK ]А@s|muС1оЗ KО 8ЪаR ХxdŠђ%[Н2ђ3(lз[{хЂАw.jgЭњQќdMз:.хx]Dр; W™GdжkжгГ}L№%f№ЧtF  еCй§9d^Љ вџЮY_Нўf›Џ^?рмŒ& 0ќŒ5s–U‚1ˆёюDyl’л4вфш‚8УЎФэ/Ч(Р’OмрЧ@Шх)Tјdф‹"6Іј‘п"[ЛДEойЇ П[;DeiЏ7ЃŒ|АŒ��`IDAT8?_‘аУI€D5‹5H@Œv–Yiу@uЩч”€sЊ;ц=рСBDw~†єdR}ц€—NћтхЙ›œг$Nю˜Z‘xu]”@LKѓЦн€яenќ`H@š 1A`K„ЫћЇЖ§7‡q”RxdЊЅФR,фљНТЦ”$!Џ}+’7т4фьOіJ†“‡†6BFЇ§7С•~Р˜N f$zш  рT3ЮЉ8ВюPЪ R2й­3]zсйWПім=;хЛ7I€‘gЕkЬ>ћЫb�m‰'Ы‘ЎРH=oє8mРШjиž?‰w\CAНK"EZ@ЌёxФѕY\›™*ххЖ–зіы*ЏЛeЄ/ЎVСы8 -ZЕZ’pyBщчКPkдЎ]ШœСPkи(XKФ9зgbѓP5З}1К]эзћЄч_}цЎ'Яа+rЈ_}Џљ�эr3ѓZw’к*§Бю›ЏŒ/ЫЌњИЎЊимЌ› G3іNŽDD"{Wі№‰РярѓŠлR“хI>iUVКМj`РкбУS ;Ж‘]‹$п9‚Ьrdч:Uдчы‘ %Ѓzy:Эp(ЕЃbnŠЊK>3Ь#свљhи> mВyч]pю_ЦПљиЂ3L8,п}ЏИљЖЁыЃdXЩЖ4Ќћц~Ф<ˆы1 rюЮ’ЛžHƒФGи�ЏL‘šьйюѓJ+гS<+[eњ–]48kэДrЉящ8ЬuдіЃœ-Ќ]­†ШLL�УPb8юиНb\0?У‰4 rуЛе]с^нкћш­/Ž<їЬЃW'а/‘ќњ(•гЂь1Гѓ˜šщ<ЈМщЄ‰НЈ§ЬtOЅЯ+џšœф]šн2iщХчД§ѕВaй•iЩіцJпОˆcЂн4zXёУ“ыk)3ЭђbРзHLEВX‡‘AR ­FХњ,љsZ3јчоѕоыlyюЇM~‡ўНэжђѕЌмVXѓТmЙЯћ}ž§rРіъо~ŸЯхUb�МzC?ьЮ[ЎgўˆЩ BєJa>§šр5вС<F:˜‘Fe#Tв‹ [YР’•ЧюѕzЕдd_^jŠYZŠсŸЯЩ§ѕО›znРqдЎy1ožЗеЩCšкБ„%([k2Е‘Цz”Ќџ[&Ёe†Щ?єyєГЦюгУќ§н§gџZЗ0arxћ„‚ ^8с№ј�ЩX™_ƒЈЂAюа}€N�ГœI"MрьЄiSсѓŠбд”Є5~ПoA—мЬŸ/?ПыЂўмmOБёЙ?‡KЭ‰ZПV’0Б•ШcT?‰] Р€hЈХk&ЃtУ$dgљ6^x^џ'Ї~њТЄЯ6ЯмччNўБВх;п–O G˜\‘џ=”]ГЖ6аЋiЗ’mP4вћ„г†`ё”7cjк0Gэ–pЮсёШЪLнъёzgиЉѕ‚ўНкЯљзэCk`+€ятИoRЄ<O’мс_fxџV1fЎ TWŽmЫ&Ёx§Зh™юYyўаS^xхйЛ'wъН_U>оŸЖGјє‡Ъ/ЋыдмЦЪMиЕъmth›žwи��Х�zŸаgЈ ‚išЕ–нъœЧ!=еJNN™нКUцЬЁgv›ља?G&'yБu№=~Э-[Се $пv�= (qЏ Ћм‡Э‹'Ё<џ'ДЬLўaФ^/?xз ГOяз“ћљKћѕyСА&м4vћ„н{ЂƒЃe(X<L ЁUV—лЗFДеЕщžЄДШэ9ЋZkи‰s];2гuщ™пtШЩžrУшsц\sЩ а�ПLžЙПы6№дy?7TF§ПloWЇƒЏP"!,ŸƒМХS­.Ќo—нђѓ?^uўoОxпњы€§оlcžйўjўЎ№еjЄљ џ %T p ЇŸоwэ/‹g>t№дЯ-ЌOmP!zНи €j/№ћd­u›6ГкхфМїж‹їЬъ~rЧШжЅРœ)OрЉ]{й9 џ7~ѓ6QDW“�PJЖЎУњ…пЃ`х\ž•с_•“ž:юžЧјтЊKЯЋпАtвNYUTxhмюЗзl ŽQЂ иКp,ТuЛ�Ў!-%ааНыIT7pП"іo§вј]јGе•cьEЙњцMb ˆ@ї=Ÿ[П|ЦhnјПwW–жщ”б%лѓБaёlф§<„JS’“>=s@ЏOЦПљикCyџOfVˆ3ЎљhЫЮ№ебp-ђ?‡Pѕ€…СЕrВ3экОёЌУъшNЭW№њGЅdeуФУ‘ЗxІ^З†ЋЈЊЊъи Нож/јnХкзž­5V—ЄЅО=НgюЄчџ}ћт]OP6/џъоћ­ЏЪRОљЉњы%‘Г#хШ_ђ"u…ЎR2™i vm?АїнЏ§zІ4~Ѓ6ж6РР?џЭpu€k`šкЇzНuЪІ§сдŽC?~ч‰іkОНuЦ”зцїшz‚rЈяћьЧХнО]XНtGIфьЦЊl^ј " Х№œЋ \Cїn'Я9b7їФф“_\ЪљѓKžеўD"rHщм›жY{џЃI-šс?2эЮW Gљ{^§i7ЌчЙgПЫ…C9IыЧIЪ)œ$Ф‰Џ‡м’gЖl_9ёГ/ИDы~якџД3hVЧЋeЏЂьСЦ…г*@c”„ТЪ’‚-k77Уuјкгїј“Кќuмš­ЁЇ‚ЁАМs§d”lў^+FЕ0ЃR‹ЂeVкдёя›r ŸГп[Цєш>ЋzћЦ-�аwфѕШlлQп‹)иЖmћрfШЃдПV8јѓџVЎнВ3|S}ѕnlZќ*w.qОЬsГt\ЇміSцГі›�зЩ –-јO$„({0ќ–YLŒF#6Уvшэ/K3.{xы{ПЌk˜_U9Ё4Жќќ&ТuХ1РЋz˜‘+�S‘ž–\sузЭ:Ђ�€a};~˜Зdю�8mФеhп­Р"(-)юєЯ;щж сСЕ•›Ѕ›ЧмњѕOе[ Š"ЗTWьФцŸпAЩжџ‚iᘀ‘6 LщoнЊХдыЎНц І‰hї№г'G3вsќ­Nю=д›@›.ЇрзiуЁqB‚б=хЅ;4Уy`эі—w\јхмЊЏ Š"74дзћvoњЛѓfB зи•A­cЌэ€Bсч єЗѕызЬчpъц'_ЬhёщМ‚mУoњG �L{эnќ4iZЗэДeЩ‚];ulЯšaн{[АЊŽЬXRѓЧ лC•V*}U%ŠђЫQЖуg0ЅбиtЪЖйyа"zр‡…-ˆvm2—яоЕЃпС~с@_№ѕ”‰СД”6Њ”жњмйmбщдГАсЇoАЇИ8ГtOетѕk—4CœИЭќЙF tљы•ге|Иa{шюкњHvљЎеиБn:ъЪЗ€ГЈ{“ЇдsЧжВм$E}zї|pЧŽkі;доСГч- ќѓБёыЎyќХ\_ €т­k№ŸПCNNЧЉл6§zI3дюіъЄ’6‹ж4мPдnЏЈQ[ЋJEPОkдhНхЬ™ s'иЬль\ Z­Z$яњт‹Я: :T=Њ�€Q—п5КDЫјьЊћ�,Ÿё ІНњ�ЛьвKКLјрџy-№ЫњzЯ„# KЃзе6h G™jЌBEбT•nSУŽђяЖ­S§мI€0ИІW‡ФаСgо9oоМWх{44MЃ'єЙтћг.К~ФР‘�LџЯУ([=ї§Mы~ѓПњітАчЕIegэ,‹\Yл §ЙІAЫ`šŠъŠЈ*йŒ†кbЋєЛ{? ХБсdлoIПmћ[ЄЖOžќeЁC‡�Рэї=пху) W_§Ш3ўŽнЛƒ1 SŸЛMЩ–‚]ІNžPјП�њw‹Њ[N_T3ЂДJ9ПЎQ;ЏЎQKчœЁОІе{ЖЃЖr'45фо�‚Хиy–�|‹Nе˜Ўў:ѓЦ |tЈпŸъœ5bЬэkђk^ћћ ЏЂEv64%Š‚ЙЇНѓиMњН]пЈ’IsЊZ­кВГ,к/ЊАaѕAvJ$Ъ Љ ъkЫP[U„кЪнадpЬЎZbщ7`л§ФвЏo ЁƒŸгЖеŠЇŸ~КџЕз^Ы~sЬ_ј+§ЫЯџX­†мњм‹HЩШ�ИЦOЬюО№DђЪё іЂ5uо_ж7ЖлTъQdНBк)Q…ї­jэ•ƒ1 ЁЦZдз–ЃЁfы+РŒR=e.ёЎn№UУщSнрЧ9aKњeiќуЈASЇN]r8ю“Ž7Йчс—к}јљœ•rFnж_Ц>фД4<Ы{FwУ+%ќXvТŒrЯЪЭiЇvIЪ]МЎ~эP\Ёуэ4†EхTч†ЃЌ]0Ь|м(с„ ж#иPƒ`C‚ 5F”NO’Е7|дbHЋі5;ИcJўўHПX=Кw{g§њѕ;\П9\otСхЗŸ7gб†Љй'б1O>‰дЬLdљ№іА\м‘LЂП5јs—з’з'—Э(*Ž`1Ъ“sMUЁ(D"!DУ!DТ‡5@SЃpm№hœsы\kЂЋюО%љ&јЊcШчŽђйv_'@V‹єн=єPЯ;яМГц˜#�� 5цсŸ–n}*=Л3nўзуhйNп>6ХƒљгpљйЙЄќЗ$РЕџ|ЮœЅ•s4Mƒоhš U‰@UЂ`L‹йд‰7БУgŒд(тРOьјщ[аы’я‘(5jдySЇN}8z8пь_їп2Ж{—Ќ‰UEљxѓО{БuЕžWСМJЌŸœЧЯљ- №Ј {ЪvЃВЂ5UeЈЏ­DАЁбpаPчъоЅж1 У›єъueрЧЋюЈшбЃЧѓ‡ќУN€ЁƒрšЫ†наЕSЦт`M)>xт_˜7ѕpЦRбrw=fВžППnOћ-0ђЌv[>к`к>@дїюу cЅzяР;Ђ|.ау#~мpќ …Eћі9ѓ?§єгGФoBŽФ›>ѕмлЩo}0unIЅв—œдo .ЛэVЄЄыЅч}"vЗJТ}НZтѓ.фЈ€1Nк zo{EUАCтэнЭеMЬЕе;ojЃgИ7|о—ъчQі&љЫцƒE™™БуОћюћУ§їп_tм��Ц<Ѕнг/}єуЖ]ѕ'B оо|NtІQсШјЉC*б‰Ь;Z$h7hмз%х э•�Ц‘7iџc€ЧОmП{чO“ЧЯ’ќˆ~ T{Щ%—œ3aТ„Gъї8Ђтїк›кНёЮЄЙлvзw"јpbŸ~И№цы,‘АTцg'сщ‘ЩGš�}.џФšM{sƒЯ›;$жqРЛ??ь3Вv8Oѕs;}бЕЯч\|ёХ—Lœ8ёˆЎЄ;тњї†Пм—ђуO+fь.  !�"x!ШIpоЙ8чв‹œžf}‘$+S=wJK|оНi8пgд˜ЯЯžѕSўNЩчqDˆŸвЯF§т§…ФЖ?жцK’щоНћ%ЋWЏ>тЫ(ŠўfкЩ>ёњч›Ж•‚�ѕ@і'уєs‡уœДжѓ=‚В€Ii^Lэоszd‘УVуўчgћЦ}ЖЌВО1ьг�ŽUЭ{?f˜июkŽDMЇ pOїкЊ?bxћЦXŸ)e)2pрРk,X0хh`sд<АТ]EтзоёЪЏk ўЮH5I�*C”}ш1№tœqўpt8ЉГЋцАWDPІ˜' ˜й: KКЖР†мдC *uєќМТЂъ!ЎmЛ8пЯёџоэП |3 H(љ]ђЙ‚@ щлЗя%ѓчЯ?j Јž nG\uэЪuяж‰дГšб2'Н‰žћЁeл6q_ж#ЂAЄXOU’€|Ÿˆ­-“PN€‚žYЗ№“КDŸ[жШ[Ўн9ЌЂ§јwІџулЉ ЎŠw’Яї~№ <Ч<ПSђЙ#ЦИ†єєєЊaУ†]<yђфЃšWyд ��7ŒЙЋїьyЫО(.ž!IЏDJeƒzйB%ДЬi‡“{їB—S{ }—N№њ}MОЇ зпQ‚А@ѕЧœ}ЋоdЭЈоj сЉ[ƒ‰ Б3и”фЧGўx‚lнxи[Оѓ˜)^€ЃuыжFŒqёG}Дхhcё›��>ћтыР ЏОџъ†ЭЛoVИЙы˜ 1ы™ћсR’ŒжэsаЖS.В;v@ЫЖ­б"Л5RвSAщўЧГ8чhЈ­ЧФWоGСЦ-ћАџ<О"ŠqЮї#мыŸЧЬюЋ „ kзЎSxр1з]w]ЭoУoF�Г]}§?FЮžПьЭђЊHЎ^pЪc–"†6pяŠщмњ‚ "Rвг”’ _ ВЧI–Œэе8TUE4A(Bcm=jы DЃиw ^њ›žј‰qњ,лM�О>Љ”””д0pрР{чЬ™3юЗќ§s�РЋЏП“єёg_?Б9ї?ƒQъБД‘l“рк$йM‚И= šкл7a™[ж„`–ОбŒЮ‰&~bцЉ]vrЇxCълЗo?шаЁc>њшЃќпњЗ?&`ЖПмzWЗљ‹~}aЧЮ=#&ЛДНЙДБќС`? Рїхљ;ƒ>L‹ є8ВzРщщщхЇžzъУ=єаУ‡?&жOS0лхЃoДшч•юЉlІqйђ ЬК‚іЙŽ-SПхћ^д@L�ˆяeXK0іпЫЏ+›W>999вЁC‡зЏКъЊgzшЁЊcщЗ>& ��kз­Чиg^>kљЊѕї—V G q›‡90ЗнШВIФT4хЌ Рљт&y\“:Š%ё)))‘:|pоyч=ћт‹/ю:чc–�ЮірУŸ0cжмП—VŽЎЈЊog!Ё6HДu] РуыЦЧџ9}ŽeйБѓљ\/язЊUЋ’6mкŒЛњъЋпЙїо{ЫŽхпіИ €йjjjЄ[џyзаUk6^RYY;ЂЊІЁ=у‚х(КЗЃЇHМЉAЇ?`е8ф ь~ьxпв5LnпУщщщпхцц~8~ќјйЙЙЙЪё№›Wˆ (нєЗю+V­жа\_ьгаj‰jФe@їƒё w’glтƒ( HMMн™‘‘1/''gњwм1чТ /Ќ=о~Ууš�Бэ­Зпkѓ§ЬйнЫі”w­ЈЈЮ G"йœ“vЂ(ЖŽDЃ`0Ю!G"‘(ЅI~?’““ŽDŠRS’4MлAРЗљМRћЪŠВKЪї”ЅыЉо))Щ‘@ АХяї/ЫШШX:hа EџўїПЗј|>эxўЭ~WиŸІ(Š Iв>A[ЙrЅ4wюмŽ3gЮєѕяп_щдЉSј1cТhnЭ­Й5Зцжмš[sknЭ­Й5ЗуК§?”Oк3KwзW����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_freedos.png��������������������������������������������������������������0000664�0001750�0001750�00000023067�10443006270�017331� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���bKGD�џ�џ�џ НЇ“��� pHYs�� �� �šœ���tIMEж ЫE �� �IDATxкэw\SзћЧ?7; йВЗ(‚LX­{oДЮЖЖЎj­Ѓn­ZЋuTm§щWЅе:ZQTШDС- {„ВяяhЌu[ЅjяћѕтѕђЦммф>Ÿѓœч<їœч�я'ФћњУт.uŒ;Žq*і<rяо„JЅ|ъџйl.œœ\�џ�?ИКy—…њSx‡8ЯоОu3Г[ЗаC‡~s713эж(itМsч„BcwЉД™оаи…\’$Ÿўс l6 \.\. …ЂJ­!+эlmaecƒЬЬЋ‘ƒ RЛyј$>xpчСАсВ o%€™јјxуЛ"C›eЭcц?№зŠн*+Ыпиѕшt:СdВ“;јvМ+рќ6`@ŸИАА0 %€Vdбт%э†VUWO­(/7“ЩšŸ§1&“6›“ &‹ !˜L8,Кю}+”P*šбд$…B.…JЉ„JЅ„BЁ€Jѕт†Ючѓ!eљДї=bnnЖїЃ‰ŸˆоeЯ№ж `сз‹ЧЦ_ŒSXXиЋЖЖцЉяЫхъСЖm[Xл8РеУ ж6m!0Б„Б‘є ŒСт№Zv… 466ЁОV„ъjЪKKQј0ЂЪф?„D"~ц4kkXZYуАY+ЮŸ?™РkdюWѓ‡^ˆЛА4?їЗ\.з}O Kk†tCЛŽЁ№jз\ОLцњ)$дj5ф2 ѓясnV2вRpыжMЈ”Ъ?vЪ€Р Š€NўkсŽ… П")ќMNЦœђXЙbѕќмм;#ЄR)чёыО§бГЯ`t эОРј_њv$H• 7ГЏ#=с$Юœ:ІІ&нџђxz :eaбvТюнлЋ)МЉ9&ЋПY6юЦЕŒE"‘H�L&ЁнzaР№ pѓіAМ]zmЈЋС…гGpъјA”ш^722RЙКЙЏ5š­9zєАŒР_Аxёrг+щЇSR’§TJ‚€•ІЭ]‰і~Ё hДЗК5JФ8yьWўy;dЭкр”ЩdТЭЭ=gФшб#ц}9ч.%€Ађ›o>xhmnюЗЧ‘ќР!Ѓёё—рšМSUEЩCl[З�W3вuЏЪ ИfзЎ]л)ќ‰Ў]Уххн?PUUХ�S3 Œ™ј>04:ѓV)хЭ8§+~йГ’:эШA_ŸЏтѓ g5чЇYгІ5НMп—ў/ѕїєъšъiщi);ъыыЙA ЄVoљžэAашxWЁ3˜pёє…_Ї\OП„†  M*mъйдидeщЪЧЃЃЂdџiдждЮKŒПАБЙYЪдзчcвдйјdжpx|М/ Э†ќ{9‰*@’”–”и–w‹ˆˆј=%%EўŸьЌmьджTPЋUz,[ї#<кПuўыBомˆж~Иs'tЏYYY_br9§янКUџoПV ЏЛv  ЫЂдj•žБ‰V|ї#<;„МЗЦ�6WГЎA—ю§uэ­ДДЄ3Х>;ў|ЃџL0bФЈщ$’zЖ‘аы6§Nžўј/@gВрм uехШЫеŽkjjЌI’?~вБФФxљ{э6nљЉSzzкoIНпР�KПн[ќ—рpy˜6o5BКt�h4ЄЅ]MЙ|щtjFŽё{ыќ§ƒЬЮХЦ‰*­ О˜П ~СсяЕлйЁƒ0ЎЇ'@"‘� PVVfS]%ВъпЏЯё”””їЫ :вЌММфLuu•/ƒСРдsб­з0 џUј†&XЕў'иЖu„FЃ†JЅDќХscПxЏ<Рќљѓi97s~ЩЯЯ €nсН0~кТwzŒџКръУЩе cA­VCЁP ??пзЯ/шLaaОшН№�А†пНs{0I’037ЧЇГ—€FgB‹‹G;Lњl.hD}}ЉИЎњ\||Мг;я–._хПячнПжззѓ8.ц-п {oЪъLРмМкC\]ŽћwoiGееќ‡…Ѕ?љјгŸутЮЋоY№xњПнК™э�ƒGŽGпЁу)‹?W4И{ЖCЦхдее�D•Іцm7ВЎ%Н“я1:%9ё ’$‰ЖЮјjщ0YЪи/€Эе‡­=.œ‚FЃ†Z­BiIqШ AУЮfgg•НS1Рњ[‡>ШНЗG­VL& у&OWпВђ_аЮ?Нњ е‹ХЕЌ””K‹цЯŸO{Ї<@ЃЄўPnю+�№ёэ„ёŸЭы'sМ%}\\]qэJ Фт�€Z­rЋoŸ-+-*y'<@DФG+oмШђ�О�ŸЭ^AйЖ…šкру™‹@{д`ЄR)иLкўдŒо[/€eЫV˜d^ЫœЎVЋ �шжН/l=(ЋО"э;uA@`ЈюјЮ›I qупz$^JZќ0?з�иl"&Я Ќљ7‡†SОX>_ эRёлсƒs~јa+ћ­Рч3чоН}чГЧЧіC Ъš+[є4њ‰И}гI$Њўж’КšЯ**ЪЛ€Ё‘ГЎ_`DYђртцЫёg ‘дƒ$5ЈЊЊЂ‰D•‡п:А~гV…R9ыёqŸ~ƒaiы@Y№Ђg`Œб>з„UUЂ>“І|тѓж @T^>ЖЌДT�ш z ˆ Ќїšшкc�ь]��uubVжѕЬўo�N:Ё›вг)А Ь-m)ЫН&l&|њЅnоD}НdскЕы оњэИ‡T*�4 =zN=ъ}Дѓ †ЛЛ'� ЄИˆwѓі­љo�ЖўАХОЊJЄ�цm,а1А eБз ›Ѓ‡ Ÿ/�§QУЪИ’оwяО}œЗB�4BН№ёщЎє[ЪљП/р�7w/�@u•Шчоэ;}ўuЄfфXфцхк%б§ ,ѕІ 1жЃ� ЉЉgNŸњЏ рїƒћ{‹Uыpїlcs;ЪPoв јw‹ЅMжжжŽ=ŸфіЏ рюнœЋn†tygrО+ДБД‚Ѕ•� ІІšЛaнЊ>џš�R3rX997]�€С`РЋC eЁ7 ђрьЂ Јеj”••M;pрСП"€˜шcŽ &г�†FАstЅ,є†!Aƒ{ћNКуттb‡Є”фџŠ�šš›‚ЫJЕsкu�AMїj :wыЅK +r$'& љWpџю=їЧџvrѕЂ,гJшšРвЪFw,—ЫянЗжъhl”tДЯЎНлћR–i%‚€O‡ŽКcБИЦ&ћЦю­.€њ:Б#�`ljMYІqїіћCClD}]УˆV@||Мe~~>�LMM!PViE]НСbiWW‘$‰д”dЗјјxFЋ р‡­л‚5ЄF�l\СфшQViEЌл:УЪІ­юX&oнўгŽ…П’zŒŒ„}чџ=}:сU*ЬШ›ъ‘–tїюмNƒ‘Ps+{8:ЙСмкс?Й\ќUaВ8№ТУМћ�€ВвR„uяеРсV@СУ<нd?+лЖ-:GЃV!§в9l]ПткЊЇъіОР]К}ˆюН‡РйУ‡Ъ,ОяŽЁјэРЯКуќw†ЖŠ�туу‰aУ†ыК Ћd0HмЛ#ЗC­VƒЫуЁ[зЎ№ђn:БИgЮФЂИЈ'Ž@lЬQ…tСєп‚/Rж~^ шеlr™Жв\yy…ћŸпs1)wю =!1ХEХ`аhял “?žЈщћaїЇЖNiБпнИq‹еоНЛKюпП†ГСршПєœЬЫБrсgазчуЛѕпЁoп~0ќSрЈP(‘tщ6oо„‹qq IРбй Vn‚u[——IыkQZRЙ\› +KkшšМзн‰JЉРœ)qџо�€PhRїхW ќŒM Ћ8H’'‰кдДЋUЂЉI AРШиVж–e&&Т 3ЇOџ9,,Ќі•ауУоŽщЉ)ЙrЙFЦ&8p*уЅ7КIR‡™ћCCЊБпЏA I P(`Г9рѓѕ'6Аsч.ЌZЕ‰V6vXЛѕ ЬкX>ѓйЂт8qtуЮB,ЎJЅС€@ €›Ї>š2m}€їR$6,Ÿ‰ Б'uЃ4 K”Jд*•ЕLіђ”, экћ•њœ:Uнт9\Ÿ>}ЦЙsБa�`me…ўƒG$ž:ЇŽьAтХГиГ{>ј ;‚€Dв€­[ЗbвфЩXЙr~ћэwxxxТСС `oяˆшбЈЏC\SрnНŸZоэkјzі$\НrrЙк–рrИЈЎЎBiq.ž=Cc“ї4SI@RS‰ДЫ‰:AШdЭJ…Т€$6–ptv…g;t џСЛЁ}Ч@™ ІJ„fiЪJ‹љ*Ѕ2јшб#Ч[œˆ~RшаX(љ’:?u5";М: G��%%Ѕ0hш4—’’ ‘д#*ъ8ІMŸ†;ўнКv� 2ЗnЭЧКuk‘žБЈТ6к€ГVTŒU‹f КК њ|,]ВC‡…>_Є†DRв%,_О ЗoпТі KA€@Яўяпdk[;0™,(UVЗЕЕCпС#б)8F&`ВyO­Ы$Iй‰И“} ’:эНЌ­ нИiг€ 3ѓŠюп†Цц ‰Ÿz-="QцЬ™ G;LнВe nпЬƒЃ#JJJOOO$‰yѓц")14yѓц"*ъюоНƒќМ|�іlџхЅ MБgяtУЁУПукЕЋ№Ažˆ9ƒˆ1HMНŒП_'Ww8МgеIŒЭlР`2AFџ†…žРќ…яOОp›ж.Tк&“ ''ч‹НћŠ0hHT‹AН{їšЈыGИ/Џщ›šx4ž^о=ЂŽGk‡-yyјрƒрфф‚   lйВхeхЈ­}В'—ЫХРД^ƒVБuЕ•ШЪL�L˜4іьУ‡УЇŸ|ŒфKЩШЪКŽ§ћaяžНјiЧOppp„LжŒј3G@€|П`b cc!Ўм„б“П|БёIW’/рЛ•ѓ!•6ТЪкZтхеЎЧШ‘czЌ]Нl[ПЗЄХ ІVЌы№yz/Ю�ЄYзЏƒFЃСP ]фј№сCTW=)~ЅVЋPRR„’’"СџŽZ[л< rД—­(Ю…X\ ŽЁƒ‡ЂЎЎЫ–-ƒZ­Т˜1˜1cіюФмЙ_ТееПќВ§њѕСЕŒT(dвї*kЩб3ФьEп§ХdqЇ`лїЋЁR)сяpmєИё І}:љBZкхWЯ4KŸ”Йзг{БдUЁЁA:’дш"OэХy›6055}ъЕъъ*�€vиXQ^ ЕZ ##cXZZ !!к§/^„иГБрАйЫхˆ‰9…ШШНhпЁR’SP^^[{чїЪ ќеLЌKЂБхЛP(шеЋїЅ/Θе?,,ь™тдыy2—ѓтєsccуЃVЎFI‰vтˆ­­-ЬЬ^мGƒЩxЂEFƒѓч/€ ииiWitтуХbтіэЛК§§T*%т/"6і H’„“Г3H @@ЉT@R[ёŸJ=И…7Ў‚BЁ€Љ™yz``HПчџ•@ћCGчХЉZ&“­‹<snjЫŸбщtL˜8сЙя …˜їемЇƒ–фdf^E[{„кŒЃЅ…….}ќишЯu.ТТКA"‘ ЈИшQ:ZљŸ1ўЭыщX1ядз‰acc[Djˆо ~%yЁ][њС|>џЉў‹05Г�—ЇэocЯœBѓЃM”І~њ)|};>ѓ`іœЏ`eeљ‡ј@Э[6C.—# Д;Xl­ LкиСаШ•••(-+ЧРAƒРч?UЄг A`` Ў_ПŽ‡љљ |ЩТјХyXЛdЊЋEŒ0*"bJiiЁјЅ ЛЅnbjіL+nшAcРЯOЛfєЦˆOд&, ‰щгgЂWяО6lvяоƒiŸњ” /сll,И\>ш3\—Ќš˜ТгЛ= 6oкŸvоXП~xФFКt ЧіmлЁR*Бvэh4X[лўg­ќљGдT‹@ЇгкЙѓюО§†^ќЋsZЦœ< `IKолwи$ddЄЃY*ХЌ3`w<žžpqqЦ† пAC’ žуIЪЪЪ0gЮЈеj 3жmŸn‰)3–рњеt<t<}Ќ[Л;‡";;>>э`gg ‚ Аjе7HJвжYьб{ xќїйкЭŒxФŸ‹бˆ^о7H > ђїўЫ Ў[ьєљ-.]кЎc0 €@qq1ЦŽ@AAс“‹Ф3ЦЏЈЈРЈQЃqяюmxzћbшиOŸ-XЗХШёŸ$‰џэќ?Lœ8 ее5шпП/ккЗAиПџWlкД$IТФФўŸh§Щ‰чЁPШaaaЁqї№ўшшбУ-кнМХ€Щnљ3z‚FЧјЉ_A.—уФб§Иsч‚CB0sц1|(ььlAЇгбммŒММ|D?Ž;wЂІК іNXДz+имgŸ4‘уЇCк Fдoћ}ббЧannOШх*ЄЇЅ@­VС@`„ЋЖA`bѓNVж$СэЉАВБ‡ЙЫ ђ=$ЎІ]AшрыџЫЯ‘џЫnБ­ZњF;ЧЅЅ%+�`от5я7ц/ЯбЈH8wЛЗЏGMM•.АААNGCƒUUUJЅ��'WO,^ћ#кXО|­!ЉQ#џСќМу;deІCЁxzЧ•ЖŽЎјrёz8ЛЗ{Ї--?~П Ѕ%…ptrСЖ}gŸћ>E“?№‡У!З§ДkрибУOЖє-ЯŠDlŠ-:2Xя3У}�NAqqъъъўНгжЃ>™ЙЦmZфa]НАb§N<ЬCўН,”—@ЉPРмвЁс}a$4}Ї## п|=2Y3H’„яХ™ЬЪђR$ Й\Qџ*Ц%˜™™ЃДДX;М‹‰‚™Й%œ=|СnС^cŒœ8GMFюэШЙv љyP(•ААЖE—№~pієеBhБћbp`яь {gЯїЊ?ЏЎ(ТЦ5_C*mвХJ6vP*`2ŸнsЁVЌЭё№єєам,ХРАaCѓЖn§$IтцЋ˜?kкк;bј˜Щьк =С_~‡ЋЏŽС№ъ ŠѓЫЮMЈ,/бѕя�sтє 1nъ|аOЧcšG)w…\ЮJЭШБ ђї.jщЕZмф–ЌXїАYкшS^Vц(“5гH’„ИЖ)Iq8u�bQ)††044Іjџr2/cяŽяЁVЋ%р  VЋ@’$юмЪ—Э„‡OЇЇORЩ}d?˜LгХЩёrlьщлЏ]�ћйЃИu3ч@XXKцm,>(+-1xЌN…\ŽЛЗГqсLЎІЦƒAзnџЮ`В)‹>/h“IБwћjЄ&žE‡NAд`HЕп,šQeйуnWтщх=ТйЩЩ%??п’$5Иqэ „&&ptѕдuњ†H<БИ ’œТ‚‚Єз.€ЧмПЗ   󄉓ыФѕ!ѕѕuКNIЃVЃКЊ—“.рtд€$!š€o`ˆЗ`Їњ–CЊQ]QI] x|Сkпхьї_ЖуРЯ;pџюM рцнjЅПюњ qЇ�FЦBL˜јёŒ_"w6*тBeEљ$БИ–M’dЄ%ТнЭ ЖNbrдJ9ЎІ'C­жшЭŸПh_\мyѕ€nˆr-3uхъѕЗЏgf in–>ѓ9rЙз3Rw& зЏ$Bом>,ЖžVёoй„MRЃ†BRєKgБcг*ˆм˜Ј040€“ћы-вifj‚”ФѓhjjФН;9pБЗСюs$I‚Я7 GŽЕiиˆˆѕЛw§ЄINJGDŒЫ,+/бааР 5deІ!0И3 ŒДЃ+[\IŽCuЕШкСЩЅёJzj‹6!ќЧV˜0ёуѕбЧЮ•ЩšЁбМ<љDЃбamc '7wЌllСц ^8СєMA@деVсўФŸFFšvЛї?2ёгй9qжkП~Ь‘HlлАФЃЌшу{ЧггУ'Sgl\ЗfХ—ЯоыЩcNŠљUR_ї(7у‚uлРаXћА+цїНиі§ ийлW-\ДШsтИqUo\�ёёёЌcЧOьйЛ{W„ђбВ1:Ё b^‹Х—Ы…БаЖm`imз�њ|>єxzазчo`�Ёt6 &4 :tнэQn€ёЇь˜ЕJ•*• JЙЭ еЈЎЊFСУмХН;9U”A*•B­Vџ)ыHC Kќ№П#рЗ 7ёъО:L?�Ѕ%OvSIЯ^}Пьв-4rтИqЯмРдŒжБ#Пmп§ПŸІ456��<Н;`ёЗ;a$4…ЌБг' Dyy ‚‚‚W/^МhiXX˜ц ��жЎ]ЯоПџ—ШќќмQ€vЯ€о†!ыъe<|˜RЃљч-– РхђР`ВРfБРbГСf1СbkC§дѓЕJЅB‰f™2™ ’z(•Š_ЯЦж_ЏљіNnoЬ 8єјiЫЗ IЎnљЁCњўИmлн—“š‘УјvѕŠˆДдфŸъъФ\�№іёУЪяџЎО!.ФЦЦ5_УШШ шАcЧŽЌ7.��XВd…гО}‘й"‘ˆЋVЋоГf/ўЂВœ‹љ7Ўg Дшс3.іmƒС`РЇC'|ЙdŒЭ,пlТЇВг>ъњz1ьььVпПqKЯѕѕ јАЄЄрїњњ:>Ю@Л~˜Лl3Œ…fXЛt&’.Ф 8ЄЫН&~ф;qм8щkџLRRBmPPЈЊА№aw’$‰Т‡Й077G‡Рptшд=њ EЗž§сыыCЁ)˜LZдUДt:о>Θ:cЦ|<zу2Љ‚ЌI�h сщ@RW‹л9™АББuŒŒмЛџў§M-ЙTyyiоф?О^TXьнидиІЂЌ—устю П ЎИx& ХE&Еšqчіэ oм<ЦУЫkMоƒ €Ус`сЪЭшвыљ'UЈ­*‡H$‚ЈВтъ2дˆ* UЂ^RЉDŒЦ šššаиијJ.ќХ-œ }}} р L`im7wt ш‚6VЖ i/wб(cћw‹‘wffыйƒGOРиьЅчU”фcъиОP(ф№nчѓе•єД ЏrнНћі>xxwJђЅСJ…L&]Лї„\ж„Єј8˜™™cУЦКŽ>(ЉUАwп>Сџmџё\vіNjЕЦBSЬYДƒТ^yбІFЅ€L&…\&‡L.‡F.AcS#ВfШхJШš›@*›ЁІq@*H›š@#4 \��›Аy|0YlpИ\шѓРтђСцpРуёРцшНЖmэд*%ЮEEbЧЖ ЫЕO'=<}№љмUprѓ~сАWЃб`хМ)HKО//якm;іZљ{Ы_хк]Л„Й‰оЂ[ЗrО~˜ŸЯгhд 4m`ычА%%%щ‹VРUšwa*�K‡ƒЉГ—ЂgПся§кџЌД Xљѕ,HMЃзггУ—_ЏAHїў _0џ&#љ,–Эћ $Ibі— –Ў]Н|епZЦЦ;oоАvVQQсфТТндmЁ‰IэсУ}Жmо\ђЦb€?%Ы}№ ЩннгПЖЖЦKЅR!#5Mѕе№і ƒёўŠ •=М<н ЕZ ЅR‰ŒДKpsїD+ћчžcaa”ј3‹kQRRЬџ~ЫцШшЈЈW:иџsm~~ощх+VДДЖуW”—967ЫиRi7 S4-ѕr|Ћ��NžŽѓ<y"jYƒDЂЏMбpћц <И™ wЏр ŒпOЊЊЊ‘rQ7бEЉT"ћZ:|;њСPјlN 3 7!ѓJ –Ўюэв.ž№wПТ™г1тЬЋщ'Жmл~ŒХbн•Ы• >>оЉII‰й­&€цІ†Ў]Ы |’˜б>8*/+A\ьqpЙик;?їљіЛJS}іl_ƒ›ПACCУ㉙ i) №ъ УgХoоЦ чOj—П,ЯЫЫ=џOПOTдБšььUU•GŸgќ7&€љ yЦФœј^&“=*)gKKKджjЗHW(фШHMФН›зсул z|СЛmyR…ы)gёЭт™HOНЄЫ*2 јwъtжиШФЂЂЂŒедд€м;Yшоgш3лыpѕ pџцu>Ь…™™ЉIQQбЖжјъodgчјИИоubm–ЪеЃ6я>ŽU›WЛЇыgeІbъи>8Аѓ;4ˆЋо9ЛЋ•2d^:ЅГЦaбž[ђщ��ИIDATМi(-}cЙИКIЦŽћшГЄФФ^&~дЧЦЦЖ�nпЪЦš…“б =ѓyэ:h+ЏцмМi‘š‘г*E’оˆАВВ:YYYСeБXXёэ6XкЙ€Ыу#ДkмЬК‚*Q….НЋRЉ‘u-—/Тз/@МеЅ]H(хЭИ’x пЏ^€уG~EQQ!H’I’0 еƒ‡ŒˆќАWП‘kОY�ЇOŸ.<xHzaaбpЙ\Ц*.*BYq.К„їё‡%w  .ž‹Хb{{{ЅЧœŒОѓЦ3ŸЏћ###У?џ|š�t№ ‚ГvfЎZ­BСНыO-ео4­Л,x˜‹YУ€!ЃаoФ Эп*ГkT2ф=Р•Є3HИ‹Т‚нъg�06ТУУ=§Уо–Э›;ы™щЛЛwџ/!<Мч˜ььыбRЉЉЩ‰8§+z б•]€™Йv§ЃJЅЦе+­ђЛ^Л�6nмbЇVЋ�hяŽЊв<ькЖЉЩ T*A„B“l K+zСУ|‡ЦЦюутQПўМ gNE#ДK8BУzЁ­Г7јC]€V фЁZ)C]yїnсі+HIŠCeE™.ЩѓxdУ70јћм ^p1,,ь…IœеыО?ѓѓžјuџў™ … {wў�gO?8Кj iъ?j]МєЮ РУгНїН{к)iЦІHK<m–ЁККOцЗЧFŒњpнКuK–­hŸ”0ВІІzСƒк ˜Ее"œ8v'Ž‚аФN.№ ь gWOиЖЕO№њНƒBжˆŠт‡(,ШCNf2rмC~~.dЗ>3оocЁ144њaјЈ‘л/\{ъд‰ПМFПЗrэкѕ_xxxБrrnL­ЏуЧ KБfыА9\Јeю‚ЁPиJbЭL™2%yпО}!Л€[йзžZИajf•ecчд;5љœnб~jFэз§ЛyJ™|теЬЋУ+*Ъ;WWU*эBЇгС`0СхщСкЦmлкСмЪ Іfцрp9 8\S$Љ‚Z%ƒJЉ‚\Ў€ЌYICЄMH%ЈЏ)E•Ј ЅххдеBЉTъ&`>;М'`bbЊАББНчшьйЕлG?ž4Ж№ямЃЎt’T]ЮЬМк‰ ŒќшL˜:%љw1%Ђ/И\.–/_5є‹/f{ч0pанБgNMzіваОCћ{=ГЎ Ђ+_t~jF-&њЈ_QqсШТТ‚!йYзm›››iј ж6Жkk›іŽЧœO.Z4џЦыјьщгПh{ќјбјЊ*Q[ƒ‰‘`чр5ЫfCOO_~тдй а ПыямаhФˆˆ‰‡dГйК?.Gіщл?+>>ў•}їкЕы ‚ƒC'Ž=&ЩеЭ=Y 0Lvqqi ŸКЦыјгзч“..ЎЄНƒcNяоНЃ?:cќ›МWsцЬol,”Гйl’Ус’\.—фёєШ€РZМЋьнЗO`aaеќјІšš™5w џіxЬЙз–ћнЕkЗЃ‡—Зл‚Џ—|МСжжvoxxИиЫлG,šŠйlЖииXЈ …Є‘‘1iddD …BR(4!ѕєє…&Іb/qxxИижжvЏOџ ГчЬ[eggяЖaгfЗдŒ^kнЏŽ;MсёxЪ? БgЏо;[/р} 4dI\мљ•ююYЁЁ!ŸnмИёJk ёrzV?ЙTЬ.­Њ‡Jб;++АyF hєЫAўохo•зБїdєБ 'OэНyуЗБяЌ˜<yы›епM?>-ёšм€РрѕІff…~~ўWŽ9J•JЇ                                ј{ќ?DЈ+l!yп’����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/images/icons/os_openbsd.png��������������������������������������������������������������0000664�0001750�0001750�00000043105�10443061320�017324� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ���bKGD�џ�џ�џ НЇ“��� pHYs�� �� �šœ���tIMEж ‡nb�� �IDATxкьwxTхђЧ?чьfг{я B Н#Н вUPЌ(‚Х†EЄ*HяНCшB Н$„в )›œs~œГ›н$XЙП{Н—yžѓьющћЮМѓЮ|gоyс= є€аz@ш= є€аz@ш§OюAќ.НиIџN|РппЅa@џџж?ЇРппЅЦ@љыŸ{ ~›|�Ря�ќgS№мŸ8пU;пцwЮ t€џƒО№ŸMн2 §<П9 �3чМ~ЁўŽ ё@ќgг^ ˜ћ'эšnпƒ€Ж•Žз №q№в6yН,~<ш‡џ^šЃѕъЗяqмжт{M@1иˆ Љэѓ*uŠuК†*N6 PпbџHр[‹п75CБёŸtСэh€ћGЋ� 6Кq€w5Чїкїd $<Ш л!Kkvкo; sНšљ9<dqЏGэ{# Tchэ?ёО›€/РŸЇ7€;РУ•іGwъеtїІ�BЅуy@oэ{ бЈŽРгЦр рMэћЫ€kыЦ~DEz зі‡-юлNЇАГе §7;TГ[N=€?OvZŸˆ5’iЂ§Мpq2Œ@p,щ"№МХя+Е#<а,|“ёX� О&жwЃiКЗ Fг O“*=З[€ЗЦ2РЭbg`ё=ўУ‹š€юz �žіˆЂ€‹“Ёi5Lоsќl:яn 0W3ЮLtшєб~лјz;ЅjqР@ B;6жЫнЮсЛ; ЗбгЋS8w XbёЬ6šPtŠєD–*с4MS™5-sH{ �žNЫВrБe#_€ї+ЉйS9yЅDеѕц­›;Š‚А 8Ђi‹кџ§XД(*.чЩѕ�zљ;ЏmщUџ‘n|§AGNlx‚ќt: =?}йЭѓћёж Mше!” ?Їо‚Р!Р)"ФеєќH‹wЉU‘'�?lDG`эBcўЁ` XІ(Ll\зЛю™KПjЧnђХ9т{/ЗЂCы`ц§zЎЭБгЉmђ KБб‰8:М##<П–MYЙТ€ž5yъ!ЦНд‚сыЂ �( ъ‡ЂюSZ6ђЃE”ЏyпТ5—?ѕэšћ3}qšљ<Ўy–ЬџЮб^п#"Ш‰sзrї=€ПNліKžјн„NМўЩО)РV h ˆŽŽЖ:э[†аОeˆЊџ‹ЫАб‹идПмћЉ•ИКкрB‹F~Ф]ЩBащЬŒGcВ    щSQ’ hPл“�� Џб(mд„TgбОр;Q^ўtt#&/ˆ+гl’@P%Пј^ф |dёћš$+ЅwВKша2(Dг�Эьmшв> AЇCд‰ˆ:ЂN‡Г“vvˆ IJ-РХХQдбЏgmvH@EЋы ŠЫЭћэ>ІO‘]‡вЛюЊл№D~ўЂ+Эъ{›ў‹08 ТЫяПEѓњ^dчѓ5ЏФrшxі]�.ямуXŽц†НЁ§Ю6Џм|…оl‡( Н“vЖњ€я?эŽŸГ™Y‚NDдыДMЈгc,‡ЌьbдѕEды: ™9Х‰MQЏuЂШЬ…ЇЭ!шDUДэьхL2sŠyb@]lmU/вгУ^Ти4Џ/Ћgєb`ї:oћWэѕ­Ппšƒыž]ZљПEjHfЫџѕ!рW Q€Љ•Ž•cѕРY дйp5>{АƒНН"9“ЬŽeУqз�YV(--Чоо4hрvZ!юnvдѕ�QРЫг‘С}ъАlнEj†€zн–=7ј№MеCEЈ~X|–q/ЕФгн’вrьэєшѕ"Ђ(ЂэšаЖЉВ$STT†AdЯбdв2ŠаpG +0 иЈyУ5уАшQ|,ОМœЛ(дДб&‹{ыо|ў^gю9}>DADтR‰буЗЉ*]ые‚(r8&™С}ыacа#ŠЊJћ•vь>˜@YЙŒ ˆмLЮчђѕ,ю–HЊ_Н~я‘DdYaє3MAЇУжЮ7;ŠŠеsEQЌИFЏУбб€ЈqpАсы…q †˜Џ€DрuрU 7№ў_ };Јi€ЩX‡k‹QЃwNР,/ЧњѕЌЭЎш›ИђХ‡н7qY9%Њкu8;лs6…-{Ў›Ч~A's6•7^jSБOЈUУ“ёo<DrZ!‚NфєљtьэєФ]ЮЈP§:9FЮ]ЮфЇoћЂз[иЂ@ў]c…Э Š‚Шхј\ѓвЎY�Л~ъУг§kckаhџk­†'LNђџœzіŸ†”hЦP!№žжC,ƒ0ё�~оŽЌ§щQойŠ‹W3(+WxњёЦДkЬИOw!ˆ"ˆЂNGЃњ~|ќХ>$IAQф‘­ pе~ f|К95kx"ˆ"Бqi ш]‡ѓš�ˆ:•ЁžŽМ§r[lэlT[APЏuv2PVЎXй 'тюАeџ-Гс(Š">^Ž|ўf жЭшA§šюhНjАj& џ/@K с=Ž%�cє:‘ЎэУz ч€KР`nЭpЖ-Nу†ў4 ФЮVЯФDШO3’_hфЋ‡5u-аМI I)yќДьДЦ:‘>VŒЗдъp!{.•G4ршЉdѕ\бІћ"ЈзˆZowuБ%)ЕРмћяKМ3х Н:†[=Ч4<4ЈэСКщнёёА pЊšЯАЙршЗШхŸ(�aк8~NћtЋцœљх’|КAo6§ђИиЃc:mšѕxџЭ‡є‡6=O­Е—lѕ4iшOBЂЊfээmXНpЅeѓЧ‚(вКE-šБzуђ V=дМ "ˆ""ХF‰›I9tjNьЙTTbщ ˜4CNыЧзКЊкGyэ“НdцгАЎ7ЂхГ4!Pxч›И8йаЊЁ7ЈЈlэџз–jтНмт•кp)ўг@tэšљгЙMp_дˆXѓjЮ›Гpх9Z6 bЭOБkеSМџцC8;лZ1/<дЂ’rI"ƒžOЦwхЙсЭD‘&ЩШМЫCѓхДƒе €ЮњћЉГ)дЊс‰ЁюœН˜fюљ•ЏuЊpњЛтяч‚ Š,\}ž§Giх‡^;Og„‚тrFNˆ&сvП|й…CЇгбыХHЭкЌy:ž•А 4BCkƒќO€x я‘иTcЛцLџЄK wWЛƒZ@ЦRхХфх—rљF–Й—Z7О:~+�BХXŽіi0шW;ьэmіh#жoЙШхk‚`ЕЉЗЈј}јx"кз@а‰ ь[Ÿ-ЛЎЉ*птЙfСL†:,œН”СФяѓТАЦ4iрgЁeŽƒ1ЉєxvоіЌ™й‹œ|#i™Х,џК‹рцlІЋжhŸ™Z[xhžЯE`>рЋЪѓџЉ6Р1EсбЯg+MЯ,bџЊavZЅnLY5mм\эеЦеоќ)Ј?~l'њіЊ[бШ–›жјОоЮикй0~lgFYЄ Њ{Qд„GДbдЙ iМ№t A`шFDЙЉž'Јъ]V4Ё*оGDJJ%FНГ•ЯЦuDRдё6k—”;EМєўnfўr–wцыїТбС@єЉ4šжѓЂe”пОлQ�. ІЈ GMtIfе vŽАб‹�г€ёџjјѕ_MW€„ƒ'’*Š ЬљЊ7ŽŽ† Ѓ1Щ#%I ѕLsЛЧ5д 'Е!_{w -šсфl‚€›Ћ=ЖZo71Нb<@и}ƒОНъв8*€M[/q->‹ŽеPѕ ЈŠG;ЗЈИŒл)љєъ‰�икъqtАСнЭ^~…ЫNcooƒЗ—Ѓ . Њ&zуƒэдŽ№dм+m™Зф4{зСЫУШШ*ЂЧCaŒxЌAўNjЌAјaё9Z5ђЁMc?j:cc#r86НГ  ^ѓК6o>ЩЅ›љЄfoFЭkPўЩH` &сKП9KN­�S?юNїNтьhxюR:с”%tfљњ8б}аBЖЌ|†р@WЕjjМтSC§,w‹:ШЏ??СЋcз“–^ˆПŸ3�ЏмЁЌLЂQCQ`д ­ЭЯCQ2 ЪD€е/аЊyА&h (0mі1м\эљќНЮˆ$ЇцЋЎІN jж№@‘dY6›їJЙФЅјF<ZQ‘…—‡е#ШЧ‹зspsвгЎБСоіМјљ Ю]Ы†hСІДhЇљјK4OрГЙKN3іу]4ЌыЧОѕЯ2}ђУќјѓIъД™С—г‘žY„ ŠŒyЅ=w‹ŒДя9‡И‹щŒ2k�M5 уКЛ›:ЭgwtАхчйряЊк‚Ш™s)Ь_tApp0рьlgq‹ћ‹"ё7Г‰>’€ŸЏГй6Щ+0вЛ[mΘа^}NRJ>Ў.v*V ЋАaАnЪe…ŒЌ"šдїБђHњu хчЃxapm"У\™Ењ:'.dЩР3@щ?№г,дWЉ>ѓѕ†fљ7Ю­ЌПžцѓяЂu"OmТ™шW˜ѓ]nмЪЁпАХŒ›Аg;цODFж]КXРК-Э†™Y4ЦšT{D„':]56‚ЖХžMaЫŽЫšVж˜eЂJ‚№ХwЈYУS;WЕммьЉщk6ьlѕцk­МmhЂ‰а@м\э,<Œ (;џn9Й…х,йš�jЪћљџЯьп!OЭJ}\SYщеФПѓ5pgPp�8{›жЭƒЉюNЇЃvM/њѕЎЫШg[вГkmеѕ ї$;Л?ц/:ANN1m[…acЃ3щ+mаМiА6оWн$YfђдНДo†ПŸ ўЎц`’* ˜Н„{ЎqтTˆТX&юYи˜GѕљKWуХсЭ@Р,,І!ФDЙљ%\ОžMŸЮсf4\�Д”mИЮ”чHЩ(x H§Ї З€РnЙЋPГv‡™­Q"pм*ьW.ѓєЫkHИ•[б+„ЪъОјЌ7ЙyХмљ2YйE4iї=у?оЪw?4їо‰_ьцdl’•ЏМEN Рп…g‡З`бв˜*ТЃ ‚Ш–—™ђЭ^fOL›VЁ,^qкBуfWдф-дєэЗЙ盇ѕ/^~ЊБ•†@4М@р‰О5ILНk ‡'ЃNHщ Й„?�!џЩ6@.jъіO�§Кз|Јuг€_EQHhТqшфш`CP€ aиtdчѓєЫЋ)—sяГч;;о{Ћ Ћжcжwƒ8ВїUКwЉMчŽ5Эч–%ž{iХХeї|ЩХЫNбЏO}Z4 сиЩD’nчY“ГњіЊЧўmЃqwГЇQCRRѓЋМ“ЅЬќВЏY§oйs[Щy–P+ zеѓ1 љ•„\.Ччšячтd`PЗ0�wM‹fhm7XІu ПEТџƒС'�_9илМНjv|}œйО?žгчяPRZNгЈ�žВ О>ЮЂРэДB–­=Ч'_ьaцд~ŒxЊ…UC›zЈщеv)‹ч ХжV_С8žМ№8лv^&0Р•iS˜|lыѓыДlŒ“Ѓ-.Ѕ{:™сУšYФ(‹ЏŠц|)цяІќ@,RХPYEцdьmоњh{з>Ѓ#ЃHŠ,#k^A™Бœ™ cй~р&ЋgіТ % Y’Иp5‹оЃv˜^с‚–Гї~Йџ_8РЎВrйyуЎыmєŠdPŸz ш]‡ЧњзчЁ6Ё8:кЊЊ ръjOЛжa8:иВsяu† ilбГАPЫšš._НC§zўуБz<1)wzѕЈУ{Ж“SLЃ†Va0O 6j3јx;бЈa€4ю–h!Bе1ПšоTRRЦѓѓњ{[ystš6єЗАLrЅp+9ŸсolaйЦЫ ыIЧVAЊ   ’—ЛЛмцNv‰ЩиіOО]xзјггol"#ЛЈАБP›–=}ЬЫэ˜ѓ§РŠуX0_Ќ№ё{їЊЫЎНзЌoњьNђэ<кЖ cюЬЧEYЎ€ЮЫ%Й \YˆЊБђДїЉЄ‘Д-19—‰_эЃu9\Й‘IЫf ю[ЯlT ˜;мЄћ+№ѓsЅKћ0ц.?OBRОЕч єэdъ#џ‰срšЫчМœ’Vpт“ЏЃЋСуЋТИ~~. ЭЬпОы Ц2 GQНж’qzHAЁъ6;9ёL+ ZVpfж]оx{]еёъ1+!�жlˆЋVlэlxИG$ЧїŒfк}ёєpФЭЭотО"АfлFпСœщƒYЕфiV-Nd-oFOиGYЙЂe6Љ.e—VІмњ§Рј\3b €f+7\ рЎбкr+5t•1Г&И‘ХCнgŸ… М>КН…†А€]qu­†тofsхZ.н{rNe�`,“yћƒЭќДјdM€�~О.Дh„Н ‡'вБ]ИХQЯлМыŸ|MєЮб а;[мН\Y§ЫpВѓL™Sgj‡ЛсыijкћЈљ„џјu.}-иЃГЕеушhАR§[v^aхњѓ”%sCYљb…pМђR;ТBмiзu&{ї_ЏЊЎMAs/'&кЇЊћ:ЯŠ_ž&њPМе~ЫЁЁВ((4ђоЧ[yёЙжДmЦн"cэezGРдЋ[m 2Vї:›ЪыяogхЯУЈ_?Р< :AСю,Ÿ3„ХыЏpрDŠљžЂ(№P3?є:[qjъXа?ЭˆA0yЄY”Пй35^гF|8i5Mх•Бы9tєІеёЪєѕ”GИ{зШШзV1vќF22 ЋєrџЏŽВВŠ№єtdфˆ6Vз(@пAѓЙz-ЃŠ6HLЪсѓ НˆЌхMpYYE B—uЬЫэёёv2П^A)OŽ^УШ'ЂhTпЯЪУ0QУ:^|8К)c&$ЏаhО_nийъX:Е+Ў.vuеїУˆџWx:дjЖšкЏ|ьгGћзwюмОF…є‹".Юv<>0Š+з3YВт4П,;ХЊѕq$&х I ўў. zŒЦrt:nЎіˆ‚@` ;дdТФэЌXs†Ч7V—п IVHИ™MГ&AU\У­;.YЫ‡1IДonuЬзЧ‚ рчы‚:гаЅTіB*{ŸMнЧљѓЗ™і~[] Г'ЃШ2хЅFJђѓ u‘йD|r!]кЂp'؝‡o3ѓ›ДэP‡•kЮI’’]HћOР–Q1+wj%нZцJ=рТІЅOв­c„9yCа&h9ѕГцeЪ7ћxnx Вs‹ˆ‰MцNF!ў.ИЛ90gцТB<(--ЇХCпГgыhМНQЊБў,­Z{–!ЃИp1ѕ§ЋэЅŠхМAV`Т4Œ@Хsє/#ЃкЭПeвш†єэ‚НЏВ-Звюr+9ŒŒюЄх!–—тa+“WЪєWй№cošдёф`L ЯŒпGќЩз ЈФєЂyѓнхЈљ•Їџ“`,№MH€ ъћ},‰М‚выРQ ФССІу­гcqrВ­ˆŒ™“+DѓИПiлeЦŒпШ†ЯбАП•!fЩфYsccЃуХчлќыЏ{•�hћRRѓёѓq4Aћ Ы(ŠТвUgxээ tjъCќэB’юSXT†‹‹ ЎЎЎшѕzE!((A8x№ �Q‘žlžѓ0q—3щ3jo>EЛіЕї1№Юч{й{2=h†šTњ‘№-œ˜’?-Пашїб˜іИКие\ЛѕJЭGoQ\\FЫsЉщCH^^ŽИЛк1x@”šSЇ CП‡ы0dј/œ:єІ*0еP‹f!Ь§щиПV�*›*vЂ!;Ѕ%e|ѕн~іьПЦž-#Э“JMз^И”NQI9[Ї0hа@–|№!uыжEЏзЃзыЋhЎЧ{Œэ[7шBмеlJЪ$ G/лГ§јЎ^Й‚^�5ЛњўтtѓxXXRZюЖѓ@BуRЃ$NŸд‹їЧt Gчš„‡КcgЇ'Паˆ^ЏУгг‘fБЕг[љЪu"}Ш/(!њP]:еЊже pХгг‘`їПѕТ%%х P-\\ЈN}љэ>КwЉ @‡v5*4€Іfu:ЇoТ’•g1тŒ :jS1nм8,X@­ZЕhа ѓцџЬъ™НЉьЬХы9ь<’ЮђхЫyѕеW)*.циё“Із9ђWmeFP–]ЎпЙ?ўч6џфћудО<вЋэZ‡VЋў ‹пБО;Ж šOY™Є…{­™"�э4c­ИИLX‰Оњv/FЃ„——#Ѓ^h[эЫnкzm;/бИa�/<зCЕB№умУшt"#ŸomuшƒwКЂhзЉA]Aѓ*P:ЕЏT.akа“——WхжsчЮeкДi�\Йr…;Tќџќеl:ЕєG’JJJhеЊNNNМћюЛІK'j‘СџX7pа,;ЗјіА—Vѓйзћ‘k нf­lшѕ"/<гŠИ Љї4№ЦМГžQЏ­bђWЛ‘ЄЊYвюnєъ^‡чŸiuЯ—tqЖeР# аЏ!:§Н›хв•tjŽ,+ек$ ыћYИƒжџOд‰дѓ &&цN�йХf3Уфн’ŸŸoV^ќБпв�ЈЅбZiqgрšз7YѕебЃкБгZ^€Є…}ѓeY ќbкARг љёлўшL™7•ьвrIF)ƒ­њzћ5$'Зјž*yм˜Ю|:y'ояQ­пџьS-˜њн>š7 ОчŸэйНNѕZІЋ+ў.Пm+Ucu‹–Хrљj’$ЭЭ›7 39r$ $$$0qтD$IхЉ:чA ФXСc777ШдЉSсoжЌNдkk1ќ$`НЏ‡н{kЛ?й Тѕ1/ћDQи:9тї4 І}ЅЃІ1ЅuЭБќ4яOмU ДQПЎлtžVfp+)Ч|и`асчыlўН{яUЮœН]aјЛђвˆ6lкZ}б яыњЛё{Ь7йПяZU„ЋM5kxтюfO­Otb9Еkзцс‡fљђхFьээљўћяйАaQQQФХХЉJOРоNбhdТ„ $$$X Я�дВs[и ЮPш:6ѕaмSupR‘L­аТ#KЖ&є™ПцjЇrIЬЋtЯ Ј‰žMP3Wž75C§HОњД'‹Wžeкь#ДmЪ€>ЊЕŸ~Ї‘Џ­!цєmЯJ­Е2kТЭl–­:ЭсЃ7Й™˜T.ѓЬ№Мћ–5C›6Ђ~=П?„ып_AЈp-‡/ЅBкЗЃ]ЋPYІЄЄŒ}б7˜ПјУ† #""‚3fаЛwяŠјљ.Еƒ4Јэ ‚Й!%%%ИЙЙБgЯѓЈЌг і?0jj•0д нvцАS‡@&П…Ј5œNЏUкаЉ•6.нЬчѕЩGЙ~+o№ж%OЌ<5д)O5їЌ}–Ж­B@љєЋ}Ќ\ЧщƒЏГчР F]GЇ‡"јўЫўјј8ЉVdvЯ^Щž§зшмЁ&_LьCУњўU,ђ?Kћ\чNF!iќзoR9Q‹фP T@HQ3 ( Š$ƒЂ&„œŒMfь„œ9ŸЮЌYГxщЅ—ШЯЯЃvэH\ŒDЏ‚"I$оЮЇее 0€еЋWгБcG| ‰4ЌщЪ— /RZ&џ€š„ћ—мРЏˆГ№КrЋ Vi™L =чЎхqј\&‰iEј8bggРЯЫ‘С=#Иr3Џi|Rў�Э6ИSЭ3R€QZїyoUЭŠ;DаЌq ..vшmtЛq'ЃНЎуфd F˜'žxЌ)ЏПќі6|?3šввrš4њ{q7W;6№G_Щи[З1ŽЂЂВ*c|qqЏНЕ–>НъџqйS*}Здˆa Џ3У7 ЬXЮ„‰ѓшаЁ“&MцШ‘#L}ПЕУмPgG=+6_'=#cЧŽqѕќ!цм†F5нШЮ+хмЕмfЈХВRю( ЮUЙ~ WžяWƒF‘ћ;Ё7шѕztZѕ‹rоњђkЖпШG­Л[Аnљx9њп<=VK›ЖpЭё�еЬЮ)цч%1М§fЇ*ўЖ,+М5~#]:ет‘>ѕяЛ:OMЫЧЫгБŠ- ( 9ЙХцbP&&ц”p№pїЌSEфхутl[VL№А–†Ќ Ыjšи‹oofло$ђ hXЧ‹‹ЁdIB‘dІЬŽaЦ53|ќѓ 1 rЙDJz=_пБLоЅх_м hрWj”›?г'ŒZЁЮцЙ№–гѕzН;…““Wj{цbЦуšamб^ rcф3Э+^9™Rльэ Дkf•†e–эб5//Їъ§єjž2-3їїЛЎГ“mЕ^„њ^Uё… ŸoЇKЇZxyV ЯOџё0о^Žxz8TДDЅt&ŒР4МЯЃ�� �IDAT„4ЊыЭЬŸЃжЮщЗ‡НYhf/;ЯЗ?ŸХЮNШў“iœˆЫЂfАсŽЄfs1!П†fЄп/$pOi™м|эОфšgЏх’™[JьЅlŽŸЯффљ <мь№rЗGд‰tkJq‰LL\ZGддЅ+Је=f ‚рцэщ  @Уe&}Гzu|еќ�Ы№o5`њќЃЬјъЛ}ДnŠ^wџ!ю]jWЫ|�Y– vSч^ X€Ђръd`чxj…Л3zx#ГЖјiѕ%6FЧГkSІ|к’wЧ6ІoЏ.Чч3yvkЛг6Ъ‹;Eэ€›яT ,—”ѓ7’ щп9˜зцхЁuyѕ‰њд uЕъ%ŸŒiУЗuЦ`а EУО78а%є‹ЛV$thp;5ŸO.&3ЋoЏП—рR^^=$}шВЄ ЛGxјDL"џ*jп&\э§Іtљ›ЦпИО/ЩЉцпзnцђуВsЌ^вК‘nилщАЗгбКЅ/Ыuхх‘ѕ™Ир5hQпдњAїK�ЬBœ^”џЪ”jЦŽbm§ZвгƒыspЭ,žў›?Юй=/бЛKM\Д`Nn~ _M;HЇ>ѓшжЉ&пбї7ёљ˜ипЎ™”~Ї€>йZэБж-У teћЎЫUŽ}?3šЫWюT{]Rrю§Ž\NgмGлИp)НЊFЈиA Ÿ)i…šQ;щ гІЖ%4ФЉZCmьkQмL)$ЗРШРNA&зў™ћ _^:u1‹Љ Я›ЬZэ••*ъ­V˜;}ЛефЁ–Aшѕa!nДoТЋуЗйrпџxg[._Эр“)Л‰OШЊжЭкЖѓ2б‡уяљR’$3єщХ4j &‰V"ƒAЧsOЕЄoяzVћo%цp2&‘NjV{Я?п~ЯgeЦ?МjЭUпOпыЦѓБkџu‹УЬWHN-Рпз ˜О№4ѕЃ\и/Ьъ–[wTt o/;S:šљ еpП�`№Ы/opцrvѕ>БЩЖјC& oТиŽМўB+Ю|…[qoНm$Я<б”ŒЬЛДю6‹љ‹NXнВЈИŒO'яЄ[чZїєСu:‘­ы_ФйЩ–™?ќУ$4Ф?шЩъugЋepї.ї^јуЕЗжV+ еiCЋћ–IќДDИ8йVu5Кq+‡Цѕ}XНх*›\gњзжСЋнћRиw =u:[;ƒˆ‹Ѓ "\šRБ:Ъ_rяEŽ@œЛ‹!ќйЕ1иъqr40ИW-<=,ЪГšŠ*ЊЎЂ TдсЭSЄ+ц§ХžKХгг‘АPwѓЬм_[б(Бhоаъ“>Ч!Wх_‚ў-Xxœ!ЃpuБГzVuйAŠ"›gн-,!7Џ?'’5ЗP–ЭuJŠдjї#юЎЖ”+Gіє'8ШЩ|лйѓ/Вj]<›VїТбAqŸu€3'яАtЂš1eсEoН ъ‚X{юw8ј.№FNОqЃ›‹-э›ћЃзЋq}O5%Ы<UЊЂ1,ЁQСМSƒq`™@ї§ЌƒФФ&БћшПФаљ ъAЗЮЕяЛ�ŒxЖUЕ( ЕжWЊ€@і68илЈЬ60 ‹6ЄžЙN^A)~ўіl^к“р 'ђѓlл™ФьŸ.!"АqeO3ѓOЮdщЪы|№\Х`Жъ§ј+Об&`УЇГb9t*„ф|М=ьЌ@ЫF0ѕŽrIVCЕк)‰ЩЙjдЯмs4ц-:ЮŠ5gиЙёEЋ^V™^Г†ввъWt}фсњtzЈ&љљ%œ‹Kсшё›>šРцm9vтЗsЬЯ•$™ЛЏ0{о‘? [љ§ГZ …Pнд=EQ,l& бšnецK�$'ђи№н„з[†Oјb†>Л‡§б)8:щ1TЯ§рс4z7сўŽ&уOЭф+-zлы~j�Н'ЫJЯмќRЛЉѓњ,ќ[,&QšўщМХЇxЄWB‚Thѓ™бЋYГxИ”hѕrцaёŠгьXџ..v=q‹›‰9”––у`o Cћќ]8zќ..vъ„аjШЧл™ЯІьdЪдншu"]:дР`аsщъЎЧgQV&ЁEl :ŒF o7Ыцљ с�…CG u7W ЏvlWЊjѓDSэP^~ +6ЈаЖu0аW[ŒF‰K—39u:•й bq№^€‹“М#ВЌ№цАHєКj5Ѓъђxs€їЪјЋp X0wехWž‰ŸЗ“й2+w ш4м{аУu(—дF;z<‰‚B#nvц6™ўу!І|ЛŸ•‹ždкЌC,YKњB"kySЏŽ/„†ИуюnЯмŸŽ2{њŠ™–•:шЫoЌfіќ#ДiТЏѓ‡фІжDсna)WЎЄ“x+‹Мьмь"}ѕx;ќЅопДq ОУЌ­Ќ4J•Р‘ЗИ[XJз5PPЬъџЧ_N‘ЏMc“$…v­ƒ,žсЧ“CаЈЁ/пЬ8ЮŽ Уˆ‰MeШ“kЊ A9љFЕћПйŒ5ћosќLZˆцЌЙF %W_|ДЎн'oД4/Ь`6E5z(hеИXCzf“>шЦ g—ѓФF<>( Aљі‡CМџйN<мэщиОЭ›бЎM8M›с`oc… Ž|u=КFвМi0AAЎишuVBАtљ)†?П”№PwNю7'scфђrЄR#ЦТ"JѓѓЙ›•MJRЧSt<ѓ|{мньЭCVvўОЮф”j‘wX95\–eDAЈˆ* GпЂuѓ`3œ‹Ќp31/w{ьmufC0%-Ÿц=чгГc8Йy%<‘Ь[cpqБN„-,4ђщфƒLЌ†Т_|e+ёчS˜љNХtізІž"њt ‡^ФЮнž/сд™лGЉК*ъпв�h #?џКљкшО]ТИxC-l№ќа(­з[/ЕЂз‰dfёѓЏБийъyЌ}ГнряыЬКЅУiп&WW{-5МjЖаw3Ђй}ƒ Yјњ8“]ФЋЃк›CВЌ0qЪ.р›I}TцkТh–xEНEVалlmйz8ЩsbщлЇ!w2 ЬруэЬ”Љ{(—dо{ЋЫoSyВЂP^&БaЫъжі2ƒ`ŠЂфjf<(ШŠТИЯvѓHїšЬœиkёYДюП”#Ч’щеУ:чЦЩЩ€“S ўдАєюGIЉ„­ŽrIсh\&ѕ#Нё ёУрфФ‚йCiжюЛ6’$їзr5ю›��ќxЗИ|є{_cЮЄЮд W'kий4o ТкЊчУ‡_юgѕІ‹lY6мj<6Є‚ ›_ŠЌ(Z‚RQˆISѕЏМд–1ЏuЈšрЁ?p№WЎнсЩ!*ŠGV†ЕЄЈгQ\&3сыCЄf—rђШлVYG&OsЪgs№p<™@еN Б0ўЎ\Э`ь{›еІЇз‹є1‡€+\DuћumБчR9Иn8( 5CнhнФŸшУ‰U� OЏ №ЊA=oŒх2q7ђhQЯƒЋ‰•HДm„ожQЏЃQT ЯoС‚EЧ—�§Q‹KxjМOџЛ’ѓР‘ДЌbќ<эYДцGOЅTЉ˜q+)—У'’(--ЇsЛ0žЕšЮ§цшЩDЋњмЏФœJ˜ecнШ66:neГzнЙЊю—ЂАјз|Мљђуюїœ0jї’nчбОї<‚Т}YЕєй*Ь7нгоЮ†]#—љ–ћыдђцƒЗЛАgџ5“r­pХТHŽ9“ТјЯїА№ћGpsБ5ŸзЇK8;ї$TћюЭ›њ[KВЌPpWr V…ЖЛЖ R5ŒіЬ‰zсхщрьдЂМЇЕмПЌ� ВsKш?j+mšјвБU uЉEсБQыјь[Љ3Њ5Ђ_І_ЯHFМОN з* П,‹Uыяљ8Y0зкRиК§’9_аRвв XЙі п|дwW;еМКЧŒžМќzіŸЧгOЖ`ќл]EмЪIЇdJj*лЙѓЉVЎŸЂ(ДmТВCqvЖЕТELжвэ\†ZЫˆaiхg%P]лsц\Зѓ~ГёSR ‘e…`_uхвUЛ“№ѓДЧ •P’—O^vkзсьщD–ЮxO7[цkBp_вТЗ�хОŽд uЕJBQ(((%>1-@qtеЦ‹ийщyуЅж\8ќ*ЖЖ:ВГ‹џщар@зJшZ#KKژђѕК[РУŠЂp+1‡ЮНg1 KН F.—(3–“–šgХШ”д<nмШфЭwжSЏЎ/яŒэТСУё\И”Ц'“vXЛВПСќ[‰9,] ŠТ'“wВgп5Ќцjїi@л–!џCжPС"#C_ZCŽсМџz[ГhА@gќМXќkмoЧъїпФСNGЭ`g–яL$-Ћ{[‘Н‡nВmѓЄœ,ŽОЪщузШЙ}‡‘#LЖ№QдrѓїebH:pцФЙ;ЭKJЪБЗYЛы:ƒzеFіIФh”тQЫТŠЫзŸoѓС˜jXQЧїOПк‹$Щ|ўawГсhrPг Eсыihж$ˆ† ќЭШрОзіьjњлёъЃЕ8›L›6vœ<•‚ож€ŸŸ ’Ќfќюйw 7W;vьКТЉ#cEДД|&NйЩКЯнфЉмѓƒƒмˆ>O||ч/Є1ѕѓ>ЄЌ“<Њі~…ьм"І|а•vЭЬ0АЅжxЈE ?Ь=ХЏЖФйЉjўCQqsФвЃ•?ЩwŠјaеU€œ„”ЛЮп§zEяНэC'‘‘SТлœЙ’ЃFrеzƒавњяW–ФОќB#cRјxк1ZFљj/3йY€EБЌ а˜<ѕ‡УцdЩНбёЬџ%†я'ї!РЯ™ƒGo2№ЩХ\П‘i5?‘ШьљGљёћAfFЭYp”^цQ'Шžуšq86z!ЬYx‚фФLъдpЃМдШЁУ7ˆЯ 3Ѓ€ЃWАpюPќ}AQhн2”БЏwФQK2ЩЩ-&3ы.iщlкzЁZЕ/ 0ыЛA\Л‘‰­­{}Ѕё]ЉЊХ,zx Џ3э[™л@Qdы”1EЁЌL"-Н1яT]_КЌLцх7Ж“Ÿ]ФKƒ"xу›X ŠЪГ€.Ј aЏЩШ)ЩžБьRйђэ eЧу2ЫJR2jš_{,ж,О_SУіу~ќѕ<г>|ˆ�Yfыў›:y[B]ЋдДхyѓ—Ф~:ъ™цјx91zм&КvŒ  А”6нgS#ЬƒЏ'і&"\ f)ВB^a ЃЧЌeёќЁјљ:“™u—5тHMЫЧжVOЛFо9—‰ƒ­ŽуЇncЏ‡””\œmvьИ@` ;ЯМИœИ‹i|јnw+Ѓ.8Шр 7ЋВБу7вІe(66bUМ_ћ. 0}jоў`“љ=Ћ”‹“fЬ=Ъk#ZY JE^ EIЙŠђr2{$БfЧ 5јДш ’$гЋ{Ц2‰у'SиАљ zYfжјцL\pЫ7ѓ‹P—Ѓ?ЃНх†5яWИ,Hzv`Є0ilkDНŽIє{qйy%•A7ріSF98;й2ыч“шѕ"і6ќ0ѕаАЂ^€   0єљ_‰ЌхM‹fСlи|I–дЏ!-šЃзыјaю~љ5†œьB РЧ:5=iXЧ‡…k.ЂзыHLЮууz№бјюеz–LўќЫнlпy™›GbogSХ(4ѓŠЂ•UhN--)cЯўыєъVЫЬиa/Ўр—ЁдыdYRAЕZGc’iеШWЋЈж|ќЕmмЩ*т­чЂ8z:х[opЗX{дtЂ‡@w цƒYч8{Чˆ:kу_aм§в�З’„ліŠЂ}т6Џ~Mv^‰|\YƒEЫжw0™і6l\њ$­šk+ЋХ"…&эdнІ „…ИcggУ”O{сыуR№й‡=јј§юœˆIbЯўk:’Р‰ѓЉlмsN гC,˜3”ЮZШяХю›5 Тж ЋЪќJE €ŠLaYІИиШСЃ7YПхпMz;ƒˆ­AGVж]М=4UЙїЫ’Ь+юdѓOёqЗC‘enЇrєt*{ѕ#дЯ‘ю­ќyчйdчak#`o#P\RЮkSOqјlІxьЏ2џ~j�w 32мMŒŠєdѕŽ( 2ъD…+ћ!ъŒV3W-x”онjW,ћЂљ№SgbёŠгŒ{НУmЌ.SЉf eБЪy?Ю;‚‡‡nŒБL"7З_g‹БTB’l жЙБХ%e”Zх*VЉjЁ Ь^*sПХŒyטџ]ІЯ=JлцAДkЌж(Tdфr E›ђкGЛЈсЮKУ"Kыv\gнŽ,˜дE’8z&Н аЈ–+RЙDvn Џ|Cьх#j1юѕ‡qїЫˆWrYЕ§ŠТmLЊЬќ0*­<ИozuŽЈ(Џ*WŒ‹ј{рU\ЬОt…+ЅX kБЇ“YГ>ЎJDВs‡Ю_HЃМ\bдыЋЩЯ/БBсfЮ>DП! Њ‚?Жz3ѓ-ѓњA!1)‡‹NTьЋФ|EVhг"˜†7х™Wжа Ž.пᘏ№нœу<žЈ&‰Ъ2cžoЪђMWд!AQШЭ+aдАzц{•—K,оtYVШЪ-хйOŽ{9'GГфзџ]Ц§]бp€ёЈынюB­оXƒ+‡'—ЁšŒZ<r\єбDRг Ь *Ыъd Pшж)Н^фЧЧШШ(Ќbd™,h‘у1‰Ц”–њьNмљTfЮ>ЬиW;PГ†Ї•€М6Њ=љЅdd’žžЯƒ7*TНЌ2ОМLтЅзWs№HŠЂАkя5юо5ZН‹%ѓAтNmУxИ[-ІL;HЬйTГWдЂ‘лїХгћЉUьŒОIX  ЭњВџx2Š,3М_mZдївкBЁqmwЮ]Ы%3Ї˜g?>Ъ•[љ –к?p?zюп€<д… ZhУ@ЭтЏ.Sудѕюš Ю>|}'ѓюWЦoC’$+WЩЄ dIцVR.~ОЮжn–‰IŠ‚бXNvЮ]sмAQтуГP…}б7puБЃA5Gu:ЕШф–э—xnдJ23яV‘Aъt?|;…KbXБц,’$›IБАш-чšzћг6тсЎ5йКGE–iг4€ЯоnЯТЏ{1їзГ Е‘ЎmƒXДњŠ,# PXTFyЙŒ"Kикд waШИƒ\M,HG­ŠКpдпІП["ІuH:П]ЄРјTЫSЛ^щXџ7sТ Дjh�Љ3kЯФЅrєdЯkbЅІ-K4‹IфVb.їЌCЉБœw'lEжѓCре‘m-‚Oж›Ї‡oМГ[[=“?щUХHTДgѕщY‡w?кЪсc7щпЛ.AЎж•СMAe™o<BыІA(ŠLЛцAj&”ЌшlžцhЏgpЏš\КžХГcШЪ-ЁsЫ�м] L[ЧGгcd…ШPgмœє,Qѓќ^в6д%vЏЃЮПјЗл�ПGYЈг˜Ћ›‰fgаёй7бь?tSMЄДЖьИLг(Г} TYd™лЗѓ q';ЛˆЇ_\С‹ЯЖфб E?ЖSѕœз6oGRRѓёt 4Ўb0љю:ц|?[IЙqЙЂ,М)СEaїxŠ‹цџ1vdKкЕЌ�~d™мМP>zЕ#­GZFГ—_�Yс­g№У­љі— t~a'oфЁ&‡дДюдЉїгžџ�ЕpDejhk#†Џв–ѕ<yђ•uФžK5 A™Бœ_VžЅeг@Е‘-њЬЙвг P…‹—вёђpрбЇ–№бИ.дŽ№23АBMЋcЊ•§ ЋЁчWFЖЅG—ZVз˜‡ЙЊ pсзyуыхЈBИŠЬЦmйИэr…€Ъ ЁnЊ ЫъФOMЕ+їZПѓхjŠohФчoЖdУž›$І Ы2ЕCœщй6€ЬмRІ.ОTr#Йдy–ІБl.jѕ–мвБ–4ВMoСеб†БзЁ А”Я­фшЩ$YfэцK$нЮЃCыPsKЫxcќf†ŽXNIIŠЂpђt2П,‹х…Ї›SПŽX lШ=њ…WVq#>ЋŠpМџVg\-< гѕŠЅ…Џ§юа6”№7ѓН[5 тгЉћˆ9}л, С.ФпЪ63ПКЭF/ВїpЂ*H’Ьг§k1ћуімJЮG‘eŒFЩцMFъѕЁ†Ё|cб~7ј›ыќ;РкЁБiй%|Зт2ŠB~vNёСЯЎdхЦ L™~ЈzОxЙЋГdЫЫ%^xc=лw_cлЪЇ p!?Џ˜ —яюЮcVєr •Œць[Ÿ7пнЈўжЖЗ?иlŽšЎ‘e™§у+yВ:eЬВ•eo{ж-ЪЛŸэтТЅ;(ŠLh зуГюЩ|E–iXлƒЅЏ kїA–щим6МеЪКЋь:– ъъkYР$д%c'оO&ќ; ЗГƒ—ГЃ ЯO>jŒ>sч Э­ьPT\6~ԘMвЕјlztЌЂЈeUFŽнШЮ}зYПx!.к’,I4nрЧї“ћ€Ќ№Ю„­•мФŠэсюЕЩЪ*тn‘EQ8)ЛЏтюfouРЖнWXЙюœ9ZWf,gагПЂHK͘Ж�_G~јЂ7#Цn$%%šЁn\М–yOцЫВLd˜+Бч3HJЩз am)IцєЅ,f,ЛbТД,+€—џ[`T€—=цЯ+,ыМGE™™/QзЦЁoїš”%^xs#ЫжЦёХ‡нЈюa^sЇ~Є–<ADQdЎнШ";ћЎfm+жЏ(ДiЌbŠТŒ9Gљx|Wlє‚ѕљ’Ь›Ѓк0qъ>ђ ŠAVˆЛ†­от<ЭЎT{ЅV˜у_mЫуЃжсчэРеыY(ЖŸ›WlХ|E’@–iзд {nšЕ€"ЫЄмЙЫЋ_œ ^˜+Џ ЎmBN}ўULјw @= ы•ФќјтRЉ3pЌКtГ№7Ђ"Нxwт.жmЛLd„'O lPсwЫ оіИ:лЊ ‘dœ Iв<ЫžЇoж(€§уЩЭ)тL\ zзБ „Rd|<шгН6ГцG–eЎ^ЯЄEу�ы)]&[A’Ы%њtЉAd оџт�љ…ЅкtЏ2^ћx/†Ў"ц\ZХ‚QВLя‡‚XН#Љ\B‘$ ŒštœєЌžъЮЃC‰tђ@]%ќ_ТЋзтб 5l -ї^њьѕчkи&ц\*пЯ;)bЃњО<вЃV5хм*pњCЧЙ{ЗŒЖ-‚Э№­ Р‚%ЇˆsЧЩб†KN!•ЫD„yаКyPE]_й:<[ЇІЏПЗ•ŸlЪСЃЗ pЁQ=‹…H’„,ЩДjьЧћ_$7П”="psЖЁЗpš5№ц§Џ’SBГzž +„81{хeъ„ЙрцlУˆOpіЊšюЖ'&›i…єmФб ™‘’ЌЃ~PўщPЕ(еЈ…ЉЊ5EQXиЅ]ˆУф™ЧR…Ж@QBbnЫ5[.щš6є%аЯYsб­gнь=˜РŒBжBВ�Лм`йК8†‰ТУЭŽёw‘p+‡ЧufњМcдЊс‰“ƒСeTœ œ8}НN юR:­š’•S„‹“ zQ0уŠ"Г|УE­Œc@šјxкГjЫUZDљЊirВŒЗЛ-wсЏrьЬ:Ж№У Ш-(eїБmМСЙЋЙщZ�э#E!%!ѕЎчсИ ?'{JŒR-ьОх~ СПcжPЌп aі №qєњaбщRYVзв˜окоLЪKь3|?-;"Kц+Kj<=%-Ÿф”|ГкЯЫ+fд[›˜0Жƒъ+рхс€ž@?'šEљ3mЮQЭиЋАю‹‹ЄЄцёXПzЌпv™7sps1p"6™чЧlVеЖ\aИegcc#ЂШ2CzеЄ~-OЮ]Ю0—%g=o?ХіCI }k/Y9E<к=„1i\ŒЯЛƒК*ш"дlыI@уrI Я)0NбьЃ€Oўщ6Рvдš„ПE#’г ЩЩ+y8dБ?hc,“ЎН9aЯНЙ‰Дє|m\•(/—8s›лЉљf˜:ѓ-›RПЖ—Ц\‰№`7їЉ‹"ЫtnЪšЭЩШ,д2TЕ>ыЇ“МѕЩNКЖ хдйT._ЫФХᆆ5ТХЩРЄщ‡ЭIŠ,s;­�;ƒY’@‘™єVkЮ_ЭR <ЭT$™žmqАзsўz;€БДœmќMYUWЋi‹›РћўПјўпрќ>аuцбOеOбIЌнz…fН~bќфНœЛЮЯПž&%Н€ТЛFY"§NsЧ2юхжЁТШЇš2АwЄШ4mшЧќЅБЄЋd'boуюj‡A/аЈž7I)љ8ищP$‰1#š1язГ;uлЌЪЕПI Z6єІCsЕї›ЫТIишЁN˜šљ|#Й€g&Ё‡@tЂ0X‹ЂўVрэiдеXŽџ7 @9ъ2s/о#ЊP8т‘Ц=YЉLтЧEБtКŒїПиЈЅaIfо’XкЕЂ~-OфrеR—ЅrКЖСЫЭжМЏQ=~ZvciŠ$#IБqi4ˆєNБ ��КIDATB–$:ЖR‹LgfЉюeЭЦlЮј/Ђ)3–™cљŠ–ъeв$Я Ќmюљ’$SVVЮвЭзЙx#MЭKЩ(>іэв+tiсЋгмпп"ЕRЫЕџf(І Ў7t/ЊсюlKџіA4Ћу PTRZўEЉQJ№ёАЇДДŒEЋтxх™ІjЏ6m’Љ"GХОСЎЄІВ;:Y’ИsЇ€д;…4Ќэ‰"IДnь‡—‡=С~Ž*se™ч†д#+Ї˜ ЛЎ#Ы2.в2юZŒљЯ*МkdСšЫt}a;Э<]Tb”&Ё.ѓВшuхVўХЌ<#vКЈгЗўпш?Q�ў9иъXs ‘ƒgяiA’їP+˜џшТЮ§ёЄgмхIћјђ‡c\О–Љi€Šjкмœе”№Е[Џ H—ЎfbЃ‰ wC‘eТƒ\˜ўq'є"c%lt0АgГ–Ф!—KИЛи’–Qd~†"ЩЄg1cщ:=З…Ячœ%1ѕю-€ѓЁEp,{9;/дЯёџк;ЛиЈŠ(Žџю~tћImЛкn- ZЕг&)"š>(&М`jBbдЃј„IЃ$ЫHд>iBаПАа RJ ŠХкB+kйЖvЗРЖнюнёсЮТvЙ‹в&жЪќ’ћr'“Эо9sюЬЙџ9 щvюПѕmѓtќ—ЁСОЯ{^с†њ(L9яJgџн�Чz.ј'окsЊfзоS9ЫKѓйT[ЪЦš%TЌ(Мž46Ђ­пјpxŠѓ}ЃИŠrШЮДгuЌСњ*—\рнWояdЯG?бѕЫwч9шИ‚wd‚g‡8дюсјї^"SБxц.€&щњ“љ и6ф }Ж ЫюК61ѕŽ\ё+0›ќ€ѓ`Ч САоЪЭКCЗнІёmЧ%€2ж`‚gz.њ?шЙшзššЯ—›NUEUХє{ŒДяJˆŸЯа70Ц}ю<У'JП’4џйђ@ШozyЊЎ”a_‡Ж~ILŠE5`лІ2j+в№F'R‘*нWcШЋr›7Ј<@jJ€ŒГ=ў(№‚IPФ}ДгCdJџUnу Ыfр9 -"cWCДДѕгв6§nч™Ы z„Т:ірЬK'с  GёxЧФ7ЂOо<мюсХ­хВ:ЙhФЈ”ВAгД-ХЮ ы2WЙ|WУюПљoяЪKq ъх ПЂ=hБhиiвЖkёЂ,ёўŽЕт‘ХeA‡d�цe`јЩKХЪхCцж!{3“]іЪШ]ьу7kDў‡`КBgХЂљw6Ќѕе.ДЋс›=ЏcЄЋ[˜Ђ}Rю$ЬrФmqfŠŽ}uтБЊтј@&V’j^]ю…CжАˆ=ўp‰ј№ЕЕЂqћ*a5 ьљ„~Чънтђ|!ЗЏ‰ЌБYЕё†ЭK0фќ—ц|мdШї~Њ”шer‹eUыђњ‚DuСщn@[RPЅkшЯIЎGb Џs@kzš•ђ%ЙTо[€ІczвЅOŽžіВИ( ŒЬ\г~3Њ‹Эћ L8ь–,`НšУГУЄЭАoи§Re|іoHjдjе„Іq!щўгЋ8вДN4n_eцЪ‹ше%B•ЕвД(0ћ@Qd†}#Р№БЎa€Йљ№JЗЎ „`2щўзСА>zђм(}Р(›—ž>й{)`цтДa$ЩЈУ(јЌ˜#: rCVmц]ќ)˜ЛkжŠВтьф…оu/‘fЗФ0>омŠgeЄS1W€qК&UДэ=щв“ЙЧnГшi6‹РјЄmF5Љы)&’­†an  u†};ЬџЫУАм0šАТП]>• ЙI5ц/щЬМоюjnЃ"з|Рz@”д:ƒт=ьЈˆžBЁP( …BЁP( …BЁ˜Wќ7Н^џ $ŸЭ����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/�����������������������������������������������������������������������������������0000775�0001750�0001750�00000000000�11363100537�013221� 5����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/func_about.icns��������������������������������������������������������������������0000664�0001750�0001750�00000013250�10411554704�016227� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��Јih32�� ˜˜�™››—Ї�”š˜ŸšЅ�™˜ЙЪ —Ѓ� —™–ŸСфџр™—Ё�—œ˜ЇСщ€џб™‘Ÿ�›š–žФѓ‚џС—™œ�?š›™ЅНу„џЛ——™˜‘˜�™œ› Пѓ†џірСЅ˜šU–�šœЦѓ‹џјтТ›™™•�™™ЕђŽџи­™›”�™™ЁсŽџјО˜œ•�š˜ЉчŽџјН›™”�”™žуџЬ™™•�™šЂз‚џўиу†џћП™š•�–™ йў€џќЈ›Жлѓ„џљЌšm•�qššд€џњІ™˜›Ѓп„џлš›–� ™žвџџьЁ™�Ÿ™Ÿбƒџ§Й™™„�”›˜—™››…�U››Ъџоš•€�ššЫƒџуœ™„�šЂЙ‚КЄœ†�–š›ТХ—U€�?›šм‚џњ­š„�šЎќџњЈ™‡�™œšŸ›‚�™šЈ№‚џв˜—ƒ�˜Ж‚џыЁš‰�š›šƒ�”–Х‚џіЄ›ƒ�™К‚џпš™Š�™U„�šАўџўАœƒ�™К‚џй™–“�›Ёя‚џ͘ƒ�˜К‚џо™“�™˜ж‚џЦ—ƒ�™ЕўџьЁ›“�U—Ш‚џЬ–ƒ�𭧁џћЈš”�™О‚џЯ–ƒ�›Єѕ‚џȘ”�˜О‚џЯ•ƒ�™п‚џЫ••„�˜Š�™Х‚џЮ•ƒ�—О‚џѓЉš_‚�™œš™ˆ�—г‚џЩ™„�šЃє‚џз™›‚�šЁІšš…� "!!K–ффИ™„�™œн‚џћД—š�™ЅшГ™›‚� #fЉЗЗИr-Ÿ„�™Жћ‚џіГ–›��šЋџѕЗ—œ_��$:РньљтннЮKh”…�ššиƒџяЎ—š•U™КџџљК˜œ��#5ГРРїџџr€РL†�™™ЎќƒџіЭІ•™•Ъ€џљР˜œ"Œ€ЂЮс•q€Ђ—†�Ÿ˜Х§„џяЦДІс‚џСœ6=‚‚ƒ”€‚{]%‡�›šи†џўћўƒџЬ"E€b�Г€џ=W(€��‡�›ЁЪўџ§0@Ћџџ‚��ˆ�m™™зŽџџџ�–šžРїŒџџџ‘�š™­нјŠџT �€џџ’�–šœЋеєў‡џЈ•џџ�Ž�Ÿ™—ЅДПь„џњв2$$wССРР$$’�—™—™рƒџуБ™‡"…9�•�˜Єѕ€џќзДŸ˜œ’ 2INNH. –� —БџџѓйА›™›‹� ˜� s—ФћаІ›šœUЃ�™›ААš›š‰Ѕ�œ›™Ÿ—�˜�3;:6Ї�196;?;Ѕ�/:48`u?6Ѓ� 873;mЏъЁ43Ё� 794IrГхїј…3-Ÿ� <92<xЫыэцшрg33�995GoЎхфкЮШтв_2477-˜�3<9?pХммгЬХПХллЩЅpF94;—�9:yТгжбЯЯЫХРШззкркЩІm567•�88_Пз€аЯЪХПТХФЧЫбжмг‘O5;”�97AЃлааЮЩФПКДЏЌЈВСЫЮжСd4:•�95M­ебЭЩУОКИДЌЄžЌНЦЮМc;93”�17=ІкЭЧТНКТЦРБЃ›“”­НТЦv5;•�38C“йЪРМЛТ‹˜ЛМБžŽŠ ЕЛЖ`6:•�<6?—аЧКНРL8[ŠЉЖЂŒ„™­ЖЉK9–�96иСООH859CŒИЉˆ~›ЈГ{8:–�,8<ŒбЬЋ@<�<6?zГЁƒ„›ЅЁT63„�1;46588†�78~е˜7+€� :8qА}ˆ˜Ѓ~:9„�9Bffd€cE:†�<:8qu4‚� 98ƒБ‘€Œ”ŽH<„� 8OАлчшюеJ7‡�3:8>;‚� 38HšЉ‡ˆd98ƒ� 9UЏУхћП<:‰�:;8ƒ� 14hЎ˜~€…|A:ƒ� 8X†ЋБзіІ66Š��3…� 8RЇŸ€€J<ƒ� 8X‰ЉВля˜54“� 9A—Їƒ€R8ƒ� 7YŒІАйшœ97“� 35|Ў‹€ƒY7ƒ� 9TЃЌгтЋ=9”�5lЏ‘~€„]7ƒ� 8MžЉЭкРG9”�4`­”}€…_7ƒ� :D‹œЄСвЬ\6”�6aЎ”}€…_7ƒ� :<yŸЖЫвs37„�5/Š�5jА~€…^8ƒ� 8[˜›ЇТЫІF8ƒ�<;:9ˆ� *4zЗŽƒ†[7„� 8B‹šœЖСХ{7:‚�:@E88…� ZXUWRELYnoO9„� 9;wœ–ЈЙТГQ58�8E˜S7:‚� W^dŸвнниœK2;>;„�$6R––˜ЋЗОЈP5;��9KкЫT4;€�_`…сюіќыюючx#31…�!:8s‘—ЎЖТ›K691�6[мјЧY5;��`‚лссћџџ’€сs†�39K˜–Ž™ЌДНЊpB471kрьіг`3:_fШ€вчхЃ€вЬ/ †�<8aš“Œ–ЇВМСŸnTA‚рйкѕкf7VŒ‚ТЗП€ТПБj ‡�:8rЂ’ŠŽ ЏИСХПЏЕкР™ЦєхtYЁ€В�д€џxЎ˜††~‡�:?f›–Š‹“ЋКУЪЬдЖ‘—Бшц[›Ђжџџ[‚†�‰�98o ™‹ˆ‰˜ЈЗТЩЇ‘•‘ЇтW’ШџџR‚†�‰�<:=ZŸ•Œ‰ˆŠŽ“˜”‘“”‘›K€……„„СџџKƒ�zŒ�97Gu’—Œ‹Š‹’Xi€ПџџE€�P�4::FjŠ——”‹Š‹ŒŽŽ‘sI…ЪџџU…�Ž�<:8AP[•ˆ†ˆŠŠŒ„e;aКЦФУУ`H’�7987s—†ŠŽ‰sL98-`…›�L•�:?…›˜—ˆjN>796!6oœЅЅ›f–� 7J•ˆjI;89.� ˜�8ZŒbB:99Є�3;II€:�'Ѕ�/;<9<—�ј�Ј�eИZІ�"Yœеж3Ѕ�jЅЖАЛЃЂ� Gy…x`TЊ… �H\WF>8/M™Œh.œ�9CF?<><;4XŽ“ЈЄ”o/š�7A>€? =;6I^eq„— ЌЃX™�+D€?=;951002Qx’›Ј&™�/A?><:86640-'+Ry‘ž‹(™�-C><:769<93-)#*`…–:™�%C=9769"(683+"!Oz„€ ™�&?;689� !/4-#Ho{l š�#C988€� "60!Oes7š�"?>/� 3-(O_Y›�B'„�2+.JX4‡�Š�…�3%!5B=†� dœЗЙЦ•”�)0"#-6†� 3VДц‡–�1)%!…� ".-”иf–� /,�…� #.7ЁЦU–�'/!€� …� $,8ŸЙS—�1#! …� $+6”Ў\—�2&!…�%*4ˆЂr–�1'!…�#*.p”‡–�1'!†�+)Z‰Ž&–�2&!†� )'?x†M•�6& "†�#)+cyu#…��ˆ� ЗЖДКЖЇI‡�*&Jly`„�:„� ЗЛЦуњџџљлЎzˆ� (',RisRƒ�Ј“‚�ЗЛнџ�ї€џЩ‰-ˆ�+#/ZhxD‚�Ацƒ �Лнƒџ�Ц€џХ…ˆ� ((#4Xgs\#� ВдхЃ��ЙЧ‚џяЦжџš|ˆ�*'!2RetxQ)�'Е­БфЉ�œх‚џяя‚џЯz‰�-'"&Eaq~„~bgБy'…хР)Зњ€џ�ї€џ�Цџїw‰�*(""/A[v†’˜Їg&\ЪЪН…џ�Ж‚џ�…‹�,)#!%9Vq†”O!'GРК…џ�Љ‚џ�„Œ�%,'$" '/7,%''3Ќњ„џ�›џіr�&+(%$"!!#%%&'"…н„џ�џЪp�"()'%$#$$%%&UВ„џ�•џŒo‘�("!"##$ Ь€џвЬЩЪВџџЙq•� (!#%%#�ŽЧ…џЙqg”�!*()"� ‡‹ŸбїџџіЪŒqg•�(+"…�‚€|‰…rpo—� $Љ�Ш�h8mk�� ���������������������������И/������������������������������������������$kнџџc���������������������������������������� œѓџџџџO��������������������������������������;Љъџџџџџћ6�����������������������������������@˜§џџџџџџџѕ����������������������������������3Фўџџџџџџџџџщ�������������������������������B—ѓџџџџџџџџџџџќл—W���������������������������#Уўџџџџџџџџџџџџџџџџџчk�������������������������›џџџџџџџџџџџџџџџџџџџџџУN������������������������?чџџџџџџџџџџџџџџџџџџџџџѓg �����������������������:уџџџџџџџџџџџџџџџџџџџџџџ­������������������������Bхџџџџџџџџџџџџџџџџџџџџџџ…�����������������������$аџџџџџџџџџџџџџџџџџџџџџџg������������������������Пџџџџџџџџџџџџџџџџџџџџџ№O������������������������МџџџџџџџџџџџџџџџџџџџџџЭ������������������������ ЌџџџџџџџŸџџџџџџџџџџџџv�������������������������МџџџџџџD�UИџџџџџџџџџџщ�������ЄКИИИИЙГM��������Аџџџџѕ���‘џџџџџџџџџџ]�������›џџџџџџџџВ���������‘џџџЯ���€џџџџџџџџџЛ������Ъџџџџџџџџ’����������œѕџЇ����� Хџџџџџџџџ§;������эџџџџџџџџe������������`ђ^������яџџџџџџџџ‹������ёџџџџџџџўF��������������������ЖџџџџџџџџЊ������№џџџџџџџњ1����������������������sџџџџџџџџЪ������ђџџџџџџџџI����������������������#іџџџџџџџн������фџџџџџџџџn����������������������Юџџџџџџџэ������Пџџџџџџџџ˜�����������������������Зџџџџџџџё������‹џџџџџџџџЪ����������������������Жџџџџџџџ№������Sџџџџџџџџј.������9 �������������Оџџџџџџџ№������оџџџџџџџџШ�����DќфX�����������щџџџџџџџц�������џџџџџџџџџi�����eџџ№Q��������`Пџџџџџџџџџе�������Kџџџџџџџџџќ^����yџџџџƒ����� ЯџџџџџџџџџџџБ�������зџџџџџџџџџє€ ��Ѕџџџџ§‘�� яџџџџџџџџџџє_��������`џџџџџџџџџџџР)Ыџџџџџџt��ЯџџџџџџџџџџџџЯ���������ЭџџџџџџџџџџџѕЦіџџџџџџћ“`џџџџџџџџџџџџџџ`���������UєџџџџџџџџџџџџџџџџџџџџџтџџџџџџџџџџџџџџП����������vџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ���������� Їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�����������Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������"žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ��������������‰№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџП���������������1вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`���������������� UЋўџџџџџџџџџџџџџџџџџџџџџџџџџџЯ��������������������@’уџџџџџџџџџџџёљџџџџџџџџџџя ����������������������‹џџџџџџџџџиj! ЯџџџџџџџџЯ �����������������������Вџџџџџџџа€����`ПџџџџП`������������������������ уџџџџџкb��������������������������������������#§џџџЋO ���������������������������������������� пюЗU����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/func_shutdown.icns�����������������������������������������������������������������0000664�0001750�0001750�00000014465�10572247241�017004� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��5ih32��%џ�œ�  ›� (D]tІЉЅЂu]B( ˜�/mВгщ№юььъщшчтг­e.”� +dЗпъэыцркждгвджкозЉ^)’� OАфэьчоЫОЕƒГ ДИСЬддŸ?� "€дыяцЮЙЏЊЋЌ„­ ЌЋ­ГЛЫЕ_!� !‘рюярЪЕЌЇІ‰ЇІІЌМПo!‹� –ояювКЙММГЂ Ÿ›žœœ…Ё  ЋЖg‰�jдщщЩЕЖ€ЗИВžЁЩпжЖš†œ›ЄЉF ˆ�[ЬчшУЎ‚ВГЃ—с€џњЋ’†–•Œ0‡� :КкъПЊ­Ў­œŒІ§џиސ†‘˜x$†�yгхЧІ‚ЈЊ™Š‡Іўџр‹Š‡‹Œ‘?…�CРужЂЂЃЅ˜…†Ђўџн……ˆ†Œdƒ�|втЖ €ŸЁ˜‚€|ўџм€€ˆ‚3 €� "žзФ—‚š›‚y{{v™ўџкzz‰{‚S��>Мб“•€–—‡t€up”§џфxs‰uy_ jЬУŠˆ‰ˆrn€oj§џчsm‰oqf#€ŒаЌupk€jhhjd‹§џцnh€jigfi‚jkh* $ŸР~^cdd`_e_a€d_ћџ фhbddc_nsdbded1 4ІЇc]^^WoУоНkV^^Yyњџ фc\^\W˜єќЪb[^`7 6ЃYXYUpт€џф€PXTvњџу^WUVЛў€џб]WYYZ]6 8ЁSVVKЋ‚џѓ{KPrњџтZPSЇ‚џўOWXRF*! ;Ѓg9QTLВƒџє~CqњџтUGГƒџў~NN?,&&) 3œc"/78mѓƒџяyfњџоYБ§ƒџЌ96.)+,,. /‹m*/.-$‡„џѕЇєџсИ„џв.)./00211  (s€334421}№ƒџљ§џўћƒџТE/‚4 953 # 'W‹B8€:8'uљџеI.;:<A;3 � &E‰[;‚>2oјџе>7?>=GG@/%�>zwCB‚C8{ђ‹џЮU<DƒCQHF& ��%.g‚RGƒH8oѓ‰џрJ>I‚HGNUIC��=IuiSK‚LMAtъ‡џг_EM‚LKQ`TM(0€�8d{dTPƒQAwє…џтbER„QbfVF‚�OtyhWU‚VWLmшƒџЯUOWƒVUdo^X-E‚� '+^rwl\Zƒ[PoщџоdR„[Zgwh^<„� Ggy}p^^‚_ `UlщџџхfW`‚_ ^_m{veXG„� ŒEmy‚zlb‚de^mˆ…i^e‚d bhwƒ|lS";†� 7Nm}ˆ…vkghie_`fi hgjs‚ˆ€r\$&ˆ�=LrŒ‰~qnllmnmllmpz‡Žƒu['Š�!G9lŠ””Š…€yvttux~„ˆŽ“•‚p? +Œ�O'[zŒ—™šš™—–“’•–˜šš™˜‘h43Ž�  4X}“šžŸ‚  Ÿœ•„d=!R‘�3+Mct‚–˜˜—‘†xgU6*Њ“�f6$4AEDC9( '™˜�N0€)=™œ�H/+'$%)-<Ž��  =ž�0‚ € €  -™�0    #•�,  8CJW_`__XME=* ’� -El„”ЂЕУХУСЕЂ“ƒnQ4 .Ž�f .YtžЫс№ѕєђђ€№ яысטt_> /Œ�" Dp—Эщёѓёюъху€с туцщфФ’qO"€ �Š�0 *^ŠЪьѓѓяшмгЬƒЫ ЬЯенттН~c? ˆ�8 3hЋтђѕюнаЩХХ…Ч ЦЦЧЫблЬ“iG ‡� /jЖъєєъкЬЦТТ‰У ТТЧбгkB !…� 2iЙшєѓрЯЯббЫРООЛНЛМ…П ОПЦЭ—jM ™ƒ� # ^›т№№кЭЭ€ЮЯЪНПкщуЭК†МЛСФf0 ƒ�  J’мю№зШЪЫЬРИъ€џќХЕ†ИЗМБsa D�  6|ац№гХƒЧЛАТўџфВ‡ДГЙЃmL � TІсэиТ‚ФХЙЏ­ТўџъАЏ‡АБД}a# .��3 0‚дьтППРТИЋЌЉПўџшЌЋˆЌА•gS ��TЈрьЮМОПЙЊЉЉІНўџчЉЈˆЉЊЈte+ ��4lМузЙƒЛЊЄЅЅЂЙўџцЅЄ‰ЅЉŠgF7EF~брНЖЗИЎЁЗўџэЃ ‰ЁЃ’hU$*O›мжГВБЏ€ЎŸœ€™Гўџя œ‰ž–i`!]ВпЦ ž€š™˜˜™•Аўџюœ˜™——˜‚™š˜ne0"gОдЈ’•––“’—‘“€–“Јќџ э™•––•“œ –”ƒ–rg<-tУУ•‘‘Œжшвš‹‘‘ŽЄќџ ь”‘ŒЙї§м”‘ “vgG1vСГ€Šы€џьЈ†ŠЁќџыŒ‹‹бў€џрŒŽugJ!# 4xРЉŠŒŒ…Ц‚џіІ†‰ ќџы‰ŠУ‚џўЈ‡‰‚nkM %%"7|Т™zŠŒ‡ЫƒџјЈ ќџь„ЬƒџўЇˆˆ~rmmrQ"')%1wΘmv{|žіƒџєІ›ќџщ’ЫўƒџСyzurstsxL"+4(,rД twwvoЎ„џјЦјџьб„џнntw€xyyzD%3G*-jІ­|{||{xЈѕƒџћўџў§ƒџв~x‚| €~z6):‰--e—Ж‡€‚tЄћџрyƒ‚„‡„u0-L4+[Ж™…‡ˆ~Ÿљџс{‚ˆ‡†Œ‹k./‚�X/@‡ЏЌŒŒ‚ƒЈі‹џлŽˆ‚ŒŒ•‘Y-9j�‹4/iЇД—ƒ‘„Ёї‰џш…Š’‚‘•™“ˆ;2_��С73CЏЇšƒ•–І№‡џп––ƒ•˜Ёš˜[16И€�g95vЊГІœš‚›œŽЉї…џы™‘œƒ›šЅЇ Š98C�jB8G–ГГЊ„ Ё˜Ђ№ƒџо‘›Ё„ ЇЎЅЄb59э‚�|=7`ЊГЕЏІƒЅІЈ№џш ŸІ„ЅЌЕЌЊw:=V„� Q?>‡ВЗЙВЉЈ‚Љ ЊЂЄ№џџэŸЃЊ„ЉБИЕА J<@…� J?C‚ИКНЙВ­‚ЎЏЉЉДВЇЉЏ‚Ў ­АИОЛЗ—S>BЪ†� МEAHИОУТКЕГГДВ­­ГЕ€Д ГГДЙРУПЛЂT=Dwˆ� ЪFDCŒОУЧЩЦРКЙ€ИЙИИЗИЙОХШШФС OBF€Š�"йOFHqДХШЬЬЪЧХТПНММНОСФЦЩЬЬЩЧИ{QDFƒ‹�KJD[œТЬЮЯЭЭЬЫЭЭЮ€ЯЮЮХЌkBHK˜Ž� ЧfMHMk—ПЭЯ‡в аЮЦЅvTGMWы� ›TNIKaŠЂДРЪа€б ЬУИЇ’nOHMR~Ъ“�ІSQNKPU[m{~}s_VRLMQPw—�МчZSRQOMNPRRUyСЛ�у”slq|ŒТьŽ�� ІџОІ›ЄГчTфž�‚GУ„xxƒwxx|Њцq˜�‚Іxxsqw{|xsrxyŠr•�жЁ{vqv™Сесюіїїі№хйЩЇ{qtv•N‘�ђ|xtˆЎиќŠџчЙ’uvyЕsŽ�p•yttЏљџЧ~qx|ђŒ�"Њxsж“џуšwwˆ‡Š�‚~xpЉћ–џЧuvy]ˆ�žwuЙћ˜џд~t|@‡� xsА›џЪ}vˆ!…�лysДџлzwŽЅƒ�}ys”ћžџЎqyеƒ�šw{нŸџњ–tю�GysМЁџйux­€�ыvьЁџ §™tyh��ВzrЕЃџ т{y��z…ъЄџЅvЅ�3wДЅџЮz|ч}}вЅџцƒ€я‚…фЅџј€УМƒŠѓІџЉЌŸ„”љІџМ …ЇЇџЮ…š’‡­Їџгˆš”‰ЎЇџгŠ™ŒАžџў§„џгЁЅЃќƒџњ§•џєћ„џЧ‹ЉХ“šїƒџћї”џјё…џКК –™ь„џћі§‘џіёў„џћЅ”ех˜—о…џњіўџљё§…џ№›˜HЎ–Ю†џќєўџјюў†џоš›Й�šЌљ†џћѕ§‹џіёў‡џטЙ?�Ъ ›и‡џљђ§‰џњю§‡џ єЇž/��iЌŸЎј‡џќєћ‡џїё§ˆџЦžЂF€�<ЄЁоˆџњє§…џњёќˆџэЄЃЦ3€�?РЄВіˆџќ№ћƒџїэ§‰џЩЂІТ‚�jЉЄХ‰џќєћџљє§‰џйІЉѓƒ�fрЊЊх‰џќ№ћџџљю§‰џїГЈЏі„�ИЦЌЏо‰џ§ѓ№яѓ§‰џэКЋБ8†�ѓЖЌБцŠџќќŠџѓЛЊЏ:ˆ�ВАЏт—џяЗЎВMŠ�%ЩВДЯљ“џњжЙБВQЦ‹�ЃЙЕБРъ‘џѕЪАДЖ€Ž�]іИЕИЫх§ŒџювМДИдYU� ЦxЬЙЖИХоыѕћƒџ ќїютЭКЖЙХ,Њ“�ВˆУНКЙМОТЭеззжЯФПНЙЙМН+—�ьIаООНМЛМНООФЫ"U›�Q&ї€єAЗ‚Ž�h8mk�� ������������������HvŸЖСУИЈƒX��������������������������������/]›хџџџџџџџџџџѓДk> ���������������������������/ЖќџџџџџџџџџџџџџџџџџйP�����������������������?МѕџџџџџџџџџџџџџџџџџџџџўЫ[������������������� }єџџџџџџџџџџџџџџџџџџџџџџџџџІ!�����������������Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓ;���������������%ДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоM�������������/№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџW�����������-дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓ_���������Нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс&��������Šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе������OџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ�����Хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџь����]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ��� вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњ1��Fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџp��xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМ�Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў@;§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџг№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтоџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџX�‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе �Xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ…��эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџE���‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа ��� лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ;�����uџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ������Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ9�������кџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіM���������Xђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹�����������Sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡������������Rсџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў† ��������������Cїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџw�����������������)ЛџџџџџџџџџџџџџџџџџџџџџџџџџџкM������������������ }хџџџџџџџџџџџџџџџџџџџџџџэ›'���������������������� yєџџџџџџџџџџџџџџџџџџќІ#��������������������������X’чџџџџџџџџџџџџѕЌh-������������������������������\ЅЙХЦЦЦМЌ˜n)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_ecomstation.icns����������������������������������������������������������������0000664�0001750�0001750�00000110555�10443006270�017131� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��‘mit32��Q]����џ�џ�џ�џ�џ�џ�џ�Ї� БH")'7;~%Њю�Ш‚ƒ%Q�bщ�€ ‚'\kх�н „€€%‡qс�`„ € €<н�Hš+9„ €0Iе�_ЪˆG0‚ €-’а� ‘w9 @юЫ�‹c+€ €u*Ц�U›. "##$%$##"  €'У�Y !#%'()*‚+*)('&$#! €‰Р�AO  #&(*,./112110.-+*(&$" €5М�bj !$'*-/245789€: 9876531/-+(&$! €€УК�п  $'+.1479;=?@@€A!@?><;97420-*(%"  €€пЗ�c: "&*.259<?ACEFGH$GFECA?<:752/,)&#   ‡Е�B№  $(-159=@CFIKMNOOPOONMKIGEB?=9630-*'$! kВ�BПf  !&*/38<@DHKNPSTVVWWVVUSROMJHEB>;841-*'$  €KА�DO: "'+05:?CHLOSVXZ\]^_^^][ZXUSPMJFC?<841-*&#  €‚�KЎ�Ѓ  "',17<AFJOSVZ]_acd€e)dcb`^[XUROKGD@<840-)&" ‚mњЋ�G™$ "',27=BGMQVZ^adfhjcjlkkihfca^ZWSOKGC?;73/,($! €‚‚Њ�I# !',28=CINSX\a_O<* drqpomkhfb_[WSOKGC>:62.*'#  €‚еЈ� !&,17=CIOTVE.- nxwvtrpmjgc_[WSNJFA=840,(%! €ƒВІ�*8 %*06<BIK7€3 /„‡q�‘}|{ywtrnkgc_ZVQMHD?;62.*&# €‚ПЅ�] #)/5;A7?ђƒ�,œ}{xurnjfb]YTOKFA=840,($! €ƒ5Є�э !'-37("U|‡�-Љ…„ƒ|yuqmie`[VRMHC>:51-)%" €ƒwЂ�M $*/  D–Š�-Р‰ˆ†„‚{xtpkgb]XSNIE@;72.*&# €ƒ ˜Ё�D "' XпŒ�-йŒŠ‰†„}zvqmhd_ZUPKFA<83/+'#  ƒ"ŸŸ�>  w_Ž�+Ž‹ˆ†ƒ{wsnje`[VQLGB=840,($! €€ƒ_ž�™   R�.IŽŒŠ‡„€|xtoje`[VQLGB>940,($! €„ I�› )’�.ЬŠ‡„}ytokfa\WQLGC>92+$ ƒ+œ�  ‡”� ‘Šˆ„}xtokf^M=/#  †‚‚„г›�   Н•� ”Š‡„€zfM6"%4Z˜N€��;Š€…Њ™�  6‡—�ЅŽ‹|\=! 1lLUˆ��i‘ƒ™� Е ^™�Ж9 !01?Ž��О“€�f—� к$ „И™�‘КиВ“��‡Š‚�‚'–� ЪŸєД�з Šˆ‚�€*ЌЕ”�9xЗ��†ƒ()ŽU“�XЖ�/<…‡……()‡’�с0UЎ�?Азi@' Œ„„„(*С‘�6™Љ�%}@'„ˆ„ƒƒ„(-x�H Є�Aђe8„‘‚‚ƒƒ(:,Ž��M‚�DŸ�!n8 ƒƒ‚‚‚‚ƒ%(jŽ�K€Џš�ФЏN# ‚‚‚‚‚Š ‚€ƒ()�€�ž•�…@&…ƒ Š  €€€ƒ (LŒ�т?‘�/ЗJ…‚€€  Š  € €€€‚ (*‡‹��П�j�Пl)†„‚€€€€ € € ‚ ƒ  € €  €€€‚€!(_‹�}€�r‰�NJ*‰„€€  €  ‡€ € €€‚(3тŠ�;G…�m;O" ‚ˆ„€€ €  €€…€€ '$Š�#�N‚�Їt(†‡„€€ ƒ €€1Š� �1�UVE†ˆƒ€ €€„€ €€€ ‰� т� >‡‡ƒ€ €† € Г‰�‰�ƒ‡‡‚€ €‚€ !§‰�є�ƒ‡†‚ €€ €€tŠ�)�ƒ†‡‚€ €€€ €Š�Д€�„††‚€  €!‚"!!  €|‹�`€�„††€€   !""#$$%%€&#%%$$#"!  %m‹�A€�„†…‚€!  "#$%&''(„) (''&$#"  Œ�>€�ƒ‡…€" !"#%&')*++,„-,+*)('%$"  в�`€�ƒ‡„‚%  "$%'(*+,.//0€1�2€10/.-,*)'%#! yŽ�Є€�ƒ†…€$  !#%')*,./023455‚6544210.,*(&$" p�€�ƒ†…J  "$&(*,.0135678@J\9;;::9875420.,*'%"  ƒ�‡€�ƒ†„€G !#%'),.02@Od…Р?г?�fB@??>>=;:8642/-*(%" Љ‘�‹€�ƒ†„! !#&+>UrВ@[њ…�XEDDCBA@><:8630-+(%" *’�s€�ƒ†„€€ !5KrСК9�xJJIHGFECA?<:741.*'$!"Њ”�€�ƒ†ƒ '9WЅЄ“�ЈOONMLKIHEC@>;741-*&# e$•�H2-�ƒ…ƒ !?lђш™�!STTSRPNLJGEB>;740,)%!—� Œs�ƒ…ƒ€€!8r%.ž�3SYYXWUSQOLIFB?;73/+'# bŸ˜�{Œˆ€�ƒ…ƒ€-[џВЄ�a_^]\ZXVSPMIFB>:61-%5…�цqу�цŒŒ€�ƒ…‚ @”/Љ�ydcba_]ZXTQMIEA=81 X†�Y;30�U“Œ;€�ƒ… Bу9­�Ёiigfdb_\YUQMID;%э‡�ЙL3"�КŒ^€�ƒ‚ !>уˆБ�эnnlkifc`]YUPD!"тЊ‡�Њg3(9�Œ��ƒ,†оѓД�њmrqomjhd`\F *‰�Њ‡3-�А�IŒŒ"€�9нИ� kwvtqokc>Fh‹�œ4/ ��–ŒO€� 0ШHМ� ƒ{zxtX, %{А‹�UЂ4/ Ь‘�гŒ~��PП�Јf;E�Š4. �$’�•ŒŒ)€��%П�’7#3Ž�Ѓn3,€�Z’�ДŒb€��П�Г?П�6S3(€�g“�ОŒŠ��Пг�AB3 �Ь“�™ƒŒT��лб�™Ž61ƒ�.•�„Œˆ��;а�ЦM3) ƒ��Ь•�И…ŒX��Ю�Š92„�•�?cŒ‹�‹Ь�юE3( „��@—�}Œn�UЪ�eT3.…�Ѓ—�JŒŒ>�Ч�‡^40…��!™�mdŒ‡BФ�f"W41…��Њ™�+ƒŒr2Т�ЗЎM3/‚…��š�д2ŒŒX УО�mPk;3*ƒ…€��‘œ�+SŒŒ?@Л�ЖЁ„G31 †…���ёkŒŠ8œЗ�"wD32%‡…€��Єž�‹xŒ‰’Г� t4‰U:30#‰…€��#Ÿ�1~Œ‹Ќ� _л<ЊkL831(‹†��e �ŒŽmЁ�кЧоЬDзЃ€dP?432,#€‹†€��HЂ�}Œ*Ÿ�n532/*#ƒŒ†€�пЃ�‚vŒŒЬž�_ ‰Œ†€�,Є�ПD gŒŒЁ‰œ��уŽ†��]Ї�5K‹ŒŽ š�т‹Ž†�&ЬЇ� )~ŒŒІъл™��‰†� Љ� š) [‹ŒШߘ��'‡†� зЋ� $((vŒŒбВ–��`„‘‡�3­� Ш$<ŒŒЛЄЊ“��“‡�ŸЏ�u8€@|€Œ™ѕ5_�”ˆ�МВ� _2l‹€Œ™иyЖ*��*“ˆ� жД�Џ€€IvŒšСb+_ЂШƒ�‹Ѓ{‘ˆ‚�UЖ�я€Af„„Œ ‘™ Ÿ›–‘ŽŒƒŽ‰‚�И�ПN‚8Rh|ŠˆŒ‹$Œ‰‚�=Л�7‚†&,€1-'‹‹‚� ЄП�Y ƒœ‹‚�(ЂС�g4…”ƒ�ЁХ�^"‰ˆ‘ƒ� OcЧ�вh0Єƒ� KіЬ�mUŸ„�_б�ЬAA—…�1п™ж�5e.…�9ЧЬн�єw8# -3AC�� 9…Эъ��U‡�Їgк?џ�џ�џ�џ�џ�џ�І�џ�џ�џ�џ�џ�џ�џ�Ї� c9/-3ACTaЄPiя�љ)€,?s.ъ�Г$ƒ! #@„Ўх�)„&%%$##"! =Ќтс�е9ƒ,++**)('&%$#" #YBм�m Ša1‚2110//.-+*)('%$#! Iе� 'ШxWB8788€98877654310/-,+)(&%#"!Eда�.ИcB679;<=>??@@??>>=<;9865320/-+*('%$"!YJЬ� —O558:=?ABDEFF€G!FFEDCB@?=<:86431/-+*(&%#" $˜Ц�нS347:=@BEGIJLMƒN!MLKJHFECA?=;97531/-+)(&$#! =EУ�’Œ<047;>AEGJMOQSTU‚V#UTSRPOMKIFDB@=;97420.,*)'%$" "ЊР�>Х|6/37;>BFIMPSUXY[]^^__^^]\ZYWUSQNLJGDB?=:8631/-+)(&$#!MђМ�b˜2-15:>BFJNRUX[^`bdefg'fecb`^\YWTROLIFDA><97420.,*(&%#! -К�=*/38<AEINRVZ^adgikmn‚o(nlkigeb`]ZWTQNKHEB?=:7530.,*('%#" #З�`),059>CHMQVZ_cfjmprtvwx*wvtrpnlifc`]YVSOLIFC@=:8531.,*)'%$" ЉЕ�H?8(-16;@EJOTY^cgkosvy{}~€€€€}|zxurolieb^[WTPMJFC@=;8531/-+)'%$" †Г�J’))-27<AFLQW\afkptx{„†‡ˆ‰‰ˆˆ‡…ƒ~|yurokgc`\XTQMJFC@=:8531.,*)'%#" iА�Mя]$)-27<BGMSX^dinsx|€„‡ŠŒŽ‘‘ŽŒŠˆ…‚{xtplhd`\XTQMJFC@=:7530.,*('%#" iЎ�PA$)-27=BHNTZ`fkqv{€…‰Œ’•–˜˜™™˜—•“‘ŽŒˆ…}yuqmid`\XTPMIFB?<97420.,*(&%#" †њЌ�P@#(-27=BHNTZagmsy~ƒˆ‘”˜šœž—ž  Ÿžœš—•‘ŽŠ†‚~zvqmhd`[WSOLHEB><9642/-+*(&$#! ЄЊ�Ri?#(-27<BHNTZagntz€†‹”“mZH80˜ЇЇІЄЂ š—“‹‡ƒ~zuqlgc^ZVRNJGD@=;8531/-+)'&$#!Љ�="',16;AGMSZagnt{‡‰w^F3085FЄ­­ЌЊЈІЃ œ˜”Œ‡‚~ytokfa]YUQMIFB?<:7520.,*)'%$"!"ыІ�дV!&+05:@FLRY`fmt{}hN5€0>8Rwжњ›�ЭГГБА­ЋЈЄЁ™”‹†|wrnid_[WSOKGDA>;8641/-+*(&%#" *?Ѕ�„ %*.39>DJQW^elshM4003M„X-ƒ�8жЙИЖДВЏЌЉЅЁœ˜“މ„zupkfb]YUQMIFB?=:7530.-+)'&$#! KЊЃ�."#(-27=BHOU\ciX=001PЁ †�8тНМЛЙЖГАЌЉЄ ›–‘Œ‡‚}xrmid_[VRNKGDA>;86420.,*('%$"!’Ђ�Б0"',05;@FMSZ_O7009~ Š�9СРПМКЗГАЌЇЃž™”‰„ztojfa\XTPLHEB?<:7530/-+)(&%#" вЁ�a %*/39>DJPWL600CЄДŒ�: ХФТПНКЖВЎЊЅ ›–‘‹†{vqlgb^YUQMJFC@=;8631/.,*)'%$"!5Ÿ�v #(-16<AGNL900?ПOŽ�:UЧЦФТПМИДАЋЇЂ—’‡‚}wrmhd_ZVRNKGDA>;97420.-+)(&%#" yž�f;!&+/49?DI>107’U�;ГЪШЦФСНКЖБ­ЈЃž™“މƒ~xsnid`[WSOLHEB?<:7531/-,*('%$"!‚�Ь$)-27<AC500[Б’�"WЫЩЧХТОЛЗВЎЉЄŸ™”‰„~ytof[RJD>:6410/.€/.,+)(&%#" ?œ� Ь/"'+049><109в”�ЙЬЪШХТПЛЗГЎЉЄŸ–€jWF7* )#€ "$$"!ј›� Е$)-26;700Ng•�!ЭЪШХТПЛД›y[@(%0<P{ПO–A€��v„8763/+&"/Њ™� Њ1"&+/48400mД—�тЪЧГŠb="0L‹C™Uˆ��Љ„98€7665541+#Є™� у$(-15202ž™�ђ\/4KГiŸŽ�� ƒ:‚9€87766544321*! х—� н@!&*.2104ЫХš�о “�l8‚;‚:99€8 7765543210/*€Hc–�  #(,0103піД�‰=<‚;€:€987766543210/.,#(TэФ”�\ %)-001РЗ��L€=ƒ<€;::9988766543210/.,+"!9STЩ”�-"&*/00”Е�momL†=€<;;::998776543210/-,*(&6RTЭ’�$(,00cдЎ� ц žvYL>8:>?‚>€=<<;;::98876543210.-+)(%6ST ‘�V %)/0EfЉ� DV­vYL<8<>>‚?ƒ@?€>==<<;;:9887654320/.,*)&$;SWп�Ж-"&-05ˆЄ�t—kN@59<€=>>€?@…A@??>>==<<;:9987654310/-+*'%#DSf,Ž�‡#)00„Ÿ�cBŸhL@17::;;<<==>>??€@€A‡BA@@??>==<;:998765321/.,*(&$%NSžŽ�t$.0D™�н|PB3367889::;;<==>>??@@AA€BŠC BBAA@@?>>=<;:998654320/-+)'%"1STц�>!(00ю–�!ТЧlM9.1345567889::;<<=>>??@@AABBCCD„EDCCBBA@@?>=<;;987654210.,*(&#GS|Œ�Њ)".0J?‘�%oсqD7+./012344567789::;<<=>>?@@ABBCCDD€E‚FGG‚F!EEDDCBBA@?>>=<:98765320/-+)'$ ,STї‹�&00ВŽ�(ВŽL5&)+,-./011234566789::;<==>??@AABCCDEE€FGG‡H"GGFFEEDCBBA@?>=;:9875431/.,*'%!IS—‹�Љ,0(u‰�0А3mE)"%'()*+,-./012345567899:;<==>?@@ABCCDEEFGGHH€I…J€I!HHGFFEDCBA@?>=;:9765320.-*(&"4S]ИŠ�]!00G…�7mck<#!"$%&'(*+,-./011234567889:;<==>?@AABCDEEFGHHIIJJKK†L#KKJJIHGGFEDBA@?><;:875421/-+)&#"RL_Š�A&0/N‚�:ъ“>$ !#$%&()*+,-./01234556789:;<<=>?@ABCCDEFGHIIJKKLLMM†N#MMLLKJIHGFEDCA@?=<;9865310.,*'$ ]Š�D3,0#�2�U…^. "#$&'()*+,-./0123456789::;<=>?@ABCDEFGHIIJKLMMNOO€P‚Q€P"OONMLKJIHGFDCB@?=<:975420.,*(%!,‰�Fq)/0�#W"!"#%&'()+,-./01234566789:;<=>?@ABCDEFGHIJKLMNOPPQRR†S#RRQPPONLKJIGFDCA@>=;986431/-+(%"т‰�Gс#00� !"$%&')*+,-./0123456789:;<=>?@ABCDEGHIJKLMNOPQRSTTUU„V$UUTTSRQPOMLKIHFDCA?><:97531/-+)&#1§‰�G;%0,��  !#$%&()*+,-./0123456789:;=>?@ABCDFGHIJLMNOPQSTUUVWXX…Y"XWWVUTRQPNMKJHFDBA?=;986420.,)&#Š�GZ)0"�  !#$%'()*+-./0123456789:;<=>@ABCDFGHJKLNOPQSTUVWXYZ[[…\"[[ZYXVUTRQOMKJHFDB@><:86531.,*'#cŠ�Hц,0�  "#$&'()+,-./0123456789;<=>?@BCDFGIJKMNPQRTUWXYZ[\]^__ƒ`"__^]\[ZXWUSQPNLJHECA?=;97531/-*'™‹�Iž/0�  "#%&'(*+,-./012356789:;<>?@ACDFGIJLMOPRSUVXY[\]_`aabccd#ccba`_^][ZXVTRPNKIGEC@><:8641/-*5к‹�G‹00� !"#%&')*+,-./123456789;<=>@ABDEGHJLMOQRTVXY[\^_abcdef€g€h"ggfedcb`^][YWTRPMKIFDB?=;86420-'WŒ�I˜00 � !"$%&()*+,-/012345689:;<>?ABDEGHJLMOQSUWXZ\^`acdfghijkkl!kkjihgedb`^\YWURPMJHEC@><97520,ю�IН00� !"$%&()*+,./012346789:<=?@ACEFHJLMOQSUWY[]_acefhiklmnoo‚ponmlkigeca_\ZWTROLIGDA?<:753/’Ž�J00� !"$%'()*+-./01245678:;<>?ABDFHIKMOQSUXZ\^`bdfhjlmopqrstt€uttsrpomkigeb_]ZWTQNKHEC@=:852„�Kr00�  !"$%'()*,-./01345679:<=?@BCEGIKMOQSUXZ\_acfhjlnprsuvw}ŠŸv€yxwvusqomkhec`]YVSPMJGDA>;84—�€0H �  !"$%'()*,-./02345789;<>?ACDFHJLNQSUXZ]_bdfiknpzАт7ЮЈП�Ьx€~}|{yxvsqnlifc_\YURNKHEB?<5У‘�B120�  !"$%'()*,-./1234678:;=>@BCEGILNPSUWZ]_bf|šЪЪ0�ћ…��“€ƒ‚€~|zxurolifb_[WTPMIFB?2"Q’�:Ђ=0�  !"$%'()*,-./1234679:<=?ACDGIKMORU[r“Ь8a"�Л‰ˆˆ‡†„ƒ~|yvspliea]YVRNJGC*4ю”�3H0� !"$%'()*,-./1235679:<>@ACEHM]|ЌAЅ“�јŽŽŒ‹‰ˆ…ƒ€}zwsolhd`\WSOLA|‘•�.„dP�� !"$%'()*,-.01235689;=>GZ‚ХuЛЊ˜�u’“’‘ŽŒŠˆ…‚~{wsokfb^YUP4.У—�(kЩІ�� !"$%&()*,-.012456>UyШАž�Œ˜—–•“‘Œ‰†‚~zvrmid`[I{˜�#юЩУ� !"$%&()*,-.02GgЉvВЃ�–œš˜–“Š†‚~yupkfZ.GM…�<Џ&�‡ЩЩ)�  "#%&()*1J{яІЉ�ЙЃЂЁŸ›˜•‘ŽŠ…|wrg;1{†�нh`G�UЯЩT�  "#%.J~;ч­�эЈЇІЄЂŸœ™•’‰„sC4 ‡�‹|`<)�џЩ‡� &Ao.ЊБ�:­ЌЊЉІЄЁ™•‘Œ{E3�Њˆ�›`M A�|ЩЙ� *MМbѕД�LЉАЏ­ЋЈЅЁ˜y><A‰�UР`U’�ЬЩЩ0� &UИ� *ЁЕГБЏЌЈži.Zœ‹�к`Y ‘� бЩq� AђЖМ� ЛЙЗЕБŠM6š'Œ�мaZ ’�ЩД_П�ыМ›`')]M�Т`X )’�љЩЩ;�1П�Ч+"MKЬŽ� HЁ`U `’�ХЩŒ�"П�ёg‘� дƒ`N o“�џЩЦђг� šn`B ”�иНЩy�ђб� ЬЫb]2 3•�ЖЩУGа� H}`Q" Я•�ьПЩ'Ю�cШd^< ?•�ПЩЧ+ ЃЫ�3As`P% D—�ЅЖЩŸ_Ъ�Э…`Y4 Ѓ—�YkЩЩZ"Ш�ыa\> #™�Œ•ЩС$UФ�™‰a]B" Њ™�дDНЩЄ 9Т�З�z`[@# š�ѓSЩЩсО�$ЛІg`U:" ‘œ�@ЩЩ]HЛ�ЖТs`]I0!  �)"žЩЧPДЗ�мoВq`_O9&"!  Єž�Є$ЏЩФЙГ�!U“б‡f`\M;($#"!  # �B.ЗЩЧъ­�&ЈѓІzd`^SD4'%$##"!  e �[#4ЙЩЩиЁ�0к,@oЃ;№Рš€ka`_XNB6*'&&%$#"!!  HЂ�24ЖЩЪfUŸ�Єb`*_[VOG?6-))(''&%%$#"!  пЃ�™.­ЩЩ�0бDA>;83.,++**))(('&&%$$#"!  ,Є�ТW#™ЩЩп1œ�X--€,€+&**))((''&%%$#""!  �]І� ?CwЧЩЩYš�6+€*&))((''&%%$##"!  �&ЬЇ� u.KИЩЩхgю™��C€*€)€(#''&%%$$#""!  � Љ� П6'ŠШЩЩf˜��X€)€(%''&&%%$$#""!  � зЋ� H4J­ЩЩЪD–�œ((€'&&€% $$#""!  �3­�62dИ€Щ�”“�ƒ'€&€%"$$##""!  �ŸЏ�œF"hЕ€ЩгMа?�80%%€$"##""!!  �МБ� mXЁШ€Щд$ѓ|Ž��Q#"""!!  � жД� Т7uЎ‚Щж]дУ�.ƒ� ьСБ""€!  �UЖ� )9jšП„ЩЪЮеийиждЫЪЩО' € ��И�щY >`œЖЧˆЩШЙH€ �=Л�D" 0>JQWXWSKA2#€€ �� ЄО�.fƒ‚€ �(ЂС�y= ‚‚€ ��ЁХ� j* €ˆ€ �� OcЧ� гu8 ƒ �� KіЬ� {\ €„ ��_б� ЬLK €ƒ€€  ��1п™ж�An6  € ƒ €  �9ЧЬо�!€?*#$ #39IH� 9…Эъ��U‡�Їgк?џ�џ�џ�џ�џ�џ�І�џ�џ�џ�џ�џ�џ�џ�Ї� чЇwoos~‡œН гUю�tfYZ YXWVTRTc€ХЈАщ�7hgg€hgfedca_][XUSZю]х�Иts‚tsrqpnljhfca^[XTS{ с�Š‚€~}|zxwtrpmkheb^[WSZЂхм�"m5tЬŠ‹‹ŒŒ‹‹Š‰‡†„‚€~|ywtqnkhda]YUSˆе� oєЛœ“”•–—–•”“’ŽŒŠ‡…‚€}zwspmifb^ZUSƒzа�.U]в›’•˜šž ЁЂЂЃЂЂЁ Ÿœš˜•“Ž‹ˆ…‚{xuqmjfb^YTRœ)Ы�"!Ќ’—šžЁЄЇЉЋЌ­Ў ­ЌЋЉЇІЃЁŸœ™–“Š†ƒ€|xuqmiea\XSZєUЦ�”~Д‹•šŸЃЇЋЎБГЕЗИ‚Й!ИЗЕГБЏ­ЊЈЅЂŸ›˜•‘ŽŠ‡ƒ|xtplhd_[VPwяУ�Ш “А–œЁІЋЏГЗКНПСУФХ#ФУСРОЛЙЖГА­ЊЇЃ œ™•‘ŽŠ†‚~{wsojfa]XSVР�>№Šˆ–ЃЈЎГИМРУЧЩЬЭЯаабааЯЮЬЪШХТРНЙЖВЏЋЇЄ œ˜”Œ‰…}yuplhc^ZTOŒ?Н�‡…”›ЂЈЏДКПФШЬагеийлм'лкиждвЯЬЩХТОКЗГЏЋЇЃŸ›—“‹‡‚~zvrnie`[VPdЊК�CТ‘€‰‘™ ЇЎДКРЦЫадимптфхччшччцфуролиевЮЪЦТОКЖВ­ЉЅЁ˜”Œˆ„€|wsojfa\WQWnЗ�ЧУ{ƒŒ”œЄЋВЙРЦЬвзмрфшыю№ёђ€ѓ*ђ№яэъшхсокжвЮЪЦСНИДАЋЇЂžš–‘‰…}xtokfa\WQQЕ�†|†—ŸЇЏЗОХЫвиоушь№єїљћќ§+ќћљїєёюъчупкжбЭШФПКЖБ­ЈЄŸ›—’ŽŠ†}ytpkgb]WRNЬВ�?v~ˆ‘™ЂЊВКСЩазнущюѓјћўˆџ)ў§њїѓяыцтнидЯЪХРМЗВ­ЉЄ ›—“Š†‚}yupkgb]WQLЕА�oЗt‰’›ЃЌДМФЬгктшяєњ§Žџ'ўћїѓющфпкеаЫЦСМЗВЎЉЅ œ—“Š†‚}yupkfa\WQKГЎ�Q•s‰“œЅ­ЖОЦЮжохьѓљў’џ'ўњѕ№ыцслжбЬЦСМЗВЎЉЅ œ—“Š†‚}ytpkfa\VPKЪћЋ�ˆs‰“œЅЎЗПШаиршяї§†џј§‹џ%ќїёьцсмжбЬЦСМЗВ­ЉЄ ›—’ŽŠ…}xtoje`[UOJјЊ�W‡q~‰’œЅЎЗРШбйтъђљўџњщжХЖЈЂѓŒџ%ќїђьцслжаЫЦРЛЖБ­ЈЃŸ›–’‰…€|xsnid_ZTNKcЈ�ЏŒo|‡‘›Є­ЗПШбкуыѓћџџћцЭЕЄЂЅЕњџ%§їёыцркеЯЪХПКЕАЌЇЃžš•‘ˆ„€{wrmhc^XRLQ}І�*Ѕlz†šЃЌЖПШбкуыєќњпСЇ€ЂІЭ#Ќ%Њ�Žџ%ќі№ъфпйгЮШУОЙДЏЊІЁ™”Œ‡ƒ~zuqlgb\WPJ\Ѕ�цhwƒŽ˜ЁЋДНЦайтыѓцХЇЂЂЃФ3Uвƒ��џ%њєюшунзбЬЧСМЗВЎЉЄ œ—“Š†‚}ytoje`ZUNHЊЃ�ЬftŒ–ŸЉВЛФЮзрчгБ€ЂХ_|†��$џ%ўјђьцркеЯЪХПКЕБЌЇЃžš–‘‰…€|wrnic^XRLFпЂ�Чqp}‰“ІАЙТЫемШЊЂЂЋ6Š��Rџ%ќѕящуоивЭЧТНИГЏЊІЁ˜”Œ‡ƒzuqlga\VPIJfЁ�Аjy…šЃ­ЖПЩбХЊЂЂДjдŒ��jџ&ўјђьцрлеЯЪХРЛЖБ­ЈЄŸ›—“ŽŠ†}xtoje_YTMGdŸ�dtŒ– ЉГМХХ­ЂЂВwпŽ��Ђ‘џ%ћѕящунзвЭЧТНИДЏЋІЂ™•‘Œˆ„{vqmhb]WQJCМž�3‚n|ˆ“œІЏИРДЃЂЇ4��‘џ&§їёыхпкдЯЩФПЛЖБ­ЈЄ ›—“Š†‚}ytoje`ZTNGH�?fwƒŽ˜ЂЋДИЈЂЂкB’��б‘џ'ўљъиШКЏЅ–‘‹ŠŠ‹’•˜•‘ˆ„€{wrmhb]WQJCrU›� fup~Š”žЇААЃЂЈ‹”��MŠџ.љсЦ­–€lYHCHSUU_bdeec`\WPHBABIRZckszytoje_ZTMGAW›� gx„™ЂЋЉЂЂФ–�„џќтОœ{\GPav™Ы!ХUœ€��ОННММЛККЖЌ ’‚r`MAAIS\dgb\VPJC[š� Uxp~Š”žІЅЂЂњ–—�џџьҘoMNfŽпБUЊˆ��SƒРППОНМЛКЙИЖЕГБІ‘x_G@DMTWSLF>є™� \fx„™ЂЃЂЃA™�0]Id �ПŽ�СТУТТССРПОНМЛЙЗЖДВЏ­ЊЅŽpQ@AFJHAN-—� хˆo}‰“ЂЂЄ~х™�m9pх“�6Н€Ц€ХФУУТСРПНМКЙЗЕВА­ЋЈЄЁŽjI@AA<›O–� Лdvƒ—ЁЂЄˆћД�NИ‚ШЧЧЦХФФУСРПНЛЙЗЕГАЎЋЈЄ œ–wP@@iТ•ъ”�Жk{‡’žЂЃzЗ��Ч€Ы€ЪЩЩШЧЦХФУСРОМКИЖГБЎЋЇЄ ›—‘uo›РСbU’�*or€‹šЂЂ'Е�къХ‚Э ЬЬЫЪЪЩШЧХФТСПНЛИЖГА­ЊІЃžš•‰‚–РС’�Šfw„’ЂЂхЏ� *s‰*џнТВГТЭ€а€Я ЮЮЭЬЫЪЩШЦХУСПНЛЙЖГА­ЉІЁ˜“†•СТХ‘�Њl|‰ŸЂИzЉ�дЪ0лОЎЖЧЮЯаабб„в"ббаЯЯЮЭЬЪЩЧЦФТРНЛИЖГЏЌЈЄ ›–Š‚z›СУэ�or€—ЂЄЈЄ�№„ъШЎЊОШЪЫЭЮЯаббвггд�ед"ггвбаЯЮЭЫЪШЦФТРОЛИЕВЏЋЇЃž™“†~vЉСдІŽ�dv‰ЂЂ&Ÿ� ШхСЄЅЛСУХЦШЪЫЬЮЯабвгдде€жƒз#жжеедгвбЯЮЬЫЩЧХУРНЛИЕБ­ЊЅЁœ–Š‚yvЙС%Ž�лjz›ЂЕЯ™� ЊЬO№УЅ›ЋЗЙМОРСУХЧШЪЬЭЮабвгдежззии…й#иизжедгваЯЭЫЩЧХТРНКЗДАЌЈЃž™“…}rˆСС№�ŠnˆЂЂЛ•�&дU4кБ••Ї­ЏВДЗЙЛНПСУХЧЩЪЬЭЯавгдежзийккллƒм$ллккйизждгбЯЮЬЩЧХТПМЙЖВЎЊІЁœ–ˆ€vjЌСќŒ�Њir›ЂЧ’�+MеЅŠ‹› ЃІЉЌЎБДЖИЛНПСУХЧЩЫЬЮЯбвдежийкллмннооп€о#нммлйизедваЮЬЩЧФСОЛИДБЌЈЃž˜’‹ƒzn|СС‹�Кb€ЂЂj�.Ÿ1щЇ…yŠ’•˜œŸЂЅЈЋ­АГЕЗКМОСУХЧЩЫЬЮабгежзйклмноппр…с$ррпонмлйиждваЮЬЩЧФСНКЖГЏЊЅ ›•ކ}rcЏС'‹�g”Ђ‡|‰�3Ф СŒnr„ˆŒ“–š ЃІЉЌЏБДЗЙЛОРТФЦШЪЬЮавгезиклмнопрстуу„ф%уутсрпомлйзегбЮЫЩЦУРМЙЕБЌЈЂ—ˆ€ugˆСШтŠ�ЗoЁЂGG†�6ЫЗ{`eoty}…‰‘”˜›žЂЅЈЋ­АГЕИКНПСФЦШЪЬЮавдезйкмнорстуфххц„ч%ццхфутрпнлкзегаЮЫШХТОЛЗГЎЊЄŸ™’‹‚xkhПГ+Š�‚ЂŸ P‚�;“лwVR\bglqvz~ƒ‡‹Ž’–™œ ЃІЉЌЏБДЗЙМОСУХЧЪЬЮавджзйлморстфхцчшшщщƒъ%щщшчцхутромкиегаЭЪЧФРМЙДАЋІЁ›”…{n\@5ЪŠ�Eu“Ђu�7�UœYAELRX^chmrw{€„ˆŒ“—šžЁЄЇЊ­АГЕИЛНРТФЧЩЫЭЯвджийлнпртухцчщъыыь„э%ььыъщшцхуспнкиевЯЬЩЦТОКЖВ­ЈЃ–‡}q^55†‰�H8i ЂE�,•G018@GMSY_djosx|…‰‘”˜›ŸЂЅЈЋЎБДЗЙМОСУЦШЪЭЯбгеикмнпсухцшщъьэююя№№ё&№№яюэьыщшцфтпнкиевЯЫШФРМИГЏЊЄž˜‘‰s\5<q‰�GЭpЂЂ )2:AHNTZ`ekpty~‚†ŠŽ’•™œ ЃІЉЌЏВЕИКНРТХЧЪЬЮбгезкмортфхчщъьэя№ёђђѓƒє%ѓѓђё№юэыщчхтрнкздбЭЪЦТОКЕАЋІ ™’ЁuR5Z§‰�Hљ}Ђ” "+3;BIOV[aflquzƒ‡‹“–šЁЄЇЊ­АГЖЙМОСУЦЩЫЮавезймортфцшъьэя№ђѓєѕіїїј%їїіѕєѓђ№юьъшхтрнкжгЯЬШФРЛЗВ­ЇЁ›”Œƒw@5бŠ�Iи‹Ђt�#,4<CJPW\bgmrv{„ˆŒ”—›žЂЅЈЋЎБДЗКНПТХЧЪЭЯвджйлортфцщыэю№ђєѕіјљњњћћ€ќ%ћћњљјїѕєђ№эышхтпмйебЮЪХСНИГЎЈЃœ•„i5GŠ�Hl–ЂY�$-5=DKQW]chmrw|€„‰‘”˜›ŸЂІЉЌЏВЕИЛОСУЦЩЫЮбгжилнртфчщыэ№ёѓѕїјњћќ§ўў‚џ#ўў§ќћљїѕѓёюышхтплзгЯЫЧУОЙДЏЊЄ–Ž…E5з‹�CDžЂB�%-6=ELRX^dinsx|…‰‘•™œ ЃІЊ­АГЖЙМПТФЧЪЭЯвезкнптфчщью№ѓѕїљњќў‹џў§ћљієёюышхснкжбЭЩФРЛЖАЋЅž—f5\Œ�AMЂЂ0�%.6>ELSY_djotx}†ŠŽ’–™ ЄЇЊЎБДЗКНРУХШЫЮбджймпсфчщьюёѓіјњќўџў§њјѕђюычфрмигЯЪЦСМЗБЌІŸ˜‚9AђŒ�?ЂЂ$�&/7>FMSY_ejoty~‚†ŠŽ’–šЁЄЈЋЎБЕИЛОСФЧЩЬЯвеилосуцщьяёєіљћ§“џўћјѕђюъцтокебЬЧТНИВЌІ “E8:�>ДЂЂ�&/7?FMTZ`ejpuy~‚‡‹“—šžЁЅЈЌЏВЕИЛОТХШЫЮбдзкнруцщыюёєїњќў•џўќјѕёэщхрмзвЮЩУОЙГ­ЇP7ЬŽ�<щЂЂ�&/8?FMTZ`ekpuz~ƒ‡‹“—›žЂЅЉЌЏГЖЙМПТХЩЬЯвеилосхшыюёєїњ§™џќјє№ьчуойдЯЪХПКДЎЄV7З�;QЂЂ�&/8?FNTZ`fkpuz~ƒ‡‹“—›ŸЂІЉ­АГЖКНРУЦЪЭагжкнручъэ№єїњ§Šџ2јŠџўћїѓюъхрлжаЫЦРКДЈU7Щ�:йЂЂ"�&/8?FNTZ`fkpuzƒ‡Œ”—›ŸЂІЉ­АДЗКНСФЧЪЮбдилптхщь№ѓіњ§„џ !X­3aп�Ьш‹џўњіёьчтнзвЬЦСЛЇN;‘�BеЃЂ.�&/7?FMTZ`fkpuzƒ‡Œ”˜›ŸЃІЊ­БДЗЛОСХШЫЯвжйнрфчыюђіљ§�Fž Uџ…��Œџ§љєющфойгЭЧСœBFЕ’�:ЂЇЂ>�%.7?FMTZ`ekpuzƒ‡Œ”˜œŸЃІЊЎБДИЛПТХЩЬагзкотхщю MГf���=џ ћіёыцркдЮЧ‚8_Ё”�3НЂS�%.6>FMSZ`ekpuz~ƒ‡Œ”˜œŸЃІЊЎБЕИЛПТЦЪЭбдйы%ˆ(оx“��•џ ўљѓэчслеН];ДЖ–�,Т‰� $-6>ELSY_ejpuy~ƒ‡‹”—›ŸЃІЊЎБЕИМПУЩэ-ЋХс™�!§џ ћѕящук•>V&—�(Нџв� #,5=DLRY_djoty~‚‡‹“—›ŸЃІЊЎБЗк Ї‹ž�ьџ§їёъС[>Л˜�#Qџї� !+4<DKRX^dioty}‚†‹“—›ŸЃЙјsВ3Ѓ�?ьџўљр}:vї…�LЯ�џџ4� *3;CJQW]cinsx}†ŠŽ–ОйсЉ��џђ–?]и†�3кд‡�џk�(1:BIPV\bhmrw|‡Е­­��b‹џёœE\U‡�Йѕд‰<�8џЋ�&08@HOU[agp•эьЊБ��К‰џъ“D\KU‡�ЊдЌ U�Яџы $.7?FMTgЄGЄјД�ѕѕ†џжAj Š�UдН1Ћ�Cџџ=� ",5=UžЂqИ�ЊцƒџіВ`C‘‹�|дХ@.� ™џ�1mWЖМ��€џ§а…B^х'Œ�nдШJ# Ь‘�ZџхˆП�>ўк•QN–Э�ПUдХN( 5’�YџџJ RП�#TIƒЗ� ‘%дПL-%n’�УљџВ�;П�žЯП� s�дВF2*"ƒ“�>џћ&#fг� ƒрдšA5.'f“�>ѓџ™ &б� LdеЮ|@92+#<•�ыџј"hа� јдЙ_B<6/'  л•�AѕџЁ;Ю�дgеа“NE?92+$_•�*Тџќ7 ьЫ�ЬцдЗiMHB<6/' I—�ьыџЩЪ�л�дШ‡VOJD?82+# ­—� ›џџr 2Ч�ыдЮšaVQLGA;5.' &™�зЩџѕ/}Ф�Ьw дЯЁj\XSNIC=71*"­™�ЊtѓџаLТ�3ЬэдЫ ob]YTOJE?93,% š�D„џџЂ-О�‘Ю=кдТ—ogc^ZUQLGA;5/( ‘œ�sГџџzZЛ�HKcцдаА‰okgc_[VRMHC=71*# �ГOдџќjЗ�аYJхдвК™{rokhd`\WSNID>93,% Єž�чUхџљтГ�!Дˆ‰ждЯИyvrolhd`\XSOJE@:4.' # �paэџћ<Ќ�'cТБ;ёедбТ­—ƒ~{xurolhd`\XTOKFA;5/)" eЁ�Niяџ�7Ё�0mБ@—6Иf'ћмддгЪН­›‹…ƒ€~{xurokhd`]XTPKFA<60*# HЂ�ˆBjьџџАUŸ��-‚д*гЯШПЖЋŸ“‹‰†„‚}zwtqnkgd`\XTPKGB<71+$ пЃ�Я@dфџџR �0ѓДБЎЉЅž˜•“’‹‰‡…ƒ€~{yvspmjgc`\XTPKGB=72,%,Є�Щ‚@YбџџЩœ�/†˜˜—–•”’‘Ž‹‰‡…ƒ}zxurolifc_[XTPKGB=82,&]Ї�iAPЏўџ�žпš�/U𔓒‘ŒŠ‰‡…ƒ}{yvtqnkheb^[WSOKFB=82,&&ЬЇ� ‰U@L…юџџйџ™�-ЎŽŒ‹‰ˆ†…ƒ}{ywtromjgda]ZVRNJFA<72,&  Љ� X?KaУўџџOч˜�,мŒ‹Š‰ˆ‡…„‚}{ywuspnkheb_\XUQMIE@<71,& зЋ� ЖU=HQ†фџџ�WЩ–�+7ˆ‡†…ƒ‚~|{ywuspnlifda^ZWSPLHD?;60+%3­�[U:FNYŸя€џ<€“�*ƒƒ‚€~|{yxvtrpnligda_\XURNJFB>94/*$ŸЏ�'h6BKR_Єэ€џšSП�)Њˆ}}{zyxvusqomkigdb_\YVSPLHEA<83.(#МВ� ‘2>GNT]•кў€џh\.U�'Жyxwutsqpnljhfdb_]ZWTQNJFC>:61,'! � жД� є89BIOUYvБц‚џ EА7Hˆƒ�) `srqponljigeca_\ZWTQNKGD@<83/*$ �UЖ� NE2=DJPTX]yЈді…џ�ƒ €џ%іtmlkjhgeca_][YVTQNKHEA=951,'"�И�x/6>EJOSVZ\bŸОжю§ˆџ%ўёgfedba_]\ZWUSPNKHEA>:62.)$ �=Л�?n;.7>DIMQTVY[]^`dtŒ“˜™˜”„wicba`_^\[YWUSQOLJGDA>:63/*& � ЄО�а,.6=BFJMPSUWXZ[\]]„^"]\[[YXWVTRPOLJHEC@=962/*&! �(ЂС�АT'-4:?CFILNPQSTUVVƒW VUTTRQPOMKIGEC@>;851.*&! �ЁХ�@$*16:>ADFHJKLMNƒONNMLKJHGEDB@=;863/,($  � OcЧ�д–K#%,158;=@ACDE„FEEDCA@?=;9752/,)&" � KіЬ� p/%*.14689:;<=<<;:9875420-+(%" ��_б� Ьb[- $(*,.0112110/.,+)'%" �1п™ж� d…G,!"$$%$$#!  9ЧЬн�(?•U=54+! %1/CL_U 9…Эъ��U‡�Їgк?џ�џ�џ�џ�џ�џ�І�t8mk��@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!ЁУУУУУЏ €kF"�����������������������������������������������������������������������������������������������������������������^ёџџџџџџџџџџџџяО‰M ������������������������������������������������������������������������������������������������������������oўџџџџџџџџџџџџџџџџџљТn&��������������������������������������������������������������������������������������������������������ZўџџџџџџџџџџџџџџџџџџџџџўЪo����������������������������������������������������������������������������������������������������%ѕџџџџџџџџџџџџџџџџџџџџџџџџџі 2�����������������������������������������������������������������������������������������������&FОџџџџџџџџџџџџџџџџџџџџџџџџџџџџўОB���������������������������������������������������������������������������������������:pЃвєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР6�����������������������������������������������������������������������������������*sЛѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§Ћ������������������������������������������������������������������������������,ˆлџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєu������������������������������������������������������������������������� iЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯ0����������������������������������������������������������������������!Žяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњs������������������������������������������������������������������šљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЖ��������������������������������������������������������������� ‰ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп3�������������������������������������������������������������XхџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјX����������������������������������������������������������Џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџq�������������������������������������������������������HыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ����������������������������������������������������„ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ��������������������������������������������������ВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ������������������������������������������������ЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ�����������������������������������������������оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџq���������������������������������������������нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўW�������������������������������������������Шџџџџџџџџџџџџџџџџџџџџџџџџџџџ§яљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї5�����������������������������������������Жџџџџџџџџџџџџџџџџџџџџџџџќг–l>�тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт����������������������������������������…џџџџџџџџџџџџџџџџџџџџџнQ������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџО��������������������������������������Gўџџџџџџџџџџџџџџџџџџн€-���������нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx�������������������������������������ыџџџџџџџџџџџџџџџџѕЅ=�������������Пџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ4������������������������������������Јџџџџџџџџџџџџџџџю|���������������Гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџи����������������������������������Eўџџџџџџџџџџџџџэ|�����������������›џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†���������������������������������бџџџџџџџџџџџџњ’�������������������zџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњ-��������������������������������dџџџџџџџџџџџџЩ.���������������������ZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР������������������������������ нџџџџџџџџџџњw����������������������;џџџџџџџџџџџџџџџџџџџџџџџћћс№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR������������������������������sџџџџџџџџџџн/������������������������џџџџџџџџџџџџџџѕдА‘v\C'��—џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн����������������������������нџџџџџџџџџБ�������������������������шџџџџџџџѕШšqH�����������wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe����������������������������^џџџџџџџџџ���������������������������Бџџћж—e.�����������������Sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт2���������������������������Ыџџџџџџџџ{�����������������������������]O����������������������/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїZ�������������������������5џџџџџџџџ{�������������������������������������������������������� ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§‚������������������������˜џџџџџџџ{����������������������������������������������������������ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“���������������������юџџџџџџ›�������������������������������������������������������� ?кџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†��������������������UџџџџџџС������������������������������������������������� *Nr—Жлєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџt��������������������Ѕџџџџџш��������������������������������������������Dn’Жрљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§H������������������ьџџџџџG���������������������������������������#OyЂЦ№ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџы�����������������Bџџџџџ˜���������������������������������AsžЧіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ�����������������џџџџь����������������������������#Z‹ДчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўH����������������Рџџџџj������������������������*a’ХѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ�������������� їџџџз�������������������� VОєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџD��������������4џџџџn����������������9vЋуўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­��������������hџџџџb������������ F…Чіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј�������������–џџџџh��������E‡ЧљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџS�������������Лџџџџ…����&tИѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR�������������пџџџџœ�;лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџJ������������ ћџџџџеуџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮ�������������/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџp�������������Iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя�������������Rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџs��������������Rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџб��������������Rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј)���������������Rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў[����������������Rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџz�����������������RџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ�����������������NџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўŠ������������������/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрМ—sT/їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњk��������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўъЦœxS*���������гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюB��������������������� ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќфЛ‘h?����������������ЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ�����������������������фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяУ•l>����������������������yџџџџџџџџџџџџџџџџџџџџџџџџџџћ…������������������������ЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмВP"���������������������������Lџџџџџџџџџџџџџџџџџџџџџџџџџж<��������������������������‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоЌzD���������������������������������џџџџџџџџџџџџџџџџџџџџџџџї|���������������������������mџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьЗ€I�������������������������������������яџџџџџџџџџџџџџџџџџџџџџЏ!��������iІw�����������������>џџџџџџџџџџџџџџџџџџџџџџџџџќг`+��������������������������������������������ПџџџџџџџџџџџџџџџџџџџХB���������6љџн������������������ љџџџџџџџџџџџџџџџџџџџџљЪ‹R������������������������������������������������‘џџџџџџџџџџџџџџџџџеW����������пџџИ�������������������Юџџџџџџџџџџџџџџџџџк’S����������������������������������������������������hџџџџџџџџџџџџџџџЭX����������Рџџџ�������������������‹џџџџџџџџџџџџџіБh��������������������������������������������������������5џџџџџџџџџџџџџИF�����������Єџџџџe�������������������LџџџџџџџџџџёЁM ����������������������������������������������������������� љџџџџџџџџџђ™,��������������“џџџџџ7������������������� ѓџџџџџџќДO���������������������������������������������������������������жџџџџџџўЭe ��������������šџџџџџѓ��������������������Дџџџџџџˆ������������������������������������������������������������������Іџџџџч‹.����������������ЄџџџџџџУ���������������������aџџџџџџЉ������������������������������������������������������������������sџц—@�����������������Нџџџџџџџ„���������������������єџџџџџл������������������������������������������������������������������%@�������������������*зџџџџџџџџ@����������������������Ћџџџџџ§��������������������������������������������������������������������������������������Yѓџџџџџџџџэ����������������������IџџџџџџO������������������������������������������������������������������������������������ џџџџџџџџџџЄ�����������������������йџџџџџŽ�����������������������������������������������������������������������������������?мџџџџџџџџџџџP������������������������mџџџџџм���������������������������������������������������������������������������������›џџџџџџџџџџџџя������������������������ щџџџџў*������������������������������������������������������������������������������iэџџџџџџџџџџџџџ��������������������������~џџџџџ~�����������������������������������������������������������������������������Nжџџџџџџџџџџџџџџў5��������������������������ёџџџџй�������������������������������������������������������������������������MЫџџџџџџџџџџџџџџџџЫ����������������������������tџџџџџE�����������������������������������������������������������������������ZЬџџџџџџџџџџџџџџџџџџ^���������������������������� пџџџџ­���������������������������������������������������������������������yчџџџџџџџџџџџџџџџџџџџт�����������������������������Yџџџџ§"�����������������������������������������������������������������O­љџџџџџџџџџџџџџџџџџџџџџp������������������������������Зџџџџ›��������������������������������������������������������������Dœэџџџџџџџџџџџџџџџџџџџџџџџо �������������������������������%ѕџџџњ����������������������������������������������������������^Їюџџџџџџџџџџџџџџџџџџџџџџџџџџ`���������������������������������nџџџџБ�����������������������������������������������������XбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ���������������������������������Пџџџўq�����������������������������������������������$PЏуџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ:�����������������������������������ъџџџўr�����������������������������������77Vb~›Ккіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜�������������������������������������G§џџџџ–���������������������������������Зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџу��������������������������������������{џџџџџП��������������������������������CџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўE����������������������������������������ЄџџџџџщC�������������������������������7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆ�����������������������������������������Фџџџџџўœ�����������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџП������������������������������������������ ЫџџџџџџуY����������������������������рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп��������������������������������������������йџџџџџџџСA���������������������������Џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№3����������������������������������������������кџџџџџџџ§НC�������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјK������������������������������������������������ФџџџџџџџџџЭe ����������������������BџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјK�������������������������������������������������� ДџџџџџџџџџџѕžL������������������� іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјT����������������������������������������������������“§џџџџџџџџџџџѕДk1����������������ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјK�������������������������������������������������������]їџџџџџџџџџџџџџџѓЧ–rM8������:Ѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэ?���������������������������������������������������������1йџџџџџџџџџџџџџџџџџџџџњђђђђђђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџд&����������������������������������������������������������� œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋ��������������������������������������������������������������Jпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓh����������������������������������������������������������������� ŒјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџП$��������������������������������������������������������������������*Еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъe�����������������������������������������������������������������������>ЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјŠ���������������������������������������������������������������������������=Дўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј•�������������������������������������������������������������������������������#Šуџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц~�����������������������������������������������������������������������������������F™сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЋJ�����������������������������������������������������������������������������������������+oЎрўџџџџџџџџџџџџџџџџџџџџџџџџџџџс S������������������������������������������������������������������������������������������������DmЇУлччэччччЬР }›юџџџјвœe)���������������������������������������������������������������������������������������������������������������������&/*��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_freedos.icns��������������������������������������������������������������������0000664�0001750�0001750�00000063234�10443006270�016234� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��fœit32��&Œ����џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�—�Џ3е3<ууйСщ� к*№qeF$ !AaBџо� w6” ,>Ÿžк�Іt)‚ +0€86/* „)Њ�д�MM.JqœЎЙˆПВІ—ƒjK5‚#R+б�b9 € X†ВЛ”ПМЕ–n6 € H"Э�<R€9ВœПО’[€gхЩ�хЉ H–ОЁПВn#€y?Ц�кV #ŽОЅПГf =lФ�œ3WВЉПЇ;€юТ�ХvНЋПКsDП�И>ВЏПž! UKН�ЋoМБПЈ5 FнЛ�X ”ОГПИJ€+ˆЙ�Ъ–ЖПЙE€=№З�ЁИПЗO QUЕ�›–КПКC€�UД�\  ОЛПВ+ ƒВ�Й! sОПЎ)ьБ�PIНПП˜ hЏ�UАРПОo 3F­�[ŒУП�S€PПЌ�]\ФПВ'ПЋ�К 'ЖХП‘ ЖЉ�Ј „ЧП�T€�.Љ�D8НЧПЏ)шЇ�А ЁЩПŽ DЬЅ�L)TЪПО@KЅ�oЏЫПЄ:ЖЃ�пUЭП^ UЃ�HЅЭПД#>Ђ�х!aЯП| Ё�  ІЯПЛ*dЁ�?@НаПŠ#‘Ÿ�ј  …бПИ1ЌŸ�Х  ИвП‘ -Пž�N_дП2s�ъЋдПsG�':НдПЁ ’œ�orеПЙ' •œ�" žеПРL/Шš�ј!НжПu Ёš�HзПВ Kš�„lзПО#(š�L™иПRž™�1ЋиП{Ÿ˜�N +КиПž 4—�ђ IйПК(!щ—�œtˆПИ€Y\m„ЇОЧП�]€�—�Z†ПН†€ U˜НФП�Š€�`—�Ј†П d Q}€o&  FВУПГ-�?mH$Ж‘Œ�8- Л…ПŒЄяџљЛK +Ѓ…Пؑ—ВОДПЛ-�Hm:1"BД‰�№О„ПД" Фўџўёыђџџј’"Љ‚ПЉ[  AŸДПK… @Вˆ�+СƒП Рo ВџџёŠ&М€џЋ GН€П œ  xГП�w‚ 6IgqlG/-‡�{=РƒП"А?їџу14тдƒ'Пџџ§€ ЌПП­‘ф№яБ1 yВП“ &qЇИН€ПОЬ‡�M„П#~џџt)Цџџ‚5їџџі/ŠППKИћЃq€Фх@БПЅ fД„П‚ ?$‡�^S„П E Кџљ# #8х€џ~~ПЏzџЄ 5P„з)\РАПЗ"†…П‰ "вŠ�H]ƒПР Ъџиƒх€џšП— Эя#ќ›ЋЫ*КБП�“…П|I$‹�>hƒПВ Щџоƒ4њ€џ†ПчЏ  GO_џG ЁЙП‚ fЊŒ�>qƒПІ­џќ'ƒ�m€џ §AЊП}#э…ƒƒўH“ИПš"‘�@yƒПЋ€џџ‡‚у€џ С(ЙП—$э‚Ф№*‘ЗП“ '‡Ž�NzƒПР8іџя9 ‹ўџџќQ_ППЋ ва€ JќП žЖПЇЧ�e„П E ЕџџйsO\Іі€џМ ЃППОBbџŸHпјF$ЕЖПN ‡�„П$д€џ§ўџх.eП І lѕмЎнќ§€iЖП“ @‘�4„ПО_0п„џч=2ИП Оh VШћ§§ЁАЖПW ‘�>…ПОX ‡нќџіг‚ (­„П ^ HA “­ПЗЈƒПО#€’�<}†П Н}03&+Ї…ПОœ= 'š­П#+ƒПЙ’�}ˆПАh$‚ KБˆПОž|`[rЎ­П 6ƒПЂ“�B5“ИˆПЗ“fF@Y—МППЋSК‚П“�H  *ЗаП�M‚_МПŽ ™’�?y€XšМЬП’  lПІЖ”�'F  0{ИУПЙ[TКППО,з\ wОППО#–�л%ƒjЇРЉПЋЇН‘ПgoПМb2�‡* €Пn'$–�еƒ9uЈЙЂПОИ„9x‘ПЉB У��‘ ЄППБ&ч—�Ў … %IžЙР™ПРРАŠI�h’Пs е‚� &ЏППs(…–�ЊЇ  † (F`fr}‰–ЅЈЌЎВЕИЛЛМ ЛЙДАЋЂŽnQ*  В’ПЗ"€єƒ� О2ЎПЗ# —�$@ Y)Ž")//1€2/*! ˆ$ž”Пq3Ÿ…� б4ЖП{ %—� q IКЄ^/Ѕ :­•ПЋGˆ� Џ 8ЌОEKЬ—�š  xППМЈ‰X4  5ˆЛ‹П�ЗˆП\7\ˆ� ƒ!$—Ђ ™˜�NˆƒП РЎ˜‚q^H9/# Ž &3MuЈР‹ПГH_А…ПЇ t‰� Kh  LEД—�ˆE ‹О‰ПНЕЎІЄ˜’‹ƒ‚€vxyy€‡Œ” І­ЗОПМv1›„ПН?5H‰�?А+  f˜�KwНЕП…РƒПŠ є‹�еs&€б™�A XИЕП” ƒПН(+™Œ�KЅ к˜�#$ :ЅДП”€ ƒПmКŽ�Cк@X˜��xƒrЖАПДW  Ѓ‚П­~Ќ�Н+7ЊЎПŽ%€ T51Л‚ПFEЌ�t.ЌЎ3eВЉПМŒ= .њ�^%AВПtkЋ�9 žППЕ2 'ЅІПК†. €›В€�‡BО€ПŒйЊ�h >НПМ•7ƒbЎЁПНg'€Tэƒ�д w€ПЂ 7Њ� vnПЊE =€U‘БΘПРН­Š`%€ aе$„� ™Е œППД Ћ�„€‡€щ�”w,‚>r—Е’ПЙЁ‚U1ƒRЂ‰� [ 2ИПБ ;Њ�€8 €!U�щюA‚ 3Sj‡‰‘’–•’އqg]N9 ‚DЫі‹� UH_ПЃНЊ��~‚@М…�BІE›#MХЮ�W bљЊ�п€ YB‰�‘•q1&‘ &&g”�0 9Ћ�ˆxИ�fхf.E- +E.SкПyЬ—� €�rЌ�Ё Aš�–IѕщI_ъЁ�ˆ ŠЌ�UBЦ�c@џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�ј�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�—�О7ч3�<€у�лщ� $*№qhF$ !AdF�$По�#z7” -@Ђžк�Ћt*‚ .3€982,! „)Њ д�PM0Mw”ЈЙЧ‡ЯЩМАžŠoN7‚#T+б�e; €!\НЪ”ЯЬФЂr7 € I"Э�BR€:„РœЯЫ]€gхЩ�А LЁЮЁЯПu%€{?Ц�кW %™ЭЅЯСo =Ф�Ђ3ZПЉЯГ<€юТ�Х~ЬЋЯШyDsО�UПBРЏЯЉ! V‡Н�­uЪБЯД6 FнЛ�[ žЮГЯЦM€+ЬЙ�ЪŸЖЯЦJ€=№З�ЉИЯЦR QUЕ�ЊЂКЯШF€V8Г�\  ‡ЮЛЯП, „В�Й! xОЯЗ+ьБ�RKЬПЯЄ hЏ�ZМРЯЮv 3F­�e–ТЯЮW€RПЌ�^bФЯО(УЋ�К )УХЯš ЖЉ�В ŒЧЯ�X€�.Љ�D;ЬЧЯК*ёЇ�А ЌЩЯ˜ D3Ѕ�L*XЪЯЮAPЅ�sЛЫЯБ;ЖЃ�ёYЭЯd UЃ�HБЭЯС#>Ђ�"dЯЯƒ Ё�  ВЯЯШ,fЁ�@CЬаЯ“$‘Ÿ�! ŒбЯЧ1АŸ�Ь !ФвЯ› .?ž�NeгЯЭ3v�ЕдЯxG�'<ЬдЯ­ Ѕœ�owеЯЧ( •›�Њ" ЈжЯN/Ш›�"ЫжЯ~ Ўš�&LзЯО Kš�†sзЯЮ$(š�MЃиЯUЊ™�1ИиЯ‚Ђ˜�N +ЧиЯЉ 4—�ѕ MйЯЩ*"—�ž|ˆЯФ†]`sŽВЮЧЯ�a€�&—�Zš†ЯЬ€ YЂЬФЯ�”€�`—�Г…ЯЮk Q~p'  HРУЯР-�?‘‘HЖкЬ‹�8- Ч…Я•Ѕ№џљМL -Џ…ЯРЄЄОЮДЯЪ.‘o;1#EЙŠ�Ю„ЯС"!Фўџўёыђџџј’$З‚Я В_  EЉЮГЯO… Bиˆ�+Э„Я t ВџџёŠ &М€џЋ LЭ€Я Ѕ  ‚ГЯ�|‚ !9NlvqM/-‡�{>ЮƒЯ"М?їџу35тдƒ(Рџџ§€ ЗЯЯЙ ‘фёяБ1‚ВЯš &wБХЬ€ЯЮ™Ю‡�P„Я#…џџt*Цџџ‚6їџџі/”ЯЯNЙћЄr€Хц@ЉБЯА lР„ЯŠ ?!m‡�^Y„Я F Лџљ$ #8х€џ~‡ЯН|џЄ 5P„и)`БЯФ#„ЯЮ“ #вŠ�IdƒЯЮ Ъџиƒц€џšˆЯ  Эя#ќ›ЋЫ+ЧБЯ�ž…ЯƒI3‹�>oƒЯО Щџоƒ4ћ€џ†–Я‡чЏ  HO_џH ЎЙЯ‹ fЊŒ�>wƒЯВ­џќ'ƒ�n€џ §AЕЯ‡#э…ƒ„ўHœИЯЅ#‘�@ƒЯЗџџˆ‚у€џ С)ШЯ $э‚Х№+™ЗЯž '‡Ž�N€ƒЯЭ8іџя9 ŒўџџќReЯЯИ гб€ K§П ЈЖЯВв�f…„Я F ЗџџйsP\Іі€џН ЏЯЯЬEbџŸIпјF$ТЖЯS ‰U�…„Яš$д€џўўџх/jЯ В nѕмЎнќ§€mЖЯš @‘�6…„ЯЭd0п„џч=4ЦЯ Юp VШћў§ЁЛЖЯ[‘�D……ЯЬ] ˆнќџігƒ )Й„Я c IB ž­ЯФ•ВƒЯЮ#’�Bƒ†Я Ы…03&.Е…ЯЭЈ@ *І­Я—$,ƒЯФ'’�„ˆЯНn$‚ OНˆЯЫЊƒf`zМ­Яš 6ƒЯЋ“�B8›ХˆЯЦœjHC_ЁЬПЯЗ UЪ‚Яš“�H  +…ФаЯ�Q‚cЫЯ™ Л’�”{€\ЅЪЬЯœ  qЯАЖ”�'G  2ƒЦУЯЧ`XЩЯЯЬ/л\ €ЮЯЯЭ#–�н%ƒqГЉЯЮЖВЭ‘ЯmvЯЪf7�Ѕ+ ”€Яt'$–�пƒ;|ВЧЮЁЯЭРŠ;~‘ЯГ“F Х��•!ЎЯЯП'ы—�А … &NˆЇФЮšЯЮМ“L�n’Я{ к‚� )НЯЯz*Ж–�ЊЋ  † )Ien{…‘ŸЏЖЛНРУЦЩЩЫ ЪЧУПИЋ–uU, !Н’ЯФ#€љ‚� ЊТ4МЯУ# —�$@ ^* Ž#)003€40*" ˆ%Ћ”Яw5Ќ…� д6УЯƒ %—� q MЩЏc2Ѕ <Й•ЯИGˆ� Џ ;КЭKL3—�š  €ЯЯЪЕ^7  7ŽЪŠЯЮУЬ‡Яb7\ˆ� Š!&ЂЏ ›˜�Q‘ƒЯ ЮЙЃŒxbL>0# Ž '6R{ВЭ‹ЯСKdН…ЯГ v‰� ‡j PHН—�ЬE •Ю‰ЯЫУЛД­Ђš“Š…‡†{|€€„Ž”ЊГЛХЭЯЫz2ІЮƒЯЭC5к‰�CВ,  f˜�‡”€ЬЕЯ—Œ„Я“ ј‹�ёs&€ѕ™�A \ЧДЯЮš ™ƒЯЪ(-fŒ�RЈ л˜�5% ;БДЯŸ€ЉƒЯtЧŽ�Cк@X˜��xƒzХАЯР\  Џ‚ЯЙ~Ќ�Щ+:Ж­ЯЮ“%€ U52Ъ‚ЯIEЌ�t1ЙЛ5iОЉЯЪ’= /џ�b%CОЯzЁЋ�9 ЇЯЯС4 (ЏЮЅЯШŒ0 €У€�‡EЬ€Я–пЊ�h AЬЯЬš8ƒfМЁЯЫЈj(€Tєƒ�д }€Я­ 7Њ� vuЮДH >€YšПЮ™ЯЪК“d&€ aе$„� fЖ ЈЯЯН Ћ�„Š€ щ�Ÿw,‚Ay Р’ЯЧЊŠW2ƒRИ‰� [ 4ЧЯЛ ;Њ�€; €"t�*юC‚ 5Up†™› Ÿ›–†ynbO9  ‚Dа‹� UHfЮЌНЊ��€‚Bш…�FЊH›$OЩЮ�W fˆ Њ�п€ ZB‰�‘•s2&‘ &'g”�0 <Ћ�Ьx№�fщf.E. +E.WлПŒ3—� €�uЌ�Ё Aš�ЁI ѕIhЁ�‹ ‘Ќ�UDЧ�d@џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�ј�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�—�Э@�3Eѕѕчщ� $№viI$ "CfICщо�48 ” -DЇ­к�Бv+‚"2:=8/% „,В'д�UN2T€ КЫн‡чйЫРЊ”yU9‚$U+б�k= €#cŸасц’чцулДx8 € J"Э�HZ€<е›чцо­`€hLЩ�Ж TДцЁчд€'€}ПЦ� Z 'ЉхЅчж{ ?…Ф�Ђ3`гЉчЦ>€юТ�Я ‰тЋчоƒJsП�ЦGеЏчК# W‡Н�ИрБчЦ9 GнЛ�b ЌцГчлU€,ЬЙ�дЌЖчлT>№З�ИИчнY U™Е�ЦДКчоK€XЊГ�‹! “хЛчг- ‹В�ч" ОчФ/яБ�UQсПчЗ …Џ�lЮРчх 4F­�sЇТчф^€W?Ќ�bjФча+ЬЋ�Т ,зХчЊ ЪЉ�С ˜Цчц`€�1Љ�E@уЧчЪ- Ї�Ж НЩчЈ GІ�f-aЪчцE\Ѕ�tЮЫчХ>кЃ� _Эчo aЃ�HХЭче%AЂ�L"kЯч %Ё� ЦЯчн/fЁ�DIфачЂ%кŸ�*" ™бчм3ЖŸ�н "звчЋ 1?ž�Omгчт6y�fУдч‚H�4BтдчРвœ�o€ечл) ˜œ�$ ИечхT0ьš�#пжчŠВš�.Sзчв Oš�Žзчц&*š�PБичYЊ™�2ЭичЇ˜�N ,личК 6—�ј Sцичп-"*—�Ѓ‰ˆчи‘fh{œФцЧч�f€�4—�[Љ†чу€ aГтФч�Ђ€�`—�Ф…чцv Q‚p( LдУчв0�П�кЖH�™‹�U. л…чЅЅёџњНL 2С…чеЗЏЖвцДчс0+‘ r>2&FЙ‰�ц„чз$!Цўџўёыѓџџј“&Э‚ч Тe  IЗцВчцT … G‰�",сƒч ц| Гџџђ‹!(О€џ­ Rх€ч Е " Гч�†‚ #<Vu~zT3-‡�ƒ?уƒч"а@їџф45уд„)Тџџў‚ ЧччЪ"’хё№Г2‘ВчЅ '~Рйу€чцЇ Ю‡�V„ч#џџu*Чџџƒ6їџџі0ЅччTКћІrЧцAКБчТtа„ч– @/ˆ�^c„ч G Нџљ& %8ц€џ~•ча|џЅ 6P…и*fцАчз%„чцЃ #еŠ�Jnƒчф Ьџиƒц€џ›˜чЌ Яя$‘ќœЋЭ-мБч�Џ„чцŒKB‹�>{ƒчЯ Ъџоƒ6ћ€џ†Іч•шЏ  IP`џH ТЙч— gЊŒ�>ƒƒчУЎџќ(ƒ�p€џ §BФч•#э‡ƒ…џIЊИчЗ$к�AˆƒчЪƒџџˆ‚ф€џ Т*пчЎ$э‚‚Хё+ЅЗчА (УŽ�P‰ƒчу8іџя: ўџџќRmцчЭ дв€ K§Р ЙЖчФж�h„ч H ЗџџкuR^Їі€џП ТччтIbџЁMрјF&зЖчZ Œ�„чЊ$е€џўўџх1tч Ц pѕнАоќ§uЖчІB‘�:„чфm0р„џч>9лч ц{ WЪћў§ЂЪЖчa&‘�D…чтf ‹оќџід„ +Ь„ч j  JF А­чй Сƒчц$†’�D†ч с‘14&2Ш…чфЛE.Й­чЄ'.ƒчж4’�Žˆчгy%‚ VЯˆчпМŒpj‡в­чЉ 9ƒчЛ “�F=Јкˆчм­pMHfВфПчЩ#[с‚чЌ“�K  -иач�X‚kтчЊ “�?~€cЕрЬч­  {чРП”�6J  5кУчнg`рччт4с_ хччу$–�п'ƒ}ЦцЈчфЧФф‘чwчрnD�У,  €ч~(Ж–�ѕƒ>†РоцЁчфЭ“>Š‘чУ œL Ц��œ!Оччд*є—�З … &U“Зеф™чхуЮЁR�x’ч‡ у‚� -гчч†*Ж–�ЊЎ  †,Nm{ˆ“ЋОЫагжймоот пмйеЫЗЃƒ[.  #Я’чз%€ƒ� Ь8вчз& —�ЖC e+ Ž%*007€80+$ ˆ)П”ч€7Ќ…� о;зч %—� ! SрРk6Ѕ AЭ•чЫGˆ� С ?ЯхSP3—�   ‹ччсШœf:  :šсŠчузр‡чm9\ˆ� Š#*ДТ ›˜�QŸƒч уЪДœ‚jSC2$ Ž ';Z„Тр‹чжR!mб…чХ x‰� ‡mUJб—�ЬG Ѕц‰ч сзаЩЛЏІЁ–•‘†„€šЁЊЛШакхчт‚6ЙцƒчхI6Š�OИ-  l˜�‡™тЕчЃ˜хƒч  ‹�"v'€ѕ™�D bнДчцЄ Іƒчп+.fŒ�pБ с˜�^& ?ФДчА€Зƒч~мŽ�PпD[˜��zƒ†лАчвb  !У‚чЫ‚Ќ�е,@Щ­чуž&€ U85с‚чPEЌ�x5ЭЮ8qвЉчп@ 0��b&Dбч‚ Ћ�: Еччд7 +РхЄчцн—3 €Єі€�‹Hс€чІщЊ�h FучуЃ;ƒlаЁчпКq) €Tƒ�с †€чПDЊ� ~цФP  @€_Їдф˜чхнЬЁk(€ eи$…� Ж КччЫ Њ�‡šœ€#щ�Њx-‚E„Џа’члК—[4ƒUП‰� ^ 8очШGЊ�€@€(п�?ѓD 9X|“›œЄЅБ­ЅЁ›“ˆzlQ<# ‚FдA‹� ЊInфМЧЊ��ƒ‚ Bc…�Y­I›%QЯу�w  l–$Њ�ь€ ]B‰�к›t4&‘ ')g"”�0 >Ћ�ЬyF�tяg.E1 -E.^уЬ’˜�‡ €�wЌ�Ѕ Bš�ИIѕI}fЁ� ІЌ�ЊPЧ�hA џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�ї�t8mk��@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������377777777777������������������������������������������������������������������������������������������������������������ GpАггќџџџџџџџџџџџъгггsp1 �������������������������������������������������������������������������������������������������NЈзџџџџџџџџџџџџџџџџџџџџџџџџџџУ›E��������������������������������������������������������������������������������������������.щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯ{���������������������������������������������������������������������������������������\ЖўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙ:������������������������������������������������������������������������������������Sбўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњтi�������������������������������������������������������������������������������*ЁїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџД����������������������������������������������������������������������������qьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ‚�������������������������������������������������������������������������Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв(�����������������������������������������������������������������������Pзџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхk���������������������������������������������������������������������Pіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћt �����������������������������������������������������������������lіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ����������������������������������������������������������������wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ��������������������������������������������������������������NєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТ������������������������������������������������������������N§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ����������������������������������������������������������OєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ��������������������������������������������������������6љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХ������������������������������������������������������ЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃ����������������������������������������������������Эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџq���������������������������������������������������Ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъ,��������������������������������������������������Wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц$������������������������������������������������5ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮ�����������������������������������������������Фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}����������������������������������������������Yўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ5��������������������������������������������SїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА�������������������������������������������бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ9������������������������������������������‚ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн ����������������������������������������юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџi����������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџл��������������������������������������8љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\��������������������������������������…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ�������������������������������������єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ/������������������������������������pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|������������������������������������Ѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ����������������������������������*єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ…����������������������������������Kџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа���������������������������������ФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR��������������������������������ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅ��������������������������������bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџі(�������������������������������Їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџr������������������������������Эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн�����������������������������)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?�����������������������������cџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘�����������������������������Œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт����������������������������ЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџE����������������������������яџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›���������������������������єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ��������������������������Tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ��������������������������žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџW��������������������������ЗџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ�������������������������Йџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџг������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя#FЃбџџџџџхq������������#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџууџџџџџџџџџџх�����������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ����������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_����������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНl����������пџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёD������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭE��������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТ���������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ����������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс�����������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџE������������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœ������������������‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа�������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§.��������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ���������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўM���������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя����������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя����������������������[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ��������������������� ДќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџT�����������������������AфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёNЬџџџџџџџџџџ|�������������������������sєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�"ђџџџџџџџџџШ�������������������������Pљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў��Fјџџџџџџџџџw��������������������������‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�����Zџџџџџџџџџъ�������������������������Єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёd�����›џџџџџџџџџ„�������������������������Їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн(��������_іџџџџџџџџ0��������������������������$іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„�����������Gђџџџџџџџи ��������������������������wўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџф�����������Hаџџџџџџџˆ���������������������������†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџt������������Ўџџџџџџџ>��������������������������Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэ�������������{ѕџџџџџ���������������������������}хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}��������������%”їџџџэ����������������������������ЇџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫ���������������"ёџџƒ���������������������������+шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџJ�����������������&jЇ\���������������������������Їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹�����������������������������������������������+іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИєџџџџџџџџџџџй�����������������������������������������������tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёh�>яџџџџџџџџџџђ����������������������������������������������эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ���@єџџџџџџџџџџR���������������������������������������������BўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШG������NџџџџџџџџџџR���������������������������������������������aџџџџџџџџџбдіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёТI�������‘џџџџџџџџџR���������������������������������������������Њџџџџџџџџе�0‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§$�����������—џџџџџџџџR���������������������������������������������ФџџџџџџџЯ��� mТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљвr��������������ЩџџџџџџџR���������������������������������������������џџџџџџи�������6п§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§Ю|/������������������ пџџџџџј1���������������������������������������������aџџџџџа������������aТФФїџџџџџџџџџџџџџџџџџџџџџџџгБ_�����������������������_љџџџџю����������������������������������������������їџџїˆ������������������#(„ŒŸяяяяўџџџџџєяяяŸŒƒ(( ��������������������������dћџџџš�����������������������������������������������}џЯ6�����������������������������LSSSSS������������������������������������ŸџџџH�����������������������������������������������h ������������������������������������������������������������������������� ‹сЪ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_openbsd.icns��������������������������������������������������������������������0000664�0001750�0001750�00000106037�10443061320�016233� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��Œit32��L����џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�Ћ��ќ��ќ��9ѓ��…�P ч��‡��'…�z(ч��0‡��V…�ВV„�о�H†��|„�&ф›„�з�‚�‡†�“.‚�ЕшуJƒ��Kй��Dƒ�Еt„�‰‰�,MŒоъщщшДsH�nˆ��Э�C0‚�‹эВM >„д‘ээ€ь ыыъъщшшˆ�Љ‡� .Э�’‚��–ю ушяя8“ю8dююэ ььыыъщg,Ч�„�ŒЮ�|>€� ия„№Ё№†ярю€э ььщ"€й�pŸ3�|РЯ�&Й�š№€ёђъЭђо Её№№tяяююээКкр�ƒчцЌQ ‘пЉа�УSб€ђ№щђђѓѓЯяђђ\\ђђы)€№яяюOƒэх ‡щшчцфктŸ‡а�yз  ђѓѓчRє”l€єаэѓЫхђёё№ЌMьэь}ыъщчцхфЉЮ� N4ѓ•пєѕєЉ€ѕ`лѕбєš Иѓђђп~ы№яюoьыъшОчхфЮ^Ы�ФН юѓPTѕѕіM(ђііЯƒіѕѕhZŒєєѓ€ђё№я(jэьыВsшчцфтЖ+У�C�$ЯєяЫѕюFїї ˆї6ЏSѕѕєєѓ€ђ№7Mюэр(ЛщшчцфткТ�oДF9zшєѕѕCЊїїђx’їЙ@<щƒј€їюя!ѕєєѓђђзйяэMшыщшчцсP$VЙ�;A„�ъѓєєѕѕііd їїјјѓјъ+–rƒљ€ј Л;їCЦїііѕѕєє€ђ№ HэьыъшйG/ЦЙ�|’ƒ� Тєѕѕііїїc €јљ4я"бњљ€{ј”{€їііѕѕєѓђСqyюэьыЋ\мЕЌЙ�{б>� вѕѕііїїјль€љњKіš9ї„њRпљь=їјїєііѕѕєъ)’nЅяювR?Вшчw4тžƒ�%Б�gы€��hєіїїcтјјљљ„њ`їјK|ƒњ№†€њІпјј–Яїїіє^iђKЩ№яЫдьыщшDsутw€�4Š.Г�fёХ4‹э€їz'мљƒњ€ћ aїћё]тћћбЬћёю‚њљљBЭ€ї…nђє/фё№яюэьъшЇхус“iyДб6Е� cђѓ˜"€рјыЬ€њћќќrњƒќЁhќћњзхјјшЮіѕѕѓђё№яээыфицфтспнлgЗ� vѕіђЎ].mљИЉ€ћ‚ќ�•„§oћ€ќ€ћњњ_(фљјјїїіѕєѓђё№яээк%шчхутрЯЫ З�Дїїјјљ€њlWzє€ќ‡§њ:gЪ§ќћћДS’Ењљјјїїі-ѕєђђ№яюэгTщшцхтсy)Й�жјљљњ єGпg%t‹§§€Ш„§МTЧk§ ќќА;ыЫXњњљјјїїVѕєєђђ№яючОъщчхфтг Ў�N8� #�4єљ€њ ћћќРЧыЙЬ§§y)єƒ§_Ђќ3р‚§ќћќњ>€њљјјїъіѕЉгђё№яээыъРНхус]Ў� ЕЬ„SK}піїмƒ—€њћћ€ќSі‚§™Pkќ‚ўМђўгЁƒ§€ќћћ€њљјјїїТ5ѓѓђё№юэш|4рцфтЗЏ� МђђєѕѕїїјјˆIњњћћќќ§§ЉЇ€§ўў­ХYšћџ‚ў„§ќќћћ€њљјяˆ”ѕєђђ№яЯ7�sшцхус,Џ�нѓєѕіїїјљљтњћћќќ€§ђb§€ў џЫtџѓœљџџћџўƒ§ќќћћњњл{'aIчѕєѓђёЈOB ЧчцфтxА�]єѕіїїјљ€њ ћћќќ§Еї§§ўў€џЯg‚џыj„џ€ў§ЉќќћћњтХ№ђ\їіѕєђž­њэ40тцхтКА�чѕїїјљљњњћћќќ§§’4л€ўџъv‚џЩCд„џ€ў§їqG§ќќћ€њљЗ›їїѕєІгўџўрiчхурЏ� ђіїї­Ѓђњњћќќ§TМ„џ�ќ‚џь–џ�ћџ ў№pжђ§ќќћ€њ…уїїіСШў€џ ќЦ ЈцфтT­� AѕїїјпeОќќ‚§р "qъˆџzџќ€џўGйџвє§žп§ќќћћњњіљјїчzїў€џ ќѓˆзхт| ЌЌ�uіїїјљуT�)tЕђ§ї§ў†oБKNќ…џќš‚џДЄˆ‚џўўцј§§ќќћ€њљјїqлєћўџўљюк0aху™ №ЙЋ�Гїїјљљњљwe15Fпџј-ъџўџЊўгƒџўў§ќќћњњљљф лфзИ™„np‚pГфЇфўЄ�M€� ыїїјљ€њћЎа§§ўў€џ•š™џ�ў§ќтњљž K) �! <=��.тЕ�pЋЬBЄ�Œ›I !Ki}ŽсњћќќЎ$ё§ўў€џЪd™џўў§§і€=њћњњљs�RЭіњўџ U LЕ­7(І�FйыМuas“эњћќќ§‚{ўўџўФџїћˆџўў§‚Ц‚ќћ€њЙКŒџ ѕoTЮН�вхŸ ЩфiЈ�Љіїїјљњњћќќ§§љCљў„џ�і‚џ‰ƒ—ƒџЊa‘ѕƒџ–™џўў€§ аќћћњњљі}џ ��-ц�Іцœ� ƒЉ� xѕјјљњњћќќ€§ЇЬƒџpg|ќџšЫљƒџИБсјƒџmж§џўў€§ќќћњњљј*Iџ ��.ц�‘ц›��uЋ�_іљ€њћќјї§§јчƒџхfњ‚џњ……џ�њ…џ�х€џўў€§ ќќћњњšr' п€џ іoNбу�‡ц“�Ц–�0,Ž�pљ€њћЋ/и§§ў€џЛЯ€џЭ­ƒџ�ў’џўў§ ќћњњОƒLIЇљџЖ�чœ�~яц”�?ДежикФh‰�+ЕXЊњњуIИ§§мƒH(%„ћџ�јšџ�ў§ ќћћњњљј№ЏK�#Ж€џq�ЩчЄ�vџЌ”� NджжйлнпЖ$ˆ�Нїїx"ёЎWч§§ъL JвŽџОЈџўў€§ќќћњњљјїїѕР2˜џё&шчЩ�Pќ;Q~’� cǘ}ŽЯптжD†�юїїјРцЮ]`К§§ўёЇLžџюјџЎЬџіgў‚џўў€§ќќћњњљјїїѕѕяsП]�žщчхU"еи]“� +МйнптфрS…�іїїјљњњћќъ‰§§ўўџ§pВ’џцњџўэџёДўў€§юќћњњљјїїѕѕѓђW�-цщчцm��xлйП’� Ќйлнртфцхa„� *іїїјљњњћќќ€§ўўџџ§ы‡џїћ’џvзўў€§‡жћњњљјїїѕѕѓђгЧыщч~ �7ЌжU“� ?yyuvПцчшk� *іїїјі}хћќќ€§ўў‹џ…ј”џўў€§Рщћњњљјїїѕѕѓђё4Aэыщ†4жііЧWžГ“�Шнптфцчщы��‰+іїїнFiњћќќ€§ўў„џ�ћ‚џСƒћ‚џ�ЩŽџўў€§ќќћњїљјїїѕѕѓђёd%эыФрџўq!е7”�3жптуцчщыэЩЃДюв9ічŠљњћќќ§§ѕЪўƒџшv‚џљžГџЁ‚џ�тˆџўў€§ќќћњЬnЭїїѕѕѓђё эщ6ЎƒџуХˆ•�aптухчщыэюяёђђub+byићќќ§§ЌŒў‚џќ@Ѕљ‡џрZсџќaƒџљњ€џўў€§ќќћњњяbВїѕєѓђ№c$ь{aџЕџџј�ФШ”�Џтухчщыээя№ђѓѓарђэСd—ќќ§ѓ-аўƒџіВˆџйџіІƒџfy€џ�ў§ќќћњєbРїѕєѓђ№@T˜/ѓ€џЛtџџХЬж1•�qwƒжщыьэя№ђѓєѕїїјљњШлћќ§b\§ў‰џ�ў’џœ№€џ�ў§ќћњњяпїїіѕєѓђъ тџџў–Aєџџa1жж]–�НСШщъьэя№ђѓєѕіїјљ€њћќ.ю§ўў‡џ›Л–џўў€§ќќћњњљљјїіѕєђђК�'дџёЈ@BѓџџЬжж~–� ншъьэю№ёђ№ђіїкѕљњњћ˜6ш§§ўў€џkј‚џ шћёбЦФГЧрўџќЙ—Šџ$ўў§§ќќћњњљјїїіѕєђёe� * ��MљџТ#'вжж—�qфцшъьэю№ёђ‹иіі9цљњњ3ьњФЄЇхџЦyƒџ ў€ MS* П‰џ!ўТт–§§ќќћњњљјїїѕѕєђт�EФгЭЄq �p€ж�—� ЮцшщыэюяёђнйѕМ,јљљ‹М}! 1[mЦі`ј‚џўh�9п€ћ№ЩЋœЌгч‰џўєs‚§ќќћ€њ љјНВѕєѓђy��B‚џ -цВo€жp�Š7•�eхчщыьэя№ђ‡pѕGЁјљ‡R†Сѓ€§ўdЊоњџЄ�!ьќ€ў§ћјђырЦюџџшеюр€џўў§§ћ§ќќћТњљјјиьѕєѓй TDёџѓtџџdB€жCфь3”� Б‡ˆъьэю№ё‹\”Oїїј Аьћћќ§ #AXFВџџ§'Ўќўџ §њія–hиџџўokф€џўў€§ќќњіsыљјїїіѕєёNZюЩЗ‚џ €џџС Южв 0ї§а”�*Ушуыэю№ёЙНїїјљњъљћќќ€§јўў‚џО�[њ§‚џўќэkRч‚џіЙ€џўў§ќќгEdЯљјїїѕєѓ—пюэ9y‚џ ЫџџэЁжЌ�jћџџc”�л‰Њыээяв~�I8ОјјљBХћћќќ€§нЊўџaфћўƒџп)‡§‡џўў§ќќћћР!БјїїіѕєПМяэь„3…џ ч”жm�­њџџц”�*Тщъьэю(��Кь†!№ј›нњћќќ€§ “‹ўўџџч Ѓѕњ§џў№&‡џџя…џўў€§цЯќќћњњШОјїїѕѕзr№юэьЧр„џ Э�БаГђ№­ЗЙ“�Dцшъыэс��eєѕіїцY€њћќќ§іа€ўр([ыѓѕх€џхл`P§Тдo„џ ўў§оЂ§fŒќћ€њљјїїіѕъ/^ьяюэычƒ„џ Š еx�!qЉэv†Јy’�оч˜ъь €�& рѕіїgнљњњћћќќ‚M§§ўН:ЧДэИМ§њџЂВцџЊEєƒџўў§§ћd€:ёћћњњљљјїїѕѕиЖё№яэьыщXђ‚џѕ#PЙ €�mX7•�ЁfЮъы<�,kєѕЕ їМKжњћќХф§§—>ЭŒо†œфљОнŽЙџџтЗџџюычВўў§њ[Aћћ€њљјїїіѕєѓђ№яюэыъшS�cџњ_З(ž�8Щшщ ‚�гщF“0Rз€њь.Нќщ–} y“–Ї‚ёВЭ<‹„џцX‘–ў‚§ќэaћ€њљјјŠїѕѕєђё№яэьыщІ€�`ЈЂk Ћ:Ÿ�`хчФƒ�]j�ЃјљљњљQx­^[­тц{ 'O| ў‚џ€ў‚:є‚§"ќќћшњњѓАјјїPђѕєђђ№яЖэьъш?)œc ��"qФ? �?фЉ„��Рїїјљљv� €хќќ€§њФEDН‡ўЕ‰‚§ќќћћ€њъs`яїWпєѓђё№э!еыщЭУтсйЧЮзЮ;Ё�'U‡� Ќѕіїїјƒ&›єњћћ€ќƒ§”І§їч€ўљі§єш€§€ќћћ€њљљјОQэЙєђђ№яэZƒъш—FутЉ­мйЧ2Џ�Tєѕѕ€ї ГєЉєњњћћќќЫЊ§еzљ_й€§D„§ќо˜€њљљјїїЕLЋŽђђГьэЫ+шч‡ЎтсЅPкЦ'А�лєѕѕ€їј@пњ ћћаsќќ§§єMб§њ6шцО§§ќќјcПћ™њњљљј€їѕ–2ZђёЖk5Їы_Јцуутпе"Ц&В� Fёєѕіїїі!їљ‚њЪa€ќлѓ œƒ§ЄGЊќ"ћј_Є–Бњљјјїїіѕѕє|ч№яэеA=ЂIхфзоомLД� …ѓєѕѕїЦ:јјљљ€њЊfћєoІљƒћƒќу/Bќќ€ћ!њњїD2Рљјјїїіѕƒєѓђ~ВяюэьщjПтm"}гŸД� Гѓєѕѕ{lїјј€љњ†щRдћƒќљЅ€ћ‚њнПјјїїіѕѕ?ыђђ№эюэьмщчq�WтрЗ u#В� Ж=Сѓє№Ђ€їјЩтљeš>Я‚њћњ‚ћ€ыƒњ€љЙжїїЉЉѕѕєbрђ№яюэьыŒхчх„ФонRЕ�@ХЏКѓž�ріїёg!кј0<Ђ„њ^и‡њ€љјјїр*СєѓО№яюэьыъ‘Ѓцфт ЅнзEЕ�~­>�� %.єѕѓUиїъ_јј€љ€њЏH€њnтњљљјК€јїлїїіѕѕй8ЩђžšяюэьыъщОHфттпомsЕ� ‹ƒ� tѓэYЯіїЕ5яјn€јљ5яљЮ'ѓљ€ј!qЂїїђ-іѕѕєєѓЭ,иТpюэьыъщчхЧтронЋД�' „�РюQ�—€ѕрцїїIцї‚јnИјaІ€ј їїс%щїХ5ѕѕєѓ€ђЄ/кJэымъщчцхQxронУ0lМ�!юe�'ёєє€ѕііVЏƒїЁxш1іƒї!pѕŸjєєѓђђё№яVT<ьуI*Ецхуš$нна+�С#Л�r|��Bцђѓ€єѕѕi€ії”шаA‘„ѕї€і$ѕѕкьˆ•ѓђђё№№эьивъшМ2zттоЃа3��B~Й�|€� Л€ђѓєєl`€ѕВJѕє0йyнѕєєQЂhЕСч№№яю•aь”�žшчцжHдпlC*‚�Й�‚�ёђ RDєєцШєѕ&8єЌn€єѓыкЇREХ‹Iэяюэƒfыш+pчцфу’�,ЬСЪ� Rкёёю)ђђqP€ѓG‹ѓэп€ђMъгяWrээьhnщшАDхфттй �#ЛJЫ� iУ�ёл Х€ђ%­мђђM{ђёёK^№N�нюШ Еьыdmшчц‚фттро2��™Ш� cu ��#№vF…№|ь№юŠю�Щэь‚-чщclцхфутсплƒ€�'EШ�tФ=�9щБ…яž�Јюи�ЗэХцыъу˜чuTхфттсе|ƒ�2 Ч�~q‚�WЃ�'xЧƒэЎ�VэЏоьцІъщщшk.х†<утсЫt†��)Ч�~ ‚�kJ€�'pЗщььЇ�ц†!ъъщщшшчцŸ�Д›ЪŽE�†�Ц��2ƒ�p„�Jƒb��ЙbKщшшччцххЋ�]Б���^Ÿи��.‹�€G?’ІЂ‡jR?�Щ€�xФз��ƒ�šD‚�S-‰�Є�~Oо�ХJ‚�0�Lœ‚�a3‚�aо�С‚��TХЖ�Rƒ�о��‘ƒ��‚� Л‚ƒ��Mц��QŠ�^ƒ��(ц��Š�>"ƒ��є�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�”�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�Ћ��ќ��ќ��/ѓ��…�C ч��‡��!…�g"ч��)‡��I…�—I„�о�> †��l„�!У„„�з� ‚�u†�(‚�ШФ@ƒ��?й��;ƒ�žf„�xx�'D{ТЬЫЪЩœd>�]ˆ��Э�:)‚�{аžD 7tЛ€бааЯЯЮЭЬЫЪЩШu�‘‡� %Э�€‚�†г€дЫЯее2ƒе2YдггвббаЯЮЭЬЫY&Ћ�„�rЮ�n6€� Тж‚зии‘зy€жеШггвбаЯЬoМ�`ˆ+�fЯ� "І�ŠийкклдКлЩ ЄйизhжжегвбЄ ПУ�rШЦ“E yЙ‹а� ЏJНлммкгм€нМйнмTSмме%иизжедGtаЩvЪЩЧХТИО…pа�mУ ‘нногKпˆc€пПинЙалкйзšEггбmЭЫЪШЦУСЮ�G/нˆЬ€рœ€т!YЪттсс…Рр ЈнммЪrгзждbЯЮЬЩЄЦФТЎOЫ�В­ йпIMттуG$пффП€ф€утт`R€ппнммлйзж$^баЮœdЩЧФТП™$У�<�!НплЛтмAuххx †…цххф2ЂMсрппоммки2EдвХ#ЃЫЩЧФТПЖТ�dЃ?4pдрст=ххсpˆч­<8к‚ш€чцоо€тсрпнмлУУжгEЬЭЫЩЧФПCGЙ�39„�днпрстуф\•цччшфщм(Œkƒъ€щЏ7ц>Ихфутсппнмли @бЯЮЫЩЛ=(ЇЙ�m€ƒ� Бпртуфхц\–шщщъ1с ХыъxsщŠsццхфутрпомЏelгбЯЮ•OМ™ Й�lК7� РстфхццчЮо€ъ ыыььFщ’6ъээь ыMбъо9ччцуфутспе%„d”жгЙH7šЩЦf,О„ƒ�Б�\гt��_сухц\гщщъъыыьь€э[ъьGv€ю€э у~ьыыœбщшŒСцфусV`нDЕзжДЛЯЭЪЩ:bРНd�)n%Г�H\лД/€лхцчr%Яъыььээююяя\ьяцXзяяЧТяхтээььыъъ>Рчцх{eоп+ЯкзжгбЯЭЩТПНzVb’Ї+Е�ZнпŒwвщнРьээю€я№№lюƒ№™c№€я"юээььЪзщчиПутрнмкзегбЯЧКФСОМИЕВSЗ� lтфсЃX+gъ­Ё€я№ё„ёjя€№"яяюээY&жъщшцхфтпнмйзеваП ЩЦУРНКЊІ З�ЇццшщъыьэfStш№№ёё†ђя7cСёё€№яяЋOŠЋыъщшцхф)рпмлиздвКIЪШХТПМd"Й�ЧшъъыьэюшDеb#o…ђђzР„ѓДPПf€ђ!ё№№Ј8рСTьыъщшцхPтромлижгЬІЬЪЧФСОА Ў�E2�  �1хъыьэюя№З„ёсБФѓѓt'ъƒѓ[›ђ1зѓ€ђё№я№ю;эьыъщшцйут›РмкзеваЮЫІЂТПМMЎ� ЁЗwKDrЭухЭ{Žыьэюя€№Pыђѓ“Mgђ‚єЕщєЫš€ѓ€ђё№№яюэьыъщшцхГ0онмйздвЬl-СФСΘЏ� Љлмпстхцшщ€Eьэяя№№ёђЁ €ѓєєІŠОV”ёѕ‚єѓђђё№№яюэьыъщп~‰рпмлижИ1�dЩЦТПМ$Џ�Щортфцчщъъеэяя№№€ђщ^ѓ€є ѕУoѕъ–яѕѕђѕє€ѓ€ђ№№яюэьЮs%[Dетромй—I< ЌЧФСНdА�Uпсухцшъыьэюя№№ђ­эѓѓ‹єє€ѕЦc‚ѕтf„ѕ€єѓѓђђЁ№№яюэжЙтуVхуспнЄэп1*УЦТП›А�дтхцшщъьэюя№№ђђŒ2в€єѕсrѕіТAЬ„ѕ€єѓэmDђ№№яюэыъЌ‘цфтр˜Щєѕѓг[ЧФРМЏ� пфцчЂ™фэюя№№ђђѓѓPД„ѕ�ѓ‚іˆуііѕѕђѕєчlЮ|шё№№яэьы}ечцуБЛє€і №Е ‘ХСОF­�;тхцшб_Е№№ёђђѓѓз !mс€ѕ…іuіѓ€іѕDаѕЪъѓ˜еђё№яюэьчъшцжlцѓ€і №нtЙТПh Ќ�lуцчщъеP�(o­шѓэѓє€kЊHKѓ…іє”‚іЎžƒ‚ѕ"єєняђђ№№яюэыъщчiКпяєѕѓъеВ&SФР€ кВЋ�Ѕфцшъъьэˆqa/3Cзѕю+сѕѕіЄѕЫі‚ѕ!єєѓѓђё№№яэьъъе rБШЦЎ’}eahY™Сає‰Є�E €� йхчщъыэюяІЧѓѓєє€ѕ””і‚ѕ!єѓѓђђёиююэыъ• ; �! <=��'И�_›Б5Є�~ŒB Fbv…еэя№№І#чѓєє€ѕТ`•іѕєєѓѓыz:яяэьъl�RЭіњўџ U Bš“7(І�@Ци­…m[l‹рюя№ёђ}vєє‚ѕ�Ніюѓ„іѕєєѓ}Н|№яэьыЎЎŒџ ѕoTЮН�ЕФ‡ ЩфiЈ�›ухчщъыэю№№ёђяAяє€ѕі�э‚і„~’ƒіЄ^‹ьƒі“ѕєєѓѓђЧ№яюэыъц}џ ��-ц�Х„� ƒЉ�oфчщъьэя№№ђђѓ Фѕііlcwѓі”УёƒіБЋй№ƒіiЮѓѕєєѓђђ№№яэьъщ'Iџ ��.ц�}Хƒ��uЋ� Xцъыьэя№эьѓѓюо€ѕ€інcё‚іё€…і�ё…і�м€ѕєєѓѓђё№яэь‘k$ п€џ іoNбу�uЦ}�Ц–�&#Ž� iъыэюяЃ-Яѓѓє€ѕГЧ€іЦЇƒі�ѕі€ѕєєѓѓђё№яюьГ{G IЇљџЖ�ˆЦ…�~яц”�2ЉЊ­Б V‰�'ЈR ыэиEАђѓг~E'#ђі�№–іѕєѓѓђђ№яюэыъшрЂE�#Ж€џq�ЎЧŒ�vџЌ”� >ЉЊЊЎВЕЙ™ˆ�Ўхцp уЄSмђђрI GЪѕіЗЂŒі€ѕ єєѓђђ№№юэыъщцхтА.˜џё!ЪЧЌ�Pќ;Ae’� O’yesЊЙНЕ:†�мхчщДйУ‰Y[Вђѓєш I˜іхяіЈХіэdѕіі€ѕ єєѓђђ№№яэыъщцхтркhП]�ŠЪЧФU­­J“� "p—АЖКНСПH…�ухчщъьэя№пƒѓѓєєѕѓkЋ’іоёіѕх€і$ѕш­єєѓђђу№яэьъщчхтролO �(ЩЪЧФ\��bВЎ—’� ˆЎВЖКНСФЦT„�&уцчщъьэя№№ђѓѓєєѕѕѓу‡іюѓ‘і$ѕrЯєєѓђђЬяэьъщчхуромОЏЮЪЧl �,ŠЊC“� 3bcbcЂФШЪ]�&уцчщчvйя№№ђѓѓєє€ѕˆі№‘і€ѕ"єєѓђђЗояэьъщчхуромй/:аЮЪt2ЭььОS~Ž“�ЃЖКНСФШЫЮ~��}(ухчаBcэя№№ђѓѓєє€ѕі�ђ‚іК~ђ‚і�Т‹і€ѕєєѓђђ№№яэшъщчхуромйZ!аЮЊж‚єlЉ,”�*АЙНРФШЫЮбГ’ЃиП4узx‚ыэя№№ђѓыТє€ѕ€ірr‚і№™­іŠ›‚і�к…і€ѕєєѓђђ№№яэРgРцхтромйr аЬ/Іƒєйœl•�PЙНРФШЪЮагжймнl[ (\rЬя№№ђђЅ‡є€ѕііѓ>Ÿё‡іиVйіѓ^ƒі№№€ѕєєѓђђ№№юэыр\ІхтромиY аl]є­єєэ�œŸ”�‘НРФЧЪЭагжимооПатпЖ^№№ђщ+ШєѕііюЋˆˆібˆіэ ƒіct€ѕєѓѓђђ№№юэц„\Вфтрнми:K…-щ€єГnєєМЂЊ'•�^epИЪЭагжимнртфцшъыНая№ё^Xѓєѕ…і�ѕ’і–ч€ѕ#єѓѓђё№яюэсвшцфтрнлв иєєѓ>ъєє\'ЊЊJ–�l ЄЌЪЭЯвезлнптфцшъыьюя№‡,фѓєє€ѕ„і–Е“і€ѕ$єєѓѓђё№яэьъъчцфспнлЇ�&Ыєц >>шєєУgЊЊd–�mˆОЩЬЯвезкммпуцЬчъьэя‘4ођѓєє€ѕgя‚і рђшЩПН­РиѕіѓВ‘†іѕ$єє‰ђђ№№яэьъщчцуспмк[� '��JюєЙ!ЇЊЊg—�_ТХЩЫЮбдзкмЧух5иъыэˆ1сяМž— мѕОuƒі ѕ| HN( ­†і€ѕ!єКйђё№№юэыъщцхтромЬ �BНЫХl �Y€Њ�g—� ЏФШЫЮбгжймЩЦтЎ)шъы„Гw /WiОэ\юѕіѕd�6вюяяуМ‹“ЊЪ…іѕєъn|ђё№яюьыъшАЄтромn��?‚ѕ™,нЋX€ЊY�p0•� UФЧЪЭавжил{gтB–шъNИщђѓѓє`Ѓеёѕ€іž�пёѓєєѓяшмЮЛž„ціірЮхи€ѕєєѓѓёђ№№яИьъщчЩкспнХ K<чѕщoѕѕ`4€Њ5Шй0”�( —tuЭЯвезк~TˆIхчщ–Іпюя№ёђѓѓ‡"?UCЋііє%�Єёє€іѕѓэуе€dбііѕkhл€ѕєєѓѓђё№яъmоъщцхуспмGQдВЏ‚ѕ {ѕѕЙЃЊЇ+цђШ”�#ЈЩЦЯбдзйЈЎхцшъынэя№№ђђѓюєєѕіЗ�Tьѓ‚іѕ№оaOп‚іэВ€ѕєєѓѓђђ№№ЩB_УъшцфтроŠШгб2t‚ѕ Уѕѕу€Њ‰�`эіі_”�Лv“ЮагжМr�B4Бчщъ>Кюя№ёђђѓеЃєѕ]гэє‚іѕе'‚є‚і‚ѕєєѓѓђђё№яюЖІщчцуспЎЉжваt1…ѕ оuЊW�™ыѕін”�%#ЇЪЭЯве$��Њи{пш‘аэя№№ёђѓ†єєѕѕо ‘тэѓіѕч$‚ііц€і‚ѕєє€ѓмЦ№№яэьМГшцхтрФgзевЯЎз„ѕ Х�ŒЅ–муЅЌІ“�:ЦЩЫЮбШ��\ртфцжTыэюя№№ђыЧ€єз'MЮочкѕіінв]MєЛЭkіƒѕєєѓеœђb…№яээыъщчцусж+UежгбЮЩ}„ѕ …Љ_�Zвju‹a’� ОЧ„ЬаŽ€�& Эсух`аъьэюя№ё|JѓѓєЕ.ЂœеЋВђ№ѕœЋоіЃBыƒѕєєѓѓё`z7цяюэьъъшцхтрЦІкзеваЭЪLщ‚ѕь"?“ €�YH-•�ŠXВЬЮ5�,bптЇ•шБGЪэя№Лкђѓ‘1ЃpКuдыЕг‡ВѕѕйАѕѕхтоЋєє€ѓђяW>яяэьыъщчцуспнмиждбЮЬЩG�_ѕ№[‘ ž�0ЌШЪŒ‚�СеA‰-MЪыээс,Дёпx `uw‡ysйЄП8…„ѕнU‹є€ѓђђ№т]яэьыъщчфтромкзеваЭЪ€�\Ёœgˆ.Ÿ�QУЧЊƒ�Ua� ˜шъъыыMrЅYWЅимv Dl|є‚ѕ€є}7ыѓѓ€ђ"№№ямээхЅщшцKрспнлижЂбЯЬЩ6#„S ��Yœ2 �6Т‘„�� Вццшъъo�zк№№ёђђ№М|BAЖ‡є)Ўƒѓѓђђё№№яяээымlZпхQЭпомйзгМЭЪВІОЛГЂЇЌЄ/Ё�!H‡�žтфцчш{$’чэяя№№ё€ђ€ѓŽ ѓюо€єяэѓыо€ђ#ё№№яяээыъъшБLлuЉомлзжгPsЬЩ‚;РНŽГЏŸ(Џ�MпстфццЇхŸцьэюя№№СЂђЬuя\а€ѓ‡A€ѓђ�ё€№ гэьыъъшццЈFмлt вбВ&ЩШs”ОЛ‰AБŸА�Шпстфцчщ<быьэюяяЦn№ёёђщI‡Шђ,я4омЖђё№№ь^Жя‘…ьыъъшццфтŠ.RмйЃ_/“ЭS’ЦСПНЙЏ В�@мпсуфццшъыьээюР]€№аш •ƒђ–DЂ№"яьZœŽЇыъщшццфтспqбзегЛ95>ФСЕЙЗД=Д�yопстфИ6шщъъыьэЂaящjžэ}яƒ№и-?№№€я!юэъ@/ДъщшццфтyполrŸжгбЯЬ\ ЂП[gЌ€Д�Ђопстqdцчщъъыы‡нNЪяƒ№эяяю€э!ьыаДщчцхфтс:жмкиддвЯРЫШa�JНК— ]В�0 Аопм–хцчшМдъ^‘:У€эю€яююzп€эььы€ъ­ШццœтрпYЫкиждваЮzЧЧФpЄИЕCЕ�1˜‡Љн�Юуфр`Ьщ-8˜ыы€ьэьYЭ‚э€ьыы€ъщшчцхфЯ'БпнsЌиждваЮЬ~ŒФСП†ˆЖЏ8Е�a†0�� "*псрOЩцкYщщ€ъ€ыЅD€ы&hдыъъщЎщщшчЬцхутсЧ3ЖмŠждваЮЬЪЄ>ТПНКЗД^Е� l ƒ� iойRПухЈ1пчg€щъ1съТ$фъ€щ!j˜ццс*утсрпоЛ(ТЎeдваЮЬЪШФЈНКЗД‹Д�„�ЎиI�ŠрстЯехцDзчч€ш,щg­щ[œшшччцв#йфЖ1српоммл”*УAбЯСЬЪШХТDeЛИЕž%TМ�е[�#лопрстууPЃх‚ц–pи.х€ц$ххфhuт’aпонмлйзжLK5ЯЦ@$œХУРЗЕЉ#�m•Л�Beo��<бмнопррсawууфф‰зС<†zуффууттЩи|ˆнммкиздвПЗЫЩЂ+gПНЙ†Њ*��3aЙ�n€�6ЉлммоппcXсстЄEтс,ШpЬтссррпJ”_ЄЏбизже…Uа‚�‰ЩЧХЖ<БИY7"‚� Й�‚�‚кл€м K>ппгЗрр#4рže€поз֘K?В}BдегвsZЮЪ%aЦФТРz�$ЇžЪ�JФйки%ммgIноо@оиЫ€мuFгНжNfвба[`Ы٘;ФСПНД �—<Ы� _Џ~�кЦ Г€м%ШммFpлкйCUзF�ХгБ ŸЯЭW_ЩЧХoСПНКИ)��zШ� M[�� зj?€ийй€иpдзж|д}�ВбЯr'ЩЪV]ЦФТРОМКЕl€�7Ш�Z—/�2аž…ж�–дР�Ђб­ЪЮЭЦ„ШdHУСПНЛБgƒ�(Ч�aX‚�M�#kБв‚гš�LбšУЯЩ‘ЬЫЪЩ](Фr3ПОМЉ`†�� Ч�b‚�]@€�"cЁЭаа“�ЪvЭЬЫЪЩШЧЦˆ�™ƒЉw:�†� Ц��'ƒ�a„�AsV��ЁVAЪЩШЧЦХФТ‘�N”�€�I{и��(‹�n=6~‹zsZF5�Ї�]—з��ƒ�w5‚�G&‰�‡�a=о�˜9‚�)�;xe�O)‚�Kо�•‚��A˜�Bƒ�о��pƒ��‚�eƒ��=ц��?Š�dIƒ��ц��Š�1ƒ��є�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�”�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�Љ�� ќ��ѓ��…�ч��‡��…�1ч��‡��$…�I#„�о�†��6„�_@„� з�‚�;†�A‚�Nca ƒ��й��ƒ�P4„�=>� #?bgfedN1 ��-ˆ��Э�‚�?kQ#   <aBlkkjjihgfedc:�F‡�Э�A‚�Fn€ojlppEo/onnmllkjihgf-T�„�3Ю�9€�fqqƒr Mr@qqpphnnmlkjh8^�/C�/GЯ�W�Js€t#uuvvrdulWtsr7qponmlTac�9caH" 9W@а�,]( evvwvrwwxxf vww--wvrssrqpo%<kg;edb`^Y[?5а� :iNwxxs)y€zJ6€zh uxdpvusrQ$nnl 8hfeca_]DЮ� &xJ oz{zU€|!1o||{{IizM[xwvl=pqpo 2jigeQa_^S&Ы� `]wz(*||}'{}~i~‚}||5-Fzyxwwutrq1lkiO2db`^[IУ� �gyx f|y$A~~BJ…€~Y*{{zyxwvus$omfSfdb`^[V Т�5W"=tz{|"V~~}>L€`!yƒ€€{ z}||{zyxwvhgqo$ hhfdb`\ !Й�„�sxyz{|}~3R€€‚{O<ƒƒ€‚a€"e~}}|{zywwusC!ljifd\P Й�8Bƒ� `z{|}~~3S‚‚ƒ~n„ƒC@‚M@€~}}|{zxw^69nljiK '[JDЙ�8a‚� i{|}~€s|€ƒ „„……(ƒS„††… „+uƒ| €}~}|{ztG5Npn`%Nda2Z>ƒ� Б�1p>��4{}~3u‚‚ƒƒ„„……€†4„…(Cƒ† €G…„„Wu‚‚Nk~}{/4w%arp^ajhed/\Z/�0Г�1vaFx~€?tƒ„……€†€‡14…‡‚2z‡‡qn‡††……„ƒƒ#k€~C8yyptrpnljhe F^[Y9(,@IЕ�1yzM Bu‚{ l…††‡ˆˆ>ˆƒ‰W8ˆ‡!††……qx‚xi}|{ xwtrpnljd\`][XVRO%З�;|~|Z1:ƒa [‡‡ˆˆ‰�Q„Š=ˆ‰‰ˆ€‡††2xƒ‚€}| yxvtrpmkada_\ZWNKЗ�\€‚ƒ„…†:/B„€‰‡Šˆ 8nŠ€‰ ˆ‡‡a,N`„ƒ‚€}{ywvsqom_%ec`^[Y/Й� oƒƒ„…††ƒ&y8?LŠŠFm„‹g.m:Š ‰‰_m/…„ƒ‚€,|zywuspniUgeb_]ZSЎ�$‚��€ƒ„…†‡‡ˆhKŠ€ep‹‹C†ƒ‹4Y‹{‹Š‰ˆˆ†!†…„ƒ‚€x}|ThwtrpmkifRO^[Y$Ў�Ta?)%?p}~rDO„…†‡‡ˆ‰‰.†Š‹T,;‹‚Œh…ŒtX€‹€Š‰‰ˆ‡‡†…„ƒ‚€~cyxvsqomi7_`]ZGЏ�Zvwy{|~‚H'…†‡‡ˆ‰ŠŠ\[€‹ŒŒ_Om1U‹‚Œ‹€Š‰ˆ‡‡†…„ƒ‚|F K{ywusp`�2da^[YЏ� lyz|}€‚ƒƒx†‡‡ˆ‰€Š…6‹€Œ p@‡V‰‹Œ€‹€Š‰ˆ‡‡†…sA2%u|zxwtP ( Vb`]Z/А�.z{}~€ƒ„…†‡‡‰‰Šc‡‹‹PŒŒ€r9‚‚:„€Œ‹‹ŠŠ\‰ˆ‡‡†xh~~0~}{zwM \†|aa^[IА�t|~‚ƒ…†‡‡ˆ‰ŠŠPx€ŒAŽp%u„€Œ‹ˆ>'Љˆ‡††„ƒ`Q~|zRrŒ‹w-b_\Y Џ�z}€ZV€††‡ˆ‰ŠŠ‹‹. h„�Œ‚ŽNƒSŽŽ‹Œ…>vG„Љˆ‡†…„Fw€}a hŒ€Ž ˆcH`]Z!­� |~€u 6fˆ‰€Š‹‹{?€…ŽDŽŒ€Ž'xt†‹WzЉ‰‡‡†…‚ƒv8€‹€Ž ˆw8 Z^[1EЌ�;}€‚ƒx-��?c„‹‡ŒŒJ>b)+Œ…ŽV‚Žd[L‚"ŒŒˆŠŠ‰ˆ‡††„ƒ‚€: ZyˆŒ‹ƒoQ)_\=ufЋ�[~ƒƒ…†M A7'{‰‚Ž_uŽ‚!ŒŒ‹‹ŠŠ‰ˆ‡†…ƒƒw2PfmbSF70.'J]CpŒNЄ�$€�w~€‚ƒ„††‡_r‹‹ŒŒ€RU”Ž‚Œ‹‹ŠŠ‰{€†„ƒS�! <=��]I�.SYЄ�CK$�'7BJx†‡ˆ‰_„‹ŒŒ€p8•ށŒŒ‹‹†F!‡‡†…ƒ<��QЭіњўџ U!KF7(І�"kv_I<3=N~†‡‰‰ŠGDŒŒ‚�mŽŠŒ„ށŒŒ‹GlFˆ‡†…„aa�Œџ ѕoTЮН�Y_A ЩфiЈ� U}~€‚ƒ„†‡ˆ‰ŠŠ‰%‰Œ€Ž�‰‚ŽLITƒŽ_6PˆƒŽSUŒŒ‹‹Šr‰‡‡†„ƒ€}џ ��-ц�G`@� ƒЉ�=~‚ƒ…†‡ˆ‰ŠŠ‹\pŽŽ>9EŒŽVq‹ƒŽfc}ŠƒŽ<vŒŒŒ‹ŠŠ‰ˆ‡†…ƒ‚Iџ ��.ц�>`@��uЋ� 1€ƒ„…†‡‰‡‡‹‹‰€€€Ž9‹‚Ž‹J…Ž�‹…Ž�€ŒŒ‹‹Š‰ˆ‡†…Q< п€џ іoNбу�:a=�Ц–� Ž� ;ƒ„††‡]v‹‹Œ€gs€ŽraƒŽ�Ž€ŒŒ‹‹ŠŠ‰‡†…dE'IЇљџЖ�DaA�~яц”�>JJLOI(‰�].Z„†z' dŠ‹yH(IŒŽ�ЖށŒ‹‹ŠŠ‰‡‡†„ƒ|Y&�#Ж€џq�WbD�vџЌ”� IJJLORVHˆ�`~€?€] /~ŠŠ€*)tŽj^ŒŽ€ ŒŒ‹ŠŠ‰ˆ‡†„ƒ‚€~|`˜џ№ebT�Pќ;,’� "?5,3MWZW†�y~€‚eznM24eŠ‹Œ…\*WŽ„ЁŽarŽ‰9€Ž€ ŒŒ‹ŠŠ‰ˆ‡†„ƒ‚€~|{v8П]�Feb_ U ML “� 1COSWZ]]#…� }~€‚ƒ…†‡ˆK‹‹ŒŒŒ>c’Ž€‹Ž„€Ž$…dŒŒ‹ŠŠˆ‡†…ƒ‚€~|{yv* �feb`,��-OLB’� ;LPSWZ]`b*„�}€‚ƒ…†‡ˆ‰Š‹‹ŒŒŒƒ‡Ž‰Œ‘Ž$AwŒŒ‹ŠŠJt‡†…ƒ‚€~}{yweZieb5�<J“� ,-./N`ce0‚�}€‚‚B{‡ˆ‰Š‹‹ŒŒ€ˆŽJБހ"ŒŒ‹ŠŠh~‡†…ƒ‚€~}{ywtkie:VccO#7>“� ISWZ]`cfiA��D}~€t%8†‡ˆ‰Š‹‹ŒŒ€Ž�Œ‚ŽkIŒ‚Ž�p‹Ž€ŒŒ‹ŠŠ‰ˆ‡†ƒƒ‚€~}{ywt0kiU Z‚f- J”�PWZ\`cfil]MWuh}vCI„†‡ˆ‰Š‹‡oŒ€€ŽB‚Ž‹XdŽPZ‚Ž�~…Ž€ŒŒ‹ŠŠ‰ˆ‡†l:k€~|{xws<khFƒf[�D/•�$VY\_ceiknqsvx;2 4@s‡ˆ‰ŠŠ_MŒ€ŽŽŒ$\‹‡Ž}2~ŽŒ6ƒŽ‹‹€ŒŒ‹ŠŠ‰ˆ‡†„~3\~|zxvs/k7'fIffc�DE”�DY\_behknpsvxzir}|f5 Qˆ‰Š…rŒŽŽ‰cNˆŽyOŽ‰\ƒŽ9C€Œ‹‹ŠŠ‰ˆ‡†J3c~|zxvs'Ea€fL.ffOFJ•�,06[ehknpsvxz|~€ƒ„kv‡‰Š63‹Œ…Ž�’ŽW…€Œ‹‹ŠŠ‰‡††~u~|zxvp Z€f <bff'JJ –�3LPUehjmprvxz|}ƒ„…†‡‰M‚‹ŒŒ€„ŽVh“Ž€$ŒŒ‹‹Š‰‰‡†…ƒƒ}{zwuY�Uf`CaffR-JJ,–�4B]dgjmoruwxz}qƒ…†‡R~Š‹ŒŒ€;Š‚Ž Œ†tnmdo}ŽŒgT†Ž$ŒŒNŠŠ‰ˆ‡†…ƒ‚€}{ywu0� ��dfNIJJ-—�-^`dfiloqtwEm}~yƒ„†M€ˆkZV\nC„Ž H(,�\†Ž€!Œk|SŠŠ‰ˆ‡†„ƒ‚€~|{ywm�!_fcO6�'€J�-—� T`cfilnqsvmm|`ƒ„J eD2<mˆ5‰‚Ž :�v†ˆ‡€iVIHLf…ށŒ†?GЉ‰‡†…„ƒaZ|zxv:�� ‚{MoV&€J'�3•� )_behkmpsvB8|$SƒG ,Hi…Š‹‹Œ7^{Š€Ž[�}‰‹ŒŒ‹‡wiWFI…ŽŽw„|€ŒŒ‹‹‰Š‰ˆ‡h…ƒ‚ox{zxj't{u8{{1€Jgw”�(I9:hjmoruD.J(~€‚T]~‡‡‰ŠŠ‹‹N$1'cŽŽ�\‰Œ€Ž‹†}p? :x€Ž><~€ŒŒ‹‹Š‰‰‡„=|ƒ‚€~}{yw&*o\X‚{ >{{]GJI‹s”�RddjloqtZ`~€ƒ„}†‡ˆ‰ŠŠ‹ˆŒŒŽj�/…‹‚Ž‰{4-‚Žˆf€ŒŒ‹‹ŠŠ‰ˆr%6mƒ~|zxJ inl:‚{ b{{r8J<�3†ŽŽ7”�[;Jiknpd=�$ b‚ƒ#i‡‡‰‰ŠŠ‹z^Œ6 t†Œ‚ŽzK‚Ž‚ŒŒ‹‹ŠŠ‰‰‡‡g]‚€}{z^Zpmk;…{ o3J&�O„Ž ”�%Rehjmo��\vD|Qu†‡ˆ‰ŠŠ‹QMŒŒ€L|…‹Ž…KŽŽ…€Ž‚ŒŒ€‹~q‰ˆ‡†…id€~|{j 7romjXl„{ c�=H Gv€^aW“�adfilh��2z|}w /„††‡ˆ‰Š†r€Œ|$iy|ŽŽy5,lv>ŽƒŒŒ‹zYŠ8Lˆ‡††„ƒ‚€}|u-qqnlie ?„{ CJ*� 'Fm8<A*“�]cBhkJ€�&p{}~5tƒ…†‡‡‰‰G*‹‹Œh IMq_eŠŠZb€Ž^&‡ƒŒŒ‹‹Š7F ƒ‡‡†…ƒƒ€~|{kZtrpmkhe& u‚{v@€�)!•�C+Ygi�,5z|\Sc(r†‡ˆk|Š‹SG1W;Ku„gxM f}e„‚€bŒŒ€‹Љ2#‡‡†…„ƒ‚€}{zxvsqnligd#�0{y.?ž�TceG‚�iu$L+q„††f‰RD*34<;;tYj M„1PRŒ€‹ŠŠ‰4‡†…„ƒ‚G~|{ywtrpmkheG€�.QN4 ;Ÿ�'_bUƒ�.5�Tƒƒ„…+@]31^{~D!7 GŒ‚€ŒH †‹‹€Š"‰‰ˆ|††]‚€){{zwvsqUljgd?'�� 'D �^G „��b€ƒƒ>�E{‰‰€Š‰lG& %h‡ŒdK‹‹€Š"‰ˆ‡‡††„{=2|~,pzxwtro`heXP[XSIJKGЁ�#ˆ�V|}€ER‚†‡‡ˆ‰‰€Š€‹Q[‹ˆ€Œ‰ˆ‹†€Š#‰‰ˆ‡‡††„ƒƒb*y@\ywurpn):gd@\YBAPMEЏ�)y{|~€]€Y…†‡‡ˆ‰n]ŠtCˆ4w€‹M%€‹Š$‰‰ˆˆwQ†…„ƒƒ€\&VFwv>Tnl[dc8GZX?OFА� lz{|~€‚!u„…††‡‡p?‰‰ŠŠ…*MrŠ,‰}hŠŠ‰‰†5g‡RK…„ƒƒ€~|K-vtV2Li*Ha^[YWP F В� #wz{}~€‚ƒ„…€†l4ˆˆ‰w„UƒŠ*ZV']‰‰ˆˆ‡†3XP^„ƒ‚€~|{z=prpnaF_]VWTQ Д�Axz{|~f‚ƒƒ„…†[7‡ƒ<Z‡Gˆƒ‰{$ˆˆ€‡!††„$eƒ‚€~|Bzxv=Upnljg. N[+ /M8Д�Xxz{|>7€‚ƒƒ„„LH},r‡ƒˆ† Y€‡€†!…„u d‚€~}|{ twuspomjbfc0�#ZWE) В�A_xzxR~€iwƒ5R!n‚†„‡E~€†……„€ƒao€VV|{z0nusqomki=cb_6MURЕ�F>� [xO�q}~{5r‚ U„„€…††2t‚†€…„„€ƒ‚€~rayx>\sqomkig?E`][??SOЕ�->��Mz{{+o€y1‚ƒ€„]&€„&:w„ƒƒ‚b‚‚€q~}|{mcvLIqomkigeQ^[YWTQ)Е�2ƒ� 9xv-i}~\|9€‚ƒ~ƒl€ƒ€‚ ;T€|}|{zyxeg\5omkigec` PZWTR>Е�„�]u(�K{{|ru~&w€‚9`‚3W€#€€tw~d{{zywwuOf"ljbgec`^!0XURG&М�q0�wyz{{|}},Z€€S>x‚#~~9@|P5zyxwvtrq('je M`^\=URL�2E Л�5:�� pwxyzz{{5B€}~Lwj!JC}~€}$||n vDJxwvtsronc ]fdP2[ZW =L��-К��9�Zvwwxyz60{{|Z&|{ n=p|€{zz(P3Y^osrqoE,kB�Edb`X SV)‚�Й� ‚�Etv€w-("yzs dz{zV7zzyytkR("_B#ppnm<.if0a`^\:�LGЪ�'h€t ww7(€x#Exu n€w?%qdq)5mlk/1fdK_][ZU� CЫ�12]C�tj`vvwUlvv%<utt$-r$�gn\Rjh,/db`6][YWU�� 5Щ� #*��r8!…s; prq AoA�\lj:ee+.a_^\ZYWS1€�Ш�*F�m S€pqq€pJ�Nod�TlY gihd Ac1#^][ZXS/ ƒ�Ч�-(‚�(K�8\m‚nP�'lPdjgIgfed.`8[ZYP-†��Ч�-‚�0!�3SikkK�g<hgfedcbaB�J? P8�†�Ц��ƒ�1„�!;,��Q+ edcba`_^F�%F�€�"9и��‹�7>FD<8," �N�+Fз��ƒ� 7‚�#‰�>‚�-о� F‚� �7.�$ƒ��#о�E‚� �FA‚� ƒ�о��4ƒ��‚�B.ƒ��ц��Š�.!ƒ��ц��Š� ƒ��є�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�”�t8mk��@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������e;������������������������������������������������������������������������������������������������������������������������������ОŠ������������������������������������������������������������������������������������������������������������������������������юК�����������������������������������������������������������������������������������������������������������������������������ќв�������������������������������������������������������������������������������������������������������.a����������a�������0џы�������������������������������������������������������������������������������������������������������Eћ<���������4џ”�������Nџы�������������������������������������������������������������������������������������������������������ыж��������4џи��:���xџџ��H��XP�����������������������������������������������������������������������������������������������™џt�������$џџ'�п��Џџџ+��fŽ��рќ0��������������������������������������������������������������������������������������������Dџщ����Ч�їџˆ��с=�№џџh��Л}�/џџV����������Ж����������������������������������������������������������������������������oъJ���щџœ���И[��тџц�О­�rџџџФ�!ќ}�jџџ_��������ћ]����������������������������������������������������������������������������wџЭ���ЋџџZ���ŽН��ЛџџA�Бџѕџџџџ[Іџ}�Ўџџo��AЇ�����„ќ����������������������������������������������������������������������������4џџ\���hџџєX��ƒ§K�РџџЖQдџџџџџџџџџџЖ;ѓџџ‡��pŸ����єЬ�����������������������������������������������������������������������������еџж��5џџџџЦƒдџъЈѕџџџџџџџџџџџџџџџџџџџџЎ��•Ї���Йџz������������������������������������������������������������������������������|џџZ��§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшM ьЫ��џџ9������������������������������������������������������������������������������3џџс�Pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџ№�•џџњ�������������������������������������������������������������������������}��јџџЖ4хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ“Чџџџь���'`���������������������������������������������������������������лv�����йo��Ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџь��'х–���������������������������������������������������������������ўu�����Kћ@�]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџё Nф—\ �������������������������������������������������������������žўt���� яѓi„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхџЦrџ��������������������������������������������������������������Сџ†���ƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџt@јЪ���������������������������������������������������������������!ѓџЖ+��aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтнџ^���������������������������������������������������������6-������dџџ§зЙћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњ������������������������������������������������������ щџГ�����Юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџз��*Ѕ—�����Њб�������������������������������������������"ьџџн4����gџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўІДћИ���cш§d���������������������������������������������8љџџїu��3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ��iмџџˆ�����������������������������������������������NјџџџЧ0�lџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}\Ћѕџџџ�������������������������������������������������[ўџџџ§в№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГ�����������������������������������������������7�sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭ������������������������������������������������#шЄ&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§,�����������������������������������������“l�����дњЙьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—������������������������������������������фџзT�����#іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ2�������������������������������������������ЛџџТY ��Пџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю>i•���������������������������������������џџџђСМяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџС<�����������������������������������������‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдC��������������������������������������������ŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџP�����������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџw��������������������������������������������F4ЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХ��������������������������������������������^Ићњќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ— ��������������������������������������������4Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџж��������������������������������������������ХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ������������������������������������Q/����хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџo������������������������������������ЇџџИF�*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ1�����������������������������������rџџџџлЂРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв�����������������������������������VчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR������������������������������������™ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџn��������������������������������������Iшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚���������������������������������������фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџz���������������������O†ЄЉ„F������US"�жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚�������������������&žѕџџџџџџД#�����OЮџьдюџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв����������������‹ќџџџџџџџџџєe�����3œўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮ�������������� Фџџџџџџџџџџџџџœ������5лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”��������������œz.DЕџџџџџџџџџџџз-������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ4�����������������•џџџџџџџџџџџёR����цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџК������������������˜џџџџџџџџџџџџ��Oџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў.������������������ ИџџџџџџџџџџџџЇ,Aрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜������������������� гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ�������������������$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{��������������������XџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫ��������������������Ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§�������������������� оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџC���������������������Mџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџm����������������������АџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїлH��������������������)їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс��������������������”џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџS��������������������їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦ���������������������–џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџO��������������������-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓB�����������������ХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќЗт‰�����������������bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџX�����������������ћџџџџџџџџ^ЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦ������������������Ыџџџџџџџн`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюћџџџџџџџе�������������������Šџџџџџџџ~�уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџь07Ќэњњњу“��������������������Jџџџџџџќ&��~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ1������������������������������ўџџџџџЦ���ѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљN��������������������������������іџџџџўE��� ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљO��������������������������������§џџџ§i����|џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљP���������������������������������‚џџџдB���� ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюK��������������������������������ЕњѕКX����Чљ…3tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџр ��������������������������������O/�������м*���мџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшїџ������������������������������������������й����НџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџZ§Z�����������������������������������������������нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋ��fьG����������������������������������������������-ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїџј��#I����������������������������������������������“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџу{ѓЅ������������������������������������������������� ыџџџёТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџv�� (�������������������������������������������������Rџџљ‡�wќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџq�����������������������������������������������������Кџн8����kџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэ���������������������������������������������������*§н�����?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ��������������������������������������������������Еь������џџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������������������������������������������+ќN������ ыџх*Šњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџш_,{аџџџ›�����������������������������������������������H\�������Pџј<��4сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщ&���� †№џ‚��������������������������������������������������������Гџf����кџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ�������Єџ\������������������������������������������������������ ѕт�����Їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ0�������W%������������������������������������������������������yG������›џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгXЧџџЙ�������������������������������������������������������������������������Нџџџѕ‡цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ„�еџџO������������������������������������������������������������������������НџџѕB� –џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИ,����&№џу�����������������������������������������������������������������������тџџj���‘џџПДђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџH������Nћџœ���������������������������������������������������������������������� іџИ���Еџџ6�cўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu�������qё����������������������������������������������������������������������%џћ#����йџз���ЫџџџџџџџџџџџџџџџџџџџџџџџџbЇќџџџ™��������������������������������������������������������������������������������OџŒ�����їџ~����‰џџџџЗ>sщџџщпљџџџџџц–lўџџG��BюџџУ��������������������������������������������������������������������������������ѕ�����іћ&����Uџџџџ7��џџE�,ўџџџџj��Сџџe���1єџє �������������������������������������������������������������������������������ˆŒ������.�����$џџџО���lџ§��Зџџџ§��kџџ‰����?єџP��������������������������������������������������������������������������������������������ѓџџE���Hџн���VџџџУ���ќџП�����AєЖ�����������������������������������������������������������������������������������������������мџа���џг��� ыџџ����Тџу������Sќ6����������������������������������������������������������������������������������������������Чџi����юŒ����‘џџG����Vўр�������b‡����������������������������������������������������������������������������������������������Чј�����—����'§џ�����=#�������� ����������������������������������������������������������������������������������������������ЧЙ�������������Ьѕ ��������������������������������������������������������������������������������������������������������������Г…�������������wщ����������������������������������������������������������������������������������������������������������������������������0щ������������������������������������������������������������������������������������������������������������������������������{������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/vol_internal.icns������������������������������������������������������������������0000664�0001750�0001750�00000007070�10411602135�016571� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��8il32�� (� ‚ „  ƒ „�(ЖiѓъчффтрнрлйедвЮЬЩУЧЕ_‹„�DуЁэыљээхчшсумчЬнбОПЛПЩЊƒ�MючЅ l>R<RDN^ €бВДВbЬЎ ƒ�hяЧЌŒ� ��\�xзАГМTАЙ+ƒ�uѓНІЫ”–—–••”’•Œ†ЊПББСXЋТ6ƒ�ˆьЪђ‹џБЌЏУWЂРLƒ�щЭШТОПКИЖВЏЏЎЌЈІ”ЊБЉХ]™РVƒ�ІчЬЮЫЫЦЦФХСППМКЛЕЋЗЎЋУcУeƒ�ИмЫЩЩЧЪЩХРММКИЖГЖБЎЊЉНpƒУt‚� ШљШЪШЮУРРОММИ€Д ЏЎЊЋЅДwzй‚�)ЩUгЧХФРПООМЗЖДВГЎЌЉЅІЏLjŒ‚�;жgНЙЩТСОМКЕИЖГЏЅЊЋЉЅЄЉ”Iz•�EъювСРМНИНФПЗЕКСГЅЅЃЁ ЃМ�[ё­ЭРОККП™ИЏЎЋЌІ‰БЄ žЌn‰Њ)�iіnФТММКЛК‰ЅЏЏ­Њ”VЖЂЄŸЅ‚]М2�{ђfОСМКЙЕІцњœ›–ЋрЏžЂŸ›Ѓ€[Й@�Šы ЦКИДГБ бџљ§эКš Ÿ™— v~БK�šзОЕВИЙДАВБ›Ёœ”–Ёžž›š–’‹“ЅX€� ЉЭБпфšДДЏЎЎЋЈЅЄŸЂžœšš’„Џ™ e€�ЛХЗЄљя—ЂЎЌЋЈЇЄЂŸ›™‡…ЩЇ†Œšn€�ХОЕГšфџП™’šЄ ЁЁœ–Œ‹‹ЌпІŠ”y€�,-еиИГДšЎъќнХ “‹ŒžСЙФКŠ„‹Žž‚ ��=Р"АГЈЋЁ’Ыођ€џ1ўьаž‚}‡Š†h+Š��UфyЦЮЦРРЛЕЄ››šŸ›—–š —Ž”Šcœ#��#œ—фs€�0QT ..3:>CR+ )! !?SMHS?h1�?r-,O]adfgyPBNADDE8c€`Wf…1�3||H;:FW^giqVQWMPPQGakkџbr…%�ƒ�П�� ‚ „  ƒ „�(ЖiѓъчффтрнрлйедвЮЬЩУЧЕ_‹„�DуЁэыљээхчшсумчЬнбОПЛПЩЊƒ�MючЅ l>R<RDN^ €бВДВbЬЎ ƒ�hяЧЌŒ� ��\�xзАГМTАЙ+ƒ�uѓНІЫ”–—–••”’•Œ†ЊПББСXЋТ6ƒ�ˆьЪђ‹џБЌЏУWЂРLƒ�щЭШТОПКИЖВЏЏЎЌЈІ”ЊБЉХ]™РVƒ�ІчЬЮЫЫЦЦФХСППМКЛЕЋЗЎЋУcУeƒ�ИмЫЩЩЧЪЩХРММКИЖГЖБЎЊЉНpƒУt‚� ШљШЪШЮУРРОММИ€Д ЏЎЊЋЅДwzй‚�)ЩUгЧХФРПООМЗЖДВГЎЌЉЅІЏLjŒ‚�;жgНЙЩТСОМКЕИЖГЏЅЊЋЉЅЄЉ”Iz•�EъювСРМНИНФПЗЕКСГЅЅЃЁ ЃМ�[ё­ЭРОККП™ИЏЎЋЌІ‰БЄ žЌn‰Њ)�iіnФТММКЛК‰ЅЏЏ­Њ”VЖЂЄŸЅ‚]М2�{ђfОСМКЙЕІцњœ›–ЋрЏžЂŸ›Ѓ€[Й@�Šы ЦКИДГБ бџљ§эКš Ÿ™— v~БK�šзОЕВИЙДАВБ›Ёœ”–Ёžž›š–’‹“ЅX€� ЉЭБпфšДДЏЎЎЋЈЅЄŸЂžœšš’„Џ™ e€�ЛХЗЄљя—ЂЎЌЋЈЇЄЂŸ›™‡…ЩЇ†Œšn€�ХОЕГšфџП™’šЄ ЁЁœ–Œ‹‹ЌпІŠ”y€�,-еиИГДšЎъќнХ “‹ŒžСЙФКŠ„‹Žž‚ ��=Р"АГЈЋЁ’Ыођ€џ1ўьаž‚}‡Š†h+Š��UфyЦЮЦРРЛЕЄ›œ™Ÿ›—–š —Ž”Šcœ#��#œ—фs€�0QT ..3:>CR. )! !?SNGT?h1�?r-,O]adfgyPBMCDDE6d€]Tf…1�3||H;:FW^giqVQWMPPQHaiiџbr…%�‚П�� † ƒ ‚ „�(ЛmѓяээъшшффппййлвбЭЬаИc‘„�HшЈєёџѓѓэь№щъфявуиХЦПХа–Џƒ�PђыЋЃk=S:PBN^ž„жЖЛЖfвГ ƒ�jђЭВ‹� ��[�zоЖЗРYЖС/ƒ�yѕФЌаšœ™›˜š–‘™’‰БЦЕЖШ]АЩ9ƒ�ђбєŠџўЖГГЩ\ЇЧOƒ�ЂювЮШЦУСНЛЙЖДГБАЌšБЗЏЫ` ЧZƒ�ЌюбввбЮЭЩЩШХУССПЛЎЛЕЏЩh–Ъi‚� ОтавЯЫаЭЬЦ€С ОМКЛИДАЏУtˆЩz‚�ЭџааЬгЩЦФХССМККИДВГЏЌЛ|р…‚�/ЮZкЫЫЪЦХУУРОМКИЗЕГЏЋЋГ”Qq‘‚�;мlТНЯШШХСОММНЙЕЌАЏ­ЋЈА™O‚š�Hюѓ“иЧЦФСОСЫУОЛОЦКЉЋЉЇЇЈ”УЂ�^ѓ“БгЦХРОХМЖВБДЌЗЉЈІЁБrŽБ)�mїsШЪТССПРЌЕГГАœ]МЉЉЅЃЋ‰aТ2�~љjХЧСПОНЌъћЄЂŸЏчДЅІЅЃžЉ‡`РC�є”ЄЪРОНЙЗЇжџјўіРžЅЄЃЁŸІ|‚ЖO� оТМИОПИЗЙЕЃ ІЄ™œЊІЄЂžœ˜‘™Ћ[€� АвИцчЁМИЕДДГЏЊЈЇЈЂЂ  ˜ŠЕŸ•Іi€�ПЪЛ­љяŸЉДВБЎЌЋЉЅЁЄЁŸЯ­Œ’ s€�ЬФНЙ хџФŸ› ЊЈЇЇЃ›‘‘ВфЌ…“‘š~€�,1ммНИИЁГяџсЦЇš””’ЃЧСЩР’Š–’Є‰ ��?Х)ЕИЏБЈ˜Ђбпє€џ1ўядЄ‰Œ”l3��Wъ|ЪгЪФФРЙЈЂ  ІЂœ• І–“’–ŒiЁ&��#Є—ъy€�9^b+8:@EKQa3&4$(*)HZur]Nx9�G10[emosr„XJVHKKL<j€ŽŠo”8�:‰ˆRABObjru~_Z`UYXYOm„„�}~”*�‚„П�l8mk�������������������������������������ЂЛЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЛ‰������<џџџџџџџџџџџџџџџџџџџџџџџѓ������Rџџџџџџџџџџџџџџџџџџџџџџџі'������iџџџџџџџџџџџџџџџџџџџџџџџ§;������€џџџџџџџџџџџџџџџџџџџџџџџџT������—џџџџџџџџџџџџџџџџџџџџџџџџj������­џџџџџџџџџџџџџџџџџџџџџџџџ�����Хџџџџџџџџџџџџџџџџџџџџџџџџ™����� кџџџџџџџџџџџџџџџџџџџџџџџџЏ�����ъџџџџџџџџџџџџџџџџџџџџџџџџЦ����+їџџџџџџџџџџџџџџџџџџџџџџџџл ����@ўџџџџџџџџџџџџџџџџџџџџџџџџы����Xџџџџџџџџџџџџџџџџџџџџџџџџџї-����oџџџџџџџџџџџџџџџџџџџџџџџџџўC����‡џџџџџџџџџџџџџџџџџџџџџџџџџџ[����Ÿџџџџџџџџџџџџџџџџџџџџџџџџџџr����ЖџџџџџџџџџџџџџџџџџџџџџџџџџџŠ���ЭџџџџџџџџџџџџџџџџџџџџџџџџџџЁ���рџџџџџџџџџџџџџџџџџџџџџџџџџџИ��#№џџџџџџџџџџџџџџџџџџџџџџџџџџЯ ��8њџџџџџџџџџџџџџџџџџџџџџџџџџџт��Nџџџџџџџџџџџџџџџџџџџџџџџџџџџ№&��hџџџџџџџџџџџџџџџџџџџџџџџџџџџћ<��{џџџџџџџџџџџџџџџџџџџџџџџџџџџџO��Nњџџџџџџџџџџџџџџџџџџџџџџџџџџц/��.эџџџџџџџџџџџџџџџџџџџџџџџџџџЭ��!сџџџџџџџџџџџџџџџџџџџџџџџџџџН ��ЮџџџџџџџџџџџџџџџџџџџџџџџџџџЉ��cЁЃЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЄP��1433333333333333333333334/�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/func_reset.icns��������������������������������������������������������������������0000664�0001750�0001750�00000014453�10577164706�016261� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��+ih32��ђ�Ђ�  .20.!›�8hЉОТРН­g? ˜� =xЊвцыъ€ы ъцфпЭЌw?”�5yЪфюющслебЯЭЮавзннРv6 ‘� UНцьычзУДВБА БВГКЦбеЕR� gЯщюцжО­ЊЌЌ„­ ЌЋЌВМШК[!� "”зю№тЧЛЌІІ€ЇІІ„ЇІІЉКОz$Œ�‹нъэбМЙЛЛДЈ Ÿ›ЂЂ›Ÿ„Ё  ЊЗm‰�}йыщЩГЕ€Ж ИД›žЩыыЪž™…›š ЉZ ‰� LШхъТ­‚БВŸеџе’…•”›“0‡�*ЉншУЊ‚­Ўš‘гƒџг“Ž…‘—k!…�`ЭчЬЅЈЉЊ˜ˆб…џЮ‡Š…Œ9 …�,ЊовЅЂЄІ–†м‡џЮ‚ƒ……Š\‚� iЭтГ› €Ÿ ™‚в‰џКz„€‚{+�'Ібаœ™š”Ъ‹џИrx„{€N�� CКвЋ‘•‘бџНvsƒtwh# ZЦШ“Ž‰кџВdn‚opm,jЮЖ~zsnhnбџњЅbik€jkj2 € €С]bc`fг„џЦцџруƒџў›]c€dee5€  ЎtZ_^\У„џИXъџЫ_иƒџ§”V€_^`6"Ђ^WXR‚„џИL_їџбMcзƒџф_VXXY]6 $Ž“YVVL™ƒџОIN`ѕџЯVGXчƒџsQWXUF)" 'Ž‚CNURlёџЧLNR^ѕџаTTGeчџ!х\RND2%%( 'ƒ~(+8FD†љџ§ЉGNSO\ѕџФNQSCjъџџќ€:6,))€,   #o‰1€. 23SndDLRSO]єџ+КKRRQCMvyW-../00320  "b“;24432,(,6;?BBSєџ З>B?:6/" (3‚4 :62 D #W–O6„988775DѓџБ06788…98<B;1 � J’h9ˆ>;IѓџГ7=ˆ>=GF@- 4�8z~DA‡B?NєџЖ;A‰BPEE$ ��6 ([‚UFF†GAcљџИ@F‡GFNSH?€�IplQJ†LFkњџЙEK†LKN`TN* >€�/6`€eS†PKoњџМJO†PO_dTM‚�GpvfVU„VQpћџЗMU„V UTan]U.E‚� (&\uwjZYƒZYZоџœP…ZXcul^;„�@iw{p`ƒ^_U‹ђџџкm[„^ ]iyufTE„� Mmzzgb‚cdXg”‡V]d‚c bdr€l]"0†� NLoy‡ƒwig€hih_VXdih ggr‡€r`+#ˆ�#:Zq€ŒŒƒumkkllmnnmllkklq}Š‡uj. Š�9@rŒ“‰ƒ|tqpqsy‡“…{R' с‹�42`}’˜™—•‹Š‰ŠŽ“—™š•…kG#Ž� „6nƒŽ™ž†Ÿ ›“‡|K<�‚) C_s†–›œœ›œ™zeO.">“�w",DUdiih[K4"=—�o6€'NАš�ЊN0'#"%*:Ь��%   "ž�& €  € /˜� $   €#  •� /BKZdpsrqf]QF9 ’� /Rj{šГХгждвШГ™~k\A -Ž� ; 5R~ІХрю€ёђё№юэъмЧЃ€\C Œ�!F HyЅльєѓ№ычупоноосфшчдЂz\, Š�- .^ŽвюђёяфеЬЫЪЩЪЪЫЯзруЭŠeL ˆ�n .g™пёѓютвЧХЦЦ„Ч€Ц ЪвйаlF #‡� 3kЗфѓѕыиаЦТТ€УТТ„У ТТФЯгЄnM '…� (eБшёђпбЯааЬУООЛРРЛО„П ООХЭ›iF sƒ� - [Јхё№кЬ€Э ЮЯЬЛНкёђлНЙ…ЛКОФh0 ƒ�  B‰кэёжШ‚ЪЫОГуџуДЕ†ЗКЖsa n� ; ,oХшяжХ‚ЧШКДсƒџсЕВ†ДИšjP �  X”нюмСУ€ФУФИ­п…џо­Ў…АБВxe' !��7 ,rХшсСПРСИЌч‡џоЉЊ…ЌЏfL ��)EœныЫКНОЙЊр‰џаЄЇ„ЈЊЅnd% ��#jУппМКЛЗЉл‹џЯŸЃ„ЅЈ†hBi:‚арХДЗЕГрџвЂŸƒЁЂ˜kP*EF‘ийЕГГВБЎГхџЪ•œ‚žœp[ 3M›оЭЇЄ œ—œрџќТ“‚™š™ta$!*YЊдГ‘””’–с„џдьџчщƒџўЛ‚•–ud5 ' aВШŸ‘‘ж„џЩ…№џй†сƒџўЖŒ‘“vg@!'#dГР‘Œ‰Љ„џЫ}‘њџр‚‰пƒџэ’‹ŽuhC$+"&gДЖŽŒŒ…КƒџЯ}‡“јџп€ьƒџ ˆŽŒ‚nmF'-#(kДЋ€ˆ‹›ѕџ爇‹“јџрŒ~‹ьџ!ь‹ˆvmmsH (6&*jЎЊqs{…‚Ќњџ§ТŠŽ‹”јџ+зŠŽюџџќЂ{zsrrstvE#.K(+eЄВyvvwzw‰š“€‰ŽŒ•јџ б‰ŽŽ~}™œƒowv€w zyw:'4u**`œЙ€{€| {upt}ƒ…†јџ бƒ…ƒ€~ucam{‚| ~w0)=]-)]˜М€‚€€‰їџЮ|€€‚�ƒ‚„†„q/,O�@+LЛЁ„ˆ‡…јџа‚†ˆ‡†ŒŒ‹h--Ѕ�h14|ЏЏŒŠ‡‹‰’јџв‡Š‰‹“V,:��Н4/` Г˜‡ ћџгŒ‡”—’ƒ:2c€�;2H“ЌЉ˜”†•’Їќџж‘ˆ•–Ёš™^06Ь€�š66sЇЕІœ†š—Ќќџи—ˆšЃЅŸ•C5E‚�D8AŒБВЉŸŸ„ Ў§џжš† ŸІ­Ѕ d6;э‚�”=6XЈДД­…ЄЃЂъџХž…ЄЃЉДЎЋu6<R„� V>?}АЗИВЉЈƒЉЂЗіџџхЊЈƒЉ ЈЈЎЗЕЏ›L;Bч„� ŒB@@ИКОКА­‚ЎЏ žКБ“ЇЏ‚Ў ­ЎЖНМЖЇR=BЂ†� шJAKŽЛНУСКДƒГЉŸЁЎДƒГ ИПУПЛЈ_>CoП‡�МF@MŸНТЧЧУЛИЗЖЗЗИЙЙИ€З ЖЗЙРЦЧХПЕd=FdŠ�ЕGEJ{МЦЩЬЪЧФРМЛКЛМОУЦЩЫЫЦФ“ZDHgx‹�ІOHDiЃСЫЫ€ЮЬЪЧЧЦЧЩЫЭЮЮЬЫШАƒKDJoд� „TLGJmБЧЭаввбв бввбЮЪР‡RFKMГ‘�zPMIT|ГФбегддгегЪКІŒdJLNfШ“�ЛgOOKNSc‘ЁІЅЅ—†mWPKLPYШ—�=žaSRPLLQ€SNKOQRU|чѕš�*чwf^W\bnГA�Ž�)њБ‘~ˆŸеlнœ�ПКџ–wxwvt€suwwxƒЬNЏ˜� f‘ywquz~‡š€Ÿ |wquy}ип”� ‡šywqЎЭр№љў€џ ћіцеПsux‡ыЖ‘�фxws~Вч‹џјЮŒtuy–Ž�ЗЂysxЛшџѕаŽqwˆ:Œ�в‘xr‘й“џєЉxvz9Š�‚wsЏљ–џк}sy@ˆ�МЊxuЏ™џа‚u€r†�q˜xpИ›џнxvx:…�њysІњœџг{w–.ƒ�х|tїžџАqyЯƒ�ЄxsгŸџљ•sМ�З~sЋЁџт|wв�Њv„іЂџ Ёrx!��›zrЌЃџ йxy/��O|xзЄџ›wЖ��Ьz›ќЄџЩx�нzТЅџр€ч‚€зЅџђˆв#ƒ†уЅџќ—Ми†ŒяџїќџњњŽџАЋО‡іŒџі№ўџћьјџСЃЗŠ“ј‹џі№ўƒџћьјŒџЦ„ЅИŒ•јŠџі№ў…џљщњ‹џЧ†ЈУŽ–јƒџћ§џјяќ‡џїщћџќќ„џЧˆЊк‘˜єƒџћѕўџџѕёў…џ §ўџџјыћџџўяќ„џОŒЕ“—ы„џј№ё№ѓ§†џ§ў€џїщыэшє„џўЌ‘ЦІ––с…џњѕјŽџћьщє…џјž•фУ”еЅџы›— �ж–ОЅџ옘<�]œ №ЄџХ—Мf�`ŸšЯЃџ ёІ7��3ЗžДЃџЩ›Ђ’€�иЁЁнЁџћЎЂг�ЪЃЌяџ�ў‹џ§ЫЂЊТ‚�ЁЉЃПŠџћћџ�њ‹џиЃЈэƒ�‘яЊЊо‰џќѓ§џџјіŠџѕЕЇЖ„�]БЋЋш‰џѕъяьчћ‰џњЙЉ­Д†�ƒТ­Ду‰џјѓѓћ‰џіУЋЏ'П‡�рБЌЕя—џќЦЊБ‹�вЖБЕеў”џфРБГЅ‹�ІФДБЪэ‘џікЖВЕ*�ЙЭЗДЖЬєџ§мЛДЖИИ� Ю&ПЙЖМешѕ§…џ ўљэоЦЖИЙєё“�"єЛКИКНЦзсъэььфлЬПЛИЙЛвк–� UіxуООМККН€ОЛКМНОЦš�H ыиЩШЩЩарќ-™^�h8mk�� �����������������7xЋб№№№№оОŽR������������������������������� CvШћџџџџџџџџџџџц“[ ��������������������������UбџџџџџџџџџџџџџџџџџџђŒ�����������������������MФџџџџџџџџџџџџџџџџџџџџџџр€�������������������…ќџџџџџџџџџџџџџџџџџџџџџџџџџЬ"�����������������+Йџџџџџџџџџџџџџџџџџџџџџџџџџџџџп`���������������(бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїa������������"шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_�����������БџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэP��������� Чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ4��������xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩ������=ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘������Иџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю����+№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ��Вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ&��.ћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe��]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ��›џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ)рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџqBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКYџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†�ЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўD�pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв�Bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€�� оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ=���VўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ ���Яџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџі;�����eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГ������ГџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыB�������&іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџc���������Dуџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•����������\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ�����������aљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ��������������kчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ����������������0тџџџџџџџџџџџџџџџџџџџџџџџџџџџi�������������������%žєџџџџџџџџџџџџџџџџџџџџџџџР^����������������������-Т§џџџџџџџџџџџџџџџџџџџсc������������������������>гџџџџџџџџџџџџџџёІX����������������������������� X”ДЮр№№№№чзПЁv#�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_win.icns������������������������������������������������������������������������0000664�0001750�0001750�00000117644�10411554704�015414� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��ŸЄit32��_”����џ�џ�џ�џ�џ�џ�џ�џ�џ�–�щїїі‚їѕѓьцЛы�юїѕіњћ†ўќљєъъиф�ьїіћћўћѕёяъхЧо�ьѕіћ‚ў�џ‹ў љѓэштпфуби�пјїћ“ў §їёэчтлдЯйфбе�пјћ•ўџќі№ыхркеЯШСбнЌг�щџ—ўњєяъфпйгЭШТКЕЮз—а�Њєџ—ўјђэштнзбЬЦСМЖЋБдРЯ�ЪћџŒў�џ†ў§їёьцслжаЪХРКДЏЇžОВЮ�йџ—ўћѕ№ъфпйдЮЩУОИГ­ЈЂ•”Э�”яџˆў�џ€ў�џ‡ўљѓюшуоивЭЧТНЗВЌІЁ“yЭ�Оћџ–ў§јёьчтмзбЫЦРЛЕАЊЅž•7Э��瘢ћі№ыхскеЯЩФПЙДЎЈЃ™’‚�­БqХ�$чџ–ўџњєящфпйдЮШТНИВЌЇЁ–t�Зr`‚ŽФ�Зѕџ–ў§јђэштнзвЬЦСМЖБЋІ ”W�kLDgŽXТ�Ф§џ•ўџ§їёьцслжаЪФПКЕЏЉЄœ€� •wlGLIO{”6Ё�ЊЊwŸy—�рџ–ўџњѕяъхпкдЮЩУОЙГ­ЈЂ˜~� ŸmfGMOQOZŠЉHœ�ЅЊwgHBa–�™эџƒў�џўљєющуоигЭШТНЗБЋІЁ”f� …mTIMPRUWUc†”„—� ЅАŽ€ulheA=[–�Лћџ€ў�џ’ў§їђьчслжбЫХРЛЕЏЊЅž•2�‡kILNQSVY€\e{–Ž’� А ‹‰€zurnk_4Zb–�з§€ў�џ“ўћі№ыцпкеЯЪФПКДЎЈЃ™Š�ЊslFLOQTWZ]_bcbhs{ˆˆ‡\?…�ЊЊЁ›‹†ƒ{vqmjT0j"•�$шџ—ўњєящфоидЮШУНИВЌЇЁ–l�2›n^HMPRUW[]`cehjlmow}~ˆ›oƒ…tŸ“Ž“™–“‘Ž‹ˆƒ~yupkhF:C–�Аєџ–ў§јѓэштнзвЬЧСМЖБЋІ •<�2ŠlMJMPSVY[^acfhlnqtwz|‚ˆ‹’˜ ž›˜”Ž‹‡‚|xtojb:J–�аќџŽў�џ„ўќїёьцслжаЪХПКДЏЉЄœŽ€�2—{fFKNQSWY\^adgjmorux{~‚…ˆŒ’•˜›ž œš–’Š…€{wrmjY2b—�оџ—ўњѕяъхпйдЮЩУОИГ­ЈЂ˜y�2™pcGMORTWZ]`behkmpsvy|‚†‰Œ’–™œŸŸ›™•’Œ‰„zuqliN5P–�”эџ’ў�џўљѓющуоигЭЧСМЖБЌІЁ•T�2’nTIMPSUX[]`cehlmptwz}€ƒ‡Š“–™ ž›—”‘Ž‹‡‚}xtokf@?-–�Кћџ–ў§їёьчсмжбЬХРЛЕАЊЅž“'�2jIKNQSVY\^adfilnrux{~…ˆ‹Ž‘”—›žŸš–“Š†|wsnk^3b –�в§ў�џ†ўќѕ№ыхпкеЯЪФПЙДЎЈЃ™Œ�2™reFLORSWZ]_bdgjmorvy|‚…‰Œ’•˜›ŸŸœ™•’Œ‰„€zvrmjS2Z—�хџ—ўњєюъфоигЭШТНЗВЌЇЁ–l�2žm]HMPRUXZ]`cehknpswz}€ƒ†Š“–™œ ž›˜”‘ŽŒˆƒ~yupkgG;>–�Нѕџ–ў§јѓэштнзбЬЧСМЖАЊІЁ•A�2ŽlNJMQSUY\]acfhlnqtw{~„‡ŠŽ‘”—šž š—”‘ŽŠ‡‚}xtnjc:M–�Эќ—ў§іёьцрлеаЪХПКДЎЉЄ›�2–ygGLNQSWZ\^bdgjlorux|‚…ˆ‹Ž’•˜›ž œ™•“Š…€{wrmkZ1f—�оџ€ў�џ“ўћѕяъфпйдЮЩУОИГ­ЈЂ™q�2ІldGLORTWZ]`bdgknpsvy|ƒ†‰Œ“–™œŸŸœ˜•’Œ‰„zvqlhM5U–�ИяџŽў�џ€ў�џўљѓэшуоивЬЧТНЗВЌІЂ”V�2nUIMPSUX[]`cehlnptwz}€„‡Š”—š ž›—”‘Ž‹‡‚}xtoke>B5–�УќџŠў�џˆў§јђьчтмжбЫХРЛЕАЊЅž“%�1€jIKNQSVY\^acfimoqux{~…ˆ‹Ž‘•˜›ž š–“ŽŠ†|wsmk]3[—�зџў�џƒўџќѕ№ыхркеЯЩФПЙДЎЉЃ™�2ЊreFLORTWZ]_bdgjmpsuy|‚…‰Œ’•˜›ŸŸœ™•’Œ‰„zvqmjS2d–�хџ—ўњєющупигЭШТНЗВЌЇЂ–c�2n]HMPRUX[]`cehkmpsvz}€ƒ†‰Œ“–™ ž›˜”‘ŽŒˆƒ~yupkgE;7–�Сіџˆў�џŠў§јђэчтнзвЬЦРЛЖБЊЅŸ–H�2‰lMJNQSUY[^acfilnqtw{~„‡Š‘”—šžŸš–“‘ŽŠ†|xtnka8Q–��ᘢ§і№ыцслеаЪФПКЕЏЉЄœˆ�2ŸwgFLNQSVY\_bcgjlorux{‚…ˆ‹Ž’•˜›žŸš•’‰…€{wrmjX/m—�тџ…ў�џƒў�џ‡ўћѕяъфпйдЮЩУОИГ­ЈЂ˜y�2ЋncFMORTWZ]`begkmosvy|€ƒ†‰Œ“–™œŸŸœ˜•’Œ‰„zvqlhK9U–�Їюџ—ўљѓющунзвЭЧСНЗБЋІЁ•Q�2ˆmUHMPSUX[^`cehlnptwz}„‡Š”—š ž›—”‘Ž‹ˆ‚}ytoke>H–�Эћџў�џ‚ўќїђьчсмжбЫХРЛЕЏЊЅž”'€�2q|jIKNQSVY\^adfilorux{~„ˆ‹Ž‘”—›ž š–“ŽŠ†|wsnk^2`—�еџ‰ў‹џћѕяыхпкеЯЩФПЙДЎЉЃ˜ƒ�2žrfFLORTWZ\_bdgjmosvy|‚…‰Œ’•˜œŸŸœ™•’Œ‰…zvqmjS2`–�Uуџ…ў‚џќѓырнмкллпыіџџ§єщтнигЭШТНЗВЌЇЂ™^�2—o]GMPRUX[]`cehknpswz}€ƒ†Š“–™ Ÿ›˜”‘ŽŒˆƒ~yupkgDE6–�Тјџ‚ў€џ$§ыкЮРЎЈ’zlsl€˜ЌЗЩзъљєтдаЬЦСЛЖБЋІŸ•0�1~pMJMQSVY\^acfilnqtx{~„‡ŠŽ‘”—šž žš—”‘Ž‹‡‚}xtokb8N—�з§€ў€џ ѓйША˜xePI&„�.Nf{œИгъѓпШТПКДЏЉЄšŒ�2rfFLOQTWZ]_bdgjmoruy|‚…ˆŒ‘•˜›ŸŸ™–“‰…{vrmjY1a—��уџђзНЂ‚bP� IuЁСтяеКЕГ­ЈЃ˜q�2o\GMORTX[]_bdhknosvy|€ƒ†‰Œ’–™œ Ÿœ™•’Œ‰„zuqliK=N–� ГёџјлПЄZ–� \‰МсшУЋЋЇЁ—5�2ŠpTIMPSVX[^`cfilnqtw{~„‡Š‘”—š ž›—“‘Ž‹‡ƒ}xtoke=J–�МцаЊ‡] œ� S’ЦъдЌ €�2N|lIKNQSVY\^adfilnqux{~…ˆ‹Ž‘”—›žŸš–“Š†|wsmj^2a˜�–‚BŠ� */І‘hr ‡UfŠ�SехЙ”„�2­q`FLOQTWZ]_bdgjmorvy|‚…‰Œ’•˜›ŸŸœ™•“‰…zvqmjS6VЂ�$zw‚šr~o{zsrrfcikepU†�zБхТ\�2”nYHMPRTX[]`cehkmpsvz}€ƒ†‰“–™ Ÿ›˜”’Ž‹ˆƒ~yupkgDC-ž�…gt”™“”ŽŽˆƒ€|vsohc_WXty‹†�3’�1|pNKNQSUY\^acehlnqtwz~„‡Š”—šž š—”Ž‹†|xsnjb8Sœ� :‹‡p{…’œЄЁš–‘Š†}yuqmie`\VLHLgx…Š�2ЂwfFLOQSVZ\^bdgjmorux{‚…ˆ‹Ž’•˜›žŸš–“‰…€{vrmjY1l™�%3wvfnz…Ž–žЂ™•Œ‰…€|xsplhd_[VRMG>>_ŠMˆ�2˜n]GLORTW[]_behkmosvy|€ƒ†‰Œ’–™œŸŸ›˜•’Œˆ„zvpliK<F—�)x|iUWamv~‡˜ЁЁœ˜”‹ˆ„{wrokgb^YTPKHC>33J{†�2ƒoRIMPSUX[]`ceilnptwz}„‡Š“–š ž›—”‘Ž‹‡‚}ytokd<P–�+™O?IU_hox‰‘šЂŸš—’ŽŠ‡‚~zuqnjfa]XTOKGB=83*,`w…�1sQTMMQTVY\^adfilnqux{~„ˆ‹Ž‘”—šž š–“Š…|wsnj\3Z—�-x3GPXajrzƒ‹”Ђž™•‘‰…}ytplid`[WRMIE@;84/)3wEƒ�1”WHWVQSWZ\_bdgjmorvy|‚…‰Œ’•˜›ŸŸœ™•’‰„zvqmjP5a—�.b:JR[clt}†Ž— Ђœ˜”Œˆ„€|wsolgc^ZUQLID?:72.)$Vgƒ�0]JP[XW[]`cehknpsvz}€ƒ†Š“–™œŸŸ›˜”‘ŽŒˆƒ~yuqlgCC"–�/˜HALT]fnwˆ™ЁŸ›—’‹‡‚~zvrnjfb]XTPKGB>961-(#X…�;YJT€^&acfilnqtw{}„‡Š”—š š–“‘ŽŠ‡}ytlbR6_—�/ˆ5FOW`iqy‚Š’œЂžš–‘‰†}yupmie`\WRNJFA<84/+&",‡�+\TJVbeefjlorux{‚…ˆ‹Ž’•˜›žŸ™•’‹‡xk\JDHV>—�.q7IQYcks|„•žЂ™”Œˆ…€|xsplhd_[VQMID@;73.*%!R‰�(QULTdjmnpsvy|€ƒ†‰Œ“–™œŸŸœ™–”’ƒr`NAGLD˜�/iU>KS\dnv~‡˜ Ёœ˜“‹ˆƒ{vrnkgc^YTOKHC?:62-)$E�ощф„�$PXOM^ipxz|‚…ˆ‹Ž‘”˜œ ЃЂž˜Žo[HCIIU$š�/Ё;DNV_gox€‰‘šЂŸ›—’ŽŠ‡‚~zuqmifa]XTNKGA=850,'##*€�ЛМПЅЯC…�JPONWfpv|ƒˆŒ’““’Š{jWJGIN^A ž�.v6HPYajr{ƒ‹”Ђš–‘‰…€}ytplie_[WRMIEA<84/+&!<�МЗА€“НГ‡�=JLNNQNOSVURMJNFMMUP># Ё�.e:JR[dlt}…Ž— Ёœ˜”Œˆ„|xsokgc_ZUQLID?:72.)$ P�ВЪЄ‡Ž‘ЉЧЃ‰� 50eI??D`8-ˆ�D7˜�/’GAMU]fow€ˆ™Ђ ›—’Ž‹‡ƒ~{vrnjfb]XTOKGB>961-(#!!€� EЌЯŽŒ‘–—œЕЯšž�  жЪУ:—�/5GOW`ipy‚Š“œЃžš–‘ŽŠ†}zuqmie`\WSNJFA=84/+&"5€�ІБМ…Ž“—›ŸЁЉКЭОU˜�UЛимийЕu­—�.r7IQYbks|…•žЂ™•Œ‰…€|xsokhd_ZVQLID@;73.*%! Y�ЕОЂ‡”˜ЁЅЉЌВОЫЮРj� $rХйпчцфпййŸuˆ–�/_W=LT\dmu~‡— Ё›—“‹‡ƒ{wrnjgb]YTPLHC?:62-($9�ЎЬ•Š‘•™žЃІЋАГЗКСЩЯбЮЩЛЛm�*fOŠРекмфёіјіёъфниаƒ‚–�/˜=DNV_gpxŠ‘šЂŸ›–’ŽŠ†‚}zuqmjfa]XSOKFB=850,'#)€�%ЎШˆ’—› ЄЈЌАЕКОТХЩЯгеиззивййжкфхюѓјљ§€џ ћєюштлйТq…—�.z6HPYajr{ƒŒ”Ђž™•‰…€|ytplhe`[WRMIEA<74/*%!G�ЗИ­…Ž“˜œЁЅЉЎВЗЛПУШЬбеилотхщьяєїћ…џ ўјђьцрккЌn‚—�.k9JS[clt}†Ž–ŸЁœ˜”Œˆ„{wsokgc^ZUQLIC@;72-)% K� КУ›‰•™ЂІЊЏГИМРХШЮвжймруцъюёєїњў„џ §іёыфоие‘}:–�/‚FAMU^fow€ˆ‘™Ё ›—’Ž‹‡‚~zvrnjfa]XTOLGB>961,'$$€� EЋЭŽŒ‘–šŸЃЇЌАЕЙНТЦЪЯгжкнрфшыюёѕјќƒџ ўџћѕящумиЪy‚—�.Œ5FOX`hqy‚‹“œЂžš–‘ŽŠ†}ytqmie`[WSNJEA=84/+&"4�!ІБК…Ž“—› ЄЈ­БЖКОУЧЬадилотхшьяђіљќўƒџ ўљѓючслйИm‡—�.o8JQYcks|…–žЂ™•Œ‰…€|xsokhd^ZVQLHD?;83.*%!Q�!ИНЂ‡”˜ЁЅЊЎГЗЛПФШЭбеймптцщэ№ѓіњўўƒџ §іёьхпййŸvh–�/_[<KT\emv~‡˜  ›˜“‹ˆƒ{wrnkgb^YTPLHC>:61-(#B� ЋЬ–Š‘•™žЃЇЋАДЙНСЦЪЮгжйнрфчъюёєјћў‚џ ўџќѕ№ъунйа„€–�/‡>DNV_hox‰’›ЂŸš–‘ŽŠ†‚~zvqmjea]XTOKFA<850,'"* €�!yЋЧˆŽ’—šŸЄЇЌАЕЙОТЧЫЯдзкосфшьяђѕљќў‚џ ўџњєюштлйНp…—�.w5HPXajrzƒŒ”Ђ™•‘‰…|ytplhd_[VRMIE@;84/*&!F� АИ­†“˜œЁЅЉЎВЗЛПФШЬаеимптхщь№ѓіњ§„џ ўјђэцрккЇm€—�.[;JR[dlt}†Ž—ŸЁœ˜”Œˆ„{wsokgc^ZUQLHC>:72-)$D�!ДФœ‰•™žЂІЊЏГИМРХЩЮвеймруцъэёєїћўўƒџ §іёыхоижŽ€D–�/ˆGALU^fow€ˆ‘šЂ ›—’ŽŠ‡‚~zvqnjfa]XTOKGB>961,'#%$€� fЊЬŒ’–šŸЃЇЌАЕЙНТЦЪЯгжкнсфчыюђѕјќƒџ ўџћєящуниШw„–�.Œ7GOW`iqy‚Š’Ђžš–‘‰†}zuqmie`\WRNJFA;84/+&!@� ДГЙ…Ž“—› ЄЉ­БЖКОУШЬбдзлотхшьяѓіљ§ƒџ ўўљѓэчсккГl†—�.c9IQZcks|…–ŸЂ™•Œˆ„€|xsolhd_[UQLID@;73/*% K�!ЖМЂ‡”˜ЁЅЊЏВЗЛПФЩЭбеймптцщэ№єїћўўƒџ §їёьхпийšvq–�/fW=LS\env~‡˜ Ёœ˜“‹‡ƒ{vrnjgb^YUOLHC?:61-(#+� АЫ–Š‘•™žЂІЋАДЙМСХЩЯгжкнручъюёєјћў‚џ ўџќѕяъфниа†–�/‹?DNV_hox‰’›ЂŸš–’ŽŠ†~zuqmifa]XSNKFA=850,'#/ €� ЊЈЧ‡’—› ЄЇЌБЕКОТЧЫадзкосхшыяђѕљќ…џ њѓюштмйОo…—�.z6HPYajr{ƒŒ”Ђ™–‘‰…€|ytplie_[VRMIE@<84/+&!J� ЖД­…”˜œЁЅЉЎВЗЛОУШЭбеилптхщь№ѓіњ§„џ ўјђэцсккЉms—�.V<KR[dlu}†Ž—ŸЁœ˜”Œˆ„{wsokgc^ZUQLIC?:62.)$ B� ЌЦœ‰•™žЂІЊЏДИМРХЩЮвжймручъэ№єїћў„џ §іёыфоижŽK–�/ЅHAMU^gow€‰™ЁŸ›—“Ž‹‡‚~zvrnjfa]XSOKGB>960,(#1 €�$œЉаŒ’–šŸЃЇЌАЕКНТЦЫЯдзкнсфчыюђѕјќўџџўџ ћєяшунйЦv‡—�.{8GPX`iqzƒŠ“œЃžš–‘‰†}yuqmie`\WRNJFA<84/+&"E�!ЃДЛ„Ž“˜œЁЅЈ­ВЖЛОУЧЬбдзлотхшьяђіњ§ў‚џ ўџљѓэчсккГk€—�.j7JRZckt|…–ŸЂ™”Œˆ„{xsolhd_[VQLID@;73.*%!K� НЛœˆ”™ЂЅЊЏГИМРФЩЭбеймпуцщэ№єїћў„џ §їёыцпий™va–�/fS>LT]env‡˜ Ÿš–•““’Šƒ}tmgd`]YTPKHC>:61,(#)5€� ЎЧ‹‘•šŸЃІЋАДЙНСЦЪЯгжйнрфчъюёѕїћƒџ ўџќѕяъуниЯ€Š–�.’;ENW_hpx‰“Ё­ААЉŸ•‰…}zyx„ˆ€paUQNJFA=850+'#3� Г­Ц†“—› ЄЇЌБЕКОТЧЫадзкосфшыяђіљ§ƒџ ўџњєюштлйНn†—�.v6HQYair‘›–|dVC0"'& '%'4FQ`pgRGC@<73.*%!L� ЙИЊ…”˜œЁЅЉЎВЗЛПФШЭбеилптцщь№ѓіњ§„џ ўјђэцрйкІor—�];JQ[j}‚lT;"%).2'�3-6/%*BTaN=862.($<�!БР“Š•™žЃІЋЏГИМРХЩЮвжйнруцъэёєїћўўƒџ ќіёыфозеŒL–� ŠI?QdjbJ'"9%Ž�9(&,IPD30,(#9€�!œЋЪŠ’–šŸЃЇЌАЕЙНТЦЪЯгзкнсфчыюђѕјќў„џ њєяшумиЧv‹—� €BYWC!!21•� E0)>F6(%"F� ЌГК…Ž“—œЁЄЈ­БЖКОУЧЬадилосхшьяђіљ§ƒџ ўџљѓючсккДk—�‹<&+:š� D0(::&K� ГЛˆ”˜ЂЅЊЏВЗЛПФШЭвеимптцщэ№єїњ§„џ §їђыхпикšuc—�4UFŸ�N('6*'�!ЊЦŽŒ‘•šŸЃЇЌЏДЙНСЦЪЯгжкнручъюёєїћўўƒџ ќѕ№ъуниа€'П�I%)A� ГЌХ†’—› ЄЈ­БЕКОТЧЫадзкосфшыяђіљќƒџ ўџљѓяштлиКo{Т�253M�!ЖЖЉ†”˜œЁЅЉЎВЖЛПУШЭбеимптхщь№ѓіњ§ўƒџ ўјђэцрккЁntУ�‚�!ЗО’Š•™žЂІЋЏДИМРХЩЮвжймруцъэёєїћўўƒџ ќі№ъхоижˆ€9Щ� ЊЈШ‰’–šŸЃЇЌАДКНСЦЪЯгзкнсфшыюёѕјќ…џ ћєящумиЦu„Ъ� ЛФИˆ“˜œ ЄЈ­БЖКОУШЬадилотхшьяѓіњ§„џ ўљѓэчсккЎlyЪ� ЯГŒœ˜•—ЁІЊЎГИЛПФЩЭбеймпуцщэ№ѓїњў„џ §іёыхпий•vhЫ�vˆ…™ІЁŸЁЇЌАДЙМСЦЪЯгжкнрфчъюёєјћў„џ ћѕ№щфпла}†Ь�w„ŠЃБЌЉЋБЖКОТЧЫадзкосхшыюђѕљќ…џ љѓяъфжОЇxЯ�;€†‹ЋЛЙЖЖЙОФШЭбеилптхщь№ѓіњ§…џ ћѕщжЖž‹‚^б�Z‰…‹ЌУЩЦУФШЭвжймручъэ№єїњў„џ јчФЉ”„ƒ|3г�Gzƒ†Обиизжзймрфшыяђіљ§џ §їхЧ­•…ƒ€~P и�!!t‚‚ˆœНершэььэю№ђѕїљљѕшиЧД‹ƒ…„}Pо�4c~„‰’ЅЕРЦЫЪЧФЛВІ—Œ…‚ƒ„ybEф�1Wpxyw‚} €}s}xef:џ�џ�џ�џ�џ�џ�џ�џ�џ�џ��џ�џ�џ�џ�џ�џ�џ�џ�џ�–� Šœ™„Ÿ€ur~—‹ˆ‡wы�ˆ˜”—ˆ†„€{vpmmox~™ф�­–œ—’žІЁ™”‹†|wrmha\YXbyŒ‡о�!𒑉Œ“šЂЈІЁœ—’މ„{vqlgb_[WQKK_y‹и�%Ÿž‘}~„‹’˜ЃЈЄŸ›•‘Œ‡‚~ytokfa]ZVSOKC>Oƒœе�)Їšps|ƒˆŽ“™ŸЅЈЃž™”‹†}xsnjd`\YURNJFC<3Jyrг�+|`isy„А•›ЁІІЁ˜“‰…€{wqmhc_[XTPMJFB>;3-N†zа�-…nfou{€†‹‘—ЂЇЅ œ–’ˆƒ~zuplgb^ZWSPLHDA=:62(*mˆЯ�.–ekqw}‚‡“™ŸЄЈЃžš•‹‡‚}xsoje`]ZURNKGC@<951.(@dЮ�.~bmrx~ƒ‰•š ІЇЂ˜”ŽŠ†|wrnid`\XUQNJFC?;840,)&VЭ�/tpeotz€…‹–œЂЇІЁœ—’މ„{vqlgb^[WTPLIEA>:63/,(#aЭ�/•djpv{‡Œ’˜ЃЈЄŸ›–‘Œ‡‚~ytokea]ZVSOKHD@=962.+'53Э�.˜blqx}ƒˆŽ”™ŸЄЇЃž™”‹†|xsnie`]YUQNJGC?<951-)&X‚�ЩйqХ�/${cnsy„Š•›ЁЇІЂœ˜“މ…€{vqlhc_\XTQMIFB>;730,(%T�УЅІЃФ�/”ghou{€†Œ‘—ЂЇЅ ›–’ˆƒzupkfa^ZWSOLHDA=962/+'!'L�ЈЃiaДcТ�/‰ckqw|‚ˆ“˜žЄЈЃŸš•Œ‡‚}xsnjea]YVRNKGD@<952-*&B€� žЅaijwЅЏHЁ�ЩЭЂБ…—�.Šamry~ƒ‰”š ІЇЂ™“Š…€|wrmhc`\XUQMJFB?;740,)%P� ЌŸ˜_kqtuˆГНHœ�УЬРАЃnWu–�/zkgntz…‹–œЂЇЅ œ—’މƒ{vqlgb_[WTPLIEA>:63/,(#Q� Єxdmrw|‚•ВБ——� ЬЭОЛЖЌІ]Rk–�/ˆejqv|‡’˜ЃЈЄŸ›–‘Œ‡ƒ~ytokea]ZVSOKHD@<962.*':.�ЄЄeinty~‚ˆ‹›ЏО­‘�џЭФРЩЧСКГЌЇ‘Kjg–�.™`mrx}ƒˆŽ“™ŸЅЇЂž™”Š†|xsmid`\YURNJFC?;841-)&U�Ж Ѓ`kpuz„Š”˜›ЂЋБЗБЇs?…�ЊЊЏРМЬШбгдЯШРЙБЋІ~Et"•�/$}cnsy„А•›ЁЇІЁ˜“މ…{vqlhc_[WTQMIFB>:73/,($U�2ЌЇŠalqw{†‹•›ŸЄЈ­АЕЖЗИЛХЉДИ­ЪФУЪвежзкйидЭХОЗЏЉЂhOH–�/‹hipu{€†Œ‘—œЂЇЅ š–’ˆƒ~zuplfa^ZVSOKHEA=962/+'!*2�2ЂІlgnsx}‚‡’—œЁІЋАГЖИЛОССЧЩЬабзмпонлкйззвЫУМД­Ї™T[!–�/Іbkqw|‚ˆŽ“™žЄЇЃŸš•‹†‚}xtoje`]ZVRNKGC@<851.*&G€�2ŸЁš_jotyƒ‰Ž“˜žЂЈ­БДЖЙМРУЦЪЭагжйнонлккйзжаЩСЙВЋІˆHp—�.…amrx~ƒ‰•š ІЇЂ˜”Š…€{wrmic`\XUQNJFB>;840,)%V�2ЈЃ’`lpv{€…‹”™ŸЄЉЎВЕЗЛОРФЧЪЭадзкннмлкйизеЮЧПЗАЉЄsHW–�/tjgotz…‹–œЁЇЅ œ—’‰„zvqlgb_[WTPLHEB=:72/+(# C�2ЅЈydmrx|‚‡Œ‘–› ІЋЏГЖИЛПСХШЫЮбдзлонмлкйизгЬФНЕЎЈž]T0–�/‰fjpv|‡’˜ЃЈЄŸš•‘Œ‡‚}ytokfa]ZVSOKGD@=951.+&:#�2 dioty~ƒˆ’—ЂЇЌАДЗЙМПУЦЩЬЯвеймонмлййзжбЪТЛГЌЇ‘Kr –�.ˆalrx}ƒ‰Ž”šŸЅЇЃž™”‹†|xsnid`]YURNJFC@;851-)&Y�2Њ —_jpuz…ŠŽ”™žЃЉ­БЕИКНРУЧЪЭагжйномлкйизеЯШРЙБЊЅ}Gd—�.tdnsy„А•›ЁІІЁ—“މ…€{vqmhc_[XTQMIEB?:74/,($W�2­Іˆblqw|†‹–š ЅЊЏВЕИЛОСФШЫЮбдзкннмлкйиздЭХОЗЏЈЂgOA–�/ ghou{€†‹‘—ЂЈЅ ›–’ˆƒ~yupkgb^ZWSPLHDA=962/+'!*7�2ЅЅmgmsx}ƒˆŒ‘–œЁЇЋАГЖЙМПТХШЬЯвеимонмлкйизвЫУМД­Ї™T^–�.™ckqw|‚‡“˜žЄЈЄŸš•‹‡‚}ytoje`]YVRNKGD@<851.*&K�2ЅŸ›`joty~„‰Ž“˜ЂЈ­БДЗКНРУЦЩЬагжймомллйизжаЩСЙВЋІˆGq—�.…amsy~ƒ‰”š ІЇЂ˜“Š…€|wrmhd`\XUQMIFB>;740,)%M�2Г “`lqv{€…‹”šŸЄЉЎВЕИКНСФЧЪЭбдзкннмлкйизеЮЦПИАЉЃrJY–�/Ÿlfotz€…‹–œЂЇЅ œ—’‰„zuplgb_[WTPLIEA>:73/+'#F�2ЄЈzdmrw|‡Œ–› ІЋЏГЖЙЛОТХШЫЮвеилннмккйизгЫФНЕЎЈœ[V7–�/‹akpv|‡Œ’˜žЃЈЄŸš•‘Œ‡‚~ytokfa]ZVSOKGD@=962.*&;!�1ž dioty~ƒ‰’—ЁЇЌБДЗКМПУЦЩЬЯгжймомлккйижбЩТЛГЌЇIk—�.‹alrx}ƒ‰Ž”™ŸЅЇЃž™”Š†|xsnid`\YURNJFC?;851-)&a�2ДŸ˜_kpuz„Š”™žЃЉЎВДИКНРУЧЪЭагжйннмлкйиижЯЧРЙБЊЅ{Fn—�.qensz…А–›ЁІІЁ˜“މ…€{vqlhc_\XTPMIEB>:730,($M�2ЁІˆamqw{†‹–šŸЅЊЏВЕИЛОСФЧЪЮбдзконмлкйиздЭХНЗЏЈ fO:–�/”biou{€†Œ‘—ЃЈЄ ›–‘ˆƒ~ytpkfa^ZWSOLHEA=962.+' .@�2ЁІlgnsx}‚ˆ’—œЁЇЌАГЖЙМПТХШЫЯвеилонмккйизвЪУМЕ­Ї–Qc–�.‘akqw}‚ˆ“˜ŸЄЈЃŸš•‹†‚}xsoje`]YVRNKGC@<851.*&E�2Ѕœ›`jouy~„‰Ž”˜ЂЈ­БДЗКНРУЦЩЬагжймонмкйизжаШРЙВЋІ†Ey—�.ˆamsx~„Š”š ІЇЂ˜“Š…{wrmhc`\XUQNJFB?;840-)%U�2ЖЁ”_kqv{€…‹•™ŸЄЉЎВЕИКОСФЧЪЭбдзкномлкйизеЮЦПИАЉЃqMW–�/Šigotz€†‹‘–œЂЇЅЁœ—’‰„zvqlgb_[WTPLIEA>:63/+(#!B�2ŸЇzdmrx|‡Œ‘–› ІЋАГЖЙЛПТХШЫЮвеилонмкййизгЬФНЕЏЈZY–�/›`kpv|‡’˜žЃЈЄŸš•‰„~zvrmjea]ZVSOKHD@=962.+'>#€�2q› dinty~ƒˆ“—œЁЇЌБДЗЙМПТЦЩЬЯвеймоммкййижбЩТКГЌЇIo—�.ˆbmrx}ƒ‰Ž”™ŸІЈЃŸœžЁЄЂž”ˆzlb^[XUQNJFC?<841-)&X�2ЊŸ™_kpvz„Š”™žЃЉЎВЕИКНРУЧЪЭагжкноммкййзжЯЧПИБЊЅ|Gh–�/Upenty…‹–ЄЇЇЄž–…‡ˆ†‡‚ˆˆ„{n^SOLIEB>;730,(#!M�2ЊЉˆbmqw{†‹•› ЅЊЎВЖИЛОСФШЫЮбдзлонмлкйиздЭХНЖЏЉЁeX:–�/eipu{€†Ž””Œwe\QEH<T0)4(4S?IIS[be[OGCA=:62/+'0,�1™Ћlgnsx}‚ˆ‘—œЁЇЋАГЗЙМПТХШЬЯвеимонмлкйизвЪУМД­Ј—Qa—�™_lqv‰Šy^MA@7707„� "6?AFAGRYM>:851-*&M�2—›™`jouz„‰Ž“˜ЂЈ­БДИКНРУЦЪЭЯгжйнонлккйзжаЩСЙВЋІ‡Gn—� ‰`n{ƒtZHFD>@ � 2GK?NVF520,)$X�2ЌЂ‡`lpv{€…‹•šŸЄЉЎВЕИКОСФЧЪЭадзконмлкйизеЮЦПЗАЉЃpPQ–� –lxv_KJJA–� @GBMQ:++("'-�2 Ћwemrx|‚‡Œ‘–›ЁІЋЏГЖЙМПТХШЫЯвеилонмлкйизгЬФМЕЎЈœZZ–�™rWCB<œ� <IGQE+$:€�2NœЄdhoty~ƒˆ’˜ЂЇЌАДЗЙМПУЦЩЬЯвейломмлкйижбЩТКГЌЇIp˜�{M8Š� *?ЖЅ‡‘Д–U™Š�9LIN4X�2Лž_kpuz…Š”™žЃЈ­БЕИКНРУЧЪЭагжйннмлкййиеЯЧРЙБЊЅ}J^Ђ�$‰‘›Ќ‘˜–—‘†„‰‰Š™U†�XLN8M�2ЇЇblqw{†‹•š ЅЊЏВЕИЛОСФЧЫЭбдзлонмлкйиздЭХНЖЏЈЁeV/ž�’€œЅЋЏЊЌЇІЁž›˜“‘Žˆ„wwŒ†�,CS�1˜Ћmgnsx}‚ˆ’–œЁІЌАГЖИМПТХШЫЮвеимонлккйизвЫУЛД­Ї—Qcœ� A›œŽ— ЊБИЕА­ЉІЃ ™–“‰…€yrhdi€Š�2Јœ˜`jouy~„‰Ž“˜ЂЈ­БДЗЙНРУЦЩЬагжймомлккизжаШСЙВЊІ‡Fv™�%3˜’“‡Ž—ŸІЌГЕВЏЌЈЅЂŸœ˜•‘Œ‰„~wrmg^UVxšcˆ�2ЊЂˆalqv{€…‹•šŸЄЉЎВЕЗКОСФЧЪЭадзкннмлккизеЭЦПИАЉЃpPI—�)“˜ˆz{ƒ”š ЇЎЕЕБЎЋЇЄЁž›—”Ž‹‡‚{vpkd_YRFHdކ�2žЊudmrw|‚‡Œ‘–›ЁЅЋЏГЖИЛПТХШЫЮбдилонмлкйизгЫФМЕЎЈšXa–�+Ђtipzˆ•œЂЉАЖДА­ЊЇЃ š–“Š†€zuoic^XRLE:?vˆ…�1˜zsmmsy~ƒ‰’—œЂЇЌАДЗЙМПТЦЩЬЯвеимонмлкйижбЩТЛГЌЇŒIh—�-‹_ov}ƒŠ‘—žЄЋВЖГЏЌЉІЃŸœ™–’Œ‰…~xsmga\VPJE?6*G‰Qƒ�1›lfyzuy€…Š”™žЃЉЎБЕИКНРУЧЪЭагжйномлкйизеЮЧРЙБЊЇxJh—�.|eqx~…Œ’™ŸІ­ДЕВЎЋЈЅЁž›˜”‘Ž‹ˆƒ|wqlf`ZTNHC=71& kgƒ�0ics‚€€…‹‘–š ЄЊЏВЕИЛОСФШЫЮбдзкннмлкйиздЬХОЗБЉšaV$–�/˜kjsz€‡Ž”›ЁЈЏЕДБЎЊЇЄЁš—”Š†‚{uojd^XSLGB;50*!X…�-AldyŠŒ’—œЁЇЋАГЖЙЛПТХШЫЮвеилонмлййизвЫХОДЂŠqOq—�/”`nu|‚‰–ЄЊБЖДА­ЉІЃ œ™–“Š…ytnhb]WQKF?94.(1†�,chg’™šЂЈ­БДЗКНРУЦЩЬагжймомлкйийидЩИ‚h]_aB—�.†cpw~„Š‘˜ŸІЌГЖВЏЌЉЅЂŸœ˜•’Œˆ„~xrlf`[UOID>82-'T‰�Xih|–ЂЉЋЏВЕИЛОСФЧЪЭбдзкно€м онзЩЋŠn\^_M˜�/irhry€†”šЁЇЎЕЕВЎЋЈЄЁž›—”‘Ž‹‡ƒ{vpje_YTNHB<60+%H�ЪЫв„�$WifnЂЎКЛМОРУЦШЫЯвжкптусмвПЅƒf]`\_'š�/Њcmt{ˆ•œЂЉАЖДА­ЊЇЃ š–“Š†€ztoic^XRKE@:4/))*€�ЛЁœ‹Н5…� UcimšЊВЙСЧЫаввбЯЫТВšja_alJ#�.ˆaov}ƒŠ‘—žЄЋВЖГЏЌЉІЃŸœ™•’Œ‰…xsmga\VPJD?83-(@�В—’mzЂ ‡�FW]ehmnrx|zvngiac`f]E& Ё�.~eqx…Œ’™ І­ДЕВЎЋЈЅЂž›˜•‘Ž‹‡ƒ|wqke_ZTNHC=71,&Q�ЁЄŠsyyŒЎ™‰� ;8mTKMOjB4!ˆ�>,˜�/’ljsz‡Ž”›ЂЈЏЕДА­ЊЇЄ š—“Š†‚{uojc^YRLGA;60*!)!€� .•Јyw{~~•Д†ž� ŒКЈЏ:—�/™`nu|‚‰–ЃЊБЖГА­ЉІЃ ™–“‰…ytnhb]WQKE?94.(:€�š“›qy|‚……‹šАЊU˜�UЄКЕЎЌ”dЁ—�.„cpw~„‹‘˜ŸЅЌГЖВЏЌЈЅЂŸœ˜•’Œˆ„~wrlf`[VOID=82-']�Њ›ˆsy|€ƒ†‰ŒšЋБЈj� iБНКНЙЕВ­Ў…e~–�/_tgry†Œ“šЁЇЎЕЕБ­ЋЇЄЁžš—”‘ŽŠ‡‚|vpjd^ZTNHB<60+##;�œЅ~v{}€„‡Š“”–›ЁЊББДЊЊm_�U?ВННЛНФЦХФРЛЖБ­Јou–�/žemt{‚ˆ•œЃЉАЖДА­ЊІЃ ™–“Š†€zuoic]WRLF@:5/)0€�2•Ѓtx{~…‡ŠŽ‘”–šžЁЄЇЌЏАВГЉГДЌЕРНЧЩЬЫЭЯЮЭЩУОКЕЏ­Ÿ`w—�.‹aov}ƒŠ‘—žЅЋВЖГЏЌЉЅЂŸœ™•’Œ‰…~xsmga[VPJE?83-(L�2­™ry|‚†‰ŒŽ’”—›žЁЄЇЊ­АГЖКПСФЪЬЯеегвбЯЮЭЫЧТНИГЎЎ^z—�.ƒdqx…Œ’™ŸЇ­ДЕВЎЋЈЅЁž›˜”‘Ž‹‡ƒ|wqle`ZUOHC<61,%N�2Ћžƒuz}€ƒ†‰Œ’–˜›ŸЂЄЈЋЎБЕЙМРФЧЪЭбдгвбаЯЮЭЪХСМЗВ­Ћzm7–�/ˆiksz‡”›ЂЉЏЕДБ­ЊЇЄ š—“ŽŠ†{uojc^XSMGA;50*!+€�2.“Јyw{~„‡Š”–™ŸЂЅЈЋЏВЕКОСФЧЫЮвггббаЯЮЬЩФПКЕБЌЃfu—�.˜`nu|‚‰–ЄЋБЖГЏЌЉІЃ ™–“Œ‰…ytnhb\WQKE?93.)9�2 •™ry|‚…ˆ‹Ž‘”—š ЃІЉ­АГЗКОТХШЬЯвдвбаЯЮЭЬШУОЙДЏЎ—]z—�.…cpw~„‹‘˜ŸІЌГЖВЏЋЈЅЂŸœ˜•’Œˆ„~wrlf`[UOID>82-'T�2Ќšˆsz|ƒ†‰Œ’•˜›žЁЄЇЊЎБДЗМРУЦЩЬаггвбаЯЮЭЪЦСНИГ­Ў…fb–�/_wgry†“šЁЈЎЕЕБЎЋЇЄЁžš—”‘‹‡‚{upkd_YSNGB<60+#&B�2™Ѕvz~€„‡Š“–™œŸЁЅЈЋЎВЕЙНСФЧЪЮбдгвбаЯЮЭЪХРЛЖБ­Јpp–�/Želt{ˆŽ•œЃЉАЖДА­ЊІЃ š–“‰†€ztoic]WQLF@:5/*0 €�2y“Ѓtx{~‚…ˆ‹Ž‘”—š ЃІЉЌЏГЖКОТХШЫЯвдвбаЯЮЭЬШУПКЕАЎ›_w—�.‡aov}ƒŠ—žЅЋВЖГЏЌЉЅЂŸœ˜•’Œˆ„~xsmga\VPJE?93,(K�2Ѓ˜ry|‚…ˆŒ’”˜›žЁЄЇЊ­БДЗЛПУЦЩЬагдвбаЯЮЭЫЧТНИГЎЎ‹]w—�.wfqx~…Œ’™ І­ДЕВЎЋЈЅЁž›˜”‘Ž‹ˆƒ|vqke_ZTNHC=71+%G�2ЅŸƒtz}€ƒ†‰“•˜›ŸЂЄЈЊЎБЕИМРУЧЪЭбггвбаЯЮЭЪХРМЗВ­ЌwqA–�/ˆjksz‡Ž”›ЂЈЏЕДА­ЊЇЃ š—”Š†zuojc^YSLGA;5/* ,$€�33“Їyw{~„‡Š‘“–™œŸЂІЈЋЏВЖКНСФШЫЮвггбааЮЭЬЩУПКЖБ­Ѓew–�.–anu|ƒ‰–ЄЊВЖГАЌЉІЂ œ™–“Œ‰…ytnhb]WPJE?94.(D�2А—™ry|‚…ˆ‹’”—š ЄІЉЌАГЗЛОТХЩЬЯвдвбааЮЭЬШТОЙДЏ­”\{—�.ydpw~„‹’˜ŸІЌГЖГЏЌЈЅЂž›˜•’Ž‹ˆ„}wrlf`[UOID>82,&M�2Њšˆtz}€ƒ†‰Œ’•˜›žЁЄЇЊЎБДИЛПУЦЪЭаггвбаЯЮЭЫЦСМЗГ­Џel–�/fwhry€†”šЁЇЎЕЕБЎЊЇЄЁžš—”‘Ž‹‡‚{vpjd^YTMGB<60+#&+�2Ѕ~v{}€ƒ‡Š“–™œŸЂЅЈЋЏВЕЙНРФЧЪЮбггвбаЯЭЭЪХРЛЖБ­Јnv–�/Žfmt{ˆ–œЃЉАЖДА­ЊІЃ š–“Š†zunic]WRLF@:4/)5 €�2Ѓtx{~„ˆ‹Ž‘”—š ЃІЉЌЏГЖЛОСХШЫЯвдгбааЮЭЬШУОЙЕА­›_y—�.‹aov}ƒŠ‘—žЅЋВЖГЏЌЉІЂŸœ˜–’Œ‰…~xsmga\VPJD?93-(N�2Ћ”ry|‚…ˆ‹’•˜›žЁЄЇЊ­АДЗЛПТЦЩЬаггвбаЯЮЭЫЧТНИДЎЏŒ]m—�.sgqx…Œ“™ Ї­ДЕВЎЋЈЅЁž›—•‘Ž‹‡ƒ|vqle`ZUNHB=71,%C�2›Ёƒuz}€ƒ†‰Œ’–˜›žЂЄЈЋЎБЕИНРУЦЪЭбдгвбаЯЮЭЫЦРМЖВ­ЌwpF–�/Ѕlksz€‡Ž”œЂЈЏЖДАЎЊЇЄ š—“Š†€zuoic^YSLGA;60*6 €�2œЉxw{~„‡Š“–šŸЂІЉЌЏВЖКНСФШЫЮвдгббаЯЮЭЩФПКЕА­Ђd{—�.‰bnu|‚‰–ЄЊБЖГАЌЉІЃ œ™–’Œ‰…ysnhb]WQKE?93.(I�2š•›qy|‚…ˆ‹Ž‘”—šЁЃЇЉЌАГЗЛОТХШЬагдвбаЯЮЭЬШТНЙГЏЎ“[u—�.€cqw~„‹’™ŸІЌГЕВЏЋЈЅЁž›˜•’‹ˆ„}xrlf`[UOIC=82-'M�2؄tz}€ƒ†‰Œ’•˜›žЁЄЈЊЎБДИМПУЦЪЭаггвбаЯЮЭЫЦСМИГ­Џ€e[–�/friry€†“šЁЈЎЕДА­­ЌЌЋЊІЁ›“މ„{vpjd_YSMGA;60+ 05€�3™Ђxw{~„‡Š“–™œŸЂЅЈЋЎВЕЙНРФЧЫЭбдгвбаЯЭЭЪХРЛЖБ­Јl}–�.™cnt{‚ˆ–›ЂЋИСУУЛЏЃ—’Їˆ‰“œЂrlhc]WRKF@:4/)8�2ЈЃsy{~‚…ˆ‹Ž‘”—š ЃІЉЌЏГЖКОСХШЬЯвггббаЮЭЬШУОЙЕЏ­›]|—�.‰bpw}ƒ‰‘žЋГЊqaL8*.,%$.,/>SbvŠƒl^ZVPJD>83-(P�2Џ—Žry|‚…‰Œ’•˜›žЁЄЇЊ­АДЗЛПТЦЩЬагдвбаЯЮЭЫЧТНИГЎЏŠ^k—�wfqwŒœœ€cG+&++04)�5092+4Rj|gRLHB<61,#%<�2Ёœ|vz}€ƒ†‰Œ“–˜›ŸЂЅЈЋЎВЕИМРУЧЪЭбдгвбаЯЮЭЪЦРМЗВ­ЌvrK–� Šlix‰‰yZ1"%='Ž�<*,:akZD?;5/*=€�2“”Ѕvx{~„‡Š“–™ ЂЅЈЌЏВЖЙНСФШЫЮвдгваЯЮЮЬЩФПКЕБ­Ђe}—� m}rU+&53•� G66W`I52.(J�2Ј”šqy|‚…ˆ‹Ž‘•—š ЃІЉ­АГЖЛОТХШЬЯгдвбаЯЮЭЬШТОЙДЏЎ”[w—�˜V3#/<š� G77VR4)&L�2Ѕ™„tz|€ƒ†‰Œ’•˜›ŸЁЄЇЊ­БДЗМПУЦЪЭаггвбаЯЮЭЪЦСМЗГ­Џe^—�4VIŸ�P-;R=.�2”Ђyw{~„‡Š“–™œŸЂЅЈЋЏВЕИНРФЧЪЮбггвбаЯЮЬЪХРЛЖБ­Љm}'П�K1D5F�2­‘Ђsx{~„ˆ‹Ž‘”—š ЃІЉЌЏГЖКОСХШЬЯвдгвааЯЭЬШУОКЕЏ­š_oТ�48DQ�2Ћ•ry|‚…ˆ‹‘•˜›žЁЄЇЊ­БДЗЛПТЦЩЬаггвбаЯЮЭЫЦСНИГЎЎ†^mУ�‚�2Њ›|vz}€ƒ†‰’–˜›ŸЂЅЈЋЎБЕИМРУЧЪЭбггвбаЯЮЭЪХРЛЗВ­­rn5Щ�2—Єux{~„‡Š“–™ ЃІЉЌЏВЖЙОСФЧЫЮбггббаЯЮЬЩФПКЕБ­ЂcyЪ�2Б —tx|‚…ˆ‹Ž‘”˜šžЁЃЇЉ­АГЗЛОТХЩЬагдгббЯЮЭЬЧТНЙДЎЎ\pЪ�2Х•u‚€}ƒ†‰Œ’•˜›žЂЄЇЊЎБДЙМПУЦЩЭаггвбаЯЮЭЪЦСМЗГ­Ў}ebЫ�1pxq€Š†ƒ†Š“–˜œŸЂІЈЋЏВЕЙНРФЧЪЮбдгвбаЯЮЭЪФРЛЖВЏЉjwЬ�/mttˆ’Ž‹”—š ЃІЉЌЏГЖКОСФШЫЯвдгбаЯЯЮЬШУПМЖЌ›ŠfvЯ�-:utuŽš˜”“—›žЁЄЇЉ­АДЗМПТЦЩЬаггвбаЯЮЭЬЩФКЌ•„uny[б�*Y~uu ЄЁžžЁЄЇЋЎБЕИНРУЧЪЭаггвббабЯЧЙ Œ|ppss1г� EpsqƒЊЏЎ€ЌЎВЕЙОСХШЬЯгжжевЮШЙЃ}€prLи�!lurt‚œЎЗНРППСУХЧЪЬЮЮЪПВЄ•ƒuossrKо�0]qrqt{‰•ŸЂЇІЅЂ›“Š~uqosukXBф�.Ogmlirk omeol[a7џ�џ�џ�џ�џ�џ�џ�џ�џ�џ��џ�џ�џ�џ�џ�џ�џ�џ�џ�–� Uf];e5 2[IKKDы�U_VWBAA31-("+<Wfф�ˆY`RER[SPJC>70*#€�4VWо�dVP=8BKW_\UNHA;4.(! ƒ�;bй�gO)&-7AIQX_ZSMF?92,& €��€� M}е�‡^0#-4<CKS[^WQKD>81+$ €��„� BLг�;�  '.6=EMU]]UOIB<5/(" Š�Uqа�y!*09@HPW^[TNG@:3-'  €��€��…�<`Я�| $+2;BJQZ_YRLE?81+% €��Š�AЮ�N�&.5=DLT\^VQJB<60)# ��Œ��DЭ�_# (/7?FOV^\UNHA;4.(! ‡��€��€��UЭ� "+29AIPX_ZSMF?92,% €��„��ƒ�.Э�u� %-4<CKS[^XQJC>71+# ��B‚�qlUХ�!$=�'/6=EMU]]VPIB<5/)"���Š��C�•�<kФ�‚")19@GPW_[TNG@:3-'  €��‹�E��R€�LBТ�l $,3;BJQZ^XRLE?81+% �&€�ƒ�€�*_$Ё�ti#vX—�[�&-5=DLT\]VQJC<6/*# ��?��q…�@ˆ6œ�xw=�� +–�f!(/8?GNV^\TNHA;4-(! ��Š��E�I�ƒ�3^g—�r{9� 4–�j #+2:AIPX_YRMF?92,% €��‹�+��>‰�Qf’�‰[.‚��)M–�x�%-4<CKR[^XQKC>70+$ €��‹��@� ‚���‚� 3AO.†�UU_]=M& ‡�P•�$?�'.6>FMU]\UOIB<5/)"��Œ��J�m��†��‚�+O'- W<,//&�€��€�8–�y!*18@HOW^[TMF@:3-'  �)��I�  #'-0*$ †�–�Œ $,3;BJQZ^XRLE>81+$ �-€�‡#��„��€�  #&+.20*"„��;—�Q�&-5=DMS\^VPIC=60)" €�Š��F��m†����  #',/2.'  ‡��@–�j!(07?GOV^\TNGA;4.'! ��Š��9��[ƒ��†� !$(,01,% †� &–�q "*2:AIQX^YSMF?92,% �†���!��1� "%).11*# ƒ���6 –�a�%,4<CLSZ^WQJD>71*# €��‚��…��C�y ���†�  #&*.2/(! ‡��C—�3� '.6>ENU]\UOIA;5/("��N�q�‹� !$',/2-%  †�3–�”"*18@HPW^[TMF@:3-&  �/�Q���†� "%)-02+$ †�–� $,3;BJQZ_XRLD>91+% ‚��‰��0�‡!� #&*.10)"†��C—�S�&.5=DLT\^WPIC<6/)" ��<��ƒŽ�  $'+/2/'  ‡��E–�™!)07?FOV^\UNGA;4.'! ��€��ˆ��=�X�‰��� !%)-02,% „��0–�j #+29AIQY_ZSME?92,& Œ�����2� "&+.11*# †��0—�b�%-4<CKS[^WQKC>70*# ��K�ˆ �  #',.2/(! †��P—�0 '/6>FNU]\UOHB<5/)"��‡��€��D�Y�‡��� !$(,02-& †�-–� "*19@HPW_ZTMF@:3-&  Œ��� ;�H�‹� "%)-11+$ †�–�q� $,3;BJRZ_XRLE>81+$ ��‡���+�Œ� #'+.20)"ƒ��P—�V�&.6=DMT\]VPJC<60*" ‹��€��F��‡ƒ��‡�  $(,/2.'  ‚���F–�{!(08?GOV^[TNGA;4-(! ��7�J�Š� !%(,02-% ��ƒ� –�€ #+2:AIQX_YRME=5,&  €��„��€���!€�c,�€��†� "%*-12*# †��7—�[�%,4<CKT\`XQMMQV[YSD3��C�y ƒ��‚��€�  #&+/2/(!‡��K–�U. '/7@HPUWUSROPIQUSTLDGA4$Œ��C��d‰��� !$',02-&  „��1–�#y !*2:;6/"11 �‡�)��4‹�� "&*-11,$ „��!—�{� %*) -„� %,$€��†��3�u�  "'+.20)"„��C—� R�&)5�#-!€��„��I��pƒ��‡�  #(,/2.'  ‚��€�D–� ‹ /1–� 1%�����&��Kƒ��‚��€� "%)-02-% �„�–�…")œ� /%����€�:*‹�� "%*.10*# †��:˜�l0.Š� Uъ№яяѕ№ЊЬŠ�("��C�™�  #(+/2/(!„���@Ђ�<бхѕіїњњџџўџџќћњєюшпU†�D��F��aŽ�  $),02-& „��(ž�$Шхєћќ‹џўќљіѓцй†�&"-�5��†��€� !%*-11+$ „��&œ�Pа№јўўŽџ ўћїєёя№ылІŠ�‹� #&+.10)"†��Q™�fпђћ“џ §њієёюъцщэрˆ��jŽ�  #',/2.'  †�;—�фіњў•џ §љіѓ№эщчуорцд*†��@‰��€� !$(-02,% „��!–�рњ—џўћјѕђяьщцуплинхП…��*‰��€� "%*-11*#„��2—��ч˜џўћїєёяышхтомйеамнhƒ�‚"��ˆ�  #'+/2/(! ‡��P—��юŠџ�ўŠџ§љіѓёюъчфролиебЬЮпƒ�4����� !$),/2.& †�–�Щј—џўќјѕѓ№эщцфрнкздбЮЫП{…�,&�‚� !%*-02+$ �€��€��3—�н§—џўћїєђяьщцупмйжгаЭЪА ‡�J��‚� #&+.10)"��� 1;—��ц’џ�ў‚џ§њієёюышхсолижвЯЭХ™‰�8ƒ�  $(,/2.'! €�,˜�‡ё˜џ§љіѓ№эъцфрнлиебЮЬУ`�‚E„�?(€� "&+.24/% €� 3š�нћ„џ�ўџўќјѕђяьщцупмйзгаЮЫК3€�Њ)�m…�*�  "$%%�� 5'ž��т˜џўћїєёюышхтомйжгаЭЧŸ�€�)U‡�)  ƒ� &,'Ё��ы˜џ§љіѓёюъчфсолиевЯЬТz��Q‚�CG‰�'O'"H ˆ�)!˜�Нј˜џќљіђ№ьщцфрнкздбЮЫМ*€�.)€��€�HCŸ�AO Y:—�лў‘џ�ў‚џўћїѕђяыщцупмйжгаЭЩЋ€�v‚��€� 8U˜�"MC��f—��х˜џ§њієёюышхсолйжвЯЭӘ��n‰� "<QU� 4ZQ#€� S–�oёŠџ�ў„џ�ў‚џќљіѓ№эщчфрнкздбЮЬУQ��A€����ƒ� ,=\UU$?‚� DUecN1„�%–�иќ—џўћјѕђяьшцупнйжгаЭЫГ€�y��„��…� &!# 3*! €��€�4—��с˜џ§њїєёюышхтолйжгаЭЦЂ�‚‚��†��  '# …�Q—��ь˜џ§љіѓёюъчфсолиебЯЭТr�f�€��‚��ƒ�  #&($„�'–�Зі‘џ�ўƒџќљѕѓ№ьщцурнкидаЮЫЛ$€�.(�ˆ��€�  $''" „�0—�л§Šџ�ў‰џўћїєђяьшцупмйжгаЭЩЅ�|‰��‚� !%'&  �‚��A—��х˜џ§њієёюъшхсолйжвЯЭУŠ��p…��†� "&($ „� D–�oё˜џќјѕѓ№эщчуролиебЮЬФQ��;‡��„�  #&(#„� –�Юќ—џўћјѕђ№ьшцупмйздбЮЫЏ€�UŠ��� !#''! „��3—��ф’џ�ў‚џўњїєёюышхтпмйжгЯЭЦš�wŽ� "$'%  €��€��L—��эџ�ў†џў§љіѓёюъчфрнлиебЮЬФi�Z��  $%'$ „�0–�Ді‚џ�ў„џ�ўџўџў‚џўќјѕђ№ьщцфрнкздаЮЬЛ+€�3+�„���� !$&'" „�1—�п§—џўћјѕђяышхтпмйжгаЭШЋ��…��ƒ� "%'&  „��A—��ц˜џ§њієёюъчхсолйжвЯЭУ��m�  #%'% …�R–�ˆђ˜џќљѕѓ№эщчфрнкидбЮЬС<��A‡��„�  $&'# „�%–�Эћ—џўћјѕђяьшцупмкзгаЮЪА€�s�Œ� "$''! „��C—�тў—џўћїєёюышхтпмйжгаЭХ™��€��‰�� "%'% ��€�D—��ыˆџ�ўŒџ§љіѓ№эъчхсолиебЮЭПa�E�€�ˆ�  "&'$ „�7–�Эї€џ�ў“џўћјѕђ№ьщцурнкздбЮЫД€�u����ƒ� !#''" „��<—�йў—џўћїєђяышцтпмйжгаЭЧš�d‚��†��� "%'&  „��I—��ы˜џ§њїєёэъшхсолйжвЯЭСx��{€��‹�  #&'$ „�D–�ѓџ�ў“џќљѕѓ№эъчфрнкздбЮЬП>��5‡����� !$&(# „�-–�вћ‹џ ўњєяюььэ№ѕћ€џњѕђяьшцупнкзгаЮЪž� ‡���� "%'&! „��J—��х‡џ#ќ№хпзЮУТМЇЋЋЉСФЪгмуюљљёщчхтомйжвЯЭУŒ��}€��„��ƒ� "%'%  …�F—��эƒџ ўёфзШК‚scK($�)/\n‡ЃРапьіэурнлиевЯЬСP��P‚��‰�  #&'$ „�<–�Жї€џ§ђтЬКŸŽUŽ�#x ТжъячлйздбЮЪД €�k€��‹� !$''" ����;—� мўџєуЩЗ›n$•� 'ŽЙгшьпдваЭЧ™�{‚����„� "$'&  €��€��J—�цшаЕ—n š� wЗеычдЬЭСr�c���‰�  #%'$ „�D—�AЊ’)Ÿ� …ЛньлЩЙ&�-�€��‰�  #%'# „�."П�™ШцтЊ�� "$''! €��€�4Т�N­а}��{��� "%'% ��€�CУ� ‚��Z€��‚��ƒ�  #&'# „�'Щ�z�ƒ��ƒ��� !$&'" ���4Ъ�†�…��„� "$&&  „��?Ъ� ��€��‚�� #$'$ „�AЫ�M€��„�  #&'# „�"Ь�9 ��€ƒ��� !%'&! €�‚�<Я�(/ ��€„� "%'% ��€�Gб�I9 €����  #%'# ��B#г�6.�� "%()$ €� *-и�C% �  �-( о�$2+Œ� ",ф� (-& € %$C( џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�‘�t8mk��@�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ab}ІЃЃЃЃЇ‡_3������������������������������������������������������������������������������������������������������������HgžЬюџџџџџџџџџ§хНU(�����������������������������������������������������������������������������������������������������GЬіџџџџџџџџџџџџџџџџџџџњЗd �����������������������������������������������������������������������������������������������PŸєџџџџџџџџџџџџџџџџџџџџџџџџџџѓ•>�����������������������������������������������������������������������������������������JЃѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДC������������������������������������������������������������������������������������� zтџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџž(�����������������������������������������������������������������������������������Сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя{���������������������������������������������������������������������������������щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзE ������������������������������������������������������������������������������Xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu �����������������������������������������������������������������������������ЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГ �����������������������������������������������������������������������������ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ8����������������������������������������������������������������������������?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ…E����������������������������������������������������������������������������‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтrEH` ����������������������������������������������������������������������еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХi;RџџЦ2���������������������������������������������������������������������+љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ\.­џџџќˆ������������������������������������������������������������������Wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю{N# яџџџџџщ]����������������������������������fУc�����������������������Вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаn@cџџџџџџџџзV�����������������������������<žѕџџџ �����������������������эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕa3•џџџџџџџџџџеY������������������������>ŠчџџџџџћЄ%����������������������<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќŽT( еџџџџџџџџџџџџѓ™2�����������������NЃёџџџџџџџџъ‘;����������������������ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоsF?џџџџџџџџџџџџџџџјкЄV �������1`ЏдёџџџџџџџџџџџЬxC����������������������жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКg:…џџџџџџџџџџџџџџџџџџџєтбУЛ‰†††ИУЮлыњџџџџџџџџџџџџџџџІg<����������������������*їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™Y-Еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј‰V-���������������������bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэzK! №џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпrE���������������������ВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШl=dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВe6���������������������ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ_1™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§’W* ��������������������?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљˆQ& дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяyI ���������������������ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмqD?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХj<���������������������дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗf7„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ^0���������������������+јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›X+ Жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј…P% ��������������������bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьwK!"ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмpB���������������������ВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦk=eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџАd5���������������������(іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ^0˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§“W* ��������������������VџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљˆQ% дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыvI ���������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмqCKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХj;���������������������йџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДe6~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœ].��������������������>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›X+ Жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџі„O$ ��������������������pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцvJ (єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиoA���������������������МџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШj=wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎc5���������������������#єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІ^0Бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџє„U( ��������������������WџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљˆP% рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцrF���������������������”џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжqCEџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОf8��������������������� зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏd6™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў•Y+ ��������������������CџџџџџџџџџџџџџџџџўђяпжзепяєџџџџџџџџџџџџџџџџџџџћV* ШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьxK!���������������������tџџџџџџџџџџџїнЬПВžˆ„~‹›ГХзѕџџџџџџџџџџџџџџщtH%№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџдl>���������������������ХџџџџџџџћтЩЕ•ˆ{vqkd_YVTVZ_flry…ЋаіџџџџџџџџџџџПi:vџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅ_1���������������������,јџџџџћмРŠ‚yoeZPIB;4.*('(+/5=ENXdq…Жсџџџџџџџџџ˜[-ГџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєƒR& ��������������������AџџќцЧ‰th[NB6,% #+6DTdtЌшџџџџџџєM# оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуqC���������������������|Т™ˆ‚vhXH:-# 13113" (7I\pЌюџџџџжn@KџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКe6���������������������,Qgj\K:+ 2OfžЕохўџџџџѕтаЃlO(  1F\uХјџџЋb3›џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ‘X+ ��������������������� 3@=0"=YŽй§џџџџџџџџџџџџџџџџџћЭs7 1H_Šжг€R' ФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьwJ ���������������������� #MwШџџџџџџџџџџџџџџџџџџџџџџџџџўЙW !6Ndm^=,їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбk=�����������������������9|оџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуm ':C;%uџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃ^0����������������������\Мџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџг[  ГџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕƒQ% ���������������������:эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМ<бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоqC���������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї‡��� sьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКe6���������������������Уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџд*�� "VЭўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњW* ��������������������4ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџY�8Z•щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыvI ���������������������xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёV' � 6RlГёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљоžf9���������������������Љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа^1� *B[tЖёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§№Ш™‡qP( ���������������������фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ_0'€91H_wЎчћџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ№иІƒvfN2���������������������ZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќT( нџўŒ !4I_rŽТъњџџџџџџџџџџџџџџџџџџџџџ§ѕыЧЃ„zm^L9' ���������������������ŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфsFMџџџџзN  "3FYixŽБеъєњџџџџџџџџџџќјђъеМЄ’‡€wl_P@0" ���������������������ФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОh:ŸџџџџџџИ2 ,;L[hs}‡”ЈГЩЪЪЪЪЬМЎЁ“ކ‚|tmdYL>0%% ������������������������/ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћZ- лџџџџџџџ§Њ&"-:FR\djotwyzzyxuqlga[RH=4+"3‘ьІ �����������������������sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэyK! +їџџџџџџџџџѓИ?  %-39@FKNNNNLHA;61+%OЇмїџџџ����������������������Ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгk=sџџџџџџџџџџџџќо”5   "###!LЩшўџџџџџџƒ'����������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃ_0ЧџџџџџџџџџџџџџџџћуО}H 5U…Иеэ§џџџџџџџџџяg8���������������������WџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓQ% ъџџџџџџџџџџџџџџџџџџџўєчмжФФФТамняљџџџџџџџџџџџџџџџмj=���������������������‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуqCNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФe6���������������������ТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗd6Њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§”Y+ ���������������������+љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњŒW* лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщwK!���������������������rџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъuI +јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгl>���������������������ЂџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫi;џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ_1���������������������рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ].СџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓƒR& ��������������������OџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђP$ шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрqE���������������������œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнoAKџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХf7���������������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГc5Њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜Y+ ���������������������)іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљŒV) кџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъxL" ���������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъtH7§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжm>���������������������ДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХi:~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБa2���������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў˜\.бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓƒS' ��������������������Mџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџё~N# *јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиqE���������������������šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкn@\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛe6���������������������Цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­b3Єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў™W* ��������������������3љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ‚T( ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфuJ ���������������������zџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџлqE=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩj=���������������������ЖџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛd6‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ^0���������������������хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ”W* зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіƒP% ��������������������PџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџуuI /њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеpC���������������������ЃџџџџџџџџџџџџџџџџўўњююююћўџџџџџџџџџџџџџџџџџџџџЬj<fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛd6���������������������ШџџџџџџџџџџџќчгЧМ­˜Š‡……•›БПЭтњџџџџџџџџџџџџџџџŸ\/Вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў™W* ���������������������.їџџџџџџџћшйК›Š„}ytqlgb`achmrw|ŽЛнјџџџџџџџџџџџ№}O$ яџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчuJ ���������������������wџџџџџљхЧ ‹„|si^TMGA;62//27=CJR\iuЧяџџџџџџџџџйoA>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪk=���������������������ЎџџјуХœŠ€vj^SF:/'" &.:IYi|ГьџџџџџџџЗb4‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ^0���������������������'ДР”‰€uhZK=0& ��  ,;NaxИёџџџџј‹V( аџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї‡Q% ���������������������;\liZJ:-! ���������������$5I_}ШљџџфtH/ћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеqC����������������������';C;- ���������������������� "4Kb“сќЕg:_џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНe6������������������������������������������������� #8Ql‚oR*Нџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§“W+ ������������������������������������������������������� (>NL7яџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхuI ���������������������������������������������������������������� $% LџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШj;����������������������������������������������������������������� aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ^/���������������������������������������������������������������������v№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєP% �������������������������������������������������������������������������2cЩќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгpC������������������������������������������������������������������������� >^‘тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌc5�������������������������������������������������������������������������6QiЃшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџілЄwP' �������������������������������������������������������������������������� (@XožпњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјшН”‡w\8����������������������������������������������������������������������������� .DZnŠШяќџџџџџџџџџџџџџџџџџџџџџџџџџџїчΘ‰sdP8 ������������������������������������������������������������������������������/BVhx˜Хщі§џџџџџџџџџџџџџџџџџўіывБ–ˆtgXH6' ��������������������������������������������������������������������������������+;M^ly‡ŸОйщюѓјјјјјјіяюцгФЉ“‰‚zqfXI9+ ����������������������������������������������������������������������������������� #0>LZenv}‚…‡ˆˆˆˆˆˆ‡…„€|unf\PC6+ ����������������������������������������������������������������������������������������� "+5?IS[_bcdddddba^YRI?6-$ ����������������������������������������������������������������������������������������������  '+.01222210/-*% �����������������������������������������������������������������������������������������������������  ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_linux.icns����������������������������������������������������������������������0000664�0001750�0001750�00000077013�10411554704�015751� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��~ it32��=ћ����џ�џ�Г�ƒ9�ђ�4…Мз‚жŸ\ ь�HЌЦ…ХƒФxш� †ƒД€Г„ВББІAц�˜€Ѓ€Ђ…Ё„ �bх��u…‘…„�,у��0…€……~�mу��Tp…o…n‚m�т��H„`…_…^]]"т��=€Q…P…OƒN�т��)„A…@‡?�т��…3…2…1�ф��ƒ%Š$€#х�� ‹ƒч� Œ  ы��‚‡ј�`ŸПП€ ч�ппŸ …�Яџўћ]ц��џэ„��Яџўћјхф�� џ§јЗƒ��€џўћјє№Вф��p€џ§јѓяX‚��п€џўћјє№эщ:у�Џџ˜яъ­��@€џŸ,tVxэщцŽу�ПЯNЩиƒЁцс�@џџпM€Щ ƒцтау�ПЈЈЇ…см�@џўŽŠ€ŸžWтолу�Н’€yxJни�@ўћ|€vuu:Елз(т�‹žIIHH.еЙ€SRqхј{D€LK"Єзду� [р[ВЮй€щиСЎp€" ЩдУу�ыe� ‚Чњ„џ юЗr^да€ф�ЌсXІнˆџоЗ[^даЬ3ф�8ЮЛё‹џљнХЈЏ…х�[ФіџлЂ:у�gХћ’џљ˜ с�Ућ”џЖ'с�Gо•џИс�<р•џ�Љт�Ь”џъ€у�~х’џњМˆу�=июџэСТМу�@ќоъџрХТЭжќт�@џ§щыŠџђЮЬжзйіў_т��@€џэьў†џ ќхаилсяџўўЮт��@џё№ў„џђмконѓџџў�?с��@‚џљѓљћќћњёхрспч§џџў§нс��@ƒџ ўњїє№ьщцусє€џў§§ќ~р��`„џњѕђюъцч№§€џў§§ќќьо�п†џќњљќ‚џў§§ќќћћnо��Џџў§§ќќ€ћ�Ын��€џў§§ќќ€ћњљ/л�� џў§§ќќ€ћњљљŒл��ПŽџў§§ќќ€ћњљљјЩк��@Žџў§§ќќ€ћњљљјјїз�Рџў§§ќќ€ћњљљјјїї|€а�"џў§§ќќ€ћ њљљјјїїіз€Ь�€‘Œџў§§ќќ€ћњљљјјїїіѕѕ@€Ш�р‹џў§§ќќ€ћњљљјјїїіѕѕєšФ� 5‹џў§§ќќ€ћњљљјјїїіѕѕєѓѓ$С�tŠџў§§ќќ€ћњљљјјїїіѕѕєѓѓђ‹ О�€б‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђёт€€Н� ‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№™ €М�  fˆџў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яю' €Л� с‡џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яюэ˜ €Й� h‡џў§§ќќ€ћ њљљјјїїіѕѕєѓѓђё№№яюэьь) €И� с†џў§§ќќ€ћ'њњљјјїїіѕѕєѓѓђё№№яюэььы| И� i†џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъл€  Ж� €№…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшT€  Ж�€ˆ…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчŠ€  Е�!№„џў§§ќќ€ћ-њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчцЫ Д�z„џў§§ќќ€ћ%њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццх!€ Г�тƒџў§§ќќ€ћ0њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфI В�.Aƒџў§§ќќ€ћ1њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфу| В�m‚џў§§ќќ€ћ3њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфут‰ А�PЈџў§§ќќ€ћ4њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсЎА�ё€џў§§ќќ€ћ5њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрЎ Џ�?6€џў§§€ќ8ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпо Џ� pџџў§§€ќ9ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонЎ� /œџў§§€ќ;ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонм ­� Цў§§€ќ<ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлЌ� 2Ц€ў§§€ќ=ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлк,  Ќ�тўў§§€ќ>ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйO! Ќ�  ўў§§€ќ?ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйиP""!  Ќ�  !"ў§§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизQ$#"!!  Ќ� ' !"#т§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизеQ%$$9`q‚‚gV-­� ,+a‚žh/#$Ч€ќ3ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизже&&@w…„h.Ў�>2‰сџџс‘=%Чќќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйизжеО(:‰b4­�HЂјџ7јžE„ќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйиОЏЎЎw5Š?<­�‘–№ƒџ1ј‘:Pюњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйг—Е€сФGŠ9Ќ�Тл…џ/щŠ08гљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйиДвџаŠ!ФЊ�)Р‡џ.кr,,Ќјїїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизЏсџР ‰пџс”Љ� Іјˆџ,О]./zїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизж›‚џР-ˆ�€џ�žЈ�бЂыŠџ+ЃA01oщѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизже›‚џР+-'  Aџ�ІЇ�Єы‹џ+ъ~123Wшѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизжег›ƒџ ! ,.-,,+*)1яџ�ІЃ�FFжЎЦљџ*Щb334AЯђё№№яюээьыъщшччцхфутсрпонмлкйизжегвƒџ Я! #.-,,(`ƒџ�ІŸ�сЦ­Цйѓ‘џ)ЈF5567Ќ№№яюээьыъщшччцхфутсрпонмлкйизжегвбŸ„џяA€ !А„џ�ЇŸ�РЭљ•џ)ы~67789~яюээьыъщшччцхфутсрпонмлкйизжегвбаЁ†џп€€�А†џЦw�ꘟ(Хb899:;]тэьыъщшччцхфутсрпонмлкйизжегвбаЯЃ•џјœ œ��Х™џљ ?:€;!<SЫыъщшччцхфутсрпонмлкйизжегвбаЯЮЅ–џъžІ›��Тšџ'р};;<==>IпщшччцхфутсрпонмлкйизжегвбаЯЮЭЇ—џж› š�июšџ&МT==>??@ЊшччцхфутсрпонмлкйизжегвбаЯЮЭЫЉ˜џжž5™�ёщšџ&ѓ˜D??@AAччцхфутсрпонмлкйизжегвбаЯЮЭЫЪЋ™џыM˜�к›џ%еo@AABBrчцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪБšџђЇп—�Nжœџ$ГSBBCDxцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪ—НœџЩЄ™•�^зœџ$шŠCIa~ЁхфутсрпонмлкйизжегвбаЯЮЭЫЪژCПџыb”�|Ъџ�ЫЁЉфутсрпонмлкйизжегвбаЯЮЭЫЪژE^бžџжФ•��Чџ#љДЊЖЧрутсрпонмлкйизжегвбаЯЮЭЬЪЪyGFgиžџз˜”�Йлžџ"юЖсфутсрпонмлкйизжегвбаЯЮЭЬЪТrIHG|ьžџИX”�УмŸџ!нИутсрпонмлкйизжегвбаЯЮЭЬЪ›[JJII“іџЮ„•�Lц џЬУсрпонмлкйизжегвбаЯЮЭЬЋeMLLKJJЇœџљП‚–�ѓЁџЛбпонмлкйизжедвбаЯЮЭЅoOONNMLLKЫ›џйЁ\—��лЂџљЈРнмлкйизжедвбаЯЇˆY€QPPONNMhк™џыЗ~˜��бЃџвubŽЇЗЗЯОЕДЋ“ƒkT€S€RQQPPONxч—џіЬ˜0š��жЃџљRRSSTT‡U TTSSRRQQPOˆ№•џћнБVœ�иќЃџЗSTTUU€VƒW€V UUTTSRRQQŸћ”џ№Т‚ž�оЃџНTUVV€W…X€WVVUTTSRQЈ“џќпЎ5 �илёЁџОVVWX…YXWVVUTSRЊ’џіЬˆЃ�cЕЯцёњџПW€XYY€Z[€ZYY€XWVUUTЌ‘џщП6Ї�` Смщђј™џАXYYZVPPOQQGCCB8*AAKOWVUŸіŽџ§сЅ­�G˜ЗЮъ№ѕњ“џс‹C“�*AŠэџљкˆГ�cЉФуюіџнЁ—�LрŒџњмTИ�eКкьљ‹џб”š�вїŠџњлWМ�ŽОмяњ†џћЯ~›�Цп§ˆџіз!П�'™Ьуяќ‚џѓЪw�емѓ§„џћѓЙ!У� IœПимфпЯЅHŸ� ?БбэяѓіѕѕсНBџ�џ�џ�џ�™�џ�џ�Г�ƒ9�ђ�4…Мз‚жŸ\ ь�HЌЦ…ХƒФxш� †ƒД€Г„ВББІAц�˜€Ѓ€Ђ…Ё„ �bх��u…‘…„�,у��0…€……~�mу��Tp…o…n‚m�т��H„`…_…^]]"т��=€Q…P…OƒN�т��)„A…@‡?�т��…3…2…1�ф��ƒ%Š$€#х�� ‹ƒч� Œ  ы��‚‡ј�`ŸПП€ ч�ппŸ …�Яџўћ]ц��џэ„��Яџўћјхф�� џ§јЗƒ��€џўћјє№Вф��p€џ§јѓяX‚��п€џўћјє№эщ:у�Џџ˜яъ­��@€џŸ,tVxэщцŽу�ПЯNЩиƒЁцс�@џџпM€Щ ƒцтау�ПЈЈЇ…см�@џўŽŠ€ŸžWтолу�Н’€yxJни�@ўћ|€vuu:Елз(т�‹žIIHH.бЂ€/.Nдј{D€LK"Єзду�[р:qЅЙжвЮЏ‰pY€" ЩдУу�ыe�J“ѕџџ§§ќѕюШu@ ^да€ф�ЌсJ^Л‚џў їлІrQ3LдаЬ3ф�8Бwт€џў§ќќћњљјјчжР™~g„}х�3„ь€џ§ќћљјіѕєђё№юэтШЏŒ] у�:…іџџў§ћљїѕѓёяэыщчхфтрдЊЂWс� |іџџўќљїєђяэъшхуролйждгКЇlс�(ЕџџўћјѕђяьщцурмкжгаЬУЙВЌЇn с�"Жџ§љіѓяьшфснйжвЯЦНГЊ‚Ї�aт�‚§јѓяьщфрмидЯЩСЙДЏЊ‚Ї•Nу�GЖѓющфрмзвЭШТНИДЏЊ‚ЇЃnvу�7ТщфплжбЬЧТНИГЏЊ‚Ї—qœМу�@ї“ЊпкжбЬЧТНИГЎЊЇŠs‹Кжќт�@џїЎЁебЬЧТНИГЎЉ€Їšx˜Ьзйіў_т��@€џА—ЧЧТНИГЎЉЇЇЄŒ‚УлсяџўўЮт��@џГ“ОНИГЎЉЇЇ—€Ќонѓџџў�?с��@‚џгŽŸЅІЁŸ“†Ѕепч§џџў§нс��@ƒџ №гТРНКУйусє€џў§§ќ~р��`„џњѕђюъцч№§€џў§§ќќьо�п†џќњљќ‚џў§§ќќћћnо��Џџў§§ќќ€ћ�Ын��€џў§§ќќ€ћњљ/л�� џў§§ќќ€ћњљљŒл��ПŽџў§§ќќ€ћњљљјЩк��@Žџў§§ќќ€ћњљљјјїз�Рџў§§ќќ€ћњљљјјїї|€а�"џў§§ќќ€ћ њљљјјїїіз€Ь�€‘Œџў§§ќќ€ћњљљјјїїіѕѕ@€Ш�р‹џў§§ќќ€ћњљљјјїїіѕѕєšФ� 5‹џў§§ќќ€ћњљљјјїїіѕѕєѓѓ$С�tŠџў§§ќќ€ћњљљјјїїіѕѕєѓѓђ‹ О�€б‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђёт€€Н� ‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№™ €М�  fˆџў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яю' €Л� с‡џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яюэ˜ €Й� h‡џў§§ќќ€ћ њљљјјїїіѕѕєѓѓђё№№яюэьь) €И� с†џў§§ќќ€ћ'њњљјјїїіѕѕєѓѓђё№№яюэььы| И� i†џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъл€  Ж� €№…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшT€  Ж�€ˆ…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчŠ€  Е�!№„џў§§ќќ€ћ-њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчцЫ Д�z„џў§§ќќ€ћ%њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццх!€ Г�тƒџў§§ќќ€ћ0њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфI В�.Aƒџў§§ќќ€ћ1њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфу| В�m‚џў§§ќќ€ћ3њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфут‰ А�PЈџў§§ќќ€ћ4њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсЎА�ё€џў§§ќќ€ћ5њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрЎ Џ�?6€џў§§€ќ8ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпо Џ� pџџў§§€ќ9ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонЎ� /œџў§§€ќ;ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонм ­� Цў§§€ќ<ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлЌ� 2Ц€ў§§€ќ=ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлк,  Ќ�тўў§§€ќ>ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйO! Ќ�  ўў§§€ќ?ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйиP""!  Ќ�  !"ў§§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизQ$#"!!  Ќ� ' !"#т§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизеQ%$$9`q‚‚gV-­� ,$;L]?(#$Ч€ќ3ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизже&&@w…„h.Ў�>%OЇЇU.%Чќќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйизжеО(:‰b4­�Ж_ЁЇ7Ё]2„ќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйиЋ‘a1Š?<­�:<TœЇАЬЬУЇЁU/Pюњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйЯfn€zGŠ& Ќ�j‹ЇТы€№1нЋ–P,8гљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйиš…ЇŽŠzPLЊ�ЄvЇНƒэ0рЋ‹E,,Ќјїїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйиз‘Ї~ ‰ ’ЇSЉ�s`ЂЏц„ъ7еЇu>./zїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизжnЇЇКПК~-ˆ�^€Ї�]Ј�\—Їи†ш/ЧЇ`501oщѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизжеnЇЙ€ёЕ+-'  =ооЕЇcЇ�е^™ЉЧˆц.И™K123Wшѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизжегnЇЪю ,.-,,+*)-пююрЇcЃ�>Гvf|ІЌС‰ф.нЏB334AЯђё№№яюээьыъщшччцхфутсрпонмлкйизжегвoЇЩы П #.-,,(HтыЇcŸ� Zеmg}ŽЃЎЎБШ‹у-вЎd:5567Ќ№№яюээьыъщшччцхфутсрпонмлкйизжегвбpЉЩ‚щк7€ ˆх‚щЉdž� дo„ЋББЗУЬиŽс,Н M67789~яюээьыъщшччцхфутсрпонмлкйизжегвбаqЌЩƒчуАe€W~д„чЌ}B�‘‘ГГСз’р,кЖD899:;]тэьыъщшччцхфутсрпонмлкйизжегвбаЯrЏЪ†хозо†хЙЉZUœ�mЖЖЛ•пЭАa;:€;#<SЫыъщшччцхфутсрпонмлкйизжегвбаЯЮsБЪ’укДŸ[N›�kИИЦ–о*ПšN;;<==>IпщшччцхфутсрпонмлкйизжегвбаЯЮЭtДЫ“тйЗUš�xЉЛШ–н*дЛwC==>??@ЊшччцхфутсрпонмлкйизжегвбаЯЮЭЫvЗЬ”рлО‘WІ™�‡ІНХ—н)ЫБ\@??@AAччцхфутсрпонмлкйизжегвбаЯЮЭЫЪwЙб–пЪІZȘ�—–РХ—м)кС“M@AABBrчцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪwМж—пжЗfy—�И’ТҘм(дТnFBBCDxцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪ—vПж™оа‰_п•�П”ХХ™л&ЪЋUCIa~ЁхфутсрпонмлкйизжегвбаЯЮЭЫЪژCxС›нС­ZР”�ЩƒЧЧй˜лиШ‹€ЁЉфутсрпонмлкйизжегвбаЯЮЭЫЪژELЧšнмФФšl•�ЪЪблззй„л%жУ~ЅЖЧрутсрпонмлкйизжегвбаЯЮЭЬЪЪyGFO•ЮšнЯЧЧœS”�ђš€Ьак‰лкеЯЬЭбжкл$гИ}мфутсрпонмлкйизжегвбаЯЮЭЬЪТrIHGVБгнйеджлƒнка€Ъz0”�џœЯбй†млжа†Я)адиллзЯЄ‡утсрпонмлкйизжегвбаЯЮЭЬЪ›[JJII]Рв‹нйбЬЭе€нлгЬ’H•�КЋƒбжк‚млзвб"ŸсрпонмлкйизжегвбаЯЮЭЬЋeMLLKJJiЯЯлˆнкг…ЯбееЯШG–�›С…д�е€з�ж”д"{ПпонмлкйизжедвбаЯЮЭЅoOONNMLLKƒввдл…нйевŸ^0—��zЂзЯkЛнмлкйизжедвбаЯЇˆY€QPPONNMT™дикммкйзŽдИpE ˜��‰Ѓй›VbŽЇЗЗЯОЕДЋ“ƒkT€S€RQQPPONYЏ—зЩ‰Tš��‘ЃмдZRRSSTT‡U TTSSRRQQPO^П•кгЂb/œ�€зЃоvSTTUU€VƒW€V UUTTSRRQQeж”мСvGž� œЃсTUVV€W…X€WVVUTTSRQh“пиЁa �{‘СЁу€VVWX…YXWVVUTSRi’тЭ}KЃ�7f{ЂОицW€XYY€Z[€ZYY€XWVUUTk‘фЎlЇ�7Ymˆ КЮ™шqXYYZVPPOQQGCCB8*AAKOWVUhвŽчр•\­�&Ugu–АУз“ыЗ[C“�*A]Оъе‡MГ�5`nŒЊЫэБZ —�'œŒэиƒ0И�9h‚Њк‹№šSš�wйŠялƒ0М�Pl‰Пу†ђъ”G›�o‘ыˆђУzП�Vs Цэ‚ѕл…A�y„Шэ„ѕгЃhУ� (YkŽЕЋˆ\(Ÿ� dwЁЂБЙЅЅk$џ�џ�џ�џ�™�џ�џ�Г�ƒ9�ђ�4…Мз‚жŸ\ ь�HЌЦ…ХƒФxш� †ƒД€Г„ВББІAц�˜€Ѓ€Ђ…Ё„ �bх��u…‘…„�,у��0…€……~�mу��Tp…o…n‚m�т��H„`…_…^]]"т��=€Q…P…OƒN�т��)„A…@‡?�т��…3…2…1�ф��ƒ%Š$€#х�� ‹ƒч� Œ  ы��‚‡ј�`ŸПП€ ч�ппŸ …�Яџўћ]ц��џэ„��Яџўћјхф�� џ§јЗƒ��€џўћјє№Вф��p€џ§јѓяX‚��п€џўћјє№эщ:у�Џџ˜яъ­��@€џŸ,tVxэщцŽу�ПЯNЩиƒЁцс�@џџпM€Щ ƒцтау�ПЈЈЇ…см�@џўŽŠ€ŸžWтолу�Н’€yxJни�@ўћ|€vuu:Елз(т�‹žIIHH.Ь‰&Рј{D€LK"Єзду� [р € *A€" ЩдУу�ыe�  €€ПП€P ^да€ф�Ќс;�†„ѓ Ф 8даЬ3ф�8’  Ќ‡ж‚@Ssх� !Ќ‹И”B� у� 8Ž›| с�‘~6�с� �<a[K4!� с� �5‰C1!ƒ�� т�€�ƒ&$…�у��ˆ�bу�2K �sМу�@ёN� SЅжќт�@џёxŠ�dТзйіў_т��@€џz!†� 8ЎлсяџўўЮт��@џ|&„�!‚онѓџџў�?с��@‚џВ/€ %oЪпч§џџў§нс��@ƒџ хБ–“‘ŽЃЮусє€џў§§ќ~р��`„џњѕђюъцч№§€џў§§ќќьо�п†џќњљќ‚џў§§ќќћћnо��Џџў§§ќќ€ћ�Ын��€џў§§ќќ€ћњљ/л�� џў§§ќќ€ћњљљŒл��ПŽџў§§ќќ€ћњљљјЩк��@Žџў§§ќќ€ћњљљјјїз�Рџў§§ќќ€ћњљљјјїї|€а�"џў§§ќќ€ћ њљљјјїїіз€Ь�€‘Œџў§§ќќ€ћњљљјјїїіѕѕ@€Ш�р‹џў§§ќќ€ћњљљјјїїіѕѕєšФ� 5‹џў§§ќќ€ћњљљјјїїіѕѕєѓѓ$С�tŠџў§§ќќ€ћњљљјјїїіѕѕєѓѓђ‹ О�€б‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђёт€€Н� ‰џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№™ €М�  fˆџў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яю' €Л� с‡џў§§ќќ€ћњљљјјїїіѕѕєѓѓђё№№яюэ˜ €Й� h‡џў§§ќќ€ћ њљљјјїїіѕѕєѓѓђё№№яюэьь) €И� с†џў§§ќќ€ћ'њњљјјїїіѕѕєѓѓђё№№яюэььы| И� i†џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъл€  Ж� €№…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшT€  Ж�€ˆ…џў§§ќќ€ћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчŠ€  Е�!№„џў§§ќќ€ћ-њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчцЫ Д�z„џў§§ќќ€ћ%њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццх!€ Г�тƒџў§§ќќ€ћ0њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфI В�.Aƒџў§§ќќ€ћ1њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфу| В�m‚џў§§ќќ€ћ3њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфут‰ А�PЈџў§§ќќ€ћ4њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсЎА�ё€џў§§ќќ€ћ5њњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрЎ Џ�?6€џў§§€ќ8ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпо Џ� pџџў§§€ќ9ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонЎ� /œџў§§€ќ;ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонм ­� Цў§§€ќ<ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлЌ� 2Ц€ў§§€ќ=ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлк,  Ќ�тўў§§€ќ>ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйO! Ќ�  ўў§§€ќ?ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйиP""!  Ќ�  !"ў§§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизQ$#"!!  Ќ� ' !"#т§€ќ@ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизеQ%$$9`q‚‚gV-­� , � #$Ч€ќ3ћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшчццхфутсрпонмлкйизже&&@w…„h.Ў��8%Чќќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйизжеО(:‰b4Ж�5„ќћћњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйи”kjjD,Š?<Б�5llQ��!Pюњњљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйЪ(‚��GŠЎ��NХ€в0 �(8гљјјїїіѕѕєѓѓђё№№яюэььыъщшччцхфутсрпонмлкйиy‚�Š�­��?ƒЫ/Є � ,,Ќјїїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизkƒ� Š­��З„У7†�./zїіѕѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизж5��7D7�-ˆ­��†М/^�'01oщѕєѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизже5�5€е +-'  6ŸŸ(Љ��ZˆД.- 123Wшѓѓђё№№яюээьыъщшччцхфутсрпонмлкйизжег5�gЭ ,.-,,+*)'РЭЭІЅ� �@‰­.— 334AЯђё№№яюээьыъщшччцхфутсрпонмлкйизжегв6�cХ   #.-,,(ЌХЂ� �� R‹Ѕ-q�+5567Ќ№№яюээьыъщшччцхфутсрпонмлкйизжегвб6�^‚МА$€ :А‚МЁ���:X€Žž,'67789~яюээьыъщшччцхфутсрпонмлкйизжегвба7�ZƒДЉN €{„Д�ž� ��.y’–,ƒ "899:;]тэьыъщшччцхфутсрпонмлкйизжегвбаЯ8�V†Ќ–€–†Ќ� Ÿ� ��•P 6:€;#<SЫыъщшччцхфутсрпонмлкйизжегвбаЯЮ9�R’Є… œ� ��2–‡*;;<==>IпщшччцхфутсрпонмлкйизжегвбаЯЮЭ:�N“›~ ›��0–€*`�/==>??@ЊшччцхфутсрпонмлкйизжегвбаЯЮЭЫ;�J”“€š��—y)5;??@AAччцхфутсрпонмлкйизжегвбаЯЮЭЫЪ;�W–‹<™��—r)k%@AABBrчцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪ0�b—ƒb!—� ��˜j(H� 7BBCDxцхфутсрпонмлкйизжегвбаЯЮЭЫЪЪ— �\™{E–� ��™c&CIa~ЁхфутсрпонмлкйизжегвбаЯЮЭЫЪژC �›s�•���P˜[O|€ЁЉфутсрпонмлкйизжегвбаЯЮЭЫЪژE8 ške��•��� T??I„T%9& ЖЧрутсрпонмлкйизжегвбаЯЮЭЬЪЪyGF6 šc&��”�, €�G‰LG,�0GL$!5зфутсрпонмлкйизжегвбаЯЮЭЬЪТrIHG--ZJ4.9UƒZO€��•�, � 4†E@#†�)0@@,�PутсрпонмлкйизжегвбаЯЮЭЬЪ›[JJII%‹R>�*€RH �•�& ƒ�2‚=6�"xсрпонмлкйизжегвбаЯЮЭЬЋeMLLKJJ��=ˆJ8…� !�–�"…��€� ”�" ЋпонмлкйизжедвбаЯЮЭЅoOONNMLLK�� 6„B>*� —��Ђ�ЖнмлкйизжедвбаЯЇˆY€QPPONNM?�!,,%Ž� ™��Ѓ�3bŽЇЗЗЯОЕДЋ“ƒkT€S€RQQPPON: —�›��Ѓ�RRSSTT‡U TTSSRRQQPO5•� œ�Ѓ� STTUU€VƒW€V UUTTSRRQQ,”�ž�'Ѓ� TUVV€W…X€WVVUTTSRQ*“� �  Ё� VVWX…YXWVVUTSR+’�Ѓ� � W€XYY€Z[€ZYY€XWVUUT,‘�Ї� !  ™�XYYZVPPOQQGCCB8*AAKOWVU3Ž�­� %#“�%C“�*A3 �Г�## � ˜�Œ�# И� $‹� š�!Š�$М�! †� ›�ˆ�'П�!‚� � #„�$"У� Ÿ� %"#%&-$ џ�џ�џ�џ�™�t8mk��@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1rЂТТТУУГ…F����������������������������������������������������������������������������������������������������������������2Ё№џџџџџџџџџџџёІI�����������������������������������������������������������������������������������������������������������AСџџџџџџџџџџџџџџџџџЦL�������������������������������������������������������������������������������������������������������СџџџџџџџџџџџџџџџџџџџџџИ.����������������������������������������������������������������������������������������������������2№џџџџџџџџџџџџџџџџџџџџџџџђa ��������������������������������������������������������������������������������������������������2№џџџџџџџџџџџџџџџџџџџџџџџџџџv�����������������������������������������������������������������������������������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџy���������������������������������������������������������������������������������������������Ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_���������������������������������������������������������������������������������������������$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщ5�������������������������������������������������������������������������������������������•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂ ������������������������������������������������������������������������������������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕD������������������������������������������������������������������������������������������)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ& ����������������������������������������������������������������������������������������jџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџь;����������������������������������������������������������������������������������������‹џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџq$ ����������������������������������������������������������������������������������������ЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛ3��������������������������������������������������������������������������������������� ШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюD��������������������������������������������������������������������������������������� зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`& ���������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•1��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ=��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеH��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпQ$��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрZ) ��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс^, ��������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт`.��������������������������������������������������������������������������������������йџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџт`.��������������������������������������������������������������������������������������ЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФ_- ��������������������������������������������������������������������������������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪ\+ ��������������������������������������������������������������������������������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрZ) ��������������������������������������������������������������������������������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшZ* �������������������������������������������������������������������������������������� –џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ_- �������������������������������������������������������������������������������������� •џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒ2�������������������������������������������������������������������������������������� ”џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ9������������������������������������������������������������������������������������� wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫB�������������������������������������������������������������������������������������ZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяM!�������������������������������������������������������������������������������������Xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџo* �������������������������������������������������������������������������������������VџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ4������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхA������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџg$������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџК1������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіN������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋ) �����������������������������������������������������������������������������������^џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіI����������������������������������������������������������������������������������ЈџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ' ���������������������������������������������������������������������������������&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџT��������������������������������������������������������������������������������Дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџд* �������������������������������������������������������������������������������Uџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}������������������������������������������������������������������������������#№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ>����������������������������������������������������������������������������бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв$ ��������������������������������������������������������������������������Ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“������������������������������������������������������������������������dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџY������������������������������������������������������������������������3џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо5����������������������������������������������������������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЙ ��������������������������������������������������������������������Вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„������������������������������������������������������������������tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕI������������������������������������������������������������������#№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн& ����������������������������������������������������������������Тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ���������������������������������������������������������������UџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџN��������������������������������������������������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџг( ������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰�����������������������������������������������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџы?����������������������������������������������������������fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІ# ���������������������������������������������������������гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕE���������������������������������������������������������6џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ& �������������������������������������������������������ЅџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіG�������������������������������������������������������ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЉ' �����������������������������������������������������gџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџь;�����������������������������������������������������Жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“% ����������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй7���������������������������������������������������xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџb ���������������������������������������������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЅ/��������������������������������������������������Gџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџф?�������������������������������������������������Іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf$�������������������������������������������������&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœ0�����������������������������������������������ЄџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩ>�����������������������������������������������DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяL ����������������������������������������������УџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџY( ���������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ1���������������������������������������������сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ’9�������������������������������������������fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @�������������������������������������������ЕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГE�������������������������������������������Чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›H������������������������������������������� Лџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›I������������������������������������������� ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxF������������������������������������������� Pџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџхt@�������������������������������������������"єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКk7�������������������������������������������Fѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ], ��������������������������������������������ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц„M!�������������������������������������������Вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіj������������������������������������������tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧ& �����������������������������������������3№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<����������������������������������������2№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџS& ��������������������������������������b№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf1�����������������������������������AsВ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџm6�������������������������������bСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџo7������������������������������бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІ9����������������������������“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіf����������������������������Фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп7 ���������������������������Чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџм. �������������������������� Ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџл+ ������������������������� •џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓH ������������������������ yџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘���������������������� [џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфA���������������������Yџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ9 ��������������������+џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ† �������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ3�������������������QџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB�������������������QџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзvE�������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмi:�������������������œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєМ‘vO( �������������������жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаŸŠsS0�������������������� џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтЈ~eH,��������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓЖ”„nS9!���������������������хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљЪ˜‰u[@) �����������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЈ|cH0 ������������������������ ,ЎџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљЪ–„lQ6 ��������������������������F€ЬђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюЈy^@(����������������������������*KiЂФрљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљшшчччеЯЯЮСГГВВЭЮсэџџџџџџџџџџџџџџџџџџџџџџџџж—…mO3 �����������������������������%=Ses~‡НгчџџџџџџџџџџџџџџџџџџџџџџџџџџџљжА˜•’‹Š‰‡…‚|zxxz~ƒ‡­ЬэџџџџџџџџџџџџџџџџџџљУ’}`B'�������������������������������� &3AO\hs{ƒ‹ІФйљџџџџџџџџџџџџџџџџџџџџџюЂ‘…yrmidb`_\YUSOLHFFJOU]enx“џџџџџџџџџџџџџџџџџљЏŽuV7 ����������������������������������� #,5@KValu~‡Єбѓџџџџџџџџџџџџџџџџџм˜†oYH=730..-+(&$# #&,1;FZмџџџџџџџџџџџџџџџѓЏŠnM.���������������������������������������� '/8BO\iv‚БиљџџџџџџџџџџџџџЩ”~aC,  0pџџџџџџџџџџџџџџю ‡iF(��������������������������������������������� "+7EUgwКьџџџџџџџџџџУ‘xX7��������������������1їџџџџџџџџџџџжžƒeB#��������������������������������������������������� (6HZk|˜ТцџџџџџтЏsQ0������������������������>qМхџџџџџџюжЈ{^= ��������������������������������������������������������� +;M`q~ˆ’“’jL,������������������������� #Cbz‡’““’Š~lR5 ������������������������������������������������������������� "0?O^hmomfV>%��������������������������� 6L]hmoomi`Q=(����������������������������������������������������������������#,36761' ����������������������������� !,367763.$ ��������������������������������������������������������������������  ��������������������������������  �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_unknown.icns��������������������������������������������������������������������0000664�0001750�0001750�00000072066�10411554704�016314� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��t6it32��4&����џ�џ�џ�Й� ŽR8ї� qЪЭРP8ѕ�SКЩ€ЦК3*ђ�7АУƒПГI`я�ЂР‡ЙRRь�„ОŠВBDш� hЗЋ_^ ц�Q­ЉЄfCу�=ЄЃ’bC(р�(ŽЂ•—zL(н�xЈ˜t0Bк�l ›‰o8Aи�SЃž‚z?[е�<˜ƒ |t$Zв�%…Ѓvn1ZЯ�mŽЇo6r Ы�cGUЈh&X Ъ�rИU�=Јa6X&Щ�rŽU��.UЇZ8W%Ш� r��Ž€��%IІT4>1Ч��r€�cށ�1HЂM5JJЦ��r�UЊ‚�$5›F=,�1=Х��r‚�+Љ…�(0‘?80!†�UHФ��rƒ�*Ј*‰�ˆ Š�3o00Ф��r„�Ї*Ѕ�ЃH�0Ф��r…�ІEЂ�~‰Š#�0Ф��r‡�ŠSŸ� yЃ‚ƒƒ„�0Ф��rˆ�{`œ� `{|}}~o��0Ф��q‰�Rˆ™� e™tuuvvwxD��/Ф��qŠ�Qy •� b’tmnnoppqq$��/Ф��q‹�(Ё “� HŽlffghhiijk^€��/Ф��pŒ�(…�Nm^__`aabccdd9€��/Ф��p� Ÿ(�MˆfWWXYYZZ[\\]^^ €��/Ф��pŽ� „'Š�4l`OPQQRRSTTUUVWW7��/Ф��o�ƒN‡�3{kHHIJJKLLMMNOOPPQ ��.Ф��o‘�hN„�'wd@ABBCCDEEFGGHHIJJ/‚��.Ф��o’�M�f^9::;;<==>>?@@AABCC@‚��.Ф��n“�3LLlm12334556678899:;;<<=ƒ��.Ф��n”�LЫЅ%++,,-..//01123344566#„��.Ф��n•�Ы?$$%&&''())**+,,-..//'…��.Ф��m•�Є !!""#$$%%&''()"…��-Ф��m•�—� !"†��-С�S�m•�–� ˆ��-Р�#|�l•�–�  ‰��-О�јњј|�l•�•� ‹��-М�ШGќњљ§€�l•�•�€��-К� .gўќћ§џџ€�k•�”�…’��,И�-Гўўќ§џ�(C”�”�„“��,Ж�-ч ўў§ƒџя0� ]“�“�‚•��,Е�€ў†џя@� i ‘�“�–�,�>А�Њ0€ўŠџ`��\ �’�€—�,��>­�СG€ўџ`��h'�’�€—��,�kЉ�.‰€ўџ��g'Ž�‘�—� !�'i��KІ�-ч ўў“џŸ��@M�‘�–�  ��ŒЭ��,,Є�( €ў•џŸ��MLŒ��–� ��1Ё€Ц{ �I,Ё�ј€ў˜џЯ�3e‹��”� ,��$ƒП› �+ž�ШG€ў›џЯ�&qŠ��“�!!��s†Й– �+G›�.g€ўžџЯ0�&‰ ˆ��‘�,,�� X‰В!�*F˜�-Г€ўЁџя0� | ‡��Ž�!,�� U ‹Ћ  �R–� €ўЃџя0� “%†��Ž�!, ��=ŽЄš�_•�FўўЇџ`� z1…��‹�-��'‰‘“:� P “�<ўЉџ`��yH„��‰� C��%p•—8��\ ’�.ўЊџp��xTƒ��Œ‡� -"��Y˜5��Z ‘�,ўЋџŸ��Hw‚��Œ†�88��L›‰U��Y&�)ўЌџŸ��Gv €��‹„�88��@z‚Q��?%�)ў­џП�; ��‹‚�"9 ��.l |M�==Ž�)ўЎџЯ�#Œ#�Š€�-D��$gЃv_�0<�)ўЏџЯ �#Ђ#Š�P��RІoZ�$;Œ�)ўАџя0�ŠЌE.€�€7aЇhT�#h‹�)ўБџ я0� 9����0П3[Їa[�PŠ�)ўВџяP�� �€€�0ПADЇZT� e ˆ�)ќДџpF‡�€�П?5NЅTN� n ‡�&њЕџЋŽ�€‚�­^�5ЂMH1�,WA‡�$јЕџЊŒ�€„�›l€�,=›F 5$��X,�+‡�!їЕџЈŠ�€…�k˜ƒ�!08‘?0(�Y,�%�*‡�!єЕџЇˆ�€†�[–ˆ� ˆ„�YC�#k‘�*‡�ѓЕџЅ†�€‡�<В� DC�f‰Šy�*‡�ёЕџЄ„�ˆ�,Џš� PO�P‚‚ƒƒS�)‡�яЕџЃ‚�~‰�­+—� PP L{||}~~7�)‡�эЕџЁ�~Š�Ћ*•�:Q 9ttuuvwwx�(‡�ыЕџ �}Œ�ŒS’�F]5emmnooppq\��(‡�щЕџŸ}�|�ŠR�G^1^efgghhijjk/��(‡�шЕџ{�{Ž�RyŒ�/G�"Q^^_``abbccde ��'‡� цЕџœy�z�Px‰�0_/�KVWXXYYZ[[\]]^A€��'‡� фЕџšw�z�( …�$`0�DOPPQQRSSTTUVVWX€��&‡� тЕџ™u�y‘�'Ž ‚�U0�5GHIIJKKLLMNNOOPQ=��&‡�рЕџ˜s�x’� &��aI�/@AABBCDDEFFGGHIIJJ��&‡�оЕџ–r�w“� ЃЁ“I� *99::;<<==>??@AABBCD'‚��%‡�мЕџ•p�v”�Хb�12234455677889::;<<=6‚��%‡�кЕџ“n�v•�У$ *++,--.//001223345567 ƒ��$ˆ��иЕџ’l�u•�Т�$%%&&'(()**++,--../0„��$‡�ќзхќГџ‘j�t•�Р� !!"##$%%&&'(()…��$‡�mжгкќВџh�s•�О�  !! †��#ˆ�РЭЯжќБџŽf�r•�Н�‡��#‰�<ЦЫаѕАџŒe�r•�Л� ‰��"Š�;УШЩєЏџŒe�q•�—� ‹��"‹�?ЛФЦя­џХoe�b”�Š�€Ž��"�ГРОцЊџйŒeeW��a“�‰�†‘��"Ž�ГМКхЇџьŒee^>�D)’�‡�„“��"�—ЙЗкЄџь feaI„�C5‘�†�ƒ”��"�™ЕГЮЁџіДhfeI †�OB�…�‚•��"‘�­ЏЬŸџЕshfQ‰�'M�„�–��"’�gЉЌКњ›џШ~jh[%Œ�&rŽ�ƒ�€•�“�nІЈЗљ˜џл‰lj\/�d Œ��”�–�SŸЄДэ•џф“nlcA’� { ‹�€�’�"™�/œ Єэ’џэІpnhG•� m$Š��”�œ�,–ЁьџіАrpjM ˜�k#‰��~’�"" �™—зŒџіК|rpY›�iFˆ��}�"Ѓ�Ž•“жŠџЬ†srbž�\D‡��{Ž�"Ѕ�~’Э‡џнˆuse5Ё�Dd†��zŒ�"Ј�xŽŒЖ„џоšwukEЄ�Bn…��yŠ� +Ћ�uŠˆГџяЌywpFЇ�!w ƒ��xˆ� #Ў� O‚„ЁїїЕ{yrWЉ�  ‚��w‡�5#Б�O~Ž…{ybЌ�}��u…�,#Д�Ux}{fЏ� z€��tƒ�6 Ж�i?В� ‚;��s�$6 ё� bD�q��6ѕ�`_z7$ј�U‚%џ�џ�џ�џ�џ�џ�•�џ�Н�‚evbї�žfedcdїѓ� <ЦlfmПиa`Зё� mhn­яљјш“^]žю�;vih›фјїц‘][ы�™‰ki‰м„јіщДZYwщ�—lk{бˆїъГXWlх�<КmltОѕŠіщЙ_Uiжс�Яrmr­юѕьЫ]SXЪп�}omžхѕєэЪePUм�ž†poп“єьлlNMЊй�’qp†Эѓ•ђялkLK’ж�=Џrq}Пђ˜ёэи…JIг�лxrvГщ›юыр„HFnб�џztsЃцžэып–FEfЮ�c„ut”нЁыщлЇDBQЫ�Ш™vuˆбъЃшчмІA@OШ�Њwv…ПъЇхкТI>FЦ�јx~БдбпЈузОH<?rХ�ЬwГьлЮЯйЈриН[:;vФ� НvВтъйЫЫдмЇожЭY75sУ� ГtВссъпЩЩЪбиІлдШb63fТ�ЎtБ€сшсЦЩбжЂзвЭЧбv32OС�ЋsБсчхЧ‚ФЧЬа›двЮЪХФЬs10OР�ЋqА‚сфцХ…ТЦЩЬЮ‘бЯЮЪЧФ†Тбs/4Р�ЇpАƒсфхЩŠРУУЦˆЧФУТŠРЪнтˆ.*Р�ЇpЏ„стщЦЅНУсёъсˆ-%Р�ЇoЏ…стшЫЂЛ См№ёёхс‡,"Р�ЇmЎ‡сщЬŸИОй€№ёётс‡+"Р�ЂlЎˆсшЮœЖЙвю‚№юсс†*!Р�Ђl­‰схз™ДЗбы„ящсс…)!Р�žkЌŠсхеЕ•ВЕЮщ†юхсс…(Р�žiЌ‹ртпГ“ЏЦчьь…э�ы€р„'Р�›iЋŒорнЕ­Фу‚ъ„ы�х€оƒ&Р�›hЋŽмуЖЊТс†ш‚щ�н€м‚%Р�›fЊŽклрДŠЈИицхх‡цччтк$Р�™eЉитП‡ІЗихƒу‡ф�ки€#Р�–eЉ‘зпН„ЄАжу„с†туо‚з"Р�–dЈ’емЭЁЊЬсо‡пр�пƒе~!Р�–bЇ“гидККЪслл†м†н�жƒг}Р�’aЇ”бйцти…й…кл�з„б{Р�aІ•Я�цƒж‡з‚и�з…Я{Р�_І•Юсб€г…д…е�д†ЮzР�^Ѕ•ЬрЬ„б…в€г�а‡ЬyР�q]Є•ЪоЪ„Ю…ЯаЯЭˆЪwО�ЕVX]Є•ШоШЪ…ЫƒЬЫЩ‰ШvМ�ѕ]SR`[Ѓ•ЧнЧ…ШЩШШŒЧvК�>lTSdІ‡ZЂ•Х�н›ХtИ� MyUTe›ЕбЅYЂ•У�м›УsЖ� Z‘VU]ЎЫщэЌXsК”Т�л›Тs=Э9В�ZЂYVUƒЕРт€ърrV^О“Р�л›РriОНOА�е_VV~ГЗлчццнyT\ПР‘О�к›ОplеМЛї­� 6eVVyЅБеххфу‰RQЇПМ�й›МpˆўхКЙъЊ�™mVVh—АЫ€тсрпп†POЈУК�й›К o‡ўўёМЗгфІ� MVV_•ЗСлппонмлML СŽЙ�иšЙ АL‡џўў№КЕЧИЃ� ZЂYVV”­ЗеммлкййиззЃKJЩЗ�з˜ЗМjДџџўў№СГУУЁ� ЛYVV‡ЌЏЯййиззж€едггŸIHƒШŒЕ�з–ЕИ~,LвџўўјПБГŸ�_VVyЇЋШжж€ед€г€в€б€аЯЯЮЕOFmЦ‹Г�ж”ГЖ–7>У„џўўјОЏБl›� >mVVhІЊПгг€в€б€аЯЯ€Ю€Э€Ь€ЫЪЪАMDaШŠБ�ж“БœE0І‡џўў§Ы­Ќ)˜� MyVVhВЖЬаЯЯ€ЮЭЭЬЫЫ€ЪЩЩ€Ш€Ч€ЦХЌ[B_ЦГˆА�е‘АЈ["ˆў†џўў§ЩЋЊ•� Z‘VV_”ЉЎЧЭЬЬ€Ы€ЪЩЩШШ€Ч€ЦХХ€ФУУ€ТССРИX?IЛБ‡Ў�дЎ­o#ˆю„§…ў§§ќзЉЈё“� еYVV†ВІФЪЩЩ€Ш�Ч€ЦХХ€Ф€УТТССРР€ПОО€НММЛГU=GСЗ†Ќ�дЌЕo$kоћ…ќ†§њљљкЇІг’� mV‚БЇЛЦЦХХФФ€УТТ€С�Р€П€ОННММЛЛ€К€Й ИИЗЗЖЖi;EЊЙ…Њ�г‹ЊБ2Oн…њ‡ћ ќќћјііиЊЄЯ‘�hVнзЖТТ€СРРППООНН€М�Л€КЙЙИИЗЗ€ЖЕЕДД€Г ВВББАf98ЂО„Љ�в‰ЉЌ™3OР„ј‡љ„њіѓєхЉЂБЛ�eVжЖдГОННММЛЛККЙЙИИ€З�Ж€Е ДДГГВВББААЏЏЎЎ€­�Ќ€Ћi76ЁСƒЇ�в‡ЇЊ’I4Ђƒі‡їˆјѓ№№фІЁАPŽ� cVж­АдКЖИИЗ€ЖЕДДГГ€ВББААЏЏЎ€­�Ќ€ЋЊЊЉЉЈЈЇЇІІЅЄz43tЫ‚Ѕ�б†ЅІb(”‡є‡ѕ…і їїѓээыЏžІf� cVеЋЋЎЮА АВ€БААЏЎЎ€­ЌЋЋ€ЊЉЈЈЇЇІІЅ€ЄЃЃЂЂЁ€ ŸŸv31rЪЇ€Є�б„Є­k)…ф€ё‡ђ…ѓ‡єѕёъъш­œŸRŒ�cVдЉЭЖ‰–ЄЌЌЋ€Њ ЉЉЈЇЇІІЅЅЄЄЃЃЂ€Ё ŸŸžžœœ››šš™˜~6/fЩЅЂЂа‚ЂЅs+jдюю…я‡№„ё…ђюччцЗ›-‹�cVд‚ІРП……ˆ“€ЅЄЃЃЂЂЁ€ Ÿžžœ€›š™™˜˜——–••””“‹a2-NЩЌ Я€ Џˆ8]бы„ь…э†ю…я‚№юффшК™˜‹�cVгƒЄ;КТˆ€€‰–žœœ›šš™™˜˜——–••””“’’‘‘ˆ€ujddcX2+LаЊЯžІ›9!QЕшшƒщ…ъ…ы†ь„эюытсфИ—–№‰�cVг„Ђ8­Ч…~}||{zy|€‡ˆŽ’”“’’‘‘ŽŽ‡„zspfedccba`d‚@)>Ик—Q"!:Гнфхц…ч‡шщ†ъ€ыщросЭ•”Щˆ�cVв…Ÿ8ЊХ‡zzyxwwvutssrqpponmllkjiihgfeedcbba`_c… ЁЙH&1^#"/Іїљікс…у‡ф€х†ц‚ч„шчнлнЩ“’К‡�cUб†1 ЧŠwvvutsrrqpoonmlkkjihhgfeddcba``_^]{ŸžЖЮв J$#!rж€ѕіњкл€пƒр…ст‡уф„хфкийг—Ў]…�aTᇛ&ŸСtsrqqponnmlkjjihgffedccba`__^]\|œœВЪ€Юž˜V'ТсђѓљзЮел€м…но†п‚р„стсйджи•ŽХ…�_SЯ‰™"Н•pponmmlkjiihgfeedcbba`_^^]\[|›˜ЌЦ€ЪЫФ€•;Тсƒ№љмЧШЮгƒйк‡лм„н„ойдбйчОœ…�_RЮŠ– З™mllkjihhgfeddcba``_^]]\[Zp•–ЅПХ€ЦЧЧГ€’:Тс„эїн€ФЦЫЯг„жƒзƒи„йк здЯЭЮвцээНŒ„…�^QЭ‹”ЊЉjihgffedccba`__^]\\[ZYo”–ЂКССТУУЃ€8Тс…ыђч€С€ТФЧЪЮав„г‚дƒежвбЯЬ€Щ ЪЮсыыюыМ‹z…�\PЫŒ’ЈЂffedcbba`_^^]\[ZZYXo“—™Г€М€Н€ОП€7Тр†шях€О‚П€РУФХШШƒЩ€ЪЩЧЧХФХ ЦЦЫпъшыђѕшЛŠv…�[OЪšГiba``_^]]\[ZYYXWc‡•–ЌЗ‚И€ЙККЉ‹6Ср‡цыюП€Л‚М€НО‚П‚РС€Т Хищцч№єєђцЙ‰v…�YNШŽ˜Љf_^]\\[ZYXXWVbŒ™’ЇВВГ€Д€ЕЖ”ˆ5РпˆучэМИ€ЙК‚Л‚МНОТзцухьёьуИˆs…�YMЧ‹ŽГp[ZZYXXWVUaŒ˜‹ž­­€ЎЏ€АББЌ‚†4Пп‰стёТЕ€Ж‚З‚ИЙКЛОехстъƒ№чсЗ‡s…�WLЦˆ ŒЊlXWWVUTZƒˆ™€ЈЉ€Њ€Ћ€Ќ�“‚ƒ3П‹опяП€В‚Г‚ДЕЖ€ЗЬуппхƒэююроЖ†s…�WKФ’† Њ}UTSY‚–ˆ•ЂЂ€ЃЄ€Ѕ€ІЇЇЂƒ2ОнŒлюЪ‚ЏАБВГЫсомущъ„ышллЕ…r…�VJУ“„•‡•ƒ›€€ž€Ÿ€ ЁЂЂ‡ƒ~1 НнйьШЋ‚Ќ€­Ў‚ЏЩрмкрч‚ш‚щрййГ„p…�UIС”ЉЛ‰•€—€˜™™€š€›€œ„|0 ЛмŽжтеЈЈ€ЉЊ‚ЋЌНжкжму‚х„цижжВƒp…�RHР”•В‰‘‘€’€“€”€•€–€—”{„y/ КлдсжЅІ‚ЇЈЈЛилдйс†уф�п€дБ‚p…�RGП”}ŒЈ‹Œ�Ž€€€‘’|…w. КлбипЇ‚Ѓ€ЄГжйбжн€п…рс�е€бАo…�QFН”{ŠЋ€†‡‡€ˆ€‰Š‹‹€Œ�z†t- Йк‘ЯжрЄŸ ЋЭиЯвй†н„о�кЯЏ€o…�PEМ”yˆЉ€€€‚€ƒ„……††…v‡r,Ий’Ь Ям­œœЇЮкЬЯе‚й…к‚л�ЯЬ­l…�ODК”v†Їzz{{€|€}€~€€}rˆo+Зй“ЪЬьтрйЪЬг„жƒзƒи�в‚ЪЌ~l…�LCЙ”t„Єt€u€v€wxxysm‰l*Жи”ЧЭѓнЧЭв„г…дегШ‚ЧЋ~k…�LBИ”r‚Ђ€o€pqq€rssrok‹j)Еи•ХѓЭЧ€Ю„Яƒа‚б�ЧƒХЊ|k…�K@Ж”o€ hijjkjhŽg(Дз•ТђТЦЫ„ЬƒЭ€Ю�Ч„ТЉ{j…�H?n‚“m~ž†f’e'Гж•РђРУЧ„ШƒЩЪЪУ…РЇzg…�a==W…’k|„c”b&Вж•НђНР€У‚ФƒХ€ЦХР†НІyg†�39;U‘hz›ƒa•`%Бе•КёКН€П„Р‚СТРМ‡КЅyg‡� 69J‡fxš‚^–]$�Ад•ИёИКЛЛƒМ‚НОНК‰ИЄxfˆ� 47?‹iŽdv™€\˜[$�Џд•ЖцЕЖ‚З„ИЗЖ‹ЕЃwf‰�15=‹gat—€Y–X\> �ЎЮЗ”Г�сƒГƒДГЁvd‹�.32}qŒ_r–W—VO �� ­ЌЮЙ“А�р›А ubŒ�-10n‹]p”T•SX‚�pЋЊТМ’Ў�п›ЎŸtb�%/.m~Š[n“”QO/„�€ЉЈРО‘Ќ�о›ЌžsbŽ�$-,_|‰Yl‘’NV9†�tЃІФСЉ�н›Љrb�()]‘ˆVjLT5 ˆ�gЁЄГФІ�м›Іœrb�&'A†‡ThŽŽIRA‹�iŸЂБбŽЄ�л™ЄЌ”yrb‘�"%?•W…RfŒŒGKIŽ�.œ ЊЪІŒЁ�л—ЁЅrrg’� #=‚U„Od‹ŠDIQ$�/™žЃгЄ‹Ÿ�к•ŸЃІ}rre5•�!)‹^ƒMbЉAO1“�3“œЁЬЌŠœ�й•œŒsrjE˜�'‰b‚K`ˆ‡?Q;—�‘›šЫЊ‰š�и’šЉ•tsnKœ�rkH^‡…<J9™�˜—ЪЙˆ—�з—Є˜ttnSž�po€F\…ƒ:KJœ�y—–ТЗ‡•�жŽ•Ђš}tt] Ё�e~DDZ„8DP Ÿ�~•”ЖЧ†’�еŒ’œ…vtcЄ�I‚GX‚55;I. Ё�’ДЫ…�еŠ•Є…wvg6Ї� GŒ\9T: Є�WЁа“ƒ�дˆ“Ÿxwn@Њ� 3’ŠD Ї�[‹ŽŸе‘‚‹�㇋Ћ–yxrH­�   Њ�C‡Œд›ˆ�в…ˆЅ—yysWЏ� ­�&†Šг™€…�бƒ…—ЅyybГ�Џ�'‚ˆиЊƒƒаƒœІ‚zybы�}†ŒФЏ€Я€€ІŠ{zj9ю� }„ƒУТеŒІ˜|{s7ё� t‚Лм™}|rMє�h€~}wYі�h~}bџ�џ�џ�џ�˜�џ�Н�Z,щYі�СhъщщшёZѓ� KРѕъъіќячьбё�Pіъыє§€џ№цх‰ю�Рыыёќƒџяххxы�‰0ьыяћ†џѕфф8ш�СJььюљ‰џѕуу"х�K—эьэїŒџіфтkс�KШјээѕўŽџњусїNп�X ээѓ§‘џљфрѕьм�{юэђќ”џ§хпук�Ž4яю№њ—џ§фотжж�їsяя№јšџ§ънс•г�-Ьћя№їўџщмлpб�ћ№яѕў џэлкQЮ�г№№ѓ§ЃџёкйЫ�™8ё№ђћІџёйиШ�-UёёђљЉџјкзњCЦ�јђђјўЋџјйжэХ�ІёјЎџїоещФ�‡ёјЏџќндйиУ�r№јАџќпгиОТ�l№їВџуввiС�lяїГџуббƒР�lяїДџтајР�lюїДџшаЮР�hюіДџшЯЛР�hэіДџчЯГР�hэіДџчЯГР�hьіДџчЮГР�eьѕДџчЮГР�eьѕДџцЭГР�eыѕДџцЭБР�cыѕДџцЬБР�cъєДџцЬАР�cъєДџхЫАР�cщєДџхЫАР�cщєДџхЪАР�cшєДџхЪАР�^шѓДџхЩ­Р�^чѓДџфЩ­Р�^чѓДџфЩ­Р�^чѓДџфШ­Р�^цђДџфЧ­Р�гхђДџуЧ­Р�sхђДџуЧЌР�|хђДџуЦЌО�NšфђДџуЦЋМ�EXšрфёДџтХЋК� 7OЮзнушњГџтХ*<З�/ZxР€вгптфљВџтФw)(DД�+[dГ€Э€ЬЭмсуљБџтФO('.Б�'MWІШШƒЧЦЦжррѓАџсУ}�D&&+Ў�?T‘‚Т‚С€РдппѓЏџ сУa��d0%(PЊ� @^~ЕНН‚М‚Л€КЩоо№­џ ћжТˆi��I/$$FЈ�BQkЈ‚ЗЖЕ‚ДУннщЋџ сЧУТЩЭ��.D##MЅ�4SZœВ‚БА‚ЏЎ­­ОммщЈџщЫ€У�Х€Ц{ �CB"BЂ�'NPЌЋЊЉЈЇАилу§ЄџёЯФУТ„П› �)5!6Ÿ�PN~Ї€ІЅЄ€Ѓ‚ЂЁ€ Њзкр§ЁџєдФФСМ†Й– �&S /œ�IYn›€Ё€ Ÿ€ž€œ›š™ЄЭйпњžџјлХФУК‰В!�&R.™� AN^œ€›š€™€˜€—–€•”€“’—Ыикј›џћуЦХУЗ­‹Ћ   X%—�4ZP‹€–€•€”“€’€‘€€ŽŒŒЩзйї™џуЪЦХИЉŽЅš  a!”�0\Oz€€Ž€€Œ‹ŠŠ€‰ˆ€‡††…„Зжиђ–џъЮЦЦЛЃ‘ž”<T&“�‰i€Š€‰ˆˆ‡€†€…„„ƒ‚‚€€€€~€}Дедя“џёЮЧЦКЃ€™’˜:Z%!‘�†T…f„€ƒ€‚€€€€€~€}||{€zyyxxw€vЊдгяџёжЧЧПЅ”’‘8Y$�†HM„lx||€{€zyyxx€wvuu€t€s€rqq€p€onn“гвуџјнШЧУЅŒŒ™‹XV7.� …GGL{\Rqutt€s€rqq€poo€nmm€lkk€j€i€hggffŽввтŠџќсЩШУЅ‰–…„„T?6)Ž��…Ezc,E]m€lkk€jii€h€gffee€dcc€baa€`€_^zЪбпќ†џќфЬЩШЌ‰’€‹Q >I$��„‚Dio)(0CV€dcc€baa``€_^^€]\\€[ZZ€Y XXWWJ9>ФЯиќ„џыбЩЩЏƒ˜zˆyc 2FŒ��„ƒBbs.&%%(6@N\[[ZZ€YXXWW€VUUTT€SRRQQE9*€3ЗЮзќџђбЪЩГˆƒt s^'E‹��„„APz+##""!! &,9<EENQPPOONN€MLB>7/% DЖЮгіџђиЪЪАЎ=hnЃmY(lŠ��ƒ…?Ox0!! €" 8OIЧЭЯлЫЪЫM+Ї7bhhЅg`U‰��ƒ†>1Cy4 ,NGrЂЉaŸЫЫО{€+ІCLЄa€`[ gˆ��‚‡<0Ar9 /MEn›ЂЃЃI<Œx +„І@>WЄ[ZU" p‡��‰;"mD /MAe–€ž’€;�+„‚—Y )?U€T UTP9 2YH‡��€Š:&fI "G@\Š–——˜˜™u€:�+„„ˆe€ &7G—ON >. Y.2 ‡��‹8V\ "GBX„€‘’’“Z€8�+„…aŠƒ!-;BJJI:3(  [/)2 ‡��~Œ6$TU !GDJy‰‰ŠŠ‹‹ŒŒ<€6�+ƒ†S‰„‚*ƒ)&„ !\D(n“2 ‡��}5"Ch 9DHn‚‚ƒƒ„„……††‡i5�+ƒ‡9 Š IEjŒ}1 ‡��|Ž4B\ AJEi{||}}~~€€G4�*ƒˆ,ŸŠTQT……††W1 ‡��{27i AJ:[tuuvvwwxxyyzz{r‚2�*‚‰œ4ƒ‘UQQ€€‚=1 ‡��y15] 7B8VmnnooppqqrrssttuJ‚1�)Š›4BR>xxyyz{{|0 ‡��x’/^1 7J:Qfgghhiijjkkll€mngƒ/�)€ŒV‚M^<krrssttuua0 ‡��w“.NL=FJ5F\_``aabbcdd€effghh<ƒ.�(€ €V‡…N_9dkkllmmnoop6 / ‡��v”,_uAAUXYYZZ[[\\]]^^__``aaN„,�'Ž Pw€‰;K *Xddeffgghhijj / ‡��u”+FkDQQRRSSTTUUVVWWXXYYZZU.„+�'~ Ou‰<a5 (R]^^__`aabbccdH€ / ‡��t”)<aJJKKLLMMNNOOPPQQRRSSQ1…)�&} -Š … 3b5 &LVWWXYYZ€[\]]^^ € /‡��s”(;gCDDEEFFGHHIIJJKKLLMM1†(�&}‘ -ˆ ‚*Z6 =OPQQRSSTTUVVWWXXF .‡��r”&9d==>>??@@AABBCCDEEFD-‡&�%|’ |5*eL 8IIJJKLLMMNOOPQQRRS .‡��p”%8b66778€9 ::;<<==>>:*ˆ%�%{“ š›L 3BBCCDEEFFGHHIJJKKLM1‚ -‡��o”#6_/001122334455€6.$‰#�$z” "Иb &<<==>>??@@ABBCCDEEFF@‚ -‡��n”"5]()**++,,--../.)#‹"�$z• З-5667889€: ;<<==>>??@Aƒ -‡��m” 4Z""##$$%%€&%"Ž �#y•Ж01122344566778899::;„,‡�,6“2Y† ’�#x•Е*++,--../0011233455…,ˆ�;’1X…“�"w•Д%&&'((€) *++,--..-†+‰�F‘0Wƒ•�"w•Д !""#$$%%&&€'(#‡+‹�A.V—�!v•В !!"!‰+Œ�FŽ-U€˜�!u•“‹*�I+T€–� j”ˆ€Ž*�?(Œ*R–€� f)“ˆ†‘*�D'‹)Q•! ‚�Q4’‡…’*‘�47Š'P“…�P?‘‡ƒ”�*“�+6‰&O’ˆ�ZJ†€–�)”�*Lˆ%NŠ�9T…–�*•�C‡#MŽ �8sŽ…•$ –�S… "LŒ �-hŒ„”%™�D„ !JŠ “�"| ‹„’0 œ�Nƒ I‰ –� p4Šƒ’ Ÿ�L ‚ H‡ š�o4‰�ƒ’3(Ђ�>)G…œ�mQˆ�‚-*Є�=-€Fƒ! Ÿ� bQ‡�Ž., І�6<E! Ђ�Ll†�Œ(/Љ� #@DЅ� Ku…�€Š!9Ќ�"JB!Ј�-|#ƒ�€ˆ"3 Џ�RL Ћ� +ƒ#‚�‡F*Б� ­� *€5�~…@,ч� 5€�~ƒ1?ъ� …N};Bь� hU},Dя�  fm„-F+ђ� [ˆ,ѕ�ї�џ�џ�џ�џ�™�t8mk��@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"Сџб9�����������������������������������������������������������������������������������������������������������������������!ЁџџџџёD ��������������������������������������������������������������������������������������������������������������������‚№џџџџџџѓY�����������������������������������������������������������������������������������������������������������������b№џџџџџџџџџџw��������������������������������������������������������������������������������������������������������������Rрџџџџџџџџџџџџџy�����������������������������������������������������������������������������������������������������������AСџџџџџџџџџџџџџџџџЂ��������������������������������������������������������������������������������������������������������!БџџџџџџџџџџџџџџџџџџџА�����������������������������������������������������������������������������������������������������‘џџџџџџџџџџџџџџџџџџџџџџБ&��������������������������������������������������������������������������������������������������‚№џџџџџџџџџџџџџџџџџџџџџџџџй'�����������������������������������������������������������������������������������������������bрџџџџџџџџџџџџџџџџџџџџџџџџџџџк) ���������������������������������������������������������������������������������������������BбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓH ������������������������������������������������������������������������������������������2СџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓK ���������������������������������������������������������������������������������������!Ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓh������������������������������������������������������������������������������������‚№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx��������������������������������������������������������������������������������r№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‡������������������������������������������������������������������������������RрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА���������������������������������������������������������������������������AСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБ������������������������������������������������������������������������БџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ&����������������������������������������������������������������������tџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй( ���������������������������������������������������������������������ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџк8 ��������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓI �������������������������������������������������������������������‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓK ������������������������������������������������������������������ ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџv���������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]���������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГ:��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМJ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРQ$��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������������� ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ���������������������������������������������������������������ЛџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �������������������������������������������������������������r№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ������������������������������������������������������������RрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����������������������������������������������������������AСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������!БџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ������������������������������������������������������‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиЪn���������������������������������������������������‚№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџt�����������������������������������������������bрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ���������������������������������������������BбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБ������������������������������������������2СџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ&���������������������������������������!Ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй( ������������������������������������‚№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџк8 ���������������������������������r№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓI �������������������������������RрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓK ����������������������������AСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџv������������������������!Бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx���������������������‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•������������������b№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА�����������������ТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБ����������������Хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй&��������������� Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй) �������������� ЪџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцH �������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓJ ������������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓZ�����������Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџw���������Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџy��������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂ�������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџО&�����Ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ-����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗB����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОN"����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ���� TѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ���� $rяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����;nшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ���� !@oшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����� >lиџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ������ ;_ЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ������� 9\ЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєУ›ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������5XЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџља˜ŒzВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ���������2UЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа Ž|fRLY—јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ����������/PŸјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмЈ‘€iQ8&!0MŠјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����������,MŒјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЏ“ƒmU<& (IˆјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ������������)JˆјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЖ”…qY@) %Frшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц†O#�������������&F}щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєУ–‡u]D- ����#CpшџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЖŽoB���������������$DqшџџџџџџџџџџџџџџџџџџџџџџџџџџџџљЪ˜‹w`G0������� !>lиџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєУ–‡qQ-���������������� !@nрџџџџџџџџџџџџџџџџџџџџџџџџџља |eL3���������� <`ЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљЪ˜‹w`F,����������������� =`ЯџџџџџџџџџџџџџџџџџџџџџџџмЈ~iP7"������������� 9\Юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџља |eL3������������������� 9\ЮџџџџџџџџџџџџџџџџџџџџшЉ’‚lS;% ���������������5XЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмЁ~hP7"���������������������� 6YДџџџџџџџџџџџџџџџџџшЖ”…qX?( ������������������2UЊџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтЉ’kS;% ������������������������3VЊџџџџџџџџџџџџџџєУ–‡t\C, ���������������������/PЈјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџшЖ”„oW>( ���������������������������0QЉџџџџџџџџџџџљФ˜‹w`G0������������������������,MŒјџџџџџџџџџџџџџџџџџџџџџџџџџџџєН–‡s[B+ ������������������������������,Oјџџџџџџџља zdL3���������������������������*KˆјџџџџџџџџџџџџџџџџџџџџџџџџљФ˜Šv_F/���������������������������������*LŠјџџџџџмЁ~hO7"������������������������������'F}щџџџџџџџџџџџџџџџџџџџџџља zdJ2������������������������������������'H‡щџџтЉ’kS:$ ��������������������������������$DqшџџџџџџџџџџџџџџџџџџџмЁ~hN6!���������������������������������������$DqС­„oW>( ������������������������������������ !@nрџџџџџџџџџџџџџџџџмЈ‘kS:$������������������������������������������� "@\mkZB+ ��������������������������������������� =`ЯџџџџџџџџџџџџџшЖ“ƒoW>( ��������������������������������������������� 1>;.������������������������������������������ 9\ЮџџџџџџџџџџѓЗ•†rZA+ ��������������������������������������������������������������������������������������������� 6YНџџџџџџџєУ—‰v^F.���������������������������������������������������������������������������������������������������3VЋџџџџљаŸŒybI1�����������������������������������������������������������������������������������������������������������0SЉџџе }gM5 ��������������������������������������������������������������������������������������������������������������.Oo„‰~jR9$�����������������������������������������������������������������������������������������������������������������*F[_R=' �������������������������������������������������������������������������������������������������������������������+-$ ���������������������������������������������������������������������������������������������������������������������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_mac.icns������������������������������������������������������������������������0000664�0001750�0001750�00000064506�10411554704�015355� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��iFit32��)6����в�ј�)9m}є�%3RŠУъЩ ђ� ,JužичозН №� ,PžеспгЬШХЏ я� %7pЭтеЮЩХРМЙ  э�/iЙеаЦУНЙДЏЊЈ‰ ь�6„ЭЭУНЙЕЏЌІЁœšwь�<’ЬРЙЕЏЋЇЁ˜“ŽRы�BŸНБ­ЈЅŸš–‘‡ƒ|1ъ�9•ЗЉЅЁœ™”ŽŠ…|xvkъ�/yЊž™•‘ˆ€yrkgb`_Qщ�"a •‘‡xqg_YQLEA=&щ�Mˆ‚yph^WPIE>:633щ�-u‡|qf\SMEA=9533841щ�F{teXQIC>985433798щ� 1bbPGA=9754€346B=8ш�EQA97554€3457:BCAщ�"9;544€3 4579=@DNE8щ�348€4 5578;>ADFTIDщ�5:99:;=>@BEGIJSKH#ъ� 8B?@BCDFGIJKLTRK7ы�.<FDEFGIJKLMOT[N=ы�8@IHIJLMNOPQW_OC ы� ;GIKLNOPQRS`ZQC ь�?MMOPRSTUViUNA э�BTQSTUVXdcTM5ю� 'EXUVWYdcVOG№� (I[abbXUNF. ‡�+'?CФ� /Q[|ƒ|xscE8Œ� (IWYXSMG+„�%XЅЦНДЈƒui]M5 М�MŒЪЦТНКЕЏЈž•ކxiI1‡�(DD:(„�<|ЕвггаЯвЩЯбгбСЊŒoOA:,З�„дбааивихщщфзЦБЃˆ|rkd^R8Ž� 1jЋСЪаеЩЫтѓў„џјшб ]:/*Д�…жжншфю§ўўџў§ўџўџџёеКЋ‘mYRNI7$‡�,QˆŸЌИЬЫгсљџџ§§ћƒњ ћ§џџьЩW'%А� [Чемшїџџ§њ†љњќў€џшИ“hNGB@=0! !/Mlx„”ІКгї€џ�ћŒљњ§џк;#­�бкьёџњјњџџѓЫА›mR?<<@BGNUbzЂМгыџџњ“јљџЪv4!Ћ�ЄЮпёџљѕ’іѕіјњўџџкКƒyuzŠЄШтџџќљіѕ•іѕљєЋ/ Ј�ЋЭчњњє›ѕ їњџџћљљџџњїžѕћФU І�БЧ№џѕђžѓђѓ€єѓђŸѓђђљдS Ѕ�“ЩьњЭёѓнs!Ѓ�€Й№љююЬяюёп\!Ё�OЏуібэюе^ Ÿ�#ŸзіъъЮыъъёЖ@Ÿ�€КёвщъЅ.Ÿ�C›рщцЮчццэА6 Ÿ�‰ЫчбхчЄ.  �J˜рфатшД:  �xКоархА5 Ё�@‘зоЯнрТMЂ�mЖеЯлмХYЂ�&wТкЯйп‰Ђ�F‰ЭЯжкЎ5Ђ�WЁЬЯдШTЃ�pЙЯбж•!Ѓ�5…ПЯЮУ^% Є�M“НЮЬЯЄ=+Є�S“ЫЮЩвq5Є�YЋЮЧШ­G8Є�&]БЮФؘ;,Ѕ�*hБЮСШ=Ѕ�3sБРОППРРƒСРРПОХkA Ѕ�9xНКМННО€ПОНКЙДВЎАЏВЖКПСВfFЅ�?ŒКЕЙКЛММКЖВЋЁ”‰zncXOKFEFJQYgz…\<Ѕ� F–ЖБЕЖЗЗЕЏЄ—‡wfZND<74Š3=N:Ѕ�J•ЎГ�Д€ЕДЋˆs]M>8‘3AQ.Ѕ�NšЎБ АЋЁ‘~hUD<543€4CV+Ѕ�O˜Љ­ ЎЏ­ЉœˆoYE:43…4G\.Ѕ�P•ІЊ ЋЊЉЅš‰v_M=743„45544Ia1Ѕ�Q‘ЅЈ ЇЃ™Šu_J>643‚4†5Mg5Ѕ�PŽЃЅ ЂšŽkYH=65Ž3‚4‚5„6PlSЅ�KŒŸЁ ЂЂ –…q\L?9543‚456ƒ76DrXЅ�HŠŸ  Ÿœ“‚nYJ>954Œ3‚4€567ƒ87CytЅ�Bˆ›œ ™|gPC954Œ3‚4€5€6€78ƒ988:~ƒЄ�;}›™•Œ{hRE:74‹3‚455€6€7€89„:998}ˆ+Є�4x––• ––’‰wcNA85‹34566€788€9:…;::9s[Є�-n”•“’ˆyhSF;6Š34€5€6778899€:;‡<;;:X•…Є�&S‘”†xfSE:6‰34€5€6778€9::;;‚<ˆ=<<;DšŸ'Є�!L„’‹†zlYL?95ˆ3€4€566778899:€;€<=‹>=<<ˆЄhЄ�B}Š‰…|m\M@:5†3‚45566778899:;;<<€=>?>=<gЉ­ Ѓ�9wއ †ƒ}scUF>85…3€4€56677899:;;<<==>>?@??><ІВZЃ�2n„|seVI@85ƒ34€56677899:;;<==>>??€@”A@?>vЖЎЂ� -b‚Ё €|vk_PE<7534€5667889::;<<=>>??@@€A–BA@@CЋНxЂ�'L‰~ |wmbUI?9533‚4€5667889::;<==>??@€A€B™CBA@nРФ0Ђ�"Fm‡| {yqi\QE>8534€5667889:;<<=>?@@AABC†DE€DCCB@ЂЧАЁ�:hx…yxtmaVJA974€5667899:;<==>?@AABCC€D„E–F€EDCBLСЫŒЁ�/\vƒu!vuqi_RI?:654556677899:;<=>?@AABCCD€EFžGFFEDClЭаh �$?pƒsqmeYND>86€567789::;<=>?@ABCCDEE€F€GЂHGGFEC„абN �6bq€pqojaWJB<8€67889:;<=>?@ABCCDEFFGGHІIHHGFD›вгNŸ�/W‚mh^QH?:867889:;<=>?@ABCDEFFGGHH€IЊJIHGFEšввNž�! )Bjklje]RF@;989::;<=>@ABCDEFFGHII€J…KLKKŸL‚KJJIGF›ба€ž�$4WihbYNF>:9:;<=>?@ABCDEFGHIIJJ€KƒLЉM€L KKJHG—ЮЬЅ.œ�/MeaZPE@<;<=>@ABCDEFGHIJJKKLLMВN MMLKIGwЩШХwš� *8XVNF@>>?@ABCDEFHIIJKLL€M€NЖO NNMLJHXЅСМЊl™�".GMGB@@BCDEGHIJKKLMMNN€OЛP OONMKHEm—b2™�'4EBABDFGHIJKLMNNOO€PПQ PPNLJGCW'š�#%:BDFHJKLMNOPP€Q…RSRRЕSRQPNKHD:$›� $5CFIKMNOPQQ€R„SМT€SRPNKHI&$›� $&AHKNPQRSS‚TУU TTSQOKH@%�!':IMORST€UЧV UTSQNKF,%� &-FMPSTVVЩW VUSQNIG'"ž�")=MPSUWWШX WWUSPLH2%Ÿ�(.IOSUWXШY XWUROKI(% �$)?NRUWYYЦZ YXWURNG3&Ё�(/IQTWYZЦ[ ZYWTPLK(%Ђ�$*@OSVYZ[Ф\ [ZXVSOJ1'Ѓ� )+GRUXZ\\Т] \[ZXUQMN(#Є�!*<PTWZ\]С^ ]]\ZWTOG)'Ѕ� (+CRVY\]^Р_ ^][YVRMC(!Ї� *8PTX[]^__М` __^][XTOI)&Ї� (+@RVZ\^_`Лa ``_^\YVQH9(Љ� )1HTX[^_`ƒaŠb–aŠbƒa `_][WTNH)$Њ� "*;QVZ]_`aКb a`_\YUPG*'Ћ� )+ASX[^`abb•c…b–c bba`]ZWRD8(­� )1GUY\_ab€c‹d„c‡b…c‹d ccbb`^[XTLC)$Ў� *9NVZ]`abcdcbƒa‚bcd cba_\YUOE*' Џ� %+>RWZ^`bcd‚eƒd€cbba``…_``aabb€cƒded cba_]YVQA*(Б� )+ASW[^`bc€dƒe€d ccbba`_^^]\\[ \\]]^_``abbccd‚e ddcba`]ZVRC2(Г� )+CSW[^`acc…d ccba`_^][ZYXWƒVWXYZ[\]^_`abbcc„d cba_]YVQA9)!Д� ),ASWZ]_ab„c#baa`^][ZXWUTSOJGEEFILQSTVWYZ[]^_`abb‚c ba`^\YURA:)$Ж� )+@OUX[]_`‚a`_^][ZXVTQID<75;:;678@DKQTVXY[\^__`€a `_^\ZWTN?9)#З� )+?MTWY[]^]\[ZXVTSM?47;/*))(€)*7<74?JRTVXYZ\\] \ZXVRI;0($К� (*:BOSUWX€YXWVTRKC98:)(('&!%&'()*;88@GNSUVW€X WVTRJA>)(!М�')0=AORSTTSRQNB62;/)(&# †�#&());709CNQ€R QPI;:4)&О� ()/<<@BDB>75:2('&% Ž� #%'()9;55<>?<9<3('#С�#'()/8985)('&%“� #%&(()288.((&%Ф�%%€&%%$™�$‚%$Щ�  Ё�� �џ�џ�Ÿ�в�1ї�+Rk’ є�%Kf}Ївяжђ� %Yw—ЖтэцсЭ№� Y|ЖпшчойжгУю�Ki”йщркзгаЭЫИэ�_ŽЪпмдвЮЫЧУПОЇь�%hЃйквЮЫЧУСМИЕГ™ь�?m­йаЪЧУРНЙЖВЎЊЊrы�%qЗЭХСОЛЗГАЌЉЅЂŸLъ�kАШПЛИЕВЏЊЇЃ š—(ъ�_šПЖГА­ЉІ š•‰ˆ‡}щ�E‰ИА­ЉЅ š”‡‚|ytqmHщ�yЌЌІЁš”ކ|wsnkifg%щ�Y—Ѕ”Œ…~ytqmkhffkhcщ�%tœ—Œ‚|vrnkjhgfgkpq6щ� \‰Š|upnkihfimz{qш�s|pkihgg€fhjntƒ‚<щ�Djl€g ffghjnry€‡‘Špщ�fgj€h ijnqv|‚ˆŒ˜’ˆщ�$kqrstvy|…‰Ž‘”›—Fъ�Aq}ƒ…ˆ‹Ž’”—™ŸŸ—mы�^x†ˆŠŒ’”–˜›ЁІœzъ�qŽ’•—šœž ЃЇЌž†ы�vŠ’–˜› ЂЄЇЏЋЂ†ь�4~•›ž ЃЅЈЊ­ЖЉэ�:„žЂІЈЊЌАЗДЉ™jю� PŠІЉ­ЏБЗЕЋžŽ?№� S‘ЎЖИИАЊ›Œ[‡�++HM#Ф� 3XaƒŒˆ„oM?#Œ� R“ЎГЏЇšV„�%]‡ЌбЪУЙАЄ™vdI-М�O“евЮЪЧТНЗЎІŸ—‘Š{V;‡�H…‡rO9„�?‚МлмнкклдйклиЫЕ›ƒi\UD(Ж�ŠнмлкрмрщьычнЯПГ›†xtgH%Ž� 5tИЭекожзшіў„џ јшеЌqVKH)Г�Šпрхэъђ§ўўџў§ўџўџџєлФИЁ€oieaL3‡�4^™АЛЦжжншћџџў§ќƒћ ќ§џџьЮ›iDB#А�_апфэљџџўˆћ§ў€џыСЅ€f_[YWE/ ,<`‚˜ІЗЩмј€џ�ќћўџк›RA;­�•муёєџћњћџџібЛЈ|hYVWZ\afnzŽЏЧкяџџћ”њџЮ„O>Ћ�Ўкчѕџћ•јњћўџџнТЊ•ŽŒœГЮхџџ§ћ˜јћєГI>%Ј�%Зйэќћœї љћџџќњћџџћљžїќЩf>2І�Пдєџїѕžіѕі€їіѕŸіѕѕњеe>0Ѕ� е№ћЭєіп?2Ѓ�ŒЩєћђђЬѓђєсk?&Ё�YРщїбёђжl>Ÿ�'ВпјяяЮ№яяєНV=&Ÿ�’ЦђябюэАH<%Ÿ�MЎфюьЮэььёЙN<Ÿ�бвыьЏH< �XЉуыащюЛQ< �ŽТуашыЙN<Ё�OЁкацшЧ`<Ђ�‚МлЯфхЬm=&Ђ�1ŠЧуЯтч–<1Ђ�Y—гЯруИM< Ђ�oЉеЯпбi<Ѓ�*‚ПнЮмрЄ?5Ѓ�I‘ЧЯкЬnBЄ�e›ЧЮйлАWCЄ�išиЮзнƒP'Є�)mЕЮежЙ^R Є�8oЛЮгжЇU@Ѕ�AwМаЭбж’W&Ѕ�O}НРЮЯЯа�б‚аЯЮгz[Є�RƒЮЛЭЮЮ€ЯЮЭЫЪЧХТФУХШЫЯаОw^Ѕ�W˜ЫДЪЫЫЬЭЭЫШХРИЏІ›’Š‚{x€tw}ƒ››pPЅ�[ЃГШ ЩЩЧУЛБЅ™Œƒzsmi‹fdeLЅ�`ЂЎЦ ЧЧШШЧРЖІ–…ynif€gfgh;Ѕ�!bЈЌФ ХХФРЙ­žŽ€slhg‹f…gin6Ѕ� cЇЊТ УТОЕІ“‚skgfg„hmr9Ѕ� dЅІП РПОЛГІ˜‡ynigŒfghƒinw<Ѕ�cЂЅО НКВЇ—‡wnhgŒfg€h€i„jq}>Ѕ�bŸЁЛ МЛЙГЊŸƒvnhgf€g€h�i€j�kƒlktbЅ�`ŸЁЙ ИАЃ”…yokggŠf€gh iijjkkllmmnmmn‡gЅ�\З ИЗЕЎЁ’‚wnkgg‹f€g hhijjkkllm€n�o‚ponoŒ†Ѕ�X›ЕВЋ|rkhg‰f€ghiijk€lmnooppqq‚rqpm‘•Є�SГšВЏЉœŽ}skigŠfgg€hijjkllmnnopqqrrssƒtsrp”™0Є�NŒ™А­І™Šzpjg‰f€g€hijjklmnnopqrrsstt€uƒvutrŸdЄ�GƒЏ•Ў­ЌІ›Ž~tlh‰fgg€hijjklmnnopqrsttuvvw„xwvtЅ’Є� Be•ЌЉЄšŒ~tkh‡f€g€hijjklmnopqrstuvvw€x€y†zyxvuЉ­+Є�@_ž’ЉЈЄ›‘‚yojg†f€ghhijkklmnoprrtuvwxxyzz€{‰|{zxwЁВpЄ�5X•ЇІЄ’…zpkh„f€g€hijjklmnpqrstuvwxyz{||€}‹~}|{xŒЖЙ Ѓ�-QŽŽЅ ЄЂž–Štnjhƒf€ghhijkklnopqstuvwxz{||}~~€}{yЖО_Ѓ�!L‡ЃЁ–‹€vpjhf€g€hijjklnopqstuwxzz|}~~€€’‚€~|—СЗЂ�Hz‹Ё  ˜‡|tmig€fgghhiijklmnoprstvxyz|}~€‚‚ƒƒ„„‹…€„ƒ|МШ~Ђ� C_Ÿ‰ž ™’‰vokgffgg€hijklmnoprsuvxy{|~€‚‚ƒ„„…ƒ†‡€†„‚€“ЫЮ3Ђ�?ZЇœš•…|snj€g€hijklmnpqrtvwyz|~€‚ƒ„…††‡ˆ—‰ˆ‡…ƒ€ИаИЁ�,Q‚‡š—’‰€wqkig€hijklmnpqrtvwy{}~€ƒ„…†‡ˆ‰‰€Š›‹Šˆ†„ƒЭд“Ё�Hv…˜—•‡}vplijklmoprsuvxz|~€ƒ„†‡ˆ‰Š‹€Œ‚˜Ž€ŒŠˆ…•жиl � AT‘ƒ–$•‘‹ƒ{tokjijklmnprsuvxz|~€‚„…‡ˆŠŠŒŒŽŽ€Ÿ Œ‰†ЅийP �:O€‚”$“‰ysnlkllnoprtvxz{}ƒ…‡ˆŠ‹ŒŽŽ‘‘Ѕ’‘‹ˆЕккPŸ�'Hu€’#“‘އ~xrnllnoqrtvxz|~€‚„†ˆ‰‹ŒŽ‘’’““‡”š•‚”“‘Œ‰ЕккPž�%E[‘‘‡€xspopqsuwy{}ƒ†ˆ‰‹Ž‘’“”••–Ј— ––•“‘‹Жки„ž�!AMx‹†~xtrrtuwy{}€‚„†ˆ‹ŒŽ‘’”•––—€˜­™ ˜˜—•“ДзеЋ2œ� +Jo‹†zwuvxz}‚„†ˆŠŒŽ’“•–—˜™™šš€›Ўœ ››š™˜–“ гвЮ}š�FU‚…€}yz{}€‚„†‰‹‘“”–˜˜šš›œœДž œ›™—”ŽМЬЧИz™�?Jp~„†‰‹‘“•—˜š›œž€ŸЙ  Ÿžœ™–Š–­{R™�(F\}€„ˆŒŽ’”–˜š›œžŸŸ  Ё…ЂВЃЂ ЁŸ™“ކƒJ?š� EHp‚‡Œ”–™šœžŸ ЁЂЂЃ€ЄОЅ ЄЄЂŸœ–‡iG*›�6Gf†Œ’–šŸ ЂЃЄЄЅ€ІСЇ ІІЄЁ–ƒLG›� HMƒ—œ ЃЅІЇЈ€ЉРЊ ЉЉЇЅЂ–tK=� CMs’™ŸЃІЈЊЊ‚ЋТЌ ЋЊЉІЂœ•†WJ� "LZŒš ІЉЋ­ШЎ ­ЌЊІЁ›“}MD� FQx™ ІЊ­ЏША Џ­ЊІ ™aK-Ÿ�$O]‘žІЊЎАЧВ БАЎЊЅž–€NIŸ� GR|œЄЊЎБГЦД ГБЎЉЄœŽcM-Ё� %P^“ЂЈЎВДЕ€ЖОЗ€Ж ЕДБЎЈЁ˜OKЁ� GS}ŸІ­ВЕЖ€ИНЙИ ЖДБЌІž^M-Ѓ� %QVЃЋАЕЗЙТК ЙЗДАЊЂšƒPFЄ� DSy ЈЏДИКЛРМ ЛКЗДЎЇž„RM$Ѕ� PW‡ЄЌГЗКМННО ННМКЗВЋЃšxOBЇ� 9So ЈАЖКМОПЛР ППОМКЕАЈŸ„SMЇ� PUЄ­ДЙМПРМС РОМИВЌЂŒiO2Љ� *Rb‘ЈАЗЛПСТТИУ ТТРОЛЖЏЇ€QHЉ� DTvЂЌДЙОРТКФ ТРНИВЊЁ„SMЋ� QW„ІЏЖМРУФХХ’ЦŠХ’Ц ХХФТПЛЕЎЄˆkP8­� *RbŒЉБИОТФХЦЧ‚ЦХФХ‚ЦŽЧ ЦХУСМЗАЈš|QH­� ?TqœЌДКПТХЦЧŠШ€ЧЦЦХХФФУƒТУУФФХЦЦЧŠШ ЧЦФТОЙВЊŸ€SMЏ� JU}ЃЎЕМРУЦЧШШ…Щ€Ш ЧЧЦХФУТРРПƒО ППРТТФФХЦЧЧ€Ш…Щ ШШЧХТОКГЋЂ}TN)Б� QX‚ІЎЖМРФЦЧШ€ЩЪЪ€ЩШШЧЦФУТРОНЛКИИЗЖЖЗЗИЙКМОПРТФХЦЧ€Ш„Щ ШЧХТПКДЌЄ‚aP=Г� )RW…ІЎЕЛПУХЧШШ€Щ€Ш ЧХФТРОМЙЗДВАЎ­‚ЌЎЏБГЕИКМОРТФХЦЧƒШ ЧЦФТОЙГЌЃ‚oQBД� /RX‚І­ДКОСФХЦ€Ч%ЦЦФУСПМКЗДА­ЊЈЅž”Ž‹‹Œ‘™ЂІЉЋЎБДЗКМОРТФХ‚Ц ФУРНИВЋЃ€rQH Ж�>RW‚ŸЋАЖЛОРТТУТТРОМКЗГАЌЈЂ”‡wnjvt!ukoo~‰—ЃЈЌАГЖИЛНПРСТСРОМЙДЏЈ{oQH З� >QW}›Ї­ВЖЙЛ€МЛЙЖДА­ЉЅ™~gov_SRQPQQRSnwnh~•ЅЈЌЏВДЗЙ€К ЙЗДАЋЅ‘raPH К� /PTu…ІЋЎБ€ВАЎЋЈЄ•†qptRQNMLB8%€$28KLMOQStppœІЉЌЎ€А ЎЌЉЄ–€yRNA М�%NR`zƒЃІ€ЇЅЃœ„ldu^QNLG-†� 2GLNQStoar†›Ђ€Є Ѓ ‘vqgQM8О�BNR_xx†‡„|nitdPNLJ-Ž�-ELMOQpsjiw|~yqtfQMGС�#HMPR^psokRPNLK;“�-FKMNPQdnn\QNMK-Ф�<KK€LKJH5 ™�#5HJKI;# Щ�$# Ё���џ�џ�Ÿ�б�Oї�oЯ€џ�є�_Пƒџ�?ђ�_п…џ�?№�Oп‡џ�?ю�П‰џ�>э�OяŠџ�/ь��_Œџь��ŸŒџ�аы��_џ�Ÿъ��OŽџ�_щ�яŽџ�щ��ЏŽџ�Ащ��Oџ�_щ��пŽџ�№щ��_џ�€щ��пŽџ№ш��Oџ�€щ��ЎŽџрш��џ�?щ��^Žџ�ъ��Ÿџ�аы��пŒџръ��Œџ№/ы��>‹џ№/ь��Šџ№/э��މџаю��Оˆџ�€№��П†џР0‡�*77ak3//Ф� ;fuЋЈЄЂgX/Œ��О„џА@„�*h™ЦєђяьштлгЪСЌ„UМ�\Љѕєѓ№юычуоивЭШФГ€[‡�ЂѕоПp@„�K—жїљјјїѕђяъйЩОЖ­ЈŽYЖ�œњћћњњљјіѕѓёяыштгЦСНИЖЇw?Ž�Eођіљћќ…џ јътЯЋЅ žaВ�œќ‚§€ўџџўџџўџџќютпбЖГАЎЌŠ^3‡� JƒЮфыђіњќ§џэмМŸœ›VА�mю§€ўџѓоиФЌЊЉЇІ†]=)*)Kf˜ХЮжрщѕј§“џкЙ›š&Ќ�Ќ§€ў•џ§тлбЇЇ€І ЈЉ­БЗОЧзьёћ˜џйЋš™LЊ�Э§ўўœџ хкдЭЯабдофэџєШ™™^Ј�*л§ўўЪџж™™|І�щ§ўЭџи™™{Є�ЧћўўЮџуЉ™|Ѓ�Дјќўаџх™™_Ё�sѓњ§вџй™™LŸ�7ьѕћгџᘘ_Ÿ�ЦэјвџїЯ˜˜^Ÿ�kф№ќвџߘ˜CŸ�кхѕбџјЯ˜˜9 �львџߘ˜9 �блёбџ㘘9Ё�{бфбџ昘LЂ�ХаюаџсЉ˜_Ђ�QФжаџќП˜| Ђ�™Тхаџ䘘Ђ�ЙСяЯџщЉ˜LЃ�LИбаџб˜† Ѓ�‚ДоЯџхŸ›8Є�ЎВцЯџеЁЄ�'ЌАаџЛЃQЄ�RЈбЯџпЃЄЄ�pЇкЯџдЅ|Ѕ�„ЅоЯџФІHЅ�ЂЃцЮџ§ЇЈЄ� ЂЯџсЉЊЅ�'ŸМЯџмЋŒЅ�$žЪРџ�ў‹џй­‚Ѕ�DžШЯџиЏcЅ�LвЯџиВYЅ�MœдЯџйДZЅ�LœдЯџйЖ[Ѕ�M›дЯџкЙ]Ѕ�L›дЯџкМЅ�LšдЯџрОЅ�LšгЯџтСЗЅ�LšгЯџєФЦЄ�L™ЧаџбШ>Є�%™ЧаџлЫ€Є�$™РаџпЮЕЄ�™™аџэав4Є�™™ьаџое…Є�„™паџтзй Ѓ�q˜жбџллnЃ�U˜ЮбџснбЂ�7˜ПбџєсрŒЂ�˜˜вџутф7Ђ�˜˜пвџххЩ Ё�q˜гвџюхчŸЁ�J˜Хгџфшщt �$˜˜єгџфщъV �Ž˜лдџчъъWŸ�h˜ЮеџцъъWž�8˜Їжџцщщ‘� ˜˜лжџхшчК5œ�h˜Юзџфххфš�7˜ЇєзџшцтпзЁ+˜�Ž˜ийџткЕ .™�]˜ОкџоšŽš�˜˜хйџؘ^›�{˜Эиџщ˜˜%›�8˜˜єзџг˜†�Ž˜гжџьЈ˜B�J˜Їєеџж˜ � Ž˜гдџўЕ˜_Ÿ�J˜Їєгџ阘Ÿ� Ž˜гвџіЗ˜_Ё�J˜Їєбџ昘Ё� Ž˜гаџђЊ˜_Ѓ�J˜˜ьЯџз˜ Є�…˜ЭЮџ똘LЅ�8˜˜оЬџўЪ˜†Ї�q˜НЬџ阘%Ї�˜˜жЪџцȘiЉ�U˜ЇъЩџд˜Љ� …˜ХШџꘘBЋ�%˜˜жЦџоɘr­�U˜ЇсФџњЯ˜­� {˜ОєТџ§г˜˜/Џ�Ž˜ЮўСџޘ˜VБ�8˜˜еРџ捘|Г�U˜˜зОџжӘ† Д�^˜˜е—џ ўіщсннрц№ќ˜џдԘЖ�{˜˜еј‘џћълХЙЖƒЫЙМКЯнэћ‘џњЬӘЗ�{˜˜бѕŽџєЬ­ОЯЋˆ˜УаЙ­ЭьŽџыРЋ˜К�^˜˜Щкј‰џюмПУЯ‚˜†rLirƒ˜ЯРНгцѕˆџ№жᘘ†М�K˜˜Ћаињ„џјйЕЌаЋ€˜_0 †�9i˜ЯОЅНйїƒџьЦТȘ˜r О�%…˜˜ЋбЭжптмвОИаИ˜_0Ž�/_˜ЪЫЗЖЪвжЯФЭȘ˜CС�K€˜ЋЪаЪУ‚˜|C “�/_‚˜ИЪЪЋ˜_Ф� B|…˜rC™�%Lr„˜|LЩ� %9LL&Ё��&� џ�џ�Ÿ�t8mk��@������������������������������������������������������������������������������������P€�������������������������������������������������������������������������������������������������������������������������� pаџџџ2����������������������������������������������������������������������������������������������������������������������`Рџџџџџџ„#�������������������������������������������������������������������������������������������������������������������`рџџџџџџџџСG�����������������������������������������������������������������������������������������������������������������Pрџџџџџџџџџџк[��������������������������������������������������������������������������������������������������������������� Рџџџџџџџџџџџџл_��������������������������������������������������������������������������������������������������������������P№џџџџџџџџџџџџџи_�������������������������������������������������������������������������������������������������������������`џџџџџџџџџџџџџџџЮ]������������������������������������������������������������������������������������������������������������ џџџџџџџџџџџџџџџџЩS �����������������������������������������������������������������������������������������������������������`џџџџџџџџџџџџџџџџўМB����������������������������������������������������������������������������������������������������������PџџџџџџџџџџџџџџџџџјЇ3����������������������������������������������������������������������������������������������������������№џџџџџџџџџџџџџџџџџш'����������������������������������������������������������������������������������������������������������Аџџџџџџџџџџџџџџџџџџжm���������������������������������������������������������������������������������������������������������PџџџџџџџџџџџџџџџџџџќНJ���������������������������������������������������������������������������������������������������������сџџџџџџџџџџџџџџџџџџы˜-��������������������������������������������������������������������������������������������������������`џџџџџџџџџџџџџџџџџџџдl���������������������������������������������������������������������������������������������������������сџџџџџџџџџџџџџџџџџџіБA��������������������������������������������������������������������������������������������������������Pџџџџџџџџџџџџџџџџџџџн~ ���������������������������������������������������������������������������������������������������������ВџџџџџџџџџџџџџџџџџџіЕI ��������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџўл~"��������������������������������������������������������������������������������������������������������aџџџџџџџџџџџџџџџџџџяЉC ���������������������������������������������������������������������������������������������������������ЃџџџџџџџџџџџџџџџџџјЧe���������������������������������������������������������������������������������������������������������уџџџџџџџџџџџџџџџџќл„)��������������������������������������������������������������������������������������������������������� џџџџџџџџџџџџџџџџ§цœ< ����������������������������������������������������������������������������������������������������������AџџџџџџџџџџџџџџџўьЋL�����������������������������������������������������������������������������������������������������������„џџџџџџџџџџџџџџўюДY�����������������������������������������������������������������������������������������������������������˜џџџџџџџџџџџџџўюЕ]������������������������������������������������������������������������������������������������������������ЧџџџџџџџџџџџџќшЏ[�������������������������������������������������������������������������������������������������������������ЩџџџџџџџџџџџїйœN����0@@p€@@@����������������������������������������������������������������������@p€АРРРРА€p@��������������ЫџџџџџџџџџћъС:0p аџџџџџџџџџџ№Р€0��������������������������������������������������������������`Аџџџџџџџџџџџџџџ№А€0����������Ьџ§џџџџџњщЪ™[%U рџџџџџџџџџџџџџџџџџџт‘ ���������������������������������������������������������  џџџџџџџџџџџџџџџџџџџџџёБ` ������0ŸэїюфкЮЙ“arЇ№џџџџџџџџџџџџџџџџџџџџџџџџЅ"����������������������������������������������������� џџџџџџџџџџџџџџџџџџџџџџџџџџџв‘P���$wЏЏ‰ug‰Џёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–��������������������������������������������������p№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџбg]kiŠ еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђH����������������������������������������������АџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒ��������������������������������������������аџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ������������������������������������������0рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџй���������������������������������������� №џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџл�������������������������������������аџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн������������������������������������РџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛ�����������������������������������€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ ���������������������������������@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџд3�������������������������������рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§Эm�������������������������������€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљЯq������������������������������ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџібˆ7 ������������������������������ЁџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЩ{1 ������������������������������ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЧt)�������������������������������ЁџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЧs'�������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЫu'��������������������������������qџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљг+���������������������������������вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§оŽ4��������������������������������� џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьЅD ����������������������������������qџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјТ^����������������������������������Уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўм‚&�����������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџё­E �����������������������������������@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўеr�����������������������������������‚џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ­?������������������������������������Еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп �������������������������������������жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§УS �������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёŸ2������������������������������������ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмy�������������������������������������AџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬY �������������������������������������FџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўМB�������������������������������������xџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћЋ5��������������������������������������‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџі›.��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ‹&��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№!��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї ��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј‡$��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў—,��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА3��������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ=�������������������������������������XџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъP �������������������������������������Uџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњk�������������������������������������@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ'�������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс=������������������������������������ ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџk������������������������������������бџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ)������������������������������������Јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћc ������������������������������������}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа$�����������������������������������Mџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ}�����������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџё:���������������������������������� еџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа��������������������������������� џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄ ����������������������������������cџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚��������������������������������� їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{��������������������������������Эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx�������������������������������ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ�������������������������������8џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйG������������������������������вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ#����������������������������ŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгA��������������������������:љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџr�������������������������Щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ’C �������������������������jџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўХW�������������������������(ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљДA��������������������������™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц'���������������������������5њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўЭa����������������������������ИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓЉ:����������������������������Mњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкx������������������������������ ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјИI ������������������������������ TћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠ'������������������������������"ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњСU�������������������������������� Tћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџх)��������������������������������"ПџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљСU���������������������������������� IіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтŠ(����������������������������������!­џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЗM ������������������������������������Aъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўк|!�������������������������������������ŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяЇ?��������������������������������������6гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћЫf����������������������������������������fјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўх’/����������������������������������������(ЄџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєИR������������������������������������������ Eкџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќдw!������������������������������������������oѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўч™7��������������������������������������������*§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђЕR���������������������������������������������� BЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјЪl����������������������������������������������Zсџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќл…+������������������������������������������������!qьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§цœ< ��������������������������������������������������-ƒїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўьЋL���������������������������������������������������� 5”љџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўюДY����������������������������������������������������� >œѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўюЕ]�������������������������������������������������������Gœюџџџџџџџџџџџџџџџџџџџџџџџџџџ§їэупптщђќџџџџџџџџџџџџџџџџџџџџџџџџџџ§ьД]��������������������������������������������������������>ŒоўџџџџџџџџџџџџџџџџџџџџўїчдТА›‡…“ЅКЫйъњџџџџџџџџџџџџџџџџџџџџџћфЊY����������������������������������������������������������� 3}ЩїџџџџџџџџџџџџџџџџџљшбДiK9.$ #*2AWs•Жбчњџџџџџџџџџџџџџџџџўєд–J�������������������������������������������������������������'dЉнљџџџџџџџџџџџџќ№лМ’fA(������� +BfДбчљџџџџџџџџџџџџљуЗw6���������������������������������������������������������������C~Дйё§џџџџџџћюлФЃwK*���������������(AfГЭпяќџџџџџќёоПŒP!������������������������������������������������������������������ "GvЂПЮзнлвЩКwR4 ��������������������(?^ŸЙЧЭЯЯЬПЄ}Q)��������������������������������������������������������������������� 2H]o{weSA. �������������������������� /?O[__YH3 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/vol_external.icns������������������������������������������������������������������0000664�0001750�0001750�00000006276�10411602135�016606� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns�� Оil32��Ў‚�(ECG€KO€SWH …�sЯбввдежжийккмноппсттжT…� 5Ѓюшыью№ђѓѕїљћ€ќ‚ўќ“„�7Єѕхшъьююёѓѕїљљ§‚џќџЇ „�>Жѕцщыэя№ђєіјњќџўџќџГ&„�JФїшьюёёѓѕїљћўўƒџќџТ4„� Vајы№№ђєіјњ§§…џќџа@ƒ� cојэёѓѕјјњќ‡џўџоGƒ� pщјёѓѕїљћўў‡џўџшVƒ�~ёћђїјњќŠџўџёcƒ�Œљћіјњќ‹џ§џїoƒ�%šќ§їќўўџћ€ ‚�2Јџќћ§ўџ§§Œ‚�=Еџ§§џўў›‚�JФ’џќџЊ#‚�Uв’џќџЗ,� dо’џќџЦ9�rъџ§џќџжA�€ђџўџўџтO�Žїџўџўџь[�#œ•џєh�-Јўџћ€§„ќ†ћљўѕs €�2І‚‚„ƒ€…†…‡‡ˆ‡ˆŠ‰ŠŠ‹•t €�7Ђў•џ–€�GЦ–џЊ#€�eрбжгвдгг‰бЯ агБ0�� kЛ—ž€Ÿ  Ё„ ЁŸЁЄ.€�]ЛЊА€ЏААЎ„А€ЎБ­ЖЕИЌЕ—"€�KУЌДГВГВВ„Д ЕБОšџ‘ЗТŒ€� uЁ Ё€ЂˆЁœ‡–Ё™G� Ÿ�‚�(A‚CGKOOSH …� kШЩЫЬЭЭЯабвве€ж�й€кмвO…�,r’”•–˜šœž  ЂЇЉЋЌЎААГБбp„�"Y—’”——›ŸЁЃЅЇЉЌЈЫl„�"j›’••˜šœœŸ ЂЅЇЉЋ­ЏБГЏжt„�)rž’•—ššœž ЂЄІЈЊЌЎАВЕБе~„�0z“˜˜šœž ЂЄІЈЊЌЎАВДЗГеŒ$„�8„ž–˜šœžЁЁЃЅЇЉЋЏАВДЖЙЕг™)ƒ�@‹ –›ŸЁЃЅЇЉЋ­ЏБЕЖИЛЗЯЈ3ƒ�G‘Ÿ™›ŸЁЃЅЇЉЋ­ЏБГЕЙКНКЮЕ;ƒ�O—Ÿ™žŸЂЂЄІЈЊЎЏБГЕЗЙЛПМЫУCƒ�X›Ÿœž ЂЄІЈЊЌЎАВЖЗЙЛНПСЩЯM ‚�`žŸž ЂЄЇЇЉ­ЎАВДЖИМНПСУШмW‚�"hЂŸŸЁЃЅЇЉЋ­ЏБГЗИКМОТУХЦхa‚�*pЅ ЁЃІІЈЊЌАБГЕЗЙЛПРТФЦЦьk‚�1xЈ ЂЄІЈЊЌЎАВДЖКЛНПСХЦШЧюv‚�7€ЈЁЃЅЇЉЋ­ЏБГЗИКМОТУХЧЫЧю�@‰ЌЁІЇЉЋ­ЏБГЕЗЙЛПРТФШЩЬШюŽ%� HЋЄІЈЊЌЎАВДЖИКОПСУЧШЪЭЩю›-� O•ЌЄІЈЊЌЎАВДЖИКНПСУЧШЪЭЩщЈ5�XЁЗ­ВГЕЗЙЛНПСУХЩЪЬЮадеидёЛ;�^‡–•–™›ŸЂЄІЈ­ЎБГЗЙЛНТПйЖC�fptpprrsstuvuvvwxyyzx~V€�1Іў”џў“€�GХџќ§ў’џЊ#€�eсбжггдгг‰бЯ агБ-�� kЛ—ž€Ÿ  ЁЁƒ ЁŸЁЄ.€�]ЛЊА€ЏААЎЎƒА€ЎБ­ЖЕИЌЕ—"€�KУЌДГВЕ…Д ЕЕВОšџ‘ЙТŒ€�uЂŸ‹Ё œ‡”Ё˜E� Œ„Ÿ�‚�!=€;ƒ?CGGK? …�^Н€РТУ€Ф ЧШЩЬЬЭЭЯаббШF…�3&$%')+-//26;==AACFEY@ „�!#&%')+-/134K…�)$$'))+.02468:<>@BD@c†�' #%%(*,..1356:<>@B>_"†� ( #%'**,.02468:<@AD@_(†� )"$'')+-/13579;=?CEA]/…�(!$&(++-/1357;<>@BDCY6„�'!&&(*,.02468:<>BCEDW?„�(#%((*,.0246:;=?AEGETH„�%"%')+-/13579;=ABDFGQR „� %$'')+-/13579=>@BFGIN\ „�"$$&))+-/1378:<>BCEGHMc„�%$$&(*,.02468:<@ACEIJJi„�&$$&(*,.02468:>?AEFHJHk„�)#&&(*,.02468<=?ADFHLHm„�*#%((*,.0246:;=?CDFJLGj!„� )#%'(*,.02489;=ABDFIKIi&ƒ� )!$&))+-/1568:<?ACGHJHf-‚�3-/14468:<@ACEGKLNRSUSn<‚��ˆ� 2� 7[\XZZ[\]]€^`_``€acacahc0�)Ќў”џўŒ€�DУџћњ§ў‘џЈ#€� bубжггеддбв‡бабгА-€�hМ—ž€ŸЁ €Ё‚ ЁŸŸœžЁЂ,€�ZЛЊА€Џ‚Ў‚А€ЎЏ­ДиПЊЕ–"€�GФЌДГŒЕВОС�{ЫСŠ€�sŸžŒŸ žžŸ›pŽ –D� Ÿ�l8mk������&>@@@@@@@@@@@@@@@@@@@8������/ŸУХХХХХХХХХХХХХХХХХХХМp������rєџџџџџџџџџџџџџџџџџџџџўЮ+������…љџџџџџџџџџџџџџџџџџџџџџл7������ ’ћџџџџџџџџџџџџџџџџџџџџџуB�����Є§џџџџџџџџџџџџџџџџџџџџџыR�����Дўџџџџџџџџџџџџџџџџџџџџџёc����� Уџџџџџџџџџџџџџџџџџџџџџџіu�����,бџџџџџџџџџџџџџџџџџџџџџџњ‡�����9нџџџџџџџџџџџџџџџџџџџџџџќš ����HцџџџџџџџџџџџџџџџџџџџџџџўЋ����YюџџџџџџџџџџџџџџџџџџџџџџўЛ����kєџџџџџџџџџџџџџџџџџџџџџџџЪ%����}јџџџџџџџџџџџџџџџџџџџџџџџз2���� ћџџџџџџџџџџџџџџџџџџџџџџџс@����Ё§џџџџџџџџџџџџџџџџџџџџџџџъP���Вўџџџџџџџџџџџџџџџџџџџџџџџёa���Тџџџџџџџџџџџџџџџџџџџџџџџџіt���+аџџџџџџџџџџџџџџџџџџџџџџџџњ†���8мџџџџџџџџџџџџџџџџџџџџџџџџќ™ ��HцџџџџџџџџџџџџџџџџџџџџџџџџўЋ��YюџџџџџџџџџџџџџџџџџџџџџџџџўМ��kєџџџџџџџџџџџџџџџџџџџџџџџџџЬ'��љџџџџџџџџџџџџџџџџџџџџџџџџџм9��œќџџџџџџџџџџџџџџџџџџџџџџџџџщN�Аўџџџџџџџџџџџџџџџџџџџџџџџџџ№_�Вўџџџџџџџџџџџџџџџџџџџџџџџџџёb�І§џџџџџџџџџџџџџџџџџџџџџџџџџьX�’љџџџџџџџџџџџџџџџџџџџџџџџџџпG� VЩыюююююююююююююююююююююююф&�X}…………………………………………………………ƒq>� )......................,$�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/tool_part.icns���������������������������������������������������������������������0000664�0001750�0001750�00000016633�10427435414�016120� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��›ih32��‹–� gh4ЫЖЕЯ& �3j5€A!O‡Х.�ц4.EnšЄЄšoD/(N�–š�bl&7†ЦфљџљхХ†5(ud˜�щO'_ЗѓєяэьыыьэяєѕГ*�g –�W1€йфоннƒоннпмУ-�i8”�Уl1yЭебб†вгХЙРЊ6�mJ’�о9dОШФХЦ€Ч‚Ш ЩПЈЄЄ­Ф†�ux^^dd‚a ZБ:F“ОЙЙЛММ€Н€О ПЕ—•”’š[�bї…�c”ВДИЙФЦЧШШе‚,o­ААБВДДЕЕ€Ж ЗЗ”‰‹‰‡‡ƒp”„�9’ФМЏœ“Шббвди_PŠЉЅЇЉЊЋЌ­Ў А“}‚‚~tR* ]uƒ�)lšНЙМВЙЮббвгд^fŸЁЂЃЅІІЇЇЌ—r|zaD+ Q‘ƒ�)MНЙМЗЙЗИИЙНФ[o”–˜™›žŸ  Ѓ™qrhS8.)#N­ƒ�)HЃМНЇ­f_dfhr‘_uˆŒŽ‘“•—™™›˜`b\LFD=5,$IІƒ�)CЉЛЛЏ’038<>L‡hx…ˆ‹’”•—›†e`YWSMF>4+  OЂƒ�)Q­ЛЛШ‘?HLOPZŒoz{€ƒ‡ŠŒ‘“”–ŽЩЇ”}fWOC90&\ ƒ�)[БЙПхпцччшшьвo‚}…‰Œ’”–˜™˜ПЧъшаžx_G2&#o•ƒ�XДЙО€н€орукw€…‰Ž‘”—šœžŸžМНввййЪ’Œ‚R.6}cƒ�)]ЖЙОТФХЦЦЪЭЦТt”‡Š“–š ЂЄЅЇМЊТЩЈРг„QЈИœ€‹ƒ�(cЙЙНУУФЧЪŘЈПsw˜“—›ŸЂІЈЊЋЎЛЃаџїтлХІœЭОzO„�kМИОТТЧЛ —ГЧвЛYš– ŸЄЈЋЎАБЕКŸа‚џхЭазЎŽF‚�"yПИОСЦД­ЩЩЧЧйˆЉЊЎІЈ­БГЖИМОžа„џ§єфФЗ�СИОФАИШХЦЦШЬж|œЊЙРКДДЗЛНСЫЉдˆџхД-€�3‹ПИПЛЏЧФХЦШЪБЏЋЕЖТЮЮШЦЧЦУрФзˆџб€�9–ОИПЎЋЧФФЦЧЪ•œРЯКuНМФинопгЧхел‡џъЕ_�CžНИОГН€ЦЧЫЎ„ЦЩЧгГ•БЦЫдлуйЬхзр‡џв ‚�YЌЛЙЛОФХЦЧШЫВДЩЧШШав››Ыбеимзхйх†џЯЂ‚� ]ЖЛКЛЬЩХЧШ€ЩзЯЫЭЭЮбйТОЉЇПегфлщ„џ§зЅLƒ�_КМЛКгоХШЩЪЫЫкупнмнпсшхйТЊ­Жроэƒџівœ.„�bМНМЛШјкЧЫЭЭЮЭбифъыфмжгекроллы№џќрП…�tННМННзјйЫЮЯабввб€веж‚и оїіяќєфкн™U†�„ПП€О Лкјрбагдееж€зиий€к фѕюпскдббЮ`ˆ�$|СРПРРПНЭїїмдгежиийккййксєќфЯвезкиПСoˆ�${ФТОИПСРПЩхђяъфрнооптцыяє№кЯвгдаЮдФЦqˆ�%vЧНš—•ТСТСРХауёљћќќћћѕъмбЭЮбвдаЅ ЏЫШz‡�%xЩНЈ›РТТУФФУУЧЫЯбгбЯЭЬЬЮЯабвгЯЄЊЎЬЩ†�GЩТОЖНТ€СТУФФ€ХЧШШЩЪЬЭЭ€Я бвгЬФгЬШ‹†�6‰снƒмоппсс€туффхццччщъъурŸ%†�:ЇдС”Т�СƒРППЬП0†�CАz{ˆz }{|{{|{~|}…‰‹šB†�DЂf@HLPSVY\^`aee<WCZWHb<[?vŸ€œ Ёœ—G†�&H™АtQ_aeint{~ƒ‰‰CtOwpVƒ@vG”ЎЈЈЊŽˆІЉЊЄJ†�&K”Фx>g|†‰‹•–˜œЄЅj–u™“|Єh˜oГЛЖК™w{ŽЛКЅ<†�&Yг…,AVi{Œ— ЂЄЉВЖ‡Џ“БЌ™К‰БЫШТЩš3*„ЬЪ 3†�&3нЗ–œ ІВПЦЩЪЭбдФеЪждЬйЦеЩрдвгв…xТе꓇�iЭыяюээьы‚щ шшъшщшшщшъшъц€уфчщчхй\‰�G_•^_aa_^E Ж�–� gmJщзжя; �3y]­jgiignБы.��tp€ЊХЪЪФЊx‰Дš�mЅu‡Ио№ќџќ№оЙ…pЈ[˜�ŒyЃељљіѕєѕіљња|€Ў–�*’„Жщ№ьыы†ьччЌƒЎ/”�УЁВучффƒх цххчймчнЏˆЌ“�њ„Ікрно‚п€р псжалкоиŸ”з†�ux^`ee‚a ZЗ|’Ткзийй€кл нбНдегвжОŠЊ№…�fšЛМНПЪ€ЭЮзЄyЏа€геежжз изМЪдбаЯЬХžЙ„�9™аЦЗЁ˜аиийкн’šОЮЭЮЯб€вд еЙТебЮЪМЋœš•žUƒ�lЁШУФЖОеи€й똌РШЩЪЬЭЮЯааббеРВгвШМБЇЁ˜›Ѓ‰ƒ�)MЅЧУХСУРСТУХа™БРФЦЧШЪЫЬЬЮЮаХЊббЧНЗГЎЊЃœ›А­ƒ�)HЋЦЦГЖjafijrЅŸЕОСУХЧШЩЪЫЬЮЩ™УдЪЧФПКДЎЈЁВЊƒ�)CБЦХЛ™038<=IœІЖЛОРТФЦЧЩЫЫЯЗЇФЯдбЬЦПЙГЌЅЁЗЇƒ�)QЖХФб•>HKNPWЉКЙМПСФЦШЩЫЫЭПзФХЫЩЩЫЦОИБЈІНЁƒ�]КУШщхщ€ъыэнЅПКОСУЦШЫЬЭЯбЧЧЬёэрЧНУУЛГЊЌР•ƒ�ZНУЧтуфф€хчтЉХНСХЧЪЬЯабгеЬЦНЕУитйЎНаНЏДМ_ƒ�)_РУЧЪЬЭЮЯвдЭЫЁЧТХШЫЮагежиквШЃ^cY’Щ„TЋЩФХЖƒ�(eУУЧЬЫЬЯвПЅВХšЌЮШЫЮвдзйлмоиЦlвЮЁ…tdvУХŠ]„�)nЦТЧЫЫЮХЌЃНажЪЫЭгвдилнпсунХšjе№ятКŽvƒž‡zF‚�+"}ЪТЧЪЮОŽИаваЯмЙЗкилйлосухшсЩ™oХгабежгН™}jzќ�,†ЫТЧЬЛТЯЭЭЯбглІШмсхууфчъьхдЂ|ПХСОМЛЛОРМЌrˆ>€�+3‘ЪТЧФЙбЭЭЮавМИНЌмтцэюэюяёцшЛˆЛЛЗВ­ЈЅЅІЅžrj�+.ШТШЗЕбЮЯаа‣ЪдЫЄсшъѓѕіїѕшьЬ–ЛЕАЊЄœ•‹€{c�+CЅЧТЧМЧаЯббеЛ“ЯбЯиЧКжэёєіјїъьЮЂРЗБЊЃ›“ˆ„–�*YЕХТХХЮабвгжООваббжлЛРщѓјїљюэбЏЬУМЕ­Ѓš‘›xz‚�)]РХФХвгабгддгнйжзиикрвгЩЫньшьдМиЮШПЖЋЉЎŠƒLƒ�(fФЧХХиувгдеезтщцхфхцчьщудЦЪащзЧфйбШСТЖ“v8„� fЦШЧЧајтгжз€илсъяяъупмосцхтфтгђшфнвІ…�&xШЩЧШШоњсжиййкллкмнмоппрссрхћъаэйД ГN†�ˆЪЪ€Щ Чрњшлкмннооппрƒс щїђмГЋЄЋХкjˆ�‚ЭЬ ЫЪжљњфонопр€с€т учі§шзкмпххЯЯrˆ�$€аЮЪУЪЭЬЫдыѕђюъчфххцшь№ѓіѓриккмйжнавvˆ�|дЩЁ›œЯЭЮЭЮбйщєњ‚ќїюукзйллмиЊЃДже‡�}зЩ•ЌЃЭЯЯаЯгжйлмлкижжийклмниЉ­Дз臆�G…зЯЪПЩЯ€ЮЯа‚бвгдеж€з ййккмнеЪлзз’†�6ъф€х‚фхх‚цчшшщщ€ъ�ы€ьэя№№ъщЇ%†�:ЉйЧ”Щ�Ш…ЦвТ0†�CŠ„ˆ… „‡†‡††‡†ˆ‡‡‹…•˜ЂB†�D•­j@HLPSVZ]_`afe<XC[WHc<[>yЊ€ЇЊЊЈЇЉЂH†�&H КxP_adimt{}‚‰‰CtOwpVƒ@vG—ЗББВ—’ЎВГЌK†�&K˜Ь{=g|†‰‹•–˜œЄЅj–u™“|Єh˜oЕТНРЃІЌ ССЊ<†�&Y“кˆ,AVi{Œ— ЂЄЉВЖ‡Џ“БЌ™К‰БЭЮЩЬАЪвГЫаЄ0†�&3ŽтКŽ—ЁЇВПЧЪЫЮвеХеЪждЭкЧжЪсижжзЫШазр•‡� iЯэё№яяюэьы ъъьъыъъыъьыьш€цчфхшшл\‰�G_`˜_aa_^E Ж�—�rf��SД �3‰‡рЩТХЧЧФЦгу?� ОЫксъђѓѓђърлвЭ*Дš�{уЭнюїћўџўћїюлХ—S˜�бгъѕўў§§ќ§§ўџј–\ –�7змэљћˆњќђС,�d8”� рзэјљљ€ј„љћ№ЦНЊ7�fJ’�.жъіїіі†ї љѕТЁЄ­С†�1Ј‚„„‚ƒzаЧр№і€ѕ…і їіЯ‘š\�Yї…�ƒЏЮЮЬЭикпЮЫьѓѓ€є…ѕ ље|€€„‚p ‹„�{ЎсиШЎЇнхффхчЭуяѓ…є їшˆdomfG" Ouƒ�–ЗкедЦЮтхчжы№ђёђ‚ѓ€єїё—WX> �E‰ƒ�oКйедЯбЮЮабапкэя€ёђђѓєѕїЙA/ƒ�CЊƒ�dРииСТnejmnsНпюяяёё€ђ€ѓєѕЪC†�< ƒ�ZЦижЪЂ.27;=DДуюя№№ёёђђ€ѓїшg‡�A›ƒ�!oЪзерœ=GKNPTГф№юя№ёёђѓѓєєіьЫœvA‚� J™ƒ�}Эеиёыьь€э юынёю№ёёђѓ€є ѕіёгмџїЯ…G €�Yƒ�wаеиыыь€эюяэмѓ№ёђѓѓєѕѕііјєбСЃСцізˆnY& #c[ƒ�)xгеикммннпслйгёёђѓєєііїїјљігЃ sЭžbБ­‚[k%ƒ�}жеи€л!осЭГРЯЪпіђєѕѕїїјјљњљвž•Іf6/:bЭвzH„�)…иеиклодЛГЬнтрЬђѕііїјљљњњќћб›ŸойМr;,CruvF‚�+R”мдзйнЮŸЧпрнмфмфљїљјјњћћќ§ќеšxЃЁЊІœ{<Pщ� HндзмЪ­бп€норчзюљљњ€ћќ§ў§рЄ[zutrstxzmMnO€�DІмдие­ШпмннорЪФенїћћ€§ўўџќѓН&@ROMKHGGHF1[�GБкдйШХпммнорБЗзоулјў§ўџ§їЮ1$+(%#  Ug�ZЙйдиЬе€н отШЃнпнстфѓў‚џўіЯ; #7‡�xЩзезжмнноптЫЭр€оршфъћџўїгH(0`+‚�)zдзежсснопррпщфстууфшщяяёј§§їжT"! >DpPƒ�|жзжеч№прты№ььыыэюёяьэь№єѓй_'$ 9MUa?„�~ййззпўып‚т хщяѓѓ№ышцчш€щ юфl/.5JeVKw…� •лкиизшќщтфххфхццчшщщъъшьџц€odNN„rN†�Їлк€йзщћюххц€ч�ш€щ ъъщ№љљй|sq‡Ныˆ�›м‚кисњћычшшщъъюјўяухчыѓѕрп‡ˆ�$–омивйлкйр№љіѓ№юьыьэю№єіљіщуххчфсчнс‰ˆ�‘тиАЈ­нлмллохяїћ‚§љѓыхууфхцтИАТуу”‡�‘фзІМДкмм‚н псуххфутстуф€хцтИОТтф›"†�z›умиЮзм€лмннƒоррсттууф€хцпжфтуІ,†�fЃѓьэюэ„ь�э‚ю€я№№€ёђєѕє№ёИ6†�WЗрбг“в�б„ЯЮйЮA†�[Ђ­›„•” ••˜–—––—•˜–˜›…ІЈВU†�ZЉНxLTX\`cgjlmnsrDbKe`PmCeEК€ЗЛМИЗИД]†�&_ГЩˆ`oqtx}ƒŠ’™™JV‚{_G‚MœЦССУЃœПТУНa†�&`Ќм‰JxšŸЃЈЉЋЏЗИuЅЉЁˆДrЈyМвЭвЋx{žгбНM†�&|Їщ–7Me{Ђ­ЖИКПЧЫ—ТЄФПЊЮ˜ФžемирЄ0'тпЗB†�&fЃёЧ— ЇЋВОЬеиймруатжусйцвуещчхцтŠ}ащюЈ#‡�~т§€џўўќ‚њ љљќњћљљњљћњћј€іјњћљјэlˆ�Uk™jlljjRЖ�h8mk�� �������������������������dЄЪззШž`�����������������������������������C™ђџџџџџџџџю<�������������������������������2УџџџџџџџџџџџџџџЂ�����������������������������tюџџџџџџџџџџџџџџџџдV���������������������������jџџџџџџџџџџџџџџџџџџџњY�������������������������sџџџџџџџџџџџџџџџџџџџџџќ[�����������������������+щџџџџџџџџџџџџџџџџџџџџџџо��������������������� ПџџџџџџџџџџџџџџџџџџџџџџџџЉ ��������ˆМЛКККККККЗЯџџџџџџџџџџџџџџџџџџџџџџџџџџl��������АџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџГ������єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџф'������Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§[������Yџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�����mџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­�����џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџД �����“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ �����ЏџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ ����Уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўњџџџџџ~ ���� иџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ Њрќџ№X����ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрНЄœ(�����ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчЊ}6����%іџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўЏ ���1њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџё=���<§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџО2���Gџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€���OџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеA���[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьp����hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю#�����sџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџш„0������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгr ������Žџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№ЅR��������ІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфP��������МџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюF���������ЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњT���������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџj���������ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|��������2њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŽ��������Kџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџž��������`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏ ��������uџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР��������‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв��������†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџз!��������oџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџС��������JџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЊ��������#ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆ ���������“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмU���������(ЅЬЮЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЮЦv �����������=CBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC=�������������������������������������������������������������������������������������������������������������refit-0.14/icons/tool_shell.icns��������������������������������������������������������������������0000664�0001750�0001750�00000015011�10411554704�016243� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns�� ih32��љџ�Н�až‰•Š”’“’’‘ŠŠ�•Ы№ћ‡ќŽћњљљј€їіієтДz€�“ьІџћШb�]ДЃџ ўўќ§ўя…�Wг€џ�ў€џ“ќ‚ћ њњћџџўќќўљ�Zм€џУ”›ММ—Л МГŽНўћќњ‘�Zм€џ­i—˜’ “;�dџњњљ’�^н€џВ >Ž€„†–‡ †‰ˆ]џљљј“�^о€џА!›жІ‹x{~– †;_џјјі“�`п€џ ЏKАџњыЙ‚qmt”u w`qџіїі•�fс€џ ДV‹х§ќ§ъЪlh“j k_‡љяьэ–�fс€џ ЗW^gЅсєїћћЪc_“a U‡яспц˜�fу€џ ЗIWQHU‰сіјѓaS’V WHw№ппц™�gх€џ Л.BPs›зёљ§дRI’L N1fђпохš�kц€џ РFлѓќџќл‰I@“A E`ђонфœ�kш€џ Т \џџьТŠF-5“8 :5cёмлу�oщ€џУYёЇQ*$)ƒ-‚.‰- ..�e№лктž�oъ€џХ(""##$#€!((&%$#‚" #"��eякйрŸ�oы€џЧ€�.r‚v {V "! €  ��eюйирŸ�sэ€џ Щ� ?ъѓ№ќž ��eэзжоЁ�wя€џЬ� =@@€A C2  �eьженЂ�wя€џЭ�  �eыедмЂ�zя€џЯ"  !#"€$##! �eъгвкЄ�z№€џв& "$%&((€)((&%$" �eъвбкЅ�~ё€џд* "%')*,-‚.-,*)'%"  �eшбаиІ�~ђ€џж. !$')+./12‚321/.+('$! �fчЯЯзЇ�€ѓ€џж1"%(+.02457‚876430-+(&"�iчЮЭжЊ�€є€џж4"&*-0358:<=>€?>=<:8520-*&#kхЬЬеЋ�€є€џж7"&*.147:=?ABC€DCBA?=:741.*&"lфЫЫдЌ�„ѕ€џе9&*.258;?ACEGH€I,HGFCA?<852.)&"nуЪЩвЌ�„ѕџўџе<)-259=@CFHKLM€N,MLKHFC@=962-)%  pтШШб­�ˆіџ§ўд<)-26:>BEHJMOP€Q,POMJHEA>:62-)$  oтЧЦаЎ�ˆіџќќйL1;?DHLPTWZ]_ab€d"cb`][XTQNJFB=940}рХХЯЎ�ŠїўћњхЭЫЬЭЭ€Ю€Я‚аЯЮЮЭЬЫЩШЧХФУСПОМКЙЕЪгХФЭЏŠяўљїђђё№яэьыщшчцфутспонлкизждгбаЯЭЬЫЩЧЦХФХХУЬЏ•гџјііѕѓђ№яюьыъшчцфутсронмкйижедвбаЮЭЬЪЩШЦХУПс��Њ§§іѕWѓђёяюэыщшчцфутрпомлкизждгваЯЮЬЫЩШЧХФТСдуS��-№џџ§ќћњљјїіѕѓђё№№юэьыъщчццфутсрпнммкййзкыдe�\uyˆxwx“wtyl8џ�ю�џ�Н�až‰•Š”’“’’‘ŠŠ�•Ы№ћ‡ќŽћњљљј€їіієтДz€�“ьІџћШb�]ДЃџ ўўќ§ўя…�Wг€џ�ў€џ“ќ‚ћ њњћџџўќќўљ�Zм€џУ”›ММ—Л МГŽНўћќњ‘�Zм€џ­i—˜’ “;�dџњњљ’�^н€џВ >Ž€„†–‡ †‰ˆ]џљљј“�^о€џА!ŸйЉŒw{~– †;_џјјі“�`п€џ ЏJГџџђО‚qms”u w`qџіїі•�fс€џДUŽы€џђа mh“j k_‡љяьэ–�fс€џЗW^hЉш§€џвc_“a U‡яспц˜�fу€џЗIWQGVŒъ€џbS’V WHw№ппц™�gх€џ Л.AQuŸрќџџоSI’L N1fђпохš�kц€џРIс§€џфJ@“A E`ђонфœ�kш€џ Т cџџњЪG,5“8 :5cёмлу�oщ€џУ`їАT*#)ƒ-‚.‰- ..�e№лктž�oъ€џХ*""##$#€!((&%$#‚" #"��eякйрŸ�oы€џЧ€� /x}|€} Z "! €  ��eюйирŸ�sэ€џ Щ� BћƒџЉ ��eэзжоЁ�wя€џЬ� @CC€D E4  �eьженЂ�wя€џЭ� € �eыедмЂ�zя€џЯ"  !#"€$##! �eъгвкЄ�z№€џв& "$%&((€)((&%$" �eъвбкЅ�~ё€џд* "%')*,-‚.-,*)'%"  �eшбаиІ�~ђ€џж. !$')+./12‚321/.+('$! �fчЯЯзЇ�€ѓ€џж1"%(+.02457‚876430-+(&"�iчЮЭжЊ�€є€џж4"&*-0358:<=>€?>=<:8520-*&#kхЬЬеЋ�€є€џж7"&*.147:=?ABC€DCBA?=:741.*&"lфЫЫдЌ�„ѕ€џе9&*.258;?ACEGH€I,HGFCA?<852.)&"nуЪЩвЌ�„ѕџўџе<)-259=@CFHKLM€N,MLKHFC@=962-)%  pтШШб­�ˆіџ§ўд<)-26:>BEHJMOP€Q,POMJHEA>:62-)$  oтЧЦаЎ�ˆіџќќйL1;?DHLPTWZ]_ab€d"cb`][XTQNJFB=940}рХХЯЎ�ŠїўћњхЭЫЬЭЭ€Ю€Я‚аЯЮЮЭЬЫЩШЧХФУСПОМКЙЕЪгХФЭЏŠяўљїђђё№яэьыщшчцфутспонлкизждгбаЯЭЬЫЩЧЦХФХХУЬЏ•гџјііѕѓђ№яюьыъшчцфутсронмкйижедвбаЮЭЬЪЩШЦХУПс��Њ§§іѕWѓђёяюэыщшчцфутрпомлкизждгваЯЮЬЫЩШЧХФТСдуS��-№џџ§ќћњљјїіѕѓђё№№юэьыъщчццфутсрпнммкййзкыдe�\uyˆxwx“wtyl8џ�ю�џ�Н�až‰•Š”’“’’‘ŠŠ�•Ы№ћ‡ќŽћњљљј€їіієтДz€�“ьІџћШb�]ДЃџ ўўќ§ўя…�Wг€џ�ў€џ“ќ‚ћ њњћџџўќќўљ�Zм€џУ”›ММ—Л МГŽНўћќњ‘�Zм€џ­i—˜’ “;�dџњњљ’�^н€џВ >Ž€„†–‡ †‰ˆ]џљљј“�^о€џА!ŸйЉŒw{~– †;_џјјі“�`п€џ ЏJГџџђО‚qms”u w`qџіїі•�fс€џДUŽы€џђа mh“j k_‡љяьэ–�fс€џЗW^hЉш§€џвc_“a U‡яспц˜�fу€џЗIWQGVŒъ€џbS’V WHw№ппц™�gх€џ Л.AQuŸрќџџоSI’L N1fђпохš�kц€џРIс§€џфJ@“A E`ђонфœ�kш€џ Т cџџњЪG,5“8 :5cёмлу�oщ€џУ`їАT*#)ƒ-‚.‰- ..�e№лктž�oъ€џХ*""##$#€!((&%$#‚" #"��eякйрŸ�oы€џЧ€� /x}|€} Z "! €  ��eюйирŸ�sэ€џ Щ� BћƒџЉ ��eэзжоЁ�wя€џЬ� @CC€D E4  �eьженЂ�wя€џЭ� € �eыедмЂ�zя€џЯ"  !#"€$##! �eъгвкЄ�z№€џв& "$%&((€)((&%$" �eъвбкЅ�~ё€џд* "%')*,-‚.-,*)'%"  �eшбаиІ�~ђ€џж. !$')+./12‚321/.+('$! �fчЯЯзЇ�€ѓ€џж1"%(+.02457‚876430-+(&"�iчЮЭжЊ�€є€џж4"&*-0358:<=>€?>=<:8520-*&#kхЬЬеЋ�€є€џж7"&*.147:=?ABC€DCBA?=:741.*&"lфЫЫдЌ�„ѕ€џе9&*.258;?ACEGH€I,HGFCA?<852.)&"nуЪЩвЌ�„ѕџўџе<)-259=@CFHKLM€N,MLKHFC@=962-)%  pтШШб­�ˆіџ§ўд<)-26:>BEHJMOP€Q,POMJHEA>:62-)$  oтЧЦаЎ�ˆіџќќйL1;?DHLPTWZ]_ab€d"cb`][XTQNJFB=940}рХХЯЎ�ŠїўћњхЭЫЬЭЭ€Ю€Я‚аЯЮЮЭЬЫЩШЧХФУСПОМКЙЕЪгХФЭЏŠяўљїђђё№яэьыщшчцфутспонлкизждгбаЯЭЬЫЩЧЦХФХХУЬЏ•гџјііѕѓђ№яюьыъшчцфутсронмкйижедвбаЮЭЬЪЩШЦХУПс��Њ§§іѕWѓђёяюэыщшчцфутрпомлкизждгваЯЮЬЫЩШЧХФТСдуS��-№џџ§ќћњљјїіѕѓђё№№юэьыъщчццфутсрпнммкййзкыдe�\uyˆxwx“wtyl8џ�ю�h8mk�� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������šш№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№гm����&дџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџž�Тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџz�]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо$‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўG‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP‡џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќPˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќP†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћPWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфDУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ(�>щџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгT�?›ЦЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭХŸQ����6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC>&�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_legacy.icns���������������������������������������������������������������������0000664�0001750�0001750�00000114567�10416505553�016067� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��™wit32��Yg����џ�џ�И�UXњ�TЎЕZј�PЎЬШБZі�PЎЯРНУЎZє� TЏбТРМЗОЋZђ� PЏбУСОКЖБИЉZ№� PАвХТПМИДБЋГІZю�PАгЦФРНЙЖВ­ЊЄЌЄZь�TАгЦФСОКЗГАЋЇЃžІЁZъ�SБдЦХТОЛЗДАЌЈЄ œ–žŸ]ш�UБдЦФТПЛИДБ­ЉЅЁ™•—œZц�TБдЦФСПМИЕБ­ЊІЂžš•’‡™Zф�TБгЦФТПМИЕБЎЊІЂž›–’ŽŠ…‰–]т�SАвХФСОМИЕБЎЊІЃŸ›—’Š†‚~w“]р�SАвФУРОЛИДБЎЊЇЂŸ›—“Ž‹†‚zvp{‘]о�TАбУСПНКЗГБ­ЊІЃžš–“ŽŠ†ƒzvrnhtŽ]м�!SАЯСРОЛЙЖВЏЌЉЅЂžš–’ŽŠ…‚~zvrnjgbnŒ_к�#QЏЭПОМКЗДБЎЋЈЅЁ™–’މ…‚~yvrnjgcaZh‹_и�%]ДЫННКИЕВА­ЊІЃ ™•‘‰…}yvqmjfda]ZQY‚_ж�']ДШЛКИЖГБЎЋЈЅЁž›—”Œˆ…€|xupmjgc\TJB<6F€bд�)]ГХИЗЕГБЏЌЉІЃ œ™•’ŽŠ‡ƒ{xspmiaWLD@=;984E~bв�+]ВТЕЕГАЎЌЊЇЄЁž›—”Œ‰…~zvsoi^RHCA@?=;9761B~bа�-]БОВВЏЎЌЉЇЄЁŸœ™•’Ž‹‡„€|yuri\PIFDBB@=<:8743/A}_Ю�/_АЛЎЎЌЊЈІЄЁŸš–”Œ‰†‚{xsj\QLJHECBA>;;976432.@}dЬ�1_ЎЗЊЊЈІЅЃЁžœš–”‘ŽŠ‡„€|yul]TPMKIFDBA?=;98753221+=|dЪ�3]ЌГІІЄЃЁŸ›˜–“‘Ž‹ˆ…~{xoaWSQOLIGEBB@=<:8764320/.*={bШ�5]ЊЎЂЂ Ÿ›™—•“‘Ž‹‰…‚|ztfZVTROMJHECBA><;97653210/..*;{bЦ�7fЉЊœ›™—•“‘Š‡…ƒ€}zwl^XWTRPMJHFDBA?<;98754320//.-,);{dХ�7—І™˜––”’‘‹‰†…‚€}zxrd[YWUSOMKIFDCB?=;98764321//.--,,)=rЦ�0i•“‘Œ‹‰‡†ƒ~|zwtl_[ZWURPNKIFDDB@><:98653210/.--€,+Ш�,cŽŒ‰‡†…ƒ}zxvtpf][ZWTSPMLIFDCB@><;98654311//€-€,�Ъ�*`†„€}{ywtrqmb][YVTROMKIGDCB@><;:87643210/€-€,�У�-…„�)Y}zxwtrqomh`[[YVSQOMKIGEDB@>=;:87643220..€-,,„�•šК�ЮюЎ„�'Uwusqpmlje^[ZWUSQOLKHGFDBA>=;987643220/.€-,,„�™ЯЧ”И�Я№цф­„�&Opoljhgb\ZYVTRPOLJHGFDBA?=;:986532210..€-,„�šЯЩШФ”Ж�Ю№цфууЋ„�"Lihec_[YWUSRPMLJHGECBA@=;;976543210€.--,„�šаЫЦУУС–Д� Юёцфусрс­„�#Eca]YXUTRPOMKJHGECBA?=;;986543210/..€-�„� ›бЬЦХТООН“В� ЯёццутпомнЊ„�!B\XVTSQOMLKIHGECB@?=;:976543210/..€-�„� ›гЭЩЦТРМЙЙК“А� аёчцууспм€к�Ї„�=UTQPNMKJIHFDCA@?=;:877643210/..€-�„� šгЮЪЦФСОЛЗГВЕЎ�аѓчццуспнмижежЊ„�8QOMLKIHGEDBA@><;:987643210/..€-�„�›дЯЪЧХТПМИЕАЌ­В‹Ќ�ЯѓшцфуспоккидввгЅ„�7MKJIGFDCB@?=<;:887543211//€.-„�œгЯЫЩЦТРНЙЖГЎЊЅЅЌŽЊ�бёшчцусронкижгаЮЬЯЁ„�3IHFECBA@>=;;:8765332210/..--„�›еаЬЩЦФСНКЗГАЋЇЂžЇŠЈ�бѓшчцфуспнлижгвЮЫЧХЪЂ„�2EDBA@?><;:98765332210/.-.-„�›гаЫЩЧУСОЛЗДАЌЈЃž›––ЃŠІ�бёщчцфуспмкйждвЯЬШУРРЦž„�.CA@>=<::9775443220//.€-�„�гЯЫЩХУСОЛЗДА­ЉЄЁ›™’žŠЄ�ЯёчццфуспмкиждвЮЬШХТПОЙРž„�-@><;:88765433210/..€-�„�вЯЫЩХФСОЛЗЕА­ЉЅ œ™”‹ˆ‡™ŠЂ�ЯёщццусспмкйждвЮЪЩХФПМИДБМ„�)<;988765433210/..€-�„�вЮЫЧЦФСНКЗЕА­ЉЅЁ˜•‹ˆƒ~•‡ �Я№чццутронкиздбЮЬШЧТПМЙДБЎЌЗž„�(98776543211//..€-�„�œвЬЩЧХУРНКЗДБ­ЉЅЁ™”‰„€|ww…ž�а№чффссппмкиждвЮЪЩХТСМИДБ­ЈЅЄЏš„� &865433210/..-�„�œаЫЦЦУТПМЙЗГА­ЉЅЁ™”‰„€|xtooŒ…œ�!Я№цуутсоммлиждаЮЪШХТПЛИДЏ­ЊЄЂžšЊ™„� %5432110//..€-�„�!›бЪХХУСОМЗЖДЏЌЈЄЁœ—”‹ˆ„€|xsokhg‡…š�#аяуутсоомкйиждаЮЬШХТПМЗДБ­ЊЄ œ˜”’Ѕ™„�#3210//€.€-�„�# ЯЧФТСПМКЗЕГЎЋЈЄ œ—”‹ˆƒ{wsojgdacƒ‡˜�%-зюусрппммкиждвЯЮЪЩХРОКЗВБЋЉЄ œš”Ž‚wŠ•„�!11//€.€-�„�%ЇЮЦУСРНЛИЕГА­ЉІЂž›—’Š…‚zvsokhb[SHCp„–�'-иьссппнмкиидввЮЬЩЧФРПКЗВАЋЇЄЂ›sfYSQ{™„�"//..-�„�'ЇЫУРПНЛЙЖДБЏЋЇЄЁ™•’މ…}yusnh^RH@<:8:n…”�)-жьрпоммкйижддаЮЫЩХТОЛИЖВЏЊЈЄ—‡vgb]YWSOI~•„� /.-�„�)ЅЩУОНЛЙЗЕГА­ЊЇЃ ›—”‹‰„}yupdVKDA@=<:846lˆ’�.зыном€к"иждваЮЬЩЧУРПКЗДЏЎЊЂ“€rjiif]ZUUOKEx‘„� .--,„�+ЅЧОМКЗЖЕДАЎЋЇЄЁ™–’ŽŠˆ„|xoaSKHDDA==;96424i„�-.еъмнмккзеждвЮЮЬШХТОНКЗГЏ­Ђ~vqmgif_\WQOJHGAs”„�,-„�-ЃХКИЗЕДГЏ­ЋЉЅЂžœ˜”‘‰…‚~yn_SMKIEDB@=<:8543.0i„Ž�.еш€к)иижжгбаЮЪЩЧУТПМЙДВЏЂ‚|wtojif_\ZSULJIA??n”„�„�/ЃТЗЕДГАЎ­ЋЈЇЃ œ™–’‹ˆƒ€|p`UROLJFDC@==;96531.-0h„Œ�-гш€и+ждгдаЮЮЪЩЩХТРНКЗДАЄ“†‚~zsqkgif]YUTOJHDA@=9k–‹�1ЃПГБАЎ­ЋЊЇЅЂ œš—”Œ‰…‚~scZUSQMKHEDA>=<:8542/..,/g„Š�.вц€ж-двваЮЬЬШЧХФРПОЗДВЊ—Іƒyvrmgif_\WSULKFDB==:4j’‰�3ЁМЏЎ­ЋЊЈЇЄЁž™—•‘ŽŠˆƒ€xg\YVTRMKIEDC@=<:8553//..-+-f†ˆ�5-бтгвваЯЮЬЬЫШЧХФТПЛЙЗДЌœŒ‡‚ytrojida^ZUSOJFDA==853,e’†�- ИЊЉЉЇЅЃЂ ›™–’‘ŽŠˆ„‚|n`\ZWTRNKIFDBA>=;86533/€.,,'*f„†�JЯрЯ€ЮЫЪЪЩЧЧФТРПМИЕДЏІ”‹‰‚€|wrolgd`]Z€UMHFB?:;90..(bŽU„�,šЖІЄЃЂЁ ›š—•’Ž‹‰…‚uf_]ZWTRNLJHECA>=;985431€.-+(('*c}…�2ПлЬЯЪЪШЧХЦУТРПНЛИЗДАЋž‘‹‰…€|wtokjif]\UTUMIDB=;8930€.)Rџ„�+m–Ѓž›™—•”’Šˆ…€zlb^]ZXTSOLJHFDB>=<:85441€.-,)€('(K†�0•ШЩЧХХТТРОНМКЗЖДБЎІ•‹‰…€}xtqkjif_\UQPJHD?>:7800€.+‡�)Hš—–”“‘‹Šˆ„|tgb_]ZWUSOLKHFDA>=<:95541.,))€($ˆ�3‹СТРППНЛКЗЖВБЎЌЊ”’‹‡‚€|xsrkjif`\UTOJHFA=>;8600..+"‰�(A‰”ŽŒ‹‰ˆ„‚}|xoeb_]YWUROMKIFDBA==;96543/€.-+)€($Š�-…ОЛКИЕЖВАЏЎЋЈЄ˜‘Œˆ†ƒ}ztrnkgif`\WSOMHFA@=>7900€.�‹�&@‹ˆˆ„‚€~|ywtkca_\YWTROLKIFEC@==<98543/€.-+))((#„��џ„�/‚ЗДГБАЎЋЊЉІ ”Š‰…}xvqnkjif`\WTOLKFD?@>88601-.!„�œІ„�/<z…€~|zywuqgba^\YVTRNLKJHEB@==;:86432/..-,))((%„�€џ„�-|БЎ­ЊЊІЄЂž’ŽŽ‹‡…€|xvrqkjdf`\WTOMJIDB@=783010.„�›ллЄ„�#:t|ywuspmea_]ZXVSRNLJJHEB@>=<:86532/€.�-€)(#ƒ�ƒџ„�+xЉЅЄЂ Ÿ™‹ˆ†ƒ€zytsongif_\WUUOJIDA?=;85010+"„�мзгзЃ„�+6kuqomhc_\\ZWUSQMLJIFEC@>=<:96443//.--,))*#„�„џ„�)lЁœ™”ŠŠ‡…}zvsqokgif_\WUQOJIFD?=:8<600+"„�нигвЯгЃ„�4fkhfa^\ZXUTSOMLJIFEC@>=<;855431€.-,€)$„�†џ„�'g™–‘ŒŠˆ†‚|xwtqnkid`]\ZSQOMHFDB=:88530-!„� ойегЯЭЫб „�0_f_\ZXVTSROMLJIFDB@€=:965432/€.-+))#„�ˆџ„�%b“‰‰†‚‚}}vstqmjifa]\WSQOMKFD?=::8<6.-!„� окегбЯЫШЧЭ„�0X\YWUTROMMKJIFDB@==<:965532/€.-,))%„�Šџ„�#Wˆƒ|xvsrrnjid``\WQUOMKFAB==:756--!„� žолждбЮЬЩЦУТШœ„�,RUTRQNMLKIHECB@>=;:865531/€.-,)(%„�Œџ„�!Q€}zvvtqmjjifa]YUSUOMJFA?==:75600 „�žокзеввЭЪЧФСОЛТ—„�*MROMLKJHFDC@>==;:965431.-,+)%„�Žџ„�H{vrsnnjida`\ZUSUOJHFD?==;7896-!„�žплзевбЮЫЧХТРЛЗЕН•„� (INLKIHEDB@€=;:865431‚.,,)%„�џ„�Bwpmkidba^\WUSULJFDD?@=:;993-!„�ŸплзжвбЮЫШЦУРМЙДБ­И“„�&FJHEDBA>==<;9865431/€.-+,)#„�’џ„�Dlgifa]]ZWUUOMHIDD?@>;86030!„�ŸплзегвЯЫЩЦФСНЙДВЌЉІБ„�$AFCB@>==<:8654431/€.-+))%„�”џ„�:lca]\WUTULJHFFD?@=;;9031!„�окижгбЮЬЩЦТПНЙЕВЎЉЄЂŸЊŽ„�$?B>==;::8654431/..--+))%„�–џ„�3b[ZUTUOLJIFDD?==;89130!„� олзжгбЮЬЩЦФРНЙЕДЎЊІЃš–Ѕ‹„� "<><;:98654431€.--+))%„�˜џ„�3YSQUOLJIFDA@=>78<400!„� оижгвбЯЫЩЦУРНКЕДЎЊЅЂž›—‘Ÿ‰„� "9;98655432/€.--+)*%„�šџ„�*UOOMKIFD?==:855300!„� оижгвЯЮЫШЦУРНКЕДЎЊЇЂŸ›–’ŽŠ‡™ˆ„�"68654431.--,))%„�‹џ��џ„�,OKHFBA?=::786030!„�žмидгбЮЭЪШХУРНКЕДЎЊІЂ›–‘މ…€~‘…„�35421/.--€)%„�žџ„�!GEA?==:7889100"„�!žлжввЯЮЫЩЧЦТПНЙЕДЎЉІЂš•‘މ„€}yt‹„„�321.--,+))%„� џ„� B>>::78<6€0�!„�#ЅкдбЯЮЫЪЦХУРОЛИДВЌЈЅЁžš•‘‡…€~yurn„�,/€.--,€)%„�Žџ��џ„�<<;8893€0�!„�&ЊлвЯЮЬЪШЦУТРНКЖДЏЌЉЄЁ˜”Œ‡ƒ€}ypi\PFc{ ƒ�,/.--,€)%„�џ�џ�‘џ„�9989€0-!„�(ЈиЯЭЫЪШЧХУРОЛИЕВЎЌЇЃ ›™”‹……€viZPICB@<_xƒ�-.-+€)%„�џ�’џ„� 64€0.!„�*ЊжЭЫЪШЦФТСПНЙЗДБЋЉЄЁœš™“‹…~q`TNLIFCB?>7]x ƒ�**))(%„�џ€�“џ„� 0/0+!„�,ЊдЫЪЧЦФУСПМКИЕДЏЋЇЄ ›™•‘‰}m^UQPMLIDC@><84Zwƒ�()($„�џ�”џ„� -0!„�.ЇгШЦФФУСПМКЙЗГБ­ЉІЂŸ›˜“Š}l_ZVTQNLIFCB?<;871Yuƒ�'%„�џ‚�•џ„� „�0ЇЯФФТРРОМКИЗГВЎЌЇЄ ™—’~mc^]YUUPMJHEB?>;9674/Uu ƒ� „�џƒ�–џ‹�2ЇЭУПРННЛКЗДДБЎЋЉІЁŸ›™•rfca]ZURPOLIFC@><;77320,Tt Š�џƒ�–џŠ�4ЂЬОНМКЙЗЕДДЏЏЋЉЇЂ ˜”’ˆujifb^ZVTQOMKHCB><:877420.)Rt ˆ�џ…�“џ�џ‰�7 ЂЧКЗИЗЕДДБЏ­ЊЉЅЂŸš—“}plifb`\XSQNMJHDB?><977300/-*&Pu"†�џ†�џ�џŒ� УЖ€Д1БЏЎ­ЊЉЇЅЂŸš™”…unlifc`\YSRPOLHED@?<967320/-**)&Nn…�џ†�Œџ’�7` БЎ­ЌЌЉЇІЃЃ Ÿ›™™”‘Œ}rpkifb`[XURQNLIFCB?<967420/+,**)) †�Œџ�џџ†�‰џ–�4™ЉЉІЅЃЁŸ›š™”’…wppliic`]YURQPLIFC@><9772200-+,**)#‰�‹џ‰�џ�џ�2’Ђ Ÿžœš˜•“ŽŒ‡~tpnlifb`\YURPOLIFC@>;;673220/,,*(+#‹�‰џБ�0‹›™™”“‘Œ‰‡ƒyrpliica]ZWTRPOLHGCB?<;87442//+,,*)#�†џ�џЉ�€џƒ�.ƒ“‹‡…ƒ€xpnlliba][WTRQNJIGC@?<;877420/-+,*-#…�џџ„�ˆџЈ�‚џƒ�'|‹‰…ƒƒ€{spmkifb`]YWTTQMJKFC@?>;877320//€,)%…�џ„�…џЉ�ƒџ„�*u‚€~{ypmlliea`\XUTRQMLIFCB?>;867740//-+*+#…�ƒџ…�џЊ�†џƒ�nzwtnliifb_^ZXWTRPMLIFCB@>;9€7200//,*+#…�…џ…�€џЉ�ˆџƒ� gsmkifc`^]ZXUTRPLKIFCB?><9€7400//-**%…�‡џВ�‰џ„�$ ^ifcb`]ZYVURQNMKIFC@?>;:877220//-,+%…�ˆџБ�‹џ„�# Wb`^\YXVTRQMLKIDC@?><;873420/--,+%„�ŠџЏ�џ„� U]ZXWUTQPMLIFEB@?><;8732200/-++%…�Œџ­�џ„�NZUTRPMLKHFCC@?>;9€74220//-+%…�‹џ�џЌ�‘џ„� KSQNLJKHDCB@><;8€7420//+-,$…�Œџ­�”џƒ�FLJKHFECB?><;87734200.,,+%„�‹џ�џЌ�•џ„�AJHEC@?><:97763420//+,+%„�Œџ­�—џ„� =DB@?><<;6€7 220/-+,+%„�џЌ�™џ„�9@><<;9€7 4200/-+,+%„�Œџ­�›џ„� 6>;98773220€/-,+%„�Œџ­�џ„�4977442200./,,+&„�џЌ�Ÿџ„�3542200//-,*,&„�џЌ�Ёџ„�-220€/-,,+%„�ŽџЋ�Ѓџ„� +10/--+,+%„�џЌ�Ѕџ„� )/-+**)%„�ŽџЋ�Їџ„�),,*)%„�џЋ�Јџ…�%+-%„�Žџ�џЊ�Њџ…�"%„�ŽџЌ�Ќџ„�„�џЋ�Ўџ‹�Žџ�џЊ�ЏџŠ�џЎ�Їџ�џ�ŽџГ�Ёџ‘�џџ�џ�Ѕ�џ�џ�И�UXњ�TЎЕZј�PЎЬШБZі�PЎЯРНУЎZє� TЏбТРМЗОЋZђ� PЏбУСОКЖБИЉZ№� PАвХТПМИДБЋГІZю�PАгЦФРНЙЖВ­ЊЄЌЄZь�TАгЦФСОКЗГАЋЇЃžІЁZъ�SБдЦХТОЛЗДАЌЈЄ œ–žŸ]ш�UБдЦФТПЛИДБ­ЉЅЁ™•—œZц�TБдЦФСПМИЕБ­ЊІЂžš•’‡™Zф�TБгЦФТПМИЕБЎЊІЂž›–’ŽŠ…‰–]т�SАвХФСОМИЕБЎЊІЃŸ›—’Š†‚~w“]р�SАвФУРОЛИДБЎЊЇЂŸ›—“Ž‹†‚zvp{‘]о�TАбУСПНКЗГБ­ЊІЃžš–“ŽŠ†ƒzvrnhtŽ]м�!SАЯСРОЛЙЖВЏЌЉЅЂžš–’ŽŠ…‚~zvrnjgbnŒ_к�#QЏЭПОМКЗДБЎЋЈЅЁ™–’މ…‚~yvrnjgcaZh‹_и�%]ДЫННКИЕВА­ЊІЃ ™•‘‰…}yvqmjfda]ZQY‚_ж�']ДШЛКИЖГБЎЋЈЅЁž›—”Œˆ…€|xupmjgc\TJB<6F€bд�)]ГХИЗЕГБЏЌЉІЃ œ™•’ŽŠ‡ƒ{xspmiaWLD@=;984E~bв�+]ВТЕЕГАЎЌЊЇЄЁž›—”Œ‰…~zvsoi^RHCA@?=;9761B~bа�-]БОВВЏЎЌЉЇЄЁŸœ™•’Ž‹‡„€|yuri\PIFDBB@=<:8743/A}_Ю�/_АЛЎЎЌЊЈІЄЁŸš–”Œ‰†‚{xsj\QLJHECBA>;;976432.@}dЬ�1_ЎЗЊЊЈІЅЃЁžœš–”‘ŽŠ‡„€|yul]TPMKIFDBA?=;98753221+=|dЪ�3]ЌГІІЄЃЁŸ›˜–“‘Ž‹ˆ…~{xoaWSQOLIGEBB@=<:8764320/.*={bШ�5]ЊЎЂЂ Ÿ›™—•“‘Ž‹‰…‚|ztfZVTROMJHECBA><;97653210/..*;{bЦ�7fЉЊœ›™—•“‘Š‡…ƒ€}zwl^XWTRPMJHFDBA?<;98754320//.-,);{dХ�7—І™˜––”’‘‹‰†…‚€}zxrd[YWUSOMKIFDCB?=;98764321//.--,,)=rЦ�0i•“‘Œ‹‰‡†ƒ~|zwtl_[ZWURPNKIFDDB@><:98653210/.--€,+Ш�,cŽŒ‰‡†…ƒ}zxvtpf][ZWTSPMLIFDCB@><;98654311//€-€,�Ъ�*`†„€}{ywtrqmb][YVTROMKIGDCB@><;:87643210/€-€,�У�-…„�)Y}zxwtrqomh`[[YVSQOMKIGEDB@>=;:87643220..€-,,„�•šК�ЮюЎ„�'Uwusqpmlje^[ZWUSQOLKHGFDBA>=;987643220/.€-,,„�™ЯЧ”И�Я№цф­„�&Opoljhgb\ZYVTRPOLJHGFDBA?=;:986532210..€-,„�šЯЩШФ”Ж�Ю№цфууЋ„�"Lihec_[YWUSRPMLJHGECBA@=;;976543210€.--,„�šаЫЦУУС–Д� Юёцфусрс­„�#Eca]YXUTRPOMKJHGECBA?=;;986543210/..€-�„� ›бЬЦХТООН“В� ЯёццутпомнЊ„�!B\XVTSQOMLKIHGECB@?=;:976543210/..€-�„� ›гЭЩЦТРМЙЙК“А� аёчцууспм€к�Ї„�=UTQPNMKJIHFDCA@?=;:877643210/..€-�„� šгЮЪЦФСОЛЗГВЕЎ�аѓчццуспнмижежЊ„�8QOMLKIHGEDBA@><;:987643210/..€-�„�›дЯЪЧХТПМИЕАЌ­В‹Ќ�ЯѓшцфуспоккидввгЅ„�7MKJIGFDCB@?=<;:887543211//€.-„�œгЯЫЩЦТРНЙЖГЎЊЅЅЌŽЊ�бёшчцусронкижгаЮЬЯЁ„�3IHFECBA@>=;;:8765332210/..--„�›еаЬЩЦФСНКЗГАЋЇЂžЇŠЈ�бѓшчцфуспнлижгвЮЫЧХЪЂ„�2EDBA@?><;:98765332210/.-.-„�›гаЫЩЧУСОЛЗДАЌЈЃž›––ЃŠІ�бёщчцфуспмкйждвЯЬШУРРЦž„�.CA@>=<::9775443220//.€-�„�гЯЫЩХУСОЛЗДА­ЉЄЁ›™’žŠЄ�ЯёчццфуспмкиждвЮЬШХТПОЙРž„�-@><;:88765433210/..€-�„�вЯЫЩХФСОЛЗЕА­ЉЅ œ™”‹ˆ‡™ŠЂ�ЯёщццусспмкйждвЮЪЩХФПМИДБМ„�)<;988765433210/..€-�„�вЮЫЧЦФСНКЗЕА­ЉЅЁ˜•‹ˆƒ~•‡ �Я№чццутронкиздбЮЬШЧТПМЙДБЎЌЗž„�(98776543211//..€-�„�œвЬЩЧХУРНКЗДБ­ЉЅЁ™”‰„€|ww…ž�а№чффссппмкиждвЮЪЩХТСМИДБ­ЈЅЄЏš„� &865433210/..-�„�œаЫЦЦУТПМЙЗГА­ЉЅЁ™”‰„€|xtooŒ…œ�!Я№цуутсоммлиждаЮЪШХТПЛИДЏ­ЊЄЂžšЊ™„� %5432110//..€-�„�!›бЪХХУСОМЗЖДЏЌЈЄЁœ—”‹ˆ„€|xsokhg‡…š�#аяуутсоомкйиждаЮЬШХТПМЗДБ­ЊЄ œ˜”’Ѕ™„�#3210//€.€-�„�# ЯЧФТСПМКЗЕГЎЋЈЄ œ—”‹ˆƒ{wsojgdacƒ‡˜�%-зюусрппммкиждвЯЮЪЩХРОКЗВБЋЉЄ œš”Ž‚wŠ•„�!11//€.€-�„�%ЇЮЦУСРНЛИЕГА­ЉІЂž›—’Š…‚zvsokhb[SHCp„–�'-иьссппнмкиидввЮЬЩЧФРПКЗВАЋЇЄЂ›sfYSQ{™„�"//..-�„�'ЇЫУРПНЛЙЖДБЏЋЇЄЁ™•’މ…}yusnh^RH@<:8:n…”�)-жьрпоммкйижддаЮЫЩХТОЛИЖВЏЊЈЄ—‡vgb]YWSOI~•„� /.-�„�)ЅЩУОНЛЙЗЕГА­ЊЇЃ ›—”‹‰„}yupdVKDA@=<:846lˆ’�.зыном€к"иждваЮЬЩЧУРПКЗДЏЎЊЂ“€rjiif]ZUUOKEx‘„� .--,„�+ЅЧОМКЗЖЕДАЎЋЇЄЁ™–’ŽŠˆ„|xoaSKHDDA==;96424i„�-.еъмнмккзеждвЮЮЬШХТОНКЗГЏ­Ђ~vqmgif_\WQOJHGAs”„�,-„�-ЃХКИЗЕДГЏ­ЋЉЅЂžœ˜”‘‰…‚~yn_SMKIEDB@=<:8543.0i„Ž�.еш€к)иижжгбаЮЪЩЧУТПМЙДВЏЂ‚|wtojif_\ZSULJIA??n”„�„�/ЃТЗЕДГАЎ­ЋЈЇЃ œ™–’‹ˆƒ€|p`UROLJFDC@==;96531.-0h„Œ�-гш€и+ждгдаЮЮЪЩЩХТРНКЗДАЄ“†‚~zsqkgif]YUTOJHDA@=9k–‹�1ЃПГБАЎ­ЋЊЇЅЂ œš—”Œ‰…‚~scZUSQMKHEDA>=<:8542/..,/g„Š�.вц€ж-двваЮЬЬШЧХФРПОЗДВЊ—Іƒyvrmgif_\WSULKFDB==:4j’‰�3ЁМЏЎ­ЋЊЈЇЄЁž™—•‘ŽŠˆƒ€xg\YVTRMKIEDC@=<:8553//..-+-f†ˆ�5-бтгвваЯЮЬЬЫШЧХФТПЛЙЗДЌœŒ‡‚ytrojida^ZUSOJFDA==853,e’†�- ИЊЉЉЇЅЃЂ ›™–’‘ŽŠˆ„‚|n`\ZWTRNKIFDBA>=;86533/€.,,'*f„†�JЯрЯ€ЮЫЪЪЩЧЧФТРПМИЕДЏІ”‹‰‚€|wrolgd`]Z€UMHFB?:;90..(bŽU„�,šЖІЄЃЂЁ ›š—•’Ž‹‰…‚uf_]ZWTRNLJHECA>=;985431€.-+(('*c}…�2ПлЬЯЪЪШЧХЦУТРПНЛИЗДАЋž‘‹‰…€|wtokjif]\UTUMIDB=;8930€.)Rџ„�+m–Ѓž›™—•”’Šˆ…€zlb^]ZXTSOLJHFDB>=<:85441€.-,)€('(K†�0•ШЩЧХХТТРОНМКЗЖДБЎІ•‹‰…€}xtqkjif_\UQPJHD?>:7800€.+‡�)Hš—–”“‘‹Šˆ„|tgb_]ZWUSOLKHFDA>=<:95541.,))€($ˆ�3‹СТРППНЛКЗЖВБЎЌЊ”’‹‡‚€|xsrkjif`\UTOJHFA=>;8600..+"‰�(A‰”ŽŒ‹‰ˆ„‚}|xoeb_]YWUROMKIFDBA==;96543/€.-+)€($Š�-…ОЛКИЕЖВАЏЎЋЈЄ˜‘Œˆ†ƒ}ztrnkgif`\WSOMHFA@=>7900€.�‹�&@‹ˆˆ„‚€~|ywtkca_\YWTROLKIFEC@==<98543/€.-+))((#„��џ„�/‚ЗДГБАЎЋЊЉІ ”Š‰…}xvqnkjif`\WTOLKFD?@>88601-.!„�œІ„�/<z…€~|zywuqgba^\YVTRNLKJHEB@==;:86432/..-,))((%„�€џ„�-|БЎ­ЊЊІЄЂž’ŽŽ‹‡…€|xvrqkjdf`\WTOMJIDB@=783010.„�›ллЄ„�#:t|ywuspmea_]ZXVSRNLJJHEB@>=<:86532/€.�-€)(#ƒ�ƒџ„�+xЉЅЄЂ Ÿ™‹ˆ†ƒ€zytsongif_\WUUOJIDA?=;85010+"„�мзгзЃ„�+6kuqomhc_\\ZWUSQMLJIFEC@>=<:96443//.--,))*#„�„џ„�)lЁœ™”ŠŠ‡…}zvsqokgif_\WUQOJIFD?=:8<600+"„�нигвЯгЃ„�4fkhfa^\ZXUTSOMLJIFEC@>=<;855431€.-,€)$„�†џ„�'g™–‘ŒŠˆ†‚|xwtqnkid`]\ZSQOMHFDB=:88530-!„� ойегЯЭЫб „�0_f_\ZXVTSROMLJIFDB@€=:965432/€.-+))#„�ˆџ„�%b“‰‰†‚‚}}vstqmjifa]\WSQOMKFD?=::8<6.-!„� окегбЯЫШЧЭ„�0X\YWUTROMMKJIFDB@==<:965532/€.-,))%„�Šџ„�#Wˆƒ|xvsrrnjid``\WQUOMKFAB==:756--!„� žолждбЮЬЩЦУТШœ„�,RUTRQNMLKIHECB@>=;:865531/€.-,)(%„�Œџ„�!Q€}zvvtqmjjifa]YUSUOMJFA?==:75600 „�žокзеввЭЪЧФСОЛТ—„�*MROMLKJHFDC@>==;:965431.-,+)%„�Žџ„�H{vrsnnjida`\ZUSUOJHFD?==;7896-!„�žплзевбЮЫЧХТРЛЗЕН•„� (INLKIHEDB@€=;:865431‚.,,)%„�џ„�Bwpmkidba^\WUSULJFDD?@=:;993-!„�ŸплзжвбЮЫШЦУРМЙДБ­И“„�&FJHEDBA>==<;9865431/€.-+,)#„�’џ„�Dlgifa]]ZWUUOMHIDD?@>;86030!„�ŸплзегвЯЫЩЦФСНЙДВЌЉІБ„�$AFCB@>==<:8654431/€.-+))%„�”џ„�:lca]\WUTULJHFFD?@=;;9031!„�окижгбЮЬЩЦТПНЙЕВЎЉЄЂŸЊŽ„�$?B>==;::8654431/..--+))%„�–џ„�3b[ZUTUOLJIFDD?==;89130!„� олзжгбЮЬЩЦФРНЙЕДЎЊІЃš–Ѕ‹„� "<><;:98654431€.--+))%„�˜џ„�3YSQUOLJIFDA@=>78<400!„� оижгвбЯЫЩЦУРНКЕДЎЊЅЂž›—‘Ÿ‰„� "9;98655432/€.--+)*%„�šџ„�*UOOMKIFD?==:855300!„� оижгвЯЮЫШЦУРНКЕДЎЊЇЂŸ›–’ŽŠ‡™ˆ„�"68654431.--,))%„�‹џ��џ„�,OKHFBA?=::786030!„�žмидгбЮЭЪШХУРНКЕДЎЊІЂ›–‘މ…€~‘…„�35421/.--€)%„�žџ„�!GEA?==:7889100"„�!žлжввЯЮЫЩЧЦТПНЙЕДЎЉІЂš•‘މ„€}yt‹„„�321.--,+))%„� џ„� B>>::78<6€0�!„�#ЅкдбЯЮЫЪЦХУРОЛИДВЌЈЅЁžš•‘‡…€~yurn„�,/€.--,€)%„�Žџ��џ„�<<;8893€0�!„�&ЊлвЯЮЬЪШЦУТРНКЖДЏЌЉЄЁ˜”Œ‡ƒ€}ypi\PFc{ ƒ�,/.--,€)%„�џ�џ�‘џ„�9989€0-!„�(ЈиЯЭЫЪШЧХУРОЛИЕВЎЌЇЃ ›™”‹……€viZPICB@<_xƒ�-.-+€)%„�џ�’џ„� 64€0.!„�*ЊжЭЫЪШЦФТСПНЙЗДБЋЉЄЁœš™“‹…~q`TNLIFCB?>7]x ƒ�**))(%„�џ€�“џ„� 0/0+!„�,ЊдЫЪЧЦФУСПМКИЕДЏЋЇЄ ›™•‘‰}m^UQPMLIDC@><84Zwƒ�()($„�џ�”џ„� -0!„�.ЇгШЦФФУСПМКЙЗГБ­ЉІЂŸ›˜“Š}l_ZVTQNLIFCB?<;871Yuƒ�'%„�џ‚�•џ„� „�0ЇЯФФТРРОМКИЗГВЎЌЇЄ ™—’~mc^]YUUPMJHEB?>;9674/Uu ƒ� „�џƒ�–џ‹�2ЇЭУПРННЛКЗДДБЎЋЉІЁŸ›™•rfca]ZURPOLIFC@><;77320,Tt Š�џƒ�–џŠ�4ЂЬОНМКЙЗЕДДЏЏЋЉЇЂ ˜”’ˆujifb^ZVTQOMKHCB><:877420.)Rt ˆ�џ…�“џ�џ‰�7 ЂЧКЗИЗЕДДБЏ­ЊЉЅЂŸš—“}plifb`\XSQNMJHDB?><977300/-*&Pu"†�џ†�џ�џŒ� УЖ€Д1БЏЎ­ЊЉЇЅЂŸš™”…unlifc`\YSRPOLHED@?<967320/-**)&Nn…�џ†�Œџ’�7` БЎ­ЌЌЉЇІЃЃ Ÿ›™™”‘Œ}rpkifb`[XURQNLIFCB?<967420/+,**)) †�Œџ�џџ†�‰џ–�4™ЉЉІЅЃЁŸ›š™”’…wppliic`]YURQPLIFC@><9772200-+,**)#‰�‹џ‰�џ�џ�2’Ђ Ÿžœš˜•“ŽŒ‡~tpnlifb`\YURPOLIFC@>;;673220/,,*(+#‹�‰џБ�0‹›™™”“‘Œ‰‡ƒyrpliica]ZWTRPOLHGCB?<;87442//+,,*)#�†џ�џЉ�€џƒ�.ƒ“‹‡…ƒ€xpnlliba][WTRQNJIGC@?<;877420/-+,*-#…�џџ„�ˆџЈ�‚џƒ�'|‹‰…ƒƒ€{spmkifb`]YWTTQMJKFC@?>;877320//€,)%…�џ„�…џЉ�ƒџ„�*u‚€~{ypmlliea`\XUTRQMLIFCB?>;867740//-+*+#…�ƒџ…�џЊ�†џƒ�nzwtnliifb_^ZXWTRPMLIFCB@>;9€7200//,*+#…�…џ…�€џЉ�ˆџƒ� gsmkifc`^]ZXUTRPLKIFCB?><9€7400//-**%…�‡џВ�‰џ„�$ ^ifcb`]ZYVURQNMKIFC@?>;:877220//-,+%…�ˆџБ�‹џ„�# Wb`^\YXVTRQMLKIDC@?><;873420/--,+%„�ŠџЏ�џ„� U]ZXWUTQPMLIFEB@?><;8732200/-++%…�Œџ­�џ„�NZUTRPMLKHFCC@?>;9€74220//-+%…�‹џ�џЌ�‘џ„� KSQNLJKHDCB@><;8€7420//+-,$…�Œџ­�”џƒ�FLJKHFECB?><;87734200.,,+%„�‹џ�џЌ�•џ„�AJHEC@?><:97763420//+,+%„�Œџ­�—џ„� =DB@?><<;6€7 220/-+,+%„�џЌ�™џ„�9@><<;9€7 4200/-+,+%„�Œџ­�›џ„� 6>;98773220€/-,+%„�Œџ­�џ„�4977442200./,,+&„�џЌ�Ÿџ„�3542200//-,*,&„�џЌ�Ёџ„�-220€/-,,+%„�ŽџЋ�Ѓџ„� +10/--+,+%„�џЌ�Ѕџ„� )/-+**)%„�ŽџЋ�Їџ„�),,*)%„�џЋ�Јџ…�%+-%„�Žџ�џЊ�Њџ…�"%„�ŽџЌ�Ќџ„�„�џЋ�Ўџ‹�Žџ�џЊ�ЏџŠ�џЎ�Їџ�џ�ŽџГ�Ёџ‘�џџ�џ�Ѕ�џ�џ�И�UXњ�TЎЕZј�PЎЬШБZі�PЎЯРНУЎZє� TЏбТРМЗОЋZђ� PЏбУСОКЖБИЉZ№� PАвХТПМИДБЋГІZю�PАгЦФРНЙЖВ­ЊЄЌЄZь�TАгЦФСОКЗГАЋЇЃžІЁZъ�SБдЦХТОЛЗДАЌЈЄ œ–žŸ]ш�UБдЦФТПЛИДБ­ЉЅЁ™•—œZц�TБдЦФСПМИЕБ­ЊІЂžš•’‡™Zф�TБгЦФТПМИЕБЎЊІЂž›–’ŽŠ…‰–]т�SАвХФСОМИЕБЎЊІЃŸ›—’Š†‚~w“]р�SАвФУРОЛИДБЎЊЇЂŸ›—“Ž‹†‚zvp{‘]о�TАбУСПНКЗГБ­ЊІЃžš–“ŽŠ†ƒzvrnhtŽ]м�!SАЯСРОЛЙЖВЏЌЉЅЂžš–’ŽŠ…‚~zvrnjgbnŒ_к�#QЏЭПОМКЗДБЎЋЈЅЁ™–’މ…‚~yvrnjgcaZh‹_и�%]ДЫННКИЕВА­ЊІЃ ™•‘‰…}yvqmjfda]ZQY‚_ж�']ДШЛКИЖГБЎЋЈЅЁž›—”Œˆ…€|xupmjgc\TJB<6F€bд�)]ГХИЗЕГБЏЌЉІЃ œ™•’ŽŠ‡ƒ{xspmiaWLD@=;984E~bв�+]ВТЕЕГАЎЌЊЇЄЁž›—”Œ‰…~zvsoi^RHCA@?=;9761B~bа�-]БОВВЏЎЌЉЇЄЁŸœ™•’Ž‹‡„€|yuri\PIFDBB@=<:8743/A}_Ю�/_АЛЎЎЌЊЈІЄЁŸš–”Œ‰†‚{xsj\QLJHECBA>;;976432.@}dЬ�1_ЎЗЊЊЈІЅЃЁžœš–”‘ŽŠ‡„€|yul]TPMKIFDBA?=;98753221+=|dЪ�3]ЌГІІЄЃЁŸ›˜–“‘Ž‹ˆ…~{xoaWSQOLIGEBB@=<:8764320/.*={bШ�5]ЊЎЂЂ Ÿ›™—•“‘Ž‹‰…‚|ztfZVTROMJHECBA><;97653210/..*;{bЦ�7fЉЊœ›™—•“‘Š‡…ƒ€}zwl^XWTRPMJHFDBA?<;98754320//.-,);{dХ�7—І™˜––”’‘‹‰†…‚€}zxrd[YWUSOMKIFDCB?=;98764321//.--,,)=rЦ�0i•“‘Œ‹‰‡†ƒ~|zwtl_[ZWURPNKIFDDB@><:98653210/.--€,+Ш�,cŽŒ‰‡†…ƒ}zxvtpf][ZWTSPMLIFDCB@><;98654311//€-€,�Ъ�*`†„€}{ywtrqmb][YVTROMKIGDCB@><;:87643210/€-€,�У�-…„�)Y}zxwtrqomh`[[YVSQOMKIGEDB@>=;:87643220..€-,,„�•šК�ЮюЎ„�'Uwusqpmlje^[ZWUSQOLKHGFDBA>=;987643220/.€-,,„�™ЯЧ”И�Я№цф­„�&Opoljhgb\ZYVTRPOLJHGFDBA?=;:986532210..€-,„�šЯЩШФ”Ж�Ю№цфууЋ„�"Lihec_[YWUSRPMLJHGECBA@=;;976543210€.--,„�šаЫЦУУС–Д� Юёцфусрс­„�#Eca]YXUTRPOMKJHGECBA?=;;986543210/..€-�„� ›бЬЦХТООН“В� ЯёццутпомнЊ„�!B\XVTSQOMLKIHGECB@?=;:976543210/..€-�„� ›гЭЩЦТРМЙЙК“А� аёчцууспм€к�Ї„�=UTQPNMKJIHFDCA@?=;:877643210/..€-�„� šгЮЪЦФСОЛЗГВЕЎ�аѓчццуспнмижежЊ„�8QOMLKIHGEDBA@><;:987643210/..€-�„�›дЯЪЧХТПМИЕАЌ­В‹Ќ�ЯѓшцфуспоккидввгЅ„�7MKJIGFDCB@?=<;:887543211//€.-„�œгЯЫЩЦТРНЙЖГЎЊЅЅЌŽЊ�бёшчцусронкижгаЮЬЯЁ„�3IHFECBA@>=;;:8765332210/..--„�›еаЬЩЦФСНКЗГАЋЇЂžЇŠЈ�бѓшчцфуспнлижгвЮЫЧХЪЂ„�2EDBA@?><;:98765332210/.-.-„�›гаЫЩЧУСОЛЗДАЌЈЃž›––ЃŠІ�бёщчцфуспмкйждвЯЬШУРРЦž„�.CA@>=<::9775443220//.€-�„�гЯЫЩХУСОЛЗДА­ЉЄЁ›™’žŠЄ�ЯёчццфуспмкиждвЮЬШХТПОЙРž„�-@><;:88765433210/..€-�„�вЯЫЩХФСОЛЗЕА­ЉЅ œ™”‹ˆ‡™ŠЂ�ЯёщццусспмкйждвЮЪЩХФПМИДБМ„�)<;988765433210/..€-�„�вЮЫЧЦФСНКЗЕА­ЉЅЁ˜•‹ˆƒ~•‡ �Я№чццутронкиздбЮЬШЧТПМЙДБЎЌЗž„�(98776543211//..€-�„�œвЬЩЧХУРНКЗДБ­ЉЅЁ™”‰„€|ww…ž�а№чффссппмкиждвЮЪЩХТСМИДБ­ЈЅЄЏš„� &865433210/..-�„�œаЫЦЦУТПМЙЗГА­ЉЅЁ™”‰„€|xtooŒ…œ�!Я№цуутсоммлиждаЮЪШХТПЛИДЏ­ЊЄЂžšЊ™„� %5432110//..€-�„�!›бЪХХУСОМЗЖДЏЌЈЄЁœ—”‹ˆ„€|xsokhg‡…š�#аяуутсоомкйиждаЮЬШХТПМЗДБ­ЊЄ œ˜”’Ѕ™„�#3210//€.€-�„�# ЯЧФТСПМКЗЕГЎЋЈЄ œ—”‹ˆƒ{wsojgdacƒ‡˜�%-зюусрппммкиждвЯЮЪЩХРОКЗВБЋЉЄ œš”Ž‚wŠ•„�!11//€.€-�„�%ЇЮЦУСРНЛИЕГА­ЉІЂž›—’Š…‚zvsokhb[SHCp„–�'-иьссппнмкиидввЮЬЩЧФРПКЗВАЋЇЄЂ›sfYSQ{™„�"//..-�„�'ЇЫУРПНЛЙЖДБЏЋЇЄЁ™•’މ…}yusnh^RH@<:8:n…”�)-жьрпоммкйижддаЮЫЩХТОЛИЖВЏЊЈЄ—‡vgb]YWSOI~•„� /.-�„�)ЅЩУОНЛЙЗЕГА­ЊЇЃ ›—”‹‰„}yupdVKDA@=<:846lˆ’�.зыном€к"иждваЮЬЩЧУРПКЗДЏЎЊЂ“€rjiif]ZUUOKEx‘„� .--,„�+ЅЧОМКЗЖЕДАЎЋЇЄЁ™–’ŽŠˆ„|xoaSKHDDA==;96424i„�-.еъмнмккзеждвЮЮЬШХТОНКЗГЏ­Ђ~vqmgif_\WQOJHGAs”„�,-„�-ЃХКИЗЕДГЏ­ЋЉЅЂžœ˜”‘‰…‚~yn_SMKIEDB@=<:8543.0i„Ž�.еш€к)иижжгбаЮЪЩЧУТПМЙДВЏЂ‚|wtojif_\ZSULJIA??n”„�„�/ЃТЗЕДГАЎ­ЋЈЇЃ œ™–’‹ˆƒ€|p`UROLJFDC@==;96531.-0h„Œ�-гш€и+ждгдаЮЮЪЩЩХТРНКЗДАЄ“†‚~zsqkgif]YUTOJHDA@=9k–‹�1ЃПГБАЎ­ЋЊЇЅЂ œš—”Œ‰…‚~scZUSQMKHEDA>=<:8542/..,/g„Š�.вц€ж-двваЮЬЬШЧХФРПОЗДВЊ—Іƒyvrmgif_\WSULKFDB==:4j’‰�3ЁМЏЎ­ЋЊЈЇЄЁž™—•‘ŽŠˆƒ€xg\YVTRMKIEDC@=<:8553//..-+-f†ˆ�5-бтгвваЯЮЬЬЫШЧХФТПЛЙЗДЌœŒ‡‚ytrojida^ZUSOJFDA==853,e’†�- ИЊЉЉЇЅЃЂ ›™–’‘ŽŠˆ„‚|n`\ZWTRNKIFDBA>=;86533/€.,,'*f„†�JЯрЯ€ЮЫЪЪЩЧЧФТРПМИЕДЏІ”‹‰‚€|wrolgd`]Z€UMHFB?:;90..(bŽU„�,šЖІЄЃЂЁ ›š—•’Ž‹‰…‚uf_]ZWTRNLJHECA>=;985431€.-+(('*c}…�2ПлЬЯЪЪШЧХЦУТРПНЛИЗДАЋž‘‹‰…€|wtokjif]\UTUMIDB=;8930€.)Rџ„�+m–Ѓž›™—•”’Šˆ…€zlb^]ZXTSOLJHFDB>=<:85441€.-,)€('(K†�0•ШЩЧХХТТРОНМКЗЖДБЎІ•‹‰…€}xtqkjif_\UQPJHD?>:7800€.+‡�)Hš—–”“‘‹Šˆ„|tgb_]ZWUSOLKHFDA>=<:95541.,))€($ˆ�3‹СТРППНЛКЗЖВБЎЌЊ”’‹‡‚€|xsrkjif`\UTOJHFA=>;8600..+"‰�(A‰”ŽŒ‹‰ˆ„‚}|xoeb_]YWUROMKIFDBA==;96543/€.-+)€($Š�-…ОЛКИЕЖВАЏЎЋЈЄ˜‘Œˆ†ƒ}ztrnkgif`\WSOMHFA@=>7900€.�‹�&@‹ˆˆ„‚€~|ywtkca_\YWTROLKIFEC@==<98543/€.-+))((#„��џ„�/‚ЗДГБАЎЋЊЉІ ”Š‰…}xvqnkjif`\WTOLKFD?@>88601-.!„�œІ„�/<z…€~|zywuqgba^\YVTRNLKJHEB@==;:86432/..-,))((%„�€џ„�-|БЎ­ЊЊІЄЂž’ŽŽ‹‡…€|xvrqkjdf`\WTOMJIDB@=783010.„�›ллЄ„�#:t|ywuspmea_]ZXVSRNLJJHEB@>=<:86532/€.�-€)(#ƒ�ƒџ„�+xЉЅЄЂ Ÿ™‹ˆ†ƒ€zytsongif_\WUUOJIDA?=;85010+"„�мзгзЃ„�+6kuqomhc_\\ZWUSQMLJIFEC@>=<:96443//.--,))*#„�„џ„�)lЁœ™”ŠŠ‡…}zvsqokgif_\WUQOJIFD?=:8<600+"„�нигвЯгЃ„�4fkhfa^\ZXUTSOMLJIFEC@>=<;855431€.-,€)$„�†џ„�'g™–‘ŒŠˆ†‚|xwtqnkid`]\ZSQOMHFDB=:88530-!„� ойегЯЭЫб „�0_f_\ZXVTSROMLJIFDB@€=:965432/€.-+))#„�ˆџ„�%b“‰‰†‚‚}}vstqmjifa]\WSQOMKFD?=::8<6.-!„� окегбЯЫШЧЭ„�0X\YWUTROMMKJIFDB@==<:965532/€.-,))%„�Šџ„�#Wˆƒ|xvsrrnjid``\WQUOMKFAB==:756--!„� žолждбЮЬЩЦУТШœ„�,RUTRQNMLKIHECB@>=;:865531/€.-,)(%„�Œџ„�!Q€}zvvtqmjjifa]YUSUOMJFA?==:75600 „�žокзеввЭЪЧФСОЛТ—„�*MROMLKJHFDC@>==;:965431.-,+)%„�Žџ„�H{vrsnnjida`\ZUSUOJHFD?==;7896-!„�žплзевбЮЫЧХТРЛЗЕН•„� (INLKIHEDB@€=;:865431‚.,,)%„�џ„�Bwpmkidba^\WUSULJFDD?@=:;993-!„�ŸплзжвбЮЫШЦУРМЙДБ­И“„�&FJHEDBA>==<;9865431/€.-+,)#„�’џ„�Dlgifa]]ZWUUOMHIDD?@>;86030!„�ŸплзегвЯЫЩЦФСНЙДВЌЉІБ„�$AFCB@>==<:8654431/€.-+))%„�”џ„�:lca]\WUTULJHFFD?@=;;9031!„�окижгбЮЬЩЦТПНЙЕВЎЉЄЂŸЊŽ„�$?B>==;::8654431/..--+))%„�–џ„�3b[ZUTUOLJIFDD?==;89130!„� олзжгбЮЬЩЦФРНЙЕДЎЊІЃš–Ѕ‹„� "<><;:98654431€.--+))%„�˜џ„�3YSQUOLJIFDA@=>78<400!„� оижгвбЯЫЩЦУРНКЕДЎЊЅЂž›—‘Ÿ‰„� "9;98655432/€.--+)*%„�šџ„�*UOOMKIFD?==:855300!„� оижгвЯЮЫШЦУРНКЕДЎЊЇЂŸ›–’ŽŠ‡™ˆ„�"68654431.--,))%„�‹џ��џ„�,OKHFBA?=::786030!„�žмидгбЮЭЪШХУРНКЕДЎЊІЂ›–‘މ…€~‘…„�35421/.--€)%„�žџ„�!GEA?==:7889100"„�!žлжввЯЮЫЩЧЦТПНЙЕДЎЉІЂš•‘މ„€}yt‹„„�321.--,+))%„� џ„� B>>::78<6€0�!„�#ЅкдбЯЮЫЪЦХУРОЛИДВЌЈЅЁžš•‘‡…€~yurn„�,/€.--,€)%„�Žџ��џ„�<<;8893€0�!„�&ЊлвЯЮЬЪШЦУТРНКЖДЏЌЉЄЁ˜”Œ‡ƒ€}ypi\PFc{ ƒ�,/.--,€)%„�џ�џ�‘џ„�9989€0-!„�(ЈиЯЭЫЪШЧХУРОЛИЕВЎЌЇЃ ›™”‹……€viZPICB@<_xƒ�-.-+€)%„�џ�’џ„� 64€0.!„�*ЊжЭЫЪШЦФТСПНЙЗДБЋЉЄЁœš™“‹…~q`TNLIFCB?>7]x ƒ�**))(%„�џ€�“џ„� 0/0+!„�,ЊдЫЪЧЦФУСПМКИЕДЏЋЇЄ ›™•‘‰}m^UQPMLIDC@><84Zwƒ�()($„�џ�”џ„� -0!„�.ЇгШЦФФУСПМКЙЗГБ­ЉІЂŸ›˜“Š}l_ZVTQNLIFCB?<;871Yuƒ�'%„�џ‚�•џ„� „�0ЇЯФФТРРОМКИЗГВЎЌЇЄ ™—’~mc^]YUUPMJHEB?>;9674/Uu ƒ� „�џƒ�–џ‹�2ЇЭУПРННЛКЗДДБЎЋЉІЁŸ›™•rfca]ZURPOLIFC@><;77320,Tt Š�џƒ�–џŠ�4ЂЬОНМКЙЗЕДДЏЏЋЉЇЂ ˜”’ˆujifb^ZVTQOMKHCB><:877420.)Rt ˆ�џ…�“џ�џ‰�7 ЂЧКЗИЗЕДДБЏ­ЊЉЅЂŸš—“}plifb`\XSQNMJHDB?><977300/-*&Pu"†�џ†�џ�џŒ� УЖ€Д1БЏЎ­ЊЉЇЅЂŸš™”…unlifc`\YSRPOLHED@?<967320/-**)&Nn…�џ†�Œџ’�7` БЎ­ЌЌЉЇІЃЃ Ÿ›™™”‘Œ}rpkifb`[XURQNLIFCB?<967420/+,**)) †�Œџ�џџ†�‰џ–�4™ЉЉІЅЃЁŸ›š™”’…wppliic`]YURQPLIFC@><9772200-+,**)#‰�‹џ‰�џ�џ�2’Ђ Ÿžœš˜•“ŽŒ‡~tpnlifb`\YURPOLIFC@>;;673220/,,*(+#‹�‰џБ�0‹›™™”“‘Œ‰‡ƒyrpliica]ZWTRPOLHGCB?<;87442//+,,*)#�†џ�џЉ�€џƒ�.ƒ“‹‡…ƒ€xpnlliba][WTRQNJIGC@?<;877420/-+,*-#…�џџ„�ˆџЈ�‚џƒ�'|‹‰…ƒƒ€{spmkifb`]YWTTQMJKFC@?>;877320//€,)%…�џ„�…џЉ�ƒџ„�*u‚€~{ypmlliea`\XUTRQMLIFCB?>;867740//-+*+#…�ƒџ…�џЊ�†џƒ�nzwtnliifb_^ZXWTRPMLIFCB@>;9€7200//,*+#…�…џ…�€џЉ�ˆџƒ� gsmkifc`^]ZXUTRPLKIFCB?><9€7400//-**%…�‡џВ�‰џ„�$ ^ifcb`]ZYVURQNMKIFC@?>;:877220//-,+%…�ˆџБ�‹џ„�# Wb`^\YXVTRQMLKIDC@?><;873420/--,+%„�ŠџЏ�џ„� U]ZXWUTQPMLIFEB@?><;8732200/-++%…�Œџ­�џ„�NZUTRPMLKHFCC@?>;9€74220//-+%…�‹џ�џЌ�‘џ„� KSQNLJKHDCB@><;8€7420//+-,$…�Œџ­�”џƒ�FLJKHFECB?><;87734200.,,+%„�‹џ�џЌ�•џ„�AJHEC@?><:97763420//+,+%„�Œџ­�—џ„� =DB@?><<;6€7 220/-+,+%„�џЌ�™џ„�9@><<;9€7 4200/-+,+%„�Œџ­�›џ„� 6>;98773220€/-,+%„�Œџ­�џ„�4977442200./,,+&„�џЌ�Ÿџ„�3542200//-,*,&„�џЌ�Ёџ„�-220€/-,,+%„�ŽџЋ�Ѓџ„� +10/--+,+%„�џЌ�Ѕџ„� )/-+**)%„�ŽџЋ�Їџ„�),,*)%„�џЋ�Јџ…�%+-%„�Žџ�џЊ�Њџ…�"%„�ŽџЌ�Ќџ„�„�џЋ�Ўџ‹�Žџ�џЊ�ЏџŠ�џЎ�Їџ�џ�ŽџГ�Ёџ‘�џџ�џ�Ѕ�t8mk��@�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ye�����������������������������������������������������������������������������������������������������������������������������Uќџe���������������������������������������������������������������������������������������������������������������������������Vњџџџf�������������������������������������������������������������������������������������������������������������������������Vњџџџџџf�����������������������������������������������������������������������������������������������������������������������Uњџџџџџџџe���������������������������������������������������������������������������������������������������������������������Vњџџџџџџџџџe�������������������������������������������������������������������������������������������������������������������Vњџџџџџџџџџџџe�����������������������������������������������������������������������������������������������������������������Vњџџџџџџџџџџџџџe���������������������������������������������������������������������������������������������������������������Uњџџџџџџџџџџџџџџџe�������������������������������������������������������������������������������������������������������������Vњџџџџџџџџџџџџџџџџџe�����������������������������������������������������������������������������������������������������������Wњџџџџџџџџџџџџџџџџџџџf���������������������������������������������������������������������������������������������������������Uњџџџџџџџџџџџџџџџџџџџџџe�������������������������������������������������������������������������������������������������������Uњџџџџџџџџџџџџџџџџџџџџџџџe�����������������������������������������������������������������������������������������������������Vњџџџџџџџџџџџџџџџџџџџџџџџџџe���������������������������������������������������������������������������������������������������Vњџџџџџџџџџџџџџџџџџџџџџџџџџџџe�������������������������������������������������������������������������������������������������Uњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�����������������������������������������������������������������������������������������������Vњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf���������������������������������������������������������������������������������������������^њџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf�������������������������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�����������������������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe���������������������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�������������������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�����������������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe���������������������������������������������������������������������������������fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf�������������������������������������������������������������������������������fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf�����������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe���������������������������������������������������������������������������eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџe�������������������������������������������������������������������������hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџh������������������������������������������������������������������������~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџx�����������������������������������������������������������������������šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”����������������������������������������������������������������������0œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–0�����������������������������������������������������������������������0œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0������������������������������������������������������������������"E���1œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Ÿ[�������������������������������������������������������������’ЗO���0œџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���ЅічV�����������������������������������������������������������‘баДN���0šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—/���Ѕѕ№ђцV���������������������������������������������������������“гЮЫЬЏL���0šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Ѕѕё№яёфU�������������������������������������������������������”даЭЪЧЧЋK���0šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—/���Ііђё№яюяуU�����������������������������������������������������•ебЭЫШХТТЇK���0™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ–/���Їіђё№№ююээтU���������������������������������������������������•жбЮЬЩЦУРНМЂI���0šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0��� Їіђёё№яюэьыьрU�������������������������������������������������•жвЯЬЪЧФСОЛИЗH���1™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Ііђђё№яюэььыщъоT�����������������������������������������������–жгаЭЫШХТПМЙЖГБ˜G���0™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Іїђђё№№яюэьыъщшшмT���������������������������������������������–згаЭЫЩЦУПНКЗДБЌЋ’G���0™џџџџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Їіђђё№яяюэььъъщшчцлS�������������������������������������������–згаЭЫЩЦУРНКЗДА­ЉІЄE���0˜џџџџџџџџџџџџџџџџџџџџџџџџџџ—0���Їїђђё№№яюэььыъщшчцхфйS�����������������������������������������–зваЭЫЩЦУСОКЗДБ­ЊЇЄ žˆE���0˜џџџџџџџџџџџџџџџџџџџџџџџџ—0���Їїђђёё№яюэььыъщшччцхутзS���������������������������������������—жваЭЫЩЦУСОЛИДБЎЊЇЄ ™—ƒE���/—џџџџџџџџџџџџџџџџџџџџџџ–0���ЇїђђёёяяюэььыъщшшчцффусржS�������������������������������������—ебЯЭЫЩЦУСОКИЕБЎЋЇЄ š—“‘~D���0™џџџџџџџџџџџџџџџџџџџџ—0��� Їіђёё№яяюэььыъщшчцххфтссподS�����������������������������������—еаЮЬЫШЦУРОЛЗДВЎЋЈЄЁš—”Ž‹yB���0˜џџџџџџџџџџџџџџџџџџ—0��� Ііђё№№яяюэььыъщшчццхфтссрпомвR���������������������������������•дЯЭЫЪШХТРНКЗДБЎЋЇЄЁš—”‘‹ˆ„tB���1˜џџџџџџџџџџџџџџџџ—0���Ііђё№№яююэььыъщшчццхфтсррпонмлбR�������������������������������•бЭЬЪШЦФТПМКЗДБЎЋЇЄЁš—“‘Š‡„‚oA���0—џџџџџџџџџџџџџџ—0���Їѕёё№яяюээьыыъщшчцххфтсррпонммкйЯR�����������������������������”аЬЪШЦХТРОМЙЖГА­ЊЇЄ š–“Š‡„‚|zlA���0—џџџџџџџџџџџџ—0���Їѕё№№яююэььыыъщшчцххфтссрпонммлкйиЮQ���������������������������"™ЮЫЩЧХТСОМКЗЕВАЌЉІЃ ™–“‰‡„‚|xsk\?���0˜џџџџџџџџџџ—0���ЉѕяяяююэьььыъщщшчцххфтссрпонммлкйздбЩQ�������������������������"™ЭШЦХУСПНЛИЖГАЎЋЈЅЂŸœ˜•’Œ‰‡„€zrjda_[W?���0–џџџџџџџџ–0���ЉєяяююээььыъщщшчццхфутссппонмлйждггваЮШR�����������������������"˜ЪЦФУСПОМКЗЕВЏЌЉІЄЁž›˜”’Ž‹ˆ…~ulgeba`_]ZU?���/—џџџџџџ—0���ЉєюююээььыъъщщшчцххфтссрпоомкзедгггвббаЮШK���������������������!–ЧФТСПНЛКИЖГБЎЋЈЅЃ œ™–“‘Ž‹„{qkgffdb`_]][XU?���0—џџџџ—0���ЈѓээээььыыъъщшчццхфутсррпомйзддддгггбббааЭУG�������������������!”ХСПОНЛКИЕГБЏЌЊЇЄЁŸ›˜•’Œ„yqljigfdca`^]\[YVR>���0–џџ—0���ЈђэььььыыъщщшшчцххфутсррпнйзжедддгггвбббааЯЭУG�����������������!’ТОНЛКЙЗЕДВЏ­ЋЈЅЃŸš—”’„zqomkigfdca`_]]\ZYXUQ>���0™™0���ЈёьььыыыъщщшшччцхффтссрпмйзжжждддггггббббаааЯЭУG���������������"‘ОКЙИЗЖЕВБЏ­ЋЈІЄЁž›™•“‡{tqonljhgfdba`^]\[ZYWWUQ=���11���Ї№ыыыыъъщщшшччцххфутсррнкзззжжедддгггвбббаааааЮЭТG�������������!ŽЛЗЖЕДГБАЎЌЊЈІЄЁŸœ™–”’Š~vtrpolkigfdca`_]][ZZXWWWSO=������ЇяъыъъщщшшшчццххфутссролииззжжедддгггвббббаааааЯЮЬТF�����������"ŒЖДГВБАЎ­ЋЉЈЅЃЁŸœš—•“Ž‚yvuspomkigfeca`_\]\ZZYWWVVTQN=��������ЇющщщщшшчччццххфутссрпмйииззжжедддггггвббаааааааЯЯЮЬТG���������ŒВАЏЎ­ЌЋЉЈІЄЂ žœš˜–“‘‡}ywusqomkiggfdb``]]\[ZXXWVUTSSQN;������ЂючшшшчччццхххфутссрролйииззжжеддддгггвбббааааааЯЯЯЯЮЫХ;��������˜АЊЉЉЈІЅЃЃЁŸœš˜•“’Œ{ywusqomkihgfdba`^]\ZZXWVVUUTRRSP%������mчщчццццхххффутссррпмккииззжжеддддгггвбббаааааааЯЯЯЯЯгЉ"���������)•ЊЅЄЃЁŸŸœš˜–”“‘‡~zywusqpnkjhgfdca`^\\[YXVWWVTTSRSR. ������{цшхххфффутссрррполкйиизззжжддддгггвббббааааааЯЯЯЯЯдБ< ��������*ЄŸœ›š˜–”“ŽŠƒ|zywusqonlihgfdba_^]\[ZYWVVVUTTSSR- �������#|фцфууттсссрпппмкккииззжжжддддггггвбббааааааЯЯЯЯЯеБA���������(Šž˜—–”“’ŽŒ‹‡{zxvtrpnmkjhgfdba`_]\[ZYWWVWUTTSSS. �������#{уфсссрррппонлккйииззжжжддддггггвбббааааааЯЯЯЯЯеВ@����������'„—’‘Ž‹‰ˆ„}zyxusrpnljjhgfdba`^]][ZZXWVVVUTSTS. ��� Œ���"{стрррппоннлккйииззжжжддддггггвббббаааааЯЯЯЯЯеВ@����������%}’Œ‹Šˆ‡…|zxwusqonlkjhgfdba`^]\\ZZXWWWVTTSTS. ���� Šоп���"{рспоонмллкйиииззжжеддддггггвббббаааааЯЯЯЯЯдВA���������"wŒ‡…„ƒ~zywvtrqpmkjihgfdca`_]]\ZYYXWVVVTSTS- ���ŠпсрлŒ���"zооммллкййиззззжжеддддггггвбббааааааЯЯЯЯЯдВ@����������!s†€}yxvusrpnnljihgfdca`_^]\ZZZXWWVUUTTS- ��� ‹ртронй‹���#zмнлккйиизззжжжедддддгггвббббааааааЯЯЯЯеБA���������� n{xvttsponmkjjhfedba`_^]\[ZYXWWVVVTTT. ��� ‹суспомле‰���#zлмйииззззжжжеддддгггггббббаааааааЯЯЯеВ@����������hzutsqpnnlkjigfdcba`_^]\[ZYXWWWVUUST. ���� ‹сфтромлйзвˆ���#yйкизззжжжжеддддггггвбббббааааааЯЯЯеВA����������cvrponllkihgfedba`^]]\[ZYXWWWWVUTT. ���� ŒтфтрпнлкиздЮ†���#yийзжжжжжеддддггггвбббббааааааЯЯЯдВA����������arnnlkjiggfdcba`_]]\\ZYXWWWWVUTT/ ���� ŒтхтспнмкйзжгбЫ…���#yиижжжддддддггггвббббаааааааЯЯЯеВA����������]pkjjhgfecba``_]]\[ZYXWWVWVUUT. ���� ŒтхутромлйиждвЯЭЧƒ���#yззедддддгггггбббббааааааааЯЯеВ@����������Zmihfeecaa``_]]\ZZZXWWWVUUTT. ���� ухусромлйиздваЮЫЩТ‚���#xеедддгггггвббббааааааааЯЯЯеВ@����������Wjfdcbb```]]\[ZZZXWVVVUTTT. ���� ухусромлкиждваЮЫЪЧФО���#xежггггггвббббааааааааЯЯЯеВA����������Ugcba`_^]]\[ZZYXWWVVUTUS. ���� ухтсронлкизеваЮЫЪШЦУРЛ���#xедгггвбббббаааааааЯаЯЯеВ@����������Sd``^]]]\ZZZYXWWVVUSUT. ���� ŒтфтсронлкижегаЮЬЪШЦУТРМЖ~���#xдевббббббаааааааЯЯЯЯеВA����������Pb^]]]\ZZZYWWVWVUSTT. ���� ŒсфтспомлкизеваЮЬЪЩЧФСРНМЙГ|���#xдгбббббаааааааЯЯЯЯдВ@����������N`]\[ZZYXWWWVVVTTT. ��� ŒсусрпнмлйиждваЮЬЪШЦФТРОМКИЕЏ{���#xггбббаааааааЯЯЯЯеБ@�����������M^[ZXYXWWWWVUTUT. ���� ŒртрпонмлйиждваЮЬЪШЦФТРОМКИЖЕБЌz���#xгвааааааааЯЯЯЯеВA����������K\YXWWWWVVUSTT- ���ŒпспонмлкизждбаЮЬЪШЦУТРНМКИЗДГБ­Јy���$wвбаааааЯЯЯЯЯеВ@����������IZVWWWVUUTTT. ����оронмлкйижедбЯЭЫЪШХФСПНЛКИЖДВБАЎЋЄv���#xвваааЯЯЯЯЯеВ@�����������HYVVVUTTTT. ���‘оонмллйизждваЯЬЫЩЧХТСПНМЙЗЖДГБЎЊІЂœ—t���$wвбаЯЯЯЯЯеВ@������������GYVUTTTT. ����‘ннмлкйиижегбЯЭЫЪШЦФТСОНЛЙЗЖДАЋІЂŸžž™•t���$wббЯЯЯЯеБA��������������FWTTTS. ���ммлкйиззждвбЮЭЫЪЧЦФТРОМЛЙЗДЏЉЃЂЁ Ÿžžœ›˜”t���#wббЯЯдВ@�������������DVTS. ���ккййизжедгбЯЮЬЪЩЧХУСПНЛКИГЌЇЄЃЂЁЁŸŸž››š—“s���#xбадБ@��������������DU. ���ииизжжедгбаЮЭЫЩШЦФТСПНЛИГЌЈІЅЃЂЂ ŸŸžžœ››š™•’s���$wдВA���������������( ����ззжжедгваЯЮЭЫЪШЧХУСПНМКД­ЉЇІІЄЂЂЂ Ÿžž›››š™˜•’s���%kE���������������� ���ŽееедгвбаЯЮЬЫЪЩЧХФТРОМКЕЎЋЉЈІІЄЃЂЁЁŸŸžœ›››™™˜˜”‘r��� ��������������������вггвбаЯЮЭЬЫЩЩЧЦФУСПОМЗАЌЊЉЉЇІЅЃЂЁЁŸŸžœ›œš™™˜˜—˜”r�����������������������������ŒЯааЯЮЮЭЬЫЪЩШЧХФУСРННКГ­ЋЋЊЉЇІЅЄЃЂЁ ŸŸžœ›››™™™˜˜——–’Žq����������������������������������fвЭЭЬЬЫЫЪЩЩЧЦХФУСРОНМЖА­ЌЋЊЉЇІЅЄЃЂЁ Ÿžœœ›š™™————–••’’S�������������������������������������� вЫЩЩШЧЧЦЦХУТСПОНМЙГЎ­­ЋЊЉЇЇЅЄЃЂЂ  Ÿžœœ›š™˜˜———–•–•™v������������������������������������������ * ЮЧЦХФФУТСРОНМЛКЖБЎ­ЌЋЊЉЇЇІЄЃЂЂ ŸŸžœ››™™˜˜————–••šz' ���������������������������������������������������� *ЪУТСРРПНМЛКЙИГЏЎ­ЌЊЉЉЇІЅЄЃЂЁ ŸŸžœ››š™™™˜˜—––––šz(������������������������������������������������������������� *šЦПОНМЛЛЙИЗЖВЎ­ЌЋЊЉЈІІЄЃЃЂЁ Ÿžžœ››š™˜˜™———––•šz(��������������������������������������������������������������*—ТМЛКИИЗЖДАЎ­ЌЊЊЉЈЇЅЄЃЃЂЂ Ÿžžœ››š™™˜˜˜———––™z(�����������������������������������������������������������)”ОИЗЖЕДВЏ­ЌЋЊЊЉЇІЅЄЃЃЂЂ ŸŸžœ››š™™™˜˜——–––šy(�������������������������������������������������������������*’ЛДГГБЎЌЌЊЊЉЈЇІЅЄЃЃЂЁ ŸŸžžœœ›šš™™˜˜————–šz(��������������������������������������������������������������)ЗБЏ­ЌЋЊЊЉЈЇІЅЄЃЃЂЁЁŸŸžž›››™™™˜˜———––šz'�������������������������������������������������������������)ГЌЋЊЊЉЉЇІІЅЄЃЃЂЁŸŸŸžžœœ››™™™˜˜˜———–›z(���������������������������������������������������������������)ŠАЊЉЈЇЇІЅЅЄЃЂЂЁŸŸŸžœ››œš™™™˜˜———–šz(��������������������������������������������������������������)‰ЎЇЇІЅЅЅЃЃЂЂЁŸŸŸžœ›››š™™˜˜˜—˜—–šz(������������������������������������������������������������)‡ЋІЅЄЄЃЂЂЁ ŸŸžžœœ››š™™˜˜˜————šz(����������������������������������������������������������(†ЊЄЃЃЂЂ ŸŸŸžžœœ›š™™™˜˜˜———–šz'����������������������������������������������������������(„ЇЃЂЁ ŸŸŸžœœ›š™™™˜˜˜————š}(���������������������������������������������������������(ƒІ ŸŸŸžžœ›››š™™™˜˜˜—˜––š€+����������������������������������������������������������(ЄŸžžœœ›œ›™™š™˜˜˜———–š€,����������������������������������������������������������(Ѓžœ››››š™™™˜˜˜———–š€,���������������������������������������������������������(€Ёœ››››™™™˜˜˜————–š€,����������������������������������������������������������(~ ››š™™™˜˜—————–š€,����������������������������������������������������������(~Ÿ™™˜˜˜˜˜—˜—––š-���������������������������������������������������������(}˜˜˜˜————–—š,���������������������������������������������������������(|˜—————––š€,��������������������������������������������������������(|œ——˜——–š€,���������������������������������������������������������'{œ———–š€,��������������������������������������������������������({›––š€,��������������������������������������������������������(zš™€,��������������������������������������������������������'|,���������������������������������������������������������),�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_freebsd.icns��������������������������������������������������������������������0000664�0001750�0001750�00000123763�10443061320�016220� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��Їѓit32��gу����џ�џ�Ў���U�€3€€3����у� UЊf��к_�3��щА€mзФ\L8�кHЊfПU�л�™U�f*зˆ™UBB5€?5M…™*KˆьЙŸ�™Њв�)�™H8\ЊfЩm?�зЎ—‚m^IBSSIdsŒЌНя Gyф-™”?€��UЮ�1?Uп™œюИa5ѕПНšp\A8#�єэппуэї +@DZy™ПиŠЮZ6.пПЊЩ�53�Њ(ѕЏurM<)�№ытлбЭХМОЕВЕОСЧЮзлцю� 5IgˆИ*Ѓ�ЯщH3ПUЋ� :w“œЄЌАŸ~c+‰�<U$U�ЃєЊ{A)ѓчйаЬТЙДЏЌЉЄЊВВЏЏАВЖЗЊ­АДИСШЯзцј%QˆА)“$п”ППЊŠ� ^­ЎЄœ”„FŽ�]„ŸЎМЦажикжСt†� Ѕ?Ÿ№ѓФoF%�уеЭОЛЖВЎЉЄЋЪеушэюяяюёђэюцсеТЇЌВКСЪнђ-dІHБ��oˆџL‡�LМдмкеЬТЖЈœŽ†o Œ�5‘ƒ‘ŸЌКЩйтчыюёіьЎ‚� -UШ$UH/ ъдСГЉЉЅЁЃЅЦу№€јљњ§€ќ§€ќњјјљјѕэдД­АЗФафD…Зиу ™<‚�‰цїєюъфпжЪИЂ–‹‰IŒ�,{™†Š—ЄВПгуьёєіћўџіж‹�� -ZŠЖЮиЫШАЃ›•’œНеыіћќ‚§‰ў€§/ќќћћњїђхжТАЕХачю­s? � mЧюџџ§јєёьцкХА’ˆŽŒ�•ž‰„‘žЌИЩмъѓїљћў€џју &DhŠЂЎЊ —ŽЇгщђјќ§§ўŽџ/ўў§§ќќћњіђыгЇВЛШвйЬЏƒZ6 lиѓћџџўќљїєяхгНЋ›†‚”ЅŒ�ЅЄŽ€Š—ЅБПатёњќќў‚џќчŽ:'=Ysƒ‹–Џлєїќ€§ўў•џўў§€ќћїѕ№йКЋЋЊžŠlL1.cгљќџў§ћљѕьоШДЈ™ƒ…šЊŒ�­Њ•…‘ŸЋИФдчѕ§ўў„џљцžNOeq|”Нсєќ§§ўў‘џ�ќњћћќ§€ў€§ќћњјђкГ‘†w]N‰ді„џўў§њёуаОБЅ”Ё‹ ЏŒ�ЁА›„ƒ™ЅВОЪкщѕ§‡џ ій_lІрѓќ§§ўў’џ�ќ€і€їјјљљњћќўџў§ќћњѕьЮ‰ntЮёˆџ ќєшжЧЛЎŸ‘‡€‘ІГŒ�–ЗЂŠ‰”žЋИУЯмщѕћў†џќѕСЯђњ§§ў•џќѕєѕѕ€і€ї€ј љњћ§ў§ќћљєхШёћ‡џўќєъмЮФИІ™„ƒ˜­АŒ�sКЉ†‘šІВНЪдпьѕћў…џўњњћ§§ў˜џћѕ€єѕ€і‚їјњ€ќћќўˆџўћіьтзЬСЏŸ•ЁˆŸЕЅŒ�_ЛА—„ƒŽ—Ђ­ЗФЯйхюї§„џ§јњќ§ў—џўћѕђђѓ€є щЯФФХдтєљ§ў‰џў§ї№чодЩИІœ’‡ŽЈОwŒ�2ЙЙ ‹Š“ЈВОЩгпшёњўџўњјќ§ўў“џ‡ў§їђёђђ€ѓ иАЌЎЎЏБДЧі‹џ§љѓэукаН­Ђ—Žƒƒ—ЖПNŒ�БРЇ’†šЄ­ЙУЮкфэіќ€џ§јљ§§ў“џŠў§љђ№№ёёыЕЉЊЌ­ЎДЯё‹џўќїёързХВЉž”Ё‰ЃСЙ-�‡ШАš†‚‹– ЉЕОЩжпъѓњџџ§їњ§§ў‚џ�ўџў ћђя№№йЋЇЈЊЌЕфњŒџ§њєюцмЫЙЎЅš†”ВШЇ�$ЫПЄŽ€‡‘›ЅЏКУЯкфяї§ћіќ§‚ўџџ€ў…џў‚§ ћєююЭЈІЈЊСяŽџќјёърЭОДЉ •‹‚ˆЅУЩq�ЊЭА—ƒƒ—ЁЌЖРЬжрыѓіїќ§‰ўƒџ…ў§ ќѕэЭЈІЇЕэўџўњѕяфвТЙАЅœ’‡€–ЕЬО�>аРЁ‰‰“ЈВМШвмчюї§§‚ў§‚ў€џў§„ў‹§ƒќћѕеЊЇЇаўџўќјђцдШОДЋ —ƒ‡ЉЦЮŠ�УаВ“‚„Ž˜ЄЎИХЯйчѕ§§‚ўƒ§‚ўџў§§„ў„§‹ќћъВЉЇнŽџ§њєщзЭУЙАІœ“ˆ„—ЛвЩ‘�”дТŸ‰‚‹• ЋЕТЬоѓћўўџџўў…§‚ў€§ƒў�§‰ќ…ћњњљЮФТцџўќїънбШПДЋЁ—Ž…ŒЈЪдЊ’�@ЮбВ•ƒ‡œЈГРгюћ§ў€џў§ќ€§…ў€ќ�§ƒў�§„ќ†ћњњ‚ћчгжыџ§їыпжЫТЙЎЅœ’‰†ЛзЯf“�ЈйХЅ‹„šЅАЧъљќў€џў§ќƒ§‚ў�§ќƒ§ќŠћ„ќѕмлчў‹џ§јятйаЦНГЉЁ—Œ…‘АЫиЙ“� -жеИ–†Š—ЂГфїњў€џ�ў‰§ў§§€ќƒ§ќќƒћњ�ћ‡ќћњїшпцњŠџўњёчндЫСЗЏЅœ’‡‰ЃТй⇕� ІнЭЋ‰”Ѕзїљ§€џ�ў€ќƒ§€ў�§ƒќƒ§�ќ‚ћ€њћћ„ќћљјїїђчшє‰џўћѓържЭХКБЉŸ•Šˆ™ЙднН•� CжлПŸ”Р№јћџ§ќќ€§…ўќћћќ‚§€ћњћћ‚ќƒћљјїі€ѕюэђ§ˆџќіюукбЧПЕЌЃ˜ˆ‘ЊЪпгd“� ЏпбГšЊщіљў€џ§ќ§…ў§§ќћћќ§ћћ€њ�ћ‚ќ‚ћ€њ�ї€ѕєёъсъ‡џўј№цмдЫСЙЏІ‘‰ЁОйоП ’�  IгоЩГпііќ€џ�§€ќ€§…ў§§ќ€ћќ§§ќћњњћ‚ќƒћњњјѕѕєєѓђ№лИКє…џўљёщпжЭФЛГЉ •ŠŠ™Збфбq‘�  тйеѕѕј€џ�ў€ќ§ўўџўў§ќћќ§§ћњћћ€ќƒћ€њљїє€ѓђђ€ё№ящЫВЯћƒџўћєытйаЧОЕ­Ѓ™Ž‰‘ЊШпрЏ3 �0(#! 1Чцюєѕќџџўќ§§€ў‚џўў§ќ‚ћќќћ‚ќћ‚њјєѓђђ€ё�№€яюьъсПВм§‚џћѕэуквЩСЗЏІš‰ЁПкщЫa'+.956�C?2+**xфѕѓјўџџќћќќ§§€ўƒџ€ўќ„ћ‚ќћ€њ љљїѓёё№№яюю€эььъчхйБВчџќіюхлгЫТКБЈ’‹‹›ЕбчтЁ-/4:H_NŽ�EPR>70.ыєѓќџџ§њћќ€§ўў„џ€ўќƒћ�§ќ€ћњњљ6іё№яяююэььыыъъщчхупЩЌИѕџџ§јячоеЭХЛГЉž•Œ‰‘ЌЧръиЖB19CVp‘U�jhRB93\ні№іџџўћњћќ€§�ў„џ€ў�§ќ�ћќ§§€ќ€ћњњ€љ8јѕ№яюээьыъщщшччццфтрнжСІЗэќї№чожЬФКАЇŸ–މЃУльскЬ›9:DXmЏ?Œ�UmfK<79Вёђяћџџћљњћќ€§�ў„џ�ў€§„ќ§ќќ€ћ>њњљјјїєющшхутрпоноортутспнлжаК Ещ№щодЫСИАЇЁ˜‰‹›ЖдшщжкеН_8AMl†ЊŒ�U–UF63sкіюёўџ§јљњћќ§§ўўƒџўў€§ћћќћќќ‚§�ќ€ћ?њњљјієюупмйздваЮЭЫЪЩШШЪЯдййздЯШВАннбШСИБЉЁš’‰‡•ЎЩуяйЮжлЬ—5:H]…ПŒ�Q>7/6Ўэёэіџўјїљњћќќ§ўўƒџ�ў§€ћќќ§ў€§Dќќћћњјієђ№юслйздваЭЫЩЧХУСПОМЛЙИМФЪЪШТАšЃТШРЙБЊЂ™’Š†ŽЉХняоЛФЯлжР>1:FWoŒ�8/,*Iдіэюњџќіїљљћќќ§ўў‚џ�ў§ќњњћќ§€ў€§DћњјіѕєђёяцлйждвЯЭЫШЦФСРНМКИЗЕГБАБГЗНН­—™БКВЊЃ›“Œ…ŠžОжщъМЃНЩикЬ‚,39KPf‹�8/2&#‹щєы№§ўїѕіјљњќќ§€ўџџ€ў�§€ќћњњћќ§€ўG§ќћњјїѕєѓё№ъпкиеваЭЫШЦУСПНКИЖДГБЏ­ЌЊЇІІЉБЋ˜‘œЈЃœ”Œ……˜ДбхяЩ•—ЕСгнвЛ/+-77U‹�, Цїящєџћѓєіјљњќќ§€ў�џ€ўU§ќќћћњљњќ§§ўў§ќћњјїіѕєђёютлижгаЭЫШХУСПМКЗЕГБЏ­ЌЊЈІЄЁŸœš Є˜”“…‘ЏЩсчи™ŽЎНЪккФy$'*4D‹�fлљъщјџѕђѓѕїљњќ§§„ў ќћћњћјљћќ§€ќHћћњљјїѕєђё№шнкздвЯЬЩЧФСОМКИЕГБЏЌЊЉЇЄЂЁŸš—””—–‹…„‚~€’ЊПЮдЈy‰ЇКУенЩЄ#%-‹�Љэєцъ§ќ№№ђѕїљњќ§…ў�ћ€њQљїњћћњњћћњњљјїієѓђ№юрлиегаЭЫШХУРНЛИЖГАЎЌЊЈІЄЂŸžœš˜•“Œ‹…y|ŸЋЎuu{„žЖНЮлгЙU‹� 7Шїэфэџію№ёєїљћќ§ƒў§§љRїјљљјљљњњљљјїіѕєђё№шнкздвЯЬЪЧФТПНКЗЕВЏ­ЋЈІЄЂ œ™—–”‘‹ˆ…‡Š…}xspmllnsy‚™БЛШииТn"Š� gзњцуё§№эяёєіљќ§ў€џўў€§јїїјјїіі€їјј€їFіѕєѓђ№юткижгаЮЫШЦУСОЛЙЖГБЎЌЊЇЅЂ žœš˜•“’Š‡„€€„ˆ~uqnllnqw„“ЉЙУдкЩš‰� ”цњссїїыьэяєїћ§ўџ�ў€§�ќіѕєєѕѕƒіFѕєєѓё№ящнйздбЯЭЪШХТРНКИЕГА­ЋЈІЄЁŸœš˜–“’Œ‰†„€|y|…ƒzsnmos{ƒŒЁДОЮлаГŠ� Ж№ѓптћёшъьяѕљќ§ўџў§ќќљєєѓ€ђѓѓєIѕѕєєѓђђ№№юфкижгбЮЬЩЧФСПМКЗДВЏ­ЊЈЅЃ ž›™—•’ŽŒŠˆ…ƒ|yuu}€|vttx{€ˆ™ЌНЩйдР Š�� Щљьофљщчщьѓјњћ§џў§ќќћјђёя№№ёёђђ€ѓHєѓѓђђё№№яьпйздваЭЪШЦУРОМЙЗДБЎЌЊЇЄЂ š˜–”‘‹‰†„‚~{yuqov{wuuvy~„‘ЇМФйнУn �$еџхмшіпхщёіјљћ§џ§ќќћњі€эюяя№€ёђ6ёё№№яюэщкзегаЮЬЩЧФТПНКИЖГБЎЋЉІЄЁŸœš—•’ŽŒ‰‡…ƒ~zxtqmhnt€u w|ŠЃИСжчФ�jт§слыюнфэѓіїљћ§€џўќћћњљєыыььэюяя…№DяююэьфзегбЯЬЪШЦУСПМЙЗЕВЏ­ЊЈЅЃЁž›™–”’‹‰†„‚|zwtqmhehrttvz~…œЕРвъЬБ�"—ыљойыткц№ђѕїљњќ§ў§ќћњљјїѓщъъыььээ€ю€яFююээььынегвЯЭЫЩЦФТРНЛЙЖГБЏЌЉЇЅЂ ›™–“‘ŽŒŠˆ†ƒ€|ywtqlheaeosuw|‚‘ВСЯюжД-Ž�"Јіѕлзюййшяёѓіјњћћќћћљјїііёчшщъъыыьь„эCььыъщзгвЯЭЬЩЧХУРОМЙЗЕВАЎЋЉІЄЁŸœš˜•“ŽŒ‰‡…‚€~{yvspliebbdmsv{~‹БСЯѓнВ\�Дўѓйешжкъю№ђѕїјљ€њљїі€ѕђццчшщ€ъ†ы2ъъщхебаЮЬЪШХУСПНЛИЖГВЏЌЊЈЅЃ žœ™—”’‹ˆ†„‚€}zxvsolhe€c ekszx…ЎТЯјфДuŽ�Фџюежрглъьюёѓѕї€јїіѕєѓѓєѓфхццчшшщщ…ъ2щщшрбЮЭЫЩШЦФТПОЛЙЖДВА­ЋЉІЄЂŸ›˜–“‘ŒŠˆ…ƒ€~}zwuqoruje filq€ЌХањшЙŠŽ�NЧџьгжланшыьяёѓѕѕіѕєѓѓђђѓѓђ€фхццччшшƒщCшшчцлЯЭЫЩШЦФТРОМКЗЕГБЏЌЊЈЅЃЁžœ™—•’Ž‹‰‡„‚€~{zwuy…‘ƒifgghijmqЋЦдџэН“Ž�_аџыбдгЯпхщыэяё‚ђ ё№№ёёђђцтуффхх€цƒчCццххзЬЪЩЧЦФТРОМКИЖДВЏ­ЋЉІЄЂŸ›™–”‘‹ˆ†ƒ}{y~‘ŸЃ•mghiikkmps€ЌЧпџ№С–Ž�wаџъЯаЮЭрухчщыэюю‚я№№€ёчссту€фхх‚ц€хBфугЩШЦХУТПОМКИЖДВАЎЌЉЇЅЂ žœš—•“ŽŒ‰‡…‚€~‰œЊЊЉsiiklmnnosvƒЊЧыџѕЦ— �tбџщЭЫШЬсуфхцшщыьь€э юяя№ёёщпрсстт€уƒф€уAраЧХФУСРОМЛИЗДГБЎЌЊЈІЄЁŸ›™–”’‹ˆ†„‚ƒ“ЁЋЎЌЊЃ‚kikmopqrsvz…ЋЩѓџѕЦž�sнџщЫЧФЫртуфхцчшщъыыьэююя№№ыпп€рсс€т€утBснЬФУТРПНМКИЖЕГБЏ­ЋЉЇЄЂ žœ™—•“‘ŽŒŠ‡†‰—ЉЏАЏ­ЌЉpkjmprsuvwz}‰БЬ§џѕЦ�"pоџшЩУРШортуфхцчшщъъыьээюяяьрноппрр†сCррлШСРРОНЛЙИЖДГБЏ­ЋЉЇЅЃЁžœš˜–“‘‹ŠžБДГБАЎЌЋ umjloruwxz{~ЕйўџјХ›�pнџшШРЛЦлрстуфхцчшшщъыььэ€юсммнноо‡пBойЦПОНМКЙЗЖДВБЏ­ЋЉЇІЃЁŸ›™—•’ŽŒ“ЄАЖЕДВАЏ­ЌЉ‡nlknruwz|}€ƒ†•МчџџћХš� oгџюШОЗТжпрстуфхцчшшщъыььэююхллмм€н„о€нAеСНЛКЙИЖЕГВАЏ­ЋЉЇІЄЂ ž›™—•“‘‘•ЉЖИЗЖДГБАЎ­Њ˜tmkmqtx{}€‚…‡‹žФёџџіФ˜�oЬџ№ЧМГРбнпрртуфххччшщъъыьээъ€клл€мƒн€мAгОКЙИЗЖДГВАЎ­ЋЉЈЅЄЂ žœš˜–”’šЉИЛЙИЖЕДВАЏ­ЌЄnlkosvz}€ƒ†‰ŒЊајџџіФ™�pЩџѕЧЙ­МЬмнппстуфххччшщъыыььэни€й€кƒл€кAвМИЗЖДГВАЏЎЌЋЉЇІЄЂЁžœš˜—”–ЇЖММКЙЗЖДГБАЎ­Ћ—rmlmquy|€ƒ†‰Œ”ЖрўџџіУ“�_ТџћЧЗЈЙФзннппртууфхцччщщъыыьхзз€и‡й;иаЙЕДГВБАЎ­ЌЊЈЇЅЃЂ žœš™–˜ЅКОНМКЙЗЖЕГВАЏ­ЌЉ€nllnsw{‚†Š•›Шѕ€џєПŒŽ�!EЗџџЫЖЄЕОбммнппрттуфхцччшщъъыщкежжˆз;жЮЗГВБАЏ­ЌЊЉЈІЅЃЂ ž›™—žБППОМЛКИЖЕДГБАЎЌЋŸpmlmpuy}…ˆ”˜Јйў€џяЗ‰Ž�ЊџџдЕЃ­КХйммнопсстуфхцччшщщъър‚е…ж;ееЭДАЏЏ­ЌЋЊЉЇІЅЃЁ žœ›™˜ЇМРПОМЛКИЗЖДГВАЏ­ЌЊ‰nlkosw{ƒ‡Š“—›ЕёџьВ� žљџтГЂЃИКаклмнопрстуффхцчшшщъцигг‚д�еƒд9ЪВ­­ЌЋЊЉЇІЄЃЂ Ÿžœš™БРРПОМЛКЙЗЖДГВБЏ­ЌЊ xmkmquy}…Š‘•™Єг§џчЉq�•щџёВЁœЕИТжклмнопрстууфхццчшшщпƒв€г‚в8ШАЋЊЉЉЇІЅЄЃЁ žœš˜žИССПОНМЛЙИЗЕДГБАЎ­ЋЊ”qllosw{ƒˆŒ”˜œДэ‚џуЁX�!лџљЙЂ˜ЎЖЙЧзклмнопрсттуфххцччшшеаа‡б9аЧ­ЈЈЇІЅЄЃЂ Ÿžœ›™™ЅКТРПОНМЛЙИЗЕДГБАЎ­ЌЊЇˆmkmquy}…ŠŽ’–šЃе§џћжœ1�"\ХџќЦЄ•ЅДЖКЩиклмноппсстуффххцччрбЯЯ„а€Я7ХЊІЅЅЃЂЁ Ÿžœš™—ЅНСРПОНМЛЙИЖЕДГВАЏ­ЌЊЉЁ{llotx|€„ˆŒ”™Йї‚џіЩ—�""ЕћўиЅ’œБДЖКЫийлммоопррстуффхццхиЮЭ„Ю€Э6УЈЄЃЂЁ Ÿžœš™˜—ЇНСРПОНМЛЙИЗЕДГВБЏЎ­ЋЊЉœplnrvz~‚†ŠŽ’–›ЇтƒџёКА�!ЇьџшЎ“ЊВДЖЙЦдйклмноопрстууффхцув‡Ь7ЫСІЁ ŸŸ›š™˜——ЈОСППОМЛЛЙИЖЕЕГВБЏЎ­ЋЊЈЇ‘lmquy}€„‰Œ‘•™ЃвћƒџъЈd�"“мџіН“Œ АВДЖЗРЯикллмнопррстууфххпЭ…Ы7ЪЪПЄžžœ›š™˜—–”ЃНРПООМЛКЙИЗЕЕГВБЏЎ­ЋЊЉЇЇ†mptx|ƒ‡‹“—ЦіƒџќкЁ‘�"pЧќўЬ—‰•­АБДЕЗУжийклмноппрссттуффиЪ„Щ6ШШОЁœ››š™˜—–•” КРПОНМЛКЙИЗЕДГВБЏЎ­ЌЊЊЈЇІ|orvz~‚…ŠŽ‘•œЖ№„џјШ–’�#OЎєџъ ‡‡Ѕ­ЏБГЕТжзиикллмноппрссттутжШ…Ч5Мž™˜˜—––””“žЙПОНМЛЛЙИЗЖЕДГВБЏЎ­ЌЋЉЈЇІЅurvy}…ˆ‘” НщќўƒџяГ|’�!чџћАˆ…–Ћ­ЏАГФдежзййклмнноппр€стсб…Х6Кœ—––•”“’‘“ДОНММЛКЙИЗЖЕДГВБЏЎ­ЌЋЊЈЇІЅІtux|€„‡‹“ЁРсѕњќў‚џнЃU“�$|Щџџд‚‰ЃЋ­ЎБУгдежзиййллмнноппрсстпЯХ‚Ф8УЛž””“’’‘ІННМЛКЙЙЗЗЖДДВВБЏЎ­ЌЋЊЈЇІЅЇЁvx{‚†ŠŽ“ЅРп№єјњќў€џ§ШŽ2“�C њџєŸ“ЇЊЌЎТбгдджжзийкллмннооп€роаФУТ>Кœ’‘Ž™ЗМЛЛКЙИЗЖЕДДВБАЏЎЌЋЋЉЈЇІЅЇЉЂy{~‚…‰‘ Хкыяђѕјћ§ўџџ№Ў{“�ŒпџќУƒ~… ЈЊЌСабвгдежзиийкллм€ноопроЯСР=КŽŽŒŽЉЛККЙИЗЖЕЕДГВБАЏЎ­ЋЊЊЈЇІЅІЈЋЁ|~…ˆŒ“Взфщэ№ѓіњќ§ў§с–_•�fГњџш–|}ЅЇЊНЯЯавггеежзз€йLллммнноопнвУППОЛŒŒ‹Š‰–ЖЙЙИЗЖЕЕДГГБААЎ­ЌЋЊЉЈЇІЅІЈЋЎž„ˆ‹”žЪрушыюёѕљњќ§ѓФ‡ •�"—фџ§О|z~œЅЇЛЭЮЯабвгдеежзиийкллммнн€о@жХННМŸŠŠ‰‰ˆ‡ЅИИЗЖЖЕДГГВБАЏЎ­ЌЋЊЉЈЇІЅЇЉЋЎА ‚„‡‹“ІНЯртцщьюѓїљћњтЃd–�#qРќџя„xyŠЁЅЖЬЬЮЯЯабвгдеежззиййкклмм€н?йЩНЛЂ‰‡‡††ˆГЗЖЕЕДГГВБАЏЏ­­ЌЊЊЉЇЇІЅЇЉЋЎАВЃ…‡ŠŽ•ЏФШЫисхччшѓїјњєЧ—�0?‘юџџХyvz’ЁАЩЫЬЭЮЮаббвггеежззиййккллммнмгСЇˆ……„ƒ•€Е0ДГГВБАЏЏЎ­ЌЋЊЉЈЇЇЅЅЇЉЌЎБГЕЇ‰Š’ЅПЪЫЫЬЮаддиыѓіїїпЅo˜�B sПџџя•tt~›ЊУЩЪЫЬЭЮЯабввгддежжзииййккллммиС“ƒ‚ЂДДГГВБААЏЎ­ЌЋЋЊЉЈЇ€ІЈЊЌЎБГЕЗЎŽЕЪЭЭЮЮЯабвгм№ѓѕї№Ц‰A™�2шџ§Ч{rs†ЄОЧЩЩЫЬЭЭЮЯабввгдде€жзии€й=кклзМЄˆ€…ЉГВВБАЏЏЎ­­ЌЋЊЉЈЈЇІЅІЈЊЌЏБГЕЗКНЗЧЮЯааббвггеищ№ђєѓпЃq š�iЎїџљЄsqsЕЦЧЧЩЪЪЬЬЮЯЯаббвггде€ж+ззииййккЦТОЈŸВБААЏЏЎ­­ЌЋЊЉЉЈЇІІЅЇЉЋ­ЏВДЗПЩйс€в€гддежжифяёђѓцР‚$›�/‡йўўс~trzЃУХЦЧШЩЪЫЬЭЭЮЯа€бггддеежж€зииШПРСШаХМВ­­ЌЋЋЊЉЉЈЇЇ€ІЈЊЌЎАГЙЦднхчфедд€е жжзийрюёђѓюв™\œ�$]™їўћБ{vt‚ЛФХХЦЧШЩЪЫЬЭЭЮЮааббвггддее€жзЬНОПЭкйздЬСИЏЎЌЋЉЈЈЇЇЉЌЎБЖСЬлтцщшизи ййклнэёђѓђпЎ{�-nПќ§ъœ{xw“НФФХХЧЧШЩЪЫЫЬЭЮЮЯаабввггддеежаЛЛОЭи€й€кйдЭЫХУУФХЫбзнхцшщ„ъ�л€кллммноъђђѓѓшЦ‡HŸ� 8„к§љЭ‹{z|žО€УХЦЧЧШЩЪЫ€ЬЭЮЯЯабб€в гддбЛКНЮжзз€и€йкклмопрстухцчшщъы‚ь�о€мнноопшёѓѓєяиe  �+X•шћѕК…~}ЂРТУУФХХЦЧШЩЪЫЫЬЬЭЮЮЯЯаббввгбНЗЛЭе€жззииййкммопртуфхцчщщыььэ�т€п€р счёѓєѕємЊw Ё� eЅїњьІ‡„ІП€Т5УФФЦЦЧШЩЩЪЫЬЬЭЭЮЮЯааббаРЕЙЭддеежжззиклмнпрстуфцчшщъыьэю�х‚т учђѓєѕѕчК?Ѓ� .pТћљй ‡„…‹ЈП€С9ТУФФХЦЧШШЩЪЫЫЬЬЭЭЮЮЯЯаУГИЮвггдежзийклнопрсуфхцчшщъыьэюя№№цф хшёєєѕіьЮ‡YЄ� ,uХїїгŸ‹ˆŠŒ ОСТУУХХЦЧЧШШЩЪЪЫЬЬЭ€Ю#ЦГЖЬбвгдезийклмопрстуфхччшъыьээяя№ёщ€ц чъѓѕѕііюЭ[ І� O€вјєЧЅЛƒТBУФФХХЦЧШШЩЩЪЫЬЬЭЭЧЕЕЩвгдежзйклмнопрсуфхцчшщъыьэюя№№ёъшшщьѓѕііїєбœjЇ�U|лїюОЁ“‘“• МУФ€УФФХХ€Ц1ШШЩЩЪЫЬЬЭЮЬЙЖЪгдежзиккмнопрстуфццшщщыыьэюя№ёђыщъэє€іїєзЂm.Њ�TƒзіюУЃ™–˜˜œЕУЦХ6ЦЦЧЧШЩЩЪЫЫЬЭЮЯЯаНЗЩджжзййкмнопрстуфхцчшщъыьэюя№№ёђыыяіі€їѓдЂd+Ћ�XƒжѕюРЅž›œœ ЎТЧ=ШШЩЩЪЪЫЬЬЭЭЮЯабвСЗЧеззийкммнппрттухцчшщъъыьэюя№ёђђь№ѕїїјјідŸk*­�TuЭђьЦЋЄ€ЁЂЈНШ€Щ;ЪЪЫЫЬЭЭЮЮЯабввгЦИЦжзййкммнппрттуххччшщъыьэюяяёёђєђѕїїјјѓгœc.Џ�LpКђюЮАЉІІЅІЈГУЫЫ€Ь7ЭЮЮЯЯаабвггдЪКУжйккмннппрстуфхцчшщъыьэюяя№ёђѕїѕіїїјяЧ–`'Б� HdДюёбЗ­ЎЋ€ЊАКШЭ€Ю�Я€а1бввгдежЭМСдклмннппрстуфхцчшщъъььэюя№ёђіљїііїјыФˆ])Г�H4Z“йёоСЕИЕАЏЏАВПЩЮаббввгддежжзЮНОвлмноппрстуфхцчшщъыыьэюя№ёєјљљііїємЎxMЖ� +MwЦэцЪЛННМ€ДЕЙСЪа€г/деежзииЯППЫнноппрстффхцчшщщъыьэюю№ѓіјљљјіїюа™jCИ� Db хыеСРТШО€Й)КНСЪвежззиийкЬРСФмопрстууфхцчшщщъыьээю№ѕїј€љїіуЙ‡X3Л�0GmПцхЮХФЫЫХСОПРСТЦЮвеи€к%ЩТУФгррстуффхцчшщщъъыыэёєіїјљљњіщЪhCО�#?V‹ЮънЫЦЩЯаЬЧФФХЦЧШЫЯвебХФХЦЬнтууфхц чшшщъэ№ѓіїїј€љєвЉyS0Р�: *@\’вфйЭЫЬаддЯЫЪЫЫЬЭЭЫФУФЦЧЩвмопрстуфхчшыюёєііїїјљјѓйЎ„T=Ф�6-;N“ЧоквЭЭЮвдгвЮЭЪЧФХЦЧШЩЫЭднпртфцщыюђєѕѕііїїјјёлЋuX:Ш�':T‚Кнпеааббвба�Я€абгдирчъьэ№ёђєєѕ€і їјјёмАyT;"Ы�/!0C]”ЦеежедежзиийклмнопртчюёђѓѓєєѕѕііѓюпПšj@1а�)#0BcЏРдлййккмннопсстфхцыяёѓєѕєюузЙ“pP1#е� $+7QnˆЅКамлмпрстуфхцч мЪЙЊ“uZD6!л�'3:F]dy}}™€„ ukWPH9)у� !$ є�џ�џ�џ�џ�џ�џ�џ�џ�Ј�џ�џ�Ў���U�€3€€3����у� UЊf��к_�3��щА€mзФ\L8�кHЊfПU�л�™U�f*зˆ™UBB5€?5M…™*KˆьЙŸ�™Њв�)�™H8\ЊfЩm?�зЎ—‚m^IBSSIdsŒЌНя Gyф-™”?€��UЮ�1?Uп™œюИa5ѕПНšp\A8#�єэппуэї +@DZy™ПиŠЮZ6.пПЊЩ�53�Њ(ѕЏurM<)�№ытлбЭХМОЕВЕОСЧЮзлцю� 5IgˆИ*Ѓ�ЯщH3ПUЌ�‹�<U$U�ЃєЊ{A)ѓчйаЬТЙДЏЌЉЄЊВВЏЏАВЖЗЊ­АДИСШЯзцј%QˆА)“$п”ППЊ‹�  ’� /=FMD91‡� Ѕ?Ÿ№ѓФoF%�уеЭОЛЖВЎЉЄЋЪеушэюяяюёђэюцсеТЇЌВКСЪнђ-dІHБ��oˆџL‡�  ,/03-#�#.=Wv„…vgZ6„� -UШ$UH/ ъдСГЉЉЅЁЃЅЦу№€јљњ§€ќ§€ќњјјљјѕэдД­АЗФафD…Зиу ™<„� 1S__gjbO. ‘�*!,=gЅЋЃ”‰~^@2�� -ZŠЖЮиЫШАЃ›•œНеыіћќ„§‡ў€§,ќќћћњїђхжТАЕХачю­s? ��.F`‰’”›‘uH’�(",KzЂПФМЋœ”{_@# &DhŠЂЎЊ —ŒЅгщђјќ§§ўŽџ,ўў§§ќќћњіђыгЇВЛШвйЬЏƒZ6 4g…ЂЏЋЏЕКЙЎ’d2’�#!0T„ЗпчбРВЇŸ”pJ1'=Ysƒ‹–Џлєїќ€§ўўŽџ�ў€§ўўџўў§€ќ"ћїѕ№йКЋЋЊžŠlL1"(LvІОЧФХЩЭгдЦЅ|D ”�#!/OŠФѓљцЯРЙАЌБЁ}fI@Oeq|’Нсєќ§§ўўџ §ѓычццщэ№єїћў€§!ќћњјђкГ‘†w]HFb‡ЖмкждилсъёнЕƒO)”�!".Q…НёќэгЦТРКЖКЎpY_lІрѓќ§§ўў’џѓн‚к*ллосфш№їўў§ќћњѕьЮ‰n^`…ТрчтрсухэїќъПŒU6) •� -CmІвщодЫЧЫЬТФЪО›“Ьђњ§§ў“џўўѕо‚йƒк#лмпщѓњћќћљѓй‘ŠЧчяьщъыыюѕ§љтД‡Z>4(–�!+9]…ЉОЧЮЫЫгибЮефыћ§§ўџˆўёп‹й#иоц№їљйЗЛэѕѓяяё№№ёїњэгЎaJ>4��“�!+8LkŽЂГЧЫбйртъїќ§ўџ…ў€§ўў§ѕтй…и'ЖkJKNyŸвиЗОуіјѕѓѕѕѓђѓѓэсЦІ†iWI>�� Ž�€� ,5ATl„˜ЖЭйцѕћ§ўўџўŠџƒўˆ§ћшли*зз‰ @ оњћљјјљїѕєѓюрЯКˆvbTG �Ž� €� #-9FSgz‹Лціќ§ўџƒў†џ�ў‚§Šќћюмз)Т( O­№ќћњњћћљїѕѓълЪЖЄ‘p_Q(�'�€� &3AN_r‘лјќ§ƒў§§ўў„џ�§ƒќ‹ћњєнзжж“ |жј§ќћ€ќњјіѓчжЩКЋžŒ|kW, �%-���  -=K_—рћ§€ў§ўў§ћћќ§€ў€џ�ўƒќ�ћŽњ іужеv  2Ÿњ‚§ўќћњјђхиЬСГІ˜†v\#�@#�5�� *;K‘сћ§ўў§ћљњћќќ§€ўџ§ћ„њ�љŽј ѕчдv  ›ѕ€§€ў§ќћњѕчндЩНЏЁ“`& 6P‘�1+�� *@‹шќ§ўў€§ ћїіїљњњћќ§§ўќј„љ�јї)іш‘ Mи§§ўўџўў§ќњѕыткаХЙЊ›‹\  -R;’�%F� %5Šчќ§ў€§ќљѕєіїјјњњћћќњіії‚ј�ї’ѕєЧ+fхќў€џўў§ќіючпзЬРГЅŽZ Ie’�I8  "+{фљ§ўў€§їѓѓєііїїјљљњљєѓєƒі�ѕ“ѓэjOM|хўџўўќјёыхндШЛЏ“J 7dQ“�@T#-nмѕћў€§ќѕёђєєѕ€іїїјїѓ№№ђƒє�ёŽ№ёёђГt}к‚џў§љєящуйЯУБŠ7 /Uu7”� !cE #^вёј§ћє№ёѓєєѕѕіѕѕііђяюэ№ђ‚ё‰эююя№№„ёнŽ‹‘Т‚џўњіђэцпдЪГs4 #Kqi•�#Ke3  9Щюђ§ў§§ќђя№ђѓєєѕѕїієєђяюьыю‚я�ю…ъыыьэ‰юшЕ™œ­ѕ€џўќјѕёъукЭЇa- =eŒ6–� l[% 3Џээњ€§њ№эяёђ€є ѕіјїєђяэьъщыьыъ„чшщ‚ъ„ы(ъщччиДДŸиџџўћљіђьфвЕyD- 1\†w•� KuE%ƒтщѓ€§ћ№ыэяђђє€ѕ їјіђяюыъшцш‚щ�ц‚фхцƒчƒшчх€ф&утЭФЕЏњѕѕјїёраЎŠbE3! &Kw•<“� 4tg7[кчыќ§§ќёъыю№ђѓ€ѕїјјїёюьщчхутуццххс€рстффˆусрƒп$мСЅpЪквЩПВ Žt`L8& Ag”z ’�* aƒ\HЪштї§§ќђчъьяёђєѕіїјјїіяьъчфтпноттср€моррп„о�н†л%йЁ?/sХУЖЉš‰ycP>) 5_‡ЃG ‘� ,}Ђырщ€§!ѕцчъэяђѓіјњћћљјѕяъшхтплйймонкйклмм€л„кйз…ж'зжеЫz9<Й­Ÿ|kVC2  'OzЂ„ �20(#! "XЎтппіў§љхучыю№ѓѕњќўў§ћїѓюшхсокждеезжежззжжее€д€гвваа‚Я€а(баЯЮЛc4@”Ё“n\G5$ Cm™Џ0'+.956�C?2+**HЧшйшќ§ћшпфшыюђѕњўџќіёэцснйебаЯЯЮав€б аЯЮЭЭЬЬЫЪЪЩШ„Ч€Ш€Щ%ШЦЌK1D‰…s_M9' :`‹Гs8-/4:H_NŽ�EPR>70.чнйѓў§ямпфшьяѓј§‚џќєяъуойда€ЫЪЫЭЭЫЪЪЩШЦХФФУУТС‡П+РССТРСРНH/EoeRA-  )T{ЇЅY B19CVp‘U�jhRB93\мшврўўѕмкрфщь№іќ‚џўљёьцойгЮЩХФХЦЧЦХУСРПОМЛКЙИЗЖЕЕ„ДЕЕЖЖ€З&ИЗЖАƒE-9PC2 !GtœЛl Ь›9:DXmЏ?Œ�UmfK<79ВюиЮёўўсгйпфщэёјў‚џ §єэштйгЬЧСОПССРОЛКИЖЕГВАЏЎЌЉЁ•’‰‡€ˆ‡ˆŽ”œЅЌ­Ў#ЋЇz@*+3% ;bИšcбеН_8AMl†ЊŒ�U–UF63sкыЬдќўѓЭвйпушьёњўџ ўљяшумвЬХОКЙЛКИЖДВБЎЌЊЇЄž‡wcXTNLHƒG-KNRWauˆЂЄЃЁ›qA) /U~­НHЄелЬ—5:H]…ПŒ�Q>7/6ЎьжШхўњвЩбзнтшэђњў€џ!ўњёштнеЪТКДГДВАЎЌЉЇЃœ}fP=97654322‚1.223468:=BTo…–“rD+"NužТgXДЩлжР>1:FWoŒ�;8/,*IдяЩЪёџшФШЯжмтшюђљ§ўў§љђщсмеЭРИА­ЎЌЉІЃ œt[J930-+**)'&&„%.&'()+-0359CTf‹nF1;h‘Й™1aЄКзкЬ‚,39KPf‹�<8/2&#‹щсУгљјЭМХЬдлтщюёіњћњїђърйгЬСДЌІІЄЁ™ŽwSC90-)&#  ‚!#&),/27ATrmL6 €2W†ЎИ1=]“ЇЮнвЛ/+-77U‹�3, ЦѓбПпџхДИТЩвмуъюђѕііє№ьтзаШРГЇ Ÿœ™“eD5/+'#€„. #&*-06P`P@-�%OvŸ˜60LT„ŸЗккФy$'*4D‹�2fляУРьџФ­ДОЧвнфыяѓѕєѓ№эчйЭХНДЅœ™•‘^E3-(# € „ .  $'*.7JPB8)�':9 !EIPxšЅбнЩЄ#%-‹�9ЉэсИТњюЈЈАКЧгохэѓєєѓёэшрЬРЗЎЄ”‘|]>2+%! ‡€*  $',4GE?:0  )>DGLlŽ›ОлгЙU‹�6 7ШѕЭДЬџЪŸЃЋЙШдрщђіїѕђюштиОВЈž’Š€fB2,%  † #&):FE=‚<>?BDLh‚–­еиТn"Š�1 gзїОБкђЎ™žЅИЧехюїќ§јёыумЯЎЃ˜†pL7-'! ƒ„ƒ !&.@QD<€;<=@BR`sŸЫкЩš‰�5 ”цђЎ­ъи—“˜ЂИЫоъєўџџћяцмвР™ŽƒuY5-'! ’' !$4NQIB??@ENTVh|–ЛкаГŠ� Ж№рЋЏ№З‰Ž“ЁПгрьљ€џњыргЧЏ‡}fF3*$ –�€$ !+DQQMKLNNOP]e•ЊйдР Š�� ЩљЮЇЗщ’ƒˆ“ЎЦгпя§€џѕфиШЙpU:.'  œ� %:€J€I JJRV˜инУn �*$еџОЄТзb}†ŸЕФан№§џџќшиЫЙЈƒB/)#  �! .BEDCCDDGK“ЩцФ�'jтћВЁЩАYxЄГТЮкьќџќ№кЬНЊŽa-'! Ѕ� (:?> ?=s”КъЬБ�&—ыђЌЬ}Sz“ŸЎНЩет№ѓъмЬОЋ‰nS# Ј� 1‚8(c–ЌэжД-Ž�$ЈішЅšбULzŒ˜ЇЖТЭжмлдЫЛІŠn`J Њ� '122-Y•ІьнВ\�!ДўуЁ–ЗIJuƒŸЎКУЪЭЫФЙЁ‰s^WG Џ� ),K“ЅюфДuŽ�!Фџзš™—>Eky„“ЂЌДКЛЖЊ—ƒp]ROG Б�€€    ;“Ѕ№чЙŠŽ� NЧџв–™‚7B[nv…”ЄЈЅš‹~lZOKIBГ� € 0’ЌјыН“Ž� _аџб“–c0?J^iuƒ‹Œ†~sfUJGFE@Д�‚ -‘ПїэС–Ž�wаџЯŽR+:@EMWdhklhbWLDBA@?=€З�„ ‰вѕђЦ— �tбџЮŒ}@(48=@BIOSTPKD??==<=<!К�€‡сєёЦž�sнџЭ‰x<%/158:<=?>=;::‚9:(Н�‚ ŠяѓёЦ�pоџЫ†m1#),/0234€5�6€5€678. П�†œёёђХ›�pнџЭ…i, %'(,-./0110112344564Ш�"ЕёёѕХš�oгџк‡g)!"%&())+,-.-/0112356Ч�,Чё№№Ф˜�oЬџо…d% "#$&&')*++,../1235-Ч�Aж№я№Ф™�pЩџщ†a"!#$%&&'()*+-.01244 Ц�oщ№я№У“�_Тџї‰_  !#$%&'(*+-./123#Х�ВююяюПŒŽ�EЗџџ“a# !#$%&')*+-./01- Х�Eг№эяъЗ‰Ž�ЊџџІa$ ""#%&')*+-./00У�•мяьяшВ�žљџФc(  !"#$&'(*+-..0) У�FФц№щ№фЉq�•щџтb,  "#%&')*+,-./С� •бэ№щ№рЁX�лџєr5  "#%&')**,-.. Р� XЭкѓяыяеœ1� \ХџјŽ@  "#$&'()*,-.!П� #ПлхєяэюШ—�!"Ећ§ГH !"#%&'()*,-,Н� ‹упюєяяьКŠ�!Їьџвa "#$&&()*,-( М� bочцѕє№ђцЈd�"“мџэ€  "#$%&()*,-#К� ?ЯёьюїєђђиЁ‘�"pЧќ§Ÿ-!"#$%&()*,-Й� Нїє№ѕјѕѓђЧ–’�#OЎєџиH  !"#%&')*,+З� ˜ёњњїњљїіьГ|’�#!чџљk  !"$%&()*,*Ж� nЦряњќќњјљлЃU“�$|ЩџџЏ !"$%&()*+'Г�_ЅЛЮнюќ§ћњјШŽ2“�%C њџъJ !"#%&'))+(Б� E‡˜ЈКЪрјќ§ќюЎ{“�&Œпџљ !"$%&(()+)Џ�3`w‡—ЉЙрђї§ќр–_•�&fГњџе: !"#%&'()+*Ќ� +AQdt„–Гпы№їђФ‡ •�'—фџќŠ !"#%%'()++! Њ�0::AQaq‡КмфщёсЃd–�)qРќџт  !"#$%'()+,&Ї� 8<;::AP`…ЦзнуьЧ—�*?‘юџџ– !""$%&()+,,! Ѓ�3>>=<;::?PЁШажпмЅo˜�+ sПџџт?  !"$%'()+,,(  �)?A@?>=<;::]ИТЩанХ‰A™� 2шџћ•€  !#$%'()++--(›� +<CCBA@?>=<;G“ЕЛУЮзЃq š�iЎїџђO€�€ !  !"$%&()*+,./.–� 4FGFEDCBA@?>>@xЎГЕМаП‚$›� /‡йўќО€ #  !#$%'((*+,./1/'� -<HIIGGFEDCBA@?>_ЅВДЕПЬ™\œ� ]™їќѕY€ )  !#$%''(*+,./1220-%‚" %:EIMLLKJIHGFEDCBA@IœБГДЗЫЎ{�nПћњЭ/€€ O  !"$%&'(*+,./022356873+)#!""#)07?IKKMNONNLLKJIHGFEDCBI…АВГЕУТ‡HŸ�8„йњ№€€ N  !#$$&'(*+,./01245689:<=>?@BCDFGIIJLMNOONLLKJIHGFEDFrЉВГДМЫe  �X•чїш^€� L  !"#$%'(*+,.//1245689:<<=?@BCDFGHIJKMNOONMLKJIHGFFkЉБВГЖЦЉw Ё�eЅієа-€� J  !!#$&'(*+,-./1245689:;<=?@BCDFGGIJKMNOONMLKJIHHbЃАВВДСЙ?Ѓ�.pТіяЁ� I  "#$&'(*+,-.01245688:;<>?@BCDEFHIJLMNOONMLKJJbЏБВГНХ‡YЄ�,uФёы€ F  !#$%'()*+-./12356789;<=?@ACDEFGIJKMNOONMLLeЅЏАБВЙР[ І�O€а№хl €€ E  !#$&'()*+-./12455789;<=?@ABCEFGIJLMNOONNgžЏАБВЖП›jЇ�U|йюдQ €€ C  "#$&'')*+-.012445789;<>?@ABCEFGIJLMMOPhžЎАБВЕОЁm.Њ� Tƒеыб\  @  !#$%&')*+-./12345789;<=??@BCEFGIJKLRqЊЏЏББДКЁd+Ћ� XƒгъаN€C  "#$%&')*+-.011345789;<=>?ABCEFGIIQ{ЃЎААБГИk*­� TuЩхЩZ€€ <  !##%&')*+-./01345789;<<>?ABCEFJXІЋ­ЏАГЖšc.Џ� LpЖфЭn>  !"#$&')*+-..01245789;;<>?@BCKuЉЇЈЋЌЎВВ•`'Б� HdБсеs# €= !"#%&')*+,-/01345789:;=>?ARŽЖЖЇЈЊЌАБˆ])Г� 4Z‘Юз—= 8  "#$&')**,-.01245778:;=KwЌОПЌЅЇЊ­ЅxMЖ� +MvМй­U%6  "#%&'))*,-.01345678Ai–МОРИІЅЇЊ–jCИ� Db›бПv1#  !"#%&'()+,-/01€38[АКНПОЌЃЅЅ…X3Л� 0GmЕЯІV8% -  "#$&&')*+,--1Ab“АЗКЛООЏŸЁŽhCО� ?V†МО‡E3,"€  "€#$$%%'.Lo‘­ГЖИЛМНЏ –xS0Р�: *@[‹ЙЎsC955,   %*Cg‡žЋАГЕЗИКЙЇ˜~T=Ф�6-;N‰БЇoP==@<0%  )6AVu‘ЁЉЌЎАБГЕЖЖА—uX:Ш�3':SyЁЄ‚S@@BDC>;851-.'&'(.5?Xds|Š–ŸЅЇЉЋ­ЏАБГГВtT;"Ы�/!0BZ„ždQJEGILMOQSTVXZ]aetŽ™ ЂЄІЇЉЋЌ­ЎЋЃg@1а�)#0A]~…xl`SKLORTVY[^`cegm}Œ˜ŸЄІІЇЈЇš…lO1#е�% $+6K_isrncUQUX[]_bdfijmsy}‡ŠjVC5!л�'28BIDEHIKLOQQSRTRMF8(у� !$ є�џ�џ�џ�џ�џ�џ�џ�џ�Ј�џ�џ�Ў���U�€3€€3����у� UЊf��к_�3��щА€mзФ\L8�кHЊfПU�л�™U�f*зˆ™UBB5€?5M…™*KˆьЙŸ�™Њв�)�™H8\ЊfЩm?�зЎ—‚m^IBSSIdsŒЌНя Gyф-™”?€��UЮ�1?Uп™œюИa5ѕПНšp\A8#�єэппуэї +@DZy™ПиŠЮZ6.пПЊЩ�53�Њ(ѕЏurM<)�№ытлбЭХМОЕВЕОСЧЮзлцю� 5IgˆИ*Ѓ�ЯщH3ПU­� € � �<U$U�ЃєЊ{A)ѓчйаЬТЙДЏЌЉЄЊВВЏЏАВЖЗЊ­АДИСШЯзцј%QˆА)“$п”ППЊ�’� +8AG=1'ˆ� Ѕ?Ÿ№ѓФoF%�уеЭОЛЖВЎЉЄЋЪеушэюяяюёђэюцсеТЇЌВКСЪнђ-dІHБ��oˆџL‰� "%(+' ‘� +9Rr€o^P( „� -UШ$UH/ ъдСГЉЉЅЁЃЅЦу№€јљњ§€ќ§€ќњјјљјѕэдД­АЗФафD…Зиу ™<„� "HVW`c\J) ‘� '8b‹ЁЇŸtL&� -ZŠЖЮиЫШАЃ›•œНеыіћќ‰§‚ў€§ќќћћњїђхжТАЕХачю­s? €� ,L~ŠˆŽ˜–ŒqC”�& (FvžМСИІ•Š}c=� &DhŠЂЎЊ —ŒЅгщђјќ§ўŒџ*ўў§§ќќћњіђыгЇВЛШвйЬЏƒZ6 �En”ІЄЉБЖЖЊ_-•�" *NДнхЯМЋœ‰zF'=Ysƒ‹–Џлєїќ§€ўŒџ�ў€§ўўџўў§€ќ!ћїѕ№йКЋЋЊžŠlL1KŽАНМПХЪавУЁx>–� (I…СђљхЫИЏЁ™œL-7Oeq|’Нсєќ€§€ўŽџ §ѓъцххшыяєїњў€§ќћњјђкГ‘†w]D",W›вбЮЭгипщ№мВ~I#˜� &IЙ№ќыЮОЗВЈŸЁŠ\5C_lІрѓќ§§ўў’џђм„й&мптчяїўў§ќћњѕьЮ‰nPJЇгокймптыїќщМ‡N/#™�$:eЁЯшлЮТМПМ­­БœcuЪђњ§§ўў„џўєнˆи!йкншђљћќћљѓбiFЇлщхтхцшьєќљсЏR7.# ›�!/T~ЃЙТЧТПЧЬРИСзтћ€§ў„§ўёо„иззж‚знхяіїЛ‹с№эщъэьь№іљьаЉ{YC8.�–�!.Ab…™ЉОСХЮезфіќ§…ў§ў�§ƒќ§ў€§ўў§ѕси„з!еГjJKMxžбЭz†Э№є№яёё№№ёђыоТЁbPB8‚� Ž�„�!*6I`v‰ЉТЮрєћ§ўўџ‚ў‚§ќќ§§ќƒћ�ќ†§ћчкз"жж‡ )]ОіјѕєѕїєѓђёьмЫЕ—o[M@‚�Ž� …�"-;GXhx­сѕќ§ўџў§§ќќ§€ќњњљ�њ‰ќћюлж С( *ƒсњљїїјљіѕѓёцжФБž‹ziWJ!‚�'�„�'5BRbжјќ§ўў§§ў§ќћћ‚ќ§ћћљƒј�њŠћњѓн€ж“ >КѓћњљњћњјієёуаТГЅ—…udP%ƒ�%-�‚� "1@Tоћ§ўў§ќ§§ћњљњћћ‚ќљіѕѕі�љњ іужеv  _ѕ€ќћќ§ћњјіюпаХК­ ’oU„�@#�5� 0@‰пћ§ўў§ќќћљїїјљњњћњє€ѓ€є�ѕј ѕчдv  Yщќ§ќ§ћњјђтжЭТЗЉ›zX…�6P‘�1+€�  6…чќ§ўў€ќњіѕіїїјљљњ�іƒ№ёєї іш‘ Іћќ§€ў§§ћљђцлдЪПГЄ•„T„� -R;’�%F� +„цќ§ў§ќќћјєѓєѕії‚јїѕђƒэюѓ‘ѕєЧ+$Чћўџџўў§§ћєщтйбЦКЎŸ‡Q…�Ie’�I8  $vуљ§ў§€ќѕёђѓєє‚іїіѓѓяƒщьђ’ѓэjOM>Ъ§€џўў§ќіэчрзЮУЖЉŒ@ …�7dQ“�@T# 'jлѕњў§ќќћѓя№ђђѓєєѕєђ№№ъƒх�ы‹№яюэьыъ­t}_Е‚џ ўќїёыфнгЪОЋƒ+†� /Uu7”�$!cE Zбёј§§ќќљёэяёђђѓѓђѓєєѓёяюэцƒс�ыˆэыщчху„саŒ‹sŽўџ §љєящткЯХЎj'†�#Kqi•�#Ke3  6Шюђ§§ќќћюыэя№ђђѓђэёѓѓёяюьытƒн‡ъчтпо†нпсД™yэ€џ ўћіђэцоеШ W! …�=eŒ6–�#l[% 1Џээњ§ќќјьщыэяёђђѓ№ыюђёяэьъщн‚з�м„чфпй‡зимтччиДВuРџџ§њїѓющпЬ­o8 …�1\†w•� KuE%‚тщѓ€ќњьцщыюяёђђѓэыыёяюыъшцй‚в�н‚фпйдˆбзнуффутЭФ †јёёієюкЧЂ}T7&†�&Kw•<“�* 4tg7[кчыћќќћьухщью№ђѓѓђьыъяюьщчхумзЭЭЬЮм€рндЮЬƒЫЬЮжоƒпмСЃGДЬТЙЎ Ž}cP?*†� Ag”z ’�0 aƒ\HЪштїќќћюптцъьяёѓѕѕёюьщъьъчфтпнкШЦЦЬкмйбШЦ„Х€ФХЬз…лйЁ?&HАБЃ–†vgSB1 …� 5_‡ЃG ‘� ,}Ђырщ€ќёноучыю№ѓіјљѕёьшчъшхтплйиЪСТЮиаЦР€П‚ОСЫд„жзжеЫz9#oІšŒ{j[G6%†� 'OzЂ„ �50(#! "XЎтппі§ќїкиофчьяѓјќўўќѕьцушхсокждебЧЩЮУЛЙЙИИЗЗЖЗЖЛЪƒЯ€абаЯЮЛc/%}€o^N:(†� Cm™Џ0'+.956�C?2+**HЧшйшћќњпгйрфшэђј§џјьурхснйебаЯЯЮФИ€ВБАЏЎ­Ќ­ДУ„Ч€Ш€Щ ШЦЌK+*vucQ@, †�:`‹Гs8-/4:H_NŽ�EPR>70.чнйѓ§ќщЮгйпхщяі§‚џјщрлройда€ЫШМЏ€Ћ ЊЉЈЇІІЅЄЄЃЌЛ†ПРССТРСРНH'/^WE4 †� )T{ЇЅY B19CVp‘U�jhRB93\мшврў§ёЮЫдйпхъђћ‚џўѓфмжмйгЮЩХФОЎЅЃЃЂЁ Ÿžœ››ššЂДЕ„ДЕЕЖЖ€З ИЗЖАƒE&+D7%†�!GtœЛl Ь›9:DXmЏ?Œ�UmfK<79ВюиЮёўќеУЫгйпхъѕў‚џ ќыоеажгЬЧСОЗЅœ›™™˜–•”“’‘‘••’‰‡€ˆ‡ˆŽ”œЅЌ­ЎЋЇz?& '†�;bИšcбеН_8AMl†ЊŒ�U–UF63sкыЬдќўяЛСЪвйпфыјўџ ўѓсжЮШаЬХОЙЎœ•”“’Ž‹‰†eQCRTNLHƒGKNRWauˆЂЄЃЁ›qA% †� /U~­НHЄелЬ—5:H]…ПŒ�Q>7/6ЎьжШхўјУЖРШбипхэљў€џ!§ѓужЭФОЦТКВЂŒŠ‰ˆ†…}n[@&,54322‚1223468:=BTo…–“rD( †�"NužТfPДЩлжР>1:FWoŒ�;8/,*IдяЩЪёџрАЕПЧЯзпцэі§ўўћђтжЬУКДОИЎŠ†„ƒ‚€}lO4  *)'&&„%&'()+-0359CTf‹nF/„�;h‘Й™0L КзкЬ‚,39KPf‹�<8/2&#‹щсУгљіНІВЛФЮирчьёєіѓыпгЪСЗ­ЉДЋ•‚~|{wmS)  ‚!#&),/27ATrmL6‚�2W†ЎИ1=L€ЇЮнвЛ/+-77U‹�;, ЦѓбПпџоœЂЏИУактшъшщшумвЦНГЉŸЁЅxwup]= „. #&*-06P`P@,��%OvŸ˜60LMfšЗккФy$'*4D‹�;fляУРьџГ”žЊЖФвлуцхцхтмдШЙЏЅ›˜‹tpn]5  „ .  $'*.7JPB8)�':9 !EIMV‹ЅбнЩЄ#%-‹�-ЉэсИТњщŽŽ˜ЅЕЦгмтуццуоеЪЛЊž”‰€„mhW3 �� ‡€*  $',4GE?:0  )>DGKUr™ОлгЙU‹�+ 7ШѕЭДЬџЛ„‰’ЄЗЧелсщэшскЭРЎ™‚wpfY=€�† #&):FE=‚<>?BDLZ[‘­еиТn"Š�* gзїОБкяš~ƒ‹ЄЗЧайьљњярдФЕЁˆ|qe_I …�ƒ„ƒ !&.@QD<€;<=@BRYM~ŸЫкЩš‰�) ”цђЎ­щЯ}x}ˆЂБМачќџџінЬЗЄŒqf[M/‡�’' !$4NQIB??@ENTUIU•ЛкаГŠ� Ж№рЋЏяІmrx†•ЅЛжѓ€џ ѕзТЊ“w^U;€ �€$ !+DQQMKLNNOPH3ŽЊйдР Š�� ЩљЮЇЗцyglqu‰ЂМнњ€џьЪØ~`G) Ѕ� %:€J€I JJF$x˜инУn �!$еџОЄТа@`a\k‡ŸКрќџџњеЗž€e>Љ�! .BEDCCDDC]’ЩцФ�jтћВЁЩЁ7YNRj‡žЗкљџћфНЄ‹k?­� (:?> ?HŒКщЬБ�—ыђЌЬd1J?Ng„šАЪуыкСІr=€А� 1‚8 2…ЌыжД-Ž�ЈішЅšа5&78Ib}’ЅЖССЖІnBГ� '122- %zЅъмВ\�ДўуЁ–Б'-3CZt‡˜ЅЊЈžiF( З� ),iЃътДuŽ�Фџзš™Œ -9Ogx†’Œ{^B)И�€   VЂъхЙŠŽ�NЧџв–™s&/BXgsyvfRA)€Й�€€ L яшН“Ž�_аџб“–P &4HT[VOE7'П�‚ KŸэъС–Ž�wаџЯ= %+/0.& ƒ�Н�„  GЇщэЦ— �tбџЮŒz*‚„�Н�€€ FДчьЦž�sнџЭ‰w(ƒ…�О�‚  HЧфыЦ�pоџЫ†k‡†�Р�† bШрыХ›�pнџЭ…gˆ†�Ш�ХнэХš�oгџк‡e‰…�Ш�•ТлщԘ�oЬџо…b‹„�Ш�0ЁРлшФ™�pЩџщ†_Œ„Ч�NЎОмшУ“�_Тџї‰]ƒ�Ц�w­МнчПŒŽ�EЗџџ“aŽƒЦ�(‹ЌОлфЗ‰Ž�ЊџџІ`�Ф�WЉСмуВ�žљџФc#€�Ф�'ršЇЦнрЉq�•щџтb(�€�Т� RzЂЌЫонЁX�лџєr2�€С� 0p€ЉЗЭргœ1� \ХџјŽ>�Р� fvЌРатЧ—�"Ећ§ГG�О� HwwœВЦвтЙŠ�Їьџвa �‚М� 2sy}ЉЛЫзрЇd�“мџэ€��‚М� i{z‹ЎХЬмдЁ‘�pЧќ§Ÿ+��ƒ�К�^€|šЗЬЭтХ–’�OЎєџиG��ƒ�И� Lx}}…ЇЧЮбсГ|’�!чџљj ��„�Ж� 8cpw}КЭЮйеЃU“�|ЩџџЏ��…�Д�0T^goyЅШЯЯрЧŽ2“�C њџъI��…�В�$EMU^ezНЮЯдоЎ{“�Œпџљ��†�А�2>EMV]–ЧЬЯйй–_•�fГњџе9��‡�Ў�$+4<DMjЖЦШЮмС‡ •�—фџќŠ€�‡�Њ� #+3;IŽОУХЯзЃd–�qРќџт€�‡‘�Ј� $+3VЊМПТжФ—�?‘юџџ–€�ˆ‘Ѕ�"-‡ДИМЦгЅo˜� sПџџт?�ˆ‘Ё� EЊБЕЙЬУ‰A™�2шџћ” €�ˆ‘ž� ,„ЉЎВОаЃq š�iЎїџђM�‰€˜�  bЂЉЋБЧО‚$›�/‡йўќН�‰“� A•ІЈЊЖЩ™\œ�]™їќѕW€�А„Œ� #ˆЃІЈЌЦЎ{�nПћњЬ,�А‡€‚�€ƒ j ЃЅЈКР‡HŸ�8„йњ№Š �А† P– ЃЅАЧœe  �X•чїчZ‚�А† C“ ЂІПЉw Ё�eЅієЯ'‚�А† 3Š›ŸЃЖЗ?Ѓ�.pТіяž‚�А† .}—› ЎС‡YЄ�,uФёъŠ ‚�А‡ /‡•˜šœЈЛ[ І�O€а№фg‚�‹‡ ,{“•˜šЁЗ›jЇ�U|йэвKƒ�Š† *w“•—ГЁm.Њ�TƒеыЯVƒ�Š„ 5‡’”›Ў d+Ћ�XƒгъЮHƒ�Š‚ G}‹’–Ќœk*­�TuШхШT„�‰aƒ‰ŒŽ–Љ™c.Џ�LpЖфЬi ƒ�‰ I„‡ŠŒŽ–Ј”`'Б� HdАсгn…�‡ (>_…‡ŠŒ–Јˆ])Г� 4Z‘Юж”7 …�†Š 7@Gs†‡‹™ xMЖ� +MvМйЊP „�†‡+=?AW~†Œ›”jCИ� Db›бОq* …�…„(6<=?Fmƒ„X3Л� 0GmДЮЂQ2†�‚€ )58:<=Ac†“ŽhCО� ?V†ЛНƒ?,% „�„Ž'2578:<@[‰wS0Р� *@[‹ИЌo=2.% ��Ž€ "*/24578:BfŠ}T=Ф�-;N‰АЅkJ€7/% ‰ $),./02457=RsuX:Ш�3':SyЁЂ~N;:<>=740-(#$&$#&(*+,./0247DfcS;"Ы�/!0BZ„_LE?ACDFGGIIJLMPRSH.%#$%'(*+,.03:DQT<1а�)#0A]}„uh\MDFHIKLNPQSUVXVF8/)'(),18?A??1#е�% $+6K_hrpk_OKLNPQSUVXZ\YURTNRQI:1-!л�'28AHCEGHIJLOQSRTRMF7'у� !$ є�џ�џ�џ�џ�џ�џ�џ�џ�Ј�t8mk��@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���������������  �����������������  �������  ���������  ����������  ����� %)-/00.+'# �����  #%'*+-...-+*(%#  ������  %),/00.+'! ��� &.8?DHIHFB=82+%    #&+/36:>ACFHJJJHFCA>:740,($!  #(/4:?CGIIFA;2*  �� )5AMV]bcc`\VOH@81)#   %(.37=CHMQUZ]adfhhhfda^ZWRNID?94/)$  !'.5<DKQX]acc_ZQF;.!�� ):IdЗЧЩЪТЊ•…tg]TJA8/'   #+17>DKRX_ekqv{€„А’“”“’Œ„€|wslgaZSLD=5-'  %-6=GPXbmŽЂЙЪЪШОœmP?.! �� %5IrУќџџџџџџїфЫЎŠqeYOD:1'  (09BJR[bjqx€‡Ё­ЛУЫвллммммлиЬШНГЇ—‰‚{skbZOF=3+# '08BLVak~ЄСоѕџџџџџџўг…P:* �� .@`МќџџџџџџџџџџјъЯЁwj]QF:1)"#+3>HS^hqzƒŒ”ЇУицяєљќџџџџџџџџџџџўњіёырЭВš‚ymcXLC8.'!")0:EO[gs’УуѕўџџџџџџџџџўмkF3  �� $7L„ѕџџџџџџџџџџџџџџўъЛrcVKA83015;EO^jvƒ›ЎРоѕџџџџџџџџџџџџџџџџџџџџџџџџџџџћчЪВœ‰}ocWKA82//38AJVbn‰ЏмўџџџџџџџџџџџџџџџQ;& � (=T џџџџџџџџџџџџџџџџџџщТ—qdYOJGHMU`l{ˆ•ЉЦнё§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїфЬЏŽ‚ug\QKGFIPYcp‹КсќџџџџџџџџџџџџџџџџџШYA*�+B[ЖџџџџџџџџџџџџџџџџџџџќђЫ•{mgdfku€žДжѓћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ірКœ‰}rjecgmx‹Льћџџџџџџџџџџџџџџџџџџџе_F-�-E_СџџџџџџџџџџџџџџџџџџџџџџїаЂ‹†ˆŽ—ЇРрњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьХЉ•Œ‡…‰œФюўџџџџџџџџџџџџџџџџџџџџџжcH/�-E_Вџџџџџџџџџџџџџџџџџџџџџџџџ№бЎІЋСујџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћыЬЎІЈЩщ§џџџџџџџџџџџџџџџџџџџџџџџжdI/�,C]Єџџџџџџџџџџџџџџџџџџџџџџџџџ§їмхњўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ№нѓ§џџџџџџџџџџџџџџџџџџџџџџџџџФbH.�*AZњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА_E,�� '=V…шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘[A)�� #8OuЭџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџш~T<% �� 3IhЖќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬqN7! �-B_˜яџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћЎeG1 � ':Vwйџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџш[?+� "3NiВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўЯrR8% ���,D^ƒїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ eI0 ��� %:SmЮџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщwY?)���� 2IbЁіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИiO7# ����)>U~дўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъ‹[D-����� "4JhЊїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§РqP:% ������,@\|сџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя˜aE1 ������� #4Nh­ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЧnS9' ������� ,D\шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњŽbH0 �������� $:QnДљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўаsV>'��������� 1FaŠлўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэ›hL5  ����������+?ZyЗњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§Э‡aF/����������� &9Tu”тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёЌ]B,������������ $8Rs‘Т§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмЁ‚]A* ������������ %9St“ЪўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщЈ…aD,����������� (=Y{ЂђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћШhJ1�����������,C`„Чќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц pR8! ����������� 3KišчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќМ{[?& ��������� %<VvЛќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъŠhJ/���������+E`„цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ЈrT5" �������  3OkЃ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџж€^>) ������� ';YwдџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяiG0�������-BcэџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћЙrP7" ������� !4KnЕљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн‡Y@( ������� &;T|вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ™dH-����� +B[шџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўЖkN3�����1IdЇ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџмuX;$ ���� !6OlХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓ^@( ��� $;Usтџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ™dF-��� (A\~јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ИkL1���,Fa•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўЯpP5" ���/JgБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн|U9$ ��� !3OlХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчŒY=' �� #6Spзџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю˜]?* �� &:WxрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіЄaB, �� '<Z†чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќ­dE/� )>\ŽыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДgH1� *?^˜№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛkK3 � +A_™№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩqM5  �,A`™№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩsO7! �,B`š№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪtP8" �,B`š№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪtQ8" �,A`™№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪtP7" � +A_™№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЩrN6! � *?^˜№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОmL4 � )>[ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДgI2� '<Y…чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ЎdF0� &:VyтџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЄ`C-� #6Roиџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя—\?* ��� !3NjЩџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчŠX<( ���/IeЏџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо{S8% ���+E`•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЯlN4" ��� (@Z}ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§КgJ1��� $:Spчџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћ™`D,����  5MiШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџє|Z?( ����0GaЅ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоoT:$ ����*@XъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗfL3 ������ &9Qyбџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ•^E.������ !3IiЗћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкU=' ������,A^‹юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќИkL5! ������� &9Urжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№™`C. �������  1KeЅўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџжsU:' ��������*BZ|чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃeK1  �������� #9PlК§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщyZA*���������� /D]хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќЕgM6" ���������� ':RqТќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџф‰ZB.�����������  0Fa‰юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћЙmN8& ������������ &9RkЖўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс~\A- ������������� /F]†фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќЅgO6$ ��������������&:OjЊѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўдxXA+ �������������� -@YyЬўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџы”aH4! ���������������� $4KcєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћИpR<* ����������������� (<RiЌљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўиv[B.  ������������������ /CXzЩќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџщ‘aK5# �������������������$5HaˆфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕЎmQ=) �������������������� '7NdŠёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќКrW@. ���������������������� *>RiЋѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§аx]G2# ���������������������� 0BUsДїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўл‰_K7& ������������������������ "1BZoЛћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџж‡bK9( �������������������������� $4H\yЧњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп‰dP:+ ���������������������������� %7H]{Тљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§йŽcO=+ ����������������������������� (6H]tЛѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџз‡dM<, ������������������������������� (7I\uДєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§гˆcP<-  �������������������������������� &5EXm›ыўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕО~`L;* ���������������������������������� &3CUg‘зќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџэБs^J9+ ������������������������������������ $2APe‚Пўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўр›pZI8* �������������������������������������� !,9JZlŸоќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў№ОzeSA3& ���������������������������������������� )7EUg‡ТѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџйŸs^N?0$ ������������������������������������������ &2>O^sœйљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ьЗ€gWF9,  ���������������������������������������������  *8DTdvЊлїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ьР‚iYK>1& ����������������������������������������������� '2>MZjƒЉс§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёР“n]QC7,! �������������������������������������������������  *6AN[h жђћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўїуЕ…l]PC8-$ ���������������������������������������������������� $,7BMZfr–Лнѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§шЪІyg[OD8.% ������������������������������������������������������� %.7BLWcnƒОуќџџџџџџџџџџџџџџџџџџџџџџџџџџџџюЮЉŒsdXNC8/& ��������������������������������������������������������� "+3;EMW`isƒЃЧмчђї§џџџџџџџџџџџџџўњєьуаА’wlbXOF<4,# ������������������������������������������������������������� !'/6>FMU]cks„›ЈЗТЭворссссриЯЩЛА Žyle^WOH?81(" ���������������������������������������������������������������� #)05<BHOTY^cgmuy€‚ƒ„„ƒ‚}wrie`ZVPID>71*% �������������������������������������������������������������������  %*.48<@DHKNQSTUUUUTRPMIFB=94/+&" ������������������������������������������������������������������������ !%(+.1469:;<=<<;97620,)&" �����������������������������������������������������������������������������  !#$&&&&&%$"! ���������������������������������������������������������������������������������  ��������������������������������������������������������������������������������������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/vol_optical.icns�������������������������������������������������������������������0000664�0001750�0001750�00000007012�10411602135�016404� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns�� il32�� њˆ� =d~ŠŠ~iE‘� 6ŠФеййебвилвG�ˆишрзвбЯЭЯжтэњєЏ2Š�=ЈЯдмойдгбагншяѕјџщbˆ�EІГМЭкрниеггиуьє€і§љq†�9•žІДХеррлзеемц№їіћљl„� €Œ’žЌЛЭнтокииощђїї€іѕћђF‚�j…ƒŠ•ЂВФифпгЮалщѕјїііѕєѕўЫ �@Ž…„†Ž˜ЇКЭаХЗБИЪйхіјїѕєєѕіќq€�|”ŒŠŒ‘ЋБЕ“shn~Ібтѕј€єѕєѓШ ��3›˜—–”’“–™–jYdlplh‚Щтііѕєє№ъцJ��aЅžžŸžž—`ct|†ˆ„tƒбъјѕѕєяфу€��„ЊІЇЈЈЉЇЅwfxƒŽ—›”„ržкђѕєёъоиЂ� žБАВГДДАІlxƒŽ’fWŽ–‹‚yХсэыщуквГ­ЛЛОРССЛŸs~Œš]��6–ƒxЌдтрнйвЬЖ!ИФЧЫЮббШЃ}ƒ’ 9�� Ž„xœЧббЮЫЧУГЛЯгйнртеЕ‚„“Ÿy��O–Œ„tœЛССРОЛКЊ ЙлпхщыэтЫˆŽ›Ѓ“‡˜ˆsЅАДД*ГВАБ›�ЅшшэёєѕђмЌ…‰‘™›™Š†t{ЄЇЉЈЈЇІЋ~��{ђюѓ€ѕјъв’†‰‹Œ‹ˆ„vn—žžŸžžЇY��<ыѓ€єѕііуЫ’ƒ†„{ry—™–“’”–—˜›&��Иќѓ€єѕјісЯЉ‡zy}•ДБЋ‘ŒŠŒ”u�SњѕѓєѕѕјљѓфжУЎЈАРЯЭКЇ˜Ž†„„Œ0‚�ЊџѓєѕієѕјѕшкЯЭгпфиФВЂ•Šƒ„]ƒ�"кќєіѕєїїђщоиикотнЭЛЌž’‹x„�Cюћіѕіії№цмеезлрреХДІŽ'†�LьўєѕієьуиггеинркЬМВ0ˆ�5ЬїэяьшнгабгдимиЭЯ–$Š� xЗиойвЭЬЮЯЭаевВi � _ЇШЯЭЮавгЧ Y’�;R__R8Љ�ˆ� 5Yp~‚{gE‘� 0xЊЙЛКЛРЩдкбG�‹ЩЬСКЕЕИНЧгсэљєЏ2Š�PЭубЧРЛИИЛСЬлцяѕјџщbˆ�cшыоеЬФПЛКОХбрыє€і§љq†�OиуцхндЪУОНРШжфяїіћљl„�*ВЧвсщхмбШТСУЫйчђїї€іѕћђF‚�†ДЕУдфыхкаХППШзшєјїііѕєѕўЫ �HЋЈ­ЖФехэуУБ­ЏЗЩйхіјїѕєєѕіќq€�‡ІЅЉЏЗХитЩА‡nhl~Ібтѕј€єѕєѓШ ��3ЄЂЄЈЌБКФЙЋlYdnplh‚Щтііѕєє№ъцJ��cЋЄІЈЌАЖЋfct|†ˆ„tƒбъјѕѕєяфу€��„ЋЈЊЌЎВБІwfxƒŽ—›”„ržкёєє№щоиЂ� œЎЎБВЕЖБЂlxƒŽ’fWŽ–‹‚yХрьъчтибГЉЖЗКНПРЙžs~Œš]��6–ƒxЋвонлжЮЩД!ДРТЦЪЭЮХЂ}ƒ’ 9�� Ž„x›ФЮЭЪЦТПБЙЬЯжлногД‚„“Ÿy��O–Œ„tšЙРПНКЗЖІ ЗкнучъьсЫˆŽ›Ѓ“‡˜ˆrЁБЖЕ*ВБЎЎ˜�Ѓшчь№єєёмЌ…‰‘™›™Š„r}ЅБВЎЌЊЈЋ}��{ђюѓ€ѕјъв’†‰‹Œ‹ˆ„tuЋЖАЌЈІЄЉX��<ыѓ€єѕііуЫ’ƒ†„{r}­ЙФКБЌЈЄЁ &��Иќѓ€єѕјісЯЉ‡zxxˆЏЩтиХЗЏЉЅЄ{�SњѕѓєѕѕјљѓфжТ­ІЇ­ТуэхеФЖ­ЇІ6‚�ЊџѓєѕієѕјєчжЧППХакхыфдУДВuƒ�"кќєіѕєїїђчйЫУСТШбмхщсвЦІ„�CюћіѕііїяфжШРНОУЪднхцтЭ4†�LьўєѕієырбХОКЛПФЬдоымCˆ�5ЬїэяьцлЬСЛИИЛПФЪтЗ.Š� xЗиоиЯХМЗДБДЙЛЅi� _ЇЧЬФОЗДЖЌŠK’�;OYWI1Љ�ˆ� 0Pgv}wgE‘� %]†˜ЃЈ­ЕТбиЯG�`Ž••—œЂЊДСЯпьљєЏ2Š�6…•Ž’—Є­ИЦзхюѕјџщbˆ�N ˜”˜žІЏМЬоъѓ€і§љq†�VХБž•“’•šŸЇВПбтю‚іћљl„�;окТЏŸ˜–—šЁЈДТдхёїї€іѕћѓF‚�ЗѓцйЦБЂ›šœЁЉГРдцєјїііѕєѕўЫ �ZрршшнЫЕІŸ›ЂЈЌЖЩйфіјїѕєєѕіќq€�ЂЯалцщсаЖ—€mhl}Івтѕј€єѕєѓШ ��;ФФЦЬжрчрМšcYdnpnhƒЩтііѕєє№ъцJ��qЪТХШЬгмЫВiev~†ˆ„tƒвъїѕѕѓяфу€��’ТПТЦШЬЩА~fx…Ž—›”Ž„ržкёєѓ№щоиЂ� ЅКЛПТХЪН kxƒ’fZŽ˜‹‚yХпыщцсибГЋЙЛПУЦЩНœs~Œš]��6˜ƒxЋвнмйдЭШД!ВПТЧЫЮЯЦЁ}ƒ’ 9�� Ž„xšХЯЮЫЧТОЏ ЗЪЮдймнгД‚„•Ёy��O–Œ„t˜МЩЦУПЛИІ ЗимтцщырЪˆŽ›Ѓ“‡šˆrŸМЪХIТПЛЗš �Ѕчць№ѓєёмЌ…‰‘™›™Š†t†ЏЩЬШЦТОН‚��{ёэѓєѕѕїъг’†‰‹Œ‹Š„vwВЫмгЬШХРТ]��<ыѓ€єѕііуЫ’ƒ†„|pp›МрчржЬЦТК*��Иќѓ€єѕјісаЉ†zwv–ЖасщцлаЮ–�SњѕѓєѕѕјљѓужТЌЃЂžšŸІЕЫншшрнE‚�ЊџѓєѕієѕјєхгПГЉЁœš›ЂБЦйцѓЄƒ�"лќєіѕєїїёхдТДЈЁš—–˜ŸЏТлд!„�Cюћіѕ€іютбПВЇŸš•’“•žВР;†�LьўєѕіѓъоЬМЏІž˜”Ž™š6ˆ�5ЬїэяыхзЦИ­Є—’Ž•x Š� zЗинжЫПГЉЁ™“’wI� _ІХЩНГЉЂžŽl9 ’�9NVSD,Љ�l8mk�������������+d‘­НН­‘c+������������������YЖѓџџџџџџџџєЗY���������������AРџџџџџџџџџџџџџџСB������������yѕџџџџџџџџџџџџџџџџі|���������’џџџџџџџџџџџџџџџџџџџџ ��������Šџџџџџџџџџџџџџџџџџџџџџџ������_ўџџџџџџџџџџџџџџџџџџџџџџўa�����#фџџџџџџџџџџџџџџџџџџџџџџџџф%����“џџџџџџџџџџџџџџџџџџџџџџџџџџ”���&ыџџџџџџџџџџэЯРРЯьџџџџџџџџџџь)��sџџџџџџџџџќЧœ•–––žЬ§џџџџџџџџџt�ИџџџџџџџџўП•‡‡Ž˜•ЭџџџџџџџџџИтџџџџџџџџйŽ”„……„–“цџџџџџџџџу7јџџџџџџџўЋˆ|WRx‰’Вџџџџџџџџљ9Jўџџџџџџџє–‘‚G8“™љџџџџџџџўKSџџџџџџџџю(��z€””іџџџџџџџџVJўџџџџџџџі“’‚ƒRC–™ћџџџџџџџўN8ѕџџџџџџџџЋŽŒ{~fb|{ŽŽЗџџџџџџџџљ; нџџџџџџџџс˜‡{}~|Š˜Œэџџџџџџџџщ! Бџџџџџџџџџд’’’Œ•”ˆжџџџџџџџџџФ �qџџџџџџџџџџчЉŽŽ‘Їфџџџџџџџџџџ��.уџџџџџџџџџџ§эооэ§џџџџџџџџџџю0��Œџџџџџџџџџџџџџџџџџџџџџџџџџџž��,зџџџџџџџџџџџџџџџџџџџџџџџџч/���`іџџџџџџџџџџџџџџџџџџџџџџћl����„ўџџџџџџџџџџџџџџџџџџџџў–�����ќџџџџџџџџџџџџџџџџџџ§Ÿ�������{юџџџџџџџџџџџџџџџџё„���������MМњџџџџџџџџџџџџњСO�����������aЕы§џџџџџџ§ьЗc�������������� =k–АННА•j= ������������������  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_hwtest.icns���������������������������������������������������������������������0000664�0001750�0001750�00000100756�10413427676�016142� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��юit32��Aо����џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�г�<yŠeoАь�Лfˆ™†f†ь�­fЧ‰Эflь�ЁgЭж†ёпЭgfь�žhЭй†ќхЭhcь�›iЭй†ћфЭibь�žjЭи†ћфЭjcь�žkЭи†њфЭkd‚��:‚W^VUTSSRRQPOONMMLKJJIHHGFEEDCCBAA@?>>=<;;::9876654432210//.-,,++*)(('&%%$##"! ‚�ЂlЭаи�щљуЭld‚� Wtt‚Ў­ЌЌЋЋЊЊЉЈЈЇЇІІЅЅЄЄЃЂЂЁЁ  Ÿžž€œ›šš ЅЄЃЃЂЁ Ÿž“’’‘‘€ ŽŒŒ‹ŠŠ‰‰ˆˆ‡€†……„ƒƒ‚‚€~~}}|€{?‚�ЂmЏƒЭ�у€љуЭme‚�Wt‚о€х„ф‚уƒтƒс‚рп ьљјїііѕєѓђёённ‚м„лƒк‚йƒи‚зƒжеH‚��Ф„oЕа€јтЭog‚�WtЋю„э‡ь‚ыˆъ€щ ёјіѓђё№яэьыъйи‚зƒж‚е‚дгƒв‚бааtƒ�‚fVRR]pЖЭ€їтЭph‚�WtЉŠї’і€ѕ іі№щчхуспнлйед‚г‚в€бтєŽѓ€ђщЬЫqˆ�@qЖЭ€ітЭqj‚�WsЇіѕ€є ѕѕюцфспнлиждвбаЯЮЭ�рŽђёчЧЧoˆ�_rЖЭ€ісЭrj‚�VrЅ€і�№€юˆэ†ь†ы ъяѓытрнлйждбЯ‚Э€ЬЫЪЩШнё‚№фТТlˆ�šsЗЭ€ѕсЭsj‚�UqЃ€ѕ�оедггŠєѓсЮЮ€Э рёшомйздбЯЬЪЪЩШЧ€ЦХФк№№ш€ЮЭ‚Ь€ЫцяяуООiˆ�нtЗЭ€єсЭtl‚�TpЁ€є�лв€б€аŽџ�хЪ Щн№хкиевЯЬЪЧФЦ€ХФУ€ТСРРзяяуПО€НМ€ЛсююсЙЙfˆ� uЗЭ€ѓрЭum‚�ToŸ€ѓ�и€Я€Ю€Э�ЬŽџ�у‚Ц кютжгаЭЪЧФСОТ€СР€П€О€Н€МЛеююс€К€Й€И€З€ЖпээпДДcˆ� vЗЭ€ѓрЭvn‚�Sn€ѓжЬЬ€ЫЪ�ЩŽџ�с€УТТзьпбЮЫШХТОЛИО€Н€МЛККЙ€ИЗвээпЖ€Е€ДГ€В БныымАЏ`ˆ� wИЭ€ђпЭwo‚�Rm›ђђёгЩ€ШЧЦЦŽџ�п€П ООдщмЬЩЦУПМИЕВЙ€И€ЗЖЖ€Е€Д€ГЯььнББ€А€Џ€Ў€­ ЌлъъкЋЊ]ˆ� xИЭ€ёпЭxp‚�Rl™€ёаЦХл„№ѓђ№‚ю очиШФСНЙЖВЏЋ€Е€Д€ГВВ€Б€А€ЏЎЬыылЌЋЋ€Њ€Љ ЈЈЇйщщиІЅZˆ�yИЭ€№пЭyp‚�Qk—€№ЮТТй№Šя…ю…э�У€ЕДДГ€ьЯВ€БАА€ЏЎЎ€­€ЌЋЋ€ЊЪъщйЈЈЇЇ€ІЅЅ€Є€ЃжшшжЁ W ˆ�zИЭ€№оЭzq‚�Pj•€яЫППзя†ю…э†ьРВ€БАА€ыЬЎ­­ЌЌ€ЋЊЊ€Љ€ЈЇЇ€ІЅЧшшз€ЃЂЂЁЁ€ €Ÿ žžдччдœ›U ˆ�{ИЭ€яоЭ{s‚� Oi“яяюШМЛд€ю�гв‚баЯЮЭЭ€ыНЎ­­ЌЌЋ€ъЪЉЉ€ЈЇЇІІ€ЅЄЄЃСонмлкйсшчтдвбаЯЮЭœ››šš€™вххб—–R ˆ�{ЙЭ€юоЭ{s‚� Oh‘юээЦИИв€эЖЕЕДД€ГВВ€БАЏЏ€Ў­­€Ќ€ъКЊЉЉ€Ј€щ�Ч€ЅЄЄЃЃЂЂ€Ё  ŸШ№яюьыъшчхфусрпнмл——––€• ”аффЯ’’O ˆ�|ЙЭ€юнЭ|t‚�Ng€эУЕДа€ь ВВББААЏЏЎЎ€­�Ќ€ЋЊЊ€ЉЈЈ€щЗЅЅ€Є�Ѓ€ш ФЁЁ  ŸŸžž€œ››ХяхйждбЮЬЩЧФСПМЙЖД’’‘‘€ ЮууЭŒK ˆ�}ЙЭ€энЭ}t‚�MfŒ€ьРББЮ€ыЎЎ­­ЌЌЋЋ€ЊЉЉЈЈЇЇІІ€ЅЄЄ€шГЁЁ  ŸŸччцСœœ››šš™™˜˜€—#–ТэпЯЬЩЦТПМЙЕВЏЌЉЅЂŒŒ‹‹ŠŠЬттЫ‡‡H ˆ�~ЙЭ€ьнЭ~v‚�Me‹€ыОЎЎЬ€ъЋЋ€ЊЉЈЈ€Ї�І€ЅЄЄЃЃЂЂЁЁ €чАžœœ›€цгРПООН€М#ЛдымЬШХСОЛИЕБЎЊЇЄ ‰‰ˆˆ‡‡††ЪсрЩ„ƒF ˆ�КЭ€ымЭw‚� LeˆыъъЛЋЊЩ€щЈР€ШЧЧ‚ЦХХ€ФУБžžœ€ц­š™™˜˜—х…ф„у"чъйЧФРНКЖГЏЌЈЅЁžš—„„ƒƒ‚‚ЧппЧ~~Cˆ�€КЭ€ымЭ€w‚�Kc†€щИЇЇЧщщшЄз‚ш…ч€цРšš™™˜€хЊ–•””““€ф…у…т"хшжУПМИЕБЎЊІЃŸœ˜”‘~~}}||ХооХyy@ˆ�$КЭ€ълЭx‚�Jb„€щЕЃЃХшчч е‚ч„цхО––••”€фІ‘‘Ž€ЭЬЫ‚Ъ€Щ"ицгОКЗГАЌЈЄЁ™•’ŽŠzzyyxwwvУннТtm"ˆ�$‚КЭ€щлЭ‚y‚� Ja‚шшчВ ŸУ€чдц…хфЛ’‘‘€уЃŒŒ‹‹Š€‰2ˆ‡‡††……„ƒƒ‚‚€ВфЯЙЖВЎЊІЂŸ›—“‹‡ƒuutssrrqСмлК< ˆ�$ƒЛЭ€шлЭƒz‚� Ia€ччцЏœœР€ц™вххО–••””“’’‘€уЙŽŒŒ€т<Ÿˆˆ‡‡††……„„ƒ‚‚€~~}}|{{ЏтЬДБ­ЉЅЁ™•‘‰…}poonnmmlПкЯ”ˆ�$„ЛЭ€шкЭ„|‚�I`}€цЌ˜˜Оххф•аффЛ’‘‘Ž€€тЖŠ‰ˆˆ‡€с-œ„„ƒ‚‚€€~~}||{{zyyxxwvvЋпШАЌЇЃŸ›—“Š†‚~zvkj€i hgaЌФС’ˆ�-…ЛЭ€чкЭ…}‚�H_{€хЉ•”М€ф‘ЯууЙŽŒŒ‹ŠŠ‰ˆ€сГ……„„ƒ€р<˜€~~}||{zzyyxwwvvuutssrršТЏœ˜•’Ž‹ˆ„~zwspmfeedcX6“СС’ˆ�-†ЛЭ€цкЭ†~‚�G^x€фІ‘Й€уЭттЖŠ‰‰ˆ‡‡†……„€рБ€€€п+•{{zzyxxwvvuttssrqqpponnmmlkjjiihggffeddccba€` K% “СР‘‰�-‡МЭ€цйЭ‡~‚�F]v€уЃŒЗ€тU‰ЫссГ†…„„ƒƒ‚€ппоЎ}||{zоон‘wvvuttsrrqppoonmllkkjiihhgffeddcbba``_^^]\\R4 ’РР‘Š�-ˆМЭ€хйЭˆ~‚�E\t€т ‰ˆД€с?…ЩррБ‚€~}||оонЋxxwvvнммrrqqpoonmmlkkjiihggfeedccbaa`__^^]\[€ZYS< ’РР‘‹�6‰МЭ€фйЭ‰€‚�E[q€с…„ВррпШппЎ~}||{zzyxx€нЉtssrqл…к‚й…из‚ж„евЭЦУУ‚ТСС‘РРŒ�6ŠМЭ€уиЭŠ‚� DZYзло™А€п}ЦооЌyyxxwvuuts€мІponnmƒк‚й‚и…зжеƒдЯЫЦУ‚Т€С‘РР�6‹МЭ€уиЭ‹‚‚� DYXеедwajЇ€оyФннЉuttsrrqpooллкЃkjjih‚й‚и‚з…ж€е€дзйизжгЯЪЦХХУТТСРПОТТ€СР‘РП�?ŒНЮ€уиЮŒ„‚�_CXWеддsRR’гжзfОммДŒŒ‹ŠŠ‚mlkjккй gfedd€€~~}||{{zyyxwwvvuuttsrrqpplЅуплздбЮЫШХТПМЙЖГБ87|СРРПП�?ОЮ€гбЮ„‚�BWV€дPsRQ‘гввLАвгджзийкОhggАтпмЬКЗДВЏЌ–]\[[ZYXWWVUTTSSRQPOOHB95)"}ндЫЧУПЛЗДАЌЈЄ œ™• d€РПП�?ŽПƒЯŽ…‚�AVU€д€џ�щ€вKАба?АJOQОснйждаЭЩХТІXXWVUUTSRQIFFB:93-' {лП š“Œ†€ysle_XQKDc€РПП�?Пƒа†‚�AUT€д€џ�щ€вJЏ€ба@ЯЋ??>ЕйФЌЃ›“Œ„|s`:991-,++*)('&%$#"! zйМœ•Žˆ{unhaZTMF@c€Р�ПП�HРƒа‡‚�@TSддг€џ�щ€вRIbjihgfЖЯЯЋ?>=ВжКš‡~ulbYI00.-,++*)('&%$#"! xзЙ—‘Šƒ~wpjc\VOHB;bРРП��ПП�HСƒб‡‚�?SRдгг€џVщввбHGFEDCBЌЯЯЋ>=<АгЕ“Šxoe\SMWVUTSSRQPPONMLLKJIHGGFFDDCCеЕ“Œ…ysle_XQKD=743yРПП��ПП�H‘Сƒб‘ˆ‚�>RR€г€џщвббGFEDCBAЋЯЯЊ=<;­аА„{rh_VLfЫ‚ЪЩШЧЦ‚ХЭгВŽˆ{ungaZSMF@92€Р€П��ПП�H’Тƒв’ˆ‚�>RQггв€џ�ш€бFEDCBA@ЋЯЯЊ<;:ЋЭЌ‡~ukbYOFa‚ЪЩШЧЦ‚ХФЬбЏŠƒ}wpjc\VOHB;4.РРП��ПП�H“Уƒг“Š‚�=QPгвв€џ�ш€бEDCBA@?ЋЯЮЉ;:9ЈЪЇxoe\RI@\ЪЩШЧЦ‚ХФФЫЯЌ…yrle^XQJD=70)Р‚П��ПП�Q”Уƒг”Š‚�<POгвв€џJшббаDCBA@??ЊЮЮЉ:98ІЧЂ{rh_ULC9:SSRQPOONMLSRRQQPPOLDCCBB@@?‡ЭЈ{ungaZSMF?92+%ƒ0��ПП�Q•Фƒд•‹‚�<ON€в€џ'шбааCBA@??>ЊЮЮЉ987ЃФžukbYOF<3++*)('&%$#"…?6oЫЅ}wpic\UOHB;4.' …�ПП�Q–Хƒд–‚�;NM€в€џ�ш€а#BA@??>=ЊЮЮЈ876ЁС™ne\RI?6-&*)('&%$#"!…?5(>3)&$! …�ПП�Q—Цƒе—Ž‚�:MLввбкбба#edc?>=<ЉЮЭЈ765„ТЃgjleT/($)('&%$#"! …?5 ‡�ПП�[˜Цƒж˜‚� :LKвббjFEŠааЯ >=<;ЉЭЭЇ6543ЬЫЫ}ЄЪЪЂ+*)('&%$#"! …?5 ˆ�ПП�[™Чƒж™‚�9KJ€бiEDŠа‚Я =<;:ЈЭЭЇ5432€Ы}ЃЪЪЂ*)('&%$#"! …?5 ‰�ПП�[šШƒзš‚�8JI€бhDD‰‚Я Ю<;:9ЈЭЭІ4321€Ы|ЃЪЪЂ)('&%$#"! …?4 Š�ПП�[›Шƒи›‘‚�07IHббаgDBSdc~ЯЮЮ;:98ЈЭЬІ3210ЫЫЪ{ЂЪЪЁ('&%$#"! …?4 ‹�ПП�dœЩƒиœ‘‚� 7HGбааgBA@??b€Ю :987ЇЬЬІ2100ЫЪЪ{ЂЪЩЁ'&%$#"! …?4 Œ�ПП�dЪƒй“‚�6GF€а€edcQ>a€Ю 9876ІЬЬЅ100/€Ъ,zЂЩЩ &%$#"! IGGFFNMMLLKKJG>=<;;:9887654432110›ПП�džЪƒйž”‚�5FE€аЯ†=`ЮЮЭ8765ІЬЬЅ00/-€Ъ zЁЩЩ %$#"! ‚ЦХФУ‚ТСР’П��dŸЫƒкŸ–‚�5EDаа‚Я…<`ЮЭЭ7654ІЬЫЄ0/-,€Ъ yЁЩЩŸ$#"! ЦХФУ‚ТСР“П��m Ьƒл —‚�4DDа‚ЯЮ…;_€Э6543ІЫЫЄ/-,+ЪЪЩxЁЩШŸ#"! €ЦХФУ‚ТСР”П��mЁЬƒлЁ—‚�?srqpooРккЃk†ккйhgfeЛииЛba``€з šИжжЗYYXWWVUU€дrQ Ѕ�mЂЭƒмЂ˜‚��b­џ І�mЃЮƒмЃ™‚��a­џ‚Ј�vЄЯƒнЄš‚��`­џ�Л�vЅЯƒоЅ›‚��`­џ�Л�vЅаƒоЅ›‚��_­џ� Л�vЇбƒпЇ›‚��_­џ� Л�ЈбƒпЈ‚��_­џ� Л�ЉвƒрЉŸ‚��^­џ� Л�ЊгƒсЊ ‚��^­џ� Л�ЋгƒсЋЁ‚�11kkjihhgfeedccba``_^]]\\[ZYYXWVVUTTSRRQPOONMMLKJJЛ�ˆЌдƒтЌЂђ�ˆ­еƒт­Ѓђ�ˆЎжƒуЎЃђ�ˆЏжƒфЏЄђ�‘АдƒфАЅђ�‘БЗ‚ЫСБžѓ��б„БЇ>џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�И�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�г�<yŠeoАь�Лfˆ™†f†ь�­fЧ‰Эflь�ЁgЭж†ёпЭgfь�žhЭй†ќхЭhcь�›iЭй†ћфЭib�^ЎЋрЊ�7�žjЭи†ћфЭjc€��Вф]�Щ€�žkЭи†њфЭkd€�І]ЎзaжееддгвббааЯЮЮЭЭЬЫЫЪЩЩШЧЧЦХХФФУТТСРРПООНММЛЛКЙЙИИЗЖЖЕДДГВВБААЏЏЎ­­ЌЋЋЊЉЉЈЇЇІІЅЄЄЃЃЂЁЁ ŸŸžœ››š]y€�ЂlЭаи�щљуЭld€�›]зџ ўў§§ќќћћњњљљ€ј їііѕѕєєѓѓђђ€ё№яя€юэььыъщщшчцххччццхфф€у�т€сррпоо€нмлл€кййииззжжееддггввбМЏЎ­]b€�ЂmЏƒЭ�у€љуЭme€�]з‚џƒў„§ƒќ„ћƒњљ јїііѕєѓђёё‚їƒіѕіƒѕ„є„ѓ‚ђ„ё№О­Ќ]S€��Ф„oЕа€јтЭog€�Š]з‡џ‚ў‰§…ќћ њјіѓђё№яэьыъ‚і„ѕ‚єƒѓƒђƒё‚№ƒяЮЌЋ]O�‚fVRR]pЖЭ€їтЭph€�‰]зџў†џў†§ њі№щчхуспнлйѕ„єѓƒђ�і’ћїээЬЋЊ]O†�@qЖЭ€ітЭqj€�‰]жўў…џў‡§ љѕюцфспнлижд‚є‚ѓђ‚ё№№ѕ‰ћ†њіыыЫЊЊ]O†�_rЖЭ€ісЭrj€�‰]е§§џџ…ўˆ§ˆќ‚ћ јѓытрнлйждбЯѓ‚ђё№я�ѕ„ћ‹њіщщЪЊЉ]O†�šsЗЭ€ѕсЭsj€� ‰]еќ§џўў§§‚ќћŽз�ц€і ѕѕєёшомйздбЯЬЪ€ђ‚ё€№‚я€юээєћњї№‚яƒю€э іљљѕшчШЉЈ]O†�нtЗЭ€єсЭtl€�‰]дћќ€ў�§ќћњњŽШ�пѕєђ№хкиевЯЬЪЧФёё‚№€я€ю‚э€ьѓњњі‚ъ€щш€ч єљљєцхЧЈЇ]O†� uЗЭ€ѓрЭum€�‰]дњћ€ў§ќќћњŽХ�нє ѓёютжгаЭЪЧФСО№€я‚ю€эь€ыъъђњњіщщ€ш‚чц хѓјјѓфуХЇІ]O†� vЗЭ€ѓрЭvn€�‰]гљћ€ў�ќћ€њ€љŽТ�лѓ ђяьпбЮЫШХТОЛИ€юэь€ыъ€щёљљѕ€ч€цхф уѓјјђттФІЅ]O†� wИЭ€ђпЭwo€�‰]вјњ€ўќћћ€њљ�јŽОиѓђђёёющмЬЩЦУПМИЕВээь€ыъщшшчч№љљєц€хфуут сђјїёррУЅЄ]O†� xИЭ€ёпЭxp€�‰]бјњ€ўћњњќў€§ƒэˆьєќќ€ћ ячиШФСНЙЖВЏЋ€ьыы€ъщ€ш€ч€цяљјѓфф€утсс€р пёїїёооСЄЄ]O†�yИЭ€№пЭyp€�‰]бїљ€ўћњњћ‰§†ќ†ћђяюю€э€њ�ѓ€ыъъ€щ€ш€ч€ц€хффюјјѓ€тсср€п€о №ііяммРЄЃ]O†�zИЭ€№оЭzq€�‰]аіј€ўћљљћˆ§†ќ‡ћёээ€ь�ы€њђъъщщ€ш€чцц€х€ф€утэјјђсрр€п€о€н€м яііякйОЃЂ]O†�{ИЭ€яоЭ{s€�‰]аѕї€ўњљјњ€§�њ€љƒјї€іƒѕєћћњ№ьь€ыъњљљёщшш€чцц€х€фущюэьыъщъьыщутсрпон€мллккйюііюизНЂЁ]O†�{ЙЭ€юоЭ{s€� ‰]Яєїўў§љјїњ€§іѕѕ€єѓѓ€ђ€ё№№€яюю€э€њяы€ъщщ€љ№чч€цххффуттщ№яюьыъшчхфусрпнмл€кйй€и юѕѕэжеЛЁ ]O†�|ЙЭ€юнЭ|t€� ‰]Юєіў§§љїїњ€§ѕѕєєѓѓ€ђёё№№яююээ€ь€њ�ю€щшшч€љяцххфф€утт€срршяхйждбЮЬЩЧФСПМЙЖДии€з жжеэєєьдгК  ]O†�}ЙЭ€энЭ}t€�‰]Юѓѕ€§ љїіљ§§ќєєѓѓђђ€ё№№яя€юээ€ьыыъ€њэшшччцц€љюффуу€тсс€рппоцэпЯЬЩЦТПМЙЕВЏЌЉЅЂжж€е ддгьєєыббИ Ÿ]O†�~ЙЭ€ьнЭ~v€�‰]Эђѕ€§јіѕљ€ќѓѓђђ€ё№№яяюю€эьь€ыъъщ€љьчч€ц�х€јѓюээ‚ьы€ъыымЬШХСОЛИЕБЎЊЇЄ еддгг€в ыѓѓъЯЯЗŸž]O†�КЭ€ымЭw€�‰]Эёє€§їѕєј€ќ�ђ‚і‚ѕ€єѓюъщщшш€љыц€хффƒј†їі№ъйЧФРНКЖГЏЌЈЅЁžš—вв€б ааЯъѓѓщЭЭЕž]O†�€КЭ€ымЭ€w€� ‰]Ь№ѓ§§ќієєј€ќёљ…ћ…њёщшшчч€љ�ъ€фуут†ї‡іяшжУПМИЕБЎЊІЃŸœ˜”‘аа€Я ЮЮЭщѓђшЫЪДœ]O†�$КЭ€ълЭx€� ‰]Ыяђ§ќќіѓѓї€ќ№ј„ћ‚њљ№ччццх€јщууттссё‚№яƒюъцгОКЗГАЌЈЄЁ™•’ŽŠ€ЮЭЬЬЫЫшђђчЩХЈœ›]O†�$‚КЭ€щлЭ‚y€�‰]Ыюё€ќ ѕђђїќќћяјћћ†њ‚љ№цххфф€ј чтссррпоонн€м�л€к,ййииззженфЯЙЖВЎЊІЂŸ›—“‹‡ƒЬЬЫЫЪЪЩЩчёёфВŸœ›š]O†�$ƒЛЭ€шлЭƒz€�‰]Ъю№€ќєђёі€ћюјћњѓьыыъъщщшшчљљјяхф€ујјїцррппо€н5мллккййииззжжееддлтЬДБ­ЉЅЁ™•‘‰…}ЪЪЩШШЧЧЦцёэеœ›š™]O†�$„ЛЭ€шкЭ„|€� ‰]Ъэяќќћѓё№ѕ€ћюїњњђыъ€щ�ш€чцљјјюу€тсјїїхпоонммллккййииззжее€д'гввйпШАЌЇЃŸ›—“Š†‚~zvШЧЧЦЦХХТпшчдœ›š™™]O†�-…ЛЭ€чкЭ…}€� ‰]Щьюќћћѓ№яє€ћьїњњђ€щшччццхх€јэттсрр€ї фнммллккййи€зжееддггвббааекЧДА­ЊІЃ œ™–’Œˆ…ХХ€Ф ПБЂечцг›š™™˜]O†�-†ЛЭ€цкЭ†~€�‰]Шыю€ћђяює€њыіњњёшшччцххффу€јьсрппо€і тллккййиззж€е0ддггвббааЯЮЮЭЭЬЬЫЫЪЩЩШШЧЧЦХХФФУУТКЋ  Ÿдццгš™™˜—]O†�-‡МЭ€цйЭ‡~€�‰]Чъэ€ћёээѓ€њъіњљ№ччцххффуттјјїыпоонн€іскййиззжжеддггввббаЯЯЮ€Э%ЬЫЫЪЪЩШШЧЧЦХХФФУУТСНВІЁ  Ÿžдццг™™˜——]O†�-ˆМЭ€хйЭˆ~€�‰]Чщь€ћ №ьыѓњљљщѕљљ№цх€футтср€їBъннммлііѕриизжжеддггввбааЯЯЮЭЭЬЬЫЪЪЩЩШШЧЦЦХХФУУТТСПЖЉЃЂЁ  Ÿžдццв™˜€—]O†�6‰МЭ€фйЭ‰€€� ‰]Цщыћћњяыыђ€љчєљљяффууттсрпп€іщмллккі‚ѕ†є‚ѓђ‡ё‚№яяюьъш‚чœгцхв˜—]O†�6ŠМЭ€уиЭŠ€� ‰]Цшчљљњюъъё€љчѓјјюуттссрппон€ішккййи‚ѕє‡ѓђ‚ё†№яэьъщ‚ш‚чцœ›гххв‚—]O†�6‹МЭ€уиЭ‹‚€�‰]Хчц€јщфхя€љхѓјјэтссрппонмм€ічйиззж…є‚ѓ‚ђ†ё№№яюэьышцфтсрроннмлкчцц›šвххв‚—]O†�?ŒНЮ€уиЮŒ„€�‰]Фцх€јчсры€ї сђјїяццххфтм€л ііѕцззжееммлк€й�и€з жжеддггввббаЯЯ€ЮЬиуплздбЮЫШХТПМЙЖГ€Б�Ы€цš™вххв‚—]O†�?ОЮ€гбЮ„€�‰]Фхф€ј црпыїііляѕѕƒі?ялкктщчфнздбЮЫЩЩбаЯЯЮЭЭЬЬЫЪЩЩШШЧЦХФФТПЛЙЕВЏЧндЫЧУПЛЗДАЌЈЄ œ™•ŸžТ€ц™™вххв‚—]O†�?ŽПƒЯŽ…€�‰]Уфујјї€I� €ікюѕєHьгддпснйждаЭЩХТУЯЮЭЭЬЬЫЪЩЩЦФФТПОМЙЗДГВББАЏЎХлП š“Œ†€ysle_XQKDžСццх™˜вххв‚—]O†�?Пƒа†€�‰]Туујїї€I� €ійю€ѕєIѓъаЯЮййФЌЃ›“Œ„|sƒЦХФСРПОНММЛКЙИЗЖЕЕДГВББАЏЎ­ФйМœ•Žˆ{unhaZTMF@œСцхх˜—вххв‚—]O†�HРƒа‡€�‰]Тут€ї€IM ііѕиноонмлюѓѓъЯЮЭзжКš‡~ulbYmТТРРПОНММЛКЙИЗЖЕЕДГВББАЏЎ­ЌУзЙ—‘Šƒ~wpjc\VOHB;œ›Р€х——вххв‚—]O†�HСƒб‡€�‰]Стс€ї€IM іѕѕизжедгвыѓѓъЮЭЭдгЕ“Šxoe\SkЭЬЬЫЪЪЩШШЧЦХХФУУТССРППОНММЛЩеЕ“Œ…ysle_XQKD=7Ў­Щ€х——вххв‚—]O†�H‘Сƒб‘ˆ€�‰]Сср€ї€I� €ѕзжедгвбыѓѓъЭЭЬваА„{rh_VLoя‚юэ‚ь‚ыъргВŽˆ{ungaZSMF@92ц‚х——вххв‚—]O†�H’Тƒв’ˆ€�‰]Ррпїїі€I�Ÿ€ѕжедгвббъѓѓщЭЬЫЯЭЌ‡~ukbYOFj€я‚юэ‚ь‚ы‚ъобЏŠƒ}wpjc\VOHB;4.ƒх——вххв‚—]O†�H“Уƒг“Š€�‰]Ппоїіі€I�Ÿ€ѕедгвббаъѓђщЬЫЪЭЪЇxoe\RI@eяя‚юэ‚ь‚ы‚ъщнЯЌ…yrle^XQJD=70)ƒх——вххв‚—]O†�Q”Уƒг”Š€�‰]Поо€і€I)ŸѕѕєдгвббаЯъђђшЫЪЩЪЧЂ{rh_ULC9WЪЪЩШЧЧЦХХФВВ€БААЏВНММЛККЙИФЭЈ{ungaZSMF?92+%ƒЋ——вххв‚—]O†�Q•Фƒд•‹€�‰]Оон€і€I'ŸѕєєгвббаЯЮщђђшЪЩШШФžukbYOF<3PНММЛКЙИЗЖЕ…r­ЌЋЊЊЉЈЇКЫЅ}wpic\UOHB;4.' …—вххв‚—]O†�Q–Хƒд–€�‰]Ннмііѕ€I�Ÿ€є#вббаЯЮЭщђђшЩШЧХС™ne\RI?6-KММЛКЙИЗЖЕЕ…rЌЋЊЊЉЈЇІЊЎЄ™–”’‹‰†„‚}{y…—вххв‚—]O†�Q—Цƒе—Ž€� ‰]НмліѕѕnllА€є#кййЯЮЭЭщђђчШЧЧФЫЌ‹~yundTMdМЛКЙИЗЖЕЕД…rЋЊЊЉЈЇІІЄЄЃЂЁ  Ÿžœ›š™™˜‡—вххв‚—]O†�[˜Цƒж˜€�‰]Млк€ѕожефєєѓ ЮЭЭЬшђёчЧЧЦХ€№йфяяуНММЛКЙИЗЖЕЕДГ…r€ЊЊЉЈЇІІЄЄЃЂЁ  Ÿžœ›š™™˜ˆ—вххв‚—]O†�[™Чƒж™€�‰]Лкй€ѕоедфє‚ѓ ЭЭЬЫшёёчЧЦХФ€№иуяятММЛКЙИЗЖЕЕДГВ…r€ЊЉЈЇІІЄЄЃЂЁ  Ÿžœ›š™™˜‰—вххв‚—]O†�[šШƒзš€�‰]Лйи€ѕндду‚ѓ!ђЭЬЫЪчёёцЦХФУ№№язуяютМЛКЙИЗЖЕЕДГВБ…r€ЉЈЇІІЄЄЃЂЁ  Ÿžœ›š™™˜Š—вххв‚—]O†�[›Шƒи›‘€�2‰]КииѕѕємдвжййпѓђђЬЫЪЩчёёцХФУТ№яязуююсЛКЙИЗЖЕЕДГВББ…r€ЈЇІІЄЄЃЂЁ  Ÿžœ›š™™˜‹—вххв‚—]O†�dœЩƒиœ‘€�‰]ЙизѕєємвббаЯи€ђ ЫЪЩШчёёхФУТТ€язтююсКЙИЗЖЕЕДГВББА…rЇІІЅЄЃЂЁ  Ÿžœ›š™™˜Œ—вххв‚—]O†�dЪƒй“€�‰]Йзж€єскййдЮж€ђ ЪЩШЧчё№хУТТС€я+жтююсЙИЗЖЕЕДГСРППОЎЎ­­ЌЌЋЋЎЗЖЖЕДДГВВБАЏЏЎ­ЌЌŽЋжххв‚—]O†�džЪƒйž”€�‰]Иже€єѓсЭж€ђЩШЧЧц№№хТТСРяяюетююрИЗЖЕЕДГВ‚ы‚ъ‚щш‚чц”х�в‚—]O†�dŸЫƒкŸ–€�‰]Иедєє‚ѓ!рЭеђђёШЧЧЦх№№хТСРПяююесюэрЗЖЕЕДГВБы‚ъ‚щш‚чц•х�в‚—]O†�m Ьƒл —€�‰]Зддє‚ѓђпЬеђёёЧЧЦХх№№фСРПО€ю дсээрЖЕЕДГВББ€ы‚ъ‚щш‚чц–х�в‚—]O†�mЁЬƒлЁ—€�‰]ЙпонммлчъъсийщщьеддгущшхаЯЮЮ€ч(йтццпШЧЧЦЦХФФххфЪРЊЊЉЈЇІІЅЄЃЂЁ  Ÿžœ›š™™˜š—]O†�mЂЭƒмЂ˜€�‰]Сƒџнввщџщввнџнввщџ€вщщввн…џ€вєџЊЉЈЇІІЅЄЃЂЁ  Ÿžœ›š™™˜š—“]O†�mЃЮƒмЃ™€�‰]Рƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ›pp‚o‚nmŸld]L†�vЄЯƒнЄš€�‰]Рƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ•Џ]YH‡�vЅЯƒоЅ›€�‰]Пƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ•]CЙ�vЅаƒоЅ›€�‰]Пƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ”]EЙ�vЇбƒпЇ›€�‰]Пƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ”]JЙ�ЈбƒпЈ€�‰]Оƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ“]MЙ�ЉвƒрЉŸ€�‰]Оƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ’]OЙ�ЊгƒсЊ €�‰]Нƒџнввщџщввнџнввщџ€вщщввн…џ€вєџ’]OЙ�ЋгƒсЋЁ€�5‰]ЅиззжееЬШЧЬбЫХФЦЮЮЭЭУРПФЩЩШЧЛЛКППИИКТСРППООНББАИКˆ]OЙ�ˆЌдƒтЌЂ€��АБ]�7Й�ˆ­еƒт­Ѓ�gUH­D�/К�ˆЎжƒуЎЃђ�ˆЏжƒфЏЄђ�‘АдƒфАЅђ�‘БЗ‚ЫСБžѓ��б„БЇ>џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�И�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�г�<yŠeoАь�Лfˆ™†f†ь�­fЧ‰Эflь�ЁgЭж†ёпЭgfь�žhЭй†ќхЭhcь�›iЭй†ћфЭibь�žjЭи†ћфЭjcь�žkЭи†њфЭkdь�ЂlЭаи�щљуЭld…��Ёjs}€|€{zzyyЊj�(…�ЂmЏƒЭ�у€љуЭme„�УЁа хљјїііѕєѓђёёЋа�4„��Ф„oЕа€јтЭog„��fЂп ьјіѓђё№яэьыъЋЫ�f…�‚fVRR]pЖЭ€їтЭph„��cЂё єі№щчхуспнлй’Ц�л’ёцЦЦcŠ�@qЖЭ€ітЭqj„��aЂ№ ѓѕюцфспнлижд’С�и’№фССaŠ�_rЖЭ€ісЭrj„��^€ю�хžс ыѓытрнлйждбЯ’М�е’ютММ^Š�šsЗЭ€ѕсЭsj„��\€э�ХžИ еёшомйздбЯЬЪ’ИвээуŒХуээрИИ\Š�нtЗЭ€єсЭtl„��Y€ь�СžГ в№хкиевЯЬЪЧФ’ГЯььнŒГнььнГГYŠ� uЗЭ€ѓрЭum„��W€ы�НžЎ ЮютжгаЭЪЧФСО’ЎЬыылŒЎлыылЎЎWŠ� vЗЭ€ѓрЭvn„��T€щ�ЙžЉ ЫьпбЮЫШХТОЛИ’ЉЩщщйŒЉйщщйЉЉTŠ� wИЭ€ђпЭwo„��R€ш�ЕžЄ ЧщмЬЩЦУПМИЕВ’ЄЦшшзŒЄзшшзЄЄRŠ� xИЭ€ёпЭxp„��P€чБŸŸУ„чŽе�о‚ч жчиШФСНЙЖВЏЋ’ŸУччеŒŸеччеŸŸPŠ�yИЭ€№пЭyp„��M€ц­ššР›ц�­ƒš€ц�Р“šРццгŒšгццгššMŠ�zИЭ€№оЭzq„��K€хЉ••Н›х�Љƒ•€х�Н“•НххбŒ•бххб••KŠ�{ИЭ€яоЭ{s„��H€уЅК€у•Й€у�Ѕƒ€у�КŒЕкйизжеочцраЯЮЭЬЫЪ…ЯууЯHŠ�{ЙЭ€юоЭ{s„��F€тЁŒŒЗ€т•Œ€т�ЁƒŒ€т�ЗŒŒО№яюьыъшчхфусрпнмл…ŒЬттЬŒŒFŠ�|ЙЭ€юнЭ|t„��C€с‡‡Д€с•‡€с�ƒ‡€с�ДŒ‡ЛяхйждбЮЬЩЧФСПМЙЖД…‡ЪссЪ‡‡CŠ�}ЙЭ€энЭ}t„��A€р™‚‚Б€р•‚€р�™ƒ‚€р�БŒ‚ИэпЯЬЩЦТПМЙЕВЏЌЉЅЂ…‚ШррШ‚‚AŠ�~ЙЭ€ьнЭ~v„��?€п–~~Ў€п•~€п�–ƒ~€п�ЧŒЏЮымЬШХСОЛИЕБЎЊЇЄ …~ЦппЦ~~?Š�КЭ€ымЭw„��<€н’yyЋ€нyŸЌ�’‚y€н�’ƒyнфъйЧФРНКЖГЏЌЈЅЁžš—…yФннФyy<Š�€КЭ€ымЭ€w„��:€мŽttЈ€мtТм�Ј‚t€м�ŽƒtмушжУПМИЕБЎЊІЃŸœ˜”‘…tТммТtt:Š�$КЭ€ълЭx„��8€лŠooЅ€лoРл�Ѕ‚o€л�ŠƒoРгцгОКЗГАЌЈЄЁ™•’ŽŠ…oРллРohŠ�$‚КЭ€щлЭ‚y„��5€к†jjЂ€кjОк�Ђ‚j€к�†–jЈфЯЙЖВЎЊІЂŸ›—“‹‡ƒ…jОккЗ6‹�$ƒЛЭ€шлЭƒz„��3€й‚eeŸ€йeМййŸ‡e€й�Ÿ‚e€й�‚–eЄтЬДБ­ЉЅЁ™•‘‰…}…eМйЮ‘�$„ЛЭ€шкЭ„|„��0€з~``œ€з`Кззœ‡`€з�œ‚`€з�~–` пШАЌЇЃŸ›—“Š†‚~zv„`ZЉТП�-…ЛЭ€чкЭ…}„��.€жz\\™€ж\Зж晇\€ж�™‚\€ж�z–\НЊ—”Š‡„}zwtpmj‚\P.ПП�-†ЛЭ€цкЭ†~„��+€еvWW–€еWЕее–‡W€е�–‚W€е�vЋWA€�ПП�-‡МЭ€цйЭ‡~„��)€дrRR“€дRГд䓇R€д�“‚R€д�rЈRH) ‚�ПП�-ˆМЭ€хйЭˆ~„��&€вnMM€вMБвв‡M€в�‚M€в�nЅMH1…�ПП�6‰МЭ€фйЭ‰€„��$€бjHH€бHЏбб‡H€б�‚HІбЯЩУ†П��ПП�6ŠМЭ€уиЭŠ…�ТШЭfCC‰€аC­аа‰‡C€а�‰‚CЃаЫЦС‰П��ПП�6‹МЭ€уиЭ‹‚…�€П4$}€Я>ЊЯЯ†‡>€Я�†‚>šЯведдгЯЬЧТССРППОНММƒП��ПП�?ŒНЮ€уиЮŒ„…�€П 0��`ПУЦ$ЃЮЮ–‚_�U9€Ю�ƒ‚9™^[œуплздбЮЫШХТПМЙЖГБ00w€П��ПП�?ОЮ€гбЮ„…�€П0��`€П �ПТУЦЧЩЫЬІ€4 šпмкФЏЌЉЇЄЁ„‘4.(�pндЫЧУПЛЗДАЌЈЄ œ™•��`€П��ПП�?ŽПƒЯŽ……�€П€��`€П�…П• АснйждаЭЩХТ›‡0'$$! …�oлП š“Œ†€ysle_XQKD��`€П��ПП�?Пƒа†…�€П€��`€П�…П�€� ІйФЌЃ›“Œ„|sT€ �”�nйМœ•Žˆ{unhaZTMF@��`€П��ПП�HРƒа‡…�€П€��`€П�$‚0›ПП€� ЃжКš‡~ulbY=˜�mзЙ—‘Šƒ~wpjc\VOHB;��`€П��ПП�HСƒб‡…�€П€��`€П„�ПП€� ЁгЕ“Šxoe\SD˜0„еЕ“Œ…ysle_XQKD=700w€П��ПП�H‘Сƒб‘ˆ…�€П€��`€П„�ПП€� ŸаА„{rh_VLc˜ПЪгВŽˆ{ungaZSMF@92ƒП��ПП�H’Тƒв’ˆ…�€П€��`€П„�ПП€� ЭЌ‡~ukbYOF^˜ПЩбЏŠƒ}wpjc\VOHB;4.ƒП��ПП�H“Уƒг“Š…�€П€��`€П„�ПП€� šЪЇxoe\RI@Y˜ПШЯЌ…yrle^XQJD=70)ƒП��ПП�Q”Уƒг”Š…�€П€��`€П„�ПП€� ˜ЧЂ{rh_ULC91‡0…p�`…0€ЭЈ{ungaZSMF?92+%ƒ0��ПП�Q•Фƒд•‹…�€П€��`€П„�ПП€� –ФžukbYOF<3 ‡�…џ�П…�gЫЅ}wpic\UOHB;4.' …�ПП�Q–Хƒд–…�€П€��`€П„�ПП€� ”С™ne\RI?6-‡�…џ�П…�3) …�ПП�Q—Цƒе—Ž…�€П ��`€П€0�ПП€� mО ~_dibO$‡�…џ�ПŸ�ПП�[˜Цƒж˜…�€П0��`ƒП�ПП�€П`ППŠ�…џ�ПŸ�ПП�[™Чƒж™…�€П0��`ƒП�ПП�€П`ППŠ�…џ�ПŸ�ПП�[šШƒзš…�€П0��`ƒП�ПП�€П`ППŠ�…џ�ПŸ�ПП�[›Шƒи›‘…�€П0��00T€П�ПП�€П`ППŠ�…џ�ПŸ�ПП�dœЩƒиœ‘…�€П�0‚��0€П�ПП�€П`ППŠ�…џ�ПŸ�ПП�dЪƒй“…�€П�T€0�0€П�ПП�€П`ПП…�‚0…p�`Ÿ0›ПП�džЪƒйž”…�„П`�0€П�ПП�€П`ПП…�АП��dŸЫƒкŸ–…�„П`�0€П�ПП�€П`ПП…�АП��m Ьƒл —…�„П`�0€П�ПП�€П`ПП…�АП��mЁЬƒлЁ—‚�� ƒ'…ЅЅf'BЅЅЉ'…ЅЅ‰'€Ѕf‰ЅЅ……'€ЅF'М�mЂЭƒмЂ˜‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�mЃЮƒмЃ™‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�vЄЯƒнЄš‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�vЅЯƒоЅ›‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�vЅаƒоЅ›‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�vЇбƒпЇ›‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�ЈбƒпЈ‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�ЉвƒрЉŸ‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�ЊгƒсЊ ‚��'ƒšgVVxšxVVgšgVVxš€VxxVVg…š€V‰šМ�ЋгƒсЋЁ‚�� ƒ''''€…'€"'М�ˆЌдƒтЌЂђ�ˆ­еƒт­Ѓђ�ˆЎжƒуЎЃђ�ˆЏжƒфЏЄђ�‘АдƒфАЅђ�‘БЗ‚ЫСБžѓ��б„БЇ>џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�И�t8mk��@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������аџџџџџџџџџџџџџс*�������������������������������������������������������������������������������������������������������������„џџџџџџџџџџџџџџџ­ ������������������������������������������������������������������������������������������������������������‰џџџџџџџџџџџџџџџг1������������������������������������������������������������������������������������������������������������ŽџџџџџџџџџџџџџџџмK!������������������������������������������������������������������������������������������������������������‘џџџџџџџџџџџџџџџрZ* ������������������������������������������������������������������������������������������������������������’џџџџџџџџџџџџџџџс`- �A‚ƒ„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„E��’џџџџџџџџџџџџџџџт`.2џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ` �’џџџџџџџџџџџџџџџт`.…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ› ’џџџџџџџџџџџџџџџт`.ŠџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ8’џџџџџџџџџџџџџџџт`.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛJiџџџџџџџџџџџџџџџт`.‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРQ$ ƒЛЩЮЮкџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ 8^v€‚Ѕџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ 8JQUˆџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$   $(kџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ � Zџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИS$ �����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљв{M!�����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаœ—”“““““““““““““““““““““““““““““““““““““““““““““‘„h>�����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭŠzqoooooooooooooooooooooooooooooooooooooooooooonk^F'�����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦoO=7777777777777777777777777777777777777777777775.!�����Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТ\3 ������Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������Tџџџџџџџџџт`.’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРS$ ��������������������������������������������������������Tџџџџџџџџџт`.[џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Q$��������������������������������������������������������Tџџџџџџџџџт`.vКШЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ­uH��������������������������������������������������������Tџџџџџџџџџт`.7\u€€u\7��������������������������������������������������������Tџџџџџџџџџт`. 7HQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQH7 ��������������������������������������������������������Tџџџџџџџџџт`. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ���������������������������������������������������������Tџџџџџџџџџг`- � ����������������������������������������������������������Иџџџџџџџѓ”Z* �����������������������������������������������������������������������������������������������������������������7dƒ’“““’‹sK!����������������������������������������������������������������������������������������������������������������� $F_looomfQ1������������������������������������������������������������������������������������������������������������������!.577771& ������������������������������������������������������������������������������������������������������������������  ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/os_netbsd.icns���������������������������������������������������������������������0000664�0001750�0001750�00000071233�11136612471�016070� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��r›it32��2����џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�Џ�€џƒ�џљїіјњѓјїѕєђ‚�џџк�€џ‚� џјїіѕѓє§џїђѓђќћєєѕїњј��џд�џ€�џљїїѕі€џќїѓѓєѓіќ†џїјїПв�џџП� ѕљїѕѕџџќѕѓѓє‚ѓ їџџќѓєѓєєђђ€ѕёєїїј№џџІ�џ€��џџœ�џ€�џѕіѕѕџџќ†ѓђљџџѕїєїѕŠ�џіЬЉ��џ€�џ”�џ�џјјѕіџџі‡ѓѕџџіїјђ‚�…џ�П€џЉ�x{wџ№§ї�‚џˆ�‚џПџ�џњјіѕўџќ‰ѓћџїїѕъ€�‚џŠ��џЅ� €�€z~M§џѕїјєџƒ�‡џ„��џіјџџї€ѓ�єƒѓєѓѓџџјїї��џџЬџ��„џА� Њ�z‡w�ђ§§џє€іјёъˆ� џџљѕіѕєєњџџљŒѓџ§јіџ…�џџ…�ПџџЌ�€�ƒ{~iџ§єѓѓћџџўѓ€єѓѓѕѕ€ѓ�ѕ€ѓ�є€џўїђ€ѓ�є‡ѓђіџїљњ��џљѕѕієєѕѓєѓєіјџ�€џЊ�U�y†z�№џђєѓєѓѓєјќ†џўћїѓ�єѓ ѕљјњіѕјіѕѕƒџ ќћћ§ќўџџћііјјџ€��џЉ�U�€||pџјѕƒѓєѓѓє›ѓєљіѓѕє€џ�љ‚ѓ�єѓј§џџ€ў€џіјї№Ћ�€�x…|�№џІѓђјџ§єƒѓєѓѓђћџџѕєєѕєєіѓіђђєѕњјіџџЈ�Њ�||xџіїЇѓ�єƒѓєѓѓќџїљџŠ�џџЊ�€�xƒ{�№џ­ѓђјџјјљѕџ�ƒџЊџџПџџ­�Њ�~||}џѓњЊѓђўџїјњ�џК�џ€x‚{�яџђЈѓџћїњю€�€џО�€�~}|�ёќЅѓѕџјјї€�ПџУ�џ€x{�ѓћєЂѓѕџїјљ��€џХ�€�}}|�яџ ѓіџ€ј��џЊЪ�‹x~zПђјѕѓіџїљј��џџЫ�€�{}}€�яџ›ѓіџїјі��џџЭ� џ�€y~zŽчѕљ—ѓ ђїџїјі��Пџа�€�{~~‚�юџ–ѓњџјљї��џџв� €�„z|yŽуѓћѓ�є€ѓџџјјѓ��џџе� Њ�y~}~�эџѓєŽѓ ќџїїљџ��Пџз� €�‡yzy™€ђџ€ѓ�є‡ѓїџџїіљљ€�џџк� U�z}~}�ьњі€џўќњљќў€џћѕјїњџ��€џм�U�€zyy†�ењїіѕѓєєѕѓєєѕјћџ�џџр�U�y|~z…�лџ„�€џу�U�€zxzŒ€Пџ�ƒџч�€�y{~{�€‚�џџю�Њ�~|wz…�€ѕ�€�yz~y�Њж��џƒ��џ†�џџƒ��џ‚�€�|~w{ƒ�€Ѓ�€Њ€€Uџš�џЊЊ€��џ”�џПyz~y�Њ‡�€U€‡�U€U†�џ€…�€€�UЊ€€‡��U€€„��€��€†��џ��џ„��Њƒ�€�}vz†�€Œ�ЊЊЖЊЖџ‚��€ƒ� €��Њ€€~€|‚‹†�ПЊŸЊЊе„��€�џ�{€z†� іѕєѓѓєєіѕёџџ€�џ�ёєєђђ€ѓѕєї�џ�џ™xy}z�U…�Žz{€y xzxyyzyxz}‚��€� €�€~{|†„††{y€{�z}yxzwyzyxyyxzz|€‚€� U�€�{€„‚|}…� ѓєѕџ§ќ§љџђ�џ€�џ�ъѓїѕџћ§ўіѕџ�џ�€�|†}€€�€„�B‹y{|{{y|yzwxƒ}|~{�€��€�}}zz||{zxƒy�x}~}{|z{xyzxx{…ƒ}y{}€�Uџ€~Œ€€~ˆ�і§€ѓѕњё�џ„�џііўѕˆ�Žƒ‚‹ƒ�џ‡�|}wwzyе��€|{ww}|‚�U€�||z{{Ё� {{x€��~~wwv{€€�џ‡}|}w{|}��}€“€…†c…� џеџшєѕѓѓђњї€џ�џџ�ѓџѕёЊџŽ��џƒ�)€�~}ww|x�U€��z}wv}x™€U�xw{�’UЊ€�|€w€U�{{€wx€€€�џ}{xvz}�z}‰€€mr†� џ�џѓјєѓѓђџѓ�џџ�џџѓџѓџ�џ‡�Њ€€џ��€„�€�vyww|y€� f�}{wwv|{��€x€w€€€�#€џx~ƒ��…zvwwyŽ�€��€€��~|xww‚{�~„}q‚†�џ�џѓїєљ€ѓџё�џ�џ�єџѓџ�џŒ�џ�нџ‚�€�zzww|y€�џ�‰wyvw~|��y~wv}€�€€�Њ�{~…��ŠzvwwyŠ�€‚�€�|vww~y~ƒƒ…‚†�џ�эѓјђѓџђѓѕўё�џ€�џ�єџђџџŒ�џ�№ћі�џ€�€�€zww|y‚�€w{ww€z��y€ww|{�€Њ‚� €�€�ŠzvwwyŠ�€ƒ� UЊx{ww{zЊ�}‚ˆ�џ�эѓіѓђїњђѓїљэ�џ��џ�єџѓ�џ€�€џ��€џ€�џџ�№њјђПеПџ�€�€zww|y€�џ€xyww{€��{~vwv~~��Њ€‚� €�ŠzvwwyŠ�€ƒ�€�|wwv{��€†�џ�эѓѕђ�эљїѓђљјя�џ�џ�єџѓ�џ�€џ„� џ�џ��ѕљљѓџ‚�€�€zww|y€fЊm�{~wv‚y�U�€xx€w~{„��Њ� €�ŠzvwwyŠ�€ƒ�€�€x€w}z�€€ˆ�џ�эѓѕ№џ�яџѕѓђўѕџ&�єџѓ�џџ��їјієїјі�џ�щјљїђіђѕіљё�Њ�€zww|y�$ƒ|z|{’џ€U�z€vwwv}{|€��€��€�ŠzvwwyŠ�€…�Пy{wwzx€Š�+џ�эѓѕ№�џ�ёџђєђџѕ�Пџ�єџѓ�џ�яјњџєєџџќѓ�ѓќџђђѓѓџ є�е�€zwvyx~†}y€z€~�€џˆ{{‚w~{}€�U�€�ŠzvwwyŠ�€„�€�x}€wx€�€ˆ�џ�эѓѕ№�€џBєџѓѓєџђ�п�єџѓ��ђљџќє№�ђљєџѓёџѓіѓѓѕѓєіїэ�€�€zwwvy†„†‡|u{€€x�€��€�z|~ƒw€|€�€€�ŠzvwwyŠ�€„� U�z~wwv{‚�Uˆ�џ�эѓѕ№�€џѓїњђѓєџѓ�€єџѓ�џє§ќє�ђўѕѕю�ѓџ€є�џ‚�€�€zwwxy€vyyz~v}|}�U��U�x}zv€wv}}€�f�ŠzvwwyŠ�€„� U�|~wwvz€�Uˆ�(џ�эѓѕ№�џ�џ�№њїђѓіћђ�ђџђ�ђџѓџєџџлђіњѓўєџѓџ€є јџџПџ�€�€zww|y�П}wwy€z�U��U��€|wv}y€U�ŠzvwwyŠ�€„�U�y~€wx|�€ˆ�џ�эѓѕ№�џ��џ�ёџєѓѓїљїѕџѓџђ§єђџѓѓђ‚џѓ�ѓџ€єј�џ€�€�€zww|yЊ@Њ€��z~vwxz|�€��€��™~{z€w v€|��ŠzvwwyŠ�€†�y|wwzx€Š�џ�эѓѕ№�џ€�џ�ђџђѓђ§єѕџєїѕєѓї€ѓ ѕѓѓєїјѕ�ѓџ€єј�џ€�€�€zww|y� Њ€€zvwvy€€�Њ��„}{€w }x��ŠzvwwyŠ�€ƒ� џ�‡xyvw}x�U‰�џ�эѓѕ№�џ€�џП�єџђєђљњџѓѓўѓѓљѓ‡�ѓџ€єј�џ€�€�€zww|yƒ�™xzww}x…�f�ƒ{zwwyx‰�‡zvwwyŠ�€ƒ�Њ�|€w|�€‰�џ�ѕѓћѕ�Њ�€џяіќѓџѓєџєѓќє†џ�ѓџ€єј�џ€�€�€zww|y‚� €�x}ww}x}w„�€�|vvyw‹�‡zvwwyŠ�€ƒ�€�zwwzx‡‹�џ�їєћё�џ‚�Њ�ѓњї€ѓ џєђќђѓџѓ�џ��џ€�ѓџєєѓј�џ€�€�€zww|x„� y|ww~y{Š‚�Њ�€€Šyxwyx•�‡zvwwyŠ�€‚� €€Œzywv|�ЊŠ�џ�ѓєўє�џƒ�џ�я§ѕѓѓџѓ№ѓїѓіљъ�џ �иѓ�ѓџєѓѕљџ �€�}yww{xџ€� џ€€xxwv{}ˆz�€ƒ� ’xzw~y��‡zv€wƒ�€� џf�{~vv€zџU‹�џџяљџђџеџƒ�џ�ѓџѓѓўє�єџѓђћјѓ� цјѓ�ѓџѓѓџђ�џ€�?ЊUyzwvyyˆЊ€Um�{~vwx|„z}}z�f€��ЊU…yxw€}�€‚zvww|}�m€€Њ€��|}vwz‰€џ�ѓџўѓ†�+џџ�єџђўє�ёћѕѓђќїѕєѓёљџѓ�ѓџѓѓќіџ�пы�џ�}wwv~}� ƒ|{ww‚y�€yx|ƒ�|~v€z€€�~}vww}|ƒ� ~{wz}‰�€Œ�шјїјѕјѕѕџ„�€џ№іљќѓ��ёџјѓђѓџџћџџё��єџ€ѓ љђђќє�’†|{€w6xz~{{|z|z|{�U€y~w{}‡��ˆ{x€|�€‚}|wwvwz||€|~|z‚~}|��€Œ�ѓќџџ§§€џѓџ�џ‚�џ�ђњџѓ�џ�ёљџџўћ§џћђ�џџпѓ€џAўџџіџx}‚ƒ}||~~€‡…ƒ†}yz}€�€U�{~|~…zxzx†{~€�z~€ƒ}||~††€……zz|~€�€Ž� іќїђєєѕєїѓџ…�%џ�яќё�џџ�№їїєєіјѕ�џ�џ�цљјєїљє��v}{‚|xx€}‚}y€}‰€��U�€€{zyyxz{}…��џ{~}‚|vv~}{ywx}|€ƒ’€��UЃ��џƒ��џ…��џ€��џ„�џџŽ�€€��€ˆ��U‘�UЊ‘�‡џˆ�€џ�џџП‚џ‚�„џ€�€€ЊUUƒ€ЊU€†�Њ€U€�€€�џ�€€ЊUU…€Њ€Ц�‚€џ�і�‡Š”ˆі� €�{yy|€�Uѓ� Њ�~}wvx�Uє� €�x|ww{‚�Uѓ� €�~~vv~z�Uє� €Њx|ww{{�Uѓ� €�}vv}y�€є� џ’xzwv}~�Њѓ� €�{wv}xџ€ѕ�€yzwv~€�Њѓ� €�|ww|x€€ѓ� џ�€zxvv~}�Њѓ� Њ�{ww{z€€ѓ� €�‰zwwvz�€ѓ� Њ�zwwzy™€ѓ� €�ƒzxww€|�€ѓ� U�ywwzxŽ€ѓ�U�€{€w|�€ѓ� U�x~wwyy’џѓ�Њ�€|€wy�€ѓ� €�x}vwxz†џџђ� Њ�€}vww€{�€ѓ� €џx|wvxy€�џђ�€�}~€wy�€ѓ� џ™y}ww„y�€ѓ�U�€{vyz€џџ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�‰�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�Џ�€@Uƒ�xsnj€aecfƒkps‚�@€к�џUU‚� pmihgfehj``d^fhefghmq��€е�€€€� џpkiffikjhfdd€eddegk€jknppkgjm€г�U@�vkigfkjg€d�e‚deikheffgjiiomkhijjllfЇ�џ€��€€�€€€� џmjggjkgdde„dfkifhhlpŠ�fqfЉ��€€�€€•�џU€U�xjjgfkie‡dejjfils‚��U€€U@€€UЉ�xzyUhns�U€U€Š�џ€U€@‚�Žqkhfikg‰dgkfikj€�U€U€Д� €�€z|™hsfikoПƒ�€U@€UU…�slihhgkif‰dcijhjt€�Uf�€U@€U€А�Њ�z‡y�ghhkefgjmjjˆ�џ€pli€fgkjfc‹dkihkЊ…�џџ…�@UџЌ�€�ƒ{|‡ijcddgjkieefghfijhfg€feeikjhecŒdekfir��€qkjhhgffigeffhiko�UUЋ�U�y†y�fi€d�e€dfhij‚kjjhge’dbhlrrijgffikkjiihgg€hijhegil‡€��џЉ�U�€|{ƒkh‡d�e‚d�e•d c€fgekkifdeed fhijiihjnphjjiЋ�€�x…y�hkЅdejfkh‡dcgjjeeg€h nhcfofijln€Љ�Њ�|{}shfЅdbce…dchk€gll’Š��mЋ�€�xƒy�hk­dcfkghkoП�€@€@‚U@€@­�Њ�~||}mffЊdchkgjo�UU€Л�џ€xƒx�kkcЈdjhimw€�@€П�€�~}|~�ghІdkgjn€�@€У�џ€xx�liЄdkfjo€��UЦ�€�}}|{�fj dekgkq��€UЪ�‹x~yПogedekfkx��U€Ы�€�{}}z�hk›dekgim��U€Э� џ�€y~xŽmgfe–d cfkgim��@€а�€�{~~}�jk–dgkhlw��Uџв� €�„z|yqŽfg“dijhjy��Uџе�Њ�y~}z�jjd cgkfim’��@џз� €�‡yzyˆ€gl€d�e‡deikghkm€��Uл�U�z}~y�jiekkjhhffghjkkhfikqџ��€Uн�U�€zyy†�€mjggfehhfgghko€�@€р�U�y|~z�€ƒ�ЖЖ…�€€у�U�€zxz‚€�Uƒ�U@€Uџч�€�y{~{�€ѕ�Њ�~|wz…�€ѕ�€�yz~y�Њѕ�€�|~w{ƒ�€Ѓ�€Њ€€Uџš�џЊЊ€Ї�џПyz~y�Њ‡�€U€‡�U€U†�џ€…�€€�UЊ€€‡��U€€„��€��€†��Ьƒ��џ†��П„��Њƒ�€�}vz†�€Œ�ЊЊЖЊЖџ‚��€ƒ� €��Њ€€~€|‚‹†�ПЊŸЊЊе„��€�џ�{€z†��y€efggffqџџ€�€�jgfefegd�€�џ™xy}z�U…�Žz{€y xzxyyzyxz}‚��€� €�€~{|†„††{y€{�z}yxzwyzyxyyxzz|€‚€� U�€�{€„‚|}…� €dhjhghfmg�€‚� jhhfjghihhtƒ�€�|†}€€�€„�B‹y{|{{y|yzwxƒ}|~{�€��€�}}zz||{zxƒy�x}~}{|z{xyzxx{…ƒ}y{}€�Uџ€~Œ€€~ˆ�li€deio�U„�€hejlˆ�Žƒ‚‹ƒ�џ‡�|}wwzyе��€|{ww}|‚�U€�||z{{Ё� {{x€��~~wwv{€€�џ‡}|}w{|}��}€“€…†c…�ЊU€h€eddghv€џ�UI�fjfnU€•�)€�~}ww|x�U€��z}wv}x™€U�xw{�’UЊ€�|€w€U�{{€wx€€€�џ}{xvz}�z}‰€€mrˆ� wefcddcjh�@‚�€џfmew�џ‡�Њ€€џ��€„�€�vyww|y€� f�}{wwv|{��€x€w€€€�#€џx~ƒ��…zvwwyŽ�€��€€��~|xww‚{�~„}q‚ˆ�€efjf€dlj�€�€�ingПŽ�€�fџ‚�€�zzww|y€�џ�‰wyvw~|��y~wv}€�€€�Њ�{~…��ŠzvwwyŠ�€‚�€�|vww~y~ƒƒ…‚ˆ� mefygjcdeji�€€�€�jndџ�f�ghd�€€�€�€zww|y‚�€w{ww€z��y€ww|{�€Њ‚� €�€�ŠzvwwyŠ�€ƒ� UЊx{ww{zЊ�}‚Š�meeQ€hgddehk�U��€�moe‚�U€€��@U€�џf�life@U@��€�€zww|y€�џ€xyww{€��{~vwv~~��Њ€‚� €�ŠzvwwyŠ�€ƒ�€�|wwv{��€ˆ�medi�mheddfhs�€�€�oof€��€…� €�U��ohfda‚�€�€zww|y€fЊm�{~wv‚y�U�€xx€w~{„��Њ� €�ŠzvwwyŠ�€ƒ�€�€x€w}z�€€Š�7medbџ�ikddcih€€џ€�oof��€��mighhjl�€�zlhfdfmnmnc�U�€zww|y�$ƒ|z|{’џ€U�z€vwwv}{|€��€��€�ŠzvwwyŠ�€…�Пy{wwzx€Œ�medb�U�ik€d/ki�@f�oof�U�sihpeejlih�gjkccddnpowg�€�€zwvyx~†}y€z€~�€џˆ{{‚w~{}€�U�€�ŠzvwwyŠ�€„�€�x}€wx€�€Š� medb�UUџgj€dlh�`�oof��rjihix�ohdoifofeddej€id�€�€zwwvy†„†‡|u{€€x�€��€�z|~ƒw€|€�€€�ŠzvwwyŠ�€„� U�z~wwv{‚�UŠ� medb�€€�yig€d kj�€ooh�Žfhhg� ghefˆ�fkddf…‚�€�€zwwxy€vyyz~v}|}�U��U�x}zv€wv}}€�f�ŠzvwwyŠ�€„� U�|~wwvz€�UŠ�7medb�€�U�niecdfhh�pog�gldjo€€mvhgdiiUckddfuUf@��€�€zww|y�П}wwy€z�U��U��€|wv}y€U�ŠzvwwyŠ�€„�U�y~€wx|�€Š�medb�€��€�jjeddeippqgџeidci€djljhqj�dkddfu�€€�€�€zww|yЊ@Њ€��z~vwxz|�€��€��™~{z€w v€|��ŠzvwwyŠ�€†�y|wwzx€Œ�medb�€€�€�hl€d hgymh{eddfjj‚k lif�dkddfu�€€�€�€zww|y� Њ€€zvwvy€€�Њ��„}{€w }x��ŠzvwwyŠ�€ƒ� џ�‡xyvw}x�U‹�[de_�€�@�gjddcgjhfmidch}‡�ekddfu�€€�€�€zww|yƒ�™xzww}x…�f�ƒ{zwwyx‰�‡zvwwyŠ�€ƒ�Њ�|€w|�€‰�€�vfhv�U�€�€hh€d cigmiddihfI‚U f€�ekddfu�€€�€�€zww|y‚� €�x}ww}x}w„�€�|vvyw‹�‡zvwwyŠ�€ƒ�€�zwwzx‡‹�€�wehk�U‚�U�nhf€d ifphcdkh�f…�ekddem�€€�€�€zww|x„� y|ww~y{Š‚�Њ�€€Šyxwyx•�‡zvwwyŠ�€‚� €€Œzywv|�ЊŠ�€�mdih�Uƒ�,@�jjeddif‡eedehq�fUUf�bm�ekddelџ€�џ�€�}yww{xџ€� џ€€xxwv{}ˆz�€ƒ� ’xzw~y��‡zv€wƒ�€� џf�{~vv€zџU‹�@UjgjiUU„�€�jlddhg�gjddgis� €kf�dkddjl�U€�?ЊUyzwvyyˆЊ€Um�{~vwx|„z}}z�f€��ЊU…yxw€}�€‚zvww|}�m€€Њ€��|}vwz‰€џ�kjih‡�*@�ijchg�mieddhghjphgmk�flddhi‡�€f�џ�}wwv~}� ƒ|{ww‚y�€yx|ƒ�|~v€z€€�~}vww}|ƒ� ~{wz}‰�€Œ�tohfehllџ„� €�xhfgf��gkf€d iihloh��jl€d gfgkg�m†|{€w6xz~{{|z|z|{�U€y~w{}‡��ˆ{x€|�€‚}|wwvwz||€|~|z‚~}|��€Œ� fiokhhjpkg€„�\U�jhod�@�hikjighjil�U�€fniihmljtx|‚ƒ}||~~€‡…ƒ†}yz}€�€U�{~|~…zxzx†{~€�z~€ƒ}||~††€……zz|~€�€Ž� hkpkddgole€…�U�fng�€U�xlgfeikp�U€�€kiehjp��v}{‚|xx€}‚}y€}‰€��U�€€{zyyxz{}…��џ{~}‚|vv~}{ywx}|€ƒ’€��UЃ��џƒ��U…��Uˆ��€�€€��€ˆ��U‘�UЊ’�€€U€€Uˆ�€UU‚�€@€€U€џƒ�ƒ€€�€€ЊUUƒ€ЊU€†�Њ€U€�€€�џ�€€ЊUU…€Њ€Ц�‚€џ�і�‡Š”ˆі� €�{yy|€�Uѓ� Њ�~}wvx�Uє� €�x|ww{‚�Uѓ� €�~~vv~z�Uє� €Њx|ww{{�Uѓ� €�}vv}y�€є� џ’xzwv}~�Њѓ� €�{wv}xџ€ѕ�€yzwv~€�Њѓ� €�|ww|x€€ѓ� џ�€zxvv~}�Њѓ� Њ�{ww{z€€ѓ� €�‰zwwvz�€ѓ� Њ�zwwzy™€ѓ� €�ƒzxww€|�€ѓ� U�ywwzxŽ€ѓ�U�€{€w|�€ѓ� U�x~wwyy’џѓ�Њ�€|€wy�€ѓ� €�x}vwxz†џџђ� Њ�€}vww€{�€ѓ� €џx|wvxy€�џђ�€�}~€wy�€ѓ� џ™y}ww„y�€ѓ�U�€{vyz€џџ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�‰�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�И� `*��I4 щ� †� р�џ „���‚� @й� Œ�   Ј�џ€Ї�џ ‹� Š�Њ��@Ѓ� Œ� К�xz{� !œ�U � +Л� €�€zzй €”� Ž� П�Њ�z‡y�€� +ˆ�џ � Њ…�џџЗ�€�ƒ{z­ƒ�  €� ����3 € Б�U�y†w�Љ�  ‹� -­�U�€|y•Ѕ�+/��€� Ћ�€�x…x�І� � � Њ�Њ�|{‡�Д� IŠ��Ћ�€�xƒv� Б�€Н�Њ�~||‚�­�Т�џ€xƒv�Њ� "Ф�€�~}|~�Ј�Ш�џ€xw�Ѕ�Ъ�€�}}|{�Ѓ� Ю�‹x~xП �#Я�€�{}}w� ž�б�џ�€y~wq$›�д�€�{~~x� ™� ж�€�„z|yU9•� $й�Њ�y~}w�’� Iл�€�‡yzywџ�п� U�z}~y�‰�џс�U�€zyy†�U &ц�U�y|~z�€ƒ�’’э�U�€zxz€€@ѕ�€�y{~{�€ѕ�Њ�~|wz…�€ѕ�€�yz~y�Њѕ�€�|~w{ƒ�€Ѓ�€Њ€€Uџš�џЊЊ€Ї�џПyz~y�Њ‡�€U€‡�U€U†�џ€…�€€�UЊ€€‡��U€€„��€��€†��™ƒ��џ†��П„��Њƒ�€�}vz†�€Œ�ЊЊЖЊЖџ‚��€ƒ� €��Њ€€~€|‚‹†�ПЊŸЊЊе„��€�џ�{€z†� $„� ƒ�џ™xy}z�U…�Žz{€y xzxyyzyxz}‚��€� €�€~{|†„††{y€{�z}yxzwyzyxyyxzz|€‚€� U�€�{€„‚|}…�4‚��„�€�ƒ�€�|†}€€�€„�B‹y{|{{y|yzwxƒ}|~{�€��€�}}zz||{zxƒy�x}~}{|z{xyzxx{…ƒ}y{}€�Uџ€~Œ€€~ˆ� �†�1� ˆ�Žƒ‚‹ƒ�џ‡�|}wwzyе��€|{ww}|‚�U€�||z{{Ё� {{x€��~~wwv{€€�џ‡}|}w{|}��}€“€…†c…�U��‚�;†��—�)€�~}ww|x�U€��z}wv}x™€U�xw{�’UЊ€�|€w€U�{{€wx€€€�џ}{xvz}�z}‰€€mrˆ�ƒ��†��"‰�Њ€€џ‡�€�vyww|y€� f�}{wwv|{��€x€w€€€�#€џx~ƒ��…zvwwyŽ�€��€€��~|xww‚{�~„}q‚ˆ�$ ‚�� …��€��ƒ�€�zzww|y€�џ�‰wyvw~|��y~wv}€�€€�Њ�{~…��ŠzvwwyŠ�€‚�€�|vww~y~ƒƒ…‚ˆ�$'�„��џ� ƒ�€�€zww|y‚�€w{ww€z��y€ww|{�€Њ‚� €�€�ŠzvwwyŠ�€ƒ� UЊx{ww{zЊ�}‚Š�$��&�ƒ���„�€�€zww|y€�џ€xyww{€��{~vwv~~��Њ€‚� €�ŠzvwwyŠ�€ƒ�€�|wwv{��€ˆ�$€��!‚��Ž�…�€�€zww|y€fЊm�{~wv‚y�U�€xx€w~{„��Њ� €�ŠzvwwyŠ�€ƒ�€�€x€w}z�€€Š�$� �M��‚�  €�, �� �U�€zww|y�$ƒ|z|{’џ€U�z€vwwv}{|€��€��€�ŠzvwwyŠ�€…�Пy{wwzx€Œ�$‚�� ‚����€� ���…��+�€zwvyx~†}y€z€~�€џˆ{{‚w~{}€�U�€�ŠzvwwyŠ�€„�€�x}€wx€�€Š�$‚�џ‚�� €������-��� €�!  �@�€zwwvy†„†‡|u{€€x�€��€�z|~ƒw€|€�€€�ŠzvwwyŠ�€„� U�z~wwv{‚�UŠ�$ƒ�$�  ����9�����3�€�=‚�€�€zwwxy€vyyz~v}|}�U��U�x}zv€wv}}€�f�ŠzvwwyŠ�€„� U�|~wwvz€�UŠ�$„�� ���€��$!€�� ‚�‚�€�€zww|y�П}wwy€z�U��U��€|wv}y€U�ŠzvwwyŠ�€„�U�y~€wx|�€Š�$…���џ„���� ‚�‚�€�€zww|yЊ@Њ€��z~vwxz|�€��€��™~{z€w v€|��ŠzvwwyŠ�€†�y|wwzx€Œ�$†�� ‚� #�!�� €   ‚�‚�€�€zww|y� Њ€€zvwvy€€�Њ��„}{€w }x��ŠzvwwyŠ�€ƒ� џ�‡xyvw}x�U—��‚��€�*‹�‚�€�€zww|yƒ�™xzww}x…�f�ƒ{zwwyx‰�‡zvwwyŠ�€ƒ�Њ�|€w|�€‹�…�0ƒ�€�‹�‚�€�€zww|y‚� €�x}ww}x}w„�€�|vvyw‹�‡zvwwyŠ�€ƒ�€�zwwzx‡�†�‚���‹�‚�€�€zww|x„� y|ww~y{Š‚�Њ�€€Šyxwyx•�‡zvwwyŠ�€‚� €€Œzywv|�ЊŒ� � ‡� �<€�ƒ� ‚�‚�€�}yww{xџ€� џ€€xxwv{}ˆz�€ƒ� ’xzw~y��‡zv€wƒ�€� џf�{~vv€zџU� �ˆ� €����M‚� ‚�?ЊUyzwvyyˆЊ€Um�{~vwx|„z}}z�f€��ЊU…yxw€}�€‚zvww|}�m€€Њ€��|}vwz‰€џ� ��‰��€���   ��<�@ €�}wwv~}� ƒ|{ww‚y�€yx|ƒ�|~v€z€€�~}vww}|ƒ� ~{wz}‰�€Œ�.�� џ†�-���� ‚�� �� ‚��m†|{€w6xz~{{|z|z|{�U€y~w{}‡��ˆ{x€|�€‚}|wwvwz||€|~|z‚~}|��€Œ��†��€� ‚� €�@ƒ�> x|‚ƒ}||~~€‡…ƒ†}yz}€�€U�{~|~…zxzx†{~€�z~€ƒ}||~††€……zz|~€�€� �� ˆ��- ‚�3 ��v}{‚|xx€}‚}y€}‰€��U�€€{zyyxz{}…��џ{~}‚|vv~}{ywx}|€ƒ’€��Uв�€€��€ˆ��U‘�UЊФ�€€ЊUUƒ€ЊU€†�Њ€U€�€€�џ�€€ЊUU…€Њ€Ц�‚€џ�і�‡Š”ˆі� €�{yy|€�Uѓ� Њ�~}wvx�Uє� €�x|ww{‚�Uѓ� €�~~vv~z�Uє� €Њx|ww{{�Uѓ� €�}vv}y�€є� џ’xzwv}~�Њѓ� €�{wv}xџ€ѕ�€yzwv~€�Њѓ� €�|ww|x€€ѓ� џ�€zxvv~}�Њѓ� Њ�{ww{z€€ѓ� €�‰zwwvz�€ѓ� Њ�zwwzy™€ѓ� €�ƒzxww€|�€ѓ� U�ywwzxŽ€ѓ�U�€{€w|�€ѓ� U�x~wwyy’џѓ�Њ�€|€wy�€ѓ� €�x}vwxz†џџђ� Њ�€}vww€{�€ѓ� €џx|wvxy€�џђ�€�}~€wy�€ѓ� џ™y}ww„y�€ѓ�U�€{vyz€џџ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�џ�‰�t8mk��@���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(CYвџ§џўџў{J0������������������������������������������������������������������������������������������������������� K|Љаьўџџџџџџў§ќџџ§ыЫš`$����������������������������������������������������������������������������������������������)bžвїџџџџџџ§ћ§ќћ§џџџџџџџџџџџм“=�����������������������������������������������������������������������������������������Q—г§џџџџќћћ§ў§ћќџџџџѓдБtaNLKJ]yšЈ‹B����������������������������������������������������������������������������1tКёџџџџћћ§ўџџўќ§џџџыЖxB������������� ��������������������������������������������������������������������������Hгџџџџќћ§ўџџџџ§ћџџџр™N�����������������������������������������������ОЎm������������������� 4pГщџџџџћќўџџџџџџќќџџђЈO ���������������������������������������������������������џџgџѓЙn.�������������;rЌрџџџџ§ћ§ўџџџџџџўќўџџжx!��������������������������������������������������������”џš�аџџџџйЈtF$ �����������)IrЪюџџџџўћќўџџџџџџџџџќџџџСV����������������������������������������������������������������)јќ"=џљћџџџџџћцбКЋ˜’““”ІБЦкюўџџџџџўћќ§ўџџџџџџџџџџџџџќЃ/�� +Jj‰ЄИУбизЧРЌ‘mE��������������������������������������������������ЅџЇ�Йџќў§ћћ§џџџџџџџџџџџџџџџџќћћќўџџџџџџџџџџџџџџўўэš8N‘Ух§џџџџџџџџџџџџџџџєа”N�����������������������������������������������4ћќ)&ќ§ўџџџџў§§ќћћћћћћћќќ§ўўџџџџџџџџџџџџџџџџџџџўћВ˜аџџџџџџќћћћћњљњўџџџџџџџџџџћЗ[�����������������������������������������������ГџГ�›џћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќћќ§ўџў§ћџџџџќрΘx]QB6<N_†œ‹:��������������������������������������������A§§1ѓ§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћ§ўџџџџ§ћўџџџз™Z(�����������������������������������������������������������РџК�{џћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќќџџџЭ|5�����������������������������������������������������Mџџ?уў§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўќўџџт7�����������������������������������������������������������������ЮўС�]џќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџџФ`���������������������������������������������������������������������YџџK�ЬџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџњЋA������������������������������������������������������������������������йўЬ�@џќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџєš.���������������������������������������������������������������������������fџџQ�Бџћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџє”$����������������������������������������������������������������������������� уўе'љ§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџэŠ$���������������������������������������������������������������������������������tџџ\�“џћџџџџџџџџџџџџџџџџџџџџџџџџџџџўћџџэˆ����������������������������������������������������������������������������������ъ§и ь§§џџџџџџџџџџџџџџџџџџџџџџџџ§ќџџэˆ��������������������������������������������������������������������������������������…џџh�vџћџџџџџџџџџџџџџџџџџџџџџўќќџџч‡���������������������������������������������������������������������������������������ё§м кўќџџџџџџџџџџџџџџџџџў§ћџџџзs�������������������������������������������������������������������������������������������“џџo�WџњўџџџџџџџџџџџџџўќћўџџњЗT��������������������������������������������������������������������������������������������$іўхФџќћћћќ§§§§ќќћћ§џџџџб~*�������������������������������������������������������������������������������������������������Ёџџt�5кўџџџџџџџџџџџџџэНz4�������������������������������������������������������������������������������������������������.њўщ�/^ŠЋХбрсеЩВ“i<��������������������������������������������������������������������������������������������������������Бџџ�������������������������������������������������������������������������������������������������������������������8ўўы���������������������������������������������������������������������������������������������������������������Оўџ‹������������������������������������������������������������������������������������������������������������������������Cџўё�������������������������������������������������������������������������������������������������������������������������Ъўџ‘��������������������������������������������������������������������������������������������������������������������Pџ§ї!����������������������������������������������������������������������������������������������е§џ˜�����������������������������������������������������������������������������������������������`џќј(��������������� �������������.NilT;��������� �����������RY2���������лѕуабаЯбЯ����$№ьеаббЯуэ!���� пћ§Ё�������� ™ИЙЪаеууьёялХЋ|;�������„иџџџџџџэПM†ЕЗТбамфц№ё№рЫЎŒ`+�����>œ‹rf��������XxЛџџџџџџˆ����� gšяџџџџГi ������mџџџ4������� ЕщџџџџџџлРЯџџџџџХ8����=сџџсs@LџџџР�ŽиџџџџџџњШРШуџџџџќЭr�Š3ƒgGq�����������m§њ§ќћћ5��������чћ§{��������� TVX%�����������ќљћ§н�� Іџљ§џі;�'ёџље����Yњћи��†ќљќќ§F���"dЪџџџџрZ�;ZЁ„=$��������іџ§џ§џи �����Їџњ%������������������������CџќќџЦ���Иџќњџг�ЖџїџU��oџъ4џ§ўџћ���rќќњџџ�0fž—8����������щџџ§џќџЎ�����„џц�������������������6џўќџШ�9џ§ў§џ:��$ќ§џў(��вџ!��2џўўџћ$���Qћќќћџ…�ˆY5 €����������ъџѕџ§џћџ‚������pџи�����������������������2џўќџШ��� ъџўћўc��TџћќџJ�����Yх��2џўўџћ#������wџќўњџGuk;����������ъџ;СџќџћџZ�����^џЫ����������������Tщ�����2џўќџШ���иџ§ћўd��cўћќџС������ ��2џўўџћ#������жџ§ќўм�-3�����������ыџфџ§ўќљ9����^џФ���������4єџ&��2џўќџШ��юџ§ћџ0��Sџќџќџš�������2џўўџћ#��������mџћџќџ[�������������ыџ'�8јќў§џц���^џХ������������Lэџј������2џўќџШ�Uџљњџ­��љ§ўџќџО4�����2џўўџћ#��������$њўўћўД�������������ыџ"�aџњџќџЬ �^џХ���=ŠСжП‘;��“џџ§џzORO��2џўќџЦ����'р§џџЕ�Њџњџџќџћš&�����2џўўџћ#��������мџ§§џх �������������ыџ"��’џћџћџ­��^џХ��Бџџїрџџџ–�§џўўџџџџџџ^��2џўўџь_PX‹эџ§ЇA��щџћџџќџџѕ‡ ���2џўўџћ#���������Нџќўџћ$�������������ыџ"�МџћџњџŒ��^џХ��&хџџ�Lѓћџ|pЌхџўўџКЁЃœ��2џўџџџџџџџџњўЇT����2щџћ§џўћџџб,��2џўўџћ#���������Ќџћџўџ7�������������ыџ"�рџ§џћџj�^џХ� бџћЕ����Фџћј�˜џњџќ������2џўўўђfAT|бџ§џџт^����$Оџџќўџўњџы,��2џўўџћ#���������Ћџћџўџ6�������������ыџ"���3іќўўћўL�dџЩ�rџіџ 'кћіќZ–џњџћ%��2џўќџШ����‡џњћџџm�����bкџџ§џџњџе �2џўўџћ#���������Бџћўџћ#�������������ыџ"����[џћџ§ўѓ KџФе§ќџџј№єџџџџџj�—џњџћ#�����2џўќџШ�Їџќќќ§)���� yіџ§џџњџi��2џўўџћ#���������Ьџќ§џх �������������ыџ"�����‰џћџ§џг“џН§џ§џУЋЎЌЇЅЅЅ�”џњџћ#�����2џўќџШ���.§ўџњџ‹������4пџ§џќ§С��2џўўџћ#��������юџўћўЖ��������������ъџ#�����ДџћџўџџџЛ?џќўџ+����������“џњџћ#�����2џўќџШ����пџ§ќўС��������%ь§§§џч �3џўўџћ#�������Aџ§џћџe��������������ѓџ4�����кџќџ§њџКDўќќџG�“џњџћ#�����2џўќџШ�����ФџќќџЛ^Љ�������mџќўџя�3џўўџћ#��������”џћ§§ь��������������їџ7�������,ђ§§џќџЛ9џўћџ‘��������“џњџћ#�����2џўќџЧ�����Яџќќў­ƒџ9����єџќџх �3џўўџћ#������эўўњџk���������������*ќџG��������RџћўќџУѕў§ўё$�� �“џњџ§(��1џўќџд��№џўћџz\ќО�����рџњ§М��3џўўџќ%������ џќњџЖ��������������Aџџa�������€џћќџЫ�Дџћ§џд*���� Э›�—џћќџN����;џ§ўџя�]џќ§ћџKџџw���єџљџZ�1џўў§џ=��mџњћџТ ����������������nџџ–����������ВџљџЫ�8џќ§§џђ•[RlЯџ>�“§ћќўФ��Vџћџќџf����!сћљўџ�.§ћџg�����‚џіџС�CџќџћџЁ������ ˆџњџџЊ ���������������� Lућћёh�������р§ќЦ��mџџћњџџџџџџl��YџјќћџрДэŸ�;Ьћћ§ћњђ€><wцџџџљ|�оџљџ•$��uњџџЩ� -Оћњ§ќњўЉH&)Iˆсџџџд[�����������������Aїџџџџџџџг �������<џџг��[фџџџџџџчa�РџџџџџџЎ@јџџџџџџџџџџџџџѓЯ,��Qоџџџџкеіџџь† �EѓџџџџџџџџџџџџџџџкЃO�����������������b[QEEJZaX���������qГH��aŸОРЏp��� wЗРЖ‚0��b[\PDFX^ptr_P9������ J‡АбрпЧš`��c\\PEEU`tttwvaD%�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"&%&��������������������������������������������������������������������������������������������������������������������������Г§љќє0�����������������������������������������������������������������������������������������������������������������������Eџ§ќџЎ�������������������������������������������������������������������������������������������������������������������������Чўћќ§7������������������������������������������������������������������������������������������������������������������������SџќќџИ������������������������������������������������������������������������������������������������������������������������гўќ§џ:������������������������������������������������������������������������������������������������������������������������`џќќџР�����������������������������������������������������������������������������������������������������������������������нўќќџE������������������������������������������������������������������������������������������������������������������������nџћќўФ���������������������������������������������������������������������������������������������������������������������� цў§ќџP������������������������������������������������������������������������������������������������������������������������{џћќўЮ����������������������������������������������������������������������������������������������������������������������яўўќџV������������������������������������������������������������������������������������������������������������������������‰џћќўи���������������������������������������������������������������������������������������������������������������������ѕўўќџ^������������������������������������������������������������������������������������������������������������������������–џћ§ўн ���������������������������������������������������������������������������������������������������������������������'њ§ўћџi������������������������������������������������������������������������������������������������������������������������Ѕџћ§ўп ���������������������������������������������������������������������������������������������������������������������2§§џћџs������������������������������������������������������������������������������������������������������������������������Дџћ§ўш����������������������������������������������������������������������������������������������������������������������>џ§џћџx������������������������������������������������������������������������������������������������������������������������Сџќ§ўэ����������������������������������������������������������������������������������������������������������������������Jџќџћџƒ�����������������������������������������������������������������������������������������������������������������������Ьўќўўя�����������������������������������������������������������������������������������������������������������������������Vџћџћџt����������������������������������������������������������������������������������������������������������������������мџќћџp������������������������������������������������������������������������������������������������������������������������LіћџЖ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icnV��� B№�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/boot_win.icns����������������������������������������������������������������������0000664�0001750�0001750�00000053550�10431655533�015735� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��Whit32��X����џПџПџПџПџПџПџПџПџПџПџПџПџПџПŒПГЄ—‡z‚y€ˆ•ЃЕшПНЏšˆvs{‘ЉНсПНЈ{”s|—КмПО­‘w™sv‘ЗиПЛœžswšМжП�–Ђs{ЈеП�ЄsЗвП�ЖІszНбП�ЁІs}ОбП�ŒІs�”бПМwІs�ЊПЛМЫП�ЌІsvЛ€ПБz}ЇЪП�”Іs�‰П�‘€sИШП�€Іs�ž€ПО{sxНžПОЌ•Џ П�ДЇs�Е€П�В„s|ЇОšПДšssvИŸП�Іs~О€П�œ†s} К•ПИŸ†usvМŸП�‰Іs�•П�†ˆswŽЇМŽПКЉ•…s�‹ŸПМvІs�Ќ€ПКu‹sw‡˜ЇБ…ПВЊŸ‘‚uˆs�ЂŸП�ЉІswМ€П�І“ss�ЗŸП�“Іs�ŒП�’Љs�‚ŸПО~Іs� €ПОyЉs�•ŸП�ГЇs�З€П�АЊs�ЌŸП�›Іs�€П�šЉszНŸП�‡Іs�—П�„Љs�ŒŸПЛuІs�Ў€ПЙuЉs�ЄŸП�ЇІsyМ€П�ЄЊs�ИŸП�‘Іs�П�Љs�„ŸПО|Іs�Ђ€ПОzЉs�šŸП�БЇs�И€П�ЎЊs�АŸП�™Іs�‚П�™Љs|ОŸП�…Іs�™П�‚Љs�ŸПКuІs�А€ПИtЉs�ЈŸП�ЅІszН€П�ЂЉsuКŸП�Іs�ށП�ŽЉs�†ŸПНzІs�Є€ПНyЉs�ŸП�БЇs�К€П�ЎЊs�ГŸП�—Іs�„П�—Љs�~ П�‚Іs�›П�€Љs�“ŸПЙtŠs{‚€›˜‡~Žs�В€ПЖtЉs�ЊŸП�Ђ†sxŠœЋКО‡ПКЋ™„tˆs|О€П� ЉsvМŸП�Žƒsƒ™ЏНПЖ›~†s�П�‹Љs�ŠŸПНysst‚›Е–ПОЊ„„s�Ї€ПНxЉs�Ё П™z–ВœПЊ…suЛ€П�ЌЉstЕЁП�О†ПОДЇ“…‡“šЃВО†ПОЃ{ss‡П�•Љs�€ЈПКЉ•†x‹sy‹ЁК…ПМ”~ЈП�€Љs�–ЅПЖ†u’su‰ЈО‰П�ЗЊs�ЌЂПЗ„™s€ІО‡П�Љs�wЁПЇ‰usЈ†П�ŠЉs�ŒŸПОЂsŠД„П�|Љs�ЄŸП�ДЄsvžО‚ПГ…ЇstЖŸП�žІs�ƒПОЃzЅs�„ П�ˆІs�”…ПИ”ЃsvЄŸПМvІs�Љ‡ПГtžsz–З П�ЊІsxНПЕОƒПВ’v™swІНЂП�“Іs�‹П—s†Д„ПЛŸ†u“s~ЇМЅП�~Іs� €ПЛvssu™Н…ПИЃ‘€‹sz‡”ЃДЈП�ВІstЖ€П�Ї‚s|ЇО‡ПМЏЃžƒ“ ЂЎКОЌП�ŸІs�П�’„sЇœПЖž„ŽЛ П�‰Іs�—П�|†sЙ•ПНЎ™‚t€s�™ŸПНuІs�­€П�Г‰su‰ЂДŽПК­›ˆx„s�ЊŸП�ЉІsyН€П�s}Œ›ЂЏАНГЏЈЁ•‹|u‡suМŸП�“Іs�П�‡Љs�Š П�Іs�Ѓ€ПКuЉs�žŸП�ГІsuЙ€П�ЇЊs�ГŸП�ŸІs�ƒП�“Љs�~ П�‡Іs�™€ПОzЉs�“ŸПМvІs�В€П�ВЊs�ЊŸП�ЊІs{О€П�›ЉsvЛŸП�“Іs�‘П�…Љs�‰ П�~Іs�Ј€ПЙuЉs� ŸПГtЅsuК€П�ЅЊs�ЕŸП�ŸІs�ˆП�‘Љs�€ П�ˆІs�€ПО{Љs�•ŸПНvІs�Д€П�ЎЊs�ЌŸП�ЈІs�П�šЉswМŸП�“Іs�•П�ƒЉs�Š П�|Іs�­€ПЗtЉs�ЃŸП�БІszН€П�ЂЊs�ЖŸП�Іs�П�ŒЉs�‚ П�‡Іs�Є€ПНxЉs�—ŸПЛuІs�Й€П�ЌЊs�ЎŸП�ІŒs|€ˆxŽs�„П�˜ЉsyНŸП�‘†sv†—ЇГ‡ПИЋ™„u‰s�šП�~Љs�Œ П�}ƒs‚—­МПИЁƒ‡s�Б€ПЕtЉs�ЃŸП�В€st›Е–ПЎŽtƒs|О€П� Њs�ИŸПЛ‰}˜Г›ПГ‹‚s�П�ŠЉs�ƒЂП�ОŸПЋ€€s�Ј€ПМwЉs�–ЦПМœv|Л€П�ЊЊs�­ШПЗКП�–ЉsxНЮП�Љs�ŽЮП�ДЊs�ЂЮПЗzЉs�ЗЯПИЇs�‚вПЊ€Ѕs�—гПНЁ}Ђs‹ЗеПЛЂ}s|˜ЖйПНЈ‰t—sz”­НоПИ‡wsw…šЏхПМЎœu†s{…’ŸАМюП�ОƒБ�ЗџПџПџПџПџПџПџПџПџПџПџПџПџПџП‘ПџПџПџПџПџПџПџПџПџПџПџПџПџПџПŒПГЄ—‡z‚y€ˆ•ЃЕшПНЏšˆvs{‘ЉНсПНЈ{”s|—КмПО­‘w™sv‘ЗиПЛœžswšМжП�–Ђs{ЈеП�ЄsЗвП�ЖІszНбП�ЁІs}ОбП�ŒІs�”бПМwІs�ЊПЛМЫП�ЌІsvЛ€ПБz}ЇЪП�”Іs�‰П�‘€sИШП�€Іs�ž€ПО{sxНžПОЌ•Џ П�ДЇs�Е€П�В„s|ЇОšПДšssvИŸП�Іs~О€П�œ†s} К•ПИŸ†usvМŸП�‰Іs�•П�†ˆswŽЇМŽПКЉ•…s�‹ŸПМvІs�Ќ€ПКu‹sw‡˜ЇБ…ПВЊŸ‘‚uˆs�ЂŸП�ЉІswМ€П�І“ss�ЗŸП�“Іs�ŒП�’Љs�‚ŸПО~Іs� €ПОyЉs�•ŸП�ГЇs�З€П�АЊs�ЌŸП�›Іs�€П�šЉszНŸП�‡Іs�—П�„Љs�ŒŸПЛuІs�Ў€ПЙuЉs�ЄŸП�ЇІsyМ€П�ЄЊs�ИŸП�‘Іs�П�Љs�„ŸПО|Іs�Ђ€ПОzЉs�šŸП�БЇs�И€П�ЎЊs�АŸП�™Іs�‚П�™Љs|ОŸП�…Іs�™П�‚Љs�ŸПКuІs�А€ПИtЉs�ЈŸП�ЅІszН€П�ЂЉsuКŸП�Іs�ށП�ŽЉs�†ŸПНzІs�Є€ПНyЉs�ŸП�БЇs�К€П�ЎЊs�ГŸП�—Іs�„П�—Љs�~ П�‚Іs�›П�€Љs�“ŸПЙtŠs{‚€›˜‡~Žs�В€ПЖtЉs�ЊŸП�Ђ†sxŠœЋКО‡ПКЋ™„tˆs|О€П� ЉsvМŸП�Žƒsƒ™ЏНПЖ›~†s�П�‹Љs�ŠŸПНysst‚›Е–ПОЊ„„s�Ї€ПНxЉs�Ё П™z–ВœПЊ…suЛ€П�ЌЉstЕЁП�О†ПОДЇ“…‡“šЃВО†ПОЃ{ss‡П�•Љs�€ЈПКЉ•†x‹sy‹ЁК…ПМ”~ЈП�€Љs�–ЅПЖ†u’su‰ЈО‰П�ЗЊs�ЌЂПЗ„™s€ІО‡П�Љs�wЁПЇ‰usЈ†П�ŠЉs�ŒŸПОЂsŠД„П�|Љs�ЄŸП�ДЄsvžО‚ПГ…ЇstЖŸП�žІs�ƒПОЃzЅs�„ П�ˆІs�”…ПИ”ЃsvЄŸПМvІs�Љ‡ПГtžsz–З П�ЊІsxНПЕОƒПВ’v™swІНЂП�“Іs�‹П—s†Д„ПЛŸ†u“s~ЇМЅП�~Іs� €ПЛvssu™Н…ПИЃ‘€‹sz‡”ЃДЈП�ВІstЖ€П�Ї‚s|ЇО‡ПМЏЃžƒ“ ЂЎКОЌП�ŸІs�П�’„sЇœПЖž„ŽЛ П�‰Іs�—П�|†sЙ•ПНЎ™‚t€s�™ŸПНuІs�­€П�Г‰su‰ЂДŽПК­›ˆx„s�ЊŸП�ЉІsyН€П�s}Œ›ЂЏАНГЏЈЁ•‹|u‡suМŸП�“Іs�П�‡Љs�Š П�Іs�Ѓ€ПКuЉs�žŸП�ГІsuЙ€П�ЇЊs�ГŸП�ŸІs�ƒП�“Љs�~ П�‡Іs�™€ПОzЉs�“ŸПМvІs�В€П�ВЊs�ЊŸП�ЊІs{О€П�›ЉsvЛŸП�“Іs�‘П�…Љs�‰ П�~Іs�Ј€ПЙuЉs� ŸПГtЅsuК€П�ЅЊs�ЕŸП�ŸІs�ˆП�‘Љs�€ П�ˆІs�€ПО{Љs�•ŸПНvІs�Д€П�ЎЊs�ЌŸП�ЈІs�П�šЉswМŸП�“Іs�•П�ƒЉs�Š П�|Іs�­€ПЗtЉs�ЃŸП�БІszН€П�ЂЊs�ЖŸП�Іs�П�ŒЉs�‚ П�‡Іs�Є€ПНxЉs�—ŸПЛuІs�Й€П�ЌЊs�ЎŸП�ІŒs|€ˆxŽs�„П�˜ЉsyНŸП�‘†sv†—ЇГ‡ПИЋ™„u‰s�šП�~Љs�Œ П�}ƒs‚—­МПИЁƒ‡s�Б€ПЕtЉs�ЃŸП�В€st›Е–ПЎŽtƒs|О€П� Њs�ИŸПЛ‰}˜Г›ПГ‹‚s�П�ŠЉs�ƒЂП�ОŸПЋ€€s�Ј€ПМwЉs�–ЦПМœv|Л€П�ЊЊs�­ШПЗКП�–ЉsxНЮП�Љs�ŽЮП�ДЊs�ЂЮПЗzЉs�ЗЯПИЇs�‚вПЊ€Ѕs�—гПНЁ}Ђs‹ЗеПЛЂ}s|˜ЖйПНЈ‰t—sz”­НоПИ‡wsw…šЏхПМЎœu†s{…’ŸАМюП�ОƒБ�ЗџПџПџПџПџПџПџПџПџПџПџПџПџПџП‘ПџПџПџПџПџПџПџПџПџПџПџПџПџПџПŒПГЄ—‡z‚y€ˆ•ЃЕшПНЏšˆvs{‘ЉНсПНЈ{”s|—КмПО­‘w™sv‘ЗиПЛœžswšМжП�–Ђs{ЈеП�ЄsЗвП�ЖІszНбП�ЁІs}ОбП�ŒІs�”бПМwІs�ЊПЛМЫП�ЌІsvЛ€ПБz}ЇЪП�”Іs�‰П�‘€sИШП�€Іs�ž€ПО{sxНžПОЌ•Џ П�ДЇs�Е€П�В„s|ЇОšПДšssvИŸП�Іs~О€П�œ†s} К•ПИŸ†usvМŸП�‰Іs�•П�†ˆswŽЇМŽПКЉ•…s�‹ŸПМvІs�Ќ€ПКu‹sw‡˜ЇБ…ПВЊŸ‘‚uˆs�ЂŸП�ЉІswМ€П�І“ss�ЗŸП�“Іs�ŒП�’Љs�‚ŸПО~Іs� €ПОyЉs�•ŸП�ГЇs�З€П�АЊs�ЌŸП�›Іs�€П�šЉszНŸП�‡Іs�—П�„Љs�ŒŸПЛuІs�Ў€ПЙuЉs�ЄŸП�ЇІsyМ€П�ЄЊs�ИŸП�‘Іs�П�Љs�„ŸПО|Іs�Ђ€ПОzЉs�šŸП�БЇs�И€П�ЎЊs�АŸП�™Іs�‚П�™Љs|ОŸП�…Іs�™П�‚Љs�ŸПКuІs�А€ПИtЉs�ЈŸП�ЅІszН€П�ЂЉsuКŸП�Іs�ށП�ŽЉs�†ŸПНzІs�Є€ПНyЉs�ŸП�БЇs�К€П�ЎЊs�ГŸП�—Іs�„П�—Љs�~ П�‚Іs�›П�€Љs�“ŸПЙtŠs{‚€›˜‡~Žs�В€ПЖtЉs�ЊŸП�Ђ†sxŠœЋКО‡ПКЋ™„tˆs|О€П� ЉsvМŸП�Žƒsƒ™ЏНПЖ›~†s�П�‹Љs�ŠŸПНysst‚›Е–ПОЊ„„s�Ї€ПНxЉs�Ё П™z–ВœПЊ…suЛ€П�ЌЉstЕЁП�О†ПОДЇ“…‡“šЃВО†ПОЃ{ss‡П�•Љs�€ЈПКЉ•†x‹sy‹ЁК…ПМ”~ЈП�€Љs�–ЅПЖ†u’su‰ЈО‰П�ЗЊs�ЌЂПЗ„™s€ІО‡П�Љs�wЁПЇ‰usЈ†П�ŠЉs�ŒŸПОЂsŠД„П�|Љs�ЄŸП�ДЄsvžО‚ПГ…ЇstЖŸП�žІs�ƒПОЃzЅs�„ П�ˆІs�”…ПИ”ЃsvЄŸПМvІs�Љ‡ПГtžsz–З П�ЊІsxНПЕОƒПВ’v™swІНЂП�“Іs�‹П—s†Д„ПЛŸ†u“s~ЇМЅП�~Іs� €ПЛvssu™Н…ПИЃ‘€‹sz‡”ЃДЈП�ВІstЖ€П�Ї‚s|ЇО‡ПМЏЃžƒ“ ЂЎКОЌП�ŸІs�П�’„sЇœПЖž„ŽЛ П�‰Іs�—П�|†sЙ•ПНЎ™‚t€s�™ŸПНuІs�­€П�Г‰su‰ЂДŽПК­›ˆx„s�ЊŸП�ЉІsyН€П�s}Œ›ЂЏАНГЏЈЁ•‹|u‡suМŸП�“Іs�П�‡Љs�Š П�Іs�Ѓ€ПКuЉs�žŸП�ГІsuЙ€П�ЇЊs�ГŸП�ŸІs�ƒП�“Љs�~ П�‡Іs�™€ПОzЉs�“ŸПМvІs�В€П�ВЊs�ЊŸП�ЊІs{О€П�›ЉsvЛŸП�“Іs�‘П�…Љs�‰ П�~Іs�Ј€ПЙuЉs� ŸПГtЅsuК€П�ЅЊs�ЕŸП�ŸІs�ˆП�‘Љs�€ П�ˆІs�€ПО{Љs�•ŸПНvІs�Д€П�ЎЊs�ЌŸП�ЈІs�П�šЉswМŸП�“Іs�•П�ƒЉs�Š П�|Іs�­€ПЗtЉs�ЃŸП�БІszН€П�ЂЊs�ЖŸП�Іs�П�ŒЉs�‚ П�‡Іs�Є€ПНxЉs�—ŸПЛuІs�Й€П�ЌЊs�ЎŸП�ІŒs|€ˆxŽs�„П�˜ЉsyНŸП�‘†sv†—ЇГ‡ПИЋ™„u‰s�šП�~Љs�Œ П�}ƒs‚—­МПИЁƒ‡s�Б€ПЕtЉs�ЃŸП�В€st›Е–ПЎŽtƒs|О€П� Њs�ИŸПЛ‰}˜Г›ПГ‹‚s�П�ŠЉs�ƒЂП�ОŸПЋ€€s�Ј€ПМwЉs�–ЦПМœv|Л€П�ЊЊs�­ШПЗКП�–ЉsxНЮП�Љs�ŽЮП�ДЊs�ЂЮПЗzЉs�ЗЯПИЇs�‚вПЊ€Ѕs�—гПНЁ}Ђs‹ЗеПЛЂ}s|˜ЖйПНЈ‰t—sz”­НоПИ‡wsw…šЏхПМЎœu†s{…’ŸАМюП�ОƒБ�ЗџПџПџПџПџПџПџПџПџПџПџПџПџПџП‘Пt8mk��@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/boot_linux.icns��������������������������������������������������������������������0000664�0001750�0001750�00000066011�10431655533�016273� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��l it32��+љ����џПџПџПџПџПџПЋПРТ‚ФУТС№ПРУФМАœ•––•АИТФСьПФПЃ“}ronoqy†ДТРшПРУЈ‡nnq…sqpnsПФцПСОoo‹srnЈУРуПСП‡msppПСсПРН‡nsqnpsrlŠПРрПФ–ls q‚Ѓossl—ФпПСИwrs m—ЫС‹qsrrБТоПУ–nŽs qЉТВЁrssnŒФнПРМ|psq}Ў„pqsrАТмПТЏqsrpƒso‚ОРлПТАq™soЌТлПУo™sn”УлПФ•n™sqПРкПФ–n€sror†s�o€nor„sq}НРкП Ф–nssou‡uoƒsrpŽЄЃž‰vq„sqЎТкП Ф–nsq€БФГ‰q‚sq€ФУХЌvqƒspЎТкП Ф–nrwЗФПУОzq€s oŽХППСРПЦЁnƒspЈТкПФ–nnЦТРТФ”nssrtГ€ТГМУРО~q‚sn’ФкПФ•nnšП‹}™ФЗwrsnŒФСЕ‹vЈТФ–n‚sn“ФкПТЉppАi•~ІФ€qsn‘ХТ†juЄ‰ЌЦЇo‚sn“ФкПТАqpА‰m…ŠТqsn‘ЧГtrp€›’ЦИwrsn“ФкПТЏqpБˆnw—„У~lok…ХЅn€sw“ЦЙwrsn“ФкПТЏqoЂkrm‰Ф­ЁЄ˜—ТЕtqssl•ЦКwrsn”ФкПТЏqp…П‘n„”ІСТФІ’ЖС‰npsrАШЖtrsoТкПТЏqsoЁЉ‡Л™ЖОНОИЇЗПКІƒorГŽo‚sq{НРйП ТЏqsptЛРРО€Н ОРОНОСОІ‚nnoƒsq|НРйПТЏqqxЉППŠНСНБЃyrƒsrЎТйПТБsnŸФНПУУЌrƒspЊУйПРП€nБУŒНСЖЇПКxr‚spЎУйПРП€nБСˆН ОСПВ}„ТЊqssq€spСйПРП€pn{ЗС„НОССЗЂ‰˜ОС—oss~qrsqwМРиПРПpso~ЗУРТТИЃ‹‡“ЊПЧСЖvrrtƘoospЄХиП РР†psso|˜Ћ€Њ•‰zŠЂЛФЦЎŒДЙvrsoШЌˆsq}ЛРиПФœnqprx}o€pz‘­ТФТДpyИУ†osqxЖЩФƒpm–ФиП%Уn~mИДБААМУХПБ“pyІМСУŸmssp{ЋЕvrrwИСжП&СЙwm•П|m‚­УХФСКЁ‡no˜ЛФРПСЗwqsspt{qssmŸХжП֘nožШЈqpp‘Ÿž‹}nj|ЊХСПУЂo€srq€srwБТдПУІsquЕТУˆnsonnoor‹ЙФ„ПУ‰o…smŠУгПТЗvqoŽФПСИ~ossrnsЈФС…ПТЗxq„srqЌУвПФŠnsoЉУППУИ~lnr„ЉФˆПХn…sp~НРаПФЈrrnУПУЗ  ЌТТ‰ПТЎr†sn•ФЯПТАsrrtДТ‚ПСФФТŒПУ‰o†sqЎУЮПТ‰nso‘Ф–ПФЂn†so†РСЬПХЃnsrrБТ–ПСЗwr€s�r‚sn‹РРЪПУ­uqsp‚Р˜ПФ‘nssuuq‚smФРШПТМ|ossp†У˜ПФšnssu”xq‚soЁУЧПСМ„o€sp„С˜П ТЎnssq€uqsrpАУЦПУ’lsruЕС—П РН…osso‚ІtqsoСРФПУЋprp€srrДС˜П СМ|psso“Љr‚sm”УФП Тˆm|qsso˜СšПФ n€snЎnsrtЕТТП СЕvl—šnsp~РРšП РН}qssoˆВrrsn’ФТП Ф™l|­|qsqЊУœПФ n€sp­nsruЕСРП РНn„ƒpso‰УП РН|qssoŒЋr‚sn’ФРП УЉosqqssqЎТžП Ф“nssrvК…osrvИРППФ‘nsoŠТŸП ТГsrssnЅЈosrsВТОПСИxr€srqЎТŸП РН}qssoŠТ~qso•ФОПФ•nspРР П Фossq|РŽosq|ОРМПРЛyqsn—ФЁПУЂo€spЎЁn‚soЃФМПУЉp‚srЏТЁПУЄo€snšЈo‚soŠТМПФ‘or€sp€ПРЁПТЉq€sp„Жursq|ОРКП РЙyo†~qsn’ФЂП РКxrsspС„p‚soЃУКП Ф˜npЃ‚qsoІУЂП РКwrssqxЛ‰o‚sn‘ФЙП СКxpvЗ€qqzЛСЃПСˆp€spЏ‰o‚sq}НРИП У—nrwЏzrq~ПРЃПУŽo€srГŠoƒsqЎТЗП ТАqrryЂpsq}ОРЃП УosspНpƒsqЋТЗП УŒosrxБyrq}ОРЃП УosspДtrƒsn–ФЖП ТЏrrssqЌˆpq}ОРЃПУŒossmŸЂo„sn”ФЖПФ›m€snžšmq}ОРЃП У‘kplПˆkrƒsn“ФЖПФœn€soˆЗuo}ОРЃП СЖ‹„œКУЖ•tq‚so™ФЖПФœn€srvКІmyОРЄП ФМ­ž‡~ŽГЊyrsq­ТЖП Ф›npnrsnШЅ РЄП ТЂvqnppop†‰qsq­ТЖП УЅmƒ’ynqo•ЧФЃПРСО{oƒspq‚spЌТЗП НЊНУЗŸxon•УРЁПСПКЅqŠsrsГСЖП РПСОНПТЖ‚on•ФСŸПРОˆwxq‰sqp™УЖПРЙЛ‚НРПmn’НТžПУ•oЏЙ„p‡srvЉСЗПТŠЋР‚НРЗypmЛФПС~‡СУЉp†srmŸФННЕПСЖxЏПƒНСЇsro­Ф›ПРН{ІСНРƒo„srn–РННООГПРЦ“z†НФnsosІТР™П ТБvЕПНТЁor‚s rn•СОНС›ЌТ­ПСФСŸmŠР…Н ОП…osrn•УС˜П ТА~НОННСœnp€q nr—СОННП›ФЋП СУИГЕЕ ‚loЎР†Н РВtrsrn”ПТ—ПТА}МОННОС ~||{ŠЋТО€НП€ŽХЊП СБˆy}xpjn}ЂРˆНС“n€sn‚ЖФР•ПТА}МОНСН€ЛРР‚НП„РРЈП РТƒyЏМВЅІЌНС‰НОП„o€spvЁСР”ПТА~НО‚НО„НП‚jЁХЈП СЙwЈФОПССРО‹НРБtr€sql”У”ПТБyЗПНС•l{ЛУЇПТ­lЂТ’НТ›nsrpЏТ“ПТВpЌРНПЗwlŒЛТІПТГq†ПО‘НОМ}psnФ“ПТВoСŽНТ›ll}ЗФРЄПРП€oЎР’НСЊpsq{МР‘ПУЦœi’УŽНОН”vmr ТТЄПУ”i—Т“НП‹o€snˆТ‘ПСЃВ›j‡ПНОСЖЉw‡ЗТЃПԘkОО’НПЛ}qsnuЎТПХ­k‘l{ЛОНПСТМ„xКСЂПТЋqrЎР“НСЊps„ЏФП ФДzn…›l|ЛО“НПО—ФЂПТДsoЈР”НТ€ТУПРП РФВzop†œl{ЛО”НЦ•ŽФЂПУЊpsАП”НРЕuЄФСМТРŠП ФР›sqsoŽ”lƒНО’НОТЏwІУЂПФk‚ПО•Н ТžuМœu”ОУР‚ПРРСУФСЊ„nrssnž„l“Т‘НОСПЁr”ТЂПСЖvqЇС–Н ОЗsŽВwl­РФТНОЙЌŸ…po€srsВ„lТНРСМЄ|yЈУРЂПУЈlŒТ˜НР…kЂ­qpr‚€”•Œ|}zpop‚srxДn СŒН ПСП˜ws‘ЛУЄПФ“lЏС˜НТ™l|Кzqspn�o€q…soŒДrp­РŠН ПТИЃ‚olЖФСЅПԘj УСО–НТŸmtГosqЎЇoqЌРˆН ОСǘwjsЋУСЇП СЗxmŒЇЙСТСПО‘НТšnnЊ•oŽsrvϘnqЈР‡Н ППŸxks“ЖФУЊП ТВ…pkw„šЅЕЛ€СПОŒНР…poІƒpŽsrsЌ–onТ†НРК‹nm}БХС­ПТТГЉ”ˆulp|ˆœІЖЛТСПО‡НПЖwqx–ronptsq|МО„НТБ{mnŒОТБПСУФУКЉ–ƒsnkr|ŽЂБМТРОƒН ПТŠosrotƒ‹ЁЇ‰І Їž‹†rssp™ХО€Н ОРТАylwЂТСЖПРУФСКЏž‰yniq}“ЋКРТРООТЛ—qqnzœИПФУХ™nsrtЁР€ТНГ‘tmzДХМПРТФУЛА˜€pjqzŠ›­ЛЙ›zoo}ЂКФСРПТЖtrsro‰“’‘uonyДУСПРТФПАtmlnq}zopm{ЖЦР”ПФœmpsso€npqmyДУХПРТУЖœrollnsŒЖУ–ПРРЉƒnosŠДУЩП СУОБž••œДТС™ПФМЅ•€–•ЃДТТЬПРТУ€Ф�СœПРУ‚ФУТџПџПџПџПџПџПџПџПџПџПџПџПџПџПˆПџПџПџПџПџПџПЋПРТ‚ФУТС№ПРУФМАœ•––•АИТФСьПФПЃ“}ronoqy†ДТРшПРУЈ‡nnq…sqpnsПФцПСОoo‹srnЈУРуПСП‡msppПСсПРН‡nsqnpsrlŠПРрПФ–ls q‚Ѓossl—ФпПСИwrs m—ЫС‹qsrrБТоПУ–nŽs qЉТВЁrssnŒФнПРМ|psq}Ў„pqsrАТмПТЏqsrpƒso‚ОРлПТАq™soЌТлПУo™sn”УлПФ•n™sqПРкПФ–n€sror†s�o€nor„sq}НРкП Ф–nssou‡uoƒsrpŽЄЃž‰vq„sqЎТкП Ф–nsq€БФГ‰q‚sq€ФУХЌvqƒspЎТкП Ф–nrwЗФПУОzq€s oŽХППСРПЦЁnƒspЈТкПФ–nnЦТРТФ”nssrtГ€ТГМУРО~q‚sn’ФкПФ•nnšП‹}™ФЗwrsnŒФСЕ‹vЈТФ–n‚sn“ФкПТЉppАi•~ІФ€qsn‘ХТ†juЄ‰ЌЦЇo‚sn“ФкПТАqpА‰m…ŠТqsn‘ЧГtrp€›’ЦИwrsn“ФкПТЏqpБˆnw—…У~mpl†ЦЅn€sw“ЦЙwrsn“ФкПТЏqoЂkrn‡З —™ŽМЕuqssl•ЦКwrsn”ФкПТЏqp…П‘p€™ЏАБš‹ІГ…opsrАШЖtrsoТкПТЏqsoЁЉ‚ЊІ­Ќ­Ј›Ї­ЊšprГŽo‚sq{НРйП ТЏqspu‡ЊЎЎ­€Ќ­Ў­Ќ­Џ­›~€oƒsq|НРйПТЏqrwЎ­ŠЌЏЌЂ˜wrƒsrЎТйПТБso•ВЌЎБАž„spЊУйПРП€oЃБŒЌЏІ›­Љwr‚spЎУйПРП€o‡ЃЏˆЌ ­ЏЎЄ{€Аžrssq€spСйПРП€poyЈЏ„Ќ­ЏЏЇ—„~­Џpss~qrsqwМРиПРПpsp{ЇБЏАЏЉ˜†‚ŒžЎГ­ІurrtƘoospЄХиП%РР†psspzžž„y„˜ЋБГЁ…ЋЖvrsoШЌˆsq}ЛРиПФœnqpswzp€qyŠ ЏБАЅ‰pzЙФ†osqxЖЩФƒpm–ФиП%Уn~n~ЈЅЃЂЂЋАВЎЂ‹ozІМСУŸmssp{ЋЕvrrwИСжП&СЙwm•П|n~ АВВЏЊ—ƒop™ЛФРПСЗwqsspt{qssmŸХжП֘nožШЈqppŠ•”…{ok|ЊХСПУЂo€srq€srwБТдПУІsquЕТУˆnspooppr‹ЙФ„ПУ‰o…smŠУгПТЗvqoŽФПСИ~ossrnsЈФС…ПТЗxq„srqЌУвПФŠnsoЉУППУИ~lnr„ЉФˆПХn…sp~НРаПФЈrrnУПУЗ  ЌТТ‰ПТЎr†sn•ФЯПТАsrrtДТ‚ПСФФТŒПУ‰o†sqЎУЮПТ‰nso‘Ф–ПФЂn†so†РСЬПХЃnsrrБТ–ПСЗwr€s�r‚sn‹РРЪПУ­uqsp‚Р˜ПФ‘nssuuq‚smФРШПТМ|ossp†У˜ПФšnssu”xq‚soЁУЧПСМ„o€sp„С˜П ТЎnssq€uqsrpАУЦПУ’lsruЕС—П РН…osso‚ІtqsoСРФПУЋprp€srrДС˜П СМ|psso“Љr‚sm”УФП Тˆm|qsso˜СšПФ n€snЎnsrtЕТТП СЕvl—šnsp~РРšП РН}qssoˆВrrsn’ФТП Ф™l|­|qsqЊУœПФ n€sp­nsruЕСРП РНn„ƒpso‰УП РН|qssoŒЋr‚sn’ФРП УЉosqqssqЎТžП Ф“nssrvК…osrvИРППФ‘nsoŠТŸП ТГsrssnЅЈosrsВТОПСИxr€srqЎТŸП РН}qssoŠТ~qso•ФОПФ•nspРР П Фossq|РŽosq|ОРМПРЛyqsn—ФЁПУЂo€spЎЁn‚soЃФМПУЉp‚srЏТЁПУЄo€snšЈo‚soŠТМПФ‘or€sp€ПРЁПТЉq€sp„Жursq|ОРКП РЙyo†~qsn’ФЂП РКxrsspС„p‚soЃУКП Ф˜npЃ‚qsoІУЂП РКwrssqxЛ‰o‚sn‘ФЙП СКxpvЗ€qqzЛСЃПСˆp€spЏ‰o‚sq}НРИП У—nrwЏzrq~ПРЃПУŽo€srГŠoƒsqЎТЗП ТАqrryЂpsq}ОРЃП УosspНpƒsqЋТЗП УŒosrxБyrq}ОРЃП УosspДtrƒsn–ФЖП ТЏrrssqЌˆpq}ОРЃПУŒossmŸЂo„sn”ФЖПФ›m€snžšmq}ОРЃП У‘kplПˆkrƒsn“ФЖПФœn€soˆЗuo}ОРЃП СЖ‹„œКУЖ•tq‚so™ФЖПФœn€srvКІmyОРЄП ФМ­ž‡~ŽГЊyrsq­ТЖП Ф›nqorsnШЅ РЄП ТЂvqnppop†‰qsq­ТЖП УЅn€‹xoro•ЧФЃПРСО{oƒspq‚spЌТЖП РМŸЋБЇ•vpn•УРЁПСПКЅqŠsrsГСЖП СГЎ­ЌЎАЇpn•ФСŸПРО‰wxq‰srp™УЖПСЖЊ‚ЌЎЎ†on’НТžПУ•oЁЉ€p‡sruœГЛРЕПТŠœЎ‚ЌЎЈwqmЛФПТ‚ААœq†srn•БЊЎЕПСЗwЁЎƒЌЏœtro­Ф›ПРО|™АЌЎp…soЎ€ЌЛРВПРЦ”w†ЌБ“ososІТР™П ТБvЅЎЌА–pr‚s roЏ­ЌЎ‘ЌТ­ПСФСŸn„Ў†Ќ­psrn•УјПТА|Ќ­ЌЌА’pqrqrorŽЏ­ЌЌЎ{›ФЋП СУИДЕЕ ‚mo Ў†Ќ ЎЄtrsrn”ПТ—ПТА{Ћ­ЌЌ­Џ–{zzy…žАЌЎ|ŽХЊП СБ‰x{wqko{—ЎˆЌАŒo€sn‚ЖФР•ПТА{Ћ­ЌЏЌ€ЋЏЏ‚ЌЎ}„РРЈП РТƒvЁЋЃ™šžЌЏ‰Ќ­­p€spvЁСР”ПТА|Ќ­‚Ќ­„ЌЎkЁХЈПСКxœБ­Ў€Џ�­‹ЌЎЃtr€sql”У”ПТБxЇЎЌЏm{ЛУЇПТ­m˜А’ЌА“osrpЏТ“ПТВqŸЏЌЎЇvmŒЛТІПТГq‚Ў’Ќ­Ћ{qsnФ“ПТВp“АŽЌЏ’nm~ЗФРЄПРП€oЁЎ’ЌЏqsq{МР‘ПУЦœj‹АЌvns ТТЄПУ”kА“ЌЎ†p€snˆТ‘ПСЃВ›kƒЎЌ­ЏЇˆuˆЗТЃПԘk}­­’ЌЎЋzqsnuЎТПХ­k‘myЋ­Ќ­ЏЏЋ~yКСЂПТЋqr Џ“ЌЏqs„ЏФП ФДzn…›mzЋ­“ЌЎ­|˜ФЂПТДsoœЏ”ЌАˆТУПРП РФВzop†œmyЋ­”ЌГ‹ФЂПУЊprЁЎ”ЌЎІtЄФСМТРŠП ФР›sqsoŽ”m€­­’Ќ­АЁuІУЂПФk~Ў­•Ќ А“vМœu”ОУР‚ПРРСУФСЊ„nrssnž„mŒА‘Ќ­А­–q•ТЂПСЖuqœЏ–Ќ ­ЇrŽВwl­РФТНОЙЌŸ…po€srsВ„mŠАЌЎЏЌ™yyЉУРЂПУЈl‡А˜ЌЎ€lЂ­qpr‚€”•Œ|}zpop‚srxДn–ЏŒЌ ­Џ­Єus‘ЛУЄПФ“lЁЏ˜ЌАm|Кzqspn�o€q…soŒДrqŸЏŠЌ ­АЈ˜~nm‘ЖФСЅПԘk–БЏ­–ЌА”otГosqЎЇoqŸЏ‰Ќ ЏЈvktЋУСЇП СЗxm†›ЉЏАЏ­­‘ЌАonЊ•oŽsrvϘnqœЏ‡Ќ ЎЎ•wlt“ЖФУЊП ТВ…qlu‘šІЋ€Џ­­ŒЌЏpoІƒpŽsrsЌ–ooŠА†ЌЎЊ…om}БХС­ПТТГЉ•‰vmpyƒ’šЇЋАЏЎ­‡ЌЎІvqx–ronptsrzЌ­„ЌЏЃynnŒОТБПСУФУКЉ–„tpkqz‡—ЃЌАЏ­ƒЌ ­А…psrotƒ‹ЁЇ‰І Їž‹†rssqВ­€Ќ ­ЎАЂxmwЂТСЖПРУФСКЏž‰yojq{ŒžЊЎАЎ­­АЊŽqqnzœИПФУХ™nsrt—Ў€АЌЄŠtmzДХМПРТФУЛА˜€pkqy…’ ЋЊ’xpo}ЂКФСРПТЖtrsrp„‹ŠŠ}tpnyДУСПРТФПАtmmor{ypqm{ЖЦР”ПФœmpssp€oqrmyДУХПРТУЖœrolmnsŒЖУ–ПРРЉƒnosŠДУЩП СУОБž••œДТС™ПФМЅ•€–•ЃДТТЬПРТУ€Ф�СœПРУ‚ФУТџПџПџПџПџПџПџПџПџПџПџПџПџПџПˆПџПџПџПџПџПџПЋПРТ‚ФУТС№ПРУФМАœ•––•АИТФСьПФПЃ“}ronoqy†ДТРшПРУЈ‡nnq…sqpnsПФцПСОoo‹srnЈУРуПСП‡msppПСсПРН‡nsqnpsrlŠПРрПФ–ls q‚Ѓossl—ФпПСИwrs m—ЫС‹qsrrБТоПУ–nŽs qЉТВЁrssnŒФнПРМ|psq}Ў„pqsrАТмПТЏqsrpƒso‚ОРлПТАq™soЌТлПУo™sn”УлПФ•n™sqПРкПФ–n€sror†s�o€nor„sq}НРкП Ф–nssou‡uoƒsrpŽЄЃž‰vq„sqЎТкП Ф–nsq€БФГ‰q‚sq€ФУХЌvqƒspЎТкП Ф–nrwЗФПУОzq€s oŽХППСРПЦЁnƒspЈТкПФ–nnЦТРТФ”nssrtГ€ТГМУРО~q‚sn’ФкПФ•nnšП‹}™ФЗwrsnŒФСЕ‹vЈТФ–n‚sn“ФкПТЉppАi•~ІФ€qsn‘ХТ†juЄ‰ЌЦЇo‚sn“ФкПТАqpА‰m…ŠУqsn‘ЧГtrp€›’ЦИwrsn“ФкПТЏqpБˆnw—†Ф~qso‰ШІn€sw“ЦЙwrsn“ФкП ТЏqoЂkrq‚’€v utЉЗwrssl•ЦКwrsn”ФкП ТЏqp…П‘stts€x wtw†yrssrАШЖtrsoТкП ТЏqsoЂЎtwvwx wwvwwtruГŽo‚sq{НРйПТЏqsrvwwŠxvtpqqƒsq|НРйПТЏqstvwxwv…srЎТйПТБsrv‘x�w„spЊУйПРП€pwŽxwvxx„spЎУйПРП€puwŒxwttxw€s�q€spСйПРП€pssŠxvutuxwu€s~qrsqwМРиПРПpsst†xvutuwxyuwssrtƘoospЄХиПРР†p€stuwuttuv€xwqЎwrsoШЌˆsq}ЛРиПФœnqpsststuw€xwsn~МХ†osqxЖЩФƒpm–ФиПУn~ptxwxwtm~ЇЛСУŸmssp{ЋЕvrrwИСжП СЙwm•П{ptw‚xvupsšЛФРПСЗwqsspt{qssmŸХжП֘nožШЈpssuvvutrm|ЊХСПУЂo€srq€srwБТдП УІsquЕТУˆm‚sqr‹ЙФ„ПУ‰o…smŠУгПТЗvqoŽФПСИ~ossrnsЈФС…ПТЗxq„srqЌУвПФŠnsoЉУППУИ~lnr„ЉФˆПХn…sp~НРаПФЈrrnУПУЗ  ЌТТ‰ПТЎr†sn•ФЯПТАsrrtДТ‚ПСФФТŒПУ‰o†sqЎУЮПТ‰nso‘Ф–ПФЂn†so†РСЬПХЃnsrrБТ–ПСЗwr€s�r‚sn‹РРЪПУ­uqsp‚Р˜ПФ‘nssuuq‚smФРШПТМ|ossp†У˜ПФšnssu”xq‚soЁУЧПСМ„o€sp„С˜П ТЎnssq€uqsrpАУЦПУ’lsruЕС—П РН…osso‚ІtqsoСРФПУЋprp€srrДС˜П СМ|psso“Љr‚sm”УФП Тˆm|qsso˜СšПФ n€snЎnsrtЕТТП СЕvl—šnsp~РРšП РН}qssoˆВrrsn’ФТП Ф™l|­|qsqЊУœПФ n€sp­nsruЕСРП РНn„ƒpso‰УП РН|qssoŒЋr‚sn’ФРП УЉosqqssqЎТžП Ф“nssrvК…osrvИРППФ‘nsoŠТŸП ТГsrssnЅЈosrsВТОПСИxr€srqЎТŸП РН}qssoŠТ~qso•ФОПФ•nspРР П Фossq|РŽosq|ОРМПРЛyqsn—ФЁПУЂo€spЎЁn‚soЃФМПУЉp‚srЏТЁПУЄo€snšЈo‚soŠТМПФ‘or€sp€ПРЁПТЉq€sp„Жursq|ОРКП РЙyo†~qsn’ФЂП РКxrsspС„p‚soЃУКП Ф˜npЃ‚qsoІУЂП РКwrssqxЛ‰o‚sn‘ФЙП СКxpvЗ€qqzЛСЃПСˆp€spЏ‰o‚sq}НРИП У—nrwЏzrq~ПРЃПУŽo€srГŠoƒsqЎТЗП ТАqrryЂpsq}ОРЃП УosspНpƒsqЋТЗП УŒosrxБyrq}ОРЃП УosspДtrƒsn–ФЖП ТЏrrssqЌˆpq}ОРЃПУŒossmŸЂo„sn”ФЖПФ›m€snžšmq}ОРЃП У‘kplПˆkrƒsn“ФЖПФœn€soˆЗuo}ОРЃП СЖ‹„œКУЖ•tq‚so™ФЖПФœn€srvКІmyОРЄП ФМ­ž‡~ŽГЊyrsq­ТЖПФ›nsnШЅ РЄП ТЂvqnppop†‰qsq­ТЖПУІptu€so•ЧФЃПРСО{oƒspq‚spЌТЖП СК}vxwvtrn•УРЁПСПЛІqŠsrsГСЖПТu‚xtsn•ФСŸПРО‰uurŠso˜ЦЖПТЎv„xusn’НТžПУ–mvwtŠsu‡ЏСЕПУŠr„xwtsmЛФПТ‚rxxw‰svxsОРГПСИvv…xwsso­Ф›ПРОt€x�t‡s�u€xvЎТВПРЦ•o‡xvssosІТР™ПТВrw€x�v†s�uxsЌУ­ПСФСŸqtˆxtssrn•УјПТВswx�v„s�u‚xpŸФЋП СУИЕЖЕ ‚orwˆx�w€srn”ПТ—ПТВsw‚x�vtuwƒxp‘ХЊП СБ‹xuutnptvŠx�usn‚ЖФР•ПТВswxq‡РРЈПРТ…lvw€v�wx�tspvЁСР”ПТВswxtmЁХЈПСКzu“x�w‚sql”У”ПТВswxup{ЛУЇПТ­pv”x�u‚srpЏТ“ПТВrvxwsnŒЛТІПТГtt•xƒsnФ“ПТВruxvsn~ЖФРЄПРП€pw”x�w‚sq{МР‘ПУЦœou‘xutpvЂТТЄПУ”nu•x�usnˆТ‘ПСЃВ›nu“xwsoŠЗТЃПԘnt–xtssnuЎТПХ­k‘nt–xo}КСЂПТЋqrw•xwss„ЏФПФДzn…›nt—xnšФЂПТДrrw–xr„ТУПРП РФВzop†œnt—xp’ФЂПУЊqsw–xwqЅУСМТРŠП ФР›sqsoŽ”ot–xvoЈУЂПФnt˜xtxМœu”ОУР‚ПРРСУФСЊ„nrssnž„pu•xsp—ТЂПСЖvrw™xnŽВwl­РФТНОЙЌŸ…po€srsВ„pu“xun|ЊУРЂПУЈoušxtnЂ­qpr‚€”•Œ|}zpop‚srxДqvxwuou”ЛУЄПФ“nwšxvp|Кzqspn�o€q…soŒДrswxwvsnp’ЗФСЅПԘmvšxvrtГosqЎЇoswŒxvrnv‘ЋУСЇПСЗymtv˜xvsnЊ•oŽsrvϘnswŠxvtpu“ЖФУЊПТВ†tnoptv”xtsoІƒpŽsrsЌ–osu‰xuro}БХС­П ТТГЉ–ŒzoopsuwŽxwsrx–ronptsst‡xwtqoŒОТБПСУФУКЉ—†wsnortvw‰x ussrotƒ‹ЁЇ‰ІЇž‹†r€s�v…xwtpwЂТСЖПРУФСКЏžŠ{rnpsuw…xusqnzœИПФУХ™n€s�v‚xwusozДХМПРТФУЛА˜rnrtuvwxxvtso}ЂКФСРПТЖtr€s�t€utssoyДУСПРТФПАtnprsttsrm{ЖЦР”ПФœmp„srmyДУХПРТУЖœro€nsŒЖУ–ПРРЉƒnosŠДУЩП СУОБž••œДТС™ПФМЅ•€–•ЃДТТЬПРТУ€Ф�СœПРУ‚ФУТџПџПџПџПџПџПџПџПџПџПџПџПџПџПˆПt8mk��@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refit-0.14/icons/tool_rescue.icns�������������������������������������������������������������������0000664�0001750�0001750�00000016630�10427440661�016435� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��˜ih32��ˆƒџ#sw;•ЫЪЁŽЌ™žЉs��� �лИ�ZЌЃЭРЈЊƒ��‰џ sw;•ЫЪЁ‰љёпЫBƒ�B{внщ{і$ЫРЈЊƒ��‰џsw;•ШШнб€џ š#%'.9>:8­€џ вЮк„fЅƒ��‰џsx.В-уа‚џ сI.*//-&<бџќќџбкїY��‰џsUГЩб„џќ{€ Sѕџљїљќ‚џС‰џrRа‡џД'€~€џў§ќ§џЎ�‰џjWТ…џ ћїо>Йўћ…џвц��‰џi_Х…џ ћђі]5чцч§„џЮщ‰џjfХ…џўїј m§№ѕћњћўџШ‰џgbФ„џќљњўЂЕћќџў§ћњў€џЪ‰ ‰џUƒХƒџўў€џ Џ :жсяћјјћ§џЩЁ‰џRєЦˆџЎ ]ххюєѕїљћў€џЧ™�‰џT ЦˆџЊ {ѕїієіљњќў€џЬџ‰џT Цˆџ�Ў€" ‹џџїѕїљћ§џУЊ‰џT Цџџў§§ћњњљ№ѓШ*"#џџїѕјљќ§џЕ�‰џT Цџџ§њїѕђёэсььA %šџџїіјњќ§џЭ™‰џT Цџџ§љі€ѕёьѕўq'˜џџїіљњ§‚џЭЯ‰џXЦџџќјћ§ў џџЏ'–џџўћќќў‚џЮ™AB‰џ?ŒТџџ§§…џс:"”џќў†џв( ‰џ �З‰џїaˆџ№єў†џЩЊ0‰џ�Йџў§ќњљјѕќјe ƒџќќ‡џЯы9‰џ=*Х‚џ §ќњљјєїіe!!‡‹џУП‰џYfа‰џїf""•†џ€ўџџг{‰џ8кƒџƒўџіf$#—џџ§ў§§ўџж>‰џI”Ььў„џўџџјh&'€џ�ў„џ№лЗ:‰џ#��;p›Лбрэїџџјрјm%,Вџлјџњ№фзШ’brX��‰џ� 5HYkxƒ“wQf4'djQvŒƒxncE5ˆˆ…b��‰џ€� "*223:AE6'6#*"()CHA<< ��‰џ#]Q+ ',;:58;?<8’@($'&4<>?;6‡I иt�‰џ#ЬјЯІ“‚o<*/>?;;3H;?3145@@B7+&(z€’€�‰џ#kюџ№щупX V­Ÿ‰mvH?Hp”Љy,n•џџз‹�‰џbрџѓѕєџ– Fцѓя№щd*8Зѓэ№ќ| ^м€џ�Р€�ˆџ$Dсџ№ђёџК"9хџ§џјn/Bаџќ§џf…zЬџџўѕ#��ˆџ5љџѓ№юћЭ18лџјќєl0Eвџјњј[! €M‚џ�Ž€�‡џ�ЭђњњџлB'6вџјўїs1Gгџњћі_)$"Д‚џъ€�†џ��AyЅЭЩH/<жџќѓў‡3Rтџ№ќўf1ћƒџ�u€�†џ�":LEAE†ЉŽ_}U;“„]‡ЁX: ™‚џўџв €�…џ€�"*6CAABF:,- )-,DK$-‚џўљіщ-�…џ� $,33/5:?<5…?'%&%1<9Vџўљє№цA �…џ �€Д›udZTG9:€; 4N:</+02==4ZŠ€џ §јєюыйL8(�…џ'�?ЅкыдТЖ­Ѓ–‹„w\eXEOnw|€„‡џцšѕџїѓющты<�= …џ€�%WЛшћђь№эъхпзу 1QбррОїўџџРaйїэцсл§дœѕь�„џ‚�`ЛцљќїѕіїљџЬ�WіџџТ‚џz…іщусТїџњ™ƒџ„�gЌпџќѓђёџя�œљџ№Ќ‚џіжъуиЇrў‚џ�€ƒџ†� KЄйїџњџі ОіШrОƒџс}eAџО7�ƒџˆ�‰ПтјђfИ‹€�†ГгѕџџЊ †�џё|�…џ‹�M‰†�uƒ�™?�†џЁ�ƒџƒџ#DF"]€dZn_Dа��� �є4љ33qaƒseeP��‰џ DF"]€dVp‹œŠ+ƒ�FU“™�хЖseeP��‰џ#DF"]}{х‚–отеl#%'.9>;:zЪхщЈ™“™_P��‰џ#DGˆ—лоййнЅ>2*//-& 5”ТОЯлокг—‰и��‰џDЊ }•изеддекЧW!€<АЩКЗПЩЯЯгииi�‰џCоˆпледд€ейм€&€TЦбЭЩХФЧЦТХЩ\�‰џ>D…аЭиййккмвЎ’1}КПЬ€ЩЧШФМ…z��‰џ#;FxЗЙЬЮЭЮЮаЦ›?(‹kУЧЦХХЦЧЧzm‰џ99uУЧЦЦ€ЧЫЬОHGŸІИЖИНССУОo1‰џ6-sКПФУФХУСМРКf€kœДЬФОЖВКПОДj'‰џ#+4oЋДСРСРПСХЦЙm*\VƒЂЃЊБЕЙЛЙЌg(‰џ )_jЉЏММННОПРНЊh" :_iŽœŸЂІЋДЖЗ­a€�‰џ (UgЅЊЙИЙЙК€ЛАe% !M{– ˜žЃІЉЏГЖА`€�‰џ'?eЁЉЖЕЖИКНПФА_&€" U—Ў•ЁЄЈЌЎВЕ_€�‰џ%?bŸЊА­€ЎЏВ—s^)$#"UЃ­˜“šžЁЇЉЉЎКW€�‰џ $5`ŸЊЈЁ—Œ…]dn/%%#XЄЋ•˜œŸЃІЅЋЙ`€�‰џ #*^œЇЂš•““’Œw{€@#(#RœЇ‘Œ’—œЁЄЄЏНa€�‰џ#"\˜Ѓ•œЂІЇЈЉЇŸX#)#M‹Ÿ­ŸœžЄЈЊАСnw‰џ#ЬV–ЁœЂЂЃЄЅЇЊАv+($M‰›ЎІЇЄЃЄЇЉЈЗn�‰џ�N•€œžŸЂІЉ­Ћ~8('G{et—™€—›ŸЃЋЖT� ‰џ�I’€—€– •”‘’Œw:))CvzƒŽ‚‘•œЈd‰‰џЦP““€”““’Ž…~t:+*Ez…Ž€Œ ‹‹Œ‹Œƒ{C‰џ#dŽ‘“—œЁЉ}s:.,H|Œˆˆ‰‰ˆˆ‰‰Š„wtJi‰џЊ[’‹ŒŒ€ Ž“…wp</-H}ƒ„†‚y{rK`‰џBkŠ€ŽŒŽ†{o<1/KvŠ“ˆ‚‚ƒ„„wtfO1‰џ#��%G]mwƒ‡‰Œ‚jk?22Qqu‹ŒywupSPoV�‰џ€� '8FQZ`ekYDB$):<GXiida_F6ˆˆ…b��‰џ€� #,578@GK?$#*&'-/INF@@  ��‰џ#"-4=:59<>@# 8-%'&4<??;6‡I йt��‰џ#3_\KFED5,.<AAB4&:A35;;FCA6,&rvƒ��‰џ#b]rgb^[) 3]\WMH:DGJT]`dH .†њўАg��‰џ!NUpmnosJ)bltu`<76Lg|}E3AХѓЭС„€�ˆџ$XUmltzˆl"0{}|zgC>=VxЇ†AD3УпНмє#��ˆџP^peflym.&0l{zueC?>Tz‰†‚>''BE‚џ�Ž€�‡џ�4Xcedjh9/3hxwvgF@@Vmƒˆ‚C/+Д‚џъ€�†џ�� <LZa?7;gwuqiLDC]}‚‰…J7ћƒџ�u€�†џ€�);FDCD]hZIH2(3HPM^oN< ™‚џўџв €�…џ€� "+7CAAJPC- )&%12MM$-‚џўљіщ-�…џ� +28828;??$ 5,%&%1=;Xџўљє№щA �…џ�)C@56;A>7<?@D5$;>0267DB68y€џ §јєюыаI9)�…џ'��4NZSJFKNLKLKFC=GJHS[[WUэКŠјџїѓюъмБ/�2j…џ€�%?U`\]geda^]^H:6Q{ƒnЕсёє’]кїэцтевН…кН�„џ‚�>S]hmkpMa•”wїъхщщ^‰іщутМЪѕјяэХDƒџ„�"8PknjhioZ�$e}^aэфслсЪЧыуиЉbаъутябMƒџ†� 7Rgmmq_�.S;эѓіэчѓФ}}eFuъщэтŽ�ƒџ‰�)EYjUf#€�]ŽЏжњїŒ cэџбX�…џ‹�*'‡�o_ƒ�j|$�†џЁ�ƒџƒџ# )99,(1(џ€\�� �mŒK�:(?0,*$��‰џ  )99,%�:VAƒ�B!.B[R†щЖ>0,*$��‰џ# )75Ь7U›Љ}6##%'.9>=??aАЙq\M?й3&$��‰џ# Lр<U–ЁžŸ—V86*//-&$3CWošЄ ˜YF.В��‰џ#�n7T‘—””••št6'*Uy{z€ŠŒ‘—‰)��‰џД@ŽЁ™–€˜™Ÿ‘D)€!+fЉ…‚zowr"��‰џ|H~ˆЁЅЈ pI(9a€…€ua4(��‰џy.FZ†Š‹ŒŒ‰Z>&;*F~||€{€{+‰џf)g~||~€‡ŠK!€%:Aasnotuvyg"�‰џ[(Vqzxz||€†l4-A`}xojmprQ�‰џ#`!8Zvstuux}~Q0$!4GScijjljA�‰џ _6Qpnoprsvq;+* !#"1OWWY[^cegF€�‰џ U0IjiijjknoD', !$.-GZQSUWZ\^fQ€�‰џ ?-Kdcehkot}N +#")07STKOPSTWXaZ€�‰џ ?+P^[_dgkqW (%#*-;TNFILNORQ\b€�‰џ 5+QUPOMKHF%'%*)<TG@DFGIJGWh€�‰џ* )MMI€HIH- *(+!/M@:=?BFJJ_t€�‰џ  &IGCGLNQSTP5))+<aNJFGMSXf'€�‰џ  #CBBGHIKLOVZ %-, BcNOMLOSYXq=€�‰џ#��!;<>@BDHMT\Q!/.67557<GN]g��‰џ��6679;??BCJ."00(‚*-2@P��‰џ#��"0/03599<>5&!22�&#"%$$%%#'��‰џ#�� &'(*,18AKY+$34#  !!""$��‰џ#�"!#%')*+/5�%560-  ��‰џ� "$'(+0�&86�!6'€ �‰џ#��#)+)((''* �(98�2+") AmU ‰џ€� .<FJLMMKA9$!,"?AOTSX]G6ˆˆ…b��‰џ€� $-8:<ELQC)#)*-03NSJDC! ��‰џ#�$18>959=>?# 8-$'&4<??:6ˆK"кt��‰џ#� +1..:BEG8+<@29?@JG@6,&—VU‰ˆ��‰џ#� ).64(4FH5-<>6(#„ЈQ(��‰џ! !#%!# *=8 03.! €�ˆџ$ ,7GC# *:&)"2E>@;6("#! Жd>­є$��ˆџ(&5<,+*$%) 3F>$E>8,*+@‚џ�Ž€�‡џ�*341&$'#3G?;D;42/ Д‚џъ€�†џ�� $:<9& $"4L?-BF?9:ћƒџ�u€�†џ€� -:CECDEB<;(",/$0DERH= ™‚џўџв €�…џ€� ",8CAANUG0**)46QN#-‚џўљіщ-�…џ� -4:949<??$ 5,%'%1=;]џўљє№ыB �…џ�".897=@BF9(=>159:GD6[€џ §јєюьТC:*�…џ'�� "'+05912HI8@KHB"˜hs§џїѓюыеK�…џ€�%$""%$#"!$ '?-LY/@{ЉŸ1XлїэцфЧ}SœV�„џ‚�&*,+-�%ectypse —іщуфВXޑށ?�ƒџ„�"".0--.0%�*C'8)Ѕ№уиЏH-R@$6"�ƒџ†� $.214)�  …�eQ*„�ƒџ‰�)3#Š�‚�…џ‹� “�†џЁ�ƒџh8mk�� ����������������-k ���������Ft/������������������������������+ЅуџАZ2,P’шџщЦt;�������������������������2ЗьџџџџџшмйклхљџџџџџџђйЈ6������������������� CСљџџџџџџџџџџџџџџџџџџџџџџџћг���������������QЬўџџџџџџџџџџџџџџџџџџџџџџџџџџџџЗ���������������ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџД���������������)эџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ^���������������(ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњ:���������������(ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№$���������������'ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџх���������������хџџџџџџџџџџџџџџџџџџџџџџџџџџџџџм���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџв ���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџа���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЮ���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџс���������������уџџџџџџџџџџџџџџџџџџџџџџџџџџџџџј-���������������рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf��������������� йџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ��������������зџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ4��������������тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБ�������������nќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџф������������фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъ%������������SџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђA������������Yџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџa������������I§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџY������������I§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ“������������<ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋ������������#мџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЂ������������гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЎ������������гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџн�����������гџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџg�����������Чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя5����������вџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЛ���������*цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‹���������)тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџю&��������)фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџs��������ЦџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ���������]ћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜���������’юџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ����������]Ићџџџџџџџџџџџџ§џџџџџџџџџџџџџџџџџџџџк����������&lФѕџџџџџџџџзv•ўџџџџџџџџџџџџџџџџџџџџе-����������� *lК№џџџџџџКUџџџюџџџџџџџџџџџџџџџџџџm�������������$_ІчџџџџЙ�SџгЛџџџџџџџџџџџџџџџџаf���������������IЭёџД:‡9 rŸЫѕџџеŒsrЋўџј“�������������������/_Z ���� 6y€%����g‘T����������������������� ���������������������������������������������������������������������������������������������������������������������������������refit-0.14/refit.conf�������������������������������������������������������������������������������0000664�0001750�0001750�00000010630�11344445254�014075� 0����������������������������������������������������������������������������������������������������ustar �julien��������������������������julien�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # refit.conf # Configuration file for the rEFIt boot menu # # Timeout in seconds for the main menu screen. Setting the timeout to 0 # disables automatic booting (i.e., no timeout). # timeout 20 # Disable menu options for increased security. These are intended for a lab # environment where the administrator doesn't want users to mess with the # operating system. List the names for the options you want to hide from # the boot menu. Currently supported: # shell - remove the EFI shell # tools - remove all EFI tools (shell and gptsync) # optical - no booting from optical drives # external - no booting from external disks or USB flash drives # internal - no booting from internal disks; this setting is not # recommended because it locks you out of all operating # systems installed on the internal hard disks. # singleuser - remove the submenu options to boot Mac OS X in single-user # or verbose modes # hwtest - remove the submenu option to run Apple Hardware Test # all - all of the above, except for 'internal' # #disable external optical shell singleuser #disable all # Note: The 'disableopticalboot' and 'disableexternalboot' options from # Charles Ahn's patch are also supported for compatibility. They are # equivalent to 'disable optical' and 'disable external', respectively. # Use a custom title banner instead of the rEFIt icon and name. The file # path is relative to the directory where refit.efi is located. The color # in the top left corner of the image is used as the background color # for the menu screens. Currently uncompressed BMP images with color # depths of 24, 8, 4 or 1 bits are supported. # #banner hostname.bmp # Custom images for the selection background. There is a big one (144 x 144) # for the OS icons, and a small one (64 x 64) for the function icons in the # second row. If only a small image is given, that one is also used for # the big icons by stretching it in the middle. If only a big one is given, # the built-in default will be used for the small icons. # # Like the banner option above, these options take a filename of # an uncompressed BMP image file. # #selection_big selection-big.bmp #selection_small selection-small.bmp # Hide the volume badge icons in the graphical main menu. There are three # settings: # none - show all volume badges (default) # internal - hide badges on internal disk volumes only, allowing you to # distinguish CDs and occasionally connected external disks # all - never show volume badges (not recommended) # #hidebadges internal # Hide various user interface elements. Here you can list the names of # interface elements to hide. Currently supported: # banner - the rEFIt title banner # shell - the EFI shell icon # tools - all EFI tools (shell and gptsync) # funcs - built-in functions (about, restart) # ('tools' and 'funcs' together hide the complete second row of icons.) # label - text label in the menu # hdbadges - volume badges for internal disk volumes (same as # 'hidebadges internal') # badges - all volume badges (same as 'hidebadges all'); this setting # is not recommended because it won't let you distinguish # installed OSes and bootable CDs/DVDs. # all - all of the above, except for 'badges' # # Note: The 'shell' and 'tools' options are equivalent to the 'disable' # options with the same names. # #hideui tools funcs hdbadges #hideui all # Use text mode only. When enabled, this option forces rEFIt into text mode. # #textonly # List legacy options first. When enabled, legacy BIOS based boot options # (e.g. Windows, Linux via LILO or GRUB) will be listed first. This is # intended as a quick fix to change the default boot choice until full # configurability arrives. # #legacyfirst # Set the default menu selection. The available arguments match the # keyboard accelerators available within rEFIt. You may select the default # loader using a one-character abbreviation for the OS name ("M" = Mac OS X, # "L" = Linux, "W" = Windows). You may also specify a digit between 1 and # 9, in which case the Nth loader in the menu will be the default. You can # also select a rEFIt tool entry ("S" = EFI Shell, "P" = Partitioning Tool, # "U" = shutdown). This is intended as a quick fix to change the default # boot choice until full configurability arrives. # #default_selection L # EOF ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������