diff --git a/boot/CMakeLists.txt b/boot/CMakeLists.txt index 5a166a5e07e..203ae0a0860 100644 --- a/boot/CMakeLists.txt +++ b/boot/CMakeLists.txt @@ -2,7 +2,6 @@ include(boot_images.cmake) add_subdirectory(bootdata) -# add_subdirectory(environ) add_subdirectory(freeldr) add_subdirectory(rtl) diff --git a/boot/environ/CMakeLists.txt b/boot/environ/CMakeLists.txt deleted file mode 100644 index 922271d1d8b..00000000000 --- a/boot/environ/CMakeLists.txt +++ /dev/null @@ -1,165 +0,0 @@ - -include_directories(BEFORE include) -include_directories(BEFORE include/efi) -include_directories(${REACTOS_SOURCE_DIR}/ntoskrnl/include) -include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/cmlib) -include_directories(${REACTOS_SOURCE_DIR}/sdk/include/reactos/libs) -include_directories(${REACTOS_SOURCE_DIR}/drivers/filesystems) - -add_definitions(-D_NTHAL_ -D_BLDR_ -D_NTSYSTEM_) - -list(APPEND BOOTLIB_SOURCE - app/bootmgr/bootmgr.h - lib/bootlib.c - lib/misc/debug.c - lib/misc/bcd.c - lib/misc/bcdopt.c - lib/misc/bootreg.c - lib/misc/util.c - lib/misc/image.c - lib/misc/resource.c - lib/misc/font.c - lib/misc/rtlcompat.c - lib/rtl/libsupp.c - lib/firmware/fwutil.c - lib/firmware/efi/firmware.c - lib/mm/mm.c - lib/mm/pagealloc.c - lib/mm/heapalloc.c - lib/mm/blkalloc.c - lib/mm/descriptor.c - lib/platform/time.c - lib/io/blkcache.c - lib/io/etfs.c - lib/io/io.c - lib/io/device.c - lib/io/file.c - lib/io/fat.c - lib/io/display/display.c - lib/io/display/emscons.c - lib/io/display/guicons.c - lib/io/display/textcons.c - lib/io/display/efi/textcons.c - lib/io/display/efi/guicons.c - lib/io/display/efi/gop.c - lib/io/display/efi/uga.c) - -if(ARCH STREQUAL "i386") - list(APPEND BOOTLIB_ASM_SOURCE - lib/arch/i386/transfer.s - ) - list(APPEND BOOTLIB_SOURCE - lib/arch/i386/arch.c - lib/mm/i386/mmx86.c - ) -elseif(ARCH STREQUAL "amd64") - list(APPEND BOOTLIB_ASM_SOURCE - #lib/arch/amd64/foo.asm - ) - list(APPEND BOOTLIB_SOURCE - #lib/arch/amd64/foo.c - lib/arch/stub/arch.c - lib/mm/stub/mm.c - ) -else() - list(APPEND BOOTLIB_SOURCE - lib/arch/stub/arch.c - lib/mm/stub/mm.c - ) -endif() - -add_asm_files(bootlib_asm ${BOOTLIB_ASM_SOURCE}) -add_library(bootlib ${BOOTLIB_SOURCE} ${bootlib_asm}) -add_pch(bootlib app/bootmgr/bootmgr.h BOOTLIB_SOURCE) -add_dependencies(bootlib bugcodes asm bootmsg xdk) - -list(APPEND BOOTMGR_BASE_SOURCE - app/bootmgr/efiemu.c - app/bootmgr/bootmgr.c - ) - -add_executable(bootmgfw ${BOOTMGR_BASE_SOURCE} app/bootmgr/bootmgr.rc) -set_target_properties(bootmgfw PROPERTIES SUFFIX ".efi") - -if(MSVC) - if(ARCH STREQUAL "arm") - target_link_options(bootmgfw PRIVATE /ignore:4078 /ignore:4254 /DRIVER) - else() - target_link_options(bootmgfw PRIVATE /ignore:4078 /ignore:4254 /DRIVER /DYNAMICBASE:NO /NXCOMPAT:NO /FIXED) - endif() -else() - target_link_options(bootmgfw PRIVATE "-Wl,--strip-all,--exclude-all-symbols") -endif() - -set_image_base(bootmgfw 0x10000) - -if(MSVC) - set_subsystem(bootmgfw EFI_APPLICATION) -else() - set_subsystem(bootmgfw 10) -endif() - -set_entrypoint(bootmgfw EfiEntry) - -target_link_libraries(bootmgfw bootlib cportlib blcmlib blrtl libcntpr) - -# dynamic analysis switches -if(STACK_PROTECTOR) - target_link_libraries(bootmgfw gcc_ssp_nt) -endif() - -if(RUNTIME_CHECKS) - target_link_libraries(bootmgfw runtmchk) -endif() - -add_dependencies(bootmgfw asm bugcodes) - -list(APPEND ROSLOAD_BASE_SOURCE - app/rosload/rosload.c - app/rosload/roslogo.c - ) - -if(ARCH STREQUAL "i386") - list(APPEND ROSLOAD_ASM_SOURCE - app/rosload/i386/osxfera.s - ) -endif() - -add_asm_files(rosload_asm ${ROSLOAD_ASM_SOURCE}) -add_executable(rosload ${ROSLOAD_BASE_SOURCE} ${rosload_asm}) -set_target_properties(rosload PROPERTIES SUFFIX ".efi") - -if(MSVC) - target_link_options(rosload PRIVATE /ignore:4078 /ignore:4254 /DRIVER) -else() - target_link_options(rosload PRIVATE "-Wl,--strip-all,--exclude-all-symbols,--dynamicbase,--pic-executable") -endif() - -set_image_base(rosload 0x10000) - -if(MSVC) - set_subsystem(rosload BOOT_APPLICATION) -else() - set_subsystem(rosload 16) -endif() - -if(ARCH STREQUAL "i386") - set_entrypoint(rosload OslMain 4) -else() - set_entrypoint(rosload OslMain) -endif() - -target_link_libraries(rosload bootlib cportlib blcmlib blrtl libcntpr) - -# dynamic analysis switches -if(STACK_PROTECTOR) - target_link_libraries(rosload gcc_ssp_nt) -endif() - -if(RUNTIME_CHECKS) - target_link_libraries(rosload runtmchk) -endif() - -add_dependencies(rosload asm bugcodes) - -add_cd_file(TARGET rosload DESTINATION reactos/system32/boot NO_CAB FOR all) diff --git a/boot/environ/app/bootmgr/bootmgr.c b/boot/environ/app/bootmgr/bootmgr.c deleted file mode 100644 index c811a2723c6..00000000000 --- a/boot/environ/app/bootmgr/bootmgr.c +++ /dev/null @@ -1,3244 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Manager - * FILE: boot/environ/app/bootmgr/bootmgr.cla - * PURPOSE: Boot Manager Entrypoint - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bootmgr.h" - -/* DATA VARIABLES ************************************************************/ - -DEFINE_GUID(GUID_WINDOWS_BOOTMGR, - 0x9DEA862C, - 0x5CDD, - 0x4E70, - 0xAC, 0xC1, 0xF3, 0x2B, 0x34, 0x4D, 0x47, 0x95); - -ULONGLONG ApplicationStartTime; -ULONGLONG PostTime; -GUID BmApplicationIdentifier; -PWCHAR BootDirectory; - -BL_BOOT_ERROR BmpErrorBuffer; -PBL_BOOT_ERROR BmpInternalBootError; -BL_PACKED_BOOT_ERROR BmpPackedBootError; - -BOOLEAN BmBootIniUsed; -WCHAR BmpFileNameBuffer[128]; -PWCHAR ParentFileName = L""; - -BOOLEAN BmDisplayStateCached; -PBL_LOADED_APPLICATION_ENTRY* BmpFailedBootEntries; -PBL_LOADED_APPLICATION_ENTRY BmpSelectedBootEntry; -BOOLEAN BmBootEntryOverridePresent; -BOOLEAN BmpDisplayBootMenu; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BmGetOptionList ( - _In_ HANDLE BcdHandle, - _In_ PGUID ObjectId, - _In_ PBL_BCD_OPTION *OptionList - ) -{ - NTSTATUS Status; - HANDLE ObjectHandle; - ULONG ElementSize, ElementCount, i, OptionsSize; - BcdElementType Type; - PBCD_ELEMENT_HEADER Header; - PBCD_ELEMENT BcdElements; - PBL_BCD_OPTION Options, Option, PreviousOption, DeviceOptions; - PBCD_DEVICE_OPTION DeviceOption; - GUID DeviceId; - PVOID DeviceData; - - /* Open the BCD object requested */ - ObjectHandle = NULL; - BcdElements = NULL; - Status = BcdOpenObject(BcdHandle, ObjectId, &ObjectHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Do the initial enumeration to get the size needed */ - ElementSize = 0; - Status = BcdEnumerateAndUnpackElements(BcdHandle, - ObjectHandle, - NULL, - &ElementSize, - &ElementCount); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - /* If we got success, that doesn't make any sense */ - if (NT_SUCCESS(Status)) - { - Status = STATUS_INVALID_PARAMETER; - } - - /* Bail out */ - goto Quickie; - } - - /* Allocate a large-enough buffer */ - BcdElements = BlMmAllocateHeap(ElementSize); - if (!BcdElements) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Now do the real enumeration to fill out the elements buffer */ - Status = BcdEnumerateAndUnpackElements(BcdHandle, - ObjectHandle, - BcdElements, - &ElementSize, - &ElementCount); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Go through each BCD option to add the sizes up */ - OptionsSize = 0; - for (i = 0; i < ElementCount; i++) - { - OptionsSize += BcdElements[i].Header->Size + sizeof(BL_BCD_OPTION); - } - - /* Allocate the required BCD option list */ - Options = BlMmAllocateHeap(OptionsSize); - if (!Options) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Zero it out */ - RtlZeroMemory(Options, OptionsSize); - - /* Start going through each option */ - PreviousOption = NULL; - Option = Options; - for (i = 0; i < ElementCount; i++) - { - /* Read the header and type */ - Header = BcdElements[i].Header; - Type.PackedValue = Header->Type; - - /* Check if this option isn't already present */ - if (!MiscGetBootOption(Options, Type.PackedValue)) - { - /* It's a new option. Did we have an existing one? */ - if (PreviousOption) - { - /* Link it to this new one */ - PreviousOption->NextEntryOffset = (ULONG_PTR)Option - - (ULONG_PTR)Options; - } - - /* Capture the type, size, data, and offset */ - Option->Type = Type.PackedValue; - Option->DataSize = Header->Size; - RtlCopyMemory(Option + 1, BcdElements[i].Body, Header->Size); - Option->DataOffset = sizeof(BL_BCD_OPTION); - - /* Check if this was a device */ - if (Type.Format == BCD_TYPE_DEVICE) - { - /* Grab its GUID */ - DeviceOption = (PBCD_DEVICE_OPTION)(Option + 1); - DeviceId = DeviceOption->AssociatedEntry; - - /* Look up the options for that GUID */ - Status = BmGetOptionList(BcdHandle, &DeviceId, &DeviceOptions); - if (NT_SUCCESS(Status)) - { - /* Device data is after the device option */ - DeviceData = (PVOID)((ULONG_PTR)DeviceOption + Header->Size); - - /* Copy it */ - RtlCopyMemory(DeviceData, - DeviceOptions, - BlGetBootOptionListSize(DeviceOptions)); - - /* Don't need this anymore */ - BlMmFreeHeap(DeviceOptions); - - /* Write the offset of the device options */ - Option->ListOffset = (ULONG_PTR)DeviceData - - (ULONG_PTR)Option; - } - } - - /* Save the previous option and go to the next one */ - PreviousOption = Option; - Option = (PBL_BCD_OPTION)((ULONG_PTR)Option + - BlGetBootOptionSize(Option)); - } - } - - /* Return the pointer back, we've made it! */ - *OptionList = Options; - Status = STATUS_SUCCESS; - -Quickie: - /* Did we allocate a local buffer? Free it if so */ - if (BcdElements) - { - BlMmFreeHeap(BcdElements); - } - - /* Was the key open? Close it if so */ - if (ObjectHandle) - { - BiCloseKey(ObjectHandle); - } - - /* Return the option list parsing status */ - return Status; -} - -NTSTATUS -BmpUpdateApplicationOptions ( - _In_ HANDLE BcdHandle - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Options; - - /* Get the boot option list */ - Status = BmGetOptionList(BcdHandle, &BmApplicationIdentifier, &Options); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Append the options, free the local buffer, and return success */ - BlAppendBootOptions(&BlpApplicationEntry, Options); - BlMmFreeHeap(Options); - return STATUS_SUCCESS; -} - -NTSTATUS -BmpFwGetApplicationDirectoryPath ( - _In_ PUNICODE_STRING ApplicationDirectoryPath - ) -{ - NTSTATUS Status; - SIZE_T i, AppPathLength; - PWCHAR ApplicationPath, PathCopy; - - /* Clear the incoming string */ - ApplicationDirectoryPath->Length = 0; - ApplicationDirectoryPath->MaximumLength = 0; - ApplicationDirectoryPath->Buffer = 0; - - /* Get the boot application path */ - ApplicationPath = NULL; - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdLibraryString_ApplicationPath, - &ApplicationPath); - if (NT_SUCCESS(Status)) - { - /* Calculate the length of the application path */ - for (i = wcslen(ApplicationPath) - 1; i > 0; i--) - { - /* Keep going until the path separator */ - if (ApplicationPath[i] == OBJ_NAME_PATH_SEPARATOR) - { - break; - } - } - - /* Check if we have space for one more character */ - Status = RtlSIZETAdd(i, 1, &AppPathLength); - if (NT_SUCCESS(Status)) - { - /* Check if it's safe to multiply by two */ - Status = RtlSIZETMult(AppPathLength, sizeof(WCHAR), &AppPathLength); - if (NT_SUCCESS(Status)) - { - /* Allocate a copy for the string */ - PathCopy = BlMmAllocateHeap(AppPathLength); - if (PathCopy) - { - /* NULL-terminate it */ - RtlCopyMemory(PathCopy, - ApplicationPath, - AppPathLength - sizeof(UNICODE_NULL)); - PathCopy[AppPathLength] = UNICODE_NULL; - - /* Finally, initialize the outgoing string */ - RtlInitUnicodeString(ApplicationDirectoryPath, PathCopy); - } - else - { - /* No memory, fail */ - Status = STATUS_NO_MEMORY; - } - } - } - } - - /* Check if we had an application path */ - if (ApplicationPath) - { - /* No longer need this, free it */ - BlMmFreeHeap(ApplicationPath); - } - - /* All done! */ - return Status; -} - -NTSTATUS -BmFwInitializeBootDirectoryPath ( - VOID - ) -{ - PWCHAR FinalPath; - NTSTATUS Status; - PWCHAR BcdDirectory; - UNICODE_STRING BcdPath; - ULONG FinalSize; - ULONG FileHandle, DeviceHandle; - - /* Initialize everything for failure */ - BcdPath.MaximumLength = 0; - BcdPath.Buffer = NULL; - BcdDirectory = NULL; - FinalPath = NULL; - FileHandle = -1; - DeviceHandle = -1; - - /* Try to open the boot device */ - Status = BlpDeviceOpen(BlpBootDevice, - BL_DEVICE_READ_ACCESS, - 0, - &DeviceHandle); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Device open failed: %lx\r\n", Status); - goto Quickie; - } - - /* Get the directory path */ - Status = BmpFwGetApplicationDirectoryPath(&BcdPath); - BcdDirectory = BcdPath.Buffer; - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Add the BCD file name to it */ - FinalSize = BcdPath.MaximumLength + sizeof(L"\\BCD") - sizeof(UNICODE_NULL); - if (FinalSize < BcdPath.MaximumLength) - { - goto Quickie; - } - - /* Allocate space for the final path */ - FinalPath = BlMmAllocateHeap(FinalSize); - if (!FinalPath) - { - goto Quickie; - } - - /* Build it */ - RtlZeroMemory(FinalPath, FinalSize); - RtlCopyMemory(FinalPath, BcdDirectory, BcdPath.MaximumLength); - wcsncat(FinalPath, L"\\BCD", FinalSize / sizeof(WCHAR)); - - /* Try to open the file */ - Status = BlFileOpen(DeviceHandle, - FinalPath, - BL_FILE_READ_ACCESS, - &FileHandle); - if (!NT_SUCCESS(Status)) - { - BootDirectory = BcdDirectory; - goto Quickie; - } - - /* Save the boot directory */ - BootDirectory = L"\\EFI\\Boot"; /* Should be EFI\\ReactOS\\Boot */ - -Quickie: - /* Free all the allocations we made */ - if (BcdDirectory) - { - Status = BlMmFreeHeap(BcdDirectory); - } - if (FinalPath) - { - Status = BlMmFreeHeap(FinalPath); - } - - /* Close the BCD file */ - if (FileHandle != -1) - { - Status = BlFileClose(FileHandle); - } - - /* Close the boot device */ - if (DeviceHandle != -1) - { - Status = BlDeviceClose(DeviceHandle); - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BmOpenBootIni ( - VOID - ) -{ - /* Don't yet handled boot.ini */ - return STATUS_NOT_FOUND; -} - -ULONG -BmpFatalErrorMessageFilter ( - _In_ NTSTATUS ErrorStatus, - _Out_ PULONG ErrorResourceId - ) -{ - ULONG Result; - - /* Assume no message for now, check for known status message */ - Result = 0; - switch (ErrorStatus) - { - /* Convert each status to a resource ID */ - case STATUS_UNEXPECTED_IO_ERROR: - *ErrorResourceId = 9017; - Result = 1; - break; - case STATUS_IMAGE_CHECKSUM_MISMATCH: - *ErrorResourceId = 9018; - break; - case STATUS_INVALID_IMAGE_WIN_64: - *ErrorResourceId = 9016; - break; - case 0xC0000428: - *ErrorResourceId = 9019; - Result = 2; - break; - case STATUS_FVE_LOCKED_VOLUME: - *ErrorResourceId = 9013; - break; - } - - /* Return the type of message */ - return Result; -} - -VOID -BmErrorPurge ( - VOID - ) -{ - /* Check if a boot error is present */ - if (BmpPackedBootError.BootError) - { - /* Purge it */ - BlMmFreeHeap(BmpPackedBootError.BootError); - BmpPackedBootError.BootError = NULL; - } - - /* Zero out the packed buffer */ - BmpPackedBootError.Size = 0; - BmpInternalBootError = NULL; - RtlZeroMemory(&BmpErrorBuffer, sizeof(BmpErrorBuffer)); -} - -VOID -BmpErrorLog ( - _In_ ULONG ErrorCode, - _In_ NTSTATUS ErrorStatus, - _In_ ULONG ErrorMsgId, - _In_ PWCHAR FileName, - _In_ ULONG HelpMsgId - ) -{ - PWCHAR ErrorMsgString; - - /* Check if we already had an error */ - if (BmpInternalBootError) - { - /* Purge it */ - BmErrorPurge(); - } - - /* Find the string for this error ID */ - ErrorMsgString = BlResourceFindMessage(ErrorMsgId); - if (ErrorMsgString) - { - /* Fill out the error buffer */ - BmpErrorBuffer.Unknown1 = 0; - BmpErrorBuffer.Unknown2 = 0; - BmpErrorBuffer.ErrorString = ErrorMsgString; - BmpErrorBuffer.FileName = FileName; - BmpErrorBuffer.ErrorCode = ErrorCode; - BmpErrorBuffer.ErrorStatus = ErrorStatus; - BmpErrorBuffer.HelpMsgId = HelpMsgId; - BmpInternalBootError = &BmpErrorBuffer; - } -} - -VOID -BmFatalErrorEx ( - _In_ ULONG ErrorCode, - _In_ ULONG_PTR Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3, - _In_ ULONG_PTR Parameter4 - ) -{ - PWCHAR FileName, Buffer; - NTSTATUS ErrorStatus; - WCHAR FormatString[256]; - ULONG ErrorResourceId, ErrorHelpId; - BOOLEAN Restart, NoError; - - /* Assume no buffer for now */ - Buffer = NULL; - - /* Check what error code is being raised */ - switch (ErrorCode) - { - /* Error reading the BCD */ - case BL_FATAL_ERROR_BCD_READ: - - /* Check if we have a name for the BCD file */ - if (Parameter1) - { - /* Check if the name fits into our buffer */ - FileName = (PWCHAR)Parameter1; - if (wcslen(FileName) < sizeof(BmpFileNameBuffer)) - { - /* Copy it in there */ - Buffer = BmpFileNameBuffer; - wcsncpy(BmpFileNameBuffer, - FileName, - RTL_NUMBER_OF(BmpFileNameBuffer)); - } - } - - /* If we don't have a buffer, use an empty one */ - if (!Buffer) - { - Buffer = ParentFileName; - } - - /* The NTSTATUS code is in parameter 2*/ - ErrorStatus = (NTSTATUS)Parameter2; - - /* Build the error string */ - swprintf(FormatString, - L"\nAn error occurred (%08x) while attempting " - L"to read the boot configuration data file %s\n", - ErrorStatus, - Buffer); - - /* Select the resource ID message */ - ErrorResourceId = 9002; - break; - - case BL_FATAL_ERROR_BCD_ENTRIES: - - /* File name is in parameter 1 */ - FileName = (PWCHAR)Parameter1; - - /* The NTSTATUS code is in parameter 2*/ - ErrorStatus = (NTSTATUS)Parameter2; - - /* Build the error string */ - swprintf(FormatString, - L"\nNo valid entries found in the boot configuration data file %s\n", - FileName); - - /* Select the resource ID message */ - ErrorResourceId = 9007; - break; - - case BL_FATAL_ERROR_BCD_PARSE: - - /* File name isin parameter 1 */ - FileName = (PWCHAR)Parameter1; - - /* The NTSTATUS code is in parameter 2*/ - ErrorStatus = (NTSTATUS)Parameter2; - - /* Build the error string */ - swprintf(FormatString, - L"\nThe boot configuration file %s is invalid (%08x).\n", - FileName, - ErrorStatus); - - /* Select the resource ID message */ - ErrorResourceId = 9015; - break; - - case BL_FATAL_ERROR_GENERIC: - - /* The NTSTATUS code is in parameter 1*/ - ErrorStatus = (NTSTATUS)Parameter1; - - /* Build the error string */ - swprintf(FormatString, - L"\nThe boot manager experienced an error (%08x).\n", - ErrorStatus); - - /* Select the resource ID message */ - ErrorResourceId = 9005; - break; - - default: - - /* The rest is not yet handled */ - EfiPrintf(L"Unexpected fatal error: %lx\r\n", ErrorCode); - while (1); - break; - } - - /* Check if the BCD option for restart is set */ - BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_RestartOnFailure, - &Restart); - if (Restart) - { - /* Yes, so no error should be shown since we'll auto-restart */ - NoError = TRUE; - } - else - { - /* Check if the option for not showing errors is set in the BCD */ - BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_NoErrorDisplay, - &NoError); - } - - /* Do we want an error? */ - if (!NoError) - { - /* Yep, print it and then raise an error */ - BlStatusPrint(FormatString); - BlStatusError(1, ErrorCode, Parameter1, Parameter2, Parameter3); - } - - /* Get the help message ID */ - ErrorHelpId = BmpFatalErrorMessageFilter(ErrorStatus, &ErrorResourceId); - BmpErrorLog(ErrorCode, ErrorStatus, ErrorResourceId, Buffer, ErrorHelpId); -} - -NTSTATUS -BmpFwGetFullPath ( - _In_ PWCHAR FileName, - _Out_ PWCHAR* FullPath - ) -{ - NTSTATUS Status; - SIZE_T BootDirLength, PathLength; - - /* Compute the length of the directory, and add a NUL */ - BootDirLength = wcslen(BootDirectory); - Status = RtlSIZETAdd(BootDirLength, 1, &BootDirLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Add the length of the file, make sure it fits */ - PathLength = wcslen(FileName); - Status = RtlSIZETAdd(PathLength, BootDirLength, &PathLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Convert to bytes */ - Status = RtlSIZETMult(PathLength, sizeof(WCHAR), &PathLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Allocate the full path */ - *FullPath = BlMmAllocateHeap(PathLength); - if (*FullPath) - { - /* Copy the directory followed by the file name */ - wcsncpy(*FullPath, BootDirectory, PathLength / sizeof(WCHAR)); - wcsncat(*FullPath, FileName, PathLength / sizeof(WCHAR)); - } - else - { - /* Bail out since we have no memory */ - Status = STATUS_NO_MEMORY; - } - -Quickie: - /* Return to caller */ - return Status; -} - -VOID -BmCloseDataStore ( - _In_ HANDLE Handle - ) -{ - /* Check if boot.ini data needs to be freed */ - if (BmBootIniUsed) - { - EfiPrintf(L"Boot.ini not handled\r\n"); - } - - /* Dereference the hive and close the key */ - BiDereferenceHive(Handle); - BiCloseKey(Handle); -} - -NTSTATUS -BmOpenDataStore ( - _Out_ PHANDLE Handle - ) -{ - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR BcdDevice; - PWCHAR BcdPath, FullPath, PathBuffer; - BOOLEAN HavePath; - SIZE_T PathLength, FullSize; - PVOID FinalBuffer; - UNICODE_STRING BcdString; - - /* Initialize variables */ - PathBuffer = NULL; - BcdDevice = NULL; - BcdPath = NULL; - HavePath = FALSE; - - /* Check if a boot.ini file exists */ - Status = BmOpenBootIni(); - if (NT_SUCCESS(Status)) - { - BmBootIniUsed = TRUE; - } - - /* Check on which device the BCD is */ - Status = BlGetBootOptionDevice(BlpApplicationEntry.BcdData, - BcdBootMgrDevice_BcdDevice, - &BcdDevice, - NULL); - if (!NT_SUCCESS(Status)) - { - /* It's not on a custom device, so it must be where we are */ - Status = BlGetBootOptionDevice(BlpApplicationEntry.BcdData, - BcdLibraryDevice_ApplicationDevice, - &BcdDevice, - NULL); - if (!NT_SUCCESS(Status)) - { - /* This BCD option is required */ - goto Quickie; - } - } - - /* Next, check what file contains the BCD */ - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdBootMgrString_BcdFilePath, - &BcdPath); - if (NT_SUCCESS(Status)) - { - /* We don't handle custom BCDs yet */ - EfiPrintf(L"Custom BCD Not handled: %s\r\n", BcdPath); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - } - - /* Now check if the BCD is on a remote share */ - if (BcdDevice->DeviceType == UdpDevice) - { - /* Nope. Nope. Nope */ - EfiPrintf(L"UDP device Not handled\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - } - - /* Otherwise, compute the hardcoded path of the BCD */ - Status = BmpFwGetFullPath(L"\\BCD", &FullPath); - if (!NT_SUCCESS(Status)) - { - /* User the raw path */ - PathBuffer = BcdPath; - } - else - { - /* Use the path we got */ - PathBuffer = FullPath; - HavePath = TRUE; - } - - /* Check if we failed to get the BCD path */ - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Add a NUL to the path, make sure it'll fit */ - PathLength = wcslen(PathBuffer); - Status = RtlSIZETAdd(PathLength, 1, &PathLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Convert to bytes */ - Status = RtlSIZETMult(PathLength, sizeof(WCHAR), &PathLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Now add the size of the path to the device path, check if it fits */ - Status = RtlSIZETAdd(PathLength, BcdDevice->Size, &FullSize); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Allocate a final structure to hold both entities */ - FinalBuffer = BlMmAllocateHeap(FullSize); - if (!FinalBuffer) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Copy the device path and file path into the final buffer */ - RtlCopyMemory(FinalBuffer, BcdDevice, BcdDevice->Size); - RtlCopyMemory((PVOID)((ULONG_PTR)FinalBuffer + BcdDevice->Size), - PathBuffer, - PathLength); - - /* Now tell the BCD engine to open the store */ - BcdString.Length = FullSize; - BcdString.MaximumLength = FullSize; - BcdString.Buffer = FinalBuffer; - Status = BcdOpenStoreFromFile(&BcdString, Handle); - - /* Free our final buffer */ - BlMmFreeHeap(FinalBuffer); - -Quickie: - /* Did we allocate a device? */ - if (BcdDevice) - { - /* Free it */ - BlMmFreeHeap(BcdDevice); - } - - /* Is this the failure path? */ - if (!NT_SUCCESS(Status)) - { - /* Raise a fatal error */ - BmFatalErrorEx(BL_FATAL_ERROR_BCD_READ, - (ULONG_PTR)PathBuffer, - Status, - 0, - 0); - } - - /* Did we get an allocated path? */ - if ((PathBuffer) && (HavePath)) - { - /* Free it */ - BlMmFreeHeap(PathBuffer); - } - - /* Return back to the caller */ - return Status; -} - -typedef struct _BL_BSD_LOG_OBJECT -{ - ULONG DeviceId; - ULONG FileId; - ULONG Unknown; - ULONG Size; - ULONG Flags; -} BL_BSD_LOG_OBJECT, *PBL_BSD_LOG_OBJECT; - -BL_BSD_LOG_OBJECT BsdpLogObject; -BOOLEAN BsdpLogObjectInitialized; - -VOID -BlBsdInitializeLog ( - _In_ PBL_DEVICE_DESCRIPTOR LogDevice, - _In_ PWCHAR LogPath, - _In_ ULONG Flags - ) -{ - NTSTATUS Status; - - /* Don't initialize twice */ - if (BsdpLogObjectInitialized) - { - return; - } - - /* Set invalid IDs for now */ - BsdpLogObject.DeviceId = -1; - BsdpLogObject.FileId = -1; - - /* Open the BSD device */ - Status = BlpDeviceOpen(LogDevice, - BL_DEVICE_READ_ACCESS | BL_DEVICE_WRITE_ACCESS, - 0, - &BsdpLogObject.DeviceId); - if (!NT_SUCCESS(Status)) - { - /* Welp that didn't work */ - goto FailurePath; - } - - /* Now open the BSD itself */ - Status = BlFileOpen(BsdpLogObject.DeviceId, - LogPath, - BL_FILE_READ_ACCESS | BL_FILE_WRITE_ACCESS, - &BsdpLogObject.FileId); - if (!NT_SUCCESS(Status)) - { - /* D'oh */ - goto FailurePath; - } - - /* The BSD is open. Start doing stuff to it */ - EfiPrintf(L"Unimplemented BSD path\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - -FailurePath: - /* Close the BSD if we had it open */ - if (BsdpLogObject.FileId != -1) - { - BlFileClose(BsdpLogObject.FileId); - } - - /* Close the device if we had it open */ - if (BsdpLogObject.DeviceId != -1) - { - BlDeviceClose(BsdpLogObject.DeviceId); - } - - /* Set BSD object to its uninitialized state */ - BsdpLogObjectInitialized = FALSE; - BsdpLogObject.FileId = 0; - BsdpLogObject.DeviceId = 0; - BsdpLogObject.Flags = 0; - BsdpLogObject.Unknown = 0; - BsdpLogObject.Size = 0; -} - -VOID -BmpInitializeBootStatusDataLog ( - VOID - ) -{ - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR BsdDevice; - PWCHAR BsdPath; - ULONG Flags; - BOOLEAN PreserveBsd; - - /* Initialize locals */ - BsdPath = NULL; - BsdDevice = NULL; - Flags = 0; - - /* Check if the BSD is stored in a custom device */ - Status = BlGetBootOptionDevice(BlpApplicationEntry.BcdData, - BcdLibraryDevice_BsdLogDevice, - &BsdDevice, - NULL); - if (!NT_SUCCESS(Status)) - { - /* Nope, use the boot device */ - BsdDevice = BlpBootDevice; - } - - /* Check if the path is custom as well */ - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdLibraryString_BsdLogPath, - &BsdPath); - if (!NT_SUCCESS(Status)) - { - /* Nope, use our default path */ - Status = BmpFwGetFullPath(L"\\bootstat.dat", &BsdPath); - if (!NT_SUCCESS(Status)) - { - BsdPath = NULL; - } - - /* Set preserve flag */ - Flags = 1; - } - else - { - /* Set preserve flag */ - Flags = 1; - } - - /* Finally, check if the BSD should be preserved */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_PreserveBsdLog, - &PreserveBsd); - if (!(NT_SUCCESS(Status)) || !(PreserveBsd)) - { - /* We failed to read, or we were asked not to preserve it */ - Flags = 0; - } - - /* Initialize the log */ - BlBsdInitializeLog(BsdDevice, BsdPath, Flags); - - /* Free the BSD device descriptor if we had one */ - if (BsdDevice) - { - BlMmFreeHeap(BsdDevice); - } - - /* Free the BSD path if we had one */ - if ((Flags) && (BsdPath)) - { - BlMmFreeHeap(BsdPath); - } -} - -VOID -BmFwMemoryInitialize ( - VOID - ) -{ - NTSTATUS Status; - PHYSICAL_ADDRESS PhysicalAddress; - BL_ADDRESS_RANGE AddressRange; - - /* Select the range below 1MB */ - AddressRange.Maximum = 0xFFFFF; - AddressRange.Minimum = 0; - - /* Allocate one reserved page with the "below 1MB" attribute */ - Status = MmPapAllocatePhysicalPagesInRange(&PhysicalAddress, - BlApplicationReserved, - 1, - BlMemoryBelow1MB, - 0, - &MmMdlUnmappedAllocated, - &AddressRange, - BL_MM_REQUEST_DEFAULT_TYPE); - if (!NT_SUCCESS(Status)) - { - /* Print a message on error, but keep going */ - BlStatusPrint(L"BmFwMemoryInitialize: Failed to allocate a page below 1MB. Status: 0x%08x\r\n", - Status); - } -} - -NTSTATUS -BmpBgDisplayClearScreen ( - _In_ ULONG Color - ) -{ - /* Not yet supported */ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlXmiWrite ( - _In_ PWCHAR XmlTag - ) -{ - /* Sigh */ - EfiPrintf(L"XML: %s\r\n", XmlTag); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlXmiInitialize ( - _In_ PWCHAR Stylesheet - ) -{ - /* Reset the cursor type */ - BlDisplaySetCursorType(0); - - /* Nope, not doing any XML stuff */ - return STATUS_SUCCESS; -} - -NTSTATUS -BmFwVerifySelfIntegrity ( - VOID - ) -{ - /* Check if we're booted by UEFI off the DVD directly */ - if ((BlpBootDevice->DeviceType == LocalDevice) && - (BlpBootDevice->Local.Type == CdRomDevice) && - (BlpApplicationFlags & BL_APPLICATION_FLAG_CONVERTED_FROM_EFI)) - { - /* Windows actually bypasses integrity checks in this case. Works for us */ - return STATUS_SUCCESS; - } - - /* Our binaries aren't signed, so always return failure */ - return 0xC0000428; -} - -NTSTATUS -BmFwRegisterRevocationList ( - VOID - ) -{ - NTSTATUS Status; - BOOLEAN SecureBootEnabled; - - /* Is SecureBoot enabled? */ - Status = BlSecureBootIsEnabled(&SecureBootEnabled); - if ((NT_SUCCESS(Status)) && (SecureBootEnabled)) - { - EfiPrintf(L"SB not implemented revok\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - else - { - /* Nothing to do without SecureBoot */ - Status = STATUS_SUCCESS; - } - - /* Return revocation result back to caller */ - return Status; -} - -NTSTATUS -BmResumeFromHibernate ( - _Out_ PHANDLE BcdResumeHandle - ) -{ - NTSTATUS Status; - BOOLEAN AttemptResume; - - /* Should we attempt to resume from hibernation? */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_AttemptResume, - &AttemptResume); - if (!NT_SUCCESS(Status)) - { - /* Nope. Is automatic restart on crash enabled? */ - AttemptResume = FALSE; - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdOSLoaderBoolean_DisableCrashAutoReboot, - &AttemptResume); - AttemptResume = (NT_SUCCESS(Status) && (AttemptResume)); - } - - /* Don't do anything if there's no need to resume anything */ - if (!AttemptResume) - { - return STATUS_SUCCESS; - } - - /* Not yet implemented */ - EfiPrintf(L"Resume not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BmpProcessBadMemory ( - VOID - ) -{ - BL_PD_DATA_BLOB BadMemoryData; - NTSTATUS Status; - - /* Try to get the memory data from the memtest application */ - BadMemoryData.BlobSize = 0; - BadMemoryData.Data = NULL; - BadMemoryData.DataSize = 0; - Status = BlPdQueryData(&BadMemoryGuid, NULL, &BadMemoryData); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - /* No results, or some other error */ - return Status; - } - - /* Not yet implemented */ - EfiPrintf(L"Bad page list persistence not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BmPurgeOption ( - _In_ HANDLE BcdHandle, - _In_ PGUID ObjectId, - _In_ ULONG Type - ) -{ - HANDLE ObjectHandle; - NTSTATUS Status; - - /* Open the object */ - Status = BcdOpenObject(BcdHandle, ObjectId, &ObjectHandle); - if (NT_SUCCESS(Status)) - { - /* Delete the element */ - BcdDeleteElement(ObjectHandle, Type); - - /* Close the object and set success */ - BiCloseKey(ObjectHandle); - Status = STATUS_SUCCESS; - } - - /* Return the result */ - return Status; -} - -NTSTATUS -BmGetEntryDescription ( - _In_ HANDLE BcdHandle, - _In_ PGUID ObjectId, - _Out_ PBCD_OBJECT_DESCRIPTION Description - ) -{ - NTSTATUS Status; - HANDLE ObjectHandle; - - /* Open the BCD object */ - Status = BcdOpenObject(BcdHandle, ObjectId, &ObjectHandle); - if (NT_SUCCESS(Status)) - { - /* Make sure the caller passed this argument in */ - if (!Description) - { - /* Fail otherwise */ - Status = STATUS_INVALID_PARAMETER; - } - else - { - /* Query the description from the BCD interface */ - Status = BiGetObjectDescription(ObjectHandle, Description); - } - - /* Close the object key */ - BiCloseKey(ObjectHandle); - } - - /* Return the result back */ - return Status; -} - -NTSTATUS -BmpPopulateBootEntryList ( - _In_ HANDLE BcdHandle, - _In_ PGUID SequenceList, - _In_ ULONG Flags, - _Out_ PBL_LOADED_APPLICATION_ENTRY* BootSequence, - _Out_ PULONG SequenceCount - ) -{ - NTSTATUS Status; - ULONG BootIndex, i, OptionSize; - PBL_LOADED_APPLICATION_ENTRY BootEntry; - PBL_BCD_OPTION Options; - BCD_OBJECT_DESCRIPTION Description; - BcdObjectType ObjectType; - BOOLEAN HavePath, IsWinPe, SoftReboot; - PWCHAR LoaderPath; - - /* Initialize locals */ - Options = NULL; - BootIndex = 0; - Status = STATUS_NOT_FOUND; - - /* Loop through every element in the sequence */ - for (i = 0; i < *SequenceCount; i++) - { - /* Assume failure */ - BootEntry = NULL; - - /* Get the options for the sequence element */ - Status = BmGetOptionList(BcdHandle, SequenceList, &Options); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"option list failed: %lx\r\n", Status); - goto LoopQuickie; - } - - /* Make sure there's at least a path and description */ - if (!(MiscGetBootOption(Options, BcdLibraryDevice_ApplicationDevice)) || - !(MiscGetBootOption(Options, BcdLibraryString_Description))) - { - Status = STATUS_UNSUCCESSFUL; - EfiPrintf(L"missing list failed: %lx\r\n", Status); - goto LoopQuickie; - } - - /* Get the size of the BCD options and allocate a large enough entry */ - OptionSize = BlGetBootOptionListSize(Options); - BootEntry = BlMmAllocateHeap(sizeof(*BootEntry) + OptionSize); - if (!BootEntry) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Save it as part of the sequence */ - BootSequence[BootIndex] = BootEntry; - - /* Initialize it, and copy the BCD data */ - RtlZeroMemory(BootEntry, sizeof(*BootEntry)); - BootEntry->Guid = *SequenceList; - BootEntry->BcdData = (PBL_BCD_OPTION)(BootEntry + 1); - BootEntry->Flags = Flags; - RtlCopyMemory(BootEntry->BcdData, Options, OptionSize); - - /* Get the object descriptor to find out what kind of entry it is */ - Status = BmGetEntryDescription(BcdHandle, - &BootEntry->Guid, - &Description); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"missing desc failed: %lx\r\n", Status); - goto LoopQuickie; - } - - /* Check if a path was given or not */ - HavePath = MiscGetBootOption(Options, BcdLibraryString_ApplicationPath) ? - TRUE : FALSE; - - /* Now select based on what type of object this is -- must be an app */ - ObjectType.PackedValue = Description.Type; - if (ObjectType.Application.ObjectCode == BCD_OBJECT_TYPE_APPLICATION) - { - /* Then select based on what kind of app it is */ - switch (ObjectType.Application.ApplicationCode) - { - /* Another boot manager */ - case BCD_APPLICATION_TYPE_BOOTMGR: - BootEntry->Flags |= BCD_APPLICATION_TYPE_BOOTMGR; - break; - - /* An OS loader */ - case BCD_APPLICATION_TYPE_OSLOADER: - BootEntry->Flags |= BL_APPLICATION_ENTRY_WINLOAD; - - /* Do we have a path for it? */ - if (!HavePath) - { - /* We'll try to make one up. Is this WinPE? */ - IsWinPe = FALSE; - Status = BlGetBootOptionBoolean(Options, - BcdOSLoaderBoolean_WinPEMode, - &IsWinPe); - if (!(NT_SUCCESS(Status)) && (Status != STATUS_NOT_FOUND)) - { - goto Quickie; - } - - /* Use the appropriate path for WinPE or local install */ - LoaderPath = IsWinPe ? - L"\\Windows\\System32\\boot\\winload.efi" : - L"\\Windows\\System32\\winload.efi"; - - /* Add the path to the boot entry */ - Status = BlAppendBootOptionString(BootEntry, - BcdLibraryString_ApplicationPath, - LoaderPath); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* We have a path now */ - HavePath = TRUE; - } - break; - - /* A hibernate-resume application */ - case BCD_APPLICATION_TYPE_RESUME: - BootEntry->Flags |= BL_APPLICATION_ENTRY_WINRESUME; - break; - - /* An older OS NTLDR */ - case BCD_APPLICATION_TYPE_NTLDR: - BootEntry->Flags |= BL_APPLICATION_ENTRY_NTLDR; - break; - - /* An older OS SETUPLDR */ - case BCD_APPLICATION_TYPE_SETUPLDR: - BootEntry->Flags |= BL_APPLICATION_ENTRY_SETUPLDR; - break; - - /* A 3rd party/Win9x boot sector */ - case BCD_APPLICATION_TYPE_BOOTSECTOR: - BootEntry->Flags |= BL_APPLICATION_ENTRY_BOOTSECTOR; - break; - - /* Something else entirely */ - default: - break; - } - } - - /* We better have a path by now */ - if (!HavePath) - { - Status = STATUS_UNSUCCESSFUL; - goto LoopQuickie; - } - - /* Check if this is a real mode startup.com */ - if ((ObjectType.Application.ObjectCode == BCD_OBJECT_TYPE_APPLICATION) && - (ObjectType.Application.ImageCode == BCD_IMAGE_TYPE_REAL_MODE) && - (ObjectType.Application.ApplicationCode == BCD_APPLICATION_TYPE_STARTUPCOM)) - { - /* Check if PXE soft reboot will occur */ - Status = BlGetBootOptionBoolean(Options, - BcdStartupBoolean_PxeSoftReboot, - &SoftReboot); - if ((NT_SUCCESS(Status)) && (SoftReboot)) - { - /* Then it's a valid startup.com entry */ - BootEntry->Flags |= BL_APPLICATION_ENTRY_STARTUP; - } - } - -LoopQuickie: - /* All done with this entry -- did we have BCD options? */ - if (Options) - { - /* Free them, they're part of the entry now */ - BlMmFreeHeap(Options); - Options = NULL; - } - - /* Did we fail anywhere? */ - if (!NT_SUCCESS(Status)) - { - /* Yep -- did we fail with an active boot entry? */ - if (BootEntry) - { - /* Destroy it */ - BlDestroyBootEntry(BootEntry); - BootSequence[BootIndex] = NULL; - } - } - else - { - /* It worked, so populate the next index now */ - BootIndex++; - } - - /* And move to the next GUID in the sequence list */ - SequenceList++; - } - -Quickie: - /* All done now -- did we have any BCD options? */ - if (Options) - { - /* Free them */ - BlMmFreeHeap(Options); - } - - /* Return the status */ - return Status; -} - -NTSTATUS -BmGetBootSequence ( - _In_ HANDLE BcdHandle, - _In_ PGUID SequenceList, - _In_ ULONG SequenceListCount, - _In_ ULONG Flags, - _Out_ PBL_LOADED_APPLICATION_ENTRY** BootSequence, - _Out_ PULONG SequenceCount - ) -{ - PBL_LOADED_APPLICATION_ENTRY* Sequence; - ULONG Count = SequenceListCount; - NTSTATUS Status; - - /* Allocate the sequence list */ - Sequence = BlMmAllocateHeap(SequenceListCount * sizeof(*Sequence)); - if (!Sequence) - { - return STATUS_NO_MEMORY; - } - - /* Populate the sequence list */ - Status = BmpPopulateBootEntryList(BcdHandle, - SequenceList, - Flags, - Sequence, - &Count); - if (!NT_SUCCESS(Status)) - { - /* Free the list on failure */ - BlMmFreeHeap(Sequence); - } - else - { - /* Otherwise, set success and return the list and count */ - Status = STATUS_SUCCESS; - *BootSequence = Sequence; - *SequenceCount = Count; - } - - /* All done */ - return Status; -} - -NTSTATUS -BmEnumerateBootEntries ( - _In_ HANDLE BcdHandle, - _Out_ PBL_LOADED_APPLICATION_ENTRY **BootSequence, - _Out_ PULONG SequenceCount - ) -{ - NTSTATUS Status; - ULONG BootIndex, BootIniCount, BootEntryCount, BcdCount; - PBL_LOADED_APPLICATION_ENTRY* Sequence; - PGUID DisplayOrder; - GUID DefaultObject; - BOOLEAN UseDisplayList; - - /* Initialize locals */ - BootIndex = 0; - - /* First try to get the display list, if any */ - UseDisplayList = TRUE; - Status = BlGetBootOptionGuidList(BlpApplicationEntry.BcdData, - BcdBootMgrObjectList_DisplayOrder, - &DisplayOrder, - &BcdCount); - if (!NT_SUCCESS(Status)) - { - /* No list, get the default entry instead */ - Status = BlGetBootOptionGuid(BlpApplicationEntry.BcdData, - BcdBootMgrObject_DefaultObject, - &DefaultObject); - if (NT_SUCCESS(Status)) - { - /* Set the array to just our entry */ - UseDisplayList = FALSE; - BcdCount = 1; - DisplayOrder = &DefaultObject; - } - else - { - /* No default list either, return success but no entries */ - *BootSequence = NULL; - *SequenceCount = 0; - Status = STATUS_SUCCESS; - DisplayOrder = NULL; - goto Quickie; - } - } - - /* Check if boot.ini was used */ - BootIniCount = 0; - if (BmBootIniUsed) - { - /* Get the entries from it */ - EfiPrintf(L"Boot.ini not supported\r\n"); - BootIniCount = 0;//BmBootIniGetEntryCount(); - } - - /* Allocate an array large enough for the combined boot entries */ - BootEntryCount = BootIniCount + BcdCount; - Sequence = BlMmAllocateHeap(BootEntryCount * sizeof(*Sequence)); - if (!Sequence) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Zero it out */ - RtlZeroMemory(Sequence, BootEntryCount * sizeof(*Sequence)); - - /* Check if we had BCD entries */ - if (BcdCount) - { - /* Populate the list of bootable entries */ - Status = BmpPopulateBootEntryList(BcdHandle, - DisplayOrder, - BL_APPLICATION_ENTRY_DISPLAY_ORDER, - Sequence, - &BcdCount); - if (!NT_SUCCESS(Status)) - { - /* Bail out */ - goto Quickie; - } - } - - /* Check if we had boot.ini entries */ - if (BootIniCount) - { - /* TODO */ - EfiPrintf(L"Boot.ini not supported\r\n"); - } - - /* Return success and the sequence + count populated */ - Status = STATUS_SUCCESS; - *BootSequence = Sequence; - *SequenceCount = BootIniCount + BcdCount; - -Quickie: - /* Check if we had allocated a GUID list */ - if ((UseDisplayList) && (DisplayOrder)) - { - /* Free it */ - BlMmFreeHeap(DisplayOrder); - } - - /* Check if this is the failure path */ - if (!(NT_SUCCESS(Status)) && (Sequence)) - { - /* Loop the remaining boot entries */ - while (BootIndex < BootEntryCount) - { - /* Check if it had been allocated */ - if (Sequence[BootIndex]) - { - /* Free it */ - BlMmFreeHeap(Sequence[BootIndex]); - } - - /* Next*/ - BootIndex++; - } - - /* Free the whole sequence now */ - BlMmFreeHeap(Sequence); - } - - /* All done, return the result */ - return Status; -} - -VOID -BmpGetDefaultBootEntry ( - _In_ PBL_LOADED_APPLICATION_ENTRY* Sequence, - _In_ ULONG Count, - _Out_ PBL_LOADED_APPLICATION_ENTRY* DefaultEntry, - _Out_ PULONG DefaultIndex - ) -{ - GUID DefaultObject; - NTSTATUS Status; - ULONG BootIndex; - - /* Assume no default */ - *DefaultEntry = *Sequence; - *DefaultIndex = 0; - - /* Nothing to do if there's just one entry */ - if (Count == 1) - { - return; - } - - /* Get the default object, bail out if there isn't one */ - Status = BlGetBootOptionGuid(BlpApplicationEntry.BcdData, - BcdBootMgrObject_DefaultObject, - &DefaultObject); - if (!(NT_SUCCESS(Status)) || !(Count)) - { - return; - } - - /* Scan the boot sequence */ - for (BootIndex = 0; BootIndex < Count; BootIndex++) - { - /* Find one that matches the default */ - if (RtlEqualMemory(&Sequence[BootIndex]->Guid, - &DefaultObject, - sizeof(GUID))) - { - /* Return it */ - *DefaultEntry = Sequence[BootIndex]; - *DefaultIndex = BootIndex; - return; - } - } -} - -BL_MENU_POLICY -BmGetBootMenuPolicy ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry - ) -{ - NTSTATUS Status; - BOOLEAN EmsEnabled; - ULONGLONG BootMenuPolicy; - ULONG OptionId; - - /* Check if EMS is enabled */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdOSLoaderBoolean_EmsEnabled, - &EmsEnabled); - if ((NT_SUCCESS(Status)) && (EmsEnabled)) - { - /* No boot menu */ - return MenuPolicyLegacy; - } - - /* Check what entry we are looking at */ - if (!BootEntry) - { - /* No entry, pick the selected one */ - BootEntry = BmpSelectedBootEntry; - } - - /* Do we still not have an entry? */ - if (!BootEntry) - { - /* Show the menu */ - return MenuPolicyStandard; - } - - /* Check if this is an OS loader */ - BootMenuPolicy = 0; - if (BootEntry->Flags & BL_APPLICATION_ENTRY_WINLOAD) - { - /* Use the correct option ID */ - OptionId = BcdOSLoaderInteger_BootMenuPolicy; - } - else - { - /* Check if this is an OS resumer */ - if (!(BootEntry->Flags & BL_APPLICATION_ENTRY_WINRESUME)) - { - /* Nope, so no reason for a menu */ - return MenuPolicyLegacy; - } - - /* Use the correct option ID */ - OptionId = BcdResumeInteger_BootMenuPolicy; - } - - /* Check the option ID for the boot menu policy */ - Status = BlGetBootOptionInteger(BootEntry->BcdData, - OptionId, - &BootMenuPolicy); - if (NT_SUCCESS(Status)) - { - /* We have one, return it */ - return BootMenuPolicy; - } - - /* No policy, so assume no menu */ - return MenuPolicyLegacy; -} - -VOID -BmDisplayGetBootMenuStatus ( - _Out_ PL_MENU_STATUS MenuStatus - ) -{ - /* For now, don't support key input at all */ - MenuStatus->AsULong = 0; - MenuStatus->OemKey = UNICODE_NULL; - MenuStatus->BootIndex = -1; -} - -NTSTATUS -BmProcessCustomAction ( - _In_ HANDLE BcdHandle, - _In_ PWCHAR ActionKey - ) -{ - EfiPrintf(L"Custom actions not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -VOID -BmpProcessBootEntry ( - _In_ HANDLE BcdHandle, - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PBOOLEAN ExitBootManager - ) -{ - BL_MENU_STATUS MenuStatus; - - /* Don't exit */ - *ExitBootManager = FALSE; - - /* If the legacy menu must be shown, or if we have a boot entry */ - if ((BmGetBootMenuPolicy(BootEntry) != MenuPolicyStandard) || (BootEntry)) - { - /* Check if any key has been pressed */ - BmDisplayGetBootMenuStatus(&MenuStatus); - if (MenuStatus.AnyKey) - { - /* Was the exit key pressed? */ - if (MenuStatus.Exit) - { - /* Don't display a menu, and exit */ - *ExitBootManager = TRUE; - BmpDisplayBootMenu = FALSE; - } - else if (MenuStatus.OemKey) - { - /* Process the OEM key action */ - BmProcessCustomAction(BcdHandle, &MenuStatus.KeyValue); - } - else - { - /* Process other keys */ - EfiPrintf(L"TODO\r\n"); - } - } - } -} - -NTSTATUS -BmpGetSelectedBootEntry ( - _In_ HANDLE BcdHandle, - _Out_ PBL_LOADED_APPLICATION_ENTRY* SelectedBootEntry, - _Out_ PULONG EntryIndex, - _Out_ PBOOLEAN ExitBootManager - ) -{ - NTSTATUS Status; - PBL_LOADED_APPLICATION_ENTRY* Sequence; - PBL_LOADED_APPLICATION_ENTRY Entry, SelectedEntry; - ULONG Count, BootIndex, SelectedIndex; - // BOOLEAN FoundFailedEntry; - ULONGLONG Timeout; - - /* Initialize locals */ - BootIndex = 0; - Count = 0; - Sequence = NULL; - SelectedEntry = NULL; - - /* Enumerate all the boot entries */ - Status = BmEnumerateBootEntries(BcdHandle, &Sequence, &Count); - if (!NT_SUCCESS(Status)) - { - /* Bail out if we failed */ - goto Quickie; - } - - /* Check if there are no entries */ - if (!Count) - { - /* This is fatal -- kill the system */ - Status = STATUS_FILE_INVALID; - BmFatalErrorEx(BL_FATAL_ERROR_BCD_ENTRIES, (ULONG_PTR)L"\\BCD", Status, 0, 0); - goto Quickie; - } - - /* Check if we don't yet have an array of failed boot entries */ - if (!BmpFailedBootEntries) - { - /* Allocate it */ - BmpFailedBootEntries = BlMmAllocateHeap(Count); - if (BmpFailedBootEntries) - { - /* Zero it out */ - RtlZeroMemory(BmpFailedBootEntries, Count); - } - } - - /* Check if we have a hardcoded boot override */ - if (BmBootEntryOverridePresent) - { - EfiPrintf(L"Hard-coded boot override mode not supported\r\n"); - } - - /* Log the OS count */ - //BlLogEtwWrite(BOOT_BOOTMGR_MULTI_OS_COUNT); - - /* Check if the display is already active and cached */ - if (!BmDisplayStateCached) - { - /* Check if we should display a boot menu */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_DisplayBootMenu, - &BmpDisplayBootMenu); - if (!NT_SUCCESS(Status)) - { - /* Assume not */ - BmpDisplayBootMenu = FALSE; - } - } - - /* Check if there's only one entry to boot anyway */ - if (Count == 1) - { - /* Read it */ - SelectedEntry = *Sequence; - - /* Process it */ - BmpProcessBootEntry(BcdHandle, SelectedEntry, ExitBootManager); - - /* Check if we're not displaying a boot menu */ - if (!BmpDisplayBootMenu) - { - /* Now we are */ - BmpDisplayBootMenu = TRUE; - - /* Return the entry and its index back */ - *EntryIndex = 0; - *SelectedBootEntry = SelectedEntry; - Status = STATUS_SUCCESS; - goto Quickie; - } - } - else - { - /* Get the default boot entry */ - BmpGetDefaultBootEntry(Sequence, Count, &SelectedEntry, &SelectedIndex); - - /* Check if we have a failed boot entry array allocated */ - //FoundFailedEntry = FALSE; - if (BmpFailedBootEntries) - { - /* Check if the default entry failed to boot */ - if (BmpFailedBootEntries[SelectedIndex]) - { - /* Loop through the current boot sequence */ - for (SelectedIndex = 0; SelectedIndex < Count; SelectedIndex++) - { - /* Check if there's no sequence for this index, or it failed */ - while (!(Sequence[SelectedIndex]) || - (BmpFailedBootEntries[SelectedIndex])) - { - /* Remember that this is a failed entry */ - SelectedEntry = Sequence[SelectedIndex]; - //FoundFailedEntry = TRUE; - BmpDisplayBootMenu = FALSE; - } - } - } - } - - /* Check if the entry is an OS loader */ - if (SelectedEntry->Flags & BL_APPLICATION_ENTRY_WINLOAD) - { - // todo - EfiPrintf(L"todo path\r\n"); - } - - /* Check if there's no timeout */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdBootMgrInteger_Timeout, - &Timeout); - if ((NT_SUCCESS(Status) && !(Timeout))) - { - /* There isn't, so just process the default entry right away */ - BmpProcessBootEntry(BcdHandle, SelectedEntry, ExitBootManager); - - /* Check if we're not displaying a boot menu */ - if (!BmpDisplayBootMenu) - { - /* Now we are */ - BmpDisplayBootMenu = TRUE; - - /* Return the entry and its index back */ - *EntryIndex = 0; - *SelectedBootEntry = SelectedEntry; - Status = STATUS_SUCCESS; - goto Quickie; - } - - /* Remove the timeout for this boot instance */ - BlRemoveBootOption(BlpApplicationEntry.BcdData, - BcdBootMgrInteger_Timeout); - } - } - - /* Here is where we display the menu and list of tools */ - EfiPrintf(L"Tool selection not yet implemented\r\n"); - EfiStall(10000000); - *SelectedBootEntry = NULL; - -Quickie: - /* We are done -- did we have a sequence? */ - if (Sequence) - { - /* Do we have any boot entries we parsed? */ - while (BootIndex < Count) - { - /* Get the current boot entry */ - Entry = Sequence[BootIndex]; - - /* Did we fail, or is is not the selected one? */ - if ((Entry) && ((Entry != SelectedEntry) || !(NT_SUCCESS(Status)))) - { - /* Destroy it, as it won't be needed */ - BlDestroyBootEntry(Entry); - } - else if (Entry == SelectedEntry) - { - /* It's the selected one, return its index */ - *EntryIndex = BootIndex; - } - - /* Move to the next entry */ - BootIndex++; - } - - /* Free the sequence of entries */ - BlMmFreeHeap(Sequence); - } - - /* Return the selection result */ - return Status; -} - -NTSTATUS -BmLaunchRecoverySequence ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _In_ ULONG LaunchCode - ) -{ - NTSTATUS Status; - PBL_LOADED_APPLICATION_ENTRY RecoveryEntry; - HANDLE BcdHandle; - PGUID RecoverySequence; - ULONG Count, i, RecoveryIndex, SequenceCount; - PBL_LOADED_APPLICATION_ENTRY* Sequence; - - /* Initialize locals */ - RecoveryIndex = 0; - Sequence = NULL; - RecoverySequence = NULL; - Count = 0; - BcdHandle = NULL; - - /* Open the BCD*/ - Status = BmOpenDataStore(&BcdHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Get the recovery sequence list */ - Status = BlGetBootOptionGuidList(BootEntry->BcdData, - BcdLibraryObjectList_RecoverySequence, - &RecoverySequence, - &SequenceCount); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Get the sequence of boot entries out of it */ - Status = BmGetBootSequence(BcdHandle, - RecoverySequence, - SequenceCount, - BL_APPLICATION_ENTRY_RECOVERY, - &Sequence, - &Count); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Was the BCD open? */ - if (BcdHandle) - { - /* Close it */ - BmCloseDataStore(BcdHandle); - } - - /* Now go over every entry in the sequence */ - for (i = 0; i < Count; ++i) - { - /* Check the code for this recovery launch */ - if (LaunchCode == 2 || LaunchCode == 5) - { - /* Remove the override if there is one, and set it to 4 */ - BlRemoveBootOption(Sequence[i]->BcdData, BcdLibraryInteger_DisplayMessageOverride); - BlAppendBootOptionInteger(Sequence[i], - BcdLibraryInteger_DisplayMessageOverride, - 4); - } - else if (LaunchCode == 3) - { - /* Remove the override if there is one, and set it to 10 */ - BlRemoveBootOption(Sequence[i]->BcdData, BcdLibraryInteger_DisplayMessageOverride); - BlAppendBootOptionInteger(Sequence[i], - BcdLibraryInteger_DisplayMessageOverride, - 10); - } - - /* Launch the boot entry for this part of the recovery sequence */ - Status = BmpLaunchBootEntry(Sequence[i], NULL, LaunchCode, FALSE); - if (!NT_SUCCESS(Status)) - { - break; - } - } - -Quickie: - /* Did we have a sequence of entries? */ - if (Sequence) - { - /* Loop through each one */ - for (RecoveryIndex = 0; RecoveryIndex < Count; RecoveryIndex++) - { - /* Does this index have an allocated boot entry? */ - RecoveryEntry = Sequence[RecoveryIndex]; - if (RecoveryEntry) - { - /* Destroy it */ - BlDestroyBootEntry(RecoveryEntry); - } - } - - /* Free the sequence itself */ - BlMmFreeHeap(Sequence); - } - - /* Was there a sequence list? */ - if (RecoverySequence) - { - /* Free it */ - BlMmFreeHeap(RecoverySequence); - } - - /* Return back to caller */ - return Status; -} - -ULONG -BmDisplayDumpError ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _In_ ULONG LaunchCode - ) -{ - ULONG BootError; - NTSTATUS Status; - BOOLEAN Restart, NoError; - - /* Assume we'll just reboot */ - BootError = Reboot; - - /* Should we reboot? */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_RestartOnFailure, - &Restart); - if ((NT_SUCCESS(Status)) && (Restart)) - { - return BootError; - } - - /* Should we not show errors, and thus, reboot? */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_NoErrorDisplay, - &NoError); - if ((NT_SUCCESS(Status)) && (NoError)) - { - return BootError; - } - - /* Is there an internal boot error? */ - if (BmpInternalBootError) - { - /* Return it -- but it's a pointer? */ - return (ULONG_PTR)BmpInternalBootError; // ??? - } - - /* Otherwise, show the menu to see what to do */ - EfiPrintf(L"Error menu not yet implemented\r\n"); - return BootError; -} - -NTSTATUS -BmpCreateDevices ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry - ) -{ - ULONG NextOffset, DataOffset, ListOffset; - PBL_BCD_OPTION Option, ListOption; - BcdElementType ElementType; - PBCD_DEVICE_OPTION BcdDevice; - - /* Starting at offset 0, loop every BCD option */ - NextOffset = 0; - do - { - /* Get the current option, and its offset */ - Option = (PBL_BCD_OPTION)((ULONG_PTR)BootEntry->BcdData + NextOffset); - NextOffset = Option->NextEntryOffset; - - /* If it's empty, ignore it */ - if (Option->Empty) - { - continue; - } - - /* If it's not a device option, ignore it */ - ElementType.PackedValue = Option->Type; - if (ElementType.Format != BCD_TYPE_DEVICE) - { - continue; - } - - /* Get the data offset */ - DataOffset = Option->DataOffset; - - /* Extract the device out of it */ - BcdDevice = (PBCD_DEVICE_OPTION)((ULONG_PTR)BootEntry->BcdData + DataOffset); - - /* If the device is already fully specified, no need to build it */ - if (!(BcdDevice->DeviceDescriptor.Flags & 1)) - { - continue; - } - - /* Otherwise, check if there's any list options as well */ - ListOption = NULL; - ListOffset = Option->ListOffset; - if (Option->ListOffset) - { - ListOption = (PBL_BCD_OPTION)((ULONG_PTR)BootEntry->BcdData + ListOffset); - } - - /* And now call BlCreateDevice to build the full device descriptor */ - EfiPrintf(L"Unspecified devices not yet supported: %p\r\n", ListOption); - return STATUS_NOT_SUPPORTED; - } while (NextOffset != 0); - - /* Devices created successfully */ - return STATUS_SUCCESS; -} - -NTSTATUS -BmpTransferExecution ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PULONG LaunchCode, - _Out_ PBOOLEAN Recover - ) -{ - PWCHAR AppPath; - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR AppDevice; - BL_RETURN_ARGUMENTS ReturnArgs; - BOOLEAN AdvancedOptions; - ULONG AppHandle; - - /* Get the application path */ - Status = BlGetBootOptionString(BootEntry->BcdData, - BcdLibraryString_ApplicationPath, - &AppPath); - if (!NT_SUCCESS(Status)) - { - /* If we couldn't find one, set this to NULL */ - AppPath = NULL; - } - - /* Check if this is a PXE startup.com */ - if (BootEntry->Flags & BL_APPLICATION_ENTRY_STARTUP) - { -#if BL_NET_SUPPORT - /* Do soft reboot to launch it */ - Status = BlNetSoftReboot(BootEntry); -#else - EfiPrintf(L"Net boot not supported\r\n"); - Status = STATUS_NOT_SUPPORTED; -#endif - /* Nothing else for us to do */ - goto Quickie; - } - - /* Loop as long as boot was not cancelled */ - do - { - /* Load the boot application */ - Status = BlImgLoadBootApplication(BootEntry, &AppHandle); - - /* Did we not find it? */ - if (Status == STATUS_NOT_FOUND) - { - /* Get the device for the boot application */ - Status = BlGetBootOptionDevice(BootEntry->BcdData, - BcdLibraryDevice_ApplicationDevice, - &AppDevice, - NULL); - if (!NT_SUCCESS(Status)) - { - /* Force re-enumeration */ - Status = BlFwEnumerateDevice(AppDevice); - } - - /* Did re-enumeration work? */ - if (!NT_SUCCESS(Status)) - { - /* Nope, raise a fatal error */ - BmFatalErrorEx(BL_FATAL_ERROR_APP_LOAD, - (ULONG_PTR)AppPath, - Status, - 0, - 0); - goto Quickie; - } - - /* Yes, try booting it again */ - Status = BlImgLoadBootApplication(BootEntry, &AppHandle); - } - - /* Was boot cancelled?*/ - if (Status == STATUS_CANCELLED) - { - /* Should we display the menu, or is there no launch sequence? */ - if ((BmGetBootMenuPolicy(BootEntry) != MenuPolicyStandard) || - !(MiscGetBootOption(BootEntry->BcdData, - BcdLibraryObjectList_RecoverySequence))) - { - /* Bail out, the menu will take care of it */ - goto Quickie; - } - - /* No menu and there's a sequence, launch it */ - *LaunchCode = 4; - *Recover = TRUE; - goto Quickie; - } - - /* STATUS_FVE_LOCKED_VOLUME -- bitlocker volume is locked */ - if (Status == STATUS_FVE_LOCKED_VOLUME) - { - /* Launch recovery mode */ - *LaunchCode = 4; - *Recover = TRUE; - goto Quickie; - } - - /* Was there some other error launching the boot application? */ - if (!NT_SUCCESS(Status)) - { - /* Raise a fatal error */ - BmFatalErrorEx(BL_FATAL_ERROR_APP_LOAD, - (ULONG_PTR)AppPath, - Status, - 0, - 0); - goto Quickie; - } - - /* Zero out the return arguments */ - RtlZeroMemory(&ReturnArgs, sizeof(ReturnArgs)); - - /* Log to ETW this launch */ - //BmpLogApplicationLaunchEvent(&BootEntry->Guid, AppPath); - - /* Launch the boot application*/ - Status = BlImgStartBootApplication(AppHandle, &ReturnArgs); - -#if BL_BITLOCKER_SUPPORT - /* Bitlocker stuff */ - BlFveSecureBootCheckpointAppReturn(BootEntry, &ReturnArgs); -#endif - - /* Log in the boot status log the launch */ - //BlBsdLogEntry(1, 0x12, &BootEntry->Guid, 0x14); - - /* Unloac the boot application if we've returned */ - BlImgUnloadBootApplication(AppHandle); - - /* Keep going unless STATUS_RESTART_BOOT_APPLICATION */ - } while (Status != 0xC0000453); - - /* We've come back. Assume we need to launch the recovery sequence */ - *Recover = TRUE; - - /* Why did we get back? */ - if (ReturnArgs.Flags & 1) - { - /* Flag 1 -- should we display advanced options? */ - Status = BlGetBootOptionBoolean(BootEntry->BcdData, - BcdLibraryBoolean_DisplayAdvancedOptions, - &AdvancedOptions); - if ((NT_SUCCESS(Status)) && (AdvancedOptions)) - { - /* Yes, so return with code 2 */ - *LaunchCode = 2; - } - else - { - /* No, return with code 1 */ - *LaunchCode = 1; - } - } - else if (ReturnArgs.Flags & 4) - { - /* Flag 4 -- unknown */ - *LaunchCode = 1; - } - else if (ReturnArgs.Flags & 8) - { - /* Flag 5 -- unknown */ - *LaunchCode = 5; - } - else if (ReturnArgs.Flags & 0x10) - { - /* Flag 6 -- unknown */ - *LaunchCode = 6; - } - else if (ReturnArgs.Flags & 0x20) - { - /* Flag 7 -- unknown */ - *LaunchCode = 7; - } - else if (ReturnArgs.Flags & BL_RETURN_ARGUMENTS_NO_PAE_FLAG) - { - /* PAE is not supported -- refuse to boot */ - *Recover = FALSE; - BmFatalErrorEx(BL_FATAL_ERROR_NO_PAE, Status, 0, 0, 0); - } - -Quickie: - /* All done, did we have an application path? */ - if (AppPath) - { - /* Free it */ - BlMmFreeHeap(AppPath); - } - - /* Back to the caller now */ - return Status; -} - -NTSTATUS -BmpLaunchBootEntry ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PULONG EntryIndex, - _In_ ULONG LaunchCode, - _In_ BOOLEAN LaunchWinRe - ) -{ - HANDLE BcdHandle; - NTSTATUS Status; - GUID ObjectId; - BOOLEAN DoRecovery, AutoRecovery, DoSequence, RestartOnFailure; - ULONG ErrorCode; - BOOLEAN AdvancedOneTime, EditOneTime; - - /* Check if this is the OS loader */ - if (BootEntry->Flags & BL_APPLICATION_ENTRY_WINLOAD) - { - /* Check if one-time advanced options should be shown */ - if (MiscGetBootOption(BootEntry->BcdData, - BcdOSLoaderBoolean_AdvancedOptionsOneTime)) - { - /* Open the BCD */ - BcdHandle = NULL; - Status = BmOpenDataStore(BcdHandle); - if (NT_SUCCESS(Status)) - { - /* Delete the option from the BCD, so it doesn't happen again */ - ObjectId = BootEntry->Guid; - BmPurgeOption(BcdHandle, - &ObjectId, - BcdOSLoaderBoolean_AdvancedOptionsOneTime); - BmCloseDataStore(BcdHandle); - } - } - - /* Check if one-time options editor should be shown */ - if (MiscGetBootOption(BootEntry->BcdData, - BcdOSLoaderBoolean_OptionsEditOneTime)) - { - /* Open the BCD */ - BcdHandle = NULL; - Status = BmOpenDataStore(BcdHandle); - if (NT_SUCCESS(Status)) - { - /* Delete the option from the BCD, so it doesn't happen again */ - ObjectId = BootEntry->Guid; - BmPurgeOption(BcdHandle, - &ObjectId, - BcdOSLoaderBoolean_OptionsEditOneTime); - BmCloseDataStore(BcdHandle); - } - } - } - -TryAgain: - /* Disable recovery mode */ - DoRecovery = FALSE; - - /* Store globally which entry we are trying to boot */ - BmpSelectedBootEntry = BootEntry; - - /* Create any devices that aren't yet fully defined for this boot entry */ - Status = BmpCreateDevices(BootEntry); - if (!NT_SUCCESS(Status)) - { - /* That failed -- can we launch the recovery environment? */ - if (!LaunchWinRe) - { - return Status; - } - - /* Yes, so return with the WinRe launch code */ - LaunchCode = 2; - goto Quickie; - } - - /* Is this an OS loader/ */ - if (BootEntry->Flags & BL_APPLICATION_ENTRY_WINLOAD) - { - /* Is the one-time advanced options menu option present? */ - Status = BlGetBootOptionBoolean(BootEntry->BcdData, - BcdOSLoaderBoolean_AdvancedOptionsOneTime, - &AdvancedOneTime); - if (NT_SUCCESS(Status)) - { - /* Is it turned on? */ - if (AdvancedOneTime) - { - /* Set the option this once */ - BlAppendBootOptionBoolean(BootEntry, - BcdLibraryBoolean_DisplayAdvancedOptions, - TRUE); - } - else - { - /* It's not, so disable the option if active */ - BlRemoveBootOption(BootEntry->BcdData, - BcdLibraryBoolean_DisplayAdvancedOptions); - } - - /* Remove the one-time option. We've already purged it earlier */ - BlRemoveBootOption(BootEntry->BcdData, - BcdOSLoaderBoolean_AdvancedOptionsOneTime); - } - - /* Is the one-time options editor menu option present? */ - Status = BlGetBootOptionBoolean(BootEntry->BcdData, - BcdOSLoaderBoolean_OptionsEditOneTime, - &EditOneTime); - if (NT_SUCCESS(Status)) - { - /* Is it turned on? */ - if (EditOneTime) - { - /* Set the option this once */ - BlAppendBootOptionBoolean(BootEntry, - BcdLibraryBoolean_DisplayOptionsEdit, - TRUE); - } - else - { - /* It's not, so disable the option if active */ - BlRemoveBootOption(BootEntry->BcdData, - BcdLibraryBoolean_DisplayOptionsEdit); - } - - /* Remove the one-time option. We've already purged it earlier */ - BlRemoveBootOption(BootEntry->BcdData, - BcdOSLoaderBoolean_OptionsEditOneTime); - } - } - - /* BCD handling done, transfer execution to this entry */ - Status = BmpTransferExecution(BootEntry, &LaunchCode, &DoRecovery); - if (!LaunchWinRe) - { - return Status; - } - - /* Check if boot was successful, or cancelled and we're not doing WinRE */ - if (((NT_SUCCESS(Status)) || (Status == STATUS_CANCELLED)) && !(DoRecovery)) - { - return Status; - } - - /* Boot failed -- are we doing recovery? */ - if (!DoRecovery) - { - /* Nope, bail out */ - LaunchCode = 2; - goto Quickie; - } - -Quickie: - /* Get the recovery sequence */ - if (MiscGetBootOption(BootEntry->BcdData, BcdLibraryObjectList_RecoverySequence)) - { - /* Check if the launch depends on auto-recovery being enabled or not */ - if ((LaunchCode == 3) || (LaunchCode == 5) || (LaunchCode == 6)) - { - Status = BlGetBootOptionBoolean(BootEntry->BcdData, - BcdLibraryBoolean_AutoRecoveryEnabled, - &AutoRecovery); - if (NT_SUCCESS(Status)) - { - /* Override the setting */ - DoRecovery = AutoRecovery; - } - } - } - else - { - /* There's no recovery setting */ - DoRecovery = FALSE; - } - - /* Check if we should restart on failure */ - RestartOnFailure = FALSE; - BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_RestartOnFailure, - &RestartOnFailure); - - /* Do the sequence if recovery is on, unless we should restart instead */ - DoSequence = RestartOnFailure ? FALSE : DoRecovery; - while (1) - { - /* Are we doing the recovery sequence? */ - if (DoSequence) - { - /* Because of automatic recovery? */ - if (AutoRecovery) - { -#if BL_BITLOCKER_SUPPORT - /* Do bitlocker stuff */ - BlFveRegisterBootEntryForTrustedWimBoot(BootEntry, TRUE); -#endif - } - - /* Launch the recovery sequence*/ - Status = BmLaunchRecoverySequence(BootEntry, LaunchCode); - - /* Was it launched automatically? */ - if (AutoRecovery) - { -#if BL_BITLOCKER_SUPPORT - /* Do bitlocker stuff */ - BlFveRegisterBootEntryForTrustedWimBoot(BootEntry, FALSE); -#endif - - /* No need to do this again */ - AutoRecovery = FALSE; - } - - /* Did the recovery sequence work? */ - if (NT_SUCCESS(Status)) - { - /* All good */ - return STATUS_SUCCESS; - } - - /* Remove the sequence, don't do it again */ - BlRemoveBootOption(BootEntry->BcdData, BcdLibraryObjectList_RecoverySequence); - } - - /* Recovery sequence also failed, show fatal error */ - if (!BmpInternalBootError) - { - BmFatalErrorEx(BL_FATAL_ERROR_GENERIC, Status, 0, 0, 0); - } - - /* Display the error menu */ - ErrorCode = BmDisplayDumpError(BootEntry, LaunchCode); - BmErrorPurge(); - - /* See what the user wants to do */ - switch (ErrorCode) - { - case TryAgain: - /* Try again */ - goto TryAgain; - - case NextOs: - /* Boot the next entry*/ - break; - - case OsSelection: - /* Cancel the boot*/ - return STATUS_CANCELLED; - - case RecoverOem: - /* Custom OEM recovery -- open the BCD */ - Status = BmOpenDataStore(BcdHandle); - if (NT_SUCCESS(Status)) - { - /* See what the custom sequence is */ - Status = BmProcessCustomAction(BcdHandle, NULL); - } - - /* All done, close the BCD */ - if (BcdHandle) - { - BmCloseDataStore(BcdHandle); - } - return Status; - - case AdvancedOptions: - /* Show the advanced options next iteration */ - BlAppendBootOptionBoolean(BootEntry, - BcdOSLoaderBoolean_AdvancedOptionsOneTime, - TRUE); - goto TryAgain; - - case BootOptions: - /* Show the options editor next iteration */ - BlAppendBootOptionBoolean(BootEntry, - BcdOSLoaderBoolean_OptionsEditOneTime, - TRUE); - goto TryAgain; - - case Recover: - /* Try the recovery sequence next time*/ - DoSequence = TRUE; - LaunchCode = 1; - goto TryAgain; - - default: - /* Something unknown */ - return STATUS_CANCELLED; - } - } - - /* We are booting the next OS, so return success as to not kill the boot */ - return STATUS_SUCCESS; -} - -/*++ - * @name BmMain - * - * The BmMain function implements the Windows Boot Application entrypoint for - * the Boot Manager. - * - * @param BootParameters - * Pointer to the Boot Application Parameter Block. - * - * @return NT_SUCCESS if the image was loaded correctly, relevant error code - * otherwise. - * - *--*/ -NTSTATUS -NTAPI -BmMain ( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters - ) -{ - NTSTATUS Status, LibraryStatus; - BL_LIBRARY_PARAMETERS LibraryParameters; - PBL_RETURN_ARGUMENTS ReturnArguments; - PGUID AppIdentifier; - HANDLE BcdHandle, ResumeBcdHandle; - PBL_BCD_OPTION EarlyOptions; - PWCHAR Stylesheet; - BOOLEAN XmlLoaded, DisableIntegrity, TestSigning, PersistBootSequence; - BOOLEAN RebootOnError, CustomActions; - ULONG SequenceId; - PBL_LOADED_APPLICATION_ENTRY BootEntry; - PGUID SequenceList; - ULONG SequenceListCount; - PBL_LOADED_APPLICATION_ENTRY* BootSequence; - ULONG BootIndex; - BOOLEAN ExitBootManager; - BOOLEAN BootFailed; - BOOLEAN BootOk; - ULONG SequenceCount; - BOOLEAN GetEntry; - EfiPrintf(L"ReactOS UEFI Boot Manager Initializing...\r\n"); - - /* Reading the BCD can change this later on */ - RebootOnError = FALSE; - - /* Save the start/end-of-POST time */ -#if defined(_M_IX86) || defined(_M_X64) - ApplicationStartTime = __rdtsc(); -#else - EfiPrintf(L"No time source defined for this platform\r\n"); - ApplicationStartTime = 0; -#endif - PostTime = ApplicationStartTime; - - /* Setup the boot library parameters for this application */ - BlSetupDefaultParameters(&LibraryParameters); - LibraryParameters.TranslationType = BlNone; - LibraryParameters.LibraryFlags = 0x400 | 0x8; - LibraryParameters.MinimumAllocationCount = 16; - LibraryParameters.MinimumHeapSize = 512 * 1024; - - /* Initialize the boot library */ - Status = BlInitializeLibrary(BootParameters, &LibraryParameters); - if (!NT_SUCCESS(Status)) - { - /* Check for failure due to invalid application entry */ - if (Status != STATUS_INVALID_PARAMETER_9) - { - /* Specifically print out what happened */ - EfiPrintf(L"BlInitializeLibrary failed 0x%x\r\n", Status); - } - - /* Go to exit path */ - goto Quickie; - } - - /* Get the application identifier */ - AppIdentifier = BlGetApplicationIdentifier(); - if (!AppIdentifier) - { - /* None was given, so set our default one */ - AppIdentifier = (PGUID)&GUID_WINDOWS_BOOTMGR; - } - - /* Save our identifier */ - BmApplicationIdentifier = *AppIdentifier; - - /* Initialize the file system to open a handle to our root boot directory */ - BmFwInitializeBootDirectoryPath(); - - /* Load and initialize the boot configuration database (BCD) */ - Status = BmOpenDataStore(&BcdHandle); - if (NT_SUCCESS(Status)) - { - /* Copy the boot options */ - Status = BlCopyBootOptions(BlpApplicationEntry.BcdData, &EarlyOptions); - if (NT_SUCCESS(Status)) - { - /* Update them */ - Status = BmpUpdateApplicationOptions(BcdHandle); - if (!NT_SUCCESS(Status)) - { - /* Log a fatal error */ - BmFatalErrorEx(BL_FATAL_ERROR_BCD_PARSE, - (ULONG_PTR)L"\\BCD", - Status, - 0, - 0); - } - } - } - -#ifdef _SECURE_BOOT - /* Initialize the secure boot machine policy */ - Status = BmSecureBootInitializeMachinePolicy(); - if (!NT_SUCCESS(Status)) - { - BmFatalErrorEx(BL_FATAL_ERROR_SECURE_BOOT, Status, 0, 0, 0); - } -#endif - - /* Copy the library parameters and add the re-initialization flag */ - RtlCopyMemory(&LibraryParameters, - &BlpLibraryParameters, - sizeof(LibraryParameters)); - LibraryParameters.LibraryFlags |= (BL_LIBRARY_FLAG_REINITIALIZE_ALL | - BL_LIBRARY_FLAG_REINITIALIZE); - - /* Now that we've parsed the BCD, re-initialize the library */ - LibraryStatus = BlInitializeLibrary(BootParameters, &LibraryParameters); - if (!NT_SUCCESS(LibraryStatus) && (NT_SUCCESS(Status))) - { - Status = LibraryStatus; - } - - /* Initialize firmware-specific memory regions */ - BmFwMemoryInitialize(); - - /* Initialize the boot status data log (BSD) */ - BmpInitializeBootStatusDataLog(); - - /* Find our XSL stylesheet */ - Stylesheet = BlResourceFindHtml(); - if (!Stylesheet) - { - /* Awe, no XML. This is actually fatal lol. Can't boot without XML. */ - Status = STATUS_NOT_FOUND; - EfiPrintf(L"BlResourceFindMessage failed 0x%x\r\n", STATUS_NOT_FOUND); - goto Quickie; - } - - /* Initialize the XML Engine (as a side-effect, resets cursor) */ - Status = BlXmiInitialize(Stylesheet); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"\r\nBlXmiInitialize failed 0x%x\r\n", Status); - goto Failure; - } - XmlLoaded = TRUE; - - /* Check if there's an active bitmap visible */ - if (!BlDisplayValidOemBitmap()) - { - /* Nope, make the screen black using BGFX */ - if (!NT_SUCCESS(BmpBgDisplayClearScreen(0xFF000000))) - { - /* BGFX isn't active, use standard display */ - BlDisplayClearScreen(); - } - } - -#ifdef _BIT_LOCKER_ - /* Bitlocker will take over screen UI if enabled */ - FveDisplayScreen = BmFveDisplayScreen; -#endif - - /* Check if any bypass options are enabled */ - BlImgQueryCodeIntegrityBootOptions(&BlpApplicationEntry, - &DisableIntegrity, - &TestSigning); - if (!DisableIntegrity) - { - /* Integrity checks are enabled, so validate our signature */ - Status = BmFwVerifySelfIntegrity(); - if (!NT_SUCCESS(Status)) - { - /* Signature invalid, fail boot */ - goto Failure; - } - } - - - /* TEST MODE */ - EfiPrintf(L"Performing memory allocator tests...\r\n"); - { - NTSTATUS Status; - PHYSICAL_ADDRESS PhysicalAddress, PhysicalAddress2; - - /* Allocate 1 physical page */ - PhysicalAddress.QuadPart = 0; - Status = BlMmAllocatePhysicalPages(&PhysicalAddress, BlLoaderData, 1, 0, 1); - if (Status != STATUS_SUCCESS) - { - EfiPrintf(L"FAIL: Allocation status: %lx at address: %llx\r\n", Status, PhysicalAddress.QuadPart); - EfiStall(100000000); - } - - /* Write some data */ - *(PULONG)((ULONG_PTR)PhysicalAddress.QuadPart) = 0x55555151; - - /* Free it */ - Status = BlMmFreePhysicalPages(PhysicalAddress); - if (Status != STATUS_SUCCESS) - { - EfiPrintf(L"FAIL: Memory free status: %lx\r\n", Status); - EfiStall(100000000); - } - - /* Allocate a page again */ - PhysicalAddress2.QuadPart = 0; - Status = BlMmAllocatePhysicalPages(&PhysicalAddress2, BlLoaderData, 1, 0, 1); - if (Status != STATUS_SUCCESS) - { - EfiPrintf(L"FAIL: Allocation status: %lx at address: %llx\r\n", Status, PhysicalAddress2.QuadPart); - EfiStall(100000000); - } - - /* It should've given us the same page, since we freed it */ - if (PhysicalAddress.QuadPart != PhysicalAddress2.QuadPart) - { - EfiPrintf(L"FAIL: Non-matching addresses: %llx %llx\r\n", PhysicalAddress.QuadPart, PhysicalAddress2.QuadPart); - EfiStall(100000000); - } - - /* The data should still be there, since zero-ing is not on for bootmgr */ - if (*(PULONG)((ULONG_PTR)PhysicalAddress2.QuadPart) != 0x55555151) - { - EfiPrintf(L"FAIL: Non-matching data: %lx %lx\r\n", 0x55555151, *(PULONG)((ULONG_PTR)PhysicalAddress2.QuadPart)); - EfiStall(100000000); - } - - /* And free the second page again */ - Status = BlMmFreePhysicalPages(PhysicalAddress); - if (Status != STATUS_SUCCESS) - { - EfiPrintf(L"FAIL: Memory free status: %lx\r\n", Status); - EfiStall(100000000); - } - } - - /* Write out the first XML tag */ - BlXmiWrite(L""); - - /* Check for factory reset */ - BlSecureBootCheckForFactoryReset(); - - /* Load the revocation list */ - Status = BmFwRegisterRevocationList(); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Register our custom progress routine */ - BlUtlRegisterProgressRoutine(); - - /* Display state is not currently cached */ - BmDisplayStateCached = FALSE; - - /* Check if we need to resume from hibernate */ - Status = BmResumeFromHibernate(&ResumeBcdHandle); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - -#ifdef BL_NET_SUPPORT - /* Register multicast printing routine */ - BlUtlRegisterMulticastRoutine(); -#endif - - /* Check if restart on failure is enabled */ - BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_RestartOnFailure, - &RebootOnError); - - /* Check if the boot sequence is persisted */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_PersistBootSequence, - &PersistBootSequence); - if (!NT_SUCCESS(Status)) - { - /* It usually is */ - PersistBootSequence = TRUE; - } - - /* Check if there's custom actions to take */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdBootMgrBoolean_ProcessCustomActionsFirst, - &CustomActions); - if ((NT_SUCCESS(Status)) && (CustomActions)) - { - /* We don't support this yet */ - EfiPrintf(L"Not implemented\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - goto Failure; - } - - //BlResourceFindMessage(BM_MSG_TEST); - - /* At last, enter the boot selection stage */ - SequenceId = 0; - GetEntry = FALSE; - BootFailed = FALSE; - SequenceList = NULL; - BootSequence = NULL; - SequenceCount = 0; - while (1) - { - /* We don't have a boot entry nor a sequence ID */ - BootEntry = NULL; - BootOk = FALSE; - - /* Do we have a hardcoded boot sequence set? */ - if (!(BootSequence) && !(GetEntry)) - { - /* Not yet, read the BCD to see if one is there */ - Status = BlGetBootOptionGuidList(BlpApplicationEntry.BcdData, - BcdBootMgrObjectList_BootSequence, - &SequenceList, - &SequenceListCount); - if (NT_SUCCESS(Status)) - { - /* A GUID list for the boot sequence is set. Extract it */ - Status = BmGetBootSequence(BcdHandle, - SequenceList, - SequenceListCount, - BL_APPLICATION_ENTRY_FIXED_SEQUENCE, - &BootSequence, - &SequenceCount); - if (NT_SUCCESS(Status)) - { - /* Don't get stuck in a loop repeating this sequence */ - BlRemoveBootOption(BlpApplicationEntry.BcdData, - BcdBootMgrObjectList_BootSequence); - - /* But do check if we should persist it */ - if (PersistBootSequence) - { - /* Yes -- so go select an entry now */ - GetEntry = TRUE; - } - else - { - /* We shouldn't, so wipe it from the BCD too */ - Status = BmPurgeOption(BcdHandle, - &BmApplicationIdentifier, - BcdBootMgrObjectList_BootSequence); - if (!NT_SUCCESS(Status)) - { - /* Well that failed */ - goto LoopQuickie; - } - } - } - } - else - { - /* No boot entry sequence for us */ - BootSequence = NULL; - } - } - - /* Do we have a sequence active, and are we still processing it? */ - if ((BootSequence) && ((GetEntry) || (SequenceId < SequenceCount))) - { - /* Extract the next entry in the sequence */ - BootEntry = BootSequence[SequenceId]; - BootSequence[SequenceId] = NULL; - - /* Move to the next entry for next time */ - SequenceId++; - - /* Unless there won't be a a next time? */ - if (SequenceId == SequenceCount) - { - /* Clean up, it's the last entry */ - BlMmFreeHeap(BootSequence); - BootSequence = NULL; - } - } - else - { - /* Get the selected boot entry from the user */ - ExitBootManager = FALSE; - Status = BmpGetSelectedBootEntry(BcdHandle, - &BootEntry, - &BootIndex, - &ExitBootManager); - if (!(NT_SUCCESS(Status)) || (ExitBootManager)) - { - /* Selection failed, or user wants to exit */ - goto LoopQuickie; - } - } - - /* Did we have a BCD open? */ - if (BcdHandle) - { - /* Close it, we'll be opening a new one */ - BmCloseDataStore(BcdHandle); - BcdHandle = NULL; - } - - /* Launch the selected entry */ - Status = BmpLaunchBootEntry(BootEntry, &BootIndex, 0, TRUE); - if (NT_SUCCESS(Status)) - { - /* Boot worked, uncache display and process the bad memory list */ - BmDisplayStateCached = FALSE; - BmpProcessBadMemory(); - } - else - { - /* Boot failed -- was it user driven? */ - if (Status != STATUS_CANCELLED) - { - /* Nope, remember that booting failed */ - BootFailed = TRUE; - goto LoopQuickie; - } - - /* Yes -- the display is still valid */ - BmDisplayStateCached = TRUE; - } - - /* Reopen the BCD */ - Status = BmOpenDataStore(&BcdHandle); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Put the BCD options back into our entry */ - BlReplaceBootOptions(&BlpApplicationEntry, EarlyOptions); - - /* Update our options one more time */ - Status = BmpUpdateApplicationOptions(BcdHandle); - if (NT_SUCCESS(Status)) - { - /* Boot was 100% OK */ - BootOk = TRUE; - } - -LoopQuickie: - /* Did we have a boot entry? */ - if (BootEntry) - { - /* We can destroy it now */ - BlDestroyBootEntry(BootEntry); - } - - /* Is this the success path? */ - if (NT_SUCCESS(Status)) - { - /* Did we actually boot something? */ - if (!BootOk) - { - /* Bope, fail out */ - break; - } - } - - /* This is the failure path... should we reboot? */ - if (RebootOnError) - { - break; - } - }; - -Failure: - if (!BootFailed) - { - /* Check if we got here due to an internal error */ - if (BmpInternalBootError) - { - /* If XML is available, display the error */ - if (XmlLoaded) - { - //BmDisplayDumpError(0, 0); - //BmErrorPurge(); - } - - /* Don't do a fatal error -- return back to firmware */ - goto Quickie; - } - } - - /* Log a general fatal error once we're here */ - BmFatalErrorEx(BL_FATAL_ERROR_GENERIC, Status, 0, 0, 0); - -Quickie: - /* Check if we should reboot */ - if ((RebootOnError) || - (BlpApplicationEntry.Flags & BL_APPLICATION_ENTRY_REBOOT_ON_ERROR)) - { - /* Reboot the box */ - BlFwReboot(); - Status = STATUS_SUCCESS; - } - else - { - /* Return back to the caller with the error argument encoded */ - ReturnArguments = (PVOID)((ULONG_PTR)BootParameters + BootParameters->ReturnArgumentsOffset); - ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION; - ReturnArguments->Status = Status; - - /* Tear down the boot library */ - BlDestroyLibrary(); - } - - /* Return back status */ - return Status; -} - diff --git a/boot/environ/app/bootmgr/bootmgr.h b/boot/environ/app/bootmgr/bootmgr.h deleted file mode 100644 index 80be2b63f80..00000000000 --- a/boot/environ/app/bootmgr/bootmgr.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Manager - * FILE: boot/environ/app/bootmgr/bootmgr.h - * PURPOSE: Main Boot Manager Header - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -#ifndef _BOOTMGR_H -#define _BOOTMGR_H - -/* INCLUDES ******************************************************************/ - -/* C Headers */ -#include -#include -#include - -/* NT Base Headers */ -#include -#include - -/* UEFI Headers */ -#include - -/* Boot Library Headers */ -#include - -/* BCD Headers */ -#include - -/* Message Header */ -#include - -/* STRUCTURES ****************************************************************/ - -typedef struct _BL_BOOT_ERROR -{ - ULONG ErrorCode; - NTSTATUS ErrorStatus; - ULONG Unknown1; - PWCHAR ErrorString; - PWCHAR FileName; - ULONG HelpMsgId; - ULONG Unknown2; -} BL_BOOT_ERROR, *PBL_BOOT_ERROR; - -typedef struct _BL_PACKED_BOOT_ERROR -{ - PBL_BOOT_ERROR BootError; - ULONG Unknown; - ULONG Size; -} BL_PACKED_BOOT_ERROR, *PBL_PACKED_BOOT_ERROR; - -#define BL_FATAL_ERROR_BCD_READ 0x01 -#define BL_FATAL_ERROR_APP_LOAD 0x02 -#define BL_FATAL_ERROR_BCD_ENTRIES 0x03 -#define BL_FATAL_ERROR_GENERIC 0x04 -#define BL_FATAL_ERROR_BCD_PARSE 0x07 -#define BL_FATAL_ERROR_NO_PAE 0x0B - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -NTAPI -BmMain ( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters - ); - -NTSTATUS -BmpLaunchBootEntry ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PULONG EntryIndex, - _In_ ULONG LaunchCode, - _In_ BOOLEAN LaunchWinRe - ); - -#endif diff --git a/boot/environ/app/bootmgr/bootmgr.rc b/boot/environ/app/bootmgr/bootmgr.rc deleted file mode 100644 index 0bb85355f14..00000000000 --- a/boot/environ/app/bootmgr/bootmgr.rc +++ /dev/null @@ -1,25 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Manager - * FILE: boot/environ/app/bootmgr.rc - * PURPOSE: Boot Manager Resource File - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -#include -#include - -/* Version Data */ -#define VER_FILETYPE VFT_DRV -#define VER_FILESUBTYPE VFT2_DRV_SYSTEM -#define VER_FILEDESCRIPTION_STR "Boot Manager" -#define VER_INTERNALNAME_STR "bootmgr.exe" -#define VER_ORIGINALFILENAME_STR "bootmgr.exe" -#define VER_LANGNEUTRAL -#include "common.ver" - -/* Message Table */ -#include - -/* XML GUI Stylesheet */ -BOOTMGR.XSL HTML "bootmgr.xsl" \ No newline at end of file diff --git a/boot/environ/app/bootmgr/bootmgr.xsl b/boot/environ/app/bootmgr/bootmgr.xsl deleted file mode 100644 index f87d5e8a8d7..00000000000 Binary files a/boot/environ/app/bootmgr/bootmgr.xsl and /dev/null differ diff --git a/boot/environ/app/bootmgr/efiemu.c b/boot/environ/app/bootmgr/efiemu.c deleted file mode 100644 index 3a4f40c91e8..00000000000 --- a/boot/environ/app/bootmgr/efiemu.c +++ /dev/null @@ -1,1034 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Manager - * FILE: boot/environ/app/bootmgr/efiemu.c - * PURPOSE: UEFI Entrypoint for Boot Manager - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bootmgr.h" - -/* DATA STRUCTURES ***********************************************************/ - -typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH -{ - BOOT_APPLICATION_PARAMETER_BLOCK; - BL_MEMORY_DATA BootMemoryData; - BL_MEMORY_DESCRIPTOR MemEntry; - UCHAR AppEntry[788]; -} BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH; - -/* DATA VARIABLES ************************************************************/ - -BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH EfiInitScratch; - -/* FUNCTIONS *****************************************************************/ - -/*++ - * @name AhCreateLoadOptionsList - * - * The AhCreateLoadOptionsList routine - * - * @param CommandLine - * UEFI Image Handle for the current loaded application. - * - * @param BootOptions - * Pointer to the UEFI System Table. - * - * @param MaximumLength - * Pointer to the UEFI System Table. - * - * @param OptionSize - * Pointer to the UEFI System Table. - * - * @param PreviousOption - * Pointer to the UEFI System Table. - * - * @param PreviousOptionSize - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -NTSTATUS -AhCreateLoadOptionsList ( - _In_ PWCHAR CommandLine, - _In_ PBL_BCD_OPTION BootOptions, - _In_ ULONG MaximumLength, - _Out_ PULONG OptionSize, - _In_ PBL_BCD_OPTION* PreviousOption, - _In_ PULONG PreviousOptionSize - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -/*++ - * @name EfiInitpAppendPathString - * - * The EfiInitpAppendPathString routine - * - * @param DestinationPath - * UEFI Image Handle for the current loaded application. - * - * @param RemainingSize - * Pointer to the UEFI System Table. - * - * @param AppendPath - * Pointer to the UEFI System Table. - * - * @param AppendLength - * Pointer to the UEFI System Table. - * - * @param BytesAppended - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -NTSTATUS -EfiInitpAppendPathString ( - _In_ PWCHAR PathString, - _In_ ULONG MaximumLength, - _In_ PWCHAR NewPathString, - _In_ ULONG NewPathLength, - _Out_ PULONG ResultLength - ) -{ - NTSTATUS Status; - ULONG FinalPathLength; - - /* We deal in Unicode, validate the length */ - if (NewPathLength & 1) - { - return STATUS_INVALID_PARAMETER; - } - - /* Is the new element at least a character? */ - Status = STATUS_SUCCESS; - if (NewPathLength >= sizeof(WCHAR)) - { - /* Is the last character already a NULL character? */ - if (NewPathString[(NewPathLength - sizeof(WCHAR)) / sizeof(WCHAR)] == - UNICODE_NULL) - { - /* Then we won't need to count it */ - NewPathLength -= sizeof(UNICODE_NULL); - } - - /* Was it more than just a NULL character? */ - if (NewPathLength >= sizeof(WCHAR)) - { - /* Yep -- but does it have a separator? */ - if (*NewPathString == OBJ_NAME_PATH_SEPARATOR) - { - /* Skip it, we'll add our own later */ - NewPathString++; - NewPathLength -= sizeof(OBJ_NAME_PATH_SEPARATOR); - } - - /* Was it more than just a separator? */ - if (NewPathLength >= sizeof(WCHAR)) - { - /* Yep -- but does it end with a separator? */ - if (NewPathString[(NewPathLength - sizeof(WCHAR)) / sizeof(WCHAR)] == - OBJ_NAME_PATH_SEPARATOR) - { - /* That's something else we won't need for now */ - NewPathLength -= sizeof(OBJ_NAME_PATH_SEPARATOR); - } - } - } - } - - /* Check if anything needs to be appended after all */ - if (NewPathLength != 0) - { - /* We will append the length of the new path element, plus a separator */ - FinalPathLength = NewPathLength + sizeof(OBJ_NAME_PATH_SEPARATOR); - if (MaximumLength >= FinalPathLength) - { - /* Add a separator to the existing path*/ - *PathString = OBJ_NAME_PATH_SEPARATOR; - - /* Followed by the new path element */ - RtlCopyMemory(PathString + 1, NewPathString, NewPathLength); - - /* Return the number of bytes appended */ - *ResultLength = FinalPathLength; - } - else - { - /* There's not enough space to do this */ - Status = STATUS_BUFFER_TOO_SMALL; - } - } - else - { - /* Nothing to append */ - *ResultLength = 0; - } - - return Status; -} - -/*++ - * @name EfiInitpConvertEfiDevicePath - * - * The EfiInitpConvertEfiDevicePath routine - * - * @param DevicePath - * UEFI Image Handle for the current loaded application. - * - * @param DeviceType - * Pointer to the UEFI System Table. - * - * @param Option - * Pointer to the UEFI System Table. - * - * @param MaximumLength - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -NTSTATUS -EfiInitpConvertEfiFilePath ( - _In_ EFI_DEVICE_PATH_PROTOCOL *DevicePath, - _In_ ULONG PathType, - _In_ PBL_BCD_OPTION Option, - _In_ ULONG MaximumLength - ) -{ - ULONG BytesAppended, DataSize, StringLength; - PWCHAR StringEntry, PathString; - FILEPATH_DEVICE_PATH *FilePath; - NTSTATUS Status; - - /* Make sure we have enough space for the option */ - if (MaximumLength < sizeof(*Option)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Set the initial size of the option, and consume from our buffer */ - DataSize = sizeof(*Option); - MaximumLength -= sizeof(*Option); - - /* Zero out and fill the option header */ - RtlZeroMemory(Option, DataSize); - Option->Type = PathType; - Option->DataOffset = sizeof(*Option); - - /* Extract the string option */ - StringEntry = (PWCHAR)(Option + 1); - PathString = StringEntry; - - /* Start parsing the device path */ - FilePath = (FILEPATH_DEVICE_PATH*)DevicePath; - while (IsDevicePathEndType(FilePath) == FALSE) - { - /* Is this a file path? */ - if ((FilePath->Header.Type == MEDIA_DEVICE_PATH) && - (FilePath->Header.SubType == MEDIA_FILEPATH_DP)) - { - /* Get the length of the file path string, avoiding overflow */ - StringLength = DevicePathNodeLength(FilePath) - - FIELD_OFFSET(FILEPATH_DEVICE_PATH, PathName); - if (StringLength < (ULONG)FIELD_OFFSET(FILEPATH_DEVICE_PATH, PathName)) - { - Status = STATUS_INTEGER_OVERFLOW; - goto Quickie; - } - - /* Append this path string to the current path string */ - Status = EfiInitpAppendPathString(PathString, - MaximumLength, - FilePath->PathName, - StringLength, - &BytesAppended); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Increase the size of the data, consume buffer space */ - DataSize += BytesAppended; - MaximumLength -= BytesAppended; - - /* Move to the next path string */ - PathString = (PWCHAR)((ULONG_PTR)PathString + BytesAppended); - } - - /* Move to the next path node */ - FilePath = (FILEPATH_DEVICE_PATH*)NextDevicePathNode(FilePath); - } - - /* Check if we still have space for a NULL-terminator */ - if (MaximumLength < sizeof(UNICODE_NULL)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* We do -- NULL-terminate the string */ - *PathString = UNICODE_NULL; - DataSize += sizeof(UNICODE_NULL); - - /* Check if all of this has amounted to a single NULL-char */ - if (PathString == StringEntry) - { - /* Then this option is empty */ - Option->Empty = TRUE; - } - - /* Set the final size of the option */ - Option->DataSize = DataSize; - -Quickie: - return STATUS_SUCCESS; -} - -/*++ - * @name EfiInitpGetDeviceNode - * - * The EfiInitpGetDeviceNode routine - * - * @param DevicePath - * UEFI Image Handle for the current loaded application. - * - * @return None - * - *--*/ -EFI_DEVICE_PATH_PROTOCOL* -EfiInitpGetDeviceNode ( - _In_ EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL* NextPath; - - /* Check if we hit the end terminator */ - if (IsDevicePathEndType(DevicePath)) - { - return DevicePath; - } - - /* Loop each device path, until we get to the end or to a file path device node */ - for ((NextPath = NextDevicePathNode(DevicePath)); - !(IsDevicePathEndType(NextPath)) && ((NextPath->Type != MEDIA_DEVICE_PATH) || - (NextPath->SubType != MEDIA_FILEPATH_DP)); - (NextPath = NextDevicePathNode(NextPath))) - { - /* Keep iterating down */ - DevicePath = NextPath; - } - - /* Return the path found */ - return DevicePath; -} - -/*++ - * @name EfiInitTranslateDevicePath - * - * The EfiInitTranslateDevicePath routine - * - * @param DevicePath - * UEFI Image Handle for the current loaded application. - * - * @param DeviceEntry - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -NTSTATUS -EfiInitTranslateDevicePath ( - _In_ EFI_DEVICE_PATH_PROTOCOL *DevicePath, - _In_ PBL_DEVICE_DESCRIPTOR DeviceEntry - ) -{ - NTSTATUS Status; - EFI_DEVICE_PATH_PROTOCOL* DeviceNode; - MEMMAP_DEVICE_PATH* MemDevicePath; - ACPI_HID_DEVICE_PATH *AcpiPath; - HARDDRIVE_DEVICE_PATH *DiskPath; - - /* Assume failure */ - Status = STATUS_UNSUCCESSFUL; - - /* Set size first */ - DeviceEntry->Size = sizeof(*DeviceEntry); - - /* Check if we are booting from a RAM Disk */ - if ((DevicePath->Type == HARDWARE_DEVICE_PATH) && - (DevicePath->SubType == HW_MEMMAP_DP)) - { - /* Get the EFI data structure matching this */ - MemDevicePath = (MEMMAP_DEVICE_PATH*)DevicePath; - - /* Set the boot library specific device types */ - DeviceEntry->DeviceType = LocalDevice; - DeviceEntry->Local.Type = RamDiskDevice; - - /* Extract the base, size, and offset */ - DeviceEntry->Local.RamDisk.ImageBase.QuadPart = MemDevicePath->StartingAddress; - DeviceEntry->Local.RamDisk.ImageSize.QuadPart = MemDevicePath->EndingAddress - - MemDevicePath->StartingAddress; - DeviceEntry->Local.RamDisk.ImageOffset = 0; - return STATUS_SUCCESS; - } - - /* Otherwise, check what kind of device node this is */ - DeviceNode = EfiInitpGetDeviceNode(DevicePath); - switch (DeviceNode->Type) - { - /* ACPI */ - case ACPI_DEVICE_PATH: - - /* We only support floppy drives */ - AcpiPath = (ACPI_HID_DEVICE_PATH*)DeviceNode; - if ((AcpiPath->HID != EISA_PNP_ID(0x604)) && - (AcpiPath->HID != EISA_PNP_ID(0x700))) - { - return Status; - } - - /* Set the boot library specific device types */ - DeviceEntry->DeviceType = LocalDevice; - DeviceEntry->Local.Type = FloppyDevice; - - /* The ACPI UID is the drive number */ - DeviceEntry->Local.FloppyDisk.DriveNumber = AcpiPath->UID; - return STATUS_SUCCESS; - - /* Network, ATAPI, SCSI, USB */ - case MESSAGING_DEVICE_PATH: - - /* Check if it's network */ - if ((DeviceNode->SubType == MSG_MAC_ADDR_DP) || - (DeviceNode->SubType == MSG_IPv4_DP)) - { - /* Set the boot library specific device types */ - DeviceEntry->DeviceType = UdpDevice; - DeviceEntry->Remote.Unknown = 256; - return STATUS_SUCCESS; - } - - /* Other types should come in as MEDIA_DEVICE_PATH -- Windows assumes this is a floppy */ - DeviceEntry->DeviceType = DiskDevice; - DeviceEntry->Local.Type = FloppyDevice; - DeviceEntry->Local.FloppyDisk.DriveNumber = 0; - return STATUS_SUCCESS; - - /* Disk or CDROM */ - case MEDIA_DEVICE_PATH: - - /* Extract the disk path and check if it's a physical disk */ - DiskPath = (HARDDRIVE_DEVICE_PATH*)DeviceNode; - if (DeviceNode->SubType == MEDIA_HARDDRIVE_DP) - { - /* Check if this is an MBR partition */ - if (DiskPath->SignatureType == SIGNATURE_TYPE_MBR) - { - /* Set that this is a local partition */ - DeviceEntry->DeviceType = LegacyPartitionDevice; - DeviceEntry->Partition.Disk.Type = LocalDevice; - - DeviceEntry->Partition.Disk.HardDisk.PartitionType = MbrPartition; - DeviceEntry->Partition.Disk.HardDisk.Mbr.PartitionSignature = - *(PULONG)&DiskPath->Signature[0]; - DeviceEntry->Partition.Mbr.PartitionNumber = DiskPath->PartitionNumber; - return STATUS_SUCCESS; - } - - /* Check if it's a GPT partition */ - if (DiskPath->SignatureType == SIGNATURE_TYPE_GUID) - { - /* Set that this is a local disk */ - DeviceEntry->DeviceType = PartitionDevice; - DeviceEntry->Partition.Disk.Type = LocalDevice; - - /* Set GPT partition ID */ - DeviceEntry->Partition.Disk.HardDisk.PartitionType = GptPartition; - - /* Copy the signature GUID */ - RtlCopyMemory(&DeviceEntry->Partition.Gpt.PartitionGuid, - DiskPath->Signature, - sizeof(GUID)); - - DeviceEntry->Flags |= 4u; - return STATUS_SUCCESS; - } - - /* Otherwise, raw boot is not supported */ - DeviceEntry->DeviceType = PartitionDevice; - DeviceEntry->Partition.Disk.Type = LocalDevice; - DeviceEntry->Partition.Disk.HardDisk.PartitionType = RawPartition; - DeviceEntry->Partition.Disk.HardDisk.Raw.DiskNumber = 0; - } - else if (DeviceNode->SubType == MEDIA_CDROM_DP) - { - /* Set the right type for a CDROM */ - DeviceEntry->DeviceType = DiskDevice; - DeviceEntry->Local.Type = CdRomDevice; - - /* Set the drive number to zero */ - DeviceEntry->Local.FloppyDisk.DriveNumber = 0; - return STATUS_SUCCESS; - } - - /* Fail anything else */ - default: - break; - } - - /* Return here only on failure */ - return Status; -} - -/*++ - * @name EfiInitpConvertEfiDevicePath - * - * The EfiInitpConvertEfiDevicePath routine - * - * @param DevicePath - * UEFI Image Handle for the current loaded application. - * - * @param DeviceType - * Pointer to the UEFI System Table. - * - * @param Option - * Pointer to the UEFI System Table. - * - * @param MaximumLength - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -NTSTATUS -EfiInitpConvertEfiDevicePath ( - _In_ EFI_DEVICE_PATH_PROTOCOL *DevicePath, - _In_ ULONG DeviceType, - _In_ PBL_BCD_OPTION Option, - _In_ ULONG MaximumLength - ) -{ - PBCD_DEVICE_OPTION BcdDevice; - NTSTATUS Status; - - /* Make sure we have enough space for the option */ - if (MaximumLength < sizeof(*Option)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Zero out the option */ - RtlZeroMemory(Option, sizeof(*Option)); - - /* Make sure we have enough space for the device entry */ - if ((MaximumLength - sizeof(*Option)) < - (ULONG)FIELD_OFFSET(BCD_DEVICE_OPTION, DeviceDescriptor)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Fill it out */ - BcdDevice = (PBCD_DEVICE_OPTION)(Option + 1); - Status = EfiInitTranslateDevicePath(DevicePath, - &BcdDevice->DeviceDescriptor); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Fill out the rest of the option structure */ - Option->DataOffset = sizeof(*Option); - Option->Type = DeviceType; - Option->DataSize = FIELD_OFFSET(BCD_DEVICE_OPTION, DeviceDescriptor) + - BcdDevice->DeviceDescriptor.Size; - Status = STATUS_SUCCESS; - -Quickie: - return Status; -} - -/*++ - * @name EfiInitpCreateApplicationEntry - * - * The EfiInitpCreateApplicationEntry routine - * - * @param SystemTable - * UEFI Image Handle for the current loaded application. - * - * @param Entry - * Pointer to the UEFI System Table. - * - * @param MaximumLength - * Pointer to the UEFI System Table. - * - * @param DevicePath - * Pointer to the UEFI System Table. - * - * @param FilePath - * Pointer to the UEFI System Table. - * - * @param LoadOptions - * Pointer to the UEFI System Table. - * - * @param LoadOptionsSize - * Pointer to the UEFI System Table. - * - * @param Flags - * Pointer to the UEFI System Table. - * - * @param ResultLength - * Pointer to the UEFI System Table. - * - * @param AppEntryDevice - * Pointer to the UEFI System Table. - * - * @return None - * - *--*/ -VOID -EfiInitpCreateApplicationEntry ( - __in EFI_SYSTEM_TABLE *SystemTable, - __in PBL_APPLICATION_ENTRY Entry, - __in ULONG MaximumLength, - __in EFI_DEVICE_PATH *DevicePath, - __in EFI_DEVICE_PATH *FilePath, - __in PWCHAR LoadOptions, - __in ULONG LoadOptionsSize, - __in ULONG Flags, - __out PULONG ResultLength, - __out PBL_DEVICE_DESCRIPTOR *AppEntryDevice - ) -{ - PBL_WINDOWS_LOAD_OPTIONS WindowsOptions; - PWCHAR ObjectString, CommandLine; - PBL_BCD_OPTION Option, PreviousOption; - ULONG HeaderSize, TotalOptionSize, Size, CommandLineSize, RemainingSize; - NTSTATUS Status; - UNICODE_STRING GuidString; - GUID ObjectGuid; - PBCD_DEVICE_OPTION BcdDevice; - BOOLEAN HaveBinaryOptions, HaveGuid; - PBL_FILE_PATH_DESCRIPTOR OsPath; - EFI_DEVICE_PATH *OsDevicePath; - - /* Initialize everything */ - TotalOptionSize = 0; - *AppEntryDevice = NULL; - HeaderSize = 0; - - /* Check if the load options are in binary Windows format */ - WindowsOptions = (PBL_WINDOWS_LOAD_OPTIONS)LoadOptions; - if ((WindowsOptions != NULL) && - (LoadOptionsSize >= sizeof(BL_WINDOWS_LOAD_OPTIONS)) && - (WindowsOptions->Length >= sizeof(BL_WINDOWS_LOAD_OPTIONS)) && - !(strncmp(WindowsOptions->Signature, "WINDOWS", 7))) - { - /* They are, so firmware must have loaded us -- extract arguments */ - CommandLine = WindowsOptions->LoadOptions; - CommandLineSize = LoadOptionsSize - FIELD_OFFSET(BL_WINDOWS_LOAD_OPTIONS, - LoadOptions); - - /* Remember that we used binary options */ - HaveBinaryOptions = TRUE; - } - else - { - /* Nope -- so treat them as raw command-line options */ - CommandLine = LoadOptions; - CommandLineSize = LoadOptionsSize; - - /* No binary options */ - HaveBinaryOptions = FALSE; - } - - /* EFI uses UTF-16LE, like NT, so convert to characters */ - CommandLineSize /= sizeof(WCHAR); - if (CommandLineSize != 0) - { - /* And check if the options are not NULL-terminated */ - if (wcsnlen(CommandLine, CommandLineSize) == CommandLineSize) - { - /* NULL-terminate them */ - CommandLine[CommandLineSize - 1] = UNICODE_NULL; - } - } - - /* Begin by making sure we at least have space for the app entry header */ - RemainingSize = MaximumLength; - if (RemainingSize < sizeof(BL_APPLICATION_ENTRY)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* On exit, return that we've at least consumed this much */ - HeaderSize = FIELD_OFFSET(BL_APPLICATION_ENTRY, BcdData); - - /* Zero out the header, and write down the signature */ - RtlZeroMemory(Entry, sizeof(BL_APPLICATION_ENTRY)); - RtlCopyMemory(Entry->Signature, BL_APP_ENTRY_SIGNATURE, 7); - - /* Check if a BCD object was passed on the command-line */ - ObjectString = wcsstr(CommandLine, L"BCDOBJECT="); - if (ObjectString != NULL) - { - /* Convert the BCD object to a GUID */ - RtlInitUnicodeString(&GuidString, ObjectString + 10); - RtlGUIDFromString(&GuidString, &ObjectGuid); - - /* Store it in the application entry */ - Entry->Guid = ObjectGuid; - - /* Remember one was passed */ - HaveGuid = TRUE; - } - else - { - /* Remember that no identifier was passed */ - Entry->Flags |= BL_APPLICATION_ENTRY_FLAG_NO_GUID; - HaveGuid = FALSE; - } - - /* At this point, the header is consumed, and we must now handle BCD options */ - RemainingSize -= FIELD_OFFSET(BL_APPLICATION_ENTRY, BcdData); - - /* Convert the device path into a BCD option */ - Status = EfiInitpConvertEfiDevicePath(DevicePath, - BcdLibraryDevice_ApplicationDevice, - &Entry->BcdData, - RemainingSize); - if (!NT_SUCCESS(Status)) - { - /* We failed, so mark the option as such and return an empty one */ - Entry->BcdData.Empty = TRUE; - TotalOptionSize = sizeof(BL_BCD_OPTION); - goto Quickie; - } - - /* Extract the device descriptor and return it */ - BcdDevice = (PVOID)((ULONG_PTR)&Entry->BcdData + Entry->BcdData.DataOffset); - *AppEntryDevice = &BcdDevice->DeviceDescriptor; - - /* Calculate how big this option was and consume that from the buffer */ - TotalOptionSize = BlGetBootOptionSize(&Entry->BcdData); - RemainingSize -= TotalOptionSize; - - /* Calculate where the next option should go */ - Option = (PVOID)((ULONG_PTR)&Entry->BcdData + TotalOptionSize); - - /* Check if we're PXE booting or not */ - if ((*AppEntryDevice)->DeviceType == UdpDevice) - { - /* lol */ - Status = STATUS_NOT_IMPLEMENTED; - } - else - { - /* Convert the local file path into a BCD option */ - Status = EfiInitpConvertEfiFilePath(FilePath, - BcdLibraryString_ApplicationPath, - Option, - RemainingSize); - } - - /* Bail out on failure */ - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* The next option is right after this one */ - Entry->BcdData.NextEntryOffset = TotalOptionSize; - - /* Now compute the size of the next option, and add to the rolling sum */ - Size = BlGetBootOptionSize(Option); - TotalOptionSize += Size; - - /* Remember the previous option so we can update its next offset */ - PreviousOption = Option; - - /* Consume the option from the buffer */ - RemainingSize -= Size; - - /* Calculate where the next option should go */ - Option = (PVOID)((ULONG_PTR)Option + Size); - - /* Check if we were using binary options without a BCD GUID */ - if ((HaveBinaryOptions) && !(HaveGuid)) - { - /* Then this means we have to convert the OS paths to BCD too */ - WindowsOptions = (PBL_WINDOWS_LOAD_OPTIONS)LoadOptions; - OsPath = (PVOID)((ULONG_PTR)WindowsOptions + WindowsOptions->OsPathOffset); - - /* IS the OS path in EFI format? */ - if ((OsPath->Length > (ULONG)FIELD_OFFSET(BL_FILE_PATH_DESCRIPTOR, Path)) && - (OsPath->PathType == EfiPath)) - { - /* Convert the device portion */ - OsDevicePath = (EFI_DEVICE_PATH*)OsPath->Path; - Status = EfiInitpConvertEfiDevicePath(OsDevicePath, - BcdOSLoaderDevice_OSDevice, - Option, - RemainingSize); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Update the offset of the previous option */ - PreviousOption->NextEntryOffset = (ULONG_PTR)Option - (ULONG_PTR)&Entry->BcdData; - - /* Now compute the size of the next option, and add to the rolling sum */ - Size = BlGetBootOptionSize(Option); - TotalOptionSize += Size; - - /* Remember the previous option so we can update its next offset */ - PreviousOption = Option; - - /* Consume the option from the buffer */ - RemainingSize -= Size; - - /* Calculate where the next option should go */ - Option = (PVOID)((ULONG_PTR)Option + Size); - - /* Convert the path option */ - Status = EfiInitpConvertEfiFilePath(OsDevicePath, - BcdOSLoaderString_SystemRoot, - Option, - RemainingSize); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Update the offset of the previous option */ - PreviousOption->NextEntryOffset = (ULONG_PTR)Option - (ULONG_PTR)&Entry->BcdData; - - /* Now compute the size of the next option, and add to the rolling sum */ - Size = BlGetBootOptionSize(Option); - TotalOptionSize += Size; - - /* Remember the previous option so we can update its next offset */ - PreviousOption = Option; - - /* Consume the option from the buffer */ - RemainingSize -= Size; - - /* Calculate where the next option should go */ - Option = (PVOID)((ULONG_PTR)Option + Size); - } - } - - /* Now convert everything else */ - AhCreateLoadOptionsList(CommandLine, - &Entry->BcdData, - RemainingSize, - &TotalOptionSize, - &PreviousOption, - &Size); - -Quickie: - /* Return the final size */ - *ResultLength = HeaderSize + TotalOptionSize; -} - -/*++ - * @name EfiInitCreateInputParametersEx - * - * The EfiInitCreateInputParametersEx routine converts UEFI entrypoint - * parameters to the ones expected by Windows Boot Applications - * - * @param ImageHandle - * UEFI Image Handle for the current loaded application. - * - * @param SystemTable - * Pointer to the UEFI System Table. - * - * @return A PBOOT_APPLICATION_PARAMETER_BLOCK structure containing the data - * from UEFI, translated to the Boot Library-compatible format. - * - *--*/ -PBOOT_APPLICATION_PARAMETER_BLOCK -EfiInitCreateInputParametersEx ( - _In_ EFI_HANDLE ImageHandle, - _In_ EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_BOOT_SERVICES* BootServices; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - PBL_FIRMWARE_DESCRIPTOR FirmwareData; - PBL_RETURN_ARGUMENTS ReturnArguments; - ULONG FirmwareOffset, ConsumedSize; - PBL_DEVICE_DESCRIPTOR AppDevice; - EFI_STATUS Status; - - /* Initialize the header with the signature and version */ - EfiInitScratch.Signature[0] = BOOT_APPLICATION_SIGNATURE_1; - EfiInitScratch.Signature[1] = BOOT_APPLICATION_SIGNATURE_2; - EfiInitScratch.Version = BOOT_APPLICATION_VERSION; - - /* Set the image type to x86 */ - EfiInitScratch.ImageType = EFI_IMAGE_MACHINE_IA32; - - /* Set the translation type to physical */ - EfiInitScratch.MemoryTranslationType = BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL; - - /* Indicate that the data was converted from EFI */ - BlpApplicationFlags |= BL_APPLICATION_FLAG_CONVERTED_FROM_EFI; - - /* Grab the loaded image protocol, which has our base and size */ - BootServices = SystemTable->BootServices; - Status = BootServices->HandleProtocol(ImageHandle, - &EfiLoadedImageProtocol, - (VOID**)&LoadedImage); - if (Status != EFI_SUCCESS) - { - return NULL; - } - - /* Capture it in the boot application parameters */ - EfiInitScratch.ImageBase = (ULONG_PTR)LoadedImage->ImageBase; - EfiInitScratch.ImageSize = (ULONG)LoadedImage->ImageSize; - - /* Now grab our device path protocol, so we can convert the path later on */ - Status = BootServices->HandleProtocol(LoadedImage->DeviceHandle, - &EfiDevicePathProtocol, - (VOID**)&DevicePath); - if (Status != EFI_SUCCESS) - { - return NULL; - } - - /* The built-in boot memory data comes right after our block */ - EfiInitScratch.MemoryDataOffset = - FIELD_OFFSET(BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH, BootMemoryData); - - /* Build the boot memory data structure, with 1 descriptor */ - EfiInitScratch.BootMemoryData.Version = BL_MEMORY_DATA_VERSION; - EfiInitScratch.BootMemoryData.MdListOffset = - FIELD_OFFSET(BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH, MemEntry) - - EfiInitScratch.MemoryDataOffset; - EfiInitScratch.BootMemoryData.DescriptorSize = sizeof(BL_MEMORY_DESCRIPTOR); - EfiInitScratch.BootMemoryData.DescriptorCount = 1; - EfiInitScratch.BootMemoryData.DescriptorOffset = FIELD_OFFSET(BL_MEMORY_DESCRIPTOR, BasePage); - - /* Build the memory entry descriptor for this image itself */ - EfiInitScratch.MemEntry.Flags = BlMemoryWriteBack; - EfiInitScratch.MemEntry.Type = BlLoaderMemory; - EfiInitScratch.MemEntry.BasePage = EfiInitScratch.ImageBase >> PAGE_SHIFT; - EfiInitScratch.MemEntry.PageCount = ALIGN_UP_BY(EfiInitScratch.ImageSize, PAGE_SIZE) >> PAGE_SHIFT; - - /* The built-in application entry comes right after the memory descriptor*/ - EfiInitScratch.AppEntryOffset = - FIELD_OFFSET(BOOT_APPLICATION_PARAMETER_BLOCK_SCRATCH, AppEntry); - - /* Go and build it */ - EfiInitpCreateApplicationEntry(SystemTable, - (PBL_APPLICATION_ENTRY)&EfiInitScratch.AppEntry, - sizeof(EfiInitScratch.AppEntry), - DevicePath, - LoadedImage->FilePath, - LoadedImage->LoadOptions, - LoadedImage->LoadOptionsSize, - EfiInitScratch.MemEntry.PageCount, - &ConsumedSize, - &AppDevice); - - /* Boot device information comes right after the application entry */ - EfiInitScratch.BootDeviceOffset = ConsumedSize + EfiInitScratch.AppEntryOffset; - - /* Check if we have a boot device */ - if (AppDevice != NULL) - { - /* We do -- copy it */ - RtlCopyMemory(EfiInitScratch.AppEntry + ConsumedSize, - AppDevice, - AppDevice->Size); - - /* Firmware data follows right after the boot device entry */ - FirmwareOffset = AppDevice->Size + EfiInitScratch.BootDeviceOffset; - } - else - { - /* We do not, so zero out the space where a full boot device structure would fit */ - RtlZeroMemory(EfiInitScratch.AppEntry + ConsumedSize, - sizeof(BL_DEVICE_DESCRIPTOR)); - - /* And start the firmware data past that */ - FirmwareOffset = EfiInitScratch.BootDeviceOffset + sizeof(BL_DEVICE_DESCRIPTOR); - } - - /* Set the computed firmware data offset */ - EfiInitScratch.FirmwareParametersOffset = FirmwareOffset; - - /* Fill out the firmware data that's there */ - FirmwareData = (PVOID)((ULONG_PTR)&EfiInitScratch + EfiInitScratch.FirmwareParametersOffset); - FirmwareData->Version = BL_FIRMWARE_DESCRIPTOR_VERSION; - FirmwareData->ImageHandle = ImageHandle; - FirmwareData->SystemTable = SystemTable; - - /* Finally, set the return argument offset */ - EfiInitScratch.ReturnArgumentsOffset = FirmwareOffset + sizeof(BL_FIRMWARE_DESCRIPTOR); - - /* And fill out the return argument data */ - ReturnArguments = (PVOID)((ULONG_PTR)&EfiInitScratch + EfiInitScratch.ReturnArgumentsOffset); - ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION; - - /* We're done, compute the final size and return the block */ - EfiInitScratch.Size = EfiInitScratch.ReturnArgumentsOffset + sizeof(BL_RETURN_ARGUMENTS); - return (PBOOT_APPLICATION_PARAMETER_BLOCK)&EfiInitScratch; -} - -/*++ - * @name EfiEntry - * - * The EfiEntry routine implements the UEFI entrypoint for the application. - * - * @param ImageHandle - * UEFI Image Handle for the current loaded application. - * - * @param SystemTable - * Pointer to the UEFI System Table. - * - * @return EFI_SUCCESS if the image was loaded correctly, relevant error code - * otherwise. - * - *--*/ -EFI_STATUS -EFIAPI -EfiEntry ( - _In_ EFI_HANDLE ImageHandle, - _In_ EFI_SYSTEM_TABLE *SystemTable - ) -{ - NTSTATUS Status; - PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters; - - /* Convert EFI parameters to Windows Boot Application parameters */ - BootParameters = EfiInitCreateInputParametersEx(ImageHandle, SystemTable); - if (BootParameters != NULL) - { - /* Conversion was good -- call the Boot Manager Entrypoint */ - Status = BmMain(BootParameters); - } - else - { - /* Conversion failed, bail out */ - Status = STATUS_INVALID_PARAMETER; - } - - /* Convert the NT status code to an EFI code */ - return EfiGetEfiStatusCode(Status); -} - diff --git a/boot/environ/app/rosload/i386/osxfera.s b/boot/environ/app/rosload/i386/osxfera.s deleted file mode 100644 index 1418f164b35..00000000000 --- a/boot/environ/app/rosload/i386/osxfera.s +++ /dev/null @@ -1,54 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI OS Loader - * FILE: boot/environ/i386/osxfera.asm - * PURPOSE: OS Loader i386 Transfer Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include -#include - -EXTERN _OslKernelGdt:FWORD -EXTERN _OslKernelIdt:FWORD - -/* FUNCTIONS ****************************************************************/ -.code - -PUBLIC _OslArchTransferToKernel -_OslArchTransferToKernel: - - /* Load new GDT and IDT */ - lgdt _OslKernelGdt+2 - lidt _OslKernelIdt+2 - - /* Set the Ring 0 DS/ES/SS Segment */ - mov ax, KGDT_R0_DATA - mov ds, ax - mov es, ax - mov ss, ax - mov gs, ax - - /* Get the Ring 0 TSS */ - mov ax, KGDT_TSS - ltr ax - - /* Save loader block and entrypoint */ - mov ecx, [esp+4] - mov eax, [esp+8] - - /* Create initial interrupt frame */ - xor edx, edx - push ecx - push edx - push KGDT_R0_CODE - push eax - - /* Jump to KGDT_R0_CODE:[EAX] */ - retf - - /* We should never make it here */ - ret 8 -END diff --git a/boot/environ/app/rosload/rosload.c b/boot/environ/app/rosload/rosload.c deleted file mode 100644 index c66b5a78834..00000000000 --- a/boot/environ/app/rosload/rosload.c +++ /dev/null @@ -1,1129 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI OS Loader - * FILE: boot/environ/app/rosload/rosload.c - * PURPOSE: OS Loader Entrypoint - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "rosload.h" - -NTSTATUS -OslArchTransferToKernel ( - _In_ PLOADER_PARAMETER_BLOCK LoaderBlock, - _In_ PVOID KernelEntrypoint - ); - -/* DATA VARIABLES ************************************************************/ - -PLOADER_PARAMETER_BLOCK OslLoaderBlock; -PVOID OslEntryPoint; -PVOID UserSharedAddress; -ULONGLONG ArchXCr0BitsToClear; -ULONGLONG ArchCr4BitsToClear; -BOOLEAN BdDebugAfterExitBootServices; -KDESCRIPTOR OslKernelGdt; -KDESCRIPTOR OslKernelIdt; - -ULONG_PTR OslImcHiveHandle; -ULONG_PTR OslMachineHiveHandle; -ULONG_PTR OslElamHiveHandle; -ULONG_PTR OslSystemHiveHandle; - -PBL_DEVICE_DESCRIPTOR OslLoadDevice; -PCHAR OslLoadOptions; -PWCHAR OslSystemRoot; - -LIST_ENTRY OslFreeMemoryDesctiptorsList; -LIST_ENTRY OslFinalMemoryMap; -LIST_ENTRY OslCoreExtensionSubGroups[2]; -LIST_ENTRY OslLoadedFirmwareDriverList; - -BL_BUFFER_DESCRIPTOR OslFinalMemoryMapDescriptorsBuffer; - -GUID OslApplicationIdentifier; - -ULONG OslResetBootStatus; -BOOLEAN OslImcProcessingValid; -ULONG OslFreeMemoryDesctiptorsListSize; -PVOID OslMemoryDescriptorBuffer; - -BcdObjectType BlpSbdiCurrentApplicationType; - -PRTL_BSD_DATA BsdBootStatusData; - -OSL_BSD_ITEM_TABLE_ENTRY OslpBootStatusFields[RtlBsdItemMax] = -{ - { - FIELD_OFFSET(RTL_BSD_DATA, Version), - sizeof(&BsdBootStatusData->Version) - }, // RtlBsdItemVersionNumber - { - FIELD_OFFSET(RTL_BSD_DATA, ProductType), - sizeof(&BsdBootStatusData->ProductType) - }, // RtlBsdItemProductType - { - FIELD_OFFSET(RTL_BSD_DATA, AabEnabled), - sizeof(&BsdBootStatusData->AabEnabled) - }, // RtlBsdItemAabEnabled - { - FIELD_OFFSET(RTL_BSD_DATA, AabTimeout), - sizeof(&BsdBootStatusData->AabTimeout) - }, // RtlBsdItemAabTimeout - { - FIELD_OFFSET(RTL_BSD_DATA, LastBootSucceeded), - sizeof(&BsdBootStatusData->LastBootSucceeded) - }, // RtlBsdItemBootGood - { - FIELD_OFFSET(RTL_BSD_DATA, LastBootShutdown), - sizeof(&BsdBootStatusData->LastBootShutdown) - }, // RtlBsdItemBootShutdown - { - FIELD_OFFSET(RTL_BSD_DATA, SleepInProgress), - sizeof(&BsdBootStatusData->SleepInProgress) - }, // RtlBsdSleepInProgress - { - FIELD_OFFSET(RTL_BSD_DATA, PowerTransition), - sizeof(&BsdBootStatusData->PowerTransition) - }, // RtlBsdPowerTransition - { - FIELD_OFFSET(RTL_BSD_DATA, BootAttemptCount), - sizeof(&BsdBootStatusData->BootAttemptCount) - }, // RtlBsdItemBootAttemptCount - { - FIELD_OFFSET(RTL_BSD_DATA, LastBootCheckpoint), - sizeof(&BsdBootStatusData->LastBootCheckpoint) - }, // RtlBsdItemBootCheckpoint - { - FIELD_OFFSET(RTL_BSD_DATA, LastBootId), - sizeof(&BsdBootStatusData->LastBootId) - }, // RtlBsdItemBootId - { - FIELD_OFFSET(RTL_BSD_DATA, LastSuccessfulShutdownBootId), - sizeof(&BsdBootStatusData->LastSuccessfulShutdownBootId) - }, // RtlBsdItemShutdownBootId - { - FIELD_OFFSET(RTL_BSD_DATA, LastReportedAbnormalShutdownBootId), - sizeof(&BsdBootStatusData->LastReportedAbnormalShutdownBootId) - }, // RtlBsdItemReportedAbnormalShutdownBootId - { - FIELD_OFFSET(RTL_BSD_DATA, ErrorInfo), - sizeof(&BsdBootStatusData->ErrorInfo) - }, // RtlBsdItemErrorInfo - { - FIELD_OFFSET(RTL_BSD_DATA, PowerButtonPressInfo), - sizeof(&BsdBootStatusData->PowerButtonPressInfo) - }, // RtlBsdItemPowerButtonPressInfo - { - FIELD_OFFSET(RTL_BSD_DATA, Checksum), - sizeof(&BsdBootStatusData->Checksum) - }, // RtlBsdItemChecksum -}; - -ULONG OslBootAttemptCount; -ULONG OslBootCountUpdateRequestForAbort; -ULONG OslBootAttemptMaximum; - -ULONG OslBootCountUpdateIncrement; - -BOOLEAN OslCurrentBootCheckpoint; -BOOLEAN OslCurrentBootSucceeded; -BOOLEAN OslCurrentBootShutdown; - -/* FUNCTIONS *****************************************************************/ - -VOID -OslFatalErrorEx ( - _In_ ULONG ErrorCode, - _In_ ULONG Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3 - ) -{ - /* For now just do this */ - BlStatusPrint(L"FATAL ERROR IN ROSLOAD: %lx\n", ErrorCode); -} - -VOID -OslAbortBoot ( - _In_ NTSTATUS Status - ) -{ - /* For now just do this */ - BlStatusPrint(L"BOOT ABORTED: %lx\n", Status); -} - -NTSTATUS -OslBlStatusErrorHandler ( - _In_ ULONG ErrorCode, - _In_ ULONG Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3, - _In_ ULONG_PTR Parameter4 - ) -{ - /* We only filter error code 4 */ - if (ErrorCode != 4) - { - return STATUS_NOT_IMPLEMENTED; - } - - /* Handle error 4 as a fatal error 3 internally */ - OslFatalErrorEx(3, Parameter1, Parameter2, Parameter3); - return STATUS_SUCCESS; -} - -VOID -OslpSanitizeLoadOptionsString ( - _In_ PWCHAR OptionString, - _In_ PWCHAR SanitizeString - ) -{ - /* TODO */ - return; -} - -VOID -OslpSanitizeStringOptions ( - _In_ PBL_BCD_OPTION BcdOptions - ) -{ - /* TODO */ - return; -} - -NTSTATUS -OslpRemoveInternalApplicationOptions ( - VOID - ) -{ - PWCHAR LoadString; - NTSTATUS Status; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Remove attempts to disable integrity checks or ELAM driver load */ - BlRemoveBootOption(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_DisableIntegrityChecks); - BlRemoveBootOption(BlpApplicationEntry.BcdData, - BcdOSLoaderBoolean_DisableElamDrivers); - - /* Get the command-line parameters, if any */ - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdLibraryString_LoadOptionsString, - &LoadString); - if (NT_SUCCESS(Status)) - { - /* Conver to upper case */ - _wcsupr(LoadString); - - /* Remove the existing one */ - BlRemoveBootOption(BlpApplicationEntry.BcdData, - BcdLibraryString_LoadOptionsString); - - /* Sanitize strings we don't want */ - OslpSanitizeLoadOptionsString(LoadString, L"DISABLE_INTEGRITY_CHECKS"); - OslpSanitizeLoadOptionsString(LoadString, L"NOINTEGRITYCHECKS"); - OslpSanitizeLoadOptionsString(LoadString, L"DISABLEELAMDRIVERS"); - - /* Add the sanitized one back */ - Status = BlAppendBootOptionString(&BlpApplicationEntry, - BcdLibraryString_LoadOptionsString, - LoadString); - - /* Free the original BCD one */ - BlMmFreeHeap(LoadString); - } - - /* One more pass for secure-boot options */ - OslpSanitizeStringOptions(BlpApplicationEntry.BcdData); - - /* All good */ - return Status; -} - -NTSTATUS -OslpCheckForcedFailure ( - VOID - ) -{ - ULONG64 ForceReason; - NTSTATUS Status; - - /* Read the option */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdOSLoaderInteger_ForceFailure, - &ForceReason); - if (NT_SUCCESS(Status) && (ForceReason < 4)) - { - /* For reasons above 3, don't actually do anything */ - if (ForceReason > 3) - { - return STATUS_SUCCESS; - } - } - - /* If the option isn't there or invalid, always return success */ - return STATUS_SUCCESS; -} - -VOID -OslpInitializeBootStatusDataLog ( - VOID - ) -{ - /* TODO */ - return; -} - -NTSTATUS -OslpReadWriteBootStatusData ( - _In_ BOOLEAN WriteAccess - ) -{ - /* Are you trying to write? */ - if (WriteAccess) - { - /* Have we already read? */ - if (!BsdBootStatusData) - { - /* No -- fail */ - return STATUS_UNSUCCESSFUL; - } - } - else if (BsdBootStatusData) - { - /* No -- you're trying to read and we already have the data: no-op */ - return STATUS_SUCCESS; - } - - /* TODO */ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -OslpGetSetBootStatusData ( - _In_ BOOLEAN Read, - _In_ RTL_BSD_ITEM_TYPE DataClass, - _Out_ PVOID Buffer, - _Inout_ PULONG Size - ) -{ - NTSTATUS Status; - ULONG Length, Offset; - - /* No data has been read yet, fail */ - if (!BsdBootStatusData) - { - return STATUS_UNSUCCESSFUL; - } - - /* Invalid data item, fail */ - if (DataClass >= RtlBsdItemMax) - { - return STATUS_INVALID_PARAMETER; - } - - /* Capture the length and offset */ - Length = OslpBootStatusFields[DataClass].Size; - Offset = OslpBootStatusFields[DataClass].Offset; - - /* Make sure it doesn't overflow past the structure we've read */ - if ((Length + Offset) > BsdBootStatusData->Version) - { - return STATUS_REVISION_MISMATCH; - } - - /* Make sure we have enough space */ - if (*Size >= Length) - { - /* We do -- is this a read? */ - if (Read) - { - /* Yes, copy into the caller's buffer */ - RtlCopyMemory(Buffer, - (PVOID)((ULONG_PTR)BsdBootStatusData + Offset), - Length); - } - else - { - /* It's a write, copy from caller's buffer */ - RtlCopyMemory((PVOID)((ULONG_PTR)BsdBootStatusData + Offset), - Buffer, - Length); - } - - /* Set success */ - Status = STATUS_SUCCESS; - } - else - { - /* Return size needed and failure code */ - *Size = Length; - Status = STATUS_BUFFER_TOO_SMALL; - } - - /* All good */ - return Status; -} - -NTSTATUS -OslSetBootStatusData ( - _In_ BOOLEAN LastBootGood, - _In_ BOOLEAN LastBootShutdown, - _In_ BOOLEAN LastBootCheckpoint, - _In_ ULONG UpdateIncrement, - _In_ ULONG BootAttemptCount - ) -{ - NTSTATUS Status; - ULONG Size; - - /* Capture the BSD data in our globals, if needed */ - Status = OslpReadWriteBootStatusData(FALSE); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Write last boot shutdown */ - Size = sizeof(LastBootShutdown); - Status = OslpGetSetBootStatusData(FALSE, - RtlBsdItemBootShutdown, - &LastBootShutdown, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Write last boot good */ - Size = sizeof(LastBootGood); - Status = OslpGetSetBootStatusData(FALSE, - RtlBsdItemBootGood, - &LastBootGood, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Write last boot checkpoint */ - Size = sizeof(LastBootCheckpoint); - Status = OslpGetSetBootStatusData(FALSE, - RtlBsdItemBootCheckpoint, - &LastBootCheckpoint, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Write boot attempt count */ - Size = sizeof(BootAttemptCount); - Status = OslpGetSetBootStatusData(FALSE, - RtlBsdItemBootAttemptCount, - &BootAttemptCount, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* TODO: Update Boot ID*/ - - /* Now write the data */ - Status = OslpReadWriteBootStatusData(TRUE); - -Quickie: - return Status; -} - -NTSTATUS -OslGetBootStatusData ( - _Out_ PBOOLEAN LastBootGood, - _Out_ PBOOLEAN LastBootShutdown, - _Out_ PBOOLEAN LastBootCheckpoint, - _Out_ PULONG LastBootId, - _Out_ PBOOLEAN BootGood, - _Out_ PBOOLEAN BootShutdown - ) -{ - NTSTATUS Status; - ULONG Size; - ULONG64 BootStatusPolicy; - BOOLEAN localBootShutdown, localBootGood; - - /* Capture the BSD data in our globals, if needed */ - Status = OslpReadWriteBootStatusData(FALSE); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Read the last boot ID */ - Size = sizeof(*LastBootId); - Status = OslpGetSetBootStatusData(TRUE, RtlBsdItemBootId, LastBootId, &Size); - if (!NT_SUCCESS(Status)) - { - /* Set to zero if we couldn't find it */ - *LastBootId = 0; - } - - /* Get the boot status policy */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdOSLoaderInteger_BootStatusPolicy, - &BootStatusPolicy); - if (!NT_SUCCESS(Status)) - { - /* Apply a default if none exists */ - BootStatusPolicy = IgnoreShutdownFailures; - } - - /* Check if this was a good shutdown */ - Size = sizeof(localBootShutdown); - Status = OslpGetSetBootStatusData(TRUE, - RtlBsdItemBootShutdown, - &localBootShutdown, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Tell the caller */ - *BootShutdown = localBootShutdown; - - /* Check if this was a good boot */ - Size = sizeof(localBootGood); - Status = OslpGetSetBootStatusData(TRUE, - RtlBsdItemBootGood, - &localBootGood, - &Size); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Tell the caller*/ - *BootGood = localBootGood; - - /* TODO: Additional logic for checkpoints and such */ - Status = STATUS_NOT_IMPLEMENTED; - -Quickie: - return Status; -} - -BOOLEAN -OslpAdvancedOptionsRequested ( - VOID - ) -{ - /* TODO */ - return FALSE; -} - -NTSTATUS -OslPrepareTarget ( - _Out_ PULONG ReturnFlags, - _Out_ PBOOLEAN Jump - ) -{ - PGUID AppId; - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR OsDevice; - PWCHAR SystemRoot; - SIZE_T RootLength, RootLengthWithSep; - ULONG i; - ULONG64 StartPerf, EndPerf; - RTL_BSD_DATA_POWER_TRANSITION PowerTransitionData; - PRTL_BSD_DATA_POWER_TRANSITION PowerBuffer; - ULONG OsDeviceHandle; - BOOLEAN LastBootGood, LastBootShutdown, LastBootCheckpoint; - ULONG BootId; - BOOLEAN BootGood, BootShutdown; - ULONG BsdSize; - - /* Initialize locals */ - PowerBuffer = NULL; - - /* Assume no flags */ - *ReturnFlags = 0; - - /* Make all registry handles invalid */ - OslImcHiveHandle = -1; - OslMachineHiveHandle = -1; - OslElamHiveHandle = -1; - OslSystemHiveHandle = -1; - - /* Initialize memory lists */ - InitializeListHead(&OslFreeMemoryDesctiptorsList); - InitializeListHead(&OslFinalMemoryMap); - InitializeListHead(&OslLoadedFirmwareDriverList); - for (i = 0; i < RTL_NUMBER_OF(OslCoreExtensionSubGroups); i++) - { - InitializeListHead(&OslCoreExtensionSubGroups[i]); - } - - /* Initialize the memory map descriptor buffer */ - RtlZeroMemory(&OslFinalMemoryMapDescriptorsBuffer, - sizeof(OslFinalMemoryMapDescriptorsBuffer)); - - /* Initialize general pointers */ - OslLoadDevice = NULL; - OslLoadOptions = NULL; - OslSystemRoot = NULL; - OslLoaderBlock = NULL; - OslMemoryDescriptorBuffer = NULL; - - /* Initialize general variables */ - OslResetBootStatus = 0; - OslImcProcessingValid = FALSE; - OslFreeMemoryDesctiptorsListSize = 0; - - /* Capture the current TSC */ - StartPerf = BlArchGetPerformanceCounter(); - - /* Set our application type for SecureBoot/TPM purposes */ - BlpSbdiCurrentApplicationType.Application.ObjectCode = - BCD_OBJECT_TYPE_APPLICATION; - BlpSbdiCurrentApplicationType.Application.ImageCode = - BCD_IMAGE_TYPE_BOOT_APP; - BlpSbdiCurrentApplicationType.Application.ApplicationCode = - BCD_APPLICATION_TYPE_OSLOADER; - BlpSbdiCurrentApplicationType.Application.Reserved = 0; - - /* Register an error handler */ - BlpStatusErrorHandler = OslBlStatusErrorHandler; - - /* Get the application identifier and save it */ - AppId = BlGetApplicationIdentifier(); - if (AppId) - { - OslApplicationIdentifier = *AppId; - } - - /* Enable tracing */ -#ifdef BL_ETW_SUPPORT - TraceLoggingRegister(&TlgOslBootProviderProv); -#endif - - /* Remove dangerous BCD options */ - Status = OslpRemoveInternalApplicationOptions(); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* Get the OS device */ - Status = BlGetBootOptionDevice(BlpApplicationEntry.BcdData, - BcdOSLoaderDevice_OSDevice, - &OsDevice, - 0); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* If the OS device is the boot device, use the one provided by bootlib */ - if (OsDevice->DeviceType == BootDevice) - { - OsDevice = BlpBootDevice; - } - - /* Save it as a global for later */ - OslLoadDevice = OsDevice; - - /* Get the system root */ - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdOSLoaderString_SystemRoot, - &SystemRoot); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - EfiPrintf(L"System root: %s\r\n", SystemRoot); - - /* Get the system root length and make sure it's slash-terminated */ - RootLength = wcslen(SystemRoot); - if (SystemRoot[RootLength - 1] == OBJ_NAME_PATH_SEPARATOR) - { - /* Perfect, set it */ - OslSystemRoot = SystemRoot; - } - else - { - /* Allocate a new buffer large enough to contain the slash */ - RootLengthWithSep = RootLength + sizeof(OBJ_NAME_PATH_SEPARATOR); - OslSystemRoot = BlMmAllocateHeap(RootLengthWithSep * sizeof(WCHAR)); - if (!OslSystemRoot) - { - /* Bail out if we're out of memory */ - Status = STATUS_NO_MEMORY; - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* Make a copy of the path, adding the separator */ - wcscpy(OslSystemRoot, SystemRoot); - wcscat(OslSystemRoot, L"\\"); - - /* Free the original one from the BCD library */ - BlMmFreeHeap(SystemRoot); - } - - /* Initialize access to the BSD */ - OslpInitializeBootStatusDataLog(); - - /* Check if we're supposed to fail on purpose */ - Status = OslpCheckForcedFailure(); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* Always disable VGA mode */ - Status = BlAppendBootOptionBoolean(&BlpApplicationEntry, - BcdOSLoaderBoolean_DisableVgaMode, - TRUE); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* Get telemetry data from the last boot */ - Status = OslGetBootStatusData(&LastBootGood, - &LastBootShutdown, - &LastBootCheckpoint, - &BootId, - &BootGood, - &BootShutdown); - if (!NT_SUCCESS(Status)) - { - /* Assume this is the very first boot and everything went well */ - BootId = 0; - LastBootGood = TRUE; - LastBootShutdown = TRUE; - LastBootCheckpoint = TRUE; - BootGood = TRUE; - BootShutdown = TRUE; - - /* Set 0 boot attempts */ - OslBootAttemptCount = 0; - } - - /* Set more attempt variables to their initial state */ - OslResetBootStatus = TRUE; - OslBootCountUpdateRequestForAbort = 0; - - /* Read the current BSD data into the global buffer */ - Status = OslpReadWriteBootStatusData(FALSE); - if (NT_SUCCESS(Status)) - { - /* Get the power transition buffer from the BSD */ - BsdSize = sizeof(PowerTransitionData); - Status = OslpGetSetBootStatusData(TRUE, - RtlBsdPowerTransition, - &PowerTransitionData, - &BsdSize); - if (NT_SUCCESS(Status)) - { - /* Save the buffer */ - PowerBuffer = &PowerTransitionData; - } - } - - /* Check if this is VHD boot, which gets 3 boot attempts instead of 2 */ - OslBootAttemptMaximum = 2; - OslBootAttemptMaximum += BlDeviceIsVirtualPartitionDevice(OslLoadDevice, NULL); - - /* Check if the user wants to see the advanced menu */ - if (!OslpAdvancedOptionsRequested()) - { - /* The last boot failed more than the maximum */ - if (!(LastBootGood) && - (OslBootAttemptCount >= OslBootAttemptMaximum)) - { - /* Return failure due to boot -- launch recovery */ - *ReturnFlags |= 8; - - /* Update the attempt count and status variables */ - OslBootAttemptCount = OslBootAttemptMaximum - 1; - OslCurrentBootCheckpoint = LastBootCheckpoint; - OslCurrentBootSucceeded = FALSE; - OslCurrentBootShutdown = LastBootShutdown; - - /* Crash with code 15 and abort boot */ - OslFatalErrorEx(15, 0, 0, 0); - Status = STATUS_UNSUCCESSFUL; - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* We never made it far enough, more than the maximum */ - if (!(LastBootCheckpoint) && - (OslBootAttemptCount >= OslBootAttemptMaximum)) - { - /* Return crash/dirty shutdown during boot attempt */ - *ReturnFlags |= 0x10; - - /* Update the attempt count and status variables */ - OslBootAttemptCount = OslBootAttemptMaximum - 1; - OslCurrentBootSucceeded = LastBootGood; - OslCurrentBootShutdown = LastBootShutdown; - OslCurrentBootCheckpoint = FALSE; - - /* Crash with code 16 and abort boot */ - OslFatalErrorEx(16, 0, 0, 0); - Status = STATUS_UNSUCCESSFUL; - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* We failed to shutdown cleanly, and haven't booted yet */ - if (!(LastBootShutdown) && !(OslBootAttemptCount)) - { - /* Return crash/dirty shutdown */ - *ReturnFlags |= 0x10; - - /* There's no boot attempt, so only update shutdown variables */ - OslCurrentBootSucceeded = LastBootGood; - OslCurrentBootShutdown = TRUE; - OslCurrentBootCheckpoint = LastBootCheckpoint; - - /* Crash with code 16 and abort boot */ - OslFatalErrorEx(16, 0, 0, 0); - Status = STATUS_UNSUCCESSFUL; - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - } - - /* Officially increment the number of boot attempts */ - OslBootAttemptCount++; - - /* No success yet, write to boot status file */ - OslCurrentBootCheckpoint = FALSE; - OslCurrentBootSucceeded = FALSE; - OslCurrentBootShutdown = FALSE; - OslSetBootStatusData(FALSE, - FALSE, - FALSE, - OslBootCountUpdateIncrement, - OslBootAttemptCount); - - /* Open the OS Loader Device for Read/Write access */ - Status = BlpDeviceOpen(OslLoadDevice, - BL_DEVICE_READ_ACCESS | BL_DEVICE_WRITE_ACCESS, - 0, - &OsDeviceHandle); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Fail here: %d\r\n", __LINE__); - goto Quickie; - } - - /* That's all for now, folks */ - Status = STATUS_NOT_IMPLEMENTED; - DBG_UNREFERENCED_LOCAL_VARIABLE(PowerBuffer); - - /* Printf perf */ - EndPerf = BlArchGetPerformanceCounter(); - EfiPrintf(L"Delta: %lld\r\n", EndPerf - StartPerf); - -Quickie: -#if BL_BITLOCKER_SUPPORT - /* Destroy the RNG/AES library for BitLocker */ - SymCryptRngAesUninstantiate(); -#endif - - /* Abort the boot */ - OslAbortBoot(Status); - - /* This is a failure path, so never do the jump */ - *Jump = FALSE; - - /* Return error code */ - return Status; -} - -NTSTATUS -OslFwpKernelSetupPhase1 ( - _In_ PLOADER_PARAMETER_BLOCK LoaderBlock - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -OslArchpKernelSetupPhase0 ( - _In_ PLOADER_PARAMETER_BLOCK LoaderBlock - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -VOID -ArchRestoreProcessorFeatures ( - VOID - ) -{ - /* Any XCR0 bits to clear? */ - if (ArchXCr0BitsToClear) - { - /* Clear them */ -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_M_ARM) - __xsetbv(0, __xgetbv(0) & ~ArchXCr0BitsToClear); -#endif - ArchXCr0BitsToClear = 0; - } - - /* Any CR4 bits to clear? */ - if (ArchCr4BitsToClear) - { - /* Clear them */ -#if !defined(_M_ARM) - __writecr4(__readcr4() & ~ArchCr4BitsToClear); -#endif - ArchCr4BitsToClear = 0; - } -} - -NTSTATUS -OslArchKernelSetup ( - _In_ ULONG Phase, - _In_ PLOADER_PARAMETER_BLOCK LoaderBlock - ) -{ - /* For phase 0, do architectural setup */ - if (Phase == 0) - { - return OslArchpKernelSetupPhase0(LoaderBlock); - } - - /* Nothing to do for Phase 1 */ - if (Phase == 1) - { - return STATUS_SUCCESS; - } - - /* Relocate the self map */ - BlMmRelocateSelfMap(); - - /* Zero out the HAL Heap */ - BlMmZeroVirtualAddressRange((PVOID)MM_HAL_VA_START, - MM_HAL_VA_END - MM_HAL_VA_START + 1); - - /* Move shared user data in its place */ - BlMmMoveVirtualAddressRange((PVOID)KI_USER_SHARED_DATA, - UserSharedAddress, - PAGE_SIZE); - - /* Clear XCR0/CR4 CPU features that should be disabled before boot */ - ArchRestoreProcessorFeatures(); - - /* Good to go */ - return STATUS_SUCCESS; -} - -NTSTATUS -OslExecuteTransition ( - VOID - ) -{ - NTSTATUS Status; - - /* Is the debugger meant to be kept enabled throughout the boot phase? */ - if (!BdDebugAfterExitBootServices) - { -#ifdef BL_KD_SUPPORT - /* No -- disable it */ - BlBdStop(); -#endif - } - - /* Setup Firmware for Phase 1 */ - Status = OslFwpKernelSetupPhase1(OslLoaderBlock); - if (NT_SUCCESS(Status)) - { - /* Setup kernel for Phase 2 */ - Status = OslArchKernelSetup(2, OslLoaderBlock); - if (NT_SUCCESS(Status)) - { -#ifdef BL_KD_SUPPORT - /* Stop the boot debugger */ - BlBdStop(); -#endif - /* Jump to the kernel entrypoint */ - OslArchTransferToKernel(OslLoaderBlock, OslEntryPoint); - - /* Infinite loop if we got here */ - for (;;); - } - } - - /* Return back with the failure code */ - return Status; -} - -NTSTATUS -OslpMain ( - _Out_ PULONG ReturnFlags - ) -{ - NTSTATUS Status; - BOOLEAN ExecuteJump; -#if !defined(_M_ARM) - CPU_INFO CpuInfo; - BOOLEAN NxEnabled; - LARGE_INTEGER MiscMsr; - - /* Check if the CPU supports NX */ - BlArchCpuId(0x80000001, 0, &CpuInfo); - if (!(CpuInfo.Edx & 0x10000)) - { - /* It doesn't, check if this is Intel */ - EfiPrintf(L"NX disabled: %lx\r\n", CpuInfo.Edx); - if (BlArchGetCpuVendor() == CPU_INTEL) - { - /* Then turn off the MSR disable feature for it, enabling NX */ - MiscMsr.QuadPart = __readmsr(MSR_IA32_MISC_ENABLE); - EfiPrintf(L"NX being turned on: %llx\r\n", MiscMsr.QuadPart); - MiscMsr.HighPart &= MSR_XD_ENABLE_MASK; - MiscMsr.QuadPart = __readmsr(MSR_IA32_MISC_ENABLE); - __writemsr(MSR_IA32_MISC_ENABLE, MiscMsr.QuadPart); - NxEnabled = TRUE; - } - } - - /* Turn on NX support with the CPU-generic MSR */ - __writemsr(MSR_EFER, __readmsr(MSR_EFER) | MSR_NXE); - -#endif - - /* Load the kernel */ - Status = OslPrepareTarget(ReturnFlags, &ExecuteJump); - if (NT_SUCCESS(Status) && (ExecuteJump)) - { - /* Jump to the kernel */ - Status = OslExecuteTransition(); - } - -#if !defined(_M_ARM) - /* Retore NX support */ - __writemsr(MSR_EFER, __readmsr(MSR_EFER) ^ MSR_NXE); - - /* Did we manually enable NX? */ - if (NxEnabled) - { - /* Turn it back off */ - MiscMsr.QuadPart = __readmsr(MSR_IA32_MISC_ENABLE); - MiscMsr.HighPart |= ~MSR_XD_ENABLE_MASK; - __writemsr(MSR_IA32_MISC_ENABLE, MiscMsr.QuadPart); - } - -#endif - /* Go back */ - return Status; -} - -/*++ - * @name OslMain - * - * The OslMain function implements the Windows Boot Application entrypoint for - * the OS Loader. - * - * @param BootParameters - * Pointer to the Boot Application Parameter Block. - * - * @return NT_SUCCESS if the image was loaded correctly, relevant error code - * otherwise. - * - *--*/ -NTSTATUS -NTAPI -OslMain ( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters - ) -{ - BL_LIBRARY_PARAMETERS LibraryParameters; - NTSTATUS Status; - PBL_RETURN_ARGUMENTS ReturnArguments; - PBL_APPLICATION_ENTRY AppEntry; - CPU_INFO CpuInfo; - ULONG Flags; - - /* Get the return arguments structure, and set our version */ - ReturnArguments = (PBL_RETURN_ARGUMENTS)((ULONG_PTR)BootParameters + - BootParameters->ReturnArgumentsOffset); - ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION; - - /* Get the application entry, and validate it */ - AppEntry = (PBL_APPLICATION_ENTRY)((ULONG_PTR)BootParameters + - BootParameters->AppEntryOffset); - if (!RtlEqualMemory(AppEntry->Signature, - BL_APP_ENTRY_SIGNATURE, - sizeof(AppEntry->Signature))) - { - /* Unrecognized, bail out */ - Status = STATUS_INVALID_PARAMETER_9; - goto Quickie; - } - -#if !defined(_M_ARM) - /* Check if CPUID 01h is supported */ - if (BlArchIsCpuIdFunctionSupported(1)) - { - /* Query CPU features */ - BlArchCpuId(1, 0, &CpuInfo); - - /* Check if PAE is supported */ - if (CpuInfo.Edx & 0x40) - { - EfiPrintf(L"PAE Supported, but won't be used\r\n"); - } - } -#endif - - /* Setup the boot library parameters for this application */ - BlSetupDefaultParameters(&LibraryParameters); - LibraryParameters.TranslationType = BlVirtual; - LibraryParameters.LibraryFlags = BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE | - BL_LIBRARY_FLAG_REINITIALIZE_ALL; - LibraryParameters.MinimumAllocationCount = 1024; - LibraryParameters.MinimumHeapSize = 2 * 1024 * 1024; - LibraryParameters.HeapAllocationAttributes = BlMemoryKernelRange; - LibraryParameters.FontBaseDirectory = L"\\ReactOS\\Boot\\Fonts"; - LibraryParameters.DescriptorCount = 512; - - /* Initialize the boot library */ - Status = BlInitializeLibrary(BootParameters, &LibraryParameters); - if (NT_SUCCESS(Status)) - { - /* For testing, draw the logo */ - OslDrawLogo(); - - /* Call the main routine */ - Status = OslpMain(&Flags); - - /* Return the flags, and destroy the boot library */ - ReturnArguments->Flags = Flags; - BlDestroyLibrary(); - } - -Quickie: - /* Return back to boot manager */ - ReturnArguments->Status = Status; - return Status; -} - diff --git a/boot/environ/app/rosload/rosload.h b/boot/environ/app/rosload/rosload.h deleted file mode 100644 index c5cad3a4930..00000000000 --- a/boot/environ/app/rosload/rosload.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI OS Loader - * FILE: boot/environ/app/rosload/rosload.h - * PURPOSE: Main OS Loader Header - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -#ifndef _ROSLOAD_H -#define _ROSLOAD_H - -/* INCLUDES ******************************************************************/ - -/* C Headers */ -#include -#include -#include - -/* NT Base Headers */ -#include -#include - -/* UEFI Headers */ -#include - -/* Boot Library Headers */ -#include - -/* BCD Headers */ -#include - -/* ARC Headers */ -#include - -/* STRUCTURES ****************************************************************/ - -typedef struct _OSL_BSD_ITEM_TABLE_ENTRY -{ - ULONG Offset; - ULONG Size; -} OSL_BSD_ITEM_TABLE_ENTRY; - -/* FUNCTIONS *****************************************************************/ - -VOID -NTAPI -OslDrawLogo ( - VOID -); - -#endif diff --git a/boot/environ/app/rosload/roslogo.c b/boot/environ/app/rosload/roslogo.c deleted file mode 100644 index a5a2c01b583..00000000000 --- a/boot/environ/app/rosload/roslogo.c +++ /dev/null @@ -1,9828 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI OS Loader - * FILE: boot/environ/app/rosload/roslogo.c - * PURPOSE: OS Loader Logo Drawing - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "rosload.h" - -/* DATA VARIABLES ************************************************************/ - -extern PBL_GRAPHICS_CONSOLE DspGraphicalConsole; -extern EFI_BOOT_SERVICES* EfiBS; -extern EFI_SYSTEM_TABLE* EfiST; -UCHAR g_Logo[] = -{ - 0x42, 0x4D, 0x82, 0x5D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, - 0x00, 0x00, 0xD7, 0x00, 0x00, 0x00, 0xEF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0x5C, 0x02, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x42, 0x47, 0x52, 0x73, 0x80, 0xC2, 0xF5, 0x28, 0x60, 0xB8, - 0x1E, 0x15, 0x20, 0x85, 0xEB, 0x01, 0x40, 0x33, 0x33, 0x13, 0x80, 0x66, 0x66, 0x26, 0x40, 0x66, - 0x66, 0x06, 0xA0, 0x99, 0x99, 0x09, 0x3C, 0x0A, 0xD7, 0x03, 0x24, 0x5C, 0x8F, 0x32, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x87, 0x74, 0x59, 0xC4, 0xB7, 0xA2, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x23, 0x21, - 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x87, 0x74, 0x59, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x87, 0x74, 0x59, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xA9, 0xA4, 0x9A, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, - 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x87, - 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, - 0x21, 0x1D, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, - 0x1D, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2F, 0x2F, 0x2E, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x4F, 0x3B, 0x20, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x97, - 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, - 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, - 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, - 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, - 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xA9, 0xA4, 0x9A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, - 0x20, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, - 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, - 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x21, 0x1D, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, - 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, - 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, - 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, - 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x23, 0x21, 0x1D, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x21, 0x1D, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, - 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x87, 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, - 0x9A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, - 0x21, 0x1D, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, - 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, - 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0x97, 0x8A, 0x75, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, - 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, - 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCC, 0xC9, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, - 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x21, 0x1D, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x21, 0x1D, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x23, - 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x8A, 0x75, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xA9, - 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x4F, 0x3B, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x23, 0x21, 0x1D, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x4F, 0x3B, 0x20, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x4F, 0x3B, 0x20, 0x87, 0x74, - 0x59, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x66, 0x50, 0x31, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4F, 0x3B, 0x20, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0x74, 0x59, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x87, 0x74, 0x59, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x87, 0x74, 0x59, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x87, 0x74, - 0x59, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, - 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x2F, 0x2F, 0x2E, 0x66, 0x50, 0x31, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, - 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE2, - 0xDB, 0xCC, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, - 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xCD, 0xCC, 0xC9, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x4F, 0x3B, 0x20, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, - 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, - 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, - 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE2, 0xDB, - 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, - 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE2, - 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x66, 0x50, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, - 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x4F, 0x3B, - 0x20, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xD5, 0xC9, 0xB1, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xD5, - 0xC9, 0xB1, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE2, - 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, - 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x4F, 0x3B, 0x20, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x87, 0x74, 0x59, 0x00, - 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, - 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xD5, 0xC9, - 0xB1, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x4F, - 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x4F, 0x3B, 0x20, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xD5, 0xC9, 0xB1, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, - 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, - 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE2, - 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, - 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, - 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, - 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, - 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, - 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, - 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x87, 0x74, 0x59, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, - 0xCC, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, - 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0xA9, 0xA4, 0x9A, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, - 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x87, 0x74, - 0x59, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, - 0xF4, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x66, 0x50, 0x31, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, - 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xD5, - 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, - 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x87, 0x74, 0x59, 0x63, - 0x5F, 0x5A, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, - 0xF4, 0xF6, 0xF5, 0xF4, 0xD5, 0xC9, 0xB1, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, - 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x23, 0x21, - 0x1D, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x66, 0x50, 0x31, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, - 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, - 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, - 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, - 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0xE2, - 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, - 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x4F, 0x3B, 0x20, 0x63, 0x5F, 0x5A, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, - 0x5A, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, - 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x66, 0x50, 0x31, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, - 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, - 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, - 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xC4, 0xB7, - 0xA2, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, - 0xC9, 0xB1, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, - 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, - 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x87, 0x74, 0x59, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, - 0xC4, 0xB7, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, - 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, - 0x9A, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0x66, 0x50, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, - 0x1D, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, - 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0x87, 0x74, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0x97, 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, - 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x63, 0x5F, 0x5A, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, - 0xDA, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, - 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xD5, 0xC9, 0xB1, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x87, 0x74, 0x59, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, - 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xA9, 0xA4, 0x9A, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4F, 0x3B, 0x20, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0x97, - 0x8A, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, - 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, - 0xCC, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, - 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, - 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x2F, - 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, - 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, - 0xE2, 0xDB, 0xCC, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, - 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x2F, 0x2F, 0x2E, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xA9, 0xA4, 0x9A, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, - 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, - 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xE2, 0xDB, 0xCC, - 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, - 0x5A, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xC4, 0xB7, 0xA2, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xE2, - 0xDB, 0xCC, 0xC4, 0xB7, 0xA2, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x3B, 0x20, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x66, 0x50, 0x31, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x23, 0x21, 0x1D, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xD5, 0xC9, 0xB1, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, - 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, - 0x4F, 0x3B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x21, - 0x1D, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, - 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, - 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, - 0xA4, 0x9A, 0x66, 0x50, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, - 0xA2, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, - 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, - 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, - 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, - 0x20, 0x66, 0x50, 0x31, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, - 0x87, 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x2F, 0x2F, 0x2E, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, - 0x74, 0x59, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x87, 0x74, - 0x59, 0x66, 0x50, 0x31, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x4F, 0x3B, 0x20, 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x87, 0x74, 0x59, 0x66, 0x50, 0x31, 0x87, 0x74, - 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x87, 0x74, 0x59, 0x63, 0x5F, 0x5A, 0x4F, 0x3B, 0x20, - 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, - 0xC9, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x4F, 0x3B, 0x20, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, - 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, - 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, 0x66, 0x50, 0x31, - 0x4F, 0x3B, 0x20, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0xC4, - 0xB7, 0xA2, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, - 0xE3, 0xDA, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, - 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, - 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, - 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, - 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xCD, 0xCC, - 0xC9, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0xA9, 0xA4, 0x9A, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, - 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xCD, 0xCC, - 0xC9, 0xE2, 0xDB, 0xCC, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0x63, 0x5F, - 0x5A, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE2, 0xDB, 0xCC, 0xF6, - 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, - 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xF6, 0xF5, 0xF4, 0xE2, 0xDB, 0xCC, - 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, - 0x2E, 0x97, 0x8A, 0x75, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, 0xE3, 0xDA, - 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xF6, 0xF5, 0xF4, 0xE8, - 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xE2, 0xDB, 0xCC, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xE8, 0xE3, 0xDA, 0xE8, 0xE3, 0xDA, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x23, 0x21, 0x1D, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, - 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, - 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, - 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, - 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, - 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x87, 0x74, 0x59, 0xA9, 0xA4, 0x9A, 0xA9, - 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, - 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, - 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, - 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, - 0x2E, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, - 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, - 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, - 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x23, - 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, - 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xC4, - 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xC4, 0xB7, 0xA2, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, - 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, - 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xCD, 0xCC, 0xC9, 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, - 0xC4, 0xB7, 0xA2, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xCD, 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xCD, - 0xCC, 0xC9, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0xA9, 0xA4, 0x9A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, - 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, - 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, - 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x63, 0x5F, 0x5A, 0x63, - 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, - 0x75, 0x63, 0x5F, 0x5A, 0x97, 0x8A, 0x75, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, 0x63, 0x5F, 0x5A, - 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x23, 0x21, - 0x1D, 0x2F, 0x2F, 0x2E, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x23, 0x21, 0x1D, 0x2F, 0x2F, 0x2E, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x23, 0x21, 0x1D, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, - 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, - 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, - 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, - 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, - 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x20, 0x1E, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, - -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -ConvertBmpToGopBlt ( - IN VOID *BmpImage, - IN UINTN BmpImageSize, - IN OUT VOID **GopBlt, - IN OUT UINTN *GopBltSize, - OUT UINTN *PixelHeight, - OUT UINTN *PixelWidth - ) -{ - UINT8 *Image; - UINT8 *ImageHeader; - PBITMAP BmpHeader; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt; - UINT64 BltBufferSize; - UINTN Height; - UINTN Width; - UINTN ImageIndex; - - BmpHeader = (BITMAP *)BmpImage; - - Image = BmpImage; - Image = ((UINT8 *)BmpImage) + BmpHeader->BmpHeader.Offset; - ImageHeader = Image; - - BltBufferSize = BmpHeader->DibHeader.Width * BmpHeader->DibHeader.Height; - BltBufferSize = BltBufferSize * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL); - - *GopBltSize = (UINTN) BltBufferSize; - *GopBlt = BlMmAllocateHeap (*GopBltSize); - *PixelWidth = BmpHeader->DibHeader.Width; - *PixelHeight = BmpHeader->DibHeader.Height; - - BltBuffer = *GopBlt; - - for (Height = 0; Height < BmpHeader->DibHeader.Height; Height++) - { - Blt = &BltBuffer[(BmpHeader->DibHeader.Height - Height - 1) * BmpHeader->DibHeader.Width]; - for (Width = 0; Width < BmpHeader->DibHeader.Width; Width++, Image++, Blt++) - { - Blt->Blue = *Image++; - Blt->Green = *Image++; - Blt->Red = *Image; - } - - ImageIndex = (UINTN) (Image - ImageHeader); - if ((ImageIndex % 4) != 0) Image = Image + (4 - (ImageIndex % 4)); - } -} - -VOID -NTAPI -OslDrawLogo ( - VOID - ) -{ - EFI_GRAPHICS_OUTPUT_BLT_PIXEL* GopBlt; - UINTN GopBltSize, BmpHeight, BmpWidth, CoordinateY, CoordinateX; - PHYSICAL_ADDRESS GopBltPhys; - EFI_GRAPHICS_OUTPUT_PROTOCOL* GraphicsOutput; - EFI_STATUS EfiStatus; - - /* Convert ReactOS Logo */ - ConvertBmpToGopBlt(g_Logo, - sizeof(g_Logo), - (PVOID*)&GopBlt, - &GopBltSize, - &BmpHeight, - &BmpWidth); - - CoordinateX = (DspGraphicalConsole->DisplayMode.HRes / 2) - (BmpWidth / 2); - CoordinateY = (DspGraphicalConsole->DisplayMode.VRes / 2) - (BmpHeight / 2); - BlMmTranslateVirtualAddress(GopBlt, &GopBltPhys); - GopBlt = PhysicalAddressToPtr(GopBltPhys); - - /* Make the screen black */ - RtlFillMemory(DspGraphicalConsole->FrameBuffer, - DspGraphicalConsole->FrameBufferSize, - 0x00); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - - /* Get the UEFI GOP Protocol */ - EfiStatus = EfiBS->HandleProtocol(EfiST->ConsoleOutHandle, - &EfiGraphicsOutputProtocol, - (PVOID*)&GraphicsOutput); - if (EfiStatus== EFI_SUCCESS) - { - /* Draw the logo */ - GraphicsOutput->Blt(GraphicsOutput, - GopBlt, - EfiBltBufferToVideo, - 0, - 0, - CoordinateX, - CoordinateY, - BmpWidth, - BmpHeight, - BmpWidth * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); - } - - /* Go back to protected mode */ - BlpArchSwitchContext(BlProtectedMode); - - /* Display text below the logo */ - EfiPrintf(L"\n\n\n\n\nReactOS UEFI OS Loader Initializing... %lx\r\n", - EfiStatus); - EfiStall(1000000); - - /* Clear the screen and return */ - BlDisplayClearScreen(); -} - diff --git a/boot/environ/include/bcd.h b/boot/environ/include/bcd.h deleted file mode 100644 index b86389f3968..00000000000 --- a/boot/environ/include/bcd.h +++ /dev/null @@ -1,358 +0,0 @@ -/* -* COPYRIGHT: See COPYING.ARM in the top level directory -* PROJECT: ReactOS Boot Configuration Data -* FILE: boot/environ/include/bcd.h -* PURPOSE: BCD Main Header -* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -#ifndef _BCD_H -#define _BCD_H - -/* ENUMERATIONS **************************************************************/ - -/* See https://learn.microsoft.com/en-us/previous-versions/windows/desktop/bcd/bcdelementtype */ - -#define BCD_CLASS_LIBRARY 0x01 -#define BCD_CLASS_APPLICATION 0x02 -#define BCD_CLASS_DEVICE 0x03 -#define BCD_CLASS_OEM 0x05 - -#define BCD_TYPE_DEVICE 0x01 -#define BCD_TYPE_STRING 0x02 -#define BCD_TYPE_OBJECT 0x03 -#define BCD_TYPE_OBJECT_LIST 0x04 -#define BCD_TYPE_INTEGER 0x05 -#define BCD_TYPE_BOOLEAN 0x06 -#define BCD_TYPE_INTEGER_LIST 0x07 - -#define BCD_IMAGE_TYPE_FIRMWARE 0x01 -#define BCD_IMAGE_TYPE_BOOT_APP 0x02 -#define BCD_IMAGE_TYPE_NTLDR 0x03 -#define BCD_IMAGE_TYPE_REAL_MODE 0x04 - -#define BCD_APPLICATION_TYPE_FWBOOTMGR 0x01 -#define BCD_APPLICATION_TYPE_BOOTMGR 0x02 -#define BCD_APPLICATION_TYPE_OSLOADER 0x03 -#define BCD_APPLICATION_TYPE_RESUME 0x04 -#define BCD_APPLICATION_TYPE_MEMDIAG 0x05 -#define BCD_APPLICATION_TYPE_NTLDR 0x06 -#define BCD_APPLICATION_TYPE_SETUPLDR 0x07 -#define BCD_APPLICATION_TYPE_BOOTSECTOR 0x08 -#define BCD_APPLICATION_TYPE_STARTUPCOM 0x09 - -#define BCD_OBJECT_TYPE_APPLICATION 0x01 -#define BCD_OBJECT_TYPE_INHERIT 0x02 -#define BCD_OBJECT_TYPE_DEVICE 0x03 - -typedef enum BcdLibraryElementTypes -{ - BcdLibraryDevice_ApplicationDevice = 0x11000001, - BcdLibraryString_ApplicationPath = 0x12000002, - BcdLibraryString_Description = 0x12000004, - BcdLibraryString_PreferredLocale = 0x12000005, - BcdLibraryObjectList_InheritedObjects = 0x14000006, - BcdLibraryInteger_TruncatePhysicalMemory = 0x15000007, - BcdLibraryObjectList_RecoverySequence = 0x14000008, - BcdLibraryBoolean_AutoRecoveryEnabled = 0x16000009, - BcdLibraryIntegerList_BadMemoryList = 0x1700000a, - BcdLibraryBoolean_AllowBadMemoryAccess = 0x1600000b, - BcdLibraryInteger_FirstMegabytePolicy = 0x1500000c, - BcdLibraryInteger_RelocatePhysicalMemory = 0x1500000D, - BcdLibraryInteger_AvoidLowPhysicalMemory = 0x1500000E, - BcdLibraryBoolean_DebuggerEnabled = 0x16000010, - BcdLibraryInteger_DebuggerType = 0x15000011, - BcdLibraryInteger_SerialDebuggerPortAddress = 0x15000012, - BcdLibraryInteger_SerialDebuggerPort = 0x15000013, - BcdLibraryInteger_SerialDebuggerBaudRate = 0x15000014, - BcdLibraryInteger_1394DebuggerChannel = 0x15000015, - BcdLibraryString_UsbDebuggerTargetName = 0x12000016, - BcdLibraryBoolean_DebuggerIgnoreUsermodeExceptions = 0x16000017, - BcdLibraryInteger_DebuggerStartPolicy = 0x15000018, - BcdLibraryString_DebuggerBusParameters = 0x12000019, - BcdLibraryInteger_DebuggerNetHostIP = 0x1500001A, - BcdLibraryInteger_DebuggerNetPort = 0x1500001B, - BcdLibraryBoolean_DebuggerNetDhcp = 0x1600001C, - BcdLibraryString_DebuggerNetKey = 0x1200001D, - BcdLibraryBoolean_EmsEnabled = 0x16000020, - BcdLibraryInteger_EmsPort = 0x15000022, - BcdLibraryInteger_EmsBaudRate = 0x15000023, - BcdLibraryString_LoadOptionsString = 0x12000030, - BcdLibraryBoolean_DisplayAdvancedOptions = 0x16000040, - BcdLibraryBoolean_DisplayOptionsEdit = 0x16000041, - BcdLibraryDevice_BsdLogDevice = 0x11000043, - BcdLibraryString_BsdLogPath = 0x12000044, - BcdLibraryBoolean_PreserveBsdLog = 0x16000045, /* Undocumented */ - BcdLibraryBoolean_GraphicsModeDisabled = 0x16000046, - BcdLibraryInteger_ConfigAccessPolicy = 0x15000047, - BcdLibraryBoolean_DisableIntegrityChecks = 0x16000048, - BcdLibraryBoolean_AllowPrereleaseSignatures = 0x16000049, - BcdLibraryString_FontPath = 0x1200004A, - BcdLibraryInteger_SiPolicy = 0x1500004B, - BcdLibraryInteger_FveBandId = 0x1500004C, - BcdLibraryBoolean_ConsoleExtendedInput = 0x16000050, - BcdLibraryInteger_GraphicsResolution = 0x15000052, - BcdLibraryInteger_DisplayMessage = 0x15000065, /* Undocumented */ - BcdLibraryInteger_DisplayMessageOverride = 0x15000066, /* Undocumented */ - BcdLibraryInteger_UndocumentedMagic = 0x15000075, /* Undocumented magic */ - BcdLibraryBoolean_RestartOnFailure = 0x16000053, - BcdLibraryBoolean_GraphicsForceHighestMode = 0x16000054, - BcdLibraryBoolean_IsolatedExecutionContext = 0x16000060, - BcdLibraryBoolean_BootUxDisable = 0x1600006C, - BcdLibraryBoolean_BootShutdownDisabled = 0x16000074, - BcdLibraryIntegerList_AllowedInMemorySettings = 0x17000077, - BcdLibraryBoolean_ForceFipsCrypto = 0x16000079, - BcdLibraryBoolean_MobileGraphics = 0x1600007A /* Undocumented */ -} BcdLibraryElementTypes; - -typedef enum BcdOSLoaderElementTypes -{ - BcdOSLoaderDevice_OSDevice = 0x21000001, - BcdOSLoaderString_SystemRoot = 0x22000002, - BcdOSLoaderObject_AssociatedResumeObject = 0x23000003, - BcdOSLoaderBoolean_DetectKernelAndHal = 0x26000010, - BcdOSLoaderString_KernelPath = 0x22000011, - BcdOSLoaderString_HalPath = 0x22000012, - BcdOSLoaderString_DbgTransportPath = 0x22000013, - BcdOSLoaderInteger_NxPolicy = 0x25000020, - BcdOSLoaderInteger_PAEPolicy = 0x25000021, - BcdOSLoaderBoolean_WinPEMode = 0x26000022, - BcdOSLoaderBoolean_DisableCrashAutoReboot = 0x26000024, - BcdOSLoaderBoolean_UseLastGoodSettings = 0x26000025, - BcdOSLoaderBoolean_AllowPrereleaseSignatures = 0x26000027, - BcdOSLoaderBoolean_NoLowMemory = 0x26000030, - BcdOSLoaderInteger_RemoveMemory = 0x25000031, - BcdOSLoaderInteger_IncreaseUserVa = 0x25000032, - BcdOSLoaderBoolean_UseVgaDriver = 0x26000040, - BcdOSLoaderBoolean_DisableBootDisplay = 0x26000041, - BcdOSLoaderBoolean_DisableVesaBios = 0x26000042, - BcdOSLoaderBoolean_DisableVgaMode = 0x26000043, - BcdOSLoaderInteger_ClusterModeAddressing = 0x25000050, - BcdOSLoaderBoolean_UsePhysicalDestination = 0x26000051, - BcdOSLoaderInteger_RestrictApicCluster = 0x25000052, - BcdOSLoaderBoolean_UseLegacyApicMode = 0x26000054, - BcdOSLoaderInteger_X2ApicPolicy = 0x25000055, - BcdOSLoaderBoolean_UseBootProcessorOnly = 0x26000060, - BcdOSLoaderInteger_NumberOfProcessors = 0x25000061, - BcdOSLoaderBoolean_ForceMaximumProcessors = 0x26000062, - BcdOSLoaderBoolean_ProcessorConfigurationFlags = 0x25000063, - BcdOSLoaderBoolean_MaximizeGroupsCreated = 0x26000064, - BcdOSLoaderBoolean_ForceGroupAwareness = 0x26000065, - BcdOSLoaderInteger_GroupSize = 0x25000066, - BcdOSLoaderInteger_UseFirmwarePciSettings = 0x26000070, - BcdOSLoaderInteger_MsiPolicy = 0x25000071, - BcdOSLoaderInteger_SafeBoot = 0x25000080, - BcdOSLoaderBoolean_SafeBootAlternateShell = 0x26000081, - BcdOSLoaderBoolean_BootLogInitialization = 0x26000090, - BcdOSLoaderBoolean_VerboseObjectLoadMode = 0x26000091, - BcdOSLoaderBoolean_KernelDebuggerEnabled = 0x260000a0, - BcdOSLoaderBoolean_DebuggerHalBreakpoint = 0x260000a1, - BcdOSLoaderBoolean_UsePlatformClock = 0x260000A2, - BcdOSLoaderBoolean_ForceLegacyPlatform = 0x260000A3, - BcdOSLoaderInteger_TscSyncPolicy = 0x250000A6, - BcdOSLoaderBoolean_EmsEnabled = 0x260000B0, - BcdOSLoaderInteger_ForceFailure = 0x250000C0, - BcdOSLoaderInteger_DriverLoadFailurePolicy = 0x250000C1, - BcdOSLoaderInteger_BootMenuPolicy = 0x250000C2, - BcdOSLoaderBoolean_AdvancedOptionsOneTime = 0x260000C3, - BcdOSLoaderBoolean_OptionsEditOneTime = 0x260000C4, /* Undocumented */ - BcdOSLoaderInteger_BootStatusPolicy = 0x250000E0, - BcdOSLoaderBoolean_DisableElamDrivers = 0x260000E1, - BcdOSLoaderInteger_HypervisorLaunchType = 0x250000F0, - BcdOSLoaderBoolean_HypervisorDebuggerEnabled = 0x260000F2, - BcdOSLoaderInteger_HypervisorDebuggerType = 0x250000F3, - BcdOSLoaderInteger_HypervisorDebuggerPortNumber = 0x250000F4, - BcdOSLoaderInteger_HypervisorDebuggerBaudrate = 0x250000F5, - BcdOSLoaderInteger_HypervisorDebugger1394Channel = 0x250000F6, - BcdOSLoaderInteger_BootUxPolicy = 0x250000F7, - BcdOSLoaderString_HypervisorDebuggerBusParams = 0x220000F9, - BcdOSLoaderInteger_HypervisorNumProc = 0x250000FA, - BcdOSLoaderInteger_HypervisorRootProcPerNode = 0x250000FB, - BcdOSLoaderBoolean_HypervisorUseLargeVTlb = 0x260000FC, - BcdOSLoaderInteger_HypervisorDebuggerNetHostIp = 0x250000FD, - BcdOSLoaderInteger_HypervisorDebuggerNetHostPort = 0x250000FE, - BcdOSLoaderInteger_TpmBootEntropyPolicy = 0x25000100, - BcdOSLoaderString_HypervisorDebuggerNetKey = 0x22000110, - BcdOSLoaderBoolean_HypervisorDebuggerNetDhcp = 0x26000114, - BcdOSLoaderInteger_HypervisorIommuPolicy = 0x25000115, - BcdOSLoaderInteger_XSaveDisable = 0x2500012b -} BcdOSLoaderElementTypes; - -typedef enum BcdBootMgrElementTypes -{ - BcdBootMgrObjectList_DisplayOrder = 0x24000001, - BcdBootMgrObjectList_BootSequence = 0x24000002, - BcdBootMgrObject_DefaultObject = 0x23000003, - BcdBootMgrInteger_Timeout = 0x25000004, - BcdBootMgrBoolean_AttemptResume = 0x26000005, - BcdBootMgrObject_ResumeObject = 0x23000006, - BcdBootMgrObjectList_ToolsDisplayOrder = 0x24000010, - BcdBootMgrBoolean_DisplayBootMenu = 0x26000020, - BcdBootMgrBoolean_NoErrorDisplay = 0x26000021, - BcdBootMgrDevice_BcdDevice = 0x21000022, - BcdBootMgrString_BcdFilePath = 0x22000023, - BcdBootMgrBoolean_ProcessCustomActionsFirst = 0x26000028, - BcdBootMgrIntegerList_CustomActionsList = 0x27000030, - BcdBootMgrBoolean_PersistBootSequence = 0x26000031 -} BcdBootMgrElementTypes; - -typedef enum _BcdResumeElementTypes -{ - Reserved1 = 0x21000001, - Reserved2 = 0x22000002, - BcdResumeBoolean_UseCustomSettings = 0x26000003, - BcdResumeDevice_AssociatedOsDevice = 0x21000005, - BcdResumeBoolean_DebugOptionEnabled = 0x26000006, - BcdResumeInteger_BootMenuPolicy = 0x25000008 -} BcdResumeElementTypes; - -typedef enum _BCDE_OSLOADER_TYPE_BOOT_STATUS_POLICY -{ - DisplayAllFailures, - IgnoreAllFailures, - IgnoreShutdownFailures, - IgnoreBootFailures, - IgnoreCheckpointFailures, - DisplayShutdownFailures, - DisplayBootFailures, - DisplayCheckpointFailures -} BCDE_OSLOADER_TYPE_BOOT_STATUS_POLICY; - -/* Undocumented */ -typedef enum BcdStartupElementTypes -{ - BcdStartupBoolean_PxeSoftReboot = 0x26000001, - BcdStartupString_PxeApplicationName = 0x22000002, -} BcdStartupElementTypes; - -/* DATA STRUCTURES ***********************************************************/ - -typedef struct -{ - union - { - ULONG PackedValue; - struct - { - ULONG SubType : 24; - ULONG Format : 4; - ULONG Class : 4; - }; - }; -} BcdElementType; - -typedef struct -{ - union - { - ULONG PackedValue; - union - { - struct - { - ULONG ApplicationCode : 20; - ULONG ImageCode : 4; - ULONG Reserved : 4; - ULONG ObjectCode : 4; - } Application; - struct - { - ULONG Value : 20; - ULONG ClassCode : 4; - ULONG Reserved : 4; - ULONG ObjectCode : 4; - } Inherit; - struct - { - ULONG Reserved:28; - ULONG ObjectCode : 4; - } Device; - }; - }; -} BcdObjectType; - -typedef struct _BCD_ELEMENT_HEADER -{ - ULONG Version; - ULONG Type; - ULONG Size; -} BCD_ELEMENT_HEADER, *PBCD_ELEMENT_HEADER; - -typedef struct _BCD_PACKED_ELEMENT -{ - struct _BCD_PACKED_ELEMENT* NextEntry; - BcdElementType RootType; - BCD_ELEMENT_HEADER; - UCHAR Data[ANYSIZE_ARRAY]; -} BCD_PACKED_ELEMENT, *PBCD_PACKED_ELEMENT; - -typedef struct _BCD_ELEMENT -{ - PBCD_ELEMENT_HEADER Header; - PUCHAR Body; -} BCD_ELEMENT, *PBCD_ELEMENT; - -typedef struct _BCD_DEVICE_OPTION -{ - GUID AssociatedEntry; - BL_DEVICE_DESCRIPTOR DeviceDescriptor; -} BCD_DEVICE_OPTION, *PBCD_DEVICE_OPTION; - -typedef struct _BCD_OBJECT_DESCRIPTION -{ - ULONG Valid; - ULONG Type; -} BCD_OBJECT_DESCRIPTION, *PBCD_OBJECT_DESCRIPTION; - -/* FUNCTIONS ******************************************************************/ - -NTSTATUS -BcdOpenStoreFromFile ( - _In_ PUNICODE_STRING FileName, - _In_ PHANDLE StoreHandle - ); - -#define BCD_ENUMERATE_FLAG_DEEP 0x04 -#define BCD_ENUMERATE_FLAG_DEVICES 0x08 -#define BCD_ENUMERATE_FLAG_IN_ORDER 0x10 - -NTSTATUS -BiEnumerateElements ( - _In_ HANDLE BcdHandle, - _In_ HANDLE ObjectHandle, - _In_ ULONG RootElementType, - _In_ ULONG Flags, - _Out_opt_ PBCD_PACKED_ELEMENT Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCountNe - ); - -NTSTATUS -BcdOpenObject ( - _In_ HANDLE BcdHandle, - _In_ PGUID ObjectId, - _Out_ PHANDLE ObjectHandle - ); - -NTSTATUS -BcdDeleteElement ( - _In_ HANDLE ObjectHandle, - _In_ ULONG Type - ); - -NTSTATUS -BcdEnumerateAndUnpackElements ( - _In_ HANDLE BcdHandle, - _In_ HANDLE ObjectHandle, - _Out_opt_ PBCD_ELEMENT Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCount - ); - -NTSTATUS -BiGetObjectDescription ( - _In_ HANDLE ObjectHandle, - _Out_ PBCD_OBJECT_DESCRIPTION Description - ); - -#endif diff --git a/boot/environ/include/bl.h b/boot/environ/include/bl.h deleted file mode 100644 index e5a338a8b11..00000000000 --- a/boot/environ/include/bl.h +++ /dev/null @@ -1,2862 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/include/bl.h - * PURPOSE: Main Boot Library Header - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -#ifndef _BL_H -#define _BL_H - -/* INCLUDES ******************************************************************/ - -/* C Headers */ -#include -#include -#include - -/* NT Base Headers */ -#include - -/* NDK Headers */ -#include - -/* NT SafeInt Header */ -#include - -/* PE Headers */ -#include - -/* ACPI Headers */ -#include - -/* UEFI Headers */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* Registry Headers */ -#include - -/* DEFINES *******************************************************************/ - -DEFINE_GUID(BadMemoryGuid, 0x54B8275B, 0xD431, 0x473F, 0xAC, 0xFB, 0xE5, 0x36, 0xA0, 0x84, 0x94, 0xA3); - -#define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01 - -#define BL_APP_ENTRY_SIGNATURE "BTAPENT" - -#define BOOT_APPLICATION_SIGNATURE_1 'TOOB' -#define BOOT_APPLICATION_SIGNATURE_2 ' PPA' - -#define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0 -#define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1 - -#define BOOT_APPLICATION_VERSION 2 -#define BL_MEMORY_DATA_VERSION 1 -#define BL_RETURN_ARGUMENTS_VERSION 1 -#define BL_FIRMWARE_DESCRIPTOR_VERSION 2 - -#define BL_RETURN_ARGUMENTS_NO_PAE_FLAG 0x40 - -#define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01 -#define BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL 0x02 -#define BL_APPLICATION_ENTRY_WINLOAD 0x04 -#define BL_APPLICATION_ENTRY_STARTUP 0x08 -#define BL_APPLICATION_ENTRY_REBOOT_ON_ERROR 0x20 -#define BL_APPLICATION_ENTRY_NTLDR 0x40 -#define BL_APPLICATION_ENTRY_BCD_OPTIONS_EXTERNAL 0x80 -#define BL_APPLICATION_ENTRY_WINRESUME 0x100 -#define BL_APPLICATION_ENTRY_SETUPLDR 0x200 -#define BL_APPLICATION_ENTRY_BOOTSECTOR 0x400 -#define BL_APPLICATION_ENTRY_BOOTMGR 0x1000 -#define BL_APPLICATION_ENTRY_DISPLAY_ORDER 0x800000 -#define BL_APPLICATION_ENTRY_FIXED_SEQUENCE 0x20000000 -#define BL_APPLICATION_ENTRY_RECOVERY 0x40000000 - -#define BL_CONTEXT_PAGING_ON 1 -#define BL_CONTEXT_INTERRUPTS_ON 2 - -#define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01 -#define BL_MM_FLAG_REQUEST_COALESCING 0x02 - -#define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG 0x01 -#define BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG 0x02 -#define BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG 0x10 -#define BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG 0x20 -#define BL_MM_ADD_DESCRIPTOR_ALLOCATE_FLAG 0x1000 -#define BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG 0x2000 - -#define BL_MM_INCLUDE_MAPPED_ALLOCATED 0x01 -#define BL_MM_INCLUDE_MAPPED_UNALLOCATED 0x02 -#define BL_MM_INCLUDE_UNMAPPED_ALLOCATED 0x04 -#define BL_MM_INCLUDE_UNMAPPED_UNALLOCATED 0x08 -#define BL_MM_INCLUDE_RESERVED_ALLOCATED 0x10 -#define BL_MM_INCLUDE_BAD_MEMORY 0x20 -#define BL_MM_INCLUDE_FIRMWARE_MEMORY 0x40 -#define BL_MM_INCLUDE_TRUNCATED_MEMORY 0x80 -#define BL_MM_INCLUDE_PERSISTENT_MEMORY 0x100 -#define BL_MM_INCLUDE_FIRMWARE_MEMORY_2 0x200 - -#define BL_MM_INCLUDE_NO_FIRMWARE_MEMORY (BL_MM_INCLUDE_PERSISTENT_MEMORY | \ - BL_MM_INCLUDE_TRUNCATED_MEMORY | \ - BL_MM_INCLUDE_BAD_MEMORY | \ - BL_MM_INCLUDE_RESERVED_ALLOCATED | \ - BL_MM_INCLUDE_UNMAPPED_UNALLOCATED | \ - BL_MM_INCLUDE_UNMAPPED_ALLOCATED | \ - BL_MM_INCLUDE_MAPPED_UNALLOCATED | \ - BL_MM_INCLUDE_MAPPED_ALLOCATED) -C_ASSERT(BL_MM_INCLUDE_NO_FIRMWARE_MEMORY == 0x1BF); - -#define BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY (BL_MM_INCLUDE_FIRMWARE_MEMORY_2 | \ - BL_MM_INCLUDE_FIRMWARE_MEMORY) -C_ASSERT(BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY == 0x240); - -#define BL_MM_REQUEST_DEFAULT_TYPE 1 -#define BL_MM_REQUEST_TOP_DOWN_TYPE 2 - -#define BL_MM_REMOVE_PHYSICAL_REGION_FLAG 0x40000000 -#define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000 - -#define BL_LIBRARY_FLAG_NO_DISPLAY 0x01 -#define BL_LIBRARY_FLAG_REINITIALIZE 0x02 -#define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04 -#define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE 0x10 -#define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20 -#define BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE 0x800 - -#define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG 0x01 -#define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG 0x02 - -#define BL_HT_VALUE_IS_INLINE 0x01 - -#define BL_FS_REGISTER_AT_HEAD_FLAG 1 - -#define BL_BLOCK_DEVICE_REMOVABLE_FLAG 0x01 -#define BL_BLOCK_DEVICE_PRESENT_FLAG 0x02 -#define BL_BLOCK_DEVICE_VIRTUAL_FLAG 0x04 - -#define BL_MEMORY_CLASS_SHIFT 28 - -#define BL_FILE_READ_ACCESS 0x01 -#define BL_FILE_WRITE_ACCESS 0x02 -#define BL_DIRECTORY_ACCESS 0x04 -#define BL_UNKNOWN_ACCESS 0x10 - -#define BL_DEVICE_READ_ACCESS 0x01 -#define BL_DEVICE_WRITE_ACCESS 0x02 - -#define BL_DEVICE_ENTRY_OPENED 0x01 -#define BL_DEVICE_ENTRY_READ_ACCESS 0x02 -#define BL_DEVICE_ENTRY_WRITE_ACCESS 0x04 - -#define BL_FILE_ENTRY_OPENED 0x01 -#define BL_FILE_ENTRY_READ_ACCESS 0x02 -#define BL_FILE_ENTRY_WRITE_ACCESS 0x04 -#define BL_FILE_ENTRY_UNKNOWN_ACCESS 0x10 -#define BL_FILE_ENTRY_DIRECTORY 0x10000 - -#define BL_ETFS_FILE_ENTRY_DIRECTORY 0x01 - -#define BL_IMG_VALID_FILE 0x01 -#define BL_IMG_MEMORY_FILE 0x02 -#define BL_IMG_REMOTE_FILE 0x04 - -#define BL_LOAD_IMG_VIRTUAL_BUFFER 0x01 -#define BL_LOAD_IMG_EXISTING_BUFFER 0x04 -#define BL_LOAD_IMG_UNKNOWN_BUFFER_FLAG 0x08 -#define BL_LOAD_IMG_COMPUTE_SIGNATURE 0x10 -#define BL_LOAD_IMG_COMPUTE_HASH 0x40000 - -#define BL_LOAD_PE_IMG_VIRTUAL_BUFFER BL_LOAD_IMG_VIRTUAL_BUFFER -#define BL_LOAD_PE_IMG_CHECK_MACHINE 0x02 -#define BL_LOAD_PE_IMG_EXISTING_BUFFER BL_LOAD_IMG_EXISTING_BUFFER -#define BL_LOAD_PE_IMG_COMPUTE_HASH 0x10 -#define BL_LOAD_PE_IMG_CHECK_SUBSYSTEM 0x80 -#define BL_LOAD_PE_IMG_SKIP_RELOCATIONS 0x100 -#define BL_LOAD_PE_IMG_CHECK_FORCED_INTEGRITY 0x200 -#define BL_LOAD_PE_IMG_IGNORE_CHECKSUM_MISMATCH 0x10000 -#define BL_LOAD_PE_IMG_VALIDATE_ORIGINAL_FILENAME 0x400000 - -#define BL_UTL_CHECKSUM_COMPLEMENT 0x10000 -#define BL_UTL_CHECKSUM_ROTATE 0x20000 -#define BL_UTL_CHECKSUM_NEGATE 0x40000 -#define BL_UTL_CHECKSUM_UCHAR_BUFFER 0x01 -#define BL_UTL_CHECKSUM_USHORT_BUFFER 0x02 - -/* ENUMERATIONS **************************************************************/ - -typedef enum _BL_COLOR -{ - Black, - Blue, - Green, - Cyan, - Red, - Magenta, - Brown, - LtGray, - Gray, - LtBlue, - LtGreen, - LtCyan, - LtRed, - LtMagenta, - Yellow, - White -} BL_COLOR, *PBL_COLOR; - -typedef enum _BL_MENU_POLICY -{ - MenuPolicyLegacy = 0, - MenuPolicyStandard = 1 -} BL_MENU_POLICY; - -typedef enum _BL_MEMORY_DESCRIPTOR_TYPE -{ - BlMdPhysical, - BlMdVirtual, - BlMdTracker -} BL_MEMORY_DESCRIPTOR_TYPE; - -typedef enum _BL_TRANSLATION_TYPE -{ - BlNone, - BlVirtual, - BlPae, - BlMax -} BL_TRANSLATION_TYPE; - -typedef enum _BL_ARCH_MODE -{ - BlProtectedMode, - BlRealMode -} BL_ARCH_MODE; - -// -// Boot Device Types -// -typedef enum _BL_DEVICE_TYPE -{ - DiskDevice = 0, - LegacyPartitionDevice = 2, - SerialDevice = 3, - UdpDevice = 4, - BootDevice = 5, - PartitionDevice = 6, - LocateDevice = 8, -} BL_DEVICE_TYPE; - -// -// Local Device Types -// -typedef enum _BL_LOCAL_DEVICE_TYPE -{ - LocalDevice = 0, - FloppyDevice = 1, - CdRomDevice = 2, - RamDiskDevice = 3, - FileDevice = 5, - VirtualDiskDevice = 6 -} BL_LOCAL_DEVICE_TYPE; - -// -// Partition types -// -typedef enum _BL_PARTITION_TYPE -{ - GptPartition, - MbrPartition, - RawPartition, -} BL_PARTITION_TYPE; - -// -// File Path Types -// -typedef enum _BL_PATH_TYPE -{ - InternalPath = 3, - EfiPath = 4 -} BL_PATH_TYPE; - -// -// Classes of Memory -// -typedef enum _BL_MEMORY_CLASS -{ - BlLoaderClass = 0xD, - BlApplicationClass, - BlSystemClass -} BL_MEMORY_CLASS; - -// -// Types of Memory -// -typedef enum _BL_MEMORY_TYPE -{ - // - // Loader Memory - // - BlLoaderMemory = 0xD0000002, - BlLoaderDeviceMemory = 0xD0000004, - BlLoaderHeap = 0xD0000005, - BlLoaderPageDirectory = 0xD0000006, - BlLoaderReferencePage = 0xD0000007, - BlLoaderRamDisk = 0xD0000008, - BlLoaderArchData = 0xD0000009, - BlLoaderData = 0xD000000A, - BlLoaderRegistry = 0xD000000B, - BlLoaderBlockMemory = 0xD000000C, - BlLoaderSelfMap = 0xD000000F, - - // - // Application Memory - // - BlApplicationReserved = 0xE0000001, - BlApplicationData = 0xE0000004, - - // - // System Memory - // - BlConventionalMemory = 0xF0000001, - BlUnusableMemory = 0xF0000002, - BlReservedMemory = 0xF0000003, - BlEfiBootMemory = 0xF0000004, - BlConventionalZeroedMemory = 0xF000005, - BlEfiRuntimeCodeMemory = 0xF0000006, - BlAcpiReclaimMemory = 0xF0000008, - BlAcpiNvsMemory = 0xF0000009, - BlDeviceIoMemory = 0xF000000A, - BlDevicePortMemory = 0xF000000B, - BlPalMemory = 0xF000000C, - BlEfiRuntimeDataMemory = 0xF000000E, -} BL_MEMORY_TYPE; - -typedef enum _BL_MEMORY_ATTR -{ - // - // Memory Caching Attributes - // - BlMemoryUncached = 0x00000001, - BlMemoryWriteCombined = 0x00000002, - BlMemoryWriteThrough = 0x00000004, - BlMemoryWriteBack = 0x00000008, - BlMemoryUncachedExported = 0x00000010, - BlMemoryValidCacheAttributes = BlMemoryUncached | BlMemoryWriteCombined | BlMemoryWriteThrough | BlMemoryWriteBack | BlMemoryUncachedExported, - BlMemoryValidCacheAttributeMask = 0x000000FF, - - // - // Memory Protection Attributes - // - BlMemoryWriteProtected = 0x00000100, - BlMemoryReadProtected = 0x00000200, - BlMemoryExecuteProtected = 0x00000400, - BlMemoryValidProtectionAttributes = BlMemoryWriteProtected | BlMemoryReadProtected | BlMemoryExecuteProtected, - BlMemoryValidProtectionAttributeMask = 0x0000FF00, - - // - // Memory Allocation Attributes - // - BlMemoryLargePages = 0x00010000, - BlMemoryKernelRange = 0x00020000, - BlMemoryFixed = 0x00040000, - BlMemoryBelow1MB = 0x00080000, - BlMemoryValidAllocationAttributes = BlMemoryKernelRange | BlMemoryFixed | BlMemoryBelow1MB | BlMemoryLargePages, - BlMemoryValidAllocationAttributeMask = 0x00FF0000, - - // - // Memory Type Attributes - // - BlMemoryRuntime = 0x01000000, - BlMemoryCoalesced = 0x02000000, - BlMemoryUpdate = 0x04000000, - BlMemoryNonFirmware = 0x08000000, - BlMemoryPersistent = 0x10000000, - BlMemorySpecial = 0x20000000, - BlMemoryFirmware = 0x80000000, - BlMemoryValidTypeAttributes = BlMemoryRuntime | BlMemoryCoalesced | BlMemoryUpdate | BlMemoryNonFirmware | BlMemoryPersistent | BlMemorySpecial | BlMemoryFirmware, - BlMemoryValidTypeAttributeMask = 0xFF000000, -} BL_MEMORY_ATTR; - -/* CALLBACKS *****************************************************************/ - -struct _BL_FILE_ENTRY; -struct _BL_FILE_INFORMATION; -typedef -NTSTATUS -(*PBL_FILE_OPEN) ( - _In_ struct _BL_FILE_ENTRY* Directory, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ struct _BL_FILE_ENTRY** FileEntry - ); - -typedef -NTSTATUS -(*PBL_FILE_CLOSE) ( - _In_ struct _BL_FILE_ENTRY* FileEntry - ); - -typedef -NTSTATUS -(*PBL_FILE_READ) ( - _In_ struct _BL_FILE_ENTRY* FileEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_opt_ PULONG BytesRead - ); - -typedef -NTSTATUS -(*PBL_FILE_WRITE) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_FILE_GET_NEXT) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_FILE_GET_INFO) ( - _In_ struct _BL_FILE_ENTRY* FileEntry, - _Out_ struct _BL_FILE_INFORMATION* FileInfo - ); - -typedef -NTSTATUS -(*PBL_FILE_SET_INFO) ( - _In_ struct _BL_FILE_ENTRY* FileEntry, - _In_ struct _BL_FILE_INFORMATION* FileInfo - ); - -typedef -NTSTATUS -(*PBL_FS_INIT_CALLBACK) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_FS_DESTROY_CALLBACK) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_FS_MOUNT_CALLBACK) ( - _In_ ULONG DeviceId, - _In_ ULONG Unknown, - _Out_ struct _BL_FILE_ENTRY** FileEntry - ); - -typedef -NTSTATUS -(*PBL_FS_PURGE_CALLBACK) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_FILE_DESTROY_CALLBACK) ( - _In_ PVOID Entry - ); - -struct _BL_TEXT_CONSOLE; -struct _BL_DISPLAY_STATE; -struct _BL_DISPLAY_MODE; -struct _BL_INPUT_CONSOLE; -struct _BL_REMOTE_CONSOLE; -struct _BL_GRAPHICS_CONSOLE; -typedef -VOID -(*PCONSOLE_DESTRUCT) ( - _In_ struct _BL_TEXT_CONSOLE* Console - ); - -typedef -NTSTATUS -(*PCONSOLE_REINITIALIZE) ( - _In_ struct _BL_TEXT_CONSOLE* Console - ); - -typedef -NTSTATUS -(*PCONSOLE_GET_TEXT_STATE) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ struct _BL_DISPLAY_STATE* TextState - ); - -typedef -NTSTATUS -(*PCONSOLE_SET_TEXT_STATE) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG Flags, - _In_ struct _BL_DISPLAY_STATE* TextState - ); - -typedef -NTSTATUS -(*PCONSOLE_GET_TEXT_RESOLUTION) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ PULONG TextResolution - ); - -typedef -NTSTATUS -(*PCONSOLE_SET_TEXT_RESOLUTION) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG NewTextResolution, - _Out_ PULONG OldTextResolution - ); - -typedef -NTSTATUS -(*PCONSOLE_CLEAR_TEXT) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ BOOLEAN LineOnly - ); - -typedef -BOOLEAN -(*PCONSOLE_IS_ENABLED) ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console - ); - -typedef -NTSTATUS -(*PCONSOLE_GET_GRAPHICAL_RESOLUTION) ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _Out_ struct _BL_DISPLAY_MODE* DisplayMode - ); - -typedef -NTSTATUS -(*PCONSOLE_SET_GRAPHICAL_RESOLUTION) ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _In_ struct _BL_DISPLAY_MODE DisplayMode - ); - -typedef -NTSTATUS -(*PCONSOLE_ENABLE) ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _In_ BOOLEAN Enable -); - -typedef -NTSTATUS -(*PCONSOLE_WRITE_TEXT) ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ PCHAR Text, - _In_ ULONG Attribute - ); - -typedef -BOOLEAN -(*PBL_TBL_LOOKUP_ROUTINE) ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ); - -typedef -NTSTATUS -(*PBL_TBL_MAP_ROUTINE) ( - _In_ PVOID Entry, - _In_ ULONG EntryIndex - ); - -typedef -NTSTATUS -(*PBL_TBL_SET_ROUTINE) ( - _In_ PVOID Entry - ); - -typedef -NTSTATUS -(*PBL_IO_DESTROY_ROUTINE) ( - VOID - ); - -struct _BL_HASH_ENTRY; -typedef -BOOLEAN -(*PBL_HASH_TABLE_COMPARE_FUNCTION) ( - _In_ struct _BL_HASH_ENTRY* Entry1, - _In_ struct _BL_HASH_ENTRY* Entry2 - ); - -typedef -ULONG -(*PBL_HASH_TABLE_HASH_FUNCTION) ( - _In_ struct _BL_HASH_ENTRY* Entry, - _In_ ULONG TableSize - ); - -struct _BL_DEVICE_ENTRY; -struct _BL_DEVICE_DESCRIPTOR; -struct _BL_DEVICE_INFORMATION; - -typedef -NTSTATUS -(*PBL_DEVICE_ENUMERATE_DEVICE_CLASS) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_DEVICE_OPEN) ( - _In_ struct _BL_DEVICE_DESCRIPTOR* Device, - _In_ struct _BL_DEVICE_ENTRY* DeviceEntry - ); - -typedef -NTSTATUS -(*PBL_DEVICE_CLOSE) ( - _In_ struct _BL_DEVICE_ENTRY* DeviceEntry - ); - -typedef -NTSTATUS -(*PBL_DEVICE_READ) ( - _In_ struct _BL_DEVICE_ENTRY* DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_ PULONG BytesRead - ); - -typedef -NTSTATUS -(*PBL_DEVICE_WRITE) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_DEVICE_GET_INFORMATION) ( - _In_ struct _BL_DEVICE_ENTRY* DeviceEntry, - _Out_ struct _BL_DEVICE_INFORMATION* DeviceInformation - ); - -typedef -NTSTATUS -(*PBL_DEVICE_SET_INFORMATION) ( - _In_ struct _BL_DEVICE_ENTRY* DeviceEntry, - _In_ struct _BL_DEVICE_INFORMATION* DeviceInformation - ); - -typedef -NTSTATUS -(*PBL_DEVICE_RESET) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_DEVICE_FLUSH) ( - VOID - ); - -typedef -NTSTATUS -(*PBL_DEVICE_CREATE) ( - VOID - ); - -typedef VOID -(*PBL_MM_FLUSH_TLB) ( - VOID - ); - -typedef VOID -(*PBL_MM_RELOCATE_SELF_MAP) ( - VOID - ); - -typedef NTSTATUS -(*PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE) ( - _In_ PVOID DestinationAddress, - _In_ PVOID SourceAddress, - _In_ ULONGLONG Size - ); - -typedef NTSTATUS -(*PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE) ( - _In_ PVOID DestinationAddress, - _In_ ULONGLONG Size - ); - -typedef VOID -(*PBL_MM_DESTROY_SELF_MAP) ( - VOID - ); - -typedef VOID -(*PBL_MM_FLUSH_TLB_ENTRY) ( - _In_ PVOID VirtualAddress - ); - -typedef VOID -(*PBL_MM_FLUSH_TLB) ( - VOID - ); - -typedef NTSTATUS -(*PBL_MM_UNMAP_VIRTUAL_ADDRESS) ( - _In_ PVOID VirtualAddress, - _In_ ULONG Size - ); - -typedef NTSTATUS -(*PBL_MM_REMAP_VIRTUAL_ADDRESS) ( - _In_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_ PVOID VirtualAddress, - _In_ ULONG Size, - _In_ ULONG CacheAttributes - ); - -typedef NTSTATUS -(*PBL_MM_MAP_PHYSICAL_ADDRESS) ( - _In_ PHYSICAL_ADDRESS PhysicalAddress, - _Out_ PVOID VirtualAddress, - _In_ ULONG Size, - _In_ ULONG CacheAttributes - ); - -typedef BOOLEAN -(*PBL_MM_TRANSLATE_VIRTUAL_ADDRESS) ( - _In_ PVOID VirtualAddress, - _Out_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_opt_ PULONG CacheAttributes - ); - -typedef NTSTATUS -(*PBL_STATUS_ERROR_HANDLER) ( - _In_ ULONG ErrorCode, - _In_ ULONG Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3, - _In_ ULONG_PTR Parameter4 - ); - -/* DATA STRUCTURES ***********************************************************/ - -typedef struct _BL_LIBRARY_PARAMETERS -{ - ULONG LibraryFlags; - ULONG TranslationType; - ULONG MinimumAllocationCount; - ULONG MinimumHeapSize; - ULONG HeapAllocationAttributes; - PWCHAR ApplicationBaseDirectory; - ULONG DescriptorCount; - PWCHAR FontBaseDirectory; -} BL_LIBRARY_PARAMETERS, *PBL_LIBRARY_PARAMETERS; - -/* This should eventually go into a more public header */ -typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK -{ - /* This header tells the library what image we're dealing with */ - ULONG Signature[2]; - ULONG Version; - ULONG Size; - ULONG ImageType; - ULONG MemoryTranslationType; - - /* Where is the image located */ - ULONGLONG ImageBase; - ULONG ImageSize; - - /* Offset to BL_MEMORY_DATA */ - ULONG MemoryDataOffset; - - /* Offset to BL_APPLICATION_ENTRY */ - ULONG AppEntryOffset; - - /* Offset to BL_DEVICE_DESCRPIPTOR */ - ULONG BootDeviceOffset; - - /* Offset to BL_FIRMWARE_PARAMETERS */ - ULONG FirmwareParametersOffset; - - /* Offset to BL_RETURN_ARGUMENTS */ - ULONG ReturnArgumentsOffset; -} BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK; - -typedef struct _BL_MEMORY_DATA -{ - ULONG Version; - ULONG MdListOffset; - ULONG DescriptorCount; - ULONG DescriptorSize; - ULONG DescriptorOffset; -} BL_MEMORY_DATA, *PBL_MEMORY_DATA; - -typedef struct _BL_FIRMWARE_DESCRIPTOR -{ - ULONG Version; - ULONG Unknown; - EFI_HANDLE ImageHandle; - EFI_SYSTEM_TABLE *SystemTable; -} BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR; - -typedef struct _BL_RETURN_ARGUMENTS -{ - ULONG Version; - NTSTATUS Status; - ULONG Flags; - ULONGLONG DataSize; - ULONGLONG DataPage; -} BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS; - -typedef struct _BL_MEMORY_DESCRIPTOR -{ - LIST_ENTRY ListEntry; - union - { - struct - { - ULONGLONG BasePage; - ULONGLONG VirtualPage; - }; - struct - { - ULONGLONG BaseAddress; - ULONGLONG VirtualAddress; - }; - }; - ULONGLONG PageCount; - ULONG Flags; - BL_MEMORY_TYPE Type; -} BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR; - -typedef struct _BL_BCD_OPTION -{ - ULONG Type; - ULONG DataOffset; - ULONG DataSize; - ULONG ListOffset; - ULONG NextEntryOffset; - ULONG Empty; -} BL_BCD_OPTION, *PBL_BCD_OPTION; - -typedef struct _BL_APPLICATION_ENTRY -{ - CHAR Signature[8]; - ULONG Flags; - GUID Guid; - ULONG Unknown[4]; - BL_BCD_OPTION BcdData; -} BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY; - -typedef struct _BL_LOADED_APPLICATION_ENTRY -{ - ULONG Flags; - GUID Guid; - PBL_BCD_OPTION BcdData; -} BL_LOADED_APPLICATION_ENTRY, *PBL_LOADED_APPLICATION_ENTRY; - -typedef struct _BL_MENU_STATUS -{ - union - { - struct - { - ULONG AnyKey : 1; - ULONG AdvancedOptions : 1; - ULONG BootOptions : 1; - ULONG OemKey : 1; - ULONG Exit : 1; - ULONG Reserved : 27; - }; - ULONG AsULong; - }; - ULONG BootIndex; - WCHAR KeyValue; -} BL_MENU_STATUS, *PL_MENU_STATUS; - -typedef enum _BL_BOOT_ERROR_STATUS -{ - Reboot = 1, - Recover = 2, - RecoverOem = 3, - OsSelection = 4, - NextOs = 5, - TryAgain = 6, - AdvancedOptions = 7, - BootOptions = 8 -} BL_BOOT_ERROR_STATUS; - -typedef struct _BL_HARDDISK_DEVICE -{ - ULONG PartitionType; - union - { - struct - { - ULONG PartitionSignature; - } Mbr; - - struct - { - GUID PartitionSignature; - } Gpt; - - struct - { - ULONG DiskNumber; - } Raw; - }; -} BL_HARDDISK_DEVICE; - -typedef struct _BL_LOCAL_DEVICE -{ - BL_LOCAL_DEVICE_TYPE Type; - union - { - struct - { - ULONG DriveNumber; - } FloppyDisk; - - BL_HARDDISK_DEVICE HardDisk; - - BL_HARDDISK_DEVICE VirtualHardDisk; - - struct - { - PHYSICAL_ADDRESS ImageBase; - LARGE_INTEGER ImageSize; - ULONG ImageOffset; - } RamDisk; - - ULONG File; // unknown for now - }; -} BL_LOCAL_DEVICE, *PBL_LOCAL_DEVICE; - -typedef struct _BL_DEVICE_DESCRIPTOR -{ - DEVICE_TYPE DeviceType; - ULONG Flags; - ULONG Size; - ULONG Unknown; - union - { - BL_LOCAL_DEVICE Local; - - struct - { - ULONG Unknown; - } Remote; - - struct - { - union - { - ULONG PartitionNumber; - } Mbr; - - union - { - GUID PartitionGuid; - } Gpt; - - BL_LOCAL_DEVICE Disk; - } Partition; - }; -} BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR; - -typedef struct _BL_FILE_PATH_DESCRIPTOR -{ - ULONG Version; - ULONG Length; - ULONG PathType; - UCHAR Path[ANYSIZE_ARRAY]; -} BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR; - -typedef struct _BL_WINDOWS_LOAD_OPTIONS -{ - CHAR Signature[8]; - ULONG Version; - ULONG Length; - ULONG OsPathOffset; - WCHAR LoadOptions[ANYSIZE_ARRAY]; -} BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS; - -typedef struct _BL_ARCH_CONTEXT -{ - BL_ARCH_MODE Mode; - BL_TRANSLATION_TYPE TranslationType; - ULONG ContextFlags; -} BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT; - -typedef struct _BL_MEMORY_DESCRIPTOR_LIST -{ - LIST_ENTRY ListHead; - PLIST_ENTRY First; - PLIST_ENTRY This; - ULONG Type; -} BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST; - -typedef struct _BL_ADDRESS_RANGE -{ - ULONGLONG Minimum; - ULONGLONG Maximum; -} BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE; - -typedef struct _BL_FILE_INFORMATION -{ - ULONGLONG Size; - ULONGLONG Offset; - PWCHAR FsName; - ULONG Flags; -} BL_FILE_INFORMATION, *PBL_FILE_INFORMATION; - -typedef struct _BL_FILE_CALLBACKS -{ - PBL_FILE_OPEN Open; - PBL_FILE_CLOSE Close; - PBL_FILE_READ Read; - PBL_FILE_WRITE Write; - PBL_FILE_GET_NEXT GetNext; - PBL_FILE_GET_INFO GetInfo; - PBL_FILE_SET_INFO SetInfo; -} BL_FILE_CALLBACKS, *PBL_FILE_CALLBACKS; - -typedef struct _BL_FILE_ENTRY -{ - PWCHAR FilePath; - ULONG DeviceId; - ULONG FileId; - ULONG Flags; - ULONG ReferenceCount; - ULONG Unknown; - ULONGLONG TotalBytesRead; - ULONGLONG Unknown2; - BL_FILE_CALLBACKS Callbacks; - PVOID FsSpecificData; -} BL_FILE_ENTRY, *PBL_FILE_ENTRY; - -typedef struct _BL_FILE_SYSTEM_ENTRY -{ - LIST_ENTRY ListEntry; - PBL_FS_INIT_CALLBACK InitCallback; - PBL_FS_DESTROY_CALLBACK DestroyCallback; - PBL_FS_MOUNT_CALLBACK MountCallback; - PBL_FS_PURGE_CALLBACK PurgeCallback; -} BL_FILE_SYSTEM_ENTRY, *PBL_FILE_SYSTEM_ENTRY; - -typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE -{ - PBL_FS_INIT_CALLBACK Init; - PBL_FS_DESTROY_CALLBACK Destroy; - PBL_FS_MOUNT_CALLBACK Mount; - PBL_FS_PURGE_CALLBACK Purge; -} BL_FILE_SYSTEM_REGISTRATION_TABLE; - -typedef struct _BL_DISPLAY_STATE -{ - ULONG BgColor; - ULONG FgColor; - ULONG XPos; - ULONG YPos; - ULONG CursorVisible; -} BL_DISPLAY_STATE, *PBL_DISPLAY_STATE; - -typedef struct _BL_DISPLAY_MODE -{ - ULONG HRes; - ULONG VRes; - ULONG HRes2; -} BL_DISPLAY_MODE, *PBL_DISPLAY_MODE; - -typedef struct _BL_TEXT_CONSOLE_VTABLE -{ - PCONSOLE_DESTRUCT Destruct; - PCONSOLE_REINITIALIZE Reinitialize; - PCONSOLE_GET_TEXT_STATE GetTextState; - PCONSOLE_SET_TEXT_STATE SetTextState; - PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution; - PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution; - PCONSOLE_CLEAR_TEXT ClearText; - PCONSOLE_WRITE_TEXT WriteText; -} BL_TEXT_CONSOLE_VTABLE, *PBL_TEXT_CONSOLE_VTABLE; - -typedef struct _BL_GRAPHICS_CONSOLE_VTABLE -{ - BL_TEXT_CONSOLE_VTABLE Text; - PCONSOLE_IS_ENABLED IsEnabled; - PCONSOLE_ENABLE Enable; - PVOID GetConsoleResolution; - PCONSOLE_GET_GRAPHICAL_RESOLUTION GetGraphicalResolution; - PCONSOLE_GET_GRAPHICAL_RESOLUTION GetOriginalResolution; - PCONSOLE_SET_GRAPHICAL_RESOLUTION SetOriginalResolution; - /// more for graphics /// -} BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE; - -typedef struct _BL_TEXT_CONSOLE -{ - PBL_TEXT_CONSOLE_VTABLE Callbacks; - BL_DISPLAY_STATE State; - BL_DISPLAY_MODE DisplayMode; - BOOLEAN Active; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol; - ULONG Mode; - EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode; -} BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE; - -typedef struct _BL_INPUT_CONSOLE_VTABLE -{ - PCONSOLE_DESTRUCT Destruct; - PCONSOLE_REINITIALIZE Reinitialize; - //PCONSOLE_IS_KEY_PENDING IsKeyPending; - //PCONSOLE_READ_INPUT ReadInput; - //PCONSOLE_ERASE_BUFFER EraseBuffer; - //PCONSOLE_FILL_BUFFER FillBuffer; -} BL_INPUT_CONSOLE_VTABLE, *PBL_INPUT_CONSOLE_VTABLE; - -typedef struct _BL_INPUT_CONSOLE -{ - PBL_INPUT_CONSOLE_VTABLE Callbacks; - PULONG Buffer; - PULONG DataStart; - PULONG DataEnd; - PULONG EndBuffer; -} BL_INPUT_CONSOLE, *PBL_INPUT_CONSOLE; - -typedef enum _BL_GRAPHICS_CONSOLE_TYPE -{ - BlGopConsole, - BlUgaConsole -} BL_GRAPHICS_CONSOLE_TYPE; - -typedef struct _BL_GRAPHICS_CONSOLE -{ - BL_TEXT_CONSOLE TextConsole; - BL_DISPLAY_MODE DisplayMode; - ULONG PixelDepth; - ULONG FgColor; - ULONG BgColor; - BL_DISPLAY_MODE OldDisplayMode; - ULONG OldPixelDepth; - EFI_HANDLE Handle; - BL_GRAPHICS_CONSOLE_TYPE Type; - EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol; - PVOID FrameBuffer; - ULONG FrameBufferSize; - ULONG PixelsPerScanLine; - ULONG Mode; - ULONG OldMode; -} BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE; - -typedef struct _BL_REMOTE_CONSOLE -{ - BL_TEXT_CONSOLE TextConsole; -} BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE; - -typedef struct _BL_HASH_TABLE -{ - PLIST_ENTRY HashLinks; - ULONG Size; - PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction; - PBL_HASH_TABLE_HASH_FUNCTION HashFunction; -} BL_HASH_TABLE, *PBL_HASH_TABLE; - -typedef struct _BL_HASH_ENTRY -{ - ULONG Size; - ULONG Flags; - PVOID Value; -} BL_HASH_ENTRY, *PBL_HASH_ENTRY; - -typedef struct _BL_HASH_VALUE -{ - ULONG DataSize; - PVOID Data; -} BL_HASH_VALUE, *PBL_HASH_VALUE; - -typedef struct _BL_HASH_NODE -{ - LIST_ENTRY ListEntry; - BL_HASH_ENTRY Entry; - BL_HASH_VALUE Value; -} BL_HASH_NODE, *PBL_HASH_NODE; - -typedef struct _BL_BLOCK_DEVICE_INFORMATION -{ - BL_LOCAL_DEVICE_TYPE Type; - ULONG DeviceFlags; - ULONG Unknown; - BL_PARTITION_TYPE PartitionType; - ULONG BlockSize; - ULONG Alignment; - ULONGLONG LastBlock; - ULONGLONG Offset; - ULONG Block; - struct - { - union - { - struct - { - ULONG Signature; - } Mbr; - struct - { - GUID Signature; - } Gpt; - }; - } Disk; -} BL_BLOCK_DEVICE_INFORMATION, *PBL_BLOCK_DEVICE_INFORMATION; - -typedef struct _BL_DEVICE_INFORMATION -{ - BL_DEVICE_TYPE DeviceType; - union - { - BL_BLOCK_DEVICE_INFORMATION BlockDeviceInfo; - }; -} BL_DEVICE_INFORMATION, *PBL_DEVICE_INFORMATION; - -typedef struct _BL_BLOCK_DEVICE -{ - BL_BLOCK_DEVICE_INFORMATION; - ULONGLONG StartOffset; - EFI_BLOCK_IO* Protocol; - EFI_HANDLE Handle; -} BL_BLOCK_DEVICE, *PBL_BLOCK_DEVICE; - -typedef struct _BL_PROTOCOL_HANDLE -{ - EFI_HANDLE Handle; - PVOID Interface; -} BL_PROTOCOL_HANDLE, *PBL_PROTOCOL_HANDLE; - -typedef struct _BL_DEVICE_CALLBACKS -{ - PBL_DEVICE_ENUMERATE_DEVICE_CLASS EnumerateDeviceClass; - PBL_DEVICE_OPEN Open; - PBL_DEVICE_CLOSE Close; - PBL_DEVICE_READ Read; - PBL_DEVICE_WRITE Write; - PBL_DEVICE_GET_INFORMATION GetInformation; - PBL_DEVICE_SET_INFORMATION SetInformation; - PBL_DEVICE_RESET Reset; - PBL_DEVICE_FLUSH Flush; - PBL_DEVICE_CREATE Create; -} BL_DEVICE_CALLBACKS, *PBL_DEVICE_CALLBACKS; - -typedef struct _BL_DEVICE_ENTRY -{ - ULONG DeviceId; - ULONG Flags; - ULONG Unknown; - ULONG ReferenceCount; - BL_DEVICE_CALLBACKS Callbacks; - PVOID DeviceSpecificData; - PBL_DEVICE_DESCRIPTOR DeviceDescriptor; -} BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY; - -typedef struct _BL_IMG_FILE -{ - UCHAR Flags; - union - { - PVOID BaseAddress; - ULONG FileId; - }; - ULONG FileSize; - PWCHAR FileName; -} BL_IMG_FILE, *PBL_IMG_FILE; - -typedef struct _BL_IMAGE_APPLICATION_ENTRY -{ - PBL_APPLICATION_ENTRY AppEntry; - PVOID ImageBase; - ULONG ImageSize; -} BL_IMAGE_APPLICATION_ENTRY, *PBL_IMAGE_APPLICATION_ENTRY; - -typedef struct _BL_BUFFER_DESCRIPTOR -{ - PVOID Buffer; - ULONG ActualSize; - ULONG BufferSize; -} BL_BUFFER_DESCRIPTOR, *PBL_BUFFER_DESCRIPTOR; - -typedef struct _BL_DEFERRED_FONT_FILE -{ - LIST_ENTRY ListEntry; - ULONG Flags; - PBL_DEVICE_DESCRIPTOR Device; - PWCHAR FontPath; -} BL_DEFERRED_FONT_FILE, *PBL_DEFERRED_FONT_FILE; - -#pragma pack(push) -#pragma pack(1) -typedef struct _BMP_HEADER -{ - USHORT Signature; - ULONG Size; - USHORT Reserved[2]; - ULONG Offset; -} BMP_HEADER, *PBMP_HEADER; - -typedef struct _DIB_HEADER -{ - ULONG Size; - ULONG Width; - ULONG Height; - USHORT Planes; - USHORT BitCount; - ULONG Compression; - ULONG SizeImage; - ULONG XPelsPerMeter; - ULONG YPelsPerMEter; - ULONG ClrUsed; - ULONG ClrImportant; -} DIB_HEADER, *PDIB_HEADER; - -typedef struct _BITMAP -{ - BMP_HEADER BmpHeader; - DIB_HEADER DibHeader; -} BITMAP, *PBITMAP; -#pragma pack(pop) - -typedef struct _COORD -{ - ULONG X; - ULONG Y; -} COORD, *PCOORD; - -typedef struct _BL_PD_DATA_BLOB -{ - PVOID Data; - ULONG DataSize; - ULONG BlobSize; -} BL_PD_DATA_BLOB, *PBL_PD_DATA_BLOB; - -/* INLINE ROUTINES ***********************************************************/ - -FORCEINLINE -VOID -BlSetupDefaultParameters ( - _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters - ) -{ - BL_LIBRARY_PARAMETERS DefaultParameters = - { - 0x20, - BlVirtual, - 1024, - 2 * 1024 * 1024, - 0, - NULL, - 0, - NULL - }; - - /* Copy the defaults */ - RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters)); -} - -FORCEINLINE -VOID -MmMdInitializeListHead ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST List - ) -{ - /* Initialize the list */ - InitializeListHead(&List->ListHead); - List->First = &List->ListHead; - List->This = NULL; - List->Type = 0; -} - -FORCEINLINE -PVOID -PhysicalAddressToPtr ( - _In_ PHYSICAL_ADDRESS PhysicalAddress) -{ - return (PVOID)(ULONG_PTR)PhysicalAddress.QuadPart; -} - -/* INITIALIZATION ROUTINES ***************************************************/ - -NTSTATUS -BlInitializeLibrary( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ); - -NTSTATUS -BlpArchInitialize ( - _In_ ULONG Phase - ); - -NTSTATUS -BlpFwInitialize ( - _In_ ULONG Phase, - _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters - ); - -NTSTATUS -BlpMmInitialize ( - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ); - -NTSTATUS -MmBaInitialize ( - VOID - ); - -NTSTATUS -MmPaInitialize ( - _In_ PBL_MEMORY_DATA MemoryData, - _In_ ULONG MinimumPages - ); - -NTSTATUS -MmArchInitialize ( - _In_ ULONG Phase, - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType, - _In_ BL_TRANSLATION_TYPE LibraryTranslationType - ); - -NTSTATUS -MmHaInitialize ( - _In_ ULONG HeapSize, - _In_ ULONG HeapAttributes - ); - -VOID -MmMdInitialize ( - _In_ ULONG Phase, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ); - -NTSTATUS -BlpDeviceInitialize ( - VOID - ); - -NTSTATUS -BlpIoInitialize ( - VOID - ); - -NTSTATUS -BlpFileInitialize ( - VOID - ); - -NTSTATUS -BlpDisplayInitialize ( - _In_ ULONG Flags - ); - -NTSTATUS -BlpDisplayReinitialize ( - VOID - ); - -VOID -BlDestroyLibrary ( - VOID - ); - -NTSTATUS -BcInitialize ( - VOID - ); - -/* FIRMWARE ROUTINES *********************************************************/ - -VOID -EfiPrintf ( - _In_ PWCHAR Format, - ... - ); - -NTSTATUS -BlFwGetParameters( - _In_ PBL_FIRMWARE_DESCRIPTOR Parameters - ); - -NTSTATUS -BlFwEnumerateDevice ( - _In_ PBL_DEVICE_DESCRIPTOR Device - ); - -NTSTATUS -EfiAllocatePages ( - _In_ ULONG Type, - _In_ ULONG Pages, - _Inout_ EFI_PHYSICAL_ADDRESS* Memory - ); - -NTSTATUS -EfiStall ( - _In_ ULONG StallTime - ); - -NTSTATUS -EfiConInExReset ( - VOID - ); - -NTSTATUS -EfiConInReset ( - VOID - ); - -NTSTATUS -EfiConOutOutputString ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ PWCHAR String - ); - -NTSTATUS -EfiConOutQueryMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Mode, - _In_ UINTN* Columns, - _In_ UINTN* Rows - ); - -NTSTATUS -EfiConOutSetMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Mode - ); - -VOID -EfiConOutReadCurrentMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode - ); - -NTSTATUS -EfiConOutSetAttribute ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Attribute - ); - -NTSTATUS -EfiConOutSetCursorPosition ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Column, - _In_ ULONG Row - ); - -NTSTATUS -EfiConOutEnableCursor ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ BOOLEAN Visible - ); - -NTSTATUS -EfiLocateHandleBuffer ( - _In_ EFI_LOCATE_SEARCH_TYPE SearchType, - _In_ EFI_GUID *Protocol, - _Inout_ PULONG HandleCount, - _Inout_ EFI_HANDLE** Buffer - ); - -NTSTATUS -EfiOpenProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID *Protocol, - _Out_ PVOID* Interface - ); - -NTSTATUS -EfiCloseProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID *Protocol - ); - -NTSTATUS -EfiGopGetCurrentMode ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _Out_ UINTN* Mode, - _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information - ); - -NTSTATUS -EfiGopSetMode ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _In_ ULONG Mode - ); - -VOID -EfiGopGetFrameBuffer ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _Out_ PHYSICAL_ADDRESS* FrameBuffer, - _Out_ UINTN *FrameBufferSize - ); - -VOID -EfiResetSystem ( - _In_ EFI_RESET_TYPE ResetType - ); - -EFI_DEVICE_PATH* -EfiGetLeafNode ( - _In_ EFI_DEVICE_PATH *DevicePath - ); - -EFI_DEVICE_PATH * -EfiIsDevicePathParent ( - _In_ EFI_DEVICE_PATH *DevicePath1, - _In_ EFI_DEVICE_PATH *DevicePath2 - ); - -NTSTATUS -EfipGetRsdt ( - _Out_ PPHYSICAL_ADDRESS FoundRsdt - ); - -NTSTATUS -EfiFreePages ( - _In_ ULONG Pages, - _In_ EFI_PHYSICAL_ADDRESS PhysicalAddress - ); - -/* PLATFORM TIMER ROUTINES ***************************************************/ - -NTSTATUS -BlpTimeCalibratePerformanceCounter ( - VOID - ); - -ULONGLONG -BlTimeQueryPerformanceCounter ( - _Out_opt_ PLARGE_INTEGER Frequency - ); - -ULONGLONG -BlArchGetPerformanceCounter ( - VOID - ); - -/* RESOURCE LOCALE INTERNATIONALIZATION ROUTINES *****************************/ - -NTSTATUS -BlpDisplayRegisterLocale ( - _In_ PWCHAR Locale - ); - -/* FONT ROUTINES *************************************************************/ - -VOID -BfiFreeDeferredFontFile ( - _In_ PBL_DEFERRED_FONT_FILE DeferredFontFile - ); - -NTSTATUS -BfLoadFontFile ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PWCHAR FontPath - ); - -NTSTATUS -BfLoadDeferredFontFiles ( - VOID - ); - -NTSTATUS -BfClearScreen ( - _In_ PBL_GRAPHICS_CONSOLE Console - ); - -NTSTATUS -BfClearToEndOfLine ( - _In_ PBL_GRAPHICS_CONSOLE Console - ); - -/* FILESYSTEM ROUTINES *******************************************************/ - -NTSTATUS -FatInitialize ( - VOID - ); - -NTSTATUS -FatMount ( - _In_ ULONG DeviceId, - _In_ ULONG Unknown, - _Out_ PBL_FILE_ENTRY* FileEntry - ); - -NTSTATUS -EtfsInitialize ( - VOID - ); - -NTSTATUS -EtfsMount ( - _In_ ULONG DeviceId, - _In_ ULONG Unknown, - _Out_ PBL_FILE_ENTRY* FileEntry - ); - -/* DEBUG ROUTINES ************************************************************/ - -BOOLEAN -BlBdDebuggerEnabled ( - VOID - ); - -NTSTATUS -BlBdPullRemoteFile ( - _In_ PWCHAR FilePath, - _Out_ PVOID BaseAddress, - _Out_ PULONGLONG FileSize - ); - -VOID -BlStatusPrint ( - _In_ PCWCH Format, - ... - ); - -VOID -BlStatusError ( - _In_ ULONG ErrorCode, - _In_ ULONG Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3, - _In_ ULONG_PTR Parameter4 - ); - -/* UTILITY ROUTINES **********************************************************/ - -VOID -BlArchCpuId ( - _In_ ULONG Function, - _In_ ULONG SubFunction, - _Out_ PCPU_INFO Result - ); - -CPU_VENDORS -BlArchGetCpuVendor ( - VOID - ); - -BOOLEAN -BlArchIsCpuIdFunctionSupported ( - _In_ ULONG Function - ); - -VOID -BlUtlUpdateProgress ( - _In_ ULONG Percentage, - _Out_opt_ PBOOLEAN Completed - ); - -NTSTATUS -BlUtlGetAcpiTable ( - _Out_ PVOID* TableAddress, - _In_ ULONG Signature - ); - -NTSTATUS -BlUtlInitialize ( - VOID - ); - -NTSTATUS -BlUtlRegisterProgressRoutine ( - VOID - ); - -ULONG -BlUtlCheckSum ( - _In_ ULONG PartialSum, - _In_ PUCHAR Buffer, - _In_ ULONG Length, - _In_ ULONG Flags - ); - -NTSTATUS -BlGetApplicationBaseAndSize ( - _Out_ PVOID* ImageBase, - _Out_ PULONG ImageSize - ); - -VOID -BlDestroyBootEntry ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry - ); - -NTSTATUS -BlPdQueryData ( - _In_ const GUID* DataGuid, - _In_ PVOID Unknown, - _Inout_ PBL_PD_DATA_BLOB DataBlob - ); - -/* FIRMWARE UTILITY ROUTINES *************************************************/ - -EFI_STATUS -EfiGetEfiStatusCode( - _In_ NTSTATUS Status - ); - -NTSTATUS -EfiGetNtStatusCode ( - _In_ EFI_STATUS EfiStatus - ); - -VOID -BlFwReboot ( - VOID - ); - -NTSTATUS -MmFwFreePages ( - _In_ ULONG BasePage, - _In_ ULONG PageCount - ); - -PGUID -BlGetApplicationIdentifier ( - VOID - ); - -NTSTATUS -BlpSecureBootEFIIsEnabled ( - VOID - ); - -NTSTATUS -BlSecureBootIsEnabled ( - _Out_ PBOOLEAN SecureBootEnabled - ); - -NTSTATUS -BlSecureBootCheckForFactoryReset ( - VOID - ); - -/* RESOURCE ROUTINES *********************************************************/ - -PWCHAR -BlResourceFindMessage ( - _In_ ULONG MsgId - ); - -PWCHAR -BlResourceFindHtml ( - VOID - ); - -NTSTATUS -BlpResourceInitialize ( - VOID - ); - -/* TABLE ROUTINES ************************************************************/ - -NTSTATUS -BlTblMap ( - _In_ PVOID *Table, - _In_ ULONG Count, - _In_ PBL_TBL_MAP_ROUTINE MapCallback - ); - -PVOID -BlTblFindEntry ( - _In_ PVOID *Table, - _In_ ULONG Count, - _Out_ PULONG EntryIndex, - _In_ PBL_TBL_LOOKUP_ROUTINE Callback, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ); - -NTSTATUS -BlTblSetEntry ( - _Inout_ PVOID** Table, - _Inout_ PULONG Count, - _In_ PVOID Entry, - _Out_ PULONG EntryIndex, - _In_ PBL_TBL_SET_ROUTINE Callback - ); - -NTSTATUS -TblDoNotPurgeEntry ( - _In_ PVOID Entry - ); - -/* HASH TABLE ROUTINES *******************************************************/ - -NTSTATUS -BlHtStore ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry, - _In_ PVOID Data, - _In_ ULONG DataSize - ); - -NTSTATUS -BlHtDelete ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry - ); - -NTSTATUS -BlHtLookup ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry, - _Out_ PBL_HASH_VALUE *Value - ); - -NTSTATUS -BlHtCreate ( - _In_ ULONG Size, - _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction, - _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction, - _Out_ PULONG Id - ); - -/* BCD OPTION ROUTINES *******************************************************/ - -PBL_BCD_OPTION -MiscGetBootOption ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type - ); - -ULONG -BlGetBootOptionListSize ( - _In_ PBL_BCD_OPTION BcdOption - ); - -ULONG -BlGetBootOptionSize ( - _In_ PBL_BCD_OPTION BcdOption - ); - -NTSTATUS -BlGetBootOptionString ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PWCHAR* Value - ); - -NTSTATUS -BlGetBootOptionInteger ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PULONGLONG Value - ); - -NTSTATUS -BlGetBootOptionBoolean ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PBOOLEAN Value - ); - -NTSTATUS -BlpGetBootOptionIntegerList ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PULONGLONG* Value, - _Out_ PULONGLONG Count, - _In_ BOOLEAN NoCopy - ); - -NTSTATUS -BlGetBootOptionDevice ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PBL_DEVICE_DESCRIPTOR* Value, - _In_opt_ PBL_BCD_OPTION* ExtraOptions - ); - -NTSTATUS -BlGetBootOptionGuid ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PGUID Value - ); - -NTSTATUS -BlGetBootOptionGuidList ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PGUID *Value, - _In_ PULONG Count - ); - -NTSTATUS -BlCopyBootOptions ( - _In_ PBL_BCD_OPTION OptionList, - _Out_ PBL_BCD_OPTION *CopiedOptions - ); - -NTSTATUS -BlAppendBootOptionBoolean ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ BOOLEAN Value - ); - -NTSTATUS -BlAppendBootOptionInteger ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ ULONGLONG Value - ); - -NTSTATUS -BlAppendBootOptionString ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ PWCHAR OptionString - ); - -NTSTATUS -BlAppendBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ PBL_BCD_OPTION Options - ); - -VOID -BlRemoveBootOption ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type - ); - -NTSTATUS -BlReplaceBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ PBL_BCD_OPTION NewOptions - ); - -/* BOOT REGISTRY ROUTINES ****************************************************/ - -VOID -BiCloseKey ( - _In_ HANDLE KeyHandle - ); - -NTSTATUS -BiOpenKey( - _In_ HANDLE ParentHandle, - _In_ PWCHAR KeyName, - _Out_ PHANDLE Handle - ); - -NTSTATUS -BiLoadHive ( - _In_ PBL_FILE_PATH_DESCRIPTOR FilePath, - _Out_ PHANDLE HiveHandle - ); - -NTSTATUS -BiGetRegistryValue ( - _In_ HANDLE KeyHandle, - _In_ PWCHAR ValueName, - _In_ ULONG Type, - _Out_ PVOID* Buffer, - _Out_ PULONG ValueLength - ); - -NTSTATUS -BiEnumerateSubKeys ( - _In_ HANDLE KeyHandle, - _Out_ PWCHAR** SubKeyList, - _Out_ PULONG SubKeyCount - ); - -NTSTATUS -BiDeleteKey ( - _In_ HANDLE KeyHandle - ); - -VOID -BiDereferenceHive ( - _In_ HANDLE KeyHandle - ); - -/* CONTEXT ROUTINES **********************************************************/ - -VOID -BlpArchSwitchContext ( - _In_ BL_ARCH_MODE NewMode - ); - -VOID -BlpArchEnableTranslation ( - VOID - ); - -VOID -Archx86TransferTo32BitApplicationAsm ( - VOID - ); - -/* MEMORY DESCRIPTOR ROUTINES ************************************************/ - -VOID -MmMdDbgDumpList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList, - _In_opt_ ULONG MaxCount -); - -VOID -MmMdInitializeList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList, - _In_ ULONG Type, - _In_ PLIST_ENTRY ListHead - ); - -PBL_MEMORY_DESCRIPTOR -MmMdFindDescriptor ( - _In_ ULONG WhichList, - _In_ ULONG Flags, - _In_ ULONGLONG Page - ); - -PBL_MEMORY_DESCRIPTOR -MmMdFindDescriptorFromMdl ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ ULONG Flags, - _In_ ULONGLONG Page - ); - -NTSTATUS -MmMdCopyList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST DestinationList, - _In_ PBL_MEMORY_DESCRIPTOR_LIST SourceList, - _In_opt_ PBL_MEMORY_DESCRIPTOR ListDescriptor, - _Out_ PULONG ActualCount, - _In_ ULONG Count, - _In_ ULONG Flags - ); - -ULONG -MmMdCountList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList - ); - -VOID -MmMdFreeList( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList - ); - -PBL_MEMORY_DESCRIPTOR -MmMdInitByteGranularDescriptor ( - _In_ ULONG Flags, - _In_ BL_MEMORY_TYPE Type, - _In_ ULONGLONG BasePage, - _In_ ULONGLONG VirtualPage, - _In_ ULONGLONG PageCount - ); - -VOID -MmMdFreeGlobalDescriptors ( - VOID - ); - -NTSTATUS -MmMdAddDescriptorToList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, - _In_ ULONG Flags - ); - -NTSTATUS -MmMdTruncateDescriptors ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _In_ ULONGLONG BasePage - ); - -VOID -MmMdRemoveDescriptorFromList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR Entry - ); - -BOOLEAN -MmMdFindSatisfyingRegion ( - _In_ PBL_MEMORY_DESCRIPTOR Descriptor, - _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor, - _In_ ULONGLONG Pages, - _In_ PBL_ADDRESS_RANGE BaseRange, - _In_ PBL_ADDRESS_RANGE VirtualRange, - _In_ BOOLEAN TopDown, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONG Flags, - _In_ ULONG Alignment - ); - -NTSTATUS -MmMdRemoveRegionFromMdlEx ( - __in PBL_MEMORY_DESCRIPTOR_LIST MdList, - __in ULONG Flags, - __in ULONGLONG BasePage, - __in ULONGLONG PageCount, - __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList - ); - -NTSTATUS -MmMdFreeDescriptor ( - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor - ); - -/* PAGE ALLOCATOR ROUTINES ***************************************************/ - -NTSTATUS -MmPaTruncateMemory ( - _In_ ULONGLONG BasePage - ); - -NTSTATUS -BlMmAllocatePhysicalPages( - _Inout_ PPHYSICAL_ADDRESS Address, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG PageCount, - _In_ ULONG Attributes, - _In_ ULONG Alignment - ); - -NTSTATUS -MmPapAllocatePhysicalPagesInRange ( - _Inout_ PPHYSICAL_ADDRESS BaseAddress, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG Pages, - _In_ ULONG Attributes, - _In_ ULONG Alignment, - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _In_opt_ PBL_ADDRESS_RANGE Range, - _In_ ULONG RangeType - ); - -NTSTATUS -MmPaReleaseSelfMapPages ( - _In_ PHYSICAL_ADDRESS Address - ); - -NTSTATUS -MmPaReserveSelfMapPages ( - _Inout_ PPHYSICAL_ADDRESS PhysicalAddress, - _In_ ULONG Alignment, - _In_ ULONG PageCount - ); - -NTSTATUS -BlMmFreePhysicalPages ( - _In_ PHYSICAL_ADDRESS Address - ); - -NTSTATUS -MmPapFreePages ( - _In_ PVOID Address, - _In_ ULONG WhichList - ); - -NTSTATUS -MmPapAllocatePagesInRange ( - _Inout_ PVOID* PhysicalAddress, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG Pages, - _In_ ULONG Attributes, - _In_ ULONG Alignment, - _In_opt_ PBL_ADDRESS_RANGE Range, - _In_ ULONG Type - ); - -NTSTATUS -MmFwGetMemoryMap ( - _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap, - _In_ ULONG Flags - ); - -NTSTATUS -BlpMmInitializeConstraints ( - VOID - ); - -NTSTATUS -BlMmRemoveBadMemory ( - VOID - ); - -NTSTATUS -BlMmGetMemoryMap ( - _In_ PLIST_ENTRY MemoryMap, - _In_ PBL_BUFFER_DESCRIPTOR MemoryParameters, - _In_ ULONG WhichTypes, - _In_ ULONG Flags - ); - -/* VIRTUAL MEMORY ROUTINES ***************************************************/ - -NTSTATUS -MmSelectMappingAddress ( - _Out_ PVOID* MappingAddress, - _In_ PVOID PreferredAddress, - _In_ ULONGLONG Size, - _In_ ULONG AllocationAttributes, - _In_ ULONG Flags, - _In_ PHYSICAL_ADDRESS PhysicalAddress - ); - -NTSTATUS -MmMapPhysicalAddress ( - _Inout_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_ PVOID* VirtualAddress, - _Inout_ PULONGLONG Size, - _In_ ULONG CacheAttributes - ); - -NTSTATUS -MmUnmapVirtualAddress ( - _Inout_ PVOID* VirtualAddress, - _Inout_ PULONGLONG Size - ); - -NTSTATUS -BlMmMapPhysicalAddressEx ( - _In_ PVOID* VirtualAddress, - _In_ ULONG Attributes, - _In_ ULONGLONG Size, - _In_ PHYSICAL_ADDRESS PhysicalAddress - ); - -NTSTATUS -BlMmUnmapVirtualAddressEx ( - _In_ PVOID VirtualAddress, - _In_ ULONGLONG Size - ); - -BOOLEAN -BlMmTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_ PPHYSICAL_ADDRESS PhysicalAddress - ); - -BOOLEAN -MmArchTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_opt_ PULONG CachingFlags - ); - -/* BLOCK ALLOCATOR ROUTINES **************************************************/ - -NTSTATUS -BlpMmCreateBlockAllocator ( - VOID - ); - -/* HEAP ALLOCATOR ROUTINES ***************************************************/ - -PVOID -BlMmAllocateHeap ( - _In_ SIZE_T Size - ); - -NTSTATUS -BlMmFreeHeap ( - _In_ PVOID Buffer - ); - -/* DISPLAY ROUTINES **********************************************************/ - -VOID -BlDisplayGetTextCellResolution ( - _Out_ PULONG TextWidth, - _Out_ PULONG TextHeight - ); - -NTSTATUS -BlDisplaySetScreenResolution ( - VOID - ); - -NTSTATUS -BlDisplayGetScreenResolution ( - _Out_ PULONG HRes, - _Out_ PULONG Vres - ); - -VOID -BlDisplayInvalidateOemBitmap ( - VOID - ); - -PBITMAP -BlDisplayGetOemBitmap ( - _Out_ PCOORD Offset, - _Out_opt_ PULONG Flags - ); - -BOOLEAN -BlDisplayValidOemBitmap ( - VOID - ); - -NTSTATUS -BlDisplayClearScreen ( - VOID - ); - -NTSTATUS -BlDisplaySetCursorType ( - _In_ ULONG Type - ); - -/* I/O ROUTINES **************************************************************/ - -NTSTATUS -BlpIoRegisterDestroyRoutine ( - _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine - ); - -NTSTATUS -BlDeviceClose ( - _In_ ULONG DeviceId - ); - -BOOLEAN -BlDeviceIsVirtualPartitionDevice ( - _In_ PBL_DEVICE_DESCRIPTOR InputDevice, - _Outptr_ PBL_DEVICE_DESCRIPTOR* VirtualDevice - ); - -NTSTATUS -BlpDeviceOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ ULONG Flags, - _In_ ULONG Unknown, - _Out_ PULONG DeviceId - ); - -NTSTATUS -BlDeviceGetInformation ( - _In_ ULONG DeviceId, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ); - -NTSTATUS -BlDeviceSetInformation ( - _In_ ULONG DeviceId, - _In_ PBL_DEVICE_INFORMATION DeviceInformation - ); - -NTSTATUS -BlDeviceReadAtOffset ( - _In_ ULONG DeviceId, - _In_ ULONG Size, - _In_ ULONGLONG Offset, - _In_ PVOID Buffer, - _Out_ PULONG BytesRead - ); - -/* IMAGE ROUTINES ************************************************************/ - -NTSTATUS -BlImgLoadImageWithProgress2 ( - _In_ ULONG DeviceId, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ PWCHAR FileName, - _Inout_ PVOID* MappedBase, - _Inout_ PULONG MappedSize, - _In_ ULONG ImageFlags, - _In_ BOOLEAN ShowProgress, - _Out_opt_ PUCHAR* HashBuffer, - _Out_opt_ PULONG HashSize - ); - -PIMAGE_SECTION_HEADER -BlImgFindSection ( - _In_ PVOID ImageBase, - _In_ ULONG ImageSize - ); - -NTSTATUS -BlImgLoadBootApplication ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PULONG AppHandle - ); - -NTSTATUS -BlImgStartBootApplication ( - _In_ ULONG AppHandle, - _Inout_ PBL_RETURN_ARGUMENTS ReturnArguments - ); - -NTSTATUS -BlImgUnloadBootApplication ( - _In_ ULONG AppHandle - ); - -VOID -BlImgQueryCodeIntegrityBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY ApplicationEntry, - _Out_ PBOOLEAN IntegrityChecksDisabled, - _Out_ PBOOLEAN TestSigning - ); - -/* FILE I/O ROUTINES *********************************************************/ - -NTSTATUS -BlFileClose ( - _In_ ULONG FileId - ); - -NTSTATUS -BlFileReadAtOffsetEx ( - _In_ ULONG FileId, - _In_ ULONG Size, - _In_ ULONGLONG ByteOffset, - _In_ PVOID Buffer, - _Out_ PULONG BytesReturned, - _In_ ULONG Flags - ); - -NTSTATUS -BlFileGetInformation ( - _In_ ULONG FileId, - _In_ PBL_FILE_INFORMATION FileInfo - ); - -NTSTATUS -BlFileOpen ( - _In_ ULONG DeviceId, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ PULONG FileId - ); - -/* BLOCK I/O ROUTINES *******************************************************/ - -NTSTATUS -BlockIoEfiCompareDevice ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ EFI_HANDLE Handle - ); - -/* INPUT CONSOLE ROUTINES ****************************************************/ - -VOID -ConsoleInputLocalDestruct ( - _In_ struct _BL_INPUT_CONSOLE* Console - ); - -NTSTATUS -ConsoleInputBaseReinitialize ( - _In_ struct _BL_INPUT_CONSOLE* Console - ); - -NTSTATUS -ConsoleCreateLocalInputCnsole ( - VOID - ); - -/* TEXT CONSOLE ROUTINES *****************************************************/ - -VOID -ConsoleGraphicalDestruct ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console - ); - -NTSTATUS -ConsoleGraphicalClearText ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ BOOLEAN LineOnly - ); - -NTSTATUS -ConsoleGraphicalClearPixels ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Color - ); - -NTSTATUS -ConsoleGraphicalReinitialize ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console - ); - -NTSTATUS -ConsoleGraphicalSetTextState ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Mask, - _In_ PBL_DISPLAY_STATE TextState - ); - -BOOLEAN -ConsoleGraphicalIsEnabled ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console - ); - -NTSTATUS -ConsoleGraphicalGetGraphicalResolution ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _In_ PBL_DISPLAY_MODE DisplayMode - ); - -NTSTATUS -ConsoleGraphicalGetOriginalResolution ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _In_ PBL_DISPLAY_MODE DisplayMode - ); - -NTSTATUS -ConsoleGraphicalEnable ( - _In_ struct _BL_GRAPHICS_CONSOLE* Console, - _In_ BOOLEAN Enable - ); - -VOID -ConsoleTextLocalDestruct ( - _In_ struct _BL_TEXT_CONSOLE* Console - ); - -NTSTATUS -ConsoleTextLocalReinitialize ( - _In_ struct _BL_TEXT_CONSOLE* Console - ); - -NTSTATUS -ConsoleTextBaseGetTextState ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ PBL_DISPLAY_STATE TextState - ); - -NTSTATUS -ConsoleTextLocalSetTextState ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG Flags, - _In_ PBL_DISPLAY_STATE TextState - ); - -NTSTATUS -ConsoleTextBaseGetTextResolution ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ PULONG TextResolution - ); - -NTSTATUS -ConsoleTextLocalSetTextResolution ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG NewTextResolution, - _Out_ PULONG OldTextResolution - ); - -NTSTATUS -ConsoleTextLocalClearText ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ BOOLEAN LineOnly - ); - -NTSTATUS -ConsoleTextLocalWriteText ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ PCHAR Text, - _In_ ULONG Attribute - ); - -NTSTATUS -ConsoleTextLocalConstruct ( - _In_ PBL_TEXT_CONSOLE TextConsole, - _In_ BOOLEAN Activate - ); - -BOOLEAN -ConsolepFindResolution ( - _In_ PBL_DISPLAY_MODE Mode, - _In_ PBL_DISPLAY_MODE List, - _In_ ULONG MaxIndex - ); - -NTSTATUS -ConsoleFirmwareTextClear ( - _In_ PBL_TEXT_CONSOLE Console, - _In_ BOOLEAN LineOnly - ); - -VOID -ConsoleFirmwareTextClose ( - _In_ PBL_TEXT_CONSOLE TextConsole - ); - -NTSTATUS -ConsoleFirmwareTextOpen ( - _In_ PBL_TEXT_CONSOLE TextConsole - ); - -NTSTATUS -ConsoleFirmwareTextSetState ( - _In_ PBL_TEXT_CONSOLE TextConsole, - _In_ UCHAR Mask, - _In_ PBL_DISPLAY_STATE State - ); - -NTSTATUS -ConsoleGraphicalConstruct ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleCreateRemoteConsole ( - _In_ PBL_TEXT_CONSOLE* TextConsole - ); - -NTSTATUS -ConsoleEfiGraphicalOpenProtocol ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole, - _In_ BL_GRAPHICS_CONSOLE_TYPE Type - ); - -VOID -ConsoleFirmwareGraphicalClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -VOID -ConsoleFirmwareGraphicalDisable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleFirmwareGraphicalClear ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Color - ); - -NTSTATUS -ConsoleFirmwareGraphicalEnable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleEfiUgaOpen ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -VOID -ConsoleEfiUgaClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -VOID -ConsoleEfiGopClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleEfiGopOpen ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleEfiGopEnable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ); - -NTSTATUS -ConsoleEfiUgaSetResolution ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole, - _In_ PBL_DISPLAY_MODE DisplayMode, - _In_ ULONG DisplayModeCount - ); - -NTSTATUS -ConsoleCreateLocalInputConsole ( - VOID - ); - -NTSTATUS -ConsoleInputLocalEraseBuffer ( - _In_ PBL_INPUT_CONSOLE Console, - _In_opt_ PULONG ValueToFill - ); - -VOID -ConsolepClearBuffer ( - _In_ PUCHAR FrameBuffer, - _In_ ULONG Width, - _In_ PUCHAR FillColor, - _In_ ULONG Height, - _In_ ULONG ScanlineWidth, - _In_ ULONG PixelDepth - ); - -NTSTATUS -ConsolepConvertColorToPixel ( - _In_ BL_COLOR Color, - _Out_ PUCHAR Pixel - ); - -extern ULONG MmDescriptorCallTreeCount; -extern ULONG BlpApplicationFlags; -extern BL_LIBRARY_PARAMETERS BlpLibraryParameters; -extern BL_TRANSLATION_TYPE MmTranslationType; -extern PBL_ARCH_CONTEXT CurrentExecutionContext; -extern PBL_DEVICE_DESCRIPTOR BlpBootDevice; -extern BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry; -extern EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *EfiConOut; -extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *EfiConInEx; -extern EFI_GUID EfiGraphicsOutputProtocol; -extern EFI_GUID EfiUgaDrawProtocol; -extern EFI_GUID EfiLoadedImageProtocol; -extern EFI_GUID EfiDevicePathProtocol; -extern EFI_GUID EfiBlockIoProtocol; -extern EFI_GUID EfiSimpleTextInputExProtocol; -extern EFI_GUID EfiRootAcpiTableGuid; -extern EFI_GUID EfiRootAcpiTable10Guid; -extern EFI_GUID EfiGlobalVariable; -extern ULONG ConsoleGraphicalResolutionListFlags; -extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList[]; -extern BL_DISPLAY_MODE ConsoleTextResolutionList[]; -extern ULONG ConsoleGraphicalResolutionListSize; -extern PVOID DspRemoteInputConsole; -extern PVOID DspLocalInputConsole; -extern WCHAR BlScratchBuffer[8192]; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedAllocated; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedUnallocated; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFwAllocationTracker; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedAllocated; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedUnallocated; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlBadMemory; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlTruncatedMemory; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlPersistentMemory; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlCompleteBadMemory; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual; -extern BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers; -extern ULONGLONG BlpTimePerformanceFrequency; -extern LIST_ENTRY RegisteredFileSystems; -extern BL_ADDRESS_RANGE MmArchKsegAddressRange; -extern ULONG_PTR MmArchTopOfApplicationAddressSpace; -extern PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap; -extern PBL_MM_FLUSH_TLB BlMmFlushTlb; -extern PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE BlMmMoveVirtualAddressRange; -extern PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE BlMmZeroVirtualAddressRange; -extern PBL_STATUS_ERROR_HANDLER BlpStatusErrorHandler; - -#endif diff --git a/boot/environ/lib/arch/i386/arch.c b/boot/environ/lib/arch/i386/arch.c deleted file mode 100644 index de5c0e2ccae..00000000000 --- a/boot/environ/lib/arch/i386/arch.c +++ /dev/null @@ -1,305 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/arch/i386/arch.c - * PURPOSE: Boot Library Architectural Initialization for i386 - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -BL_ARCH_CONTEXT FirmwareExecutionContext; -BL_ARCH_CONTEXT ApplicationExecutionContext; -PBL_ARCH_CONTEXT CurrentExecutionContext; - -/* FUNCTIONS *****************************************************************/ - -VOID -DECLSPEC_NORETURN -ArchTrapNoProcess ( - VOID - ) -{ - /* Do nothing, this is an unsupported debugging interrupt */ -#if defined(__GNUC__) - __asm__ __volatile__ ("iret"); -#elif defined (_MSC_VER) - _asm { iret }; -#else -#error wtf are you using -#endif - __assume(0); -} - -VOID -ArchSwitchContext ( - _In_ PBL_ARCH_CONTEXT NewContext, - _In_ PBL_ARCH_CONTEXT OldContext - ) -{ - /* Are we switching to real mode? */ - if (NewContext->Mode == BlRealMode) - { - /* Disable paging */ - __writecr0(__readcr0() & ~CR0_PG); - - /* Are we coming from PAE mode? */ - if ((OldContext != NULL) && (OldContext->TranslationType == BlPae)) - { - /* Turn off PAE */ - __writecr4(__readcr4() & ~CR4_PAE); - } - - /* Enable interrupts */ - _enable(); - } - else - { - /* Switching to protected mode -- disable interrupts if needed */ - if (!(NewContext->ContextFlags & BL_CONTEXT_INTERRUPTS_ON)) - { - _disable(); - } - - /* Are we enabling paging for the first time? */ - if (NewContext->ContextFlags & BL_CONTEXT_PAGING_ON) - { - /* In PAE mode? */ - if (NewContext->TranslationType == BlPae) - { - /* Turn on PAE */ - __writecr4(__readcr4() | CR4_PAE); - } - - /* Turn on paging */ - __writecr0(__readcr0() | CR0_PG); - } - } -} - -NTSTATUS -ArchInitializeContext ( - _In_ PBL_ARCH_CONTEXT Context - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - - /* Are we initializing real mode? */ - if (Context->Mode == BlRealMode) - { - /* Disable paging, enable interrupts */ - Context->ContextFlags &= ~BL_CONTEXT_PAGING_ON; - Context->ContextFlags |= BL_CONTEXT_INTERRUPTS_ON; - } - else if (!(BlpApplicationFlags & BL_APPLICATION_FLAG_CONVERTED_FROM_EFI) || - (BlpLibraryParameters.TranslationType != BlNone)) - { - /* Read the current translation type */ - Context->TranslationType = BlpLibraryParameters.TranslationType; - - /* Disable paging (it's already on), enable interrupts */ - Context->ContextFlags &= ~BL_CONTEXT_PAGING_ON; - Context->ContextFlags |= BL_CONTEXT_INTERRUPTS_ON; - - /* Enable FXSR support in the FPU */ - __writecr4(__readcr4() | CR4_FXSR); - } - else - { - /* Invalid context */ - Status = STATUS_NOT_SUPPORTED; - } - - /* Return context status */ - return Status; -} - -NTSTATUS -ArchInitializeContexts ( - VOID - ) -{ - PBL_ARCH_CONTEXT Context = NULL; - NTSTATUS EfiStatus, AppStatus; - - /* No current context */ - CurrentExecutionContext = NULL; - - /* Setup the EFI and Application modes respectively */ - FirmwareExecutionContext.Mode = BlRealMode; - ApplicationExecutionContext.Mode = BlProtectedMode; - - /* Initialize application mode */ - AppStatus = ArchInitializeContext(&ApplicationExecutionContext); - if (NT_SUCCESS(AppStatus)) - { - /* Set it as current if it worked */ - Context = &ApplicationExecutionContext; - CurrentExecutionContext = &ApplicationExecutionContext; - } - - /* Initialize EFI mode */ - EfiStatus = ArchInitializeContext(&FirmwareExecutionContext); - if (NT_SUCCESS(EfiStatus)) - { - /* Set it as current if application context failed */ - if (!NT_SUCCESS(AppStatus)) - { - Context = &FirmwareExecutionContext; - CurrentExecutionContext = &FirmwareExecutionContext; - } - - /* Switch to application mode, or EFI if that one failed */ - ArchSwitchContext(Context, NULL); - EfiStatus = STATUS_SUCCESS; - } - - /* Return initialization state */ - return EfiStatus; -} - -VOID -BlpArchSwitchContext ( - _In_ BL_ARCH_MODE NewMode - ) -{ - PBL_ARCH_CONTEXT Context; - - /* In real mode, use EFI, otherwise, use the application mode */ - Context = &FirmwareExecutionContext; - if (NewMode != BlRealMode) - { - Context = &ApplicationExecutionContext; - } - - /* Are we in a different mode? */ - if (CurrentExecutionContext->Mode != NewMode) - { - /* Switch to the new one */ - ArchSwitchContext(Context, CurrentExecutionContext); - CurrentExecutionContext = Context; - } -} - -VOID -BlpArchEnableTranslation ( - VOID - ) -{ - PBL_ARCH_CONTEXT Context; - - /* Does the current execution context already have paging enabled? */ - Context = CurrentExecutionContext; - if (!(Context->ContextFlags & BL_CONTEXT_PAGING_ON)) - { - /* No -- does it have interrupts enabled? */ - if (Context->ContextFlags & BL_CONTEXT_INTERRUPTS_ON) - { - /* Disable them */ - _disable(); - Context->ContextFlags &= ~BL_CONTEXT_INTERRUPTS_ON; - } - - /* Are we enabling PAE? */ - if (Context->TranslationType == BlPae) - { - /* Make sure CR4 reflects this */ - __writecr4(__readcr4() | CR4_PAE); - } - - /* Enable paging in the CPU */ - __writecr0(__readcr0() | CR0_PG); - - /* Reflect that paging is enabled */ - Context->ContextFlags |= BL_CONTEXT_PAGING_ON; - } -} - -/*++ -* @name BlpArchInitialize -* -* The BlpArchInitialize function initializes the Boot Library. -* -* @param Phase -* Pointer to the Boot Application Parameter Block. -* -* @return NT_SUCCESS if the boot library was loaded correctly, relevant error -* otherwise. -* -*--*/ -NTSTATUS -BlpArchInitialize ( - _In_ ULONG Phase - ) -{ - KDESCRIPTOR Idtr; - USHORT CodeSegment; - NTSTATUS Status; - PKIDTENTRY IdtBase; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Is this phase 1? */ - if (Phase != 0) - { - /* Get the IDT */ - __sidt(&Idtr); - IdtBase = (PKIDTENTRY)Idtr.Base; - - /* Get the Code Segment */ -#if defined(__GNUC__) - __asm__ __volatile__ ("mov %%cs,%0\n\t" :"=r" (CodeSegment)); -#elif defined (_MSC_VER) - _asm { mov CodeSegment, cs }; -#else -#error wtf are you using -#endif - - /* Set up INT 3, ASSERT, and SECURITY_ASSERT to be no-op (for Rtl) */ - IdtBase[3].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess; - IdtBase[3].Selector = CodeSegment; - IdtBase[3].Access = 0x8E00u; - IdtBase[3].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16; - IdtBase[0x2C].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess; - IdtBase[0x2C].Selector = CodeSegment; - IdtBase[0x2C].Access = 0x8E00u; - IdtBase[0x2C].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16; - IdtBase[0x2D].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess; - IdtBase[0x2D].Selector = CodeSegment; - IdtBase[0x2D].Access = 0x8E00u; - IdtBase[0x2D].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16; - - /* Write the IDT back */ - Idtr.Base = (ULONG)IdtBase; - __lidt(&Idtr); - - /* Reset FPU state */ -#if defined(__GNUC__) - __asm__ __volatile__ ("fninit"); -#elif defined (_MSC_VER) - _asm { fninit }; -#else -#error wtf are you using -#endif - } - else - { - /* Reset TSC if needed */ - if ((__readmsr(0x10) >> 32) & 0xFFC00000) - { - __writemsr(0x10, 0); - } - - /* Initialize all the contexts */ - Status = ArchInitializeContexts(); - } - - /* Return initialization state */ - return Status; -} - diff --git a/boot/environ/lib/arch/i386/transfer.s b/boot/environ/lib/arch/i386/transfer.s deleted file mode 100644 index 4bf9ef5782a..00000000000 --- a/boot/environ/lib/arch/i386/transfer.s +++ /dev/null @@ -1,81 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/arch/transfer.asm - * PURPOSE: Boot Library i386 Transfer Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include -#include - -EXTERN _GdtRegister:FWORD -EXTERN _IdtRegister:FWORD -EXTERN _BootAppGdtRegister:FWORD -EXTERN _BootAppIdtRegister:FWORD -EXTERN _BootApp32Stack:DWORD -EXTERN _BootApp32EntryRoutine:DWORD -EXTERN _BootApp32Parameters:DWORD - -/* FUNCTIONS ****************************************************************/ -.code - -PUBLIC _Archx86TransferTo32BitApplicationAsm -_Archx86TransferTo32BitApplicationAsm: - - /* Save non-volatile registers */ - push ebp - push esi - push edi - push ebx - - /* Save data segments */ - push es - push ds - - /* Save the old stack */ - mov ebx, esp - - /* Save current GDT/IDT, then load new one */ - sgdt _GdtRegister+2 - sidt _IdtRegister+2 - lgdt _BootAppGdtRegister+2 - lidt _BootAppIdtRegister+2 - - /* Load the new stack */ - xor ebp, ebp - mov esp, _BootApp32Stack - - /* Push old stack onto new stack */ - push ebx - - /* Call the entry routine, passing the parameters */ - mov eax, _BootApp32Parameters - push eax - mov eax, _BootApp32EntryRoutine - call eax - - /* Retore old stack */ - pop ebx - mov esp, ebx - - /* Restore old GDT/IDT */ - lgdt _GdtRegister+2 - lidt _IdtRegister+2 - - /* Retore old segments */ - pop ds - pop es - - /* Retore non-volatiles */ - pop ebx - pop edi - pop esi - pop ebp - - /* All done */ - ret - -END diff --git a/boot/environ/lib/arch/stub/arch.c b/boot/environ/lib/arch/stub/arch.c deleted file mode 100644 index 31c96e79945..00000000000 --- a/boot/environ/lib/arch/stub/arch.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/arch/stub/arch.c - * PURPOSE: Boot Library Architectural Initialization Skeleton Code - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PBL_ARCH_CONTEXT CurrentExecutionContext; -PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap; -PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE BlMmMoveVirtualAddressRange; -PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE BlMmZeroVirtualAddressRange; - -/* FUNCTIONS *****************************************************************/ - -VOID -BlpArchSwitchContext ( - _In_ BL_ARCH_MODE NewMode - ) -{ -} - -/*++ -* @name BlpArchInitialize -* -* The BlpArchInitialize function initializes the Boot Library. -* -* @param Phase -* Pointer to the Boot Application Parameter Block. -* -* @return NT_SUCCESS if the boot library was loaded correctly, relevant error -* otherwise. -* -*--*/ -NTSTATUS -BlpArchInitialize ( - _In_ ULONG Phase - ) -{ - EfiPrintf(L" BlpArchInitialize NOT IMPLEMENTED for this platform\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -VOID -Archx86TransferTo32BitApplicationAsm (VOID) -{ - EfiPrintf(L" Archx86TransferTo32BitApplicationAsm NOT IMPLEMENTED for this platform\r\n"); -} - -NTSTATUS -OslArchTransferToKernel( - _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - _In_ PVOID KernelEntrypoint - ) -{ - EfiPrintf(L" OslArchTransferToKernel NOT IMPLEMENTED for this platform\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - diff --git a/boot/environ/lib/bd/.keep b/boot/environ/lib/bd/.keep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/boot/environ/lib/bootlib.c b/boot/environ/lib/bootlib.c deleted file mode 100644 index 11ab756a481..00000000000 --- a/boot/environ/lib/bootlib.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/bootlib.c - * PURPOSE: Boot Library Initialization - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -BL_LIBRARY_PARAMETERS BlpLibraryParameters; -PBL_DEVICE_DESCRIPTOR BlpBootDevice; -PWCHAR BlpApplicationBaseDirectory; -PBOOT_APPLICATION_PARAMETER_BLOCK BlpApplicationParameters; -BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry; -BOOLEAN BlpLibraryParametersInitialized; -ULONG BlpApplicationFlags; - -ULONG PdPersistAllocations; -LIST_ENTRY BlpPdListHead; - -/* FUNCTIONS *****************************************************************/ - -/*++ - * @name InitializeLibrary - * - * The InitializeLibrary function initializes the Boot Library. - * - * @param BootParameters - * Pointer to the Boot Application Parameter Block. - * - * @param LibraryParameters - * Pointer to the Boot Library Parameters. - * - * @return NT_SUCCESS if the boot library was loaded correctly, relevant error - * otherwise. - * - *--*/ -NTSTATUS -InitializeLibrary ( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ) -{ - NTSTATUS Status; - PBL_MEMORY_DATA MemoryData; - PBL_APPLICATION_ENTRY AppEntry; - PBL_FIRMWARE_DESCRIPTOR FirmwareDescriptor; - LARGE_INTEGER BootFrequency; - ULONG_PTR ParamPointer; - - /* Validate correct Boot Application data */ - ParamPointer = (ULONG_PTR)BootAppParameters; - if (!(BootAppParameters) || - (BootAppParameters->Signature[0] != BOOT_APPLICATION_SIGNATURE_1) || - (BootAppParameters->Signature[1] != BOOT_APPLICATION_SIGNATURE_2) || - (BootAppParameters->Size < sizeof(*BootAppParameters))) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Get sub-structures */ - MemoryData = (PBL_MEMORY_DATA)(ParamPointer + BootAppParameters->MemoryDataOffset); - FirmwareDescriptor = (PBL_FIRMWARE_DESCRIPTOR)(ParamPointer + BootAppParameters->FirmwareParametersOffset); - AppEntry = (PBL_APPLICATION_ENTRY)(ParamPointer + BootAppParameters->AppEntryOffset); - BlpBootDevice = (PBL_DEVICE_DESCRIPTOR)(ParamPointer + BootAppParameters->BootDeviceOffset); - BlpApplicationBaseDirectory = LibraryParameters->ApplicationBaseDirectory; - - /* Initialize the firmware table */ - Status = BlpFwInitialize(0, FirmwareDescriptor); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Find boot application entry */ - if (strncmp(AppEntry->Signature, BL_APP_ENTRY_SIGNATURE, 7)) - { - Status = STATUS_INVALID_PARAMETER_9; - goto Quickie; - } - - /* Read parameters */ - BlpApplicationParameters = BootAppParameters; - BlpLibraryParameters = *LibraryParameters; - - /* Check if the caller sent us their internal BCD options */ - if (AppEntry->Flags & BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL) - { - /* These are external to us now, as far as we are concerned */ - AppEntry->Flags &= ~BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL; - AppEntry->Flags |= BL_APPLICATION_ENTRY_BCD_OPTIONS_EXTERNAL; - } - - /* Save the application entry flags */ - BlpApplicationEntry.Flags = AppEntry->Flags; - - /* Copy the GUID and point to the options */ - BlpApplicationEntry.Guid = AppEntry->Guid; - BlpApplicationEntry.BcdData = &AppEntry->BcdData; - - /* Everything has been captured */ - BlpLibraryParametersInitialized = TRUE; - - /* Initialize the architecture (PM or RM) switching */ - Status = BlpArchInitialize(0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Initialize the memory manager */ - Status = BlpMmInitialize(MemoryData, - BootAppParameters->MemoryTranslationType, - LibraryParameters); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"MM init failed!\r\n"); - goto Quickie; - } - - /* Initialize firmware now that the heap, etc works */ - Status = BlpFwInitialize(1, FirmwareDescriptor); - if (!NT_SUCCESS(Status)) - { - /* Destroy memory manager in phase 1 */ - //BlpMmDestroy(1); - EfiPrintf(L"Firmware2 init failed!\r\n"); - return Status; - } - - /* Modern systems have an undocumented BCD system for the boot frequency */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - 0x15000075, - (PULONGLONG)&BootFrequency.QuadPart); - if (NT_SUCCESS(Status) && (BootFrequency.QuadPart)) - { - /* Use it if present */ - BlpTimePerformanceFrequency = BootFrequency.QuadPart; - } - else - { - /* Use the TSC for calibration */ - Status = BlpTimeCalibratePerformanceCounter(); - if (!NT_SUCCESS(Status)) - { - /* Destroy memory manager in phase 1 */ - EfiPrintf(L"TSC calibration failed\r\n"); - //BlpMmDestroy(1); - return Status; - } - } - - /* Now setup the rest of the architecture (IDT, etc) */ - Status = BlpArchInitialize(1); - if (!NT_SUCCESS(Status)) - { - /* Destroy memory manager in phase 1 */ - EfiPrintf(L"Arch2 init failed\r\n"); - //BlpMmDestroy(1); - return Status; - } - -#ifdef BL_TPM_SUPPORT - /* Initialize support for Trusted Platform Module v1.2 */ - BlpTpmInitialize(); -#endif - -#ifdef BL_TPM_SUPPORT - /* Initialize the event manager */ - EnSubsystemInitialized = 1; - InitializeListHead(&EnEventNotificationList); -#endif - - /* Initialize the I/O Manager */ - Status = BlpIoInitialize(); - if (!NT_SUCCESS(Status)) - { - /* Destroy memory manager in phase 1 and the event manager */ - EfiPrintf(L"IO init failed\r\n"); -#ifdef BL_TPM_SUPPORT - if (EnSubsystemInitialized) - { - BlpEnDestroy(); - } -#endif - //BlpMmDestroy(1); - return Status; - } - -#ifdef BL_NET_SUPPORT - /* Initialize the network stack */ - Status = BlNetInitialize(); - if (!NT_SUCCESS(Status)) - { - /* Destroy the I/O, event, and memory managers in phase 1 */ - BlpIoDestroy(); -#ifdef BL_TPM_SUPPORT - if (EnSubsystemInitialized) - { - BlpEnDestroy(); - } -#endif - BlpMmDestroy(1); - return Status; - } -#endif - - /* Initialize the utility library */ - Status = BlUtlInitialize(); - if (!NT_SUCCESS(Status)) - { - /* Destroy the network, I/O, event, and memory managers in phase 1 */ -#ifdef BL_NET_SUPPORT - BlNetDestroy(); -#endif - //BlpIoDestroy(); -#ifdef BL_TPM_SUPPORT - if (EnSubsystemInitialized) - { - BlpEnDestroy(); - } -#endif - //BlpMmDestroy(1); - EfiPrintf(L"Util init failed\r\n"); - return Status; - } - -#ifdef BL_KD_SUPPORT - /* Initialize PCI Platform Support */ - PltInitializePciConfiguration(); -#endif - -#ifdef BL_SECURE_BOOT_SUPPORT - /* Read the current SecureBoot Policy*/ - Status = BlSecureBootSetActivePolicyFromPersistedData(); - if (!NT_SUCCESS(Status)) - { - /* Destroy everything that we've currently set up */ -#ifdef BL_KD_SUPPORT - PltDestroyPciConfiguration(); -#endif -#ifdef BL_NET_SUPPORT - BlNetDestroy(); -#endif - BlpIoDestroy(); -#ifdef BL_TPM_SUPPORT - if (EnSubsystemInitialized) - { - BlpEnDestroy(); - } -#endif - BlpMmDestroy(1); - return Status; - } -#endif - -#ifdef BL_TPM_SUPPORT - /* Initialize phase 0 of the security subsystem */ - SipInitializePhase0(); -#endif - -#ifdef BL_KD_SUPPORT - /* Bring up the boot debugger, now that SecureBoot has been processed */ - BlBdInitialize(); -#endif - -#ifdef BL_ETW_SUPPORT - /* Initialize internal logging */ - BlpLogInitialize(); -#endif - - /* Are graphics enabled? */ - if (!(LibraryParameters->LibraryFlags & BL_LIBRARY_FLAG_NO_DISPLAY)) - { - /* Initialize the graphics library */ - BlpDisplayInitialize(LibraryParameters->LibraryFlags); - } - - /* Initialize the boot application persistent data */ - PdPersistAllocations = 0; - InitializeListHead(&BlpPdListHead); - -#ifdef BL_TPM_SUPPORT - /* Now setup the security subsystem in phase 1 */ - BlpSiInitialize(1); -#endif - - /* Setup the text, UI and font resources */ - Status = BlpResourceInitialize(); - if (!NT_SUCCESS(Status)) - { - /* Tear down everything if this failed */ - if (!(LibraryParameters->LibraryFlags & BL_LIBRARY_FLAG_NO_DISPLAY)) - { -// BlpDisplayDestroy(); - } -#ifdef BL_KD_SUPPORT - BlpBdDestroy(); - PltDestroyPciConfiguration(); -#endif -#ifdef BL_NET_SUPPORT - BlNetDestroy(); -#endif - //BlpIoDestroy(); -#ifdef BL_TPM_SUPPORT - if (EnSubsystemInitialized) - { - BlpEnDestroy(); - } -#endif - //BlpMmDestroy(1); - return Status; - } - -#if BL_BITLOCKER_SUPPORT - /* Setup the boot cryptography library */ - g_pEnvironmentData = &SymCryptEnvironmentWindowsBootLibrary; - if (SymCryptEnvWindowsBootLibInit) - { - SymCryptEnvWindowsBootLibInit(); - } -#endif - - /* We are fully initialized, remember this and exit with success */ - BlpLibraryParameters.LibraryFlags |= BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED; - Status = STATUS_SUCCESS; - -Quickie: - return Status; -} - -/*++ - * @name BlInitializeLibrary - * - * The BlInitializeLibrary function initializes, or re-initializes, the - * Boot Library. - * - * @param BootParameters - * Pointer to the Boot Application Parameter Block. - * - * @param LibraryParameters - * Pointer to the Boot Library Parameters. - * - * @return NT_SUCCESS if the boot library was loaded correctly, relevant error - * otherwise. - * - *--*/ -NTSTATUS -BlInitializeLibrary( - _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ) -{ - NTSTATUS Status; - - /* Are we re-initializing the library? */ - if (LibraryParameters->LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE) - { - /* From scratch? */ - BlpLibraryParameters = *LibraryParameters; - if (LibraryParameters->LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) - { -#ifdef BL_TPM_SUPPORT - /* Reinitialize the TPM security enclave as BCD hash changed */ - BlpSiInitialize(1); -#endif -#ifdef BL_KD_SUPPORT - /* Reinitialize the boot debugger as BCD debug options changed */ - BlBdInitialize(); -#endif - - /* Reparse the bad page list now that the BCD has been reloaded */ - BlMmRemoveBadMemory(); - - /* Reparse the low/high physical address limits as well */ - BlpMmInitializeConstraints(); - - /* Redraw the graphics console as needed */ - BlpDisplayInitialize(LibraryParameters->LibraryFlags); - - /* Reinitialize resources (language may have changed) */ - BlpResourceInitialize(); - } - - /* Nothing to do, we're done */ - Status = STATUS_SUCCESS; - } - else - { - /* Nope, this is first time initialization */ - Status = InitializeLibrary(BootAppParameters, LibraryParameters); - } - - /* Return initialization status */ - return Status; -} - -VOID -BlDestroyLibrary ( - VOID - ) -{ - EfiPrintf(L"Destroy not yet implemented\r\n"); - return; -} - -PGUID -BlGetApplicationIdentifier ( - VOID - ) -{ - /* Return the GUID, if one was present */ - return (BlpApplicationEntry.Flags & BL_APPLICATION_ENTRY_FLAG_NO_GUID) ? - NULL : &BlpApplicationEntry.Guid; -} - -NTSTATUS -BlGetApplicationBaseAndSize ( - _Out_ PVOID* ImageBase, - _Out_ PULONG ImageSize - ) -{ - /* Fail if output parameters are missing */ - if (!ImageBase || !ImageSize) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the requested data */ - *ImageBase = (PVOID)(ULONG_PTR)BlpApplicationParameters->ImageBase; - *ImageSize = BlpApplicationParameters->ImageSize; - return STATUS_SUCCESS; -} - -VOID -BlDestroyBootEntry ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry - ) -{ - /* Check if we had allocated BCD options */ - if (AppEntry->Flags & BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL) - { - BlMmFreeHeap(AppEntry->BcdData); - } - - /* Free the entry itself */ - BlMmFreeHeap(AppEntry); -} - -NTSTATUS -BlPdQueryData ( - _In_ const GUID* DataGuid, - _In_ PVOID Unknown, - _Inout_ PBL_PD_DATA_BLOB DataBlob - ) -{ - /* Check for invalid or missing parameters */ - if (!(DataBlob) || - !(DataGuid) || - ((DataBlob->BlobSize) && !(DataBlob->Data))) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if there's no persistent data blobs */ - if (IsListEmpty(&BlpPdListHead)) - { - return STATUS_NOT_FOUND; - } - - /* Not yet handled, TODO */ - EfiPrintf(L"Boot persistent data not yet implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} diff --git a/boot/environ/lib/firmware/efi/firmware.c b/boot/environ/lib/firmware/efi/firmware.c deleted file mode 100644 index 2fb9df0243c..00000000000 --- a/boot/environ/lib/firmware/efi/firmware.c +++ /dev/null @@ -1,2592 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/firmware/efi/firmware.c - * PURPOSE: Boot Library Firmware Initialization for EFI - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PBL_FIRMWARE_DESCRIPTOR EfiFirmwareParameters; -BL_FIRMWARE_DESCRIPTOR EfiFirmwareData; -EFI_HANDLE EfiImageHandle; -EFI_SYSTEM_TABLE* EfiSystemTable; - -EFI_SYSTEM_TABLE *EfiST; -EFI_BOOT_SERVICES *EfiBS; -EFI_RUNTIME_SERVICES *EfiRT; -EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *EfiConOut; -EFI_SIMPLE_TEXT_INPUT_PROTOCOL *EfiConIn; -EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *EfiConInEx; -PHYSICAL_ADDRESS EfiRsdt; - -EFI_GUID EfiGraphicsOutputProtocol = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; -EFI_GUID EfiUgaDrawProtocol = EFI_UGA_DRAW_PROTOCOL_GUID; -EFI_GUID EfiLoadedImageProtocol = EFI_LOADED_IMAGE_PROTOCOL_GUID; -EFI_GUID EfiDevicePathProtocol = EFI_DEVICE_PATH_PROTOCOL_GUID; -EFI_GUID EfiSimpleTextInputExProtocol = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID; -EFI_GUID EfiBlockIoProtocol = EFI_BLOCK_IO_PROTOCOL_GUID; -EFI_GUID EfiRootAcpiTableGuid = EFI_ACPI_20_TABLE_GUID; -EFI_GUID EfiRootAcpiTable10Guid = EFI_ACPI_TABLE_GUID; -EFI_GUID EfiGlobalVariable = EFI_GLOBAL_VARIABLE; -EFI_GUID BlpEfiSecureBootPrivateNamespace = { 0x77FA9ABD , 0x0359, 0x4D32, { 0xBD, 0x60, 0x28, 0xF4, 0xE7, 0x8F, 0x78, 0x4B } }; - -WCHAR BlScratchBuffer[8192]; - -BOOLEAN BlpFirmwareChecked; -BOOLEAN BlpFirmwareEnabled; - -/* FUNCTIONS *****************************************************************/ - -EFI_DEVICE_PATH * -EfiIsDevicePathParent ( - _In_ EFI_DEVICE_PATH *DevicePath1, - _In_ EFI_DEVICE_PATH *DevicePath2 - ) -{ - EFI_DEVICE_PATH* CurrentPath1; - EFI_DEVICE_PATH* CurrentPath2; - USHORT Length1, Length2; - - /* Start with the current nodes */ - CurrentPath1 = DevicePath1; - CurrentPath2 = DevicePath2; - - /* Loop each element of the device path */ - while (!(IsDevicePathEndType(CurrentPath1)) && - !(IsDevicePathEndType(CurrentPath2))) - { - /* Check if the element has a different length */ - Length1 = DevicePathNodeLength(CurrentPath1); - Length2 = DevicePathNodeLength(CurrentPath2); - if (Length1 != Length2) - { - /* Then they're not related */ - return NULL; - } - - /* Check if the rest of the element data matches */ - if (RtlCompareMemory(CurrentPath1, CurrentPath2, Length1) != Length1) - { - /* Nope, not related */ - return NULL; - } - - /* Move to the next element */ - CurrentPath1 = NextDevicePathNode(CurrentPath1); - CurrentPath2 = NextDevicePathNode(CurrentPath2); - } - - /* If the last element in path 1 is empty, then path 2 is the child (deeper) */ - if (!IsDevicePathEndType(CurrentPath1)) - { - return DevicePath2; - } - - /* If the last element in path 2 is empty, then path 1 is the child (deeper) */ - if (!IsDevicePathEndType(CurrentPath2)) - { - return DevicePath1; - } - - /* They're both the end, so they're identical, so there's no parent */ - return NULL; -} - -EFI_DEVICE_PATH* -EfiGetLeafNode ( - _In_ EFI_DEVICE_PATH *DevicePath - ) -{ - EFI_DEVICE_PATH *NextDevicePath; - - /* Make sure we're not already at the end */ - if (!IsDevicePathEndType(DevicePath)) - { - /* Grab the next node element, and keep going until the end */ - for (NextDevicePath = NextDevicePathNode(DevicePath); - !IsDevicePathEndType(NextDevicePath); - NextDevicePath = NextDevicePathNode(NextDevicePath)) - { - /* Save the current node we're at */ - DevicePath = NextDevicePath; - } - } - - /* This now contains the deepest (leaf) node */ - return DevicePath; -} - -VOID -EfiPrintf ( - _In_ PWCHAR Format, - ... - ) -{ - va_list args; - va_start(args, Format); - - /* Capture the buffer in our scratch pad, and NULL-terminate */ - vsnwprintf(BlScratchBuffer, RTL_NUMBER_OF(BlScratchBuffer) - 1, Format, args); - BlScratchBuffer[RTL_NUMBER_OF(BlScratchBuffer) - 1] = UNICODE_NULL; - - /* Check which mode we're in */ - if (CurrentExecutionContext->Mode == BlRealMode) - { - /* Call EFI directly */ - EfiConOut->OutputString(EfiConOut, BlScratchBuffer); - } - else - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - - /* Call EFI directly */ - if (EfiConOut != NULL) - { - EfiConOut->OutputString(EfiConOut, BlScratchBuffer); - } - - /* Switch back to protected mode */ - BlpArchSwitchContext(BlProtectedMode); - } - - /* All done */ - va_end(args); -} - -BOOLEAN EfiProtHashTableInitialized; -ULONG EfiProtHashTableId; - -typedef struct _BL_EFI_PROTOCOL -{ - LIST_ENTRY ListEntry; - EFI_GUID* Protocol; - PVOID Interface; - LONG ReferenceCount; - BOOLEAN AddressMapped; -} BL_EFI_PROTOCOL, *PBL_EFI_PROTOCOL; - -NTSTATUS -EfiVmOpenProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID* Protocol, - _Outptr_ PVOID* Interface - ) -{ - BOOLEAN AddressMapped; - PLIST_ENTRY HashList, NextEntry; - PHYSICAL_ADDRESS InterfaceAddress, TranslatedAddress; - NTSTATUS Status; - BL_HASH_ENTRY HashEntry; - PBL_HASH_VALUE HashValue; - PBL_EFI_PROTOCOL EfiProtocol; - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - PVOID InterfaceVa; - - /* Initialize failure paths */ - AddressMapped = FALSE; - HashList = NULL; - InterfaceAddress.QuadPart = 0; - - /* Have we initialized the protocol table yet? */ - if (!EfiProtHashTableInitialized) - { - /* Nope -- create the hash table */ - Status = BlHtCreate(0, NULL, NULL, &EfiProtHashTableId); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remember for next time */ - EfiProtHashTableInitialized = TRUE; - } - - /* Check if we already have a list of protocols for this handle */ - HashEntry.Flags = BL_HT_VALUE_IS_INLINE; - HashEntry.Size = sizeof(Handle); - HashEntry.Value = Handle; - Status = BlHtLookup(EfiProtHashTableId, &HashEntry, &HashValue); - if (NT_SUCCESS(Status)) - { - /* We do -- the hash value is the list itself */ - HashList = (PLIST_ENTRY)HashValue->Data; - NextEntry = HashList->Flink; - - /* Iterate over it */ - while (NextEntry != HashList) - { - /* Get each protocol in the list, checking for a match */ - EfiProtocol = CONTAINING_RECORD(NextEntry, - BL_EFI_PROTOCOL, - ListEntry); - if (EfiProtocol->Protocol == Protocol) - { - /* Match found -- add a reference and return it */ - EfiProtocol->ReferenceCount++; - *Interface = EfiProtocol->Interface; - return STATUS_SUCCESS; - } - - /* Try the next entry */ - NextEntry = NextEntry->Flink; - } - } - - /* Switch to real mode for firmware call */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(BlRealMode); - } - - /* Check if this is EFI 1.02 */ - if (EfiST->Hdr.Revision == EFI_1_02_SYSTEM_TABLE_REVISION) - { - /* Use the old call */ - EfiStatus = EfiBS->HandleProtocol(Handle, - Protocol, - (PVOID*)&InterfaceAddress); - } - else - { - /* Use the EFI 2.00 API instead */ - EfiStatus = EfiBS->OpenProtocol(Handle, - Protocol, - (PVOID*)&InterfaceAddress, - EfiImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - } - - /* Switch back to protected mode if needed */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Check the result, and bail out on failure */ - Status = EfiGetNtStatusCode(EfiStatus); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Check what address the interface lives at, and translate it */ - InterfaceVa = PhysicalAddressToPtr(InterfaceAddress); - if (BlMmTranslateVirtualAddress(InterfaceVa, &TranslatedAddress)) - { - /* We expect firmware to be 1:1 mapped, fail if not */ - if (InterfaceAddress.QuadPart != TranslatedAddress.QuadPart) - { - return STATUS_NOT_SUPPORTED; - } - } - else - { - /* Create a virtual (1:1) mapping for the interface */ - Status = BlMmMapPhysicalAddressEx(&InterfaceVa, - BlMemoryFixed, - PAGE_SIZE, - InterfaceAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remember for cleanup */ - AddressMapped = TRUE; - } - - /* The caller now has the interface */ - *Interface = InterfaceVa; - - /* Did we already have some protocols on this handle? */ - if (!HashList) - { - /* Nope, this is the first time -- so allocate the list */ - HashList = BlMmAllocateHeap(sizeof(*HashList)); - if (!HashList) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Initialize it */ - InitializeListHead(HashList); - - /* And then store it in the hash table for this handle */ - Status = BlHtStore(EfiProtHashTableId, - &HashEntry, - HashList, - sizeof(*HashList)); - if (!NT_SUCCESS(Status)) - { - BlMmFreeHeap(HashList); - goto Quickie; - } - } - - /* Finally, allocate a protocol tracker structure */ - EfiProtocol = BlMmAllocateHeap(sizeof(*EfiProtocol)); - if (!EfiProtocol) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* And store this information in case the protocol is needed again */ - EfiProtocol->Protocol = Protocol; - EfiProtocol->Interface = *Interface; - EfiProtocol->ReferenceCount = 1; - EfiProtocol->AddressMapped = AddressMapped; - InsertTailList(HashList, &EfiProtocol->ListEntry); - - /* Passthru to success case */ - AddressMapped = FALSE; - -Quickie: - /* Failure path -- did we map anything ?*/ - if (AddressMapped) - { - /* Get rid of it */ - BlMmUnmapVirtualAddressEx(InterfaceVa, PAGE_SIZE); - *Interface = NULL; - } - - /* Return the failure */ - return Status; -} - -NTSTATUS -EfiOpenProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID *Protocol, - _Outptr_ PVOID* Interface - ) -{ - EFI_STATUS EfiStatus; - NTSTATUS Status; - BL_ARCH_MODE OldMode; - - /* Are we using virtual memory/ */ - if (MmTranslationType != BlNone) - { - /* We need complex tracking to make this work */ - Status = EfiVmOpenProtocol(Handle, Protocol, Interface); - } - else - { - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Are we on legacy 1.02? */ - if (EfiST->FirmwareRevision == EFI_1_02_SYSTEM_TABLE_REVISION) - { - /* Make the legacy call */ - EfiStatus = EfiBS->HandleProtocol(Handle, Protocol, Interface); - } - else - { - /* Use the UEFI version */ - EfiStatus = EfiBS->OpenProtocol(Handle, - Protocol, - Interface, - EfiImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - } - - /* Convert the error to an NTSTATUS */ - Status = EfiGetNtStatusCode(EfiStatus); - } - - /* Clear the interface on failure, and return the status */ - if (!NT_SUCCESS(Status)) - { - *Interface = NULL; - } - - return Status; -} - -NTSTATUS -EfiVmpCloseProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID* Protocol - ) -{ - EFI_STATUS EfiStatus; - BL_ARCH_MODE OldMode; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Are we on legacy 1.02? */ - if (EfiST->FirmwareRevision == EFI_1_02_SYSTEM_TABLE_REVISION) - { - /* Nothing to close */ - EfiStatus = EFI_SUCCESS; - } - else - { - /* Use the UEFI version */ - EfiStatus = EfiBS->CloseProtocol(Handle, - Protocol, - EfiImageHandle, - NULL); - - /* Normalize not found as success */ - if (EfiStatus == EFI_NOT_FOUND) - { - EfiStatus = EFI_SUCCESS; - } - } - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert to NT status */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiVmpFreeInterfaceEntry ( - _In_ EFI_HANDLE Handle, - _In_ PBL_EFI_PROTOCOL EfiProtocol - ) -{ - NTSTATUS Status; - BL_HASH_ENTRY HashEntry; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Is this the last protocol on this handle? */ - if (IsListEmpty(&EfiProtocol->ListEntry)) - { - /* Delete the hash table entry for this handle */ - HashEntry.Value = Handle; - HashEntry.Size = sizeof(Handle); - HashEntry.Flags = BL_HT_VALUE_IS_INLINE; - Status = BlHtDelete(EfiProtHashTableId, &HashEntry); - - /* This will free the list head itself */ - BlMmFreeHeap(EfiProtocol->ListEntry.Flink); - } - else - { - /* Simply remove this entry */ - RemoveEntryList(&EfiProtocol->ListEntry); - } - - /* Had we virtually mapped this protocol? */ - if (EfiProtocol->AddressMapped) - { - /* Unmap it */ - BlMmUnmapVirtualAddressEx(EfiProtocol->Interface, PAGE_SIZE); - } - - /* Free the protocol entry, and return */ - BlMmFreeHeap(EfiProtocol); - return Status; -} - -NTSTATUS -EfiVmCloseProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID* Protocol - ) -{ - BL_HASH_ENTRY HashEntry; - PLIST_ENTRY ListHead, NextEntry; - NTSTATUS Status, CloseStatus; - PBL_HASH_VALUE HashValue; - PBL_EFI_PROTOCOL EfiProtocol; - - /* Lookup the list entry for this handle */ - HashEntry.Size = sizeof(Handle); - HashEntry.Flags = BL_HT_VALUE_IS_INLINE; - HashEntry.Value = Handle; - Status = BlHtLookup(EfiProtHashTableId, &HashEntry, &HashValue); - if (!NT_SUCCESS(Status)) - { - /* This handle was never used for any protocols */ - return STATUS_INVALID_PARAMETER; - } - - /* Iterate through the list of opened protocols */ - ListHead = (PLIST_ENTRY)HashValue->Data; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get this protocol entry and check for a match */ - EfiProtocol = CONTAINING_RECORD(NextEntry, BL_EFI_PROTOCOL, ListEntry); - if (EfiProtocol->Protocol == Protocol) - { - /* Drop a reference -- was it the last one? */ - if (EfiProtocol->ReferenceCount-- == 1) - { - /* Yep -- free this entry */ - Status = EfiVmpFreeInterfaceEntry(Handle, EfiProtocol); - - /* Call firmware to close the protocol */ - CloseStatus = EfiVmpCloseProtocol(Handle, Protocol); - if (!NT_SUCCESS(CloseStatus)) - { - /* Override free status if close was a failure */ - Status = CloseStatus; - } - - /* Return final status */ - return Status; - } - } - - /* Next entry */ - NextEntry = NextEntry->Flink; - } - - /* This protocol was never opened */ - return STATUS_INVALID_PARAMETER; -} - -NTSTATUS -EfiCloseProtocol ( - _In_ EFI_HANDLE Handle, - _In_ EFI_GUID *Protocol - ) -{ - EFI_STATUS EfiStatus; - NTSTATUS Status; - BL_ARCH_MODE OldMode; - - /* Are we using virtual memory/ */ - if (MmTranslationType != BlNone) - { - /* We need complex tracking to make this work */ - Status = EfiVmCloseProtocol(Handle, Protocol); - } - else - { - /* Are we on legacy 1.02? */ - if (EfiST->FirmwareRevision == EFI_1_02_SYSTEM_TABLE_REVISION) - { - /* Nothing to close */ - EfiStatus = EFI_SUCCESS; - } - else - { - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Use the UEFI version */ - EfiStatus = EfiBS->CloseProtocol(Handle, Protocol, EfiImageHandle, NULL); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Normalize not found as success */ - if (EfiStatus == EFI_NOT_FOUND) - { - EfiStatus = EFI_SUCCESS; - } - } - - /* Convert the error to an NTSTATUS */ - Status = EfiGetNtStatusCode(EfiStatus); - } - - /* All done */ - return Status; -} - -NTSTATUS -EfiGetVariable ( - _In_ PWCHAR VariableName, - _In_ EFI_GUID* VendorGuid, - _Out_opt_ PULONG Attributes, - _Inout_ PULONG DataSize, - _Out_ PVOID Data - ) -{ - EFI_STATUS EfiStatus; - NTSTATUS Status; - BL_ARCH_MODE OldMode; - ULONG LocalAttributes; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"getvar vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Call the runtime API */ - EfiStatus = EfiRT->GetVariable(VariableName, - VendorGuid, - (UINT32*)&LocalAttributes, - (UINTN*)DataSize, - Data); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Return attributes back to the caller if asked to */ - if (Attributes) - { - *Attributes = LocalAttributes; - } - - /* Convert the error to an NTSTATUS and return it */ - Status = EfiGetNtStatusCode(EfiStatus); - return Status; -} - -NTSTATUS -BlpSecureBootEFIIsEnabled ( - VOID - ) -{ - NTSTATUS Status; - BOOLEAN SetupMode, SecureBoot; - ULONG DataSize; - - /* Assume setup mode enabled, and no secure boot */ - SecureBoot = FALSE; - SetupMode = TRUE; - - /* Get the SetupMode variable */ - DataSize = sizeof(SetupMode); - Status = EfiGetVariable(L"SetupMode", - &EfiGlobalVariable, - NULL, - &DataSize, - &SetupMode); - if (NT_SUCCESS(Status)) - { - /* If it worked, get the SecureBoot variable */ - DataSize = sizeof(SecureBoot); - Status = EfiGetVariable(L"SecureBoot", - &EfiGlobalVariable, - NULL, - &DataSize, - &SecureBoot); - if (NT_SUCCESS(Status)) - { - /* In setup mode or without secureboot turned on, return failure */ - if ((SecureBoot != TRUE) || (SetupMode)) - { - Status = STATUS_INVALID_SIGNATURE; - } - - // BlpSbdiStateFlags |= 8u; - } - } - - /* Return secureboot status */ - return Status; -} - -NTSTATUS -BlSecureBootIsEnabled ( - _Out_ PBOOLEAN SecureBootEnabled - ) -{ - NTSTATUS Status; - - /* Have we checked before ? */ - if (!BlpFirmwareChecked) - { - /* First time checking */ - Status = BlpSecureBootEFIIsEnabled(); - if NT_SUCCESS(Status) - { - /* Yep, it's on */ - BlpFirmwareEnabled = TRUE; - } - - /* Don't check again */ - BlpFirmwareChecked = TRUE; - } - - /* Return the firmware result */ - *SecureBootEnabled = BlpFirmwareEnabled; - return STATUS_SUCCESS; -} - -NTSTATUS -BlSecureBootCheckForFactoryReset ( - VOID - ) -{ - BOOLEAN SecureBootEnabled; - NTSTATUS Status; - ULONG DataSize; - - /* Initialize locals */ - DataSize = 0; - SecureBootEnabled = FALSE; - - /* Check if secureboot is enabled */ - Status = BlSecureBootIsEnabled(&SecureBootEnabled); - if (!(NT_SUCCESS(Status)) || !(SecureBootEnabled)) - { - /* It's not. Check if there's a revocation list */ - Status = EfiGetVariable(L"RevocationList", - &BlpEfiSecureBootPrivateNamespace, - NULL, - &DataSize, - NULL); - if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_TOO_SMALL)) - { - /* We don't support this yet */ - EfiPrintf(L"Not yet supported\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - } - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -EfiConInReset ( - VOID - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"coninreset vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = EfiConIn->Reset(EfiConIn, FALSE); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConInExReset ( - VOID - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"conreset vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = EfiConInEx->Reset(EfiConInEx, FALSE); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConInExSetState ( - _In_ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *ConInEx, - _In_ EFI_KEY_TOGGLE_STATE* KeyToggleState - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - PHYSICAL_ADDRESS ConInExPhys, KeyTogglePhys; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Translate pointers from virtual to physical */ - BlMmTranslateVirtualAddress(ConInEx, &ConInExPhys); - ConInEx = (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL*)PhysicalAddressToPtr(ConInExPhys); - BlMmTranslateVirtualAddress(KeyToggleState, &KeyTogglePhys); - KeyToggleState = (EFI_KEY_TOGGLE_STATE*)PhysicalAddressToPtr(KeyTogglePhys); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = ConInEx->SetState(ConInEx, KeyToggleState); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiSetWatchdogTimer ( - VOID - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = EfiBS->SetWatchdogTimer(0, 0, 0, NULL); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiGetMemoryMap ( - _Out_ UINTN* MemoryMapSize, - _Inout_ EFI_MEMORY_DESCRIPTOR *MemoryMap, - _Out_ UINTN* MapKey, - _Out_ UINTN* DescriptorSize, - _Out_ UINTN* DescriptorVersion - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - PHYSICAL_ADDRESS MemoryMapSizePhysical, MemoryMapPhysical, MapKeyPhysical; - PHYSICAL_ADDRESS DescriptorSizePhysical, DescriptorVersionPhysical; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Convert all of the addresses to physical */ - BlMmTranslateVirtualAddress(MemoryMapSize, &MemoryMapSizePhysical); - MemoryMapSize = (UINTN*)PhysicalAddressToPtr(MemoryMapSizePhysical); - BlMmTranslateVirtualAddress(MemoryMap, &MemoryMapPhysical); - MemoryMap = (EFI_MEMORY_DESCRIPTOR*)PhysicalAddressToPtr(MemoryMapPhysical); - BlMmTranslateVirtualAddress(MapKey, &MapKeyPhysical); - MapKey = (UINTN*)PhysicalAddressToPtr(MapKeyPhysical); - BlMmTranslateVirtualAddress(DescriptorSize, &DescriptorSizePhysical); - DescriptorSize = (UINTN*)PhysicalAddressToPtr(DescriptorSizePhysical); - BlMmTranslateVirtualAddress(DescriptorVersion, &DescriptorVersionPhysical); - DescriptorVersion = (UINTN*)PhysicalAddressToPtr(DescriptorVersionPhysical); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = EfiBS->GetMemoryMap(MemoryMapSize, - MemoryMap, - MapKey, - DescriptorSize, - DescriptorVersion); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiFreePages ( - _In_ ULONG Pages, - _In_ EFI_PHYSICAL_ADDRESS PhysicalAddress - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = EfiBS->FreePages(PhysicalAddress, Pages); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiStall ( - _In_ ULONG StallTime - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = EfiBS->Stall(StallTime); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutQueryMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Mode, - _In_ UINTN* Columns, - _In_ UINTN* Rows - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"conqmode vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->QueryMode(TextInterface, Mode, Columns, Rows); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutSetMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Mode - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"setmode vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->SetMode(TextInterface, Mode); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutSetAttribute ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Attribute - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"sattr vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->SetAttribute(TextInterface, Attribute); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutSetCursorPosition ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ ULONG Column, - _In_ ULONG Row - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"setcursor vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->SetCursorPosition(TextInterface, Column, Row); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutEnableCursor ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ BOOLEAN Visible - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"enablecurso vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->EnableCursor(TextInterface, Visible); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiConOutOutputString ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _In_ PWCHAR String - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"output string vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = TextInterface->OutputString(TextInterface, String); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -VOID -EfiConOutReadCurrentMode ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface, - _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode - ) -{ - BL_ARCH_MODE OldMode; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"readmode vm path\r\n"); - EfiStall(10000000); - return; - } - - /* Make the EFI call */ - RtlCopyMemory(Mode, TextInterface->Mode, sizeof(*Mode)); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } -} - -VOID -EfiGopGetFrameBuffer ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _Out_ PHYSICAL_ADDRESS* FrameBuffer, - _Out_ UINTN *FrameBufferSize - ) -{ - BL_ARCH_MODE OldMode; - PHYSICAL_ADDRESS GopInterfacePhys, FrameBufferPhys, FrameBufferSizePhys; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Translate pointer to physical */ - BlMmTranslateVirtualAddress(GopInterface, &GopInterfacePhys); - GopInterface = PhysicalAddressToPtr(GopInterfacePhys); - - /* Translate pointer to physical */ - BlMmTranslateVirtualAddress(FrameBuffer, &FrameBufferPhys); - FrameBuffer = PhysicalAddressToPtr(FrameBufferPhys); - - /* Translate pointer to physical */ - BlMmTranslateVirtualAddress(FrameBufferSize, &FrameBufferSizePhys); - FrameBufferSize = PhysicalAddressToPtr(FrameBufferSizePhys); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - FrameBuffer->QuadPart = GopInterface->Mode->FrameBufferBase; - *FrameBufferSize = GopInterface->Mode->FrameBufferSize; - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } -} - -NTSTATUS -EfiGopGetCurrentMode ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _Out_ UINTN* Mode, - _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information - ) -{ - BL_ARCH_MODE OldMode; - PHYSICAL_ADDRESS GopInterfacePhys, ModePhys, InformationPhys; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Translate pointer to physical */ - if (!BlMmTranslateVirtualAddress(GopInterface, &GopInterfacePhys)) - { - return STATUS_UNSUCCESSFUL; - } - GopInterface = PhysicalAddressToPtr(GopInterfacePhys); - - /* Translate pointer to physical */ - if (!BlMmTranslateVirtualAddress(Mode, &ModePhys)) - { - return STATUS_UNSUCCESSFUL; - } - Mode = PhysicalAddressToPtr(ModePhys); - - /* Translate pointer to physical */ - if (!BlMmTranslateVirtualAddress(Information, &InformationPhys)) - { - return STATUS_UNSUCCESSFUL; - } - Information = PhysicalAddressToPtr(InformationPhys); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - *Mode = GopInterface->Mode->Mode; - RtlCopyMemory(Information, GopInterface->Mode->Info, sizeof(*Information)); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Return back */ - return STATUS_SUCCESS; -} - -NTSTATUS -EfiGopSetMode ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface, - _In_ ULONG Mode - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - BOOLEAN ModeChanged; - NTSTATUS Status; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"gopsmode vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - if (Mode == GopInterface->Mode->Mode) - { - EfiStatus = EFI_SUCCESS; - ModeChanged = FALSE; - } - { - EfiStatus = GopInterface->SetMode(GopInterface, Mode); - ModeChanged = TRUE; - } - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Print out to the debugger if the mode was changed */ - Status = EfiGetNtStatusCode(EfiStatus); - if ((ModeChanged) && (NT_SUCCESS(Status))) - { - /* FIXME @TODO: Should be BlStatusPrint */ - EfiPrintf(L"Console video mode set to 0x%x\r\n", Mode); - } - - /* Convert the error to an NTSTATUS */ - return Status; -} - -NTSTATUS -EfiLocateHandleBuffer ( - _In_ EFI_LOCATE_SEARCH_TYPE SearchType, - _In_ EFI_GUID *Protocol, - _Inout_ PULONG HandleCount, - _Inout_ EFI_HANDLE** Buffer - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - UINTN BufferSize; - PVOID InputBuffer; - BOOLEAN TranslateResult; - PHYSICAL_ADDRESS BufferPhys; - - /* Bail out if we're missing parameters */ - if (!(Buffer) || !(HandleCount)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if a buffer was passed in*/ - InputBuffer = *Buffer; - if (InputBuffer) - { - /* Then we should already have a buffer size*/ - BufferSize = sizeof(EFI_HANDLE) * *HandleCount; - } - else - { - /* Then no buffer size exists */ - BufferSize = 0; - } - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Translate the input buffer from virtual to physical */ - TranslateResult = BlMmTranslateVirtualAddress(InputBuffer, &BufferPhys); - InputBuffer = TranslateResult ? PhysicalAddressToPtr(BufferPhys) : NULL; - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Try the first time */ - EfiStatus = EfiBS->LocateHandle(SearchType, - Protocol, - NULL, - &BufferSize, - InputBuffer); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Check result of first search */ - if (EfiStatus == EFI_BUFFER_TOO_SMALL) - { - /* Did we have an existing buffer? */ - if (*Buffer) - { - /* Free it */ - BlMmFreeHeap(*Buffer); - } - - /* Allocate a new one */ - InputBuffer = BlMmAllocateHeap(BufferSize); - *Buffer = InputBuffer; - if (!InputBuffer) - { - /* No space, fail */ - return STATUS_NO_MEMORY; - } - - if (OldMode != BlRealMode) - { - /* Translate the input buffer from virtual to physical */ - TranslateResult = BlMmTranslateVirtualAddress(InputBuffer, - &BufferPhys); - InputBuffer = TranslateResult ? PhysicalAddressToPtr(BufferPhys) : NULL; - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Try again */ - EfiStatus = EfiBS->LocateHandle(SearchType, - Protocol, - NULL, - &BufferSize, - InputBuffer); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - } - - /* Return the number of handles */ - *HandleCount = BufferSize / sizeof(EFI_HANDLE); - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -VOID -EfiResetSystem ( - _In_ EFI_RESET_TYPE ResetType - ) -{ - BL_ARCH_MODE OldMode; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"reset vm path\r\n"); - EfiStall(10000000); - return; - } - - /* Call the EFI runtime */ - EfiRT->ResetSystem(ResetType, EFI_SUCCESS, 0, NULL); -} - -NTSTATUS -EfiConnectController ( - _In_ EFI_HANDLE ControllerHandle - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - - /* Is this EFI 1.02? */ - if (EfiST->Hdr.Revision == EFI_1_02_SYSTEM_TABLE_REVISION) - { - /* This function didn't exist back then */ - return STATUS_NOT_SUPPORTED; - } - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - EfiPrintf(L"connectctrl vm path\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Make the EFI call */ - EfiStatus = EfiBS->ConnectController(ControllerHandle, NULL, NULL, TRUE); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfiAllocatePages ( - _In_ ULONG Type, - _In_ ULONG Pages, - _Inout_ EFI_PHYSICAL_ADDRESS* Memory - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - PHYSICAL_ADDRESS MemoryPhysical; - - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* Translate output address */ - BlMmTranslateVirtualAddress(Memory, &MemoryPhysical); - Memory = (EFI_PHYSICAL_ADDRESS*)PhysicalAddressToPtr(MemoryPhysical); - - /* Switch to real mode */ - BlpArchSwitchContext(BlRealMode); - } - - /* Make the EFI call */ - EfiStatus = EfiBS->AllocatePages(Type, EfiLoaderData, Pages, Memory); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the error to an NTSTATUS */ - return EfiGetNtStatusCode(EfiStatus); -} - -NTSTATUS -EfipGetSystemTable ( - _In_ EFI_GUID *TableGuid, - _Out_ PPHYSICAL_ADDRESS TableAddress - ) -{ - ULONG i; - NTSTATUS Status; - - /* Assume failure */ - Status = STATUS_NOT_FOUND; - - /* Loop through the configuration tables */ - for (i = 0; i < EfiST->NumberOfTableEntries; i++) - { - /* Check if this one matches the one we want */ - if (RtlEqualMemory(&EfiST->ConfigurationTable[i].VendorGuid, - TableGuid, - sizeof(*TableGuid))) - { - /* Return its address */ - TableAddress->QuadPart = (ULONG_PTR)EfiST->ConfigurationTable[i].VendorTable; - Status = STATUS_SUCCESS; - break; - } - } - - /* Return the search result */ - return Status; -} - -NTSTATUS -EfipGetRsdt ( - _Out_ PPHYSICAL_ADDRESS FoundRsdt - ) -{ - NTSTATUS Status; - ULONG Length; - PHYSICAL_ADDRESS RsdpAddress, Rsdt; - PRSDP Rsdp; - - /* Assume failure */ - Length = 0; - Rsdp = NULL; - - /* Check if we already know it */ - if (EfiRsdt.QuadPart) - { - /* Return it */ - *FoundRsdt = EfiRsdt; - return STATUS_SUCCESS; - } - - /* Otherwise, look for the ACPI 2.0 RSDP (XSDT really) */ - Status = EfipGetSystemTable(&EfiRootAcpiTableGuid, &RsdpAddress); - if (!NT_SUCCESS(Status)) - { - /* Didn't fint it, look for the ACPI 1.0 RSDP (RSDT really) */ - Status = EfipGetSystemTable(&EfiRootAcpiTable10Guid, &RsdpAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Map it */ - Length = sizeof(*Rsdp); - Status = BlMmMapPhysicalAddressEx((PVOID*)&Rsdp, - 0, - Length, - RsdpAddress); - if (NT_SUCCESS(Status)) - { - /* Check the revision (anything >= 2.0 is XSDT) */ - if (Rsdp->Revision) - { - /* Check if the table is bigger than just its header */ - if (Rsdp->Length > Length) - { - /* Capture the real length */ - Length = Rsdp->Length; - - /* Unmap our header mapping */ - BlMmUnmapVirtualAddressEx(Rsdp, sizeof(*Rsdp)); - - /* And map the whole thing now */ - Status = BlMmMapPhysicalAddressEx((PVOID*)&Rsdp, - 0, - Length, - RsdpAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Read the XSDT address from the table*/ - Rsdt = Rsdp->XsdtAddress; - } - else - { - /* ACPI 1.0 so just read the RSDT */ - Rsdt.QuadPart = Rsdp->RsdtAddress; - } - - /* Save it for later */ - EfiRsdt = Rsdt; - - /* And return it back */ - *FoundRsdt = Rsdt; - } - - /* Check if we had mapped the RSDP */ - if (Rsdp) - { - /* Unmap it */ - BlMmUnmapVirtualAddressEx(Rsdp, Length); - } - - /* Return search result back to caller */ - return Status; -} - -BL_MEMORY_ATTR -MmFwpGetOsAttributeType ( - _In_ ULONGLONG Attribute - ) -{ - BL_MEMORY_ATTR OsAttribute = 0; - - if (Attribute & EFI_MEMORY_UC) - { - OsAttribute = BlMemoryUncached; - } - - if (Attribute & EFI_MEMORY_WC) - { - OsAttribute |= BlMemoryWriteCombined; - } - - if (Attribute & EFI_MEMORY_WT) - { - OsAttribute |= BlMemoryWriteThrough; - } - - if (Attribute & EFI_MEMORY_WB) - { - OsAttribute |= BlMemoryWriteBack; - } - - if (Attribute & EFI_MEMORY_UCE) - { - OsAttribute |= BlMemoryUncachedExported; - } - - if (Attribute & EFI_MEMORY_WP) - { - OsAttribute |= BlMemoryWriteProtected; - } - - if (Attribute & EFI_MEMORY_RP) - { - OsAttribute |= BlMemoryReadProtected; - } - - if (Attribute & EFI_MEMORY_XP) - { - OsAttribute |= BlMemoryExecuteProtected; - } - - if (Attribute & EFI_MEMORY_RUNTIME) - { - OsAttribute |= BlMemoryRuntime; - } - - return OsAttribute; -} - -BL_MEMORY_TYPE -MmFwpGetOsMemoryType ( - _In_ EFI_MEMORY_TYPE MemoryType - ) -{ - BL_MEMORY_TYPE OsType; - - switch (MemoryType) - { - case EfiLoaderCode: - case EfiLoaderData: - OsType = BlLoaderMemory; - break; - - case EfiBootServicesCode: - case EfiBootServicesData: - OsType = BlEfiBootMemory; - break; - - case EfiRuntimeServicesCode: - OsType = BlEfiRuntimeCodeMemory; - break; - - case EfiRuntimeServicesData: - OsType = BlEfiRuntimeDataMemory; - break; - - case EfiConventionalMemory: - OsType = BlConventionalMemory; - break; - - case EfiUnusableMemory: - OsType = BlUnusableMemory; - break; - - case EfiACPIReclaimMemory: - OsType = BlAcpiReclaimMemory; - break; - - case EfiACPIMemoryNVS: - OsType = BlAcpiNvsMemory; - break; - - case EfiMemoryMappedIO: - OsType = BlDeviceIoMemory; - break; - - case EfiMemoryMappedIOPortSpace: - OsType = BlDevicePortMemory; - break; - - case EfiPalCode: - OsType = BlPalMemory; - break; - - default: - OsType = BlReservedMemory; - break; - } - - return OsType; -} - -NTSTATUS -MmFwGetMemoryMap ( - _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap, - _In_ ULONG Flags - ) -{ - BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters; - BOOLEAN UseEfiBuffer, HaveRamDisk; - NTSTATUS Status; - ULONGLONG Pages, StartPage, EndPage, EfiBufferPage; - UINTN EfiMemoryMapSize, MapKey, DescriptorSize, DescriptorVersion; - EFI_PHYSICAL_ADDRESS EfiBuffer = 0; - EFI_MEMORY_DESCRIPTOR* EfiMemoryMap; - EFI_STATUS EfiStatus; - BL_ARCH_MODE OldMode; - EFI_MEMORY_DESCRIPTOR EfiDescriptor; - BL_MEMORY_TYPE MemoryType; - PBL_MEMORY_DESCRIPTOR Descriptor; - BL_MEMORY_ATTR Attribute; - PVOID LibraryBuffer; - - /* Initialize EFI memory map attributes */ - EfiMemoryMapSize = MapKey = DescriptorSize = DescriptorVersion = 0; - LibraryBuffer = NULL; - - /* Increment the nesting depth */ - MmDescriptorCallTreeCount++; - - /* Determine if we should use EFI or our own allocator at this point */ - UseEfiBuffer = Flags & BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS; - if (!(LibraryParameters.LibraryFlags & BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED)) - { - UseEfiBuffer = TRUE; - } - - /* Bail out if we don't have a list to use */ - if (MemoryMap == NULL) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Free the current descriptor list */ - MmMdFreeList(MemoryMap); - - /* Call into EFI to get the size of the memory map */ - Status = EfiGetMemoryMap(&EfiMemoryMapSize, - NULL, - &MapKey, - &DescriptorSize, - &DescriptorVersion); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - /* This should've failed because our buffer was too small, nothing else */ - if (NT_SUCCESS(Status)) - { - Status = STATUS_UNSUCCESSFUL; - } - goto Quickie; - } - - /* Add 4 more descriptors just in case things changed */ - EfiMemoryMapSize += (4 * DescriptorSize); - Pages = BYTES_TO_PAGES(EfiMemoryMapSize); - - /* Should we use EFI to grab memory? */ - if (UseEfiBuffer) - { - /* Yes -- request one more page to align up correctly */ - Pages++; - - /* Grab the required pages */ - Status = EfiAllocatePages(AllocateAnyPages, - Pages, - &EfiBuffer); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"EFI allocation failed: %lx\r\n", Status); - goto Quickie; - } - - /* Free the pages for now */ - Status = EfiFreePages(Pages, EfiBuffer); - if (!NT_SUCCESS(Status)) - { - EfiBuffer = 0; - goto Quickie; - } - - /* Now round to the actual buffer size, removing the extra page */ - EfiBuffer = ROUND_TO_PAGES(EfiBuffer); - Pages--; - Status = EfiAllocatePages(AllocateAddress, - Pages, - &EfiBuffer); - if (!NT_SUCCESS(Status)) - { - EfiBuffer = 0; - goto Quickie; - } - - /* Get the final aligned size and proper buffer */ - EfiMemoryMapSize = EFI_PAGES_TO_SIZE(Pages); - EfiMemoryMap = (EFI_MEMORY_DESCRIPTOR*)(ULONG_PTR)EfiBuffer; - - /* Switch to real mode if not already in it */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(BlRealMode); - } - - /* Call EFI to get the memory map */ - EfiStatus = EfiBS->GetMemoryMap(&EfiMemoryMapSize, - EfiMemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion); - - /* Switch back into the previous mode */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert the result code */ - Status = EfiGetNtStatusCode(EfiStatus); - } - else - { - /* Round the map to pages */ - Pages = BYTES_TO_PAGES(EfiMemoryMapSize); - - /* Allocate a large enough buffer */ - Status = MmPapAllocatePagesInRange(&LibraryBuffer, - BlLoaderData, - Pages, - 0, - 0, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to allocate mapped VM for EFI map: %lx\r\n", Status); - goto Quickie; - } - - /* Call EFI to get the memory map */ - EfiMemoryMap = LibraryBuffer; - Status = EfiGetMemoryMap(&EfiMemoryMapSize, - LibraryBuffer, - &MapKey, - &DescriptorSize, - &DescriptorVersion); - } - - /* So far so good? */ - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to get EFI memory map: %lx\r\n", Status); - goto Quickie; - } - - /* Did we get correct data from firmware? */ - if (((EfiMemoryMapSize % DescriptorSize)) || - (DescriptorSize < sizeof(EFI_MEMORY_DESCRIPTOR))) - { - EfiPrintf(L"Incorrect descriptor size\r\n"); - Status = STATUS_UNSUCCESSFUL; - goto Quickie; - } - - /* Did we boot from a RAM disk? */ - if ((BlpBootDevice->DeviceType == LocalDevice) && - (BlpBootDevice->Local.Type == RamDiskDevice)) - { - /* We don't handle this yet */ - EfiPrintf(L"RAM boot not supported\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - } - else - { - /* We didn't, so there won't be any need to find the memory descriptor */ - HaveRamDisk = FALSE; - } - - /* Loop the EFI memory map */ -#if 0 - EfiPrintf(L"UEFI MEMORY MAP\r\n\r\n"); - EfiPrintf(L"TYPE START END ATTRIBUTES\r\n"); - EfiPrintf(L"===============================================================\r\n"); -#endif - while (EfiMemoryMapSize != 0) - { - /* Check if this is an EFI buffer, but we're not in real mode */ - if ((UseEfiBuffer) && (OldMode != BlRealMode)) - { - BlpArchSwitchContext(BlRealMode); - } - - /* Capture it so we can go back to protected mode (if possible) */ - EfiDescriptor = *EfiMemoryMap; - - /* Go back to protected mode, if we had switched */ - if ((UseEfiBuffer) && (OldMode != BlRealMode)) - { - BlpArchSwitchContext(OldMode); - } - - /* Convert to OS memory type */ - MemoryType = MmFwpGetOsMemoryType(EfiDescriptor.Type); - - /* Round up or round down depending on where the memory is coming from */ - if (MemoryType == BlConventionalMemory) - { - StartPage = BYTES_TO_PAGES(EfiDescriptor.PhysicalStart); - } - else - { - StartPage = EfiDescriptor.PhysicalStart >> PAGE_SHIFT; - } - - /* Calculate the ending page */ - EndPage = StartPage + EfiDescriptor.NumberOfPages; - - /* If after rounding, we ended up with 0 pages, skip this */ - if (StartPage == EndPage) - { - goto LoopAgain; - } -#if 0 - EfiPrintf(L"%08X 0x%016I64X-0x%016I64X 0x%I64X\r\n", - MemoryType, - StartPage << PAGE_SHIFT, - EndPage << PAGE_SHIFT, - EfiDescriptor.Attribute); -#endif - /* Check for any range of memory below 1MB */ - if (StartPage < 0x100) - { - /* Does this range actually contain NULL? */ - if (StartPage == 0) - { - /* Manually create a reserved descriptof for this page */ - Attribute = MmFwpGetOsAttributeType(EfiDescriptor.Attribute); - Descriptor = MmMdInitByteGranularDescriptor(Attribute, - BlReservedMemory, - 0, - 0, - 1); - if (!Descriptor) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - - /* Add this descriptor into the list */ - Status = MmMdAddDescriptorToList(MemoryMap, - Descriptor, - BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to add zero page descriptor: %lx\r\n", Status); - break; - } - - /* Now handle the rest of the range, unless this was it */ - StartPage = 1; - if (EndPage == 1) - { - goto LoopAgain; - } - } - - /* Does the range go beyond 1MB? */ - if (EndPage > 0x100) - { - /* Then create the descriptor for everything up until the megabyte */ - Attribute = MmFwpGetOsAttributeType(EfiDescriptor.Attribute); - Descriptor = MmMdInitByteGranularDescriptor(Attribute, - MemoryType, - StartPage, - 0, - 0x100 - StartPage); - if (!Descriptor) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - - /* Check if this region is currently free RAM */ - if (Descriptor->Type == BlConventionalMemory) - { - /* Set the appropriate flag on the descriptor */ - Descriptor->Flags |= BlMemoryBelow1MB; - } - - /* Add this descriptor into the list */ - Status = MmMdAddDescriptorToList(MemoryMap, - Descriptor, - BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to add 1MB descriptor: %lx\r\n", Status); - break; - } - - /* Now handle the rest of the range above 1MB */ - StartPage = 0x100; - } - } - - /* Check if we loaded from a RAM disk */ - if (HaveRamDisk) - { - /* We don't handle this yet */ - EfiPrintf(L"RAM boot not supported\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - } - - /* Create a descriptor for the current range */ - Attribute = MmFwpGetOsAttributeType(EfiDescriptor.Attribute); - Descriptor = MmMdInitByteGranularDescriptor(Attribute, - MemoryType, - StartPage, - 0, - EndPage - StartPage); - if (!Descriptor) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - - /* Check if this region is currently free RAM below 1MB */ - if ((Descriptor->Type == BlConventionalMemory) && (EndPage <= 0x100)) - { - /* Set the appropriate flag on the descriptor */ - Descriptor->Flags |= BlMemoryBelow1MB; - } - - /* Add the descriptor to the list, requesting coalescing as asked */ - Status = MmMdAddDescriptorToList(MemoryMap, - Descriptor, - BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG | - ((Flags & BL_MM_FLAG_REQUEST_COALESCING) ? - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG : 0)); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to add full descriptor: %lx\r\n", Status); - break; - } - -LoopAgain: - /* Consume this descriptor, and move to the next one */ - EfiMemoryMapSize -= DescriptorSize; - EfiMemoryMap = (PVOID)((ULONG_PTR)EfiMemoryMap + DescriptorSize); - } - - /* Check if we are using the local UEFI buffer */ - if (!UseEfiBuffer) - { - goto Quickie; - } - - /* Free the EFI buffer */ - Status = EfiFreePages(Pages, EfiBuffer); - if (!NT_SUCCESS(Status)) - { - /* Keep the pages marked 'in use' and fake success */ - Status = STATUS_SUCCESS; - goto Quickie; - } - - /* Get the base page of the EFI buffer */ - EfiBufferPage = EfiBuffer >> PAGE_SHIFT; - Pages = (EfiBufferPage + Pages) - EfiBufferPage; - - /* Don't try freeing below */ - EfiBuffer = 0; - - /* Find the current descriptor for the allocation */ - Descriptor = MmMdFindDescriptorFromMdl(MemoryMap, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - EfiBufferPage); - if (!Descriptor) - { - Status = STATUS_UNSUCCESSFUL; - goto Quickie; - } - - /* Convert it to a free descriptor */ - Descriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - BlConventionalMemory, - EfiBufferPage, - 0, - Pages); - if (!Descriptor) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Remove the region from the memory map */ - Status = MmMdRemoveRegionFromMdlEx(MemoryMap, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - EfiBufferPage, - Pages, - NULL); - if (!NT_SUCCESS(Status)) - { - MmMdFreeDescriptor(Descriptor); - goto Quickie; - } - - /* Add it back as free memory */ - Status = MmMdAddDescriptorToList(MemoryMap, - Descriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG); - -Quickie: - /* Free the EFI buffer, if we had one */ - if (EfiBuffer != 0) - { - EfiFreePages(Pages, EfiBuffer); - } - - /* Free the library-allocated buffer, if we had one */ - if (LibraryBuffer != 0) - { - MmPapFreePages(LibraryBuffer, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - - /* On failure, free the memory map if one was passed in */ - if (!NT_SUCCESS(Status) && (MemoryMap != NULL)) - { - MmMdFreeList(MemoryMap); - } - - /* Decrement the nesting depth and return */ - MmDescriptorCallTreeCount--; - return Status; -} - -NTSTATUS -BlpFwInitialize ( - _In_ ULONG Phase, - _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareData - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - EFI_KEY_TOGGLE_STATE KeyToggleState; - - /* Check if we have valid firmware data */ - if (!(FirmwareData) || !(FirmwareData->Version)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check which boot phase we're in */ - if (Phase != 0) - { - /* Memory manager is ready, open the extended input protocol */ - Status = EfiOpenProtocol(EfiST->ConsoleInHandle, - &EfiSimpleTextInputExProtocol, - (PVOID*)&EfiConInEx); - if (NT_SUCCESS(Status)) - { - /* Set the initial key toggle state */ - KeyToggleState = EFI_TOGGLE_STATE_VALID | 40; - EfiConInExSetState(EfiConInEx, &KeyToggleState); - } - - /* Setup the watchdog timer */ - EfiSetWatchdogTimer(); - } - else - { - /* Make a copy of the parameters */ - EfiFirmwareParameters = &EfiFirmwareData; - - /* Check which version we received */ - if (FirmwareData->Version == 1) - { - /* FIXME: Not supported */ - Status = STATUS_NOT_SUPPORTED; - } - else if (FirmwareData->Version >= BL_FIRMWARE_DESCRIPTOR_VERSION) - { - /* Version 2 -- save the data */ - EfiFirmwareData = *FirmwareData; - EfiSystemTable = FirmwareData->SystemTable; - EfiImageHandle = FirmwareData->ImageHandle; - - /* Set the EDK-II style variables as well */ - EfiST = EfiSystemTable; - EfiBS = EfiSystemTable->BootServices; - EfiRT = EfiSystemTable->RuntimeServices; - EfiConOut = EfiSystemTable->ConOut; - EfiConIn = EfiSystemTable->ConIn; - EfiConInEx = NULL; - } - else - { - /* Unknown version */ - Status = STATUS_NOT_SUPPORTED; - } - } - - /* Return the initialization state */ - return Status; -} - -NTSTATUS -BlFwGetParameters ( - _In_ PBL_FIRMWARE_DESCRIPTOR Parameters - ) -{ - /* Make sure we got an argument */ - if (!Parameters) - { - return STATUS_INVALID_PARAMETER; - } - - /* Copy the static data */ - *Parameters = *EfiFirmwareParameters; - return STATUS_SUCCESS; -} - -NTSTATUS -BlFwEnumerateDevice ( - _In_ PBL_DEVICE_DESCRIPTOR Device - ) -{ - NTSTATUS Status; - ULONG PathProtocols, BlockProtocols; - EFI_HANDLE* PathArray; - EFI_HANDLE* BlockArray; - - /* Initialize locals */ - BlockArray = NULL; - PathArray = NULL; - PathProtocols = 0; - BlockProtocols = 0; - - /* Enumeration only makes sense on disks or partitions */ - if ((Device->DeviceType != DiskDevice) && - (Device->DeviceType != LegacyPartitionDevice) && - (Device->DeviceType != PartitionDevice)) - { - return STATUS_NOT_SUPPORTED; - } - - /* Enumerate the list of device paths */ - Status = EfiLocateHandleBuffer(ByProtocol, - &EfiDevicePathProtocol, - &PathProtocols, - &PathArray); - if (NT_SUCCESS(Status)) - { - /* Loop through each one */ - Status = STATUS_NOT_FOUND; - while (PathProtocols) - { - /* Attempt to connect the driver for this device epath */ - Status = EfiConnectController(PathArray[--PathProtocols]); - if (NT_SUCCESS(Status)) - { - /* Now enumerate any block I/O devices the driver added */ - Status = EfiLocateHandleBuffer(ByProtocol, - &EfiBlockIoProtocol, - &BlockProtocols, - &BlockArray); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Loop through each one */ - while (BlockProtocols) - { - /* Check if one of the new devices is the one we want */ - Status = BlockIoEfiCompareDevice(Device, - BlockArray[--BlockProtocols]); - if (NT_SUCCESS(Status)) - { - /* Yep, all done */ - goto Quickie; - } - } - - /* Move on to the next device path */ - BlMmFreeHeap(BlockArray); - BlockArray = NULL; - } - } - } - -Quickie: - /* We're done -- free the array of device path protocols, if any */ - if (PathArray) - { - BlMmFreeHeap(PathArray); - } - - /* We're done -- free the array of block I/O protocols, if any */ - if (BlockArray) - { - BlMmFreeHeap(BlockArray); - } - - /* Return if we found the device or not */ - return Status; -} - -/*++ - * @name EfiGetEfiStatusCode - * - * The EfiGetEfiStatusCode routine converts an NT Status to an EFI status. - * - * @param Status - * NT Status code to be converted. - * - * @remark Only certain, specific NT status codes are converted to EFI codes. - * - * @return The corresponding EFI Status code, EFI_NO_MAPPING otherwise. - * - *--*/ -EFI_STATUS -EfiGetEfiStatusCode( - _In_ NTSTATUS Status - ) -{ - switch (Status) - { - case STATUS_NOT_SUPPORTED: - return EFI_UNSUPPORTED; - case STATUS_DISK_FULL: - return EFI_VOLUME_FULL; - case STATUS_INSUFFICIENT_RESOURCES: - return EFI_OUT_OF_RESOURCES; - case STATUS_MEDIA_WRITE_PROTECTED: - return EFI_WRITE_PROTECTED; - case STATUS_DEVICE_NOT_READY: - return EFI_NOT_STARTED; - case STATUS_DEVICE_ALREADY_ATTACHED: - return EFI_ALREADY_STARTED; - case STATUS_MEDIA_CHANGED: - return EFI_MEDIA_CHANGED; - case STATUS_INVALID_PARAMETER: - return EFI_INVALID_PARAMETER; - case STATUS_ACCESS_DENIED: - return EFI_ACCESS_DENIED; - case STATUS_BUFFER_TOO_SMALL: - return EFI_BUFFER_TOO_SMALL; - case STATUS_DISK_CORRUPT_ERROR: - return EFI_VOLUME_CORRUPTED; - case STATUS_REQUEST_ABORTED: - return EFI_ABORTED; - case STATUS_NO_MEDIA: - return EFI_NO_MEDIA; - case STATUS_IO_DEVICE_ERROR: - return EFI_DEVICE_ERROR; - case STATUS_INVALID_BUFFER_SIZE: - return EFI_BAD_BUFFER_SIZE; - case STATUS_NOT_FOUND: - return EFI_NOT_FOUND; - case STATUS_DRIVER_UNABLE_TO_LOAD: - return EFI_LOAD_ERROR; - case STATUS_NO_MATCH: - return EFI_NO_MAPPING; - case STATUS_SUCCESS: - return EFI_SUCCESS; - case STATUS_TIMEOUT: - return EFI_TIMEOUT; - default: - return EFI_NO_MAPPING; - } -} - -/*++ - * @name EfiGetNtStatusCode - * - * The EfiGetNtStatusCode routine converts an EFI Status to an NT status. - * - * @param EfiStatus - * EFI Status code to be converted. - * - * @remark Only certain, specific EFI status codes are converted to NT codes. - * - * @return The corresponding NT Status code, STATUS_UNSUCCESSFUL otherwise. - * - *--*/ -NTSTATUS -EfiGetNtStatusCode ( - _In_ EFI_STATUS EfiStatus - ) -{ - switch (EfiStatus) - { - case EFI_NOT_READY: - case EFI_NOT_FOUND: - return STATUS_NOT_FOUND; - case EFI_NO_MEDIA: - return STATUS_NO_MEDIA; - case EFI_MEDIA_CHANGED: - return STATUS_MEDIA_CHANGED; - case EFI_ACCESS_DENIED: - case EFI_SECURITY_VIOLATION: - return STATUS_ACCESS_DENIED; - case EFI_TIMEOUT: - case EFI_NO_RESPONSE: - return STATUS_TIMEOUT; - case EFI_NO_MAPPING: - return STATUS_NO_MATCH; - case EFI_NOT_STARTED: - return STATUS_DEVICE_NOT_READY; - case EFI_ALREADY_STARTED: - return STATUS_DEVICE_ALREADY_ATTACHED; - case EFI_ABORTED: - return STATUS_REQUEST_ABORTED; - case EFI_VOLUME_FULL: - return STATUS_DISK_FULL; - case EFI_DEVICE_ERROR: - return STATUS_IO_DEVICE_ERROR; - case EFI_WRITE_PROTECTED: - return STATUS_MEDIA_WRITE_PROTECTED; - /* @FIXME: ReactOS Headers don't yet have this */ - //case EFI_OUT_OF_RESOURCES: - //return STATUS_INSUFFICIENT_NVRAM_RESOURCES; - case EFI_VOLUME_CORRUPTED: - return STATUS_DISK_CORRUPT_ERROR; - case EFI_BUFFER_TOO_SMALL: - return STATUS_BUFFER_TOO_SMALL; - case EFI_SUCCESS: - return STATUS_SUCCESS; - case EFI_LOAD_ERROR: - return STATUS_DRIVER_UNABLE_TO_LOAD; - case EFI_INVALID_PARAMETER: - return STATUS_INVALID_PARAMETER; - case EFI_UNSUPPORTED: - return STATUS_NOT_SUPPORTED; - case EFI_BAD_BUFFER_SIZE: - return STATUS_INVALID_BUFFER_SIZE; - default: - return STATUS_UNSUCCESSFUL; - } -} diff --git a/boot/environ/lib/firmware/fwutil.c b/boot/environ/lib/firmware/fwutil.c deleted file mode 100644 index b408f69c578..00000000000 --- a/boot/environ/lib/firmware/fwutil.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/firmware/fwutil.c - * PURPOSE: Boot Library Firmware Utility Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -VOID -BlFwReboot ( - VOID - ) -{ -#ifdef BL_KD_SUPPORTED - /* Stop the boot debugger*/ - BlBdStop(); -#endif - - /* Reset the machine */ - EfiResetSystem(EfiResetCold); -} - -NTSTATUS -MmFwFreePages ( - _In_ ULONG BasePage, - _In_ ULONG PageCount - ) -{ - /* Free the pages */ - return EfiFreePages(PageCount, BasePage << PAGE_SHIFT); -} diff --git a/boot/environ/lib/io/blkcache.c b/boot/environ/lib/io/blkcache.c deleted file mode 100644 index efedf541f40..00000000000 --- a/boot/environ/lib/io/blkcache.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/blkcache.c - * PURPOSE: Boot Library Block Cache Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -ULONG BcpBlockAllocatorHandle; -ULONG BcpHashTableId; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BcpDestroy ( - VOID - ) -{ - //BcpPurgeCacheEntries(); - //return BlpMmDeleteBlockAllocator(BcpBlockAllocatorHandle); - EfiPrintf(L"Destructor for block cache not yet implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -BOOLEAN -BcpCompareKey ( - _In_ PBL_HASH_ENTRY Entry1, - _In_ PBL_HASH_ENTRY Entry2 - ) -{ - PULONG Value1, Value2; - - Value1 = Entry1->Value; - Value2 = Entry2->Value; - return Entry1->Size == Entry2->Size && Entry1->Flags == Entry2->Flags && *Value1 == *Value2 && Value1[1] == Value2[1] && Value1[2] == Value2[2]; -} - -ULONG -BcpHashFunction ( - _In_ PBL_HASH_ENTRY Entry, - _In_ ULONG TableSize - ) -{ - ULONG i, j, ValueHash; - PUCHAR ValueBuffer; - - j = 0; - ValueHash = 0; - i = 0; - - ValueBuffer = Entry->Value; - - do - { - ValueHash += ValueBuffer[i++]; - } while (i < 8); - - do - { - ValueHash += ValueBuffer[j++ + 8]; - } while (j < 4); - - return ValueHash % TableSize; -} - -NTSTATUS -BcInitialize ( - VOID - ) -{ - NTSTATUS Status; - - Status = BlHtCreate(50, BcpHashFunction, BcpCompareKey, &BcpHashTableId); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - BcpBlockAllocatorHandle = BlpMmCreateBlockAllocator(); - if (BcpBlockAllocatorHandle == -1) - { - Status = STATUS_UNSUCCESSFUL; - goto Quickie; - } - - Status = BlpIoRegisterDestroyRoutine(BcpDestroy); - if (Status >= 0) - { - return Status; - } - -Quickie: - EfiPrintf(L"Failure path not yet implemented\r\n"); -#if 0 - if (BcpHashTableId != -1) - { - BlHtDestroy(BcpHashTableId); - } - if (BcpBlockAllocatorHandle != -1) - { - BlpMmDeleteBlockAllocator(BcpBlockAllocatorHandle); - } -#endif - return Status; -} diff --git a/boot/environ/lib/io/device.c b/boot/environ/lib/io/device.c deleted file mode 100644 index 7ba7a18b7e4..00000000000 --- a/boot/environ/lib/io/device.c +++ /dev/null @@ -1,2345 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/device.c - * PURPOSE: Boot Library Device Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -typedef struct _BL_DEVICE_IO_INFORMATION -{ - ULONGLONG ReadCount; - ULONGLONG WriteCount; -} BL_DEVICE_IO_INFORMATION, *PBL_DEVICE_IO_INFORMATION; - -LIST_ENTRY DmRegisteredDevices; -ULONG DmTableEntries; -LIST_ENTRY DmRegisteredDevices; -PVOID* DmDeviceTable; - -BL_DEVICE_IO_INFORMATION DmDeviceIoInformation; - -/* FUNCTIONS *****************************************************************/ - -typedef struct _BL_REGISTERED_DEVICE -{ - LIST_ENTRY ListEntry; - BL_DEVICE_CALLBACKS Callbacks; -} BL_REGISTERED_DEVICE, *PBL_REGISTERED_DEVICE; - -PVOID* BlockIoDeviceTable; -ULONG BlockIoDeviceTableEntries; - -ULONG BlockIoFirmwareRemovableDiskCount; -ULONG BlockIoFirmwareRawDiskCount; -ULONG BlockIoFirmwareCdromCount; - -PVOID BlockIopAlignedBuffer; -ULONG BlockIopAlignedBufferSize; - -PVOID BlockIopPartialBlockBuffer; -ULONG BlockIopPartialBlockBufferSize; - -PVOID BlockIopPrefetchBuffer; - -PVOID BlockIopReadBlockBuffer; -ULONG BlockIopReadBlockBufferSize; - -ULONG HashTableId; - -BOOLEAN BlockIoInitialized; - -NTSTATUS -BlockIoOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ); - -NTSTATUS -BlockIoGetInformation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ); - -NTSTATUS -BlockIoSetInformation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ); - -NTSTATUS -BlockIoRead ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_ PULONG BytesRead - ); - -BL_DEVICE_CALLBACKS BlockIoDeviceFunctionTable = -{ - NULL, - BlockIoOpen, - NULL, - BlockIoRead, - NULL, - BlockIoGetInformation, - BlockIoSetInformation -}; - -NTSTATUS -BlockIoFirmwareWrite ( - _In_ PBL_BLOCK_DEVICE BlockDevice, - _In_ PVOID Buffer, - _In_ ULONGLONG Block, - _In_ ULONGLONG BlockCount - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIoFirmwareRead ( - _In_ PBL_BLOCK_DEVICE BlockDevice, - _In_ PVOID Buffer, - _In_ ULONGLONG Block, - _In_ ULONGLONG BlockCount - ) -{ - NTSTATUS Status; - EFI_BLOCK_IO *BlockProtocol; - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - ULONG FailureCount; - - for (FailureCount = 0, Status = STATUS_SUCCESS; - FailureCount < 2 && NT_SUCCESS(Status); - FailureCount++) - { - BlockProtocol = BlockDevice->Protocol; - - OldMode = CurrentExecutionContext->Mode; - if (CurrentExecutionContext->Mode != 1) - { - Status = STATUS_NOT_IMPLEMENTED; - break; - } - - //EfiPrintf(L"EFI Reading BLOCK %d off media %lx (%d blocks)\r\n", - //Block, BlockProtocol->Media->MediaId, BlockCount); - EfiStatus = BlockProtocol->ReadBlocks(BlockProtocol, - BlockProtocol->Media->MediaId, - Block, - BlockProtocol->Media->BlockSize * BlockCount, - Buffer); - if (EfiStatus == EFI_SUCCESS) - { - //EfiPrintf(L"EFI Read complete into buffer\r\n"); - //EfiPrintf(L"Buffer data: %lx %lx %lx %lx\r\n", *(PULONG)Buffer, *((PULONG)Buffer + 1), *((PULONG)Buffer + 2), *((PULONG)Buffer + 3)); - } - - if (OldMode != 1) - { - BlpArchSwitchContext(OldMode); - } - - Status = EfiGetNtStatusCode(EfiStatus); - if (Status != STATUS_MEDIA_CHANGED) - { - break; - } - - EfiCloseProtocol(BlockDevice->Handle, &EfiBlockIoProtocol); - - Status = EfiOpenProtocol(BlockDevice->Handle, - &EfiBlockIoProtocol, - (PVOID*)BlockDevice->Protocol); - } - - return Status; -} - -NTSTATUS -BlockIopFirmwareOperation ( - PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONGLONG Block, - _In_ ULONGLONG BlockCount, - _In_ ULONG OperationType - ) -{ - ULONG FailureCount; - PBL_BLOCK_DEVICE BlockDevice; - NTSTATUS Status; - - BlockDevice = DeviceEntry->DeviceSpecificData; - - if (OperationType == 1) - { - for (FailureCount = 0; FailureCount < 3; FailureCount++) - { - Status = BlockIoFirmwareWrite(BlockDevice, Buffer, Block, BlockCount); - if (Status >= 0) - { - break; - } - } - } - else - { - for (FailureCount = 0; FailureCount < 3; FailureCount++) - { - Status = BlockIoFirmwareRead(BlockDevice, Buffer, Block, BlockCount); - if (Status >= 0) - { - break; - } - } - } - return Status; -} - -NTSTATUS -BlockIopFreeAlignedBuffer ( - _Inout_ PVOID* Buffer, - _Inout_ PULONG BufferSize - ) -{ - NTSTATUS Status; - - if (*BufferSize) - { - Status = MmPapFreePages(*Buffer, BL_MM_INCLUDE_MAPPED_ALLOCATED); - - *Buffer = NULL; - *BufferSize = 0; - } - else - { - Status = STATUS_SUCCESS; - } - - return Status; -} - -NTSTATUS -BlockIopAllocateAlignedBuffer ( - _Inout_ PVOID* Buffer, - _Inout_ PULONG BufferSize, - _In_ ULONG Size, - _In_ ULONG Alignment - ) -{ - NTSTATUS Status; - - if (!Alignment) - { - ++Alignment; - } - - Status = STATUS_SUCCESS; - if ((Size > *BufferSize) || ((Alignment - 1) & (ULONG_PTR)*Buffer)) - { - BlockIopFreeAlignedBuffer(Buffer, BufferSize); - - *BufferSize = ROUND_TO_PAGES(Size); - - Status = MmPapAllocatePagesInRange(Buffer, - BlLoaderDeviceMemory, - *BufferSize >> PAGE_SHIFT, - 0, - Alignment >> PAGE_SHIFT, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - *BufferSize = 0; - } - } - - return Status; -} - -NTSTATUS -BlockIopReadUsingPrefetch ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG BlockCount - ) -{ - EfiPrintf(L"No prefetch support\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIopOperation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG BlockCount, - _In_ ULONG OperationType - ) -{ - PBL_BLOCK_DEVICE BlockDevice; - ULONG BufferSize, Alignment; - ULONGLONG Offset; - NTSTATUS Status; - - BlockDevice = DeviceEntry->DeviceSpecificData; - BufferSize = BlockDevice->BlockSize * BlockCount; - Offset = BlockDevice->Block + BlockDevice->StartOffset; - if ((BlockDevice->LastBlock + 1) < (BlockDevice->Block + BlockCount)) - { - EfiPrintf(L"Read past end of device\r\n"); - return STATUS_INVALID_PARAMETER; - } - - Alignment = BlockDevice->Alignment; - if (!(Alignment) || !((Alignment - 1) & (ULONG_PTR)Buffer)) - { - Status = BlockIopFirmwareOperation(DeviceEntry, - Buffer, - Offset, - BlockCount, - OperationType); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"EFI op failed: %lx\r\n", Status); - return Status; - } - - return STATUS_SUCCESS; - } - - Status = BlockIopAllocateAlignedBuffer(&BlockIopAlignedBuffer, - &BlockIopAlignedBufferSize, - BufferSize, - BlockDevice->Alignment); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"No memory for align\r\n"); - return STATUS_NO_MEMORY; - } - - if (OperationType == 1) - { - RtlCopyMemory(BlockIopAlignedBuffer, Buffer, BufferSize); - } - - Status = BlockIopFirmwareOperation(DeviceEntry, - BlockIopAlignedBuffer, - Offset, - BlockCount, - OperationType); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - if (!OperationType) - { - RtlCopyMemory(Buffer, BlockIopAlignedBuffer, BufferSize); - } - - return STATUS_SUCCESS; -} - -NTSTATUS -BlockIopReadWriteVirtualDevice ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _In_ ULONG Operation, - _Out_ PULONG BytesRead - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIopReadPhysicalDevice ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_ PULONG BytesRead - ) -{ - PBL_BLOCK_DEVICE BlockDevice; - PVOID ReadBuffer; - ULONGLONG OffsetEnd, AlignedOffsetEnd, Offset; - NTSTATUS Status; - - BlockDevice = DeviceEntry->DeviceSpecificData; - ReadBuffer = Buffer; - OffsetEnd = Size + BlockDevice->Offset; - if (OffsetEnd < Size) - { - OffsetEnd = -1; - return STATUS_INTEGER_OVERFLOW; - } - - AlignedOffsetEnd = ~(BlockDevice->BlockSize - 1) & (OffsetEnd + BlockDevice->BlockSize - 1); - if (AlignedOffsetEnd < OffsetEnd) - { - return STATUS_INTEGER_OVERFLOW; - } - - if ((BlockDevice->Offset) || (Size != AlignedOffsetEnd)) - { - Status = BlockIopAllocateAlignedBuffer(&BlockIopReadBlockBuffer, - &BlockIopReadBlockBufferSize, - AlignedOffsetEnd, - BlockDevice->Alignment); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to allocate buffer: %lx\r\n", Status); - return Status; - } - - ReadBuffer = BlockIopReadBlockBuffer; - } - - Offset = AlignedOffsetEnd / BlockDevice->BlockSize; - - if (BlockDevice->Unknown & 2) - { - Status = BlockIopReadUsingPrefetch(DeviceEntry, - ReadBuffer, - AlignedOffsetEnd / BlockDevice->BlockSize); - if (NT_SUCCESS(Status)) - { - goto ReadComplete; - } - } - - Status = BlockIopOperation(DeviceEntry, ReadBuffer, Offset, 0); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Block I/O failed: %lx\r\n", Status); - return Status; - } - - BlockDevice->Block += Offset; - -ReadComplete: - if (ReadBuffer != Buffer) - { - RtlCopyMemory(Buffer, - (PVOID)((ULONG_PTR)ReadBuffer + - (ULONG_PTR)BlockDevice->Offset), - Size); - } - - if (BytesRead) - { - *BytesRead = Size; - } - - return STATUS_SUCCESS; -} - -NTSTATUS -BlockIopBlockInformationCheck ( - _In_ PBL_BLOCK_DEVICE BlockDevice, - _In_opt_ PULONG DesiredSize, - _Out_opt_ PULONG Size, - _Out_opt_ PULONG OutputAdjustedSize - ) -{ - ULONG RealSize; - ULONGLONG Offset, LastOffset, RemainingOffset, MaxOffset; - NTSTATUS Status; - - RealSize = 0; - - Offset = (BlockDevice->Offset * BlockDevice->BlockSize) + BlockDevice->Block; - - if (Offset > ((BlockDevice->LastBlock + 1) * BlockDevice->BlockSize)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - LastOffset = (BlockDevice->LastBlock * BlockDevice->BlockSize) + BlockDevice->BlockSize - 1; - - MaxOffset = BlockDevice->LastBlock; - if (MaxOffset < BlockDevice->BlockSize) - { - MaxOffset = BlockDevice->BlockSize; - } - - if (LastOffset < MaxOffset) - { - - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - if (Offset > LastOffset) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - RemainingOffset = LastOffset - Offset + 1; - - if (DesiredSize != FALSE) - { - RealSize = *DesiredSize; - } - else - { - RealSize = ULONG_MAX; - } - - if (RemainingOffset < RealSize) - { - if (Size == FALSE) - { - RealSize = 0; - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - RealSize = RemainingOffset; - } - - Status = STATUS_SUCCESS; - -Quickie: - if (Size) - { - *Size = RealSize; - } - - return Status; -} - -NTSTATUS -BlockIoRead ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_ PULONG BytesRead - ) -{ - PBL_BLOCK_DEVICE BlockDevice; - NTSTATUS Status; - - /* Get the device-specific data, which is our block device descriptor */ - BlockDevice = DeviceEntry->DeviceSpecificData; - - /* Make sure that the buffer and size is valid */ - Status = BlockIopBlockInformationCheck(BlockDevice, &Size, BytesRead, &Size); - if (NT_SUCCESS(Status)) - { - /* Check if this is a virtual device or a physical device */ - if (BlockDevice->DeviceFlags & BL_BLOCK_DEVICE_VIRTUAL_FLAG) - { - /* Do a virtual read or write */ - Status = BlockIopReadWriteVirtualDevice(DeviceEntry, Buffer, Size, 0, BytesRead); - } - else - { - /* Do a physical read or write */ - Status = BlockIopReadPhysicalDevice(DeviceEntry, Buffer, Size, BytesRead); - } - } - else if (BytesRead) - { - /* We failed, if the caller wanted bytes read, return 0 */ - *BytesRead = 0; - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlockIoSetInformation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ) -{ - PBL_BLOCK_DEVICE BlockDevice; - ULONGLONG Offset; - - BlockDevice = DeviceEntry->DeviceSpecificData; - - /* Take the current block number and block-offset and conver to full offset */ - Offset = DeviceInformation->BlockDeviceInfo.Block * BlockDevice->BlockSize + - DeviceInformation->BlockDeviceInfo.Offset; - - /* Make sure that the full offset is still within the bounds of the device */ - if (Offset > ((BlockDevice->LastBlock + 1) * BlockDevice->BlockSize - 1)) - { - EfiPrintf(L"Offset out of bounds\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Convery the full raw offset into a block number and block-offset */ - BlockDevice->Block = Offset / BlockDevice->BlockSize; - BlockDevice->Offset = Offset % BlockDevice->BlockSize; - - /* Return the unknown */ - BlockDevice->Unknown = DeviceInformation->BlockDeviceInfo.Unknown; - - /* All done */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlockIoGetInformation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ) -{ - /* Copy the device specific data into the block device information */ - RtlCopyMemory(&DeviceInformation->BlockDeviceInfo, - DeviceEntry->DeviceSpecificData, - sizeof(DeviceInformation->BlockDeviceInfo)); - - /* Hardcode the device type */ - DeviceInformation->DeviceType = DiskDevice; - return STATUS_SUCCESS; -} - -BOOLEAN -BlDeviceIsVirtualPartitionDevice ( - _In_ PBL_DEVICE_DESCRIPTOR InputDevice, - _Outptr_ PBL_DEVICE_DESCRIPTOR* VirtualDevice - ) -{ - BOOLEAN IsVirtual; - PBL_LOCAL_DEVICE ParentDisk; - - /* Assume it isn't */ - IsVirtual = FALSE; - - /* Check if this is a partition device */ - if ((InputDevice->DeviceType == LegacyPartitionDevice) || - (InputDevice->DeviceType == PartitionDevice)) - { - /* Check if the parent disk is a VHD */ - ParentDisk = &InputDevice->Partition.Disk; - if (ParentDisk->Type == VirtualDiskDevice) - { - /* This is a virtual partition device -- does the caller want it? */ - IsVirtual = TRUE; - if (VirtualDevice) - { - *VirtualDevice = (PBL_DEVICE_DESCRIPTOR)(&ParentDisk->VirtualHardDisk + 1); - } - } - } - - /* Return */ - return IsVirtual; -} - -NTSTATUS -BlDeviceSetInformation ( - _In_ ULONG DeviceId, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ) -{ - PBL_DEVICE_ENTRY DeviceEntry; - - /* This parameter is not optional */ - if (!DeviceInformation) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the device ID is valid */ - if (DmTableEntries <= DeviceId) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the device entry */ - DeviceEntry = DmDeviceTable[DeviceId]; - if (!DeviceEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the device is open */ - if (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Set the device information */ - return DeviceEntry->Callbacks.SetInformation(DeviceEntry, DeviceInformation); -} - -NTSTATUS -BlDeviceGetInformation ( - _In_ ULONG DeviceId, - _Out_ PBL_DEVICE_INFORMATION DeviceInformation - ) -{ - PBL_DEVICE_ENTRY DeviceEntry; - - /* This parameter is not optional */ - if (!DeviceInformation) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the device ID is valid */ - if (DmTableEntries <= DeviceId) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the device entry */ - DeviceEntry = DmDeviceTable[DeviceId]; - if (!DeviceEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the device is open */ - if (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the device information */ - DeviceInformation->DeviceType = DeviceEntry->DeviceDescriptor->DeviceType; - return DeviceEntry->Callbacks.GetInformation(DeviceEntry, DeviceInformation); -} - -NTSTATUS -BlDeviceRead ( - _In_ ULONG DeviceId, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_opt_ PULONG BytesRead - ) -{ - PBL_DEVICE_ENTRY DeviceEntry; - NTSTATUS Status; - ULONG BytesTransferred; - - /* Make sure we have a buffer, and the device ID is valid */ - if (!(Buffer) || (DmTableEntries <= DeviceId)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the device entry for it */ - DeviceEntry = DmDeviceTable[DeviceId]; - if (!DeviceEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure this is a device opened for read access */ - if (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED) || - !(DeviceEntry->Flags & BL_DEVICE_ENTRY_READ_ACCESS)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Issue the read */ - Status = DeviceEntry->Callbacks.Read(DeviceEntry, - Buffer, - Size, - &BytesTransferred); - if (!DeviceEntry->Unknown) - { - /* Update performance counters */ - DmDeviceIoInformation.ReadCount += BytesTransferred; - } - - /* Return back how many bytes were read, if caller wants to know */ - if (BytesRead) - { - *BytesRead = BytesTransferred; - } - - /* Return read result */ - return Status; -} - -NTSTATUS -BlDeviceReadAtOffset ( - _In_ ULONG DeviceId, - _In_ ULONG Size, - _In_ ULONGLONG Offset, - _In_ PVOID Buffer, - _Out_ PULONG BytesRead - ) -{ - NTSTATUS Status; - BL_DEVICE_INFORMATION DeviceInfo; - - /* Get the current block and offset */ - Status = BlDeviceGetInformation(DeviceId, &DeviceInfo); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Get the block and block-offset based on the new raw offset */ - DeviceInfo.BlockDeviceInfo.Block = Offset / DeviceInfo.BlockDeviceInfo.BlockSize; - DeviceInfo.BlockDeviceInfo.Offset = Offset % DeviceInfo.BlockDeviceInfo.BlockSize; - - /* Update the block and offset */ - Status = BlDeviceSetInformation(DeviceId, &DeviceInfo); - if (NT_SUCCESS(Status)) - { - /* Now issue a read, with this block and offset configured */ - Status = BlDeviceRead(DeviceId, Buffer, Size, BytesRead); - } - - /* All good, return the caller */ - return Status; -} - -BOOLEAN -BlpDeviceCompare ( - _In_ PBL_DEVICE_DESCRIPTOR Device1, - _In_ PBL_DEVICE_DESCRIPTOR Device2 - ) -{ - BOOLEAN DeviceMatch; - ULONG DeviceSize; - - /* Assume failure */ - DeviceMatch = FALSE; - - /* Check if the two devices exist and are identical in type */ - if ((Device1) && (Device2) && (Device1->DeviceType == Device2->DeviceType)) - { - /* Take the bigger of the two sizes */ - DeviceSize = max(Device1->Size, Device2->Size); - if (DeviceSize >= (ULONG)FIELD_OFFSET(BL_DEVICE_DESCRIPTOR, Local)) - { - /* Compare the two devices up to their size */ - if (RtlEqualMemory(&Device1->Local, - &Device2->Local, - DeviceSize - FIELD_OFFSET(BL_DEVICE_DESCRIPTOR, Local))) - { - /* They match! */ - DeviceMatch = TRUE; - } - } - } - - /* Return matching state */ - return DeviceMatch; -} - -NTSTATUS -BlockIopFreeAllocations ( - _In_ PBL_BLOCK_DEVICE BlockDevice - ) -{ - /* If a block device was passed in, free it */ - if (BlockDevice) - { - BlMmFreeHeap(BlockDevice); - } - - /* Nothing else to do */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlockIoEfiGetBlockIoInformation ( - _In_ PBL_BLOCK_DEVICE BlockDevice - ) -{ - NTSTATUS Status; - EFI_BLOCK_IO_MEDIA *Media; - - /* Open the Block I/O protocol on this device */ - Status = EfiOpenProtocol(BlockDevice->Handle, - &EfiBlockIoProtocol, - (PVOID*)&BlockDevice->Protocol); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Get information on the block media */ - Media = BlockDevice->Protocol->Media; - - /* Set the appropriate device flags */ - BlockDevice->DeviceFlags = 0; - if (Media->RemovableMedia) - { - BlockDevice->DeviceFlags = BL_BLOCK_DEVICE_REMOVABLE_FLAG; - } - if (Media->MediaPresent) - { - BlockDevice->DeviceFlags |= BL_BLOCK_DEVICE_PRESENT_FLAG; - } - - /* No clue */ - BlockDevice->Unknown = 0; - - /* Set the block size */ - BlockDevice->BlockSize = Media->BlockSize; - - /* Make sure there's a last block value */ - if (!Media->LastBlock) - { - return STATUS_INVALID_PARAMETER; - } - - /* Don't let it be too high */ - if (Media->LastBlock > 0xFFFFFFFFFFE) - { - BlockDevice->LastBlock = 0xFFFFFFFFFFE; - } - else - { - BlockDevice->LastBlock = Media->LastBlock; - } - - /* Make the alignment the smaller of the I/O alignment or the block size */ - if (Media->IoAlign >= Media->BlockSize) - { - BlockDevice->Alignment = Media->IoAlign; - } - else - { - BlockDevice->Alignment = Media->BlockSize; - } - - /* All good */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlockIoEfiGetChildHandle ( - _In_ PBL_PROTOCOL_HANDLE ProtocolInterface, - _In_ PBL_PROTOCOL_HANDLE ChildProtocolInterface) -{ - NTSTATUS Status; - ULONG i, DeviceCount; - EFI_DEVICE_PATH *DevicePath, *ParentDevicePath; - EFI_HANDLE *DeviceHandles; - EFI_HANDLE Handle; - - /* Find all the Block I/O device handles on the system */ - DeviceCount = 0; - DeviceHandles = 0; - Status = EfiLocateHandleBuffer(ByProtocol, - &EfiBlockIoProtocol, - &DeviceCount, - &DeviceHandles); - if (!NT_SUCCESS(Status)) - { - /* Failed to enumerate, bail out */ - return Status; - } - - /* Loop all the handles */ - for (i = 0; i < DeviceCount; i++) - { - /* Check if this is the device itself */ - Handle = DeviceHandles[i]; - if (Handle == ProtocolInterface->Handle) - { - /* Skip it */ - continue; - } - - /* Get the device path of this device */ - Status = EfiOpenProtocol(Handle, - &EfiDevicePathProtocol, - (PVOID*)&DevicePath); - if (!NT_SUCCESS(Status)) - { - /* We failed, skip it */ - continue; - } - - /* See if we are its parent */ - ParentDevicePath = EfiIsDevicePathParent(ProtocolInterface->Interface, - DevicePath); - if (ParentDevicePath == ProtocolInterface->Interface) - { - /* Yup, return back to caller */ - ChildProtocolInterface->Handle = Handle; - ChildProtocolInterface->Interface = DevicePath; - Status = STATUS_SUCCESS; - goto Quickie; - } - - /* Close the device path */ - EfiCloseProtocol(Handle, &EfiDevicePathProtocol); - } - - /* If we got here, nothing was found */ - Status = STATUS_NO_SUCH_DEVICE; - -Quickie: - /* Free the handle array buffer */ - BlMmFreeHeap(DeviceHandles); - return Status; -} - -NTSTATUS -BlockIoGetGPTDiskSignature ( - _In_ PBL_DEVICE_ENTRY DeviceEntry, - _Out_ PGUID DiskSignature - ) -{ - EfiPrintf(L"GPT not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIoEfiGetDeviceInformation ( - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR Device; - PBL_BLOCK_DEVICE BlockDevice; - EFI_DEVICE_PATH *LeafNode; - BL_PROTOCOL_HANDLE Protocol[2]; - ACPI_HID_DEVICE_PATH *AcpiPath; - HARDDRIVE_DEVICE_PATH *DiskPath; - BOOLEAN Found; - ULONG i; - - /* Extract the identifier, and the block device object */ - Device = DeviceEntry->DeviceDescriptor; - BlockDevice = (PBL_BLOCK_DEVICE)DeviceEntry->DeviceSpecificData; - - /* Initialize protocol handles */ - Protocol[0].Handle = BlockDevice->Handle; - Protocol[1].Handle = 0; - - /* Open this device */ - Status = EfiOpenProtocol(Protocol[0].Handle, - &EfiDevicePathProtocol, - &Protocol[0].Interface); - if (!NT_SUCCESS(Status)) - { - /* Fail */ - return Status; - } - - /* Iterate twice -- once for the top level, once for the bottom */ - for (i = 0, Found = FALSE; Found == FALSE && Protocol[i].Handle; i++) - { - /* Check what kind of leaf node device this is */ - LeafNode = EfiGetLeafNode(Protocol[i].Interface); - EfiPrintf(L"Pass %d, Leaf node: %p Type: %d\r\n", i, LeafNode, LeafNode->Type); - if (LeafNode->Type == ACPI_DEVICE_PATH) - { - /* We only support floppy drives */ - AcpiPath = (ACPI_HID_DEVICE_PATH*)LeafNode; - if ((AcpiPath->HID == EISA_PNP_ID(0x604)) || - (AcpiPath->HID == EISA_PNP_ID(0x700))) - { - /* Set the boot library specific device types */ - Device->DeviceType = LocalDevice; - Device->Local.Type = FloppyDevice; - - /* The ACPI UID is the drive number */ - Device->Local.FloppyDisk.DriveNumber = AcpiPath->UID; - - /* We found a match */ - Found = TRUE; - } - } - else if ((LeafNode->Type == MEDIA_DEVICE_PATH) && (i == 1)) - { - /* Extract the disk path and check if it's a physical disk */ - DiskPath = (HARDDRIVE_DEVICE_PATH*)LeafNode; - EfiPrintf(L"Disk path: %p Type: %lx\r\n", DiskPath, LeafNode->SubType); - if (LeafNode->SubType == MEDIA_HARDDRIVE_DP) - { - /* Set this as a local device */ - Device->Local.Type = LocalDevice; - - /* Check if this is an MBR partition */ - if (DiskPath->SignatureType == SIGNATURE_TYPE_MBR) - { - /* Set that this is a local partition */ - Device->DeviceType = LegacyPartitionDevice; - Device->Partition.Disk.Type = LocalDevice; - - /* Write the MBR partition signature */ - BlockDevice->PartitionType = MbrPartition; - BlockDevice->Disk.Mbr.Signature = *(PULONG)&DiskPath->Signature[0]; - Found = TRUE; - } - else if (DiskPath->SignatureType == SIGNATURE_TYPE_GUID) - { - /* Set this as a GPT partition */ - BlockDevice->PartitionType = GptPartition; - Device->Local.HardDisk.PartitionType = GptPartition; - - /* Get the GPT signature */ - Status = BlockIoGetGPTDiskSignature(DeviceEntry, - &Device->Local.HardDisk.Gpt.PartitionSignature); - if (NT_SUCCESS(Status)) - { - /* Copy it */ - RtlCopyMemory(&BlockDevice->Disk.Gpt.Signature, - &Device->Local.HardDisk.Gpt.PartitionSignature, - sizeof(BlockDevice->Disk.Gpt.Signature)); - Found = TRUE; - } - } - - /* Otherwise, this is a raw disk */ - BlockDevice->PartitionType = RawPartition; - Device->Local.HardDisk.PartitionType = RawPartition; - Device->Local.HardDisk.Raw.DiskNumber = BlockIoFirmwareRawDiskCount++; - } - else if (LeafNode->SubType == MEDIA_CDROM_DP) - { - /* Set block device information */ - EfiPrintf(L"Found CD-ROM\r\n"); - BlockDevice->PartitionType = RawPartition; - BlockDevice->Type = CdRomDevice; - - /* Set CDROM data */ - Device->Local.Type = CdRomDevice; - Device->Local.FloppyDisk.DriveNumber = 0; - Found = TRUE; - } - } - else if ((LeafNode->Type != MEDIA_DEVICE_PATH) && - (LeafNode->Type != ACPI_DEVICE_PATH) && - (i == 0)) - { - /* This is probably a messaging device node. Are we under it? */ - Status = BlockIoEfiGetChildHandle(Protocol, &Protocol[1]); - EfiPrintf(L"Pass 0, non DP/ACPI path. Child handle obtained: %lx\r\n", Protocol[1].Handle); - if (!NT_SUCCESS(Status)) - { - /* We're not. So this must be a raw device */ - Device->DeviceType = LocalDevice; - Found = TRUE; - - /* Is it a removable raw device? */ - if (BlockDevice->DeviceFlags & BL_BLOCK_DEVICE_REMOVABLE_FLAG) - { - /* This is a removable (CD or Floppy or USB) device */ - BlockDevice->Type = FloppyDevice; - Device->Local.Type = FloppyDevice; - Device->Local.FloppyDisk.DriveNumber = BlockIoFirmwareRemovableDiskCount++; - EfiPrintf(L"Found Floppy\r\n"); - } - else - { - /* It's a fixed device */ - BlockDevice->Type = DiskDevice; - Device->Local.Type = DiskDevice; - - /* Set it as a raw partition */ - Device->Local.HardDisk.PartitionType = RawPartition; - Device->Local.HardDisk.Mbr.PartitionSignature = BlockIoFirmwareRawDiskCount++; - EfiPrintf(L"Found raw disk\r\n"); - } - } - } - } - - /* Close any protocols that we opened for each handle */ - while (i) - { - EfiCloseProtocol(Protocol[--i].Handle, &EfiDevicePathProtocol); - } - - /* Return appropriate status */ - return Found ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED; -} - -NTSTATUS -BlockIoEfiReset ( - VOID - ) -{ - EfiPrintf(L"not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIoEfiFlush ( - VOID - ) -{ - EfiPrintf(L"not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlockIoEfiCreateDeviceEntry ( - _In_ PBL_DEVICE_ENTRY *DeviceEntry, - _Out_ PVOID Handle - ) -{ - PBL_DEVICE_ENTRY IoDeviceEntry; - PBL_BLOCK_DEVICE BlockDevice; - NTSTATUS Status; - PBL_DEVICE_DESCRIPTOR Device; - - /* Allocate the entry for this device and zero it out */ - IoDeviceEntry = BlMmAllocateHeap(sizeof(*IoDeviceEntry)); - if (!IoDeviceEntry) - { - return STATUS_NO_MEMORY; - } - RtlZeroMemory(IoDeviceEntry, sizeof(*IoDeviceEntry)); - - /* Allocate the device descriptor for this device and zero it out */ - Device = BlMmAllocateHeap(sizeof(*Device)); - if (!Device) - { - return STATUS_NO_MEMORY; - } - RtlZeroMemory(Device, sizeof(*Device)); - - /* Allocate the block device specific data, and zero it out */ - BlockDevice = BlMmAllocateHeap(sizeof(*BlockDevice)); - if (!BlockDevice) - { - return STATUS_NO_MEMORY; - } - RtlZeroMemory(BlockDevice, sizeof(*BlockDevice)); - - /* Save the descriptor and block device specific data */ - IoDeviceEntry->DeviceSpecificData = BlockDevice; - IoDeviceEntry->DeviceDescriptor = Device; - - /* Set the size of the descriptor */ - Device->Size = sizeof(*Device); - - /* Copy the standard I/O callbacks */ - RtlCopyMemory(&IoDeviceEntry->Callbacks, - &BlockIoDeviceFunctionTable, - sizeof(IoDeviceEntry->Callbacks)); - - /* Add the two that are firmware specific */ - IoDeviceEntry->Callbacks.Reset = BlockIoEfiReset; - IoDeviceEntry->Callbacks.Flush = BlockIoEfiFlush; - - /* Save the EFI handle */ - BlockDevice->Handle = Handle; - - /* Get information on this device from EFI, caching it in the device */ - Status = BlockIoEfiGetBlockIoInformation(BlockDevice); - if (NT_SUCCESS(Status)) - { - /* Build the descriptor structure for this device */ - Status = BlockIoEfiGetDeviceInformation(IoDeviceEntry); - if (NT_SUCCESS(Status)) - { - /* We have a fully constructed device, return it */ - *DeviceEntry = IoDeviceEntry; - return STATUS_SUCCESS; - } - } - - /* Failure path, free the descriptor if we allocated one */ - if (IoDeviceEntry->DeviceDescriptor) - { - BlMmFreeHeap(IoDeviceEntry->DeviceDescriptor); - } - - /* Free any other specific allocations */ - BlockIopFreeAllocations(IoDeviceEntry->DeviceSpecificData); - - /* Free the device entry itself and return the failure code */ - BlMmFreeHeap(IoDeviceEntry); - EfiPrintf(L"Failed: %lx\r\n", Status); - return Status; -} - -NTSTATUS -BlockIoEfiCompareDevice ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ EFI_HANDLE Handle - ) -{ - PBL_LOCAL_DEVICE LocalDeviceInfo, EfiLocalDeviceInfo; - PBL_DEVICE_ENTRY DeviceEntry; - PBL_DEVICE_DESCRIPTOR EfiDevice; - NTSTATUS Status; - - DeviceEntry = NULL; - - /* Check if no device was given */ - if (!Device) - { - /* Fail the comparison */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check if this is a local disk device */ - if (Device->DeviceType != DiskDevice) - { - /* Nope -- is it a partition device? */ - if ((Device->DeviceType != LegacyPartitionDevice) && - (Device->DeviceType != PartitionDevice)) - { - /* Nope, so we can't compare */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* If so, return the device information for the parent disk */ - LocalDeviceInfo = &Device->Partition.Disk; - } - else - { - /* Just return the disk information itself */ - LocalDeviceInfo = &Device->Local; - } - - /* Create an EFI device entry for the EFI device handle */ - Status = BlockIoEfiCreateDeviceEntry(&DeviceEntry, Handle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Read the descriptor and assume failure for now */ - EfiDevice = DeviceEntry->DeviceDescriptor; - Status = STATUS_UNSUCCESSFUL; - - /* Check if the EFI device is a disk */ - if (EfiDevice->DeviceType != DiskDevice) - { - /* Nope, is it a partition? */ - if ((EfiDevice->DeviceType != LegacyPartitionDevice) && - (EfiDevice->DeviceType != PartitionDevice)) - { - /* Neither, invalid handle so bail out */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Yes, so get the information of the parent disk */ - EfiLocalDeviceInfo = &EfiDevice->Partition.Disk; - } - else - { - /* It's a disk, so get the disk information itself */ - EfiLocalDeviceInfo = &EfiDevice->Local; - } - - /* Are the two devices the same type? */ - if (EfiLocalDeviceInfo->Type != LocalDeviceInfo->Type) - { - /* Nope, that was easy */ - goto Quickie; - } - - /* Yes, what kind of device is the EFI side? */ - switch (EfiLocalDeviceInfo->Type) - { - case LocalDevice: - - /* Local hard drive, compare the signature */ - if (RtlCompareMemory(&EfiLocalDeviceInfo->HardDisk, - &LocalDeviceInfo->HardDisk, - sizeof(LocalDeviceInfo->HardDisk)) == - sizeof(LocalDeviceInfo->HardDisk)) - { - Status = STATUS_SUCCESS; - } - break; - - case FloppyDevice: - case CdRomDevice: - - /* Removable floppy or CD, compare the disk number */ - if (RtlCompareMemory(&EfiLocalDeviceInfo->FloppyDisk, - &LocalDeviceInfo->FloppyDisk, - sizeof(LocalDeviceInfo->FloppyDisk)) == - sizeof(LocalDeviceInfo->FloppyDisk)) - { - Status = STATUS_SUCCESS; - } - break; - - case RamDiskDevice: - - /* RAM disk, compare the size and base information */ - if (RtlCompareMemory(&EfiLocalDeviceInfo->RamDisk, - &LocalDeviceInfo->RamDisk, - sizeof(LocalDeviceInfo->RamDisk)) == - sizeof(LocalDeviceInfo->RamDisk)) - { - Status = STATUS_SUCCESS; - } - break; - - case FileDevice: - - /* File, compare the file identifier */ - if (RtlCompareMemory(&EfiLocalDeviceInfo->File, - &LocalDeviceInfo->File, - sizeof(LocalDeviceInfo->File)) == - sizeof(LocalDeviceInfo->File)) - { - Status = STATUS_SUCCESS; - } - break; - - /* Something else we don't support */ - default: - break; - } - -Quickie: - /* All done, did we have an EFI device entry? */ - if (DeviceEntry) - { - /* Free it, since we only needed it locally for comparison */ - BlMmFreeHeap(DeviceEntry->DeviceDescriptor); - BlockIopFreeAllocations(DeviceEntry->DeviceSpecificData); - BlMmFreeHeap(DeviceEntry); - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlockIoFirmwareOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_BLOCK_DEVICE BlockIoDevice - ) -{ - NTSTATUS Status; - BOOLEAN DeviceMatch; - BL_HASH_ENTRY HashEntry; - ULONG i, Id, DeviceCount; - PBL_DEVICE_ENTRY DeviceEntry; - EFI_HANDLE* DeviceHandles; - - /* Initialize everything */ - DeviceEntry = NULL; - DeviceCount = 0; - DeviceHandles = 0; - DeviceEntry = NULL; - - /* Ask EFI for handles to all block devices */ - Status = EfiLocateHandleBuffer(ByProtocol, - &EfiBlockIoProtocol, - &DeviceCount, - &DeviceHandles); - if (!NT_SUCCESS(Status)) - { - return STATUS_NO_SUCH_DEVICE; - } - - /* Build a hash entry, with the value inline */ - HashEntry.Flags = BL_HT_VALUE_IS_INLINE; - HashEntry.Size = sizeof(EFI_HANDLE); - - /* Loop each device we got */ - DeviceMatch = FALSE; - Status = STATUS_NO_SUCH_DEVICE; - for (i = 0; i < DeviceCount; i++) - { - /* Check if we have a match in the device hash table */ - HashEntry.Value = DeviceHandles[i]; - Status = BlHtLookup(HashTableId, &HashEntry, 0); - if (NT_SUCCESS(Status)) - { - /* We already know about this device */ - EfiPrintf(L"Device is known\r\n"); - continue; - } - - /* New device, store it in the hash table */ - Status = BlHtStore(HashTableId, - &HashEntry, - DeviceHandles[i], - sizeof(DeviceHandles[i])); - if (!NT_SUCCESS(Status)) - { - /* Free the array and fail */ - BlMmFreeHeap(DeviceHandles); - break; - } - - /* Create an entry for this device*/ - Status = BlockIoEfiCreateDeviceEntry(&DeviceEntry, DeviceHandles[i]); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"EFI create failed: %lx\r\n", Status); - continue; - } - - /* Add the device entry to the device table */ - Status = BlTblSetEntry(&BlockIoDeviceTable, - &BlockIoDeviceTableEntries, - DeviceEntry, - &Id, - TblDoNotPurgeEntry); - if (!NT_SUCCESS(Status)) - { - /* Remove it from teh hash table */ - BlHtDelete(HashTableId, &HashEntry); - - /* Free the block I/O device data */ - BlockIopFreeAllocations(DeviceEntry->DeviceSpecificData); - - /* Free the descriptor */ - BlMmFreeHeap(DeviceEntry->DeviceDescriptor); - - /* Free the entry */ - BlMmFreeHeap(DeviceEntry); - break; - } - - /* Does this device match what we're looking for? */ - DeviceMatch = BlpDeviceCompare(DeviceEntry->DeviceDescriptor, Device); - if (DeviceMatch) - { - /* Yep, return the data back */ - RtlCopyMemory(BlockIoDevice, - DeviceEntry->DeviceSpecificData, - sizeof(*BlockIoDevice)); - Status = STATUS_SUCCESS; - break; - } - } - - /* Free the device handle buffer array */ - BlMmFreeHeap(DeviceHandles); - - /* Return status */ - return Status; -} - -NTSTATUS -PartitionOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -VhdFileDeviceOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -DiskClose ( - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - NTSTATUS Status, LocalStatus; - PBL_BLOCK_DEVICE BlockDevice; - - /* Assume success */ - Status = STATUS_SUCCESS; - BlockDevice = DeviceEntry->DeviceSpecificData; - - /* Close the protocol */ - LocalStatus = EfiCloseProtocol(BlockDevice->Handle, &EfiBlockIoProtocol); - if (!NT_SUCCESS(LocalStatus)) - { - /* Only inherit failures */ - Status = LocalStatus; - } - - /* Free the block device allocations */ - LocalStatus = BlockIopFreeAllocations(BlockDevice); - if (!NT_SUCCESS(LocalStatus)) - { - /* Only inherit failures */ - Status = LocalStatus; - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -DiskOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - NTSTATUS Status; - - /* Use firmware-specific functions to open the disk */ - Status = BlockIoFirmwareOpen(Device, DeviceEntry->DeviceSpecificData); - if (NT_SUCCESS(Status)) - { - /* Overwrite with our own close routine */ - DeviceEntry->Callbacks.Close = DiskClose; - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -RdDeviceOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -FileDeviceOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -SpOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -UdpOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -BL_DEVICE_CALLBACKS FileDeviceFunctionTable = -{ - NULL, - FileDeviceOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS PartitionDeviceFunctionTable = -{ - NULL, - PartitionOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS RamDiskDeviceFunctionTable = -{ - NULL, - RdDeviceOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS DiskDeviceFunctionTable = -{ - NULL, - DiskOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS VirtualDiskDeviceFunctionTable = -{ - NULL, - VhdFileDeviceOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS UdpFunctionTable = -{ - NULL, - UdpOpen, - NULL, -}; - -BL_DEVICE_CALLBACKS SerialPortFunctionTable = -{ - NULL, - SpOpen, - NULL, -}; - -BOOLEAN -DeviceTableCompare ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _Inout_ PVOID Argument3, - _Inout_ PVOID Argument4 - ) -{ - BOOLEAN Found; - PBL_DEVICE_DESCRIPTOR Device = (PBL_DEVICE_DESCRIPTOR)Argument1; - PBL_DEVICE_ENTRY DeviceEntry = (PBL_DEVICE_ENTRY)Entry; - ULONG Flags = *(PULONG)Argument2; - ULONG Unknown = *(PULONG)Argument3; - - /* Assume failure */ - Found = FALSE; - - /* Compare the device descriptor */ - if (BlpDeviceCompare(DeviceEntry->DeviceDescriptor, Device)) - { - /* Compare something */ - if (DeviceEntry->Unknown == Unknown) - { - /* Compare flags */ - if ((!(Flags & BL_DEVICE_READ_ACCESS) || (DeviceEntry->Flags & BL_DEVICE_ENTRY_READ_ACCESS)) && - (!(Flags & BL_DEVICE_WRITE_ACCESS) || (DeviceEntry->Flags & BL_DEVICE_ENTRY_WRITE_ACCESS))) - { - /* And more flags */ - if (((Flags & 8) || !(DeviceEntry->Flags & 8)) && - (!(Flags & 8) || (DeviceEntry->Flags & 8))) - { - /* Found a match! */ - Found = TRUE; - } - } - } - } - - /* Return matching state */ - return Found; -} - -NTSTATUS -DeviceTableDestroyEntry ( - _In_ PVOID Entry, - _In_ ULONG DeviceId - ) -{ - PBL_DEVICE_ENTRY DeviceEntry = (PBL_DEVICE_ENTRY)Entry; - NTSTATUS Status; - - /* Call the close routine for this entry */ - Status = DeviceEntry->Callbacks.Close(DmDeviceTable[DeviceId]); - - /* Free the descriptor, and the device itself */ - BlMmFreeHeap(DeviceEntry->DeviceDescriptor); - BlMmFreeHeap(DeviceEntry); - - /* Clear out the netry, and return */ - DmDeviceTable[DeviceId] = NULL; - return Status; -} - -NTSTATUS -DeviceTablePurge ( - _In_ PVOID Entry - ) -{ - PBL_DEVICE_ENTRY DeviceEntry = (PBL_DEVICE_ENTRY)Entry; - NTSTATUS Status; - - /* Check if the device is opened */ - if (DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED) - { - /* It is, so can't purge it */ - Status = STATUS_UNSUCCESSFUL; - } - else - { - /* It isn't, so destroy the entry */ - Status = DeviceTableDestroyEntry(DeviceEntry, DeviceEntry->DeviceId); - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -BlockIoDeviceTableDestroyEntry ( - _In_ PVOID Entry, - _In_ ULONG DeviceId - ) -{ - PBL_DEVICE_ENTRY DeviceEntry = (PBL_DEVICE_ENTRY)Entry; - NTSTATUS Status; - - /* Call the close routine for this entry */ - Status = DeviceEntry->Callbacks.Close(DeviceEntry); - - /* Free the descriptor, and the device itself */ - BlMmFreeHeap(DeviceEntry->DeviceDescriptor); - BlMmFreeHeap(DeviceEntry); - - /* Clear out the netry, and return */ - BlockIoDeviceTable[DeviceId] = NULL; - return Status; -} - -NTSTATUS -BlockIoDeviceTableDestroy ( - VOID - ) -{ - NTSTATUS Status; - - /* Call the entry destructor on each entry in the table */ - Status = BlTblMap(BlockIoDeviceTable, - BlockIoDeviceTableEntries, - BlockIoDeviceTableDestroyEntry); - - /* Free the table and return */ - BlMmFreeHeap(BlockIoDeviceTable); - return Status; -} - -NTSTATUS -BlockIopDestroy ( - VOID - ) -{ - /* Free the prefetch buffer */ - BlMmFreeHeap(BlockIopPrefetchBuffer); - - /* Set state to non initialized */ - BlockIoInitialized = FALSE; - - /* Return back */ - return STATUS_SUCCESS; -} - -ULONG -BlockIoEfiHashFunction ( - _In_ PBL_HASH_ENTRY Entry, - _In_ ULONG TableSize - ) -{ - /* Get rid of the alignment bits to have a more unique number */ - return ((ULONG_PTR)Entry->Value >> 3) % TableSize; -} - -NTSTATUS -BlockIopInitialize ( - VOID - ) -{ - NTSTATUS Status; - - /* Allocate the block device table and zero it out */ - BlockIoDeviceTableEntries = 8; - BlockIoDeviceTable = BlMmAllocateHeap(sizeof(PVOID) * - BlockIoDeviceTableEntries); - if (!BlockIoDeviceTableEntries) - { - return STATUS_NO_MEMORY; - } - RtlZeroMemory(BlockIoDeviceTable, sizeof(PVOID) * BlockIoDeviceTableEntries); - - /* Register our destructor */ - Status = BlpIoRegisterDestroyRoutine(BlockIoDeviceTableDestroy); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Initialize all counters */ - BlockIoFirmwareRemovableDiskCount = 0; - BlockIoFirmwareRawDiskCount = 0; - BlockIoFirmwareCdromCount = 0; - - /* Initialize the buffers and their sizes */ - BlockIopAlignedBuffer = NULL; - BlockIopAlignedBufferSize = 0; - BlockIopPartialBlockBuffer = NULL; - BlockIopPartialBlockBufferSize = 0; - BlockIopPrefetchBuffer = NULL; - BlockIopReadBlockBuffer = NULL; - BlockIopReadBlockBufferSize = 0; - - /* Allocate the prefetch buffer */ - Status = MmPapAllocatePagesInRange(&BlockIopPrefetchBuffer, - BlLoaderDeviceMemory, - 0x100, - 0, - 0, - NULL, - 0); - if (NT_SUCCESS(Status)) - { - /* Initialize the block cache */ - Status = BcInitialize(); - if (NT_SUCCESS(Status)) - { - /* Initialize the block device hash table */ - Status = BlHtCreate(29, BlockIoEfiHashFunction, NULL, &HashTableId); - if (NT_SUCCESS(Status)) - { - /* Register our destructor */ - Status = BlpIoRegisterDestroyRoutine(BlockIopDestroy); - if (NT_SUCCESS(Status)) - { - /* We're good */ - BlockIoInitialized = TRUE; - } - } - } - } - - /* Check if this is the failure path */ - if (!NT_SUCCESS(Status)) - { - /* Free the prefetch buffer is one was allocated */ - if (BlockIopPrefetchBuffer) - { - MmPapFreePages(BlockIopPrefetchBuffer, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - } - - /* Return back to the caller */ - return Status; -} - -BOOLEAN -BlockIoDeviceTableCompare ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ) -{ - PBL_DEVICE_ENTRY DeviceEntry = (PBL_DEVICE_ENTRY)Entry; - PBL_DEVICE_DESCRIPTOR Device = (PBL_DEVICE_DESCRIPTOR)Argument1; - - /* Compare the two devices */ - return BlpDeviceCompare(DeviceEntry->DeviceDescriptor, Device); -} - -NTSTATUS -BlockIoOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PBL_DEVICE_ENTRY DeviceEntry - ) -{ - NTSTATUS Status; - PBL_BLOCK_DEVICE BlockDevice; - PBL_DEVICE_ENTRY FoundDeviceEntry; - ULONG Dummy; - - /* Check if the block I/O manager is initialized */ - if (!BlockIoInitialized) - { - /* First call, initialize it now */ - Status = BlockIopInitialize(); - if (!NT_SUCCESS(Status)) - { - /* Failed to initialize block I/O */ - return Status; - } - } - - /* Copy a function table for block I/O devices */ - RtlCopyMemory(&DeviceEntry->Callbacks, - &BlockIoDeviceFunctionTable, - sizeof(DeviceEntry->Callbacks)); - - /* Allocate a block I/O device */ - BlockDevice = BlMmAllocateHeap(sizeof(*BlockDevice)); - if (!BlockDevice) - { - return STATUS_NO_MEMORY; - } - - /* Set this as the device-specific data for this device entry */ - Status = STATUS_SUCCESS; - DeviceEntry->DeviceSpecificData = BlockDevice; - - /* Check if we already have this device in our device table */ - FoundDeviceEntry = BlTblFindEntry(BlockIoDeviceTable, - BlockIoDeviceTableEntries, - &Dummy, - BlockIoDeviceTableCompare, - Device, - NULL, - NULL, - NULL); - if (FoundDeviceEntry) - { - /* We already found a device, so copy its device data and callbacks */ - //EfiPrintf(L"Block I/O Device entry found: %p\r\n", FoundDeviceEntry); - RtlCopyMemory(BlockDevice, FoundDeviceEntry->DeviceSpecificData, sizeof(*BlockDevice)); - RtlCopyMemory(&DeviceEntry->Callbacks, - &FoundDeviceEntry->Callbacks, - sizeof(DeviceEntry->Callbacks)); - return Status; - } - - /* Zero out the device for now */ - RtlZeroMemory(BlockDevice, sizeof(*BlockDevice)); - - /* Is this a disk? */ - if (Device->DeviceType == DiskDevice) - { - /* What type of disk is it? */ - switch (Device->Local.Type) - { - /* Is it a raw physical disk? */ - case LocalDevice: - case FloppyDevice: - case CdRomDevice: - /* Open a disk device */ - Status = DiskDeviceFunctionTable.Open(Device, DeviceEntry); - break; - - /* Is it a RAM disk? */ - case RamDiskDevice: - /* Open a RAM disk */ - Status = RamDiskDeviceFunctionTable.Open(Device, DeviceEntry); - break; - - /* Is it a file? */ - case FileDevice: - /* Open a file */ - Status = FileDeviceFunctionTable.Open(Device, DeviceEntry); - break; - - /* Is it a VHD? */ - case VirtualDiskDevice: - /* Open a virtual disk */ - Status = VirtualDiskDeviceFunctionTable.Open(Device, DeviceEntry); - break; - - /* Is it something else? */ - default: - /* Not supported */ - Status = STATUS_INVALID_PARAMETER; - break; - } - } - else if ((Device->DeviceType == LegacyPartitionDevice) || - (Device->DeviceType == PartitionDevice)) - { - /* This is a partition on a disk, open it as such */ - Status = PartitionDeviceFunctionTable.Open(Device, DeviceEntry); - } - else - { - /* Other devices are not supported */ - Status = STATUS_INVALID_PARAMETER; - } - - /* Check for failure */ - if (!NT_SUCCESS(Status)) - { - /* Free any allocations for this device */ - BlockIopFreeAllocations(BlockDevice); - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlpDeviceResolveLocate ( - _In_ PBL_DEVICE_DESCRIPTOR InputDevice, - _Out_ PBL_DEVICE_DESCRIPTOR* LocateDevice - ) -{ - EfiPrintf(L"Not implemented!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlDeviceClose ( - _In_ ULONG DeviceId - ) -{ - PBL_DEVICE_ENTRY DeviceEntry; - - /* Validate the device ID */ - if (DmTableEntries <= DeviceId) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure there's a device there */ - DeviceEntry = DmDeviceTable[DeviceId]; - if (DeviceEntry == NULL) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the device is active */ - if (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Drop a reference and check if it's the last one */ - DeviceEntry->ReferenceCount--; - if (!DeviceEntry->ReferenceCount) - { - /* Mark the device as inactive */ - DeviceEntry->Flags = ~BL_DEVICE_ENTRY_OPENED; - } - - /* We're good */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlpDeviceOpen ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ ULONG Flags, - _In_ ULONG Unknown, - _Out_ PULONG DeviceId - ) -{ - NTSTATUS Status; - PBL_DEVICE_ENTRY DeviceEntry; - PBL_DEVICE_DESCRIPTOR LocateDeviceDescriptor; - PBL_REGISTERED_DEVICE RegisteredDevice; - PLIST_ENTRY NextEntry, ListHead; - - DeviceEntry = NULL; - - /* Check for missing parameters */ - if (!(Device) || !(DeviceId) || !(Device->Size)) - { - /* Bail out */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Make sure both read and write access are set */ - if (!(Flags & (BL_DEVICE_READ_ACCESS | BL_DEVICE_WRITE_ACCESS))) - { - /* Bail out */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check if the boot device is being opened */ - if (Device->DeviceType == BootDevice) - { - /* Select it */ - Device = BlpBootDevice; - } - - /* Check if the 'locate' device is being opened */ - if (Device->DeviceType == LocateDevice) - { - /* Go find it */ - Status = BlpDeviceResolveLocate(Device, &LocateDeviceDescriptor); - if (!NT_SUCCESS(Status)) - { - /* Not found, bail out */ - goto Quickie; - } - - /* Select it */ - Device = LocateDeviceDescriptor; - } - - /* Check if the device isn't ready yet */ - if (Device->Flags & 1) - { - /* Return a failure */ - Status = STATUS_DEVICE_NOT_READY; - goto Quickie; - } - - /* Check if we already have an entry for the device */ - DeviceEntry = BlTblFindEntry(DmDeviceTable, - DmTableEntries, - DeviceId, - DeviceTableCompare, - Device, - &Flags, - &Unknown, - NULL); - if (DeviceEntry) - { - /* Return it, taking a reference on it */ - *DeviceId = DeviceEntry->DeviceId; - ++DeviceEntry->ReferenceCount; - DeviceEntry->Flags |= BL_DEVICE_ENTRY_OPENED; - return STATUS_SUCCESS; - } - - /* We don't, allocate one */ - DeviceEntry = BlMmAllocateHeap(sizeof(*DeviceEntry)); - if (!DeviceEntry) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Fill it out */ - RtlZeroMemory(DeviceEntry, sizeof(*DeviceEntry)); - DeviceEntry->ReferenceCount = 1; - DeviceEntry->Flags |= (BL_DEVICE_ENTRY_OPENED | - BL_DEVICE_ENTRY_READ_ACCESS | - BL_DEVICE_ENTRY_WRITE_ACCESS); - DeviceEntry->Unknown = Unknown; - - /* Save flag 8 if needed */ - if (Flags & 8) - { - DeviceEntry->Flags |= 8; - } - - /* Allocate a device descriptor for the device */ - DeviceEntry->DeviceDescriptor = BlMmAllocateHeap(Device->Size); - if (!DeviceEntry->DeviceDescriptor) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Copy the descriptor that was passed in */ - RtlCopyMemory(DeviceEntry->DeviceDescriptor, Device, Device->Size); - - /* Now loop the list of dynamically registered devices */ - ListHead = &DmRegisteredDevices; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the device */ - RegisteredDevice = CONTAINING_RECORD(NextEntry, - BL_REGISTERED_DEVICE, - ListEntry); - - /* Open the device */ - Status = RegisteredDevice->Callbacks.Open(Device, DeviceEntry); - if (NT_SUCCESS(Status)) - { - /* The device was opened, so we have the right one */ - goto DeviceOpened; - } - - /* Nope, keep trying */ - NextEntry = NextEntry->Flink; - } - - /* Well, it wasn't a dynamic device. Is it a block device? */ - if ((Device->DeviceType == PartitionDevice) || - (Device->DeviceType == DiskDevice) || - (Device->DeviceType == LegacyPartitionDevice)) - { - /* Call the Block I/O handler */ - Status = BlockIoDeviceFunctionTable.Open(Device, DeviceEntry); - } - else if (Device->DeviceType == SerialDevice) - { - /* It's a serial device, call the serial device handler */ - Status = SerialPortFunctionTable.Open(Device, DeviceEntry); - } - else if (Device->DeviceType == UdpDevice) - { - /* It's a network device, call the UDP device handler */ - Status = UdpFunctionTable.Open(Device, DeviceEntry); - } - else - { - /* Unsupported type of device */ - Status = STATUS_NOT_IMPLEMENTED; - } - - /* Check if the device was opened successfully */ - if (NT_SUCCESS(Status)) - { -DeviceOpened: - /* Save the entry in the device table */ - Status = BlTblSetEntry(&DmDeviceTable, - &DmTableEntries, - DeviceEntry, - DeviceId, - DeviceTablePurge); - if (NT_SUCCESS(Status)) - { - /* It worked -- return the ID in the table to the caller */ - EfiPrintf(L"Device ID: %lx\r\n", *DeviceId); - DeviceEntry->DeviceId = *DeviceId; - return STATUS_SUCCESS; - } - } - -Quickie: - /* Failure path -- did we allocate a device entry? */ - EfiPrintf(L"Block failure: %lx\r\n", Status); - if (DeviceEntry) - { - /* Yep -- did it have a descriptor? */ - if (DeviceEntry->DeviceDescriptor) - { - /* Free it */ - BlMmFreeHeap(DeviceEntry->DeviceDescriptor); - } - - /* Free the entry */ - BlMmFreeHeap(DeviceEntry); - } - - /* Return the failure */ - return Status; -} - -NTSTATUS -BlpDeviceInitialize ( - VOID - ) -{ - NTSTATUS Status; - - /* Initialize the table count and list of devices */ - DmTableEntries = 8; - InitializeListHead(&DmRegisteredDevices); - - /* Initialize device information */ - DmDeviceIoInformation.ReadCount = 0; - DmDeviceIoInformation.WriteCount = 0; - - /* Allocate the device table */ - DmDeviceTable = BlMmAllocateHeap(DmTableEntries * sizeof(PVOID)); - if (DmDeviceTable) - { - /* Clear it */ - RtlZeroMemory(DmDeviceTable, DmTableEntries * sizeof(PVOID)); -#if BL_BITLOCKER_SUPPORT - /* Initialize BitLocker support */ - Status = FvebInitialize(); -#else - Status = STATUS_SUCCESS; -#endif - } - else - { - /* No memory, we'll fail */ - Status = STATUS_NO_MEMORY; - } - - /* Return initialization state */ - return Status; -} - diff --git a/boot/environ/lib/io/display/display.c b/boot/environ/lib/io/display/display.c deleted file mode 100644 index f842a025cdb..00000000000 --- a/boot/environ/lib/io/display/display.c +++ /dev/null @@ -1,989 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/platform/display.c - * PURPOSE: Boot Library Display Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include - -/* DATA VARIABLES ************************************************************/ - -PVOID BfiCachedStrikeData; -LIST_ENTRY BfiDeferredListHead; -LIST_ENTRY BfiFontFileListHead; -PVOID BfiGraphicsRectangle; - -ULONG ConsoleGraphicalResolutionListFlags; -BL_DISPLAY_MODE ConsoleGraphicalResolutionList[3] = -{ - {1024, 768, 1024}, - {800, 600, 800}, - {1024, 600, 1024} -}; -ULONG ConsoleGraphicalResolutionListSize = RTL_NUMBER_OF(ConsoleGraphicalResolutionList); - -BL_DISPLAY_MODE ConsoleTextResolutionList[1] = -{ - {80, 25, 80} -}; - -PVOID DspRemoteInputConsole; -PVOID DspTextConsole; -PVOID DspGraphicalConsole; -PVOID DspLocalInputConsole; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -DsppGraphicsDisabledByBcd ( - VOID - ) -{ - BOOLEAN Disabled; - NTSTATUS Status; - - /* Get the boot option, and if present, return the result */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_GraphicsModeDisabled, - &Disabled); - return (NT_SUCCESS(Status) && (Disabled)); -} - -NTSTATUS -DsppLoadFontFile ( - _In_ PWCHAR FontFileName - ) -{ - PBL_DEVICE_DESCRIPTOR FontDevice; - NTSTATUS Status; - SIZE_T NameLength, DirectoryLength, TotalLength; - PWCHAR FontPath, FontDirectory; - BL_LIBRARY_PARAMETERS LibraryParameters; - BOOLEAN CustomDirectory, CustomDevice; - - /* Initialize locals */ - CustomDirectory = TRUE; - CustomDevice = TRUE; - FontDevice = NULL; - FontPath = NULL; - FontDirectory = NULL; - - /* Check if a custom font path should be used */ - Status = BlGetBootOptionString(BlpApplicationEntry.BcdData, - BcdLibraryString_FontPath, - &FontDirectory); - if (!NT_SUCCESS(Status)) - { - /* Nope, use the one configured by the library */ - CustomDirectory = FALSE; - RtlCopyMemory(&LibraryParameters, - &BlpLibraryParameters, - sizeof(LibraryParameters)), - FontDirectory = LibraryParameters.FontBaseDirectory; - } - - /* Do we still not have a font directory? */ - if (!FontDirectory) - { - /* Use the boot device and boot directory */ - CustomDevice = FALSE; - FontDevice = BlpBootDevice; - FontDirectory = L"\\EFI\\Microsoft\\Boot\\Fonts"; - } - else - { - /* Otherwise, if we have a font directory, what device is the app on? */ - Status = BlGetBootOptionDevice(BlpApplicationEntry.BcdData, - BcdLibraryDevice_ApplicationDevice, - &FontDevice, - NULL); - if (!NT_SUCCESS(Status)) - { - /* If we don't know the device, we can't open the path */ - goto Quickie; - } - } - - /* Figure out the length of the file name, and of the directory */ - NameLength = wcslen(FontFileName); - DirectoryLength = wcslen(FontDirectory); - - /* Safely add them up*/ - Status = RtlSIZETAdd(NameLength, DirectoryLength, &TotalLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Convert to bytes */ - Status = RtlSIZETMult(TotalLength, sizeof(WCHAR), &TotalLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Add a terminating NUL */ - Status = RtlSIZETAdd(TotalLength, sizeof(UNICODE_NULL), &TotalLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Allocate the final buffer for it */ - FontPath = BlMmAllocateHeap(TotalLength); - if (!FontPath) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Concatenate the directory with the file name */ - wcscpy(FontPath, FontDirectory); - wcscat(FontPath, FontFileName); - - /* Try to load this font */ - Status = BfLoadFontFile(FontDevice, FontPath); - -Quickie: - /* Check if we had a custom font device allocated and free it */ - if ((CustomDevice) && (FontDevice)) - { - BlMmFreeHeap(FontDevice); - } - - /* Check if we had a custom font directory allocated and free it */ - if ((CustomDirectory) && (CustomDevice)) - { - ASSERT(FontDirectory); - BlMmFreeHeap(FontDirectory); - } - - /* Check if we had allocated a font path and free it */ - if (FontPath) - { - BlMmFreeHeap(FontPath); - } - - /* Return back */ - return Status; -} - -NTSTATUS -BlpDisplayRegisterLocale ( - _In_ PWCHAR Locale - ) -{ - BOOLEAN StandardLocale; - NTSTATUS Status; - PWCHAR FontFileName; - PBL_DEFERRED_FONT_FILE DeferredFont; - PLIST_ENTRY NextEntry; - WCHAR Prefix[3]; - - /* Assume custom locale */ - StandardLocale = FALSE; - - /* Bail out if the locale string seems invalid */ - if (wcslen(Locale) < 2) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check the prefix first, then traditional vs. simplified */ - Prefix[0] = Locale[0]; - Prefix[1] = Locale[1]; - Prefix[2] = UNICODE_NULL; - if (!_wcsicmp(Prefix, L"ja")) - { - FontFileName = L"\\jpn_boot.ttf"; - } - else if (!_wcsicmp(Prefix, L"ko")) - { - FontFileName = L"\\kor_boot.ttf"; - } - else if (!(_wcsicmp(Locale, L"zh-CN")) || - !(_wcsicmp(Locale, L"zh-CHS")) || - !(_wcsicmp(Locale, L"zh-Hans"))) - { - FontFileName = L"\\chs_boot.ttf"; - } - else if (!(_wcsicmp(Locale, L"zh-TW")) && - !(_wcsicmp(Locale, L"zh-CHT")) && - !(_wcsicmp(Locale, L"zh-HK")) && - !(_wcsicmp(Locale, L"zh-Hant"))) - { - FontFileName = L"\\cht_boot.ttf"; - } - else - { - StandardLocale = TRUE; - FontFileName = L"\\wgl4_boot.ttf"; - } - - /* Parse all the currently deferred fonts*/ - NextEntry = BfiDeferredListHead.Flink; - while (NextEntry != &BfiDeferredListHead) - { - /* Grab the font */ - DeferredFont = CONTAINING_RECORD(NextEntry, BL_DEFERRED_FONT_FILE, ListEntry); - - /* Move to the next entry, and remove this one */ - NextEntry = NextEntry->Flink; - RemoveEntryList(&DeferredFont->ListEntry); - - /* Free the deferred font, we'll be loading a new one */ - BfiFreeDeferredFontFile(DeferredFont); - } - - /* Load the primary font */ - Status = DsppLoadFontFile(FontFileName); - if (NT_SUCCESS(Status) && !(StandardLocale)) - { - /* Also load the standard US one if we loaded a different one */ - Status = DsppLoadFontFile(L"\\wgl4_boot.ttf"); - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -DsppInitialize ( - _In_ ULONG Flags - ) -{ - BL_LIBRARY_PARAMETERS LibraryParameters = BlpLibraryParameters; - BOOLEAN NoGraphics, HighestMode; - NTSTATUS Status; - PBL_DISPLAY_MODE DisplayMode; - ULONGLONG GraphicsResolution; - PBL_GRAPHICS_CONSOLE GraphicsConsole; - PBL_TEXT_CONSOLE TextConsole, RemoteConsole; - - /* Initialize font data */ - BfiCachedStrikeData = 0; - InitializeListHead(&BfiDeferredListHead); - InitializeListHead(&BfiFontFileListHead); - - /* Allocate the font rectangle */ - BfiGraphicsRectangle = BlMmAllocateHeap(90); - if (!BfiGraphicsRectangle) - { - return STATUS_NO_MEMORY; - } - - /* Check if display re-initialization is requested */ - if (LibraryParameters.LibraryFlags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) - { - /* Recreate a local input console */ - ConsoleCreateLocalInputConsole(); - } - - /* Check if no graphics console is needed */ - if ((Flags & BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE) || - (DsppGraphicsDisabledByBcd())) - { - /* Remember this */ - NoGraphics = TRUE; - } - else - { - /* No graphics -- remember this */ - NoGraphics = FALSE; - } - - /* On first load, we always initialize a graphics display */ - GraphicsConsole = NULL; - if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || !(NoGraphics)) - { - /* Default to mode 0 (1024x768) */ - DisplayMode = &ConsoleGraphicalResolutionList[0]; - - /* Check what resolution to use*/ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdLibraryInteger_GraphicsResolution, - &GraphicsResolution); - if (NT_SUCCESS(Status)) - { - ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG; - EfiPrintf(L"Display selection not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - - /* Check if the highest mode should be forced */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_GraphicsForceHighestMode, - &HighestMode); - if (NT_SUCCESS(Status)) - { - ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; - EfiPrintf(L"High res mode not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - - /* Do we need graphics mode after all? */ - if (!NoGraphics) - { - /* Yep -- go allocate it */ - GraphicsConsole = BlMmAllocateHeap(sizeof(*GraphicsConsole)); - if (GraphicsConsole) - { - /* Construct it */ - Status = ConsoleGraphicalConstruct(GraphicsConsole); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"GFX FAILED: %lx\r\n", Status); - BlMmFreeHeap(GraphicsConsole); - GraphicsConsole = NULL; - } - } - } - - /* Are we using something else than the default mode? */ - if (DisplayMode != &ConsoleGraphicalResolutionList[0]) - { - EfiPrintf(L"Display path not handled\r\n"); - return STATUS_NOT_SUPPORTED; - } - - /* Mask out all the flags now */ - ConsoleGraphicalResolutionListFlags &= ~(BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG | - BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG); - } - - /* Do we have a graphics console? */ - TextConsole = NULL; - if (!GraphicsConsole) - { - /* Nope -- go allocate a text console */ - TextConsole = BlMmAllocateHeap(sizeof(*TextConsole)); - if (TextConsole) - { - /* Construct it */ - Status = ConsoleTextLocalConstruct(TextConsole, TRUE); - if (!NT_SUCCESS(Status)) - { - BlMmFreeHeap(TextConsole); - TextConsole = NULL; - } - } - } - - /* Initialize all globals to NULL */ - DspRemoteInputConsole = NULL; - DspTextConsole = NULL; - DspGraphicalConsole = NULL; - - /* If we don't have a text console, go get a remote console */ - RemoteConsole = NULL; - if (!TextConsole) - { - ConsoleCreateRemoteConsole(&RemoteConsole); - } - - /* Do we have a remote console? */ - if (!RemoteConsole) - { - /* Nope -- what about a graphical one? */ - if (GraphicsConsole) - { - /* Yes, use it for both graphics and text */ - DspGraphicalConsole = GraphicsConsole; - DspTextConsole = GraphicsConsole; - } - else if (TextConsole) - { - /* Nope, but we have a text console */ - DspTextConsole = TextConsole; - } - - /* Console has been setup */ - return STATUS_SUCCESS; - } - - /* We have a remote console -- have to figure out how to use it*/ - EfiPrintf(L"Display path not handled\r\n"); - return STATUS_NOT_SUPPORTED; -} - -NTSTATUS -DsppReinitialize ( - _In_ ULONG Flags - ) -{ - PBL_TEXT_CONSOLE TextConsole; - PBL_GRAPHICS_CONSOLE GraphicsConsole; - NTSTATUS Status; - ULONGLONG GraphicsResolution; - BOOLEAN HighestMode; - BL_DISPLAY_MODE CurrentResolution; - - /* Do we have local input yet? */ - if (!DspLocalInputConsole) - { - /* Create it now */ - ConsoleCreateLocalInputConsole(); - } - - /* If a graphics console is present without a remote console... */ - TextConsole = NULL; - if (!(DspRemoteInputConsole) && (DspGraphicalConsole)) - { - /* Try to create a remote console */ - ConsoleCreateRemoteConsole(&TextConsole); - } - - /* All good for now */ - Status = STATUS_SUCCESS; - - /* Now check if we were able to create the remote console */ - if (TextConsole) - { - EfiPrintf(L"EMS not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - - /* Set a local for the right cast */ - GraphicsConsole = DspGraphicalConsole; - - /* Nothing to do without a graphics console being reinitialized */ - if (!(Flags & BL_LIBRARY_FLAG_REINITIALIZE_ALL) || - !(GraphicsConsole) || - !(((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->IsEnabled(GraphicsConsole))) - { - return Status; - } - - /* Check if graphics are disabled in the BCD */ - if (DsppGraphicsDisabledByBcd()) - { - /* Turn off the graphics console, switching back to text mode */ - Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->Enable(GraphicsConsole, FALSE); - } - - /* Check if a custom graphics resolution is set */ - if (MiscGetBootOption(BlpApplicationEntry.BcdData, - BcdLibraryInteger_GraphicsResolution)) - { - /* Check what it's set to */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdLibraryInteger_GraphicsResolution, - &GraphicsResolution); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Now check our current graphical resolution */ - Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->GetGraphicalResolution(GraphicsConsole, - &CurrentResolution); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remember that we're forcing a video mode */ - ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG; - - /* Check which resolution to set */ - if (!GraphicsResolution) - { - /* 1024x768 */ - EfiPrintf(L"Display selection not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - else if (GraphicsResolution == 1) - { - /* 800x600 */ - EfiPrintf(L"Display selection not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - else if (GraphicsResolution == 2) - { - /* 1024x600 */ - EfiPrintf(L"Display selection not yet handled\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - } - - /* Check if the force highest mode setting is present */ - if (MiscGetBootOption(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_GraphicsForceHighestMode)) - { - /* Check what it's set to */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_GraphicsForceHighestMode, - &HighestMode); - if ((NT_SUCCESS(Status)) && (HighestMode)) - { - /* Remember that high rest mode is being forced */ - ConsoleGraphicalResolutionListFlags |= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; - - /* Turn it on */ - //((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->SetGraphicalResolution(GraphicsConsole, 0, 0); - - /* All done now */ - ConsoleGraphicalResolutionListFlags |= ~BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG; - EfiPrintf(L"High res mode not yet handled\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - } - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlpDisplayReinitialize ( - VOID - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - PBL_TEXT_CONSOLE TextConsole; - PBL_INPUT_CONSOLE InputConsole; - - /* Do we have a local console? */ - InputConsole = DspLocalInputConsole; - if (InputConsole) - { - /* Reinitialize it */ - Status = InputConsole->Callbacks->Reinitialize((PBL_TEXT_CONSOLE)InputConsole); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Do we have a text console? */ - TextConsole = DspTextConsole; - if (TextConsole) - { - /* Reinitialize it */ - Status = TextConsole->Callbacks->Reinitialize(TextConsole); - } - - /* Return status */ - return Status; -} - -NTSTATUS -BlpDisplayInitialize ( - _In_ ULONG Flags - ) -{ - NTSTATUS Status; - - /* Are we resetting or initializing? */ - if (Flags & BL_LIBRARY_FLAG_REINITIALIZE) - { - /* This is a reset */ - Status = DsppReinitialize(Flags); - if (NT_SUCCESS(Status)) - { - /* Re-initialize the class as well */ - Status = BlpDisplayReinitialize(); - } - } - else - { - /* Initialize the display */ - Status = DsppInitialize(Flags); - } - - /* Return display initialization state */ - return Status; -} - -VOID -BlDisplayGetTextCellResolution ( - _Out_ PULONG TextWidth, - _Out_ PULONG TextHeight - ) -{ - NTSTATUS Status; - PBL_GRAPHICS_CONSOLE GraphicsConsole; - - /* If the caller doesn't want anything, bail out */ - if (!(TextWidth) || !(TextHeight)) - { - return; - } - - /* Do we have a text console? */ - Status = STATUS_UNSUCCESSFUL; - if (DspTextConsole) - { - /* Do we have a graphics console? */ - GraphicsConsole = DspGraphicalConsole; - if (GraphicsConsole) - { - /* Is it currently active? */ - if (((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->IsEnabled(GraphicsConsole)) - { - /* Yep -- query it */ - EfiPrintf(L"GFX active, not supported query\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - //Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->GetTextCellResolution(GraphicsConsole); - } - } - } - - /* Check if we failed to get it from the graphics console */ - if (!NT_SUCCESS(Status)) - { - /* Set default text size */ - *TextWidth = 8; - *TextHeight = 8; - } -} - -NTSTATUS -BlDisplaySetScreenResolution ( - VOID - ) -{ - PBL_GRAPHICS_CONSOLE Console; - NTSTATUS Status; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Do we have a graphics console? */ - Console = DspGraphicalConsole; - if (Console) - { - /* Is it currently active? */ - if (((PBL_GRAPHICS_CONSOLE_VTABLE)Console->TextConsole.Callbacks)->IsEnabled(Console)) - { - /* If so, disable it */ - return ((PBL_GRAPHICS_CONSOLE_VTABLE)Console->TextConsole.Callbacks)->Enable(Console, FALSE); - } - } - - /* We should've now fallen back to text mode */ - if (!DspTextConsole) - { - /* Then fail, as no display appears active */ - Status = STATUS_UNSUCCESSFUL; - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlDisplayGetScreenResolution ( - _Out_ PULONG HRes, - _Out_ PULONG VRes - ) -{ - NTSTATUS Status; - BL_DISPLAY_MODE Resolution; - PBL_GRAPHICS_CONSOLE GraphicsConsole; - - /* Assume failure if no consoles are active */ - Status = STATUS_UNSUCCESSFUL; - - /* Do we have a text console? */ - if (DspTextConsole) - { - /* Do we have an active graphics console? */ - GraphicsConsole = DspGraphicalConsole; - if ((GraphicsConsole) && - (((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->IsEnabled(GraphicsConsole))) - { - /* Get the resolution */ - Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->GetGraphicalResolution(GraphicsConsole, &Resolution); - if (NT_SUCCESS(Status)) - { - /* Return it back to the caller */ - *HRes = Resolution.HRes; - *VRes = Resolution.VRes; - } - } - else - { - /* Return defaults */ - *HRes = 640; - *VRes = 200; - Status = STATUS_SUCCESS; - } - } - - /* Return if we got a valid resolution back */ - return Status; -} - -VOID -BlDisplayInvalidateOemBitmap ( - VOID - ) -{ - PBGRT_TABLE BgrtTable; - NTSTATUS Status; - - /* Search for the BGRT */ - Status = BlUtlGetAcpiTable((PVOID*)&BgrtTable, BGRT_SIGNATURE); - if (NT_SUCCESS(Status)) - { - /* Mark the bitmap as invalid */ - BgrtTable->Status &= ~BGRT_STATUS_IMAGE_VALID; - - /* Unmap the table */ - BlMmUnmapVirtualAddressEx(BgrtTable, BgrtTable->Header.Length); - } -} - -PBITMAP -BlDisplayGetOemBitmap ( - _In_opt_ PCOORD Offsets, - _Out_opt_ PULONG Flags - ) -{ - NTSTATUS Status; - ULONG Size; - PHYSICAL_ADDRESS PhysicalAddress; - PBGRT_TABLE BgrtTable; - PBITMAP Bitmap; - PBMP_HEADER Header; - - Bitmap = NULL; - BgrtTable = NULL; - - /* Search for the BGRT */ - Status = BlUtlGetAcpiTable((PVOID*)&BgrtTable, BGRT_SIGNATURE); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Make sure this is really a BGRT */ - if (BgrtTable->Header.Signature != BGRT_SIGNATURE) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Make sure the BGRT table length is valid */ - if (BgrtTable->Header.Length != sizeof(*BgrtTable)) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Make sure its a bitmap */ - if (BgrtTable->ImageType != BgrtImageTypeBitmap) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Make sure it's somewhere in RAM */ - if (!BgrtTable->LogoAddress) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Map the bitmap header only for now */ - PhysicalAddress.QuadPart = BgrtTable->LogoAddress; - Status = BlMmMapPhysicalAddressEx((PVOID*)&Header, - 0, - sizeof(BMP_HEADER), - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Capture the real size of the header */ - Size = Header->Size; - - /* Unmap the bitmap header */ - BlMmUnmapVirtualAddressEx(BgrtTable, sizeof(BMP_HEADER)); - - /* If the real size is smaller than at least a V3 bitmap, bail out */ - if (Size < sizeof(BITMAP)) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Map the real size of the header */ - Status = BlMmMapPhysicalAddressEx((PVOID*)&Bitmap, - 0, - Size, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Make sure this is a non-compressed 24-bit or 32-bit V3 bitmap */ - if ((Bitmap->BmpHeader.Signature != 'MB') || - (Bitmap->DibHeader.Compression) || - ((Bitmap->DibHeader.BitCount != 24) && - (Bitmap->DibHeader.BitCount != 32)) || - (Bitmap->DibHeader.Size != sizeof(DIB_HEADER))) - { - Status = STATUS_ACPI_INVALID_TABLE; - goto Quickie; - } - - /* Check if caller wants the offsets back */ - if (Offsets) - { - /* Give them away */ - Offsets->X = BgrtTable->OffsetX; - Offsets->Y = BgrtTable->OffsetY; - } - - /* Check if the caller wants flags */ - if (Flags) - { - /* Return if the image is valid */ - *Flags = BgrtTable->Status & BGRT_STATUS_IMAGE_VALID; - } - -Quickie: - /* Check if we had mapped the BGRT */ - if (BgrtTable) - { - /* Unmap it */ - BlMmUnmapVirtualAddressEx(BgrtTable, BgrtTable->Header.Length); - } - - /* Check if this is the failure path */ - if (!NT_SUCCESS(Status)) - { - /* Did we have the OEM bitmap mapped? */ - if (Bitmap) - { - /* Unmap it */ - BlMmUnmapVirtualAddressEx(Bitmap, Bitmap->BmpHeader.Size); - } - - /* No bitmap to return */ - Bitmap = NULL; - } - - /* Return the bitmap back, if any */ - return Bitmap; -} - -BOOLEAN -BlDisplayValidOemBitmap ( - VOID - ) -{ - PBITMAP Bitmap; - ULONG HRes, VRes, Height, Width, Flags; - COORD Offsets; - BOOLEAN Result; - NTSTATUS Status; - - /* First check if mobile graphics are enabled */ - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_MobileGraphics, - &Result); - if ((NT_SUCCESS(Status)) && (Result)) - { - /* Yes, so use the firmware image */ - return TRUE; - } - - /* Nope, so we'll check the ACPI OEM bitmap */ - Result = FALSE; - Bitmap = BlDisplayGetOemBitmap(&Offsets, &Flags); - - /* Is there one? */ - if (Bitmap) - { - /* Is it valid? */ - if (Flags & BGRT_STATUS_IMAGE_VALID) - { - /* Get the current screen resolution */ - Status = BlDisplayGetScreenResolution(&HRes, &VRes); - if (NT_SUCCESS(Status)) - { - /* Is there a valid width? */ - Width = Bitmap->DibHeader.Width; - if (Width) - { - /* Is there a valid height? */ - Height = Bitmap->DibHeader.Height; - if (Height) - { - /* Will if fit on this screen? */ - if (((Width + Offsets.X) <= HRes) && - ((Height + Offsets.Y) <= VRes)) - { - /* Then it's all good! */ - Result = TRUE; - } - } - } - } - } - - /* Unmap the bitmap for now, it will be drawn later */ - BlMmUnmapVirtualAddressEx(Bitmap, Bitmap->BmpHeader.Size); - } - - /* Return that a valid OEM bitmap exists */ - return Result; -} - -NTSTATUS -BlDisplayClearScreen ( - VOID - ) -{ - NTSTATUS Status; - PBL_TEXT_CONSOLE TextConsole; - - /* Nothing to do if there's no text console */ - Status = STATUS_SUCCESS; - TextConsole = DspTextConsole; - if (TextConsole) - { - /* Otherwise, clear the whole screen */ - Status = TextConsole->Callbacks->ClearText(TextConsole, FALSE); - if (NT_SUCCESS(Status)) - { - /* Invalidate the OEM bitmap at this point */ - BlDisplayInvalidateOemBitmap(); - } - } - - /* All done */ - return Status; -}; - -NTSTATUS -BlDisplaySetCursorType ( - _In_ ULONG Type - ) -{ - NTSTATUS Status; - PBL_TEXT_CONSOLE TextConsole; - BL_DISPLAY_STATE State; - - /* Nothing to do if there's no text console */ - Status = STATUS_SUCCESS; - TextConsole = DspTextConsole; - if (TextConsole) - { - /* Write visibility state and call the function to change it */ - State.CursorVisible = Type; - Status = TextConsole->Callbacks->SetTextState(TextConsole, 8, &State); - } - - /* All done */ - return Status; -} diff --git a/boot/environ/lib/io/display/efi/gop.c b/boot/environ/lib/io/display/efi/gop.c deleted file mode 100644 index bafc8f2da11..00000000000 --- a/boot/environ/lib/io/display/efi/gop.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/efi/gop.c - * PURPOSE: Boot Library EFI GOP Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ConsoleEfiGopGetGraphicalFormat ( - _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *ModeInfo, - _Out_ PULONG PixelDepth - ) -{ - /* Convert the format to depth */ - if (ModeInfo->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) - { - *PixelDepth = 32; - return STATUS_SUCCESS; - } - if (ModeInfo->PixelFormat == PixelBitMask) - { - *PixelDepth = 24; - return STATUS_SUCCESS; - } - return STATUS_UNSUCCESSFUL; -} - -BOOLEAN -ConsoleEfiGopIsPixelFormatSupported ( - _In_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode - ) -{ - BOOLEAN Supported; - EFI_PIXEL_BITMASK PixelMask; - - Supported = FALSE; - - /* Check if it's simple BGR8 */ - if (Mode->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) - { - Supported = TRUE; - } - else - { - /* Otherwise, we can check if it's a masked format */ - if (Mode->PixelFormat == PixelBitMask) - { - /* Check if the masked format is BGR8 */ - PixelMask.BlueMask = 0xFF; - PixelMask.GreenMask = 0xFF00; - PixelMask.RedMask = 0xFF0000; - PixelMask.ReservedMask = 0; - if (RtlEqualMemory(&Mode->PixelInformation, - &PixelMask, - sizeof(PixelMask))) - { - Supported = TRUE; - } - } - } - - /* Return if the format was supported */ - return Supported; -} - - -NTSTATUS -ConsoleEfiGopFindModeFromAllowed ( - _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol, - _In_ PBL_DISPLAY_MODE SupportedModes, - _In_ ULONG MaximumIndex, - _Out_ PULONG SupportedMode - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleEfiGopEnable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - PVOID FrameBuffer; - UINTN CurrentMode, Dummy; - ULONG Mode, PixelDepth; - UINTN FrameBufferSize; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation; - EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol; - NTSTATUS Status; - PHYSICAL_ADDRESS FrameBufferPhysical; - - /* Capture the current mode and protocol */ - Mode = GraphicsConsole->Mode; - Protocol = GraphicsConsole->Protocol; - - /* Get the current mode and its information */ - Status = EfiGopGetCurrentMode(Protocol, &CurrentMode, &ModeInformation); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Check if we're not in the mode we should be */ - if (CurrentMode != Mode) - { - /* Switch modes */ - Status = EfiGopSetMode(Protocol, Mode); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Reset the OEM bitmap and get the new more information */ - BlDisplayInvalidateOemBitmap(); - EfiGopGetCurrentMode(Protocol, &Dummy, &ModeInformation); - } - - /* Get the pixel depth for this mode */ - Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth); - if (NT_SUCCESS(Status)) - { - /* Get the framebuffer for this mode */ - EfiGopGetFrameBuffer(Protocol, &FrameBufferPhysical, &FrameBufferSize); - - /* Map the framebuffer, try as writeback first */ - FrameBuffer = NULL; - Status = BlMmMapPhysicalAddressEx(&FrameBuffer, - BlMemoryWriteBack, - FrameBufferSize, - FrameBufferPhysical); - if (!NT_SUCCESS(Status)) - { - /* That didn't work, so try uncached next */ - Status = BlMmMapPhysicalAddressEx(&FrameBuffer, - BlMemoryUncached, - FrameBufferSize, - FrameBufferPhysical); - } - } - - /* Check if getting all the required information worked out */ - if (NT_SUCCESS(Status)) - { - /* Capture the resolution, depth, and framebuffer information */ - GraphicsConsole->DisplayMode.HRes = ModeInformation.HorizontalResolution; - GraphicsConsole->DisplayMode.VRes = ModeInformation.VerticalResolution; - GraphicsConsole->DisplayMode.HRes2 = ModeInformation.PixelsPerScanLine; - GraphicsConsole->PixelDepth = PixelDepth; - GraphicsConsole->FrameBuffer = FrameBuffer; - GraphicsConsole->FrameBufferSize = FrameBufferSize; - GraphicsConsole->PixelsPerScanLine = ModeInformation.PixelsPerScanLine; - - /* All good */ - Status = STATUS_SUCCESS; - } - else if (CurrentMode != GraphicsConsole->Mode) - { - /* We failed somewhere, reset the mode and the OEM bitmap back */ - EfiGopSetMode(Protocol, CurrentMode); - BlDisplayInvalidateOemBitmap(); - } - - /* Return back to caller */ - return Status; -} - -VOID -ConsoleEfiGopClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - ULONG OldMode; - - /* Did we switch modes when we turned on the console? */ - OldMode = GraphicsConsole->OldMode; - if (GraphicsConsole->Mode != OldMode) - { - /* Restore the old mode and reset the OEM bitmap in ACPI */ - EfiGopSetMode(GraphicsConsole->Protocol, OldMode); - BlDisplayInvalidateOemBitmap(); - } - - /* Close the GOP protocol */ - EfiCloseProtocol(GraphicsConsole->Handle, - &EfiGraphicsOutputProtocol); -} - -NTSTATUS -ConsoleEfiGopOpen ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - NTSTATUS Status; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GopProtocol; - ULONG Mode, PixelDepth; - UINTN CurrentMode; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION ModeInformation; - BOOLEAN CurrentModeOk; - - /* Open a handle to GOP */ - Status = EfiOpenProtocol(GraphicsConsole->Handle, - &EfiGraphicsOutputProtocol, - (PVOID*)&GopProtocol); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"GOP OPEN failed: %lx\r\n", Status); - return STATUS_NOT_SUPPORTED; - } - - /* Get the current mode */ - Status = EfiGopGetCurrentMode(GopProtocol, &CurrentMode, &ModeInformation); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"GOP mode failed: %lx\r\n", Status); - goto Quickie; - } - - Mode = CurrentMode; - - /* Check if any custom BCD options were provided */ - if (ConsoleGraphicalResolutionListFlags & - (BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG | - BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG)) - { - /* We'll have to find a mode */ - CurrentModeOk = FALSE; - } - else - { - /* Then we should be in the default mode, check if the pixel format is OK */ - CurrentModeOk = ConsoleEfiGopIsPixelFormatSupported(&ModeInformation); - } - - /* Is the mode/format OK? */ - if (!CurrentModeOk) - { - /* Nope -- we'll have to go find one */ - Status = ConsoleEfiGopFindModeFromAllowed(GopProtocol, - ConsoleGraphicalResolutionList, - ConsoleGraphicalResolutionListSize, - &Mode); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - } - - /* Store mode information */ - GraphicsConsole->Protocol = GopProtocol; - GraphicsConsole->Mode = Mode; - GraphicsConsole->OldMode = CurrentMode; - - /* Get format information */ - Status = ConsoleEfiGopGetGraphicalFormat(&ModeInformation, &PixelDepth); - if (NT_SUCCESS(Status)) - { - /* Store it */ - GraphicsConsole->OldDisplayMode.HRes = ModeInformation.HorizontalResolution; - GraphicsConsole->OldDisplayMode.VRes = ModeInformation.VerticalResolution; - GraphicsConsole->OldDisplayMode.HRes2 = ModeInformation.PixelsPerScanLine; - GraphicsConsole->PixelDepth = PixelDepth; - return STATUS_SUCCESS; - } - -Quickie: - /* We failed, close the protocol and return the failure code */ - EfiPrintf(L"Get format failed: %lx\r\n", Status); - EfiCloseProtocol(GraphicsConsole->Handle, &EfiGraphicsOutputProtocol); - return Status; -} - diff --git a/boot/environ/lib/io/display/efi/guicons.c b/boot/environ/lib/io/display/efi/guicons.c deleted file mode 100644 index 441ccb26f13..00000000000 --- a/boot/environ/lib/io/display/efi/guicons.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/efi/guicons.c - * PURPOSE: Boot Library EFI GUI Console Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -VOID -ConsoleFirmwareGraphicalClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - /* Call the correct close routine based on the console mode */ - if (GraphicsConsole->Type == BlUgaConsole) - { - ConsoleEfiUgaClose(GraphicsConsole); - } - else - { - ConsoleEfiGopClose(GraphicsConsole); - } -} - -NTSTATUS -ConsoleEfiGraphicalOpenProtocol ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole, - _In_ BL_GRAPHICS_CONSOLE_TYPE Type - ) -{ - ULONG HandleIndex, HandleCount; - EFI_HANDLE* HandleArray; - EFI_HANDLE Handle; - NTSTATUS Status; - PVOID Interface; - - /* Find a device handle that implements either GOP or UGA */ - HandleCount = 0; - HandleArray = NULL; - Status = EfiLocateHandleBuffer(ByProtocol, - (Type == BlGopConsole) ? - &EfiGraphicsOutputProtocol : - &EfiUgaDrawProtocol, - &HandleCount, - &HandleArray); - if (!NT_SUCCESS(Status)) - { - /* Nothing supports this (no video card?) */ - EfiPrintf(L"Status: %lx Count: %d\r\n", Status, HandleCount); - return STATUS_UNSUCCESSFUL; - } - - /* Scan through the handles we received */ - for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) - { - /* Try to open each one */ - GraphicsConsole->Handle = HandleArray[HandleIndex]; - Handle = HandleArray[HandleIndex]; - Status = EfiOpenProtocol(Handle, &EfiDevicePathProtocol, &Interface); - if (NT_SUCCESS(Status)) - { - /* Test worked, close the protocol */ - EfiCloseProtocol(Handle, &EfiDevicePathProtocol); - - /* Now open the real protocol we want, either UGA or GOP */ - Status = Type ? ConsoleEfiUgaOpen(GraphicsConsole) : - ConsoleEfiGopOpen(GraphicsConsole); - if (NT_SUCCESS(Status)) - { - /* It worked -- store the type of console this is */ - GraphicsConsole->Type = Type; - return STATUS_SUCCESS; - } - } - } - - /* We failed to find a working GOP/UGA protocol provider */ - return STATUS_UNSUCCESSFUL; -} - -NTSTATUS -ConsoleFirmwareGraphicalClear ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Color - ) -{ - NTSTATUS Status; - UCHAR Pixel[4] = { 0 }; - - /* Convert the standard color to a firmware pixel color */ - Status = ConsolepConvertColorToPixel(Color, Pixel); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Check if this is GOP or UGA */ - if (Console->Type == BlUgaConsole) - { - EfiPrintf(L"Uga not supported\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - } - else - { - /* For GOP, just fill the screen */ - ConsolepClearBuffer(Console->FrameBuffer, - Console->DisplayMode.HRes, - Pixel, - Console->DisplayMode.VRes, - Console->PixelsPerScanLine, - Console->PixelDepth); - Status = STATUS_SUCCESS; - } - - /* All clear */ - return Status; -} - -NTSTATUS -ConsoleFirmwareGraphicalEnable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - NTSTATUS Status; - - /* Check what type of console this is */ - if (GraphicsConsole->Type == BlUgaConsole) - { - /* Handle UGA */ - Status = ConsoleEfiUgaSetResolution(GraphicsConsole, - &GraphicsConsole->DisplayMode, - 1); - } - else - { - /* Handle GOP */ - Status = ConsoleEfiGopEnable(GraphicsConsole); - } - - /* Return back to caller */ - return Status; -} - -VOID -ConsoleFirmwareGraphicalDisable ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - /* Is this a GOP console? */ - if (GraphicsConsole->Type == BlGopConsole) - { - /* Did we map a framebuffer? */ - if (GraphicsConsole->FrameBuffer) - { - /* Unmap it */ - BlMmUnmapVirtualAddressEx(GraphicsConsole->FrameBuffer, - GraphicsConsole->FrameBufferSize); - } - } -} diff --git a/boot/environ/lib/io/display/efi/textcons.c b/boot/environ/lib/io/display/efi/textcons.c deleted file mode 100644 index fe950f9d7fb..00000000000 --- a/boot/environ/lib/io/display/efi/textcons.c +++ /dev/null @@ -1,625 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/efi/textcons.c - * PURPOSE: Boot Library EFI Text Console Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -BL_COLOR -ConsoleEfiTextGetColorForeground ( - _In_ UINT32 Attributes - ) -{ - /* Read the foreground color attribute and convert to CGA color index */ - switch (Attributes & 0x0F) - { - case EFI_BLACK: - return Black; - case EFI_BLUE: - return Blue; - case EFI_GREEN: - return Green; - case EFI_RED: - return Red; - case EFI_CYAN: - return Cyan; - case EFI_MAGENTA: - return Magenta; - case EFI_BROWN: - return Brown; - case EFI_LIGHTGRAY: - return LtGray; - case EFI_DARKGRAY: - return Gray; - case EFI_LIGHTBLUE: - return LtBlue; - case EFI_LIGHTGREEN: - return LtGreen; - case EFI_LIGHTCYAN: - return LtCyan; - case EFI_LIGHTRED: - return LtRed; - case EFI_LIGHTMAGENTA: - return LtMagenta; - case EFI_YELLOW: - return Yellow; - case EFI_WHITE: - default: - return White; - } -} - -BL_COLOR -ConsoleEfiTextGetColorBackground ( - _In_ UINT32 Attributes - ) -{ - /* Read the background color attribute and convert to CGA color index */ - switch (Attributes & 0xF0) - { - case EFI_BACKGROUND_MAGENTA: - return Magenta; - case EFI_BACKGROUND_BROWN: - return Brown; - case EFI_BACKGROUND_LIGHTGRAY: - return White; - case EFI_BACKGROUND_BLACK: - default: - return Black; - case EFI_BACKGROUND_RED: - return Red; - case EFI_BACKGROUND_GREEN: - return Green; - case EFI_BACKGROUND_CYAN: - return Cyan; - case EFI_BACKGROUND_BLUE: - return Blue; - } -} - -ULONG -ConsoleEfiTextGetEfiColorBackground ( - _In_ BL_COLOR Color - ) -{ - /* Convert the CGA color index into an EFI background attribute */ - switch (Color) - { - case Blue: - case LtBlue: - return EFI_BACKGROUND_BLUE; - case Green: - case LtGreen: - return EFI_BACKGROUND_GREEN; - case Cyan: - case LtCyan: - return EFI_BACKGROUND_CYAN; - case Red: - case LtRed: - return EFI_BACKGROUND_RED; - case Magenta: - case LtMagenta: - return EFI_BACKGROUND_MAGENTA; - case Brown: - case Yellow: - return EFI_BACKGROUND_BROWN; - case LtGray: - case White: - return EFI_BACKGROUND_LIGHTGRAY; - case Black: - case Gray: - default: - return EFI_BACKGROUND_BLACK; - } -} - -ULONG -ConsoleEfiTextGetEfiColorForeground ( - _In_ BL_COLOR Color - ) -{ - /* Convert the CGA color index into an EFI foreground attribute */ - switch (Color) - { - case Black: - return EFI_BLACK; - case Blue: - return EFI_BLUE; - case Green: - return EFI_GREEN; - case Cyan: - return EFI_CYAN; - case Red: - return EFI_RED; - case Magenta: - return EFI_MAGENTA; - case Brown: - return EFI_BROWN; - case LtGray: - return EFI_LIGHTGRAY; - case Gray: - return EFI_DARKGRAY; - case LtBlue: - return EFI_LIGHTBLUE; - case LtGreen: - return EFI_LIGHTGREEN; - case LtCyan: - return EFI_LIGHTCYAN; - case LtRed: - return EFI_LIGHTRED; - case LtMagenta: - return EFI_LIGHTMAGENTA; - case Yellow: - return EFI_YELLOW; - case White: - default: - return EFI_WHITE; - } -} - -ULONG -ConsoleEfiTextGetAttribute ( - BL_COLOR BgColor, - BL_COLOR FgColor - ) -{ - /* Convert each part and OR into a single attribute */ - return ConsoleEfiTextGetEfiColorBackground(BgColor) | - ConsoleEfiTextGetEfiColorForeground(FgColor); -} - -VOID -ConsoleEfiTextGetStateFromMode ( - _In_ EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode, - _Out_ PBL_DISPLAY_STATE State - ) -{ - ULONG TextWidth, TextHeight; - - /* Get all the EFI data and convert it into our own structure */ - BlDisplayGetTextCellResolution(&TextWidth, &TextHeight); - State->FgColor = ConsoleEfiTextGetColorForeground(Mode->Attribute); - State->BgColor = ConsoleEfiTextGetColorBackground(Mode->Attribute); - State->XPos = Mode->CursorColumn * TextWidth; - State->YPos = Mode->CursorRow * TextHeight; - State->CursorVisible = Mode->CursorVisible != FALSE; -} - -NTSTATUS -ConsoleFirmwareTextSetState ( - _In_ PBL_TEXT_CONSOLE TextConsole, - _In_ UCHAR Mask, - _In_ PBL_DISPLAY_STATE State - ) -{ - NTSTATUS Status; - ULONG FgColor, BgColor, Attribute, XPos, YPos, TextHeight, TextWidth; - BOOLEAN Visible; - - /* Check if foreground state is being set */ - if (Mask & 1) - { - /* Check if there's a difference from current */ - FgColor = State->FgColor; - if (TextConsole->State.FgColor != FgColor) - { - /* Ignore invalid color */ - if (FgColor > White) - { - return STATUS_INVALID_PARAMETER; - } - - /* Convert from NT/CGA format to EFI, and then set the attribute */ - Attribute = ConsoleEfiTextGetAttribute(TextConsole->State.BgColor, - FgColor); - Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Update cached state */ - TextConsole->State.FgColor = FgColor; - } - } - - /* Check if background state is being set */ - if (Mask & 2) - { - /* Check if there's a difference from current */ - BgColor = State->BgColor; - if (TextConsole->State.BgColor != BgColor) - { - /* Ignore invalid color */ - if (BgColor > White) - { - return STATUS_INVALID_PARAMETER; - } - - /* Convert from NT/CGA format to EFI, and then set the attribute */ - Attribute = ConsoleEfiTextGetAttribute(BgColor, - TextConsole->State.FgColor); - Status = EfiConOutSetAttribute(TextConsole->Protocol, Attribute); - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Update cached state */ - TextConsole->State.BgColor = BgColor; - } - } - - /* Check if position state is being set */ - if (Mask & 4) - { - /* Check if there's a difference from current */ - XPos = State->XPos; - YPos = State->YPos; - if ((TextConsole->State.XPos != XPos) || - (TextConsole->State.YPos != YPos)) - { - /* Set the new cursor position */ - BlDisplayGetTextCellResolution(&TextWidth, &TextHeight); - Status = EfiConOutSetCursorPosition(TextConsole->Protocol, - XPos/ TextWidth, - YPos / TextHeight); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Update cached state */ - TextConsole->State.XPos = XPos; - TextConsole->State.YPos = YPos; - } - } - - /* Check if cursor state is being set */ - if (Mask & 8) - { - /* Check if there's a difference from current */ - Visible = State->CursorVisible; - if (TextConsole->State.CursorVisible != Visible) - { - /* Ignore invalid state */ - if (Visible >= 3) - { - return STATUS_INVALID_PARAMETER; - } - - /* Set the new cursor state */ - Status = EfiConOutEnableCursor(TextConsole->Protocol, Visible); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Update cached status */ - TextConsole->State.CursorVisible = Visible; - } - } - - /* Return success */ - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleEfiTextFindModeFromAllowed ( - _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextProtocol, - _In_ PBL_DISPLAY_MODE SupportedModes, - _In_ ULONG MaxIndex, - _Out_ PULONG SupportedMode - ) -{ - EFI_SIMPLE_TEXT_OUTPUT_MODE ModeInfo; - ULONG MaxMode, MaxQueriedMode, Mode, i, MatchingMode; - UINTN HRes, VRes; - ULONGLONG ModeListSize; - PBL_DISPLAY_MODE ModeEntry, ModeList, SupportedModeEntry; - NTSTATUS Status; - - /* Read information on the current mode */ - EfiConOutReadCurrentMode(TextProtocol, &ModeInfo); - - /* Figure out the max mode, and how many modes we'll have to read */ - MaxMode = ModeInfo.MaxMode; - ModeListSize = sizeof(*ModeEntry) * ModeInfo.MaxMode; - if (ModeListSize > MAXULONG) - { - return STATUS_INTEGER_OVERFLOW; - } - - /* Allocate a list for all the supported EFI modes */ - ModeList = BlMmAllocateHeap(ModeListSize); - if (!ModeList) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Scan all the EFI modes */ - EfiPrintf(L"Scanning through %d modes\r\n", MaxMode); - for (MaxQueriedMode = 0, Mode = 0; Mode < MaxMode; Mode++) - { - /* Query information on this mode */ - ModeEntry = &ModeList[MaxQueriedMode]; - if (NT_SUCCESS(EfiConOutQueryMode(TextProtocol, - Mode, - &HRes, - &VRes))) - { - /* This mode was successfully queried. Save the data */ - EfiPrintf(L"EFI Firmware Supported Mode %d is H: %d V: %d\r\n", Mode, HRes, VRes); - ModeEntry->HRes = HRes; - ModeEntry->VRes = VRes; - ModeEntry->HRes2 = HRes; - MaxQueriedMode = Mode + 1; - } - } - - /* Loop all the supported mode entries */ - for (i = 0; i < MaxIndex; i++) - { - /* Loop all the UEFI queried modes */ - SupportedModeEntry = &SupportedModes[i]; - for (MatchingMode = 0; MatchingMode < MaxQueriedMode; MatchingMode++) - { - /* Check if the UEFI mode is compatible with our supported mode */ - ModeEntry = &ModeList[MatchingMode]; - EfiPrintf(L"H1: %d V1: %d - H2: %d - V2: %d\r\n", ModeEntry->HRes, ModeEntry->VRes, SupportedModeEntry->HRes, SupportedModeEntry->VRes); - if ((ModeEntry->HRes == SupportedModeEntry->HRes) && - (ModeEntry->VRes == SupportedModeEntry->VRes)) - { - /* Yep -- free the mode list and return this mode */ - BlMmFreeHeap(ModeList); - *SupportedMode = MatchingMode; - return STATUS_SUCCESS; - } - } - } - - /* We can't do anything -- there are no matching modes */ - Status = STATUS_UNSUCCESSFUL; - BlMmFreeHeap(ModeList); - return Status; -} - -VOID -ConsoleFirmwareTextClose ( - _In_ PBL_TEXT_CONSOLE TextConsole - ) -{ - ULONG Mode; - BL_DISPLAY_STATE DisplayState; - - /* Read the original mode, and see if it's different than the one now */ - Mode = TextConsole->OldMode.Mode; - if (Mode != TextConsole->Mode) - { - /* Restore to the original mode */ - EfiConOutSetMode(TextConsole->Protocol, Mode); - } - - /* Read the EFI settings for the original mode */ - ConsoleEfiTextGetStateFromMode(&TextConsole->OldMode, &DisplayState); - - /* Set the original settings */ - ConsoleFirmwareTextSetState(TextConsole, 0xF, &DisplayState); -} - -NTSTATUS -ConsoleFirmwareTextOpen ( - _In_ PBL_TEXT_CONSOLE TextConsole - ) -{ - BL_DISPLAY_MODE DisplayMode; - EFI_SIMPLE_TEXT_OUTPUT_MODE CurrentMode, NewMode; - UINTN HRes, VRes; - ULONG Mode; - NTSTATUS Status; - - /* Read the current mode and its settings */ - EfiConOutReadCurrentMode(EfiConOut, &CurrentMode); - Status = EfiConOutQueryMode(EfiConOut, CurrentMode.Mode, &HRes, &VRes); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Save the current mode and its settings */ - NewMode = CurrentMode; - DisplayMode.VRes = VRes; - DisplayMode.HRes = HRes; - DisplayMode.HRes2 = HRes; - - /* Check if the current mode is compatible with one of our modes */ - if (!ConsolepFindResolution(&DisplayMode, ConsoleTextResolutionList, 1)) - { - /* It isn't -- find a matching EFI mode for what we need */ - EfiPrintf(L"In incorrect mode, scanning for right one\r\n"); - Status = ConsoleEfiTextFindModeFromAllowed(EfiConOut, - ConsoleTextResolutionList, - 1, - &Mode); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to find mode: %lx\r\n", Status); - return Status; - } - - /* Set the new EFI mode */ - EfiPrintf(L"Setting new mode: %d\r\n", Mode); - Status = EfiConOutSetMode(EfiConOut, Mode); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Read the current mode and its settings */ - EfiConOutReadCurrentMode(EfiConOut, &NewMode); - Status = EfiConOutQueryMode(EfiConOut, Mode, &HRes, &VRes); - if (!NT_SUCCESS(Status)) - { - EfiConOutSetMode(EfiConOut, CurrentMode.Mode); - return Status; - } - - /* Save the current mode and its settings */ - DisplayMode.HRes = HRes; - DisplayMode.VRes = VRes; - DisplayMode.HRes2 = HRes; - } - - /* Capture all the current settings */ - ConsoleEfiTextGetStateFromMode(&NewMode, &TextConsole->State); - TextConsole->Mode = NewMode.Mode; - TextConsole->DisplayMode = DisplayMode; - TextConsole->Protocol = EfiConOut; - TextConsole->OldMode = CurrentMode; - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleInputBaseEraseBuffer ( - _In_ PBL_INPUT_CONSOLE Console, - _In_opt_ PULONG FillValue - ) -{ - ULONG ValueToFill; - PULONG i; - - /* Check if we should fill with a particular value */ - if (FillValue) - { - /* Use it */ - ValueToFill = *FillValue; - } - else - { - /* Otherwise, use default */ - ValueToFill = 0x10020; - } - - /* Set the input buffer to its last location */ - Console->DataStart = Console->DataEnd; - - /* Fill the buffer with the value */ - for (i = Console->Buffer; i < Console->EndBuffer; i++) - { - *i = ValueToFill; - } - - /* All done */ - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleInputLocalEraseBuffer ( - _In_ PBL_INPUT_CONSOLE Console, - _In_opt_ PULONG FillValue - ) -{ - NTSTATUS Status, EfiStatus; - - /* Erase the software buffer */ - Status = ConsoleInputBaseEraseBuffer(Console, FillValue); - - /* Reset the hardware console */ - EfiStatus = EfiConInEx ? EfiConInExReset() : EfiConInReset(); - if (!NT_SUCCESS(EfiStatus)) - { - /* Normalize the failure code */ - EfiStatus = STATUS_UNSUCCESSFUL; - } - - /* Check if software reset worked */ - if (NT_SUCCESS(Status)) - { - /* Then return the firmware code */ - Status = EfiStatus; - } - - /* All done */ - return Status; -} - -NTSTATUS -ConsoleFirmwareTextClear ( - _In_ PBL_TEXT_CONSOLE Console, - _In_ BOOLEAN LineOnly - ) -{ - BL_ARCH_MODE OldMode; - EFI_STATUS EfiStatus; - NTSTATUS Status; - ULONG i, Column, Row, TextWidth, TextHeight; - - /* Get the text resolution */ - BlDisplayGetTextCellResolution(&TextWidth, &TextHeight); - - /* Are we just clearing a line? */ - if (LineOnly) - { - /* Get the current column and row */ - Column = Console->State.XPos / TextWidth; - Row = Console->State.YPos / TextHeight; - - /* Loop over every remaining character */ - for (i = 0; i < Console->DisplayMode.HRes - Column - 1; i++) - { - /* Write a space on top of it */ - Status = EfiConOutOutputString(Console->Protocol, L" "); - if (!NT_SUCCESS(Status)) - { - break; - } - } - - /* And reset the cursor back at the initial position */ - Status = EfiConOutSetCursorPosition(Console->Protocol, - Column, - Row); - } - else - { - /* Are we in protected mode? */ - OldMode = CurrentExecutionContext->Mode; - if (OldMode != BlRealMode) - { - /* FIXME: Not yet implemented */ - return STATUS_NOT_IMPLEMENTED; - } - - /* Clear the screen */ - EfiStatus = Console->Protocol->ClearScreen(Console->Protocol); - - /* Switch back to protected mode if we came from there */ - if (OldMode != BlRealMode) - { - BlpArchSwitchContext(OldMode); - } - - /* Conver to NT status -- did that work? */ - Status = EfiGetNtStatusCode(EfiStatus); - if (NT_SUCCESS(Status)) - { - /* Reset current positions */ - Console->State.XPos = 0; - Console->State.YPos = 0; - } - } - - /* All done */ - return Status; -} - diff --git a/boot/environ/lib/io/display/efi/uga.c b/boot/environ/lib/io/display/efi/uga.c deleted file mode 100644 index 6cdff33afd4..00000000000 --- a/boot/environ/lib/io/display/efi/uga.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/efi/uga.c - * PURPOSE: Boot Library EFI UGA Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ConsoleEfiUgaOpen ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - EfiPrintf(L"UGA not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -VOID -ConsoleEfiUgaClose ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - return; -} - -NTSTATUS -ConsoleEfiUgaSetResolution ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole, - _In_ PBL_DISPLAY_MODE DisplayMode, - _In_ ULONG DisplayModeCount - ) -{ - return STATUS_NOT_IMPLEMENTED; -} diff --git a/boot/environ/lib/io/display/emscons.c b/boot/environ/lib/io/display/emscons.c deleted file mode 100644 index b351189f754..00000000000 --- a/boot/environ/lib/io/display/emscons.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/emscons.c - * PURPOSE: Boot Library Remote Console Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ConsoleRemoteConstruct ( - _In_ PBL_REMOTE_CONSOLE RemoteConsole - ) -{ -#ifdef BL_EMS_SUPPORT -#error Implement me -#else - /* We don't support EMS for now */ - return STATUS_NOT_IMPLEMENTED; -#endif -} - -NTSTATUS -ConsoleCreateRemoteConsole ( - _In_ PBL_TEXT_CONSOLE* TextConsole - ) -{ - PBL_REMOTE_CONSOLE RemoteConsole; - NTSTATUS Status; - - /* Allocate the remote console */ - RemoteConsole = BlMmAllocateHeap(sizeof(*RemoteConsole)); - if (!RemoteConsole) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Construct it */ - Status = ConsoleRemoteConstruct(RemoteConsole); - if (!NT_SUCCESS(Status)) - { - /* Failed to construct it, delete it */ - BlMmFreeHeap(RemoteConsole); - return Status; - } - - /* Save the global pointer and return a pointer to the text console */ - DspRemoteInputConsole = RemoteConsole; - *TextConsole = &RemoteConsole->TextConsole; - return STATUS_SUCCESS; -} diff --git a/boot/environ/lib/io/display/guicons.c b/boot/environ/lib/io/display/guicons.c deleted file mode 100644 index f4bf312768d..00000000000 --- a/boot/environ/lib/io/display/guicons.c +++ /dev/null @@ -1,462 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/guicons.c - * PURPOSE: Boot Library GUI Console Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -BL_GRAPHICS_CONSOLE_VTABLE ConsoleGraphicalVtbl = -{ - { - (PCONSOLE_DESTRUCT)ConsoleGraphicalDestruct, - (PCONSOLE_REINITIALIZE)ConsoleGraphicalReinitialize, - ConsoleTextBaseGetTextState, - (PCONSOLE_SET_TEXT_STATE)ConsoleGraphicalSetTextState, - NULL, // GetTextResolution - NULL, // SetTextResolution - (PCONSOLE_CLEAR_TEXT)ConsoleGraphicalClearText - }, - ConsoleGraphicalIsEnabled, - ConsoleGraphicalEnable, - NULL, - ConsoleGraphicalGetGraphicalResolution, - ConsoleGraphicalGetOriginalResolution, - NULL, -}; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ConsoleGraphicalSetTextState ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Mask, - _In_ PBL_DISPLAY_STATE TextState - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* Let it handle that */ - return ConsoleFirmwareTextSetState(&Console->TextConsole, - Mask, - TextState); - } - - /* Not yet */ - EfiPrintf(L"FFX set not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleGraphicalConstruct ( - _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole - ) -{ - NTSTATUS Status; - - /* Create a text console */ - Status = ConsoleTextLocalConstruct(&GraphicsConsole->TextConsole, FALSE); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Text failed: %lx\r\n", Status); - return Status; - } - - /* But overwrite its callbacks with ours */ - GraphicsConsole->TextConsole.Callbacks = &ConsoleGraphicalVtbl.Text; - - /* Try to create a GOP console */ - Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlGopConsole); - if (!NT_SUCCESS(Status)) - { - /* That failed, try an older EFI 1.02 UGA console */ - EfiPrintf(L"GOP open failed!\r\n", Status); - Status = ConsoleEfiGraphicalOpenProtocol(GraphicsConsole, BlUgaConsole); - if (!NT_SUCCESS(Status)) - { - /* That failed too, give up */ - EfiPrintf(L"UGA failed!\r\n", Status); - ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole); - return STATUS_UNSUCCESSFUL; - } - } - - /* Enable the console */ - Status = ConsoleFirmwareGraphicalEnable(GraphicsConsole); - if (!NT_SUCCESS(Status)) - { - /* Failed to enable it, undo everything */ - EfiPrintf(L"Enable failed\r\n"); - ConsoleFirmwareGraphicalClose(GraphicsConsole); - ConsoleTextLocalDestruct(&GraphicsConsole->TextConsole); - return STATUS_UNSUCCESSFUL; - } - - /* Save the graphics text color from the text mode text color */ - GraphicsConsole->FgColor = GraphicsConsole->TextConsole.State.FgColor; - GraphicsConsole->BgColor = GraphicsConsole->TextConsole.State.BgColor; - return STATUS_SUCCESS; -} - -VOID -ConsolepClearBuffer ( - _In_ PUCHAR FrameBuffer, - _In_ ULONG Width, - _In_ PUCHAR FillColor, - _In_ ULONG Height, - _In_ ULONG ScanlineWidth, - _In_ ULONG PixelDepth - ) -{ - PUCHAR Scanline, Current, FrameBufferEnd, LineEnd; - ULONG LineBytes, WidthBytes, BytesPerPixel; - - /* Get the BPP */ - BytesPerPixel = PixelDepth / 8; - - /* Using that, calculate the size of a scan line */ - LineBytes = ScanlineWidth * BytesPerPixel; - - /* And the size of line we'll have to clear */ - WidthBytes = Width * BytesPerPixel; - - /* Allocate a scanline */ - Scanline = BlMmAllocateHeap(WidthBytes); - if (Scanline) - { - /* For each remaining pixel on the scanline */ - Current = Scanline; - while (Width--) - { - /* Copy in the fill color */ - RtlCopyMemory(Current, FillColor, BytesPerPixel); - Current += BytesPerPixel; - } - - /* For each scanline in the frame buffer */ - while (Height--) - { - /* Copy our constructed scanline */ - RtlCopyMemory(FrameBuffer, Scanline, WidthBytes); - FrameBuffer += LineBytes; - } - } - else - { - FrameBufferEnd = FrameBuffer + Height * LineBytes; - ScanlineWidth = BytesPerPixel * (ScanlineWidth - Width); - while (FrameBuffer != FrameBufferEnd) - { - if (FrameBuffer != (FrameBuffer + WidthBytes)) - { - LineEnd = FrameBuffer + WidthBytes; - do - { - RtlCopyMemory(FrameBuffer, FillColor, BytesPerPixel); - FrameBuffer += BytesPerPixel; - } - while (FrameBuffer != LineEnd); - } - - FrameBuffer += ScanlineWidth; - } - } -} - -NTSTATUS -ConsolepConvertColorToPixel ( - _In_ BL_COLOR Color, - _Out_ PUCHAR Pixel - ) -{ - NTSTATUS Status; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Convert the color to a pixel value */ - switch (Color) - { - case Black: - Pixel[1] = 0; - Pixel[2] = 0; - Pixel[0] = 0; - break; - case Blue: - Pixel[1] = 0; - Pixel[2] = 0; - Pixel[0] = 0x7F; - break; - case Green: - Pixel[1] = 0x7F; - Pixel[2] = 0; - Pixel[0] = 0; - break; - case Cyan: - Pixel[1] = 0x7F; - Pixel[2] = 0; - Pixel[0] = 0x7F; - break; - case Red: - Pixel[1] = 0; - Pixel[2] = 0x7F; - Pixel[0] = 0x7F; - break; - case Magenta: - Pixel[1] = 0; - Pixel[2] = 0x7F; - Pixel[0] = 0x7F; - break; - case Brown: - Pixel[1] = 0x3F; - Pixel[2] = 0x7F; - Pixel[0] = 0; - break; - case LtGray: - Pixel[1] = 0xBFu; - Pixel[2] = 0xBFu; - *Pixel = 0xBFu; - break; - case Gray: - Pixel[1] = 0x7F; - Pixel[2] = 0x7F; - Pixel[0] = 0x7F; - break; - case LtBlue: - Pixel[1] = 0; - Pixel[2] = 0; - Pixel[0] = 0xFF; - break; - case LtGreen: - Pixel[1] = 0xFF; - Pixel[2] = 0; - Pixel[0] = 0; - break; - case LtCyan: - Pixel[1] = 0xFF; - Pixel[2] = 0; - Pixel[0] = 0xFF; - break; - case LtRed: - Pixel[1] = 0; - Pixel[2] = 0xFF; - Pixel[0] = 0; - break; - case LtMagenta: - Pixel[1] = 0; - Pixel[2] = 0xFF; - Pixel[0] = 0xFF; - break; - case Yellow: - Pixel[1] = 0xFF; - Pixel[2] = 0xFF; - Pixel[0] = 0; - break; - case White: - Pixel[1] = 0xFF; - Pixel[2] = 0xFF; - Pixel[0] = 0xFF; - break; - default: - Status = STATUS_INVALID_PARAMETER; - break; - } - return Status; -} - -NTSTATUS -ConsoleGraphicalClearPixels ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ ULONG Color - ) -{ - NTSTATUS Status; - - /* Check if the text console is active */ - if (Console->TextConsole.Active) - { - /* We shouldn't be here */ - Status = STATUS_UNSUCCESSFUL; - } - else - { - /* Clear it in graphics mode */ - Status = ConsoleFirmwareGraphicalClear(Console, Color); - } - - /* All good */ - return Status; -} - -NTSTATUS -ConsoleGraphicalClearText ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ BOOLEAN LineOnly - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* Let firmware clear do it */ - return ConsoleFirmwareTextClear(&Console->TextConsole, LineOnly); - } - - /* Are we clearing a line only? */ - if (LineOnly) - { - return BfClearToEndOfLine(Console); - } - - /* Nope -- the whole screen */ - return BfClearScreen(Console); -} - -BOOLEAN -ConsoleGraphicalIsEnabled ( - _In_ PBL_GRAPHICS_CONSOLE Console - ) -{ - /* Is the text console active? If so, the graphics console isn't */ - return !Console->TextConsole.Active; -} - -VOID -ConsoleGraphicalDestruct ( - _In_ PBL_GRAPHICS_CONSOLE Console - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* Disable it */ - ConsoleFirmwareGraphicalDisable(Console); - } - - /* Close the firmware protocols */ - ConsoleFirmwareGraphicalClose(Console); - - /* Destroy the console object */ - ConsoleTextLocalDestruct(&Console->TextConsole); -} - -NTSTATUS -ConsoleGraphicalReinitialize ( - _In_ PBL_GRAPHICS_CONSOLE Console - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* Reinitialize it */ - ConsoleTextLocalReinitialize(&Console->TextConsole); - } - - /* Disable the graphics console */ - ConsoleFirmwareGraphicalDisable(Console); - - /* Then bring it back again */ - return ConsoleFirmwareGraphicalEnable(Console); -} - -NTSTATUS -ConsoleGraphicalEnable ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ BOOLEAN Enable - ) -{ - BOOLEAN Active; - NTSTATUS Status; - - /* The text mode console state should be the opposite of what we want to do */ - Active = Console->TextConsole.Active; - if (Active == Enable) - { - /* Are we trying to enable graphics? */ - if (Enable) - { - /* Enable the console */ - Status = ConsoleFirmwareGraphicalEnable(Console); - if (NT_SUCCESS(Status)) - { - return Status; - } - - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* Turn it off */ - ConsoleFirmwareTextClose(&Console->TextConsole); - Console->TextConsole.Active = FALSE; - } - - /* Preserve the text colors */ - Console->FgColor = Console->TextConsole.State.FgColor; - Console->BgColor = Console->TextConsole.State.BgColor; - } - else - { - /* We are turning off graphics -- is the text console active? */ - if (Active != TRUE) - { - /* It isn't, so let's turn it on */ - Status = ConsoleFirmwareTextOpen(&Console->TextConsole); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remember that it's on */ - Console->TextConsole.Active = TRUE; - } - - /* Disable the graphics console */ - ConsoleFirmwareGraphicalDisable(Console); - } - } - - /* All good */ - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleGraphicalGetGraphicalResolution ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ PBL_DISPLAY_MODE DisplayMode - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* There's no graphics resolution then */ - return STATUS_UNSUCCESSFUL; - } - - /* Return the current display mode */ - *DisplayMode = Console->DisplayMode; - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleGraphicalGetOriginalResolution ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ PBL_DISPLAY_MODE DisplayMode - ) -{ - /* Is the text console active? */ - if (Console->TextConsole.Active) - { - /* There's no graphics resolution then */ - return STATUS_UNSUCCESSFUL; - } - - /* Return the current display mode */ - *DisplayMode = Console->OldDisplayMode; - return STATUS_SUCCESS; -} diff --git a/boot/environ/lib/io/display/textcons.c b/boot/environ/lib/io/display/textcons.c deleted file mode 100644 index a7a74ad3a2e..00000000000 --- a/boot/environ/lib/io/display/textcons.c +++ /dev/null @@ -1,270 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/display/textcons.c - * PURPOSE: Boot Library Text Console Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -BL_TEXT_CONSOLE_VTABLE ConsoleTextLocalVtbl = -{ - ConsoleTextLocalDestruct, - ConsoleTextLocalReinitialize, - ConsoleTextBaseGetTextState, - ConsoleTextLocalSetTextState, - ConsoleTextBaseGetTextResolution, - ConsoleTextLocalSetTextResolution, - ConsoleTextLocalClearText, - ConsoleTextLocalWriteText -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -ConsoleTextLocalDestruct ( - _In_ struct _BL_TEXT_CONSOLE* Console - ) -{ - -} - -NTSTATUS -ConsoleTextLocalReinitialize ( - _In_ struct _BL_TEXT_CONSOLE* Console - ) -{ - EfiPrintf(L"Not active yet!\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleTextBaseGetTextState ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ PBL_DISPLAY_STATE TextState - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleTextLocalSetTextState ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG Mask, - _In_ PBL_DISPLAY_STATE TextState - ) -{ - return ConsoleFirmwareTextSetState(Console, Mask, TextState); -} - -NTSTATUS -ConsoleTextBaseGetTextResolution ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _Out_ PULONG TextResolution - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleTextLocalSetTextResolution ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ ULONG NewTextResolution, - _Out_ PULONG OldTextResolution - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleTextLocalClearText ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ BOOLEAN LineOnly - ) -{ - return ConsoleFirmwareTextClear(Console, LineOnly); -} - -NTSTATUS -ConsoleTextLocalWriteText ( - _In_ struct _BL_TEXT_CONSOLE* Console, - _In_ PCHAR Text, - _In_ ULONG Attribute - ) -{ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ConsoleTextLocalConstruct ( - _In_ PBL_TEXT_CONSOLE TextConsole, - _In_ BOOLEAN Activate - ) -{ - NTSTATUS Status; - BL_DISPLAY_STATE TextState; - - /* Set our callbacks */ - TextConsole->Callbacks = &ConsoleTextLocalVtbl; - - /* Are we activating this console? */ - if (Activate) - { - /* Call firmware to activate it */ - Status = ConsoleFirmwareTextOpen(TextConsole); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to activate console: %lx\r\n", Status); - return Status; - } - } - - /* Set default text state */ - TextState.BgColor = 0; - TextState.XPos = 0; - TextState.YPos = 0; - TextState.CursorVisible = FALSE; - TextState.FgColor = White; - - /* Are we activating? */ - if (Activate) - { - /* Call firmware to set it */ - Status = ConsoleFirmwareTextSetState(TextConsole, 0xF, &TextState); - if (!NT_SUCCESS(Status)) - { - /* We failed, back down */ - EfiPrintf(L"Failed to set console state: %lx\r\n", Status); - ConsoleFirmwareTextClose(TextConsole); - return Status; - } - } - else - { - /* Just save the state for now, someone else can activate later */ - TextConsole->State = TextState; - } - - /* Remember if we activated it */ - TextConsole->Active = Activate; - return STATUS_SUCCESS; -} - -BOOLEAN -ConsolepFindResolution ( - _In_ PBL_DISPLAY_MODE Mode, - _In_ PBL_DISPLAY_MODE List, - _In_ ULONG MaxIndex - ) -{ - PBL_DISPLAY_MODE ListEnd; - - /* Loop until we hit the maximum supported list index */ - ListEnd = &List[MaxIndex]; - while (List != ListEnd) - { - /* Does this resolution match? */ - if ((Mode->HRes == List->HRes) && (Mode->VRes == List->VRes)) - { - /* Yep -- we got a match */ - return TRUE; - - } - - /* Try another one*/ - List++; - } - - /* No matches were found */ - return FALSE; -} - -BL_INPUT_CONSOLE_VTABLE ConsoleInputLocalVtbl = -{ - (PCONSOLE_DESTRUCT)ConsoleInputLocalDestruct, - (PCONSOLE_REINITIALIZE)ConsoleInputBaseReinitialize, -}; - -VOID -ConsoleInputLocalDestruct ( - _In_ PBL_INPUT_CONSOLE Console - ) -{ - /* Erase the current input buffer, and tear down the console */ - ConsoleInputLocalEraseBuffer(Console, NULL); - BlMmFreeHeap(Console->Buffer); -} - -NTSTATUS -ConsoleInputBaseConstruct ( - _In_ PBL_INPUT_CONSOLE Console - ) -{ - PULONG Buffer; - - /* Allocate a new 512 byte buffer */ - Buffer = BlMmAllocateHeap(512); - Console->Buffer = Buffer; - if (!Buffer) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Set the current buffer pointers to it */ - Console->DataStart = Buffer; - Console->DataEnd = Buffer; - - /* Set the end 128 data entries into the buffer */ - Console->EndBuffer = Buffer + 128; - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleInputBaseReinitialize ( - _In_ PBL_INPUT_CONSOLE Console - ) -{ - PULONG Buffer; - - /* Reset all the buffer pointers to the current buffer */ - Buffer = Console->Buffer; - Console->DataStart = Buffer; - Console->DataEnd = Buffer; - Console->EndBuffer = Buffer + 128; - return STATUS_SUCCESS; -} - -NTSTATUS -ConsoleCreateLocalInputConsole ( - VOID - ) -{ - PBL_INPUT_CONSOLE InputConsole; - NTSTATUS Status; - - /* Allocate the input console */ - InputConsole = BlMmAllocateHeap(sizeof(*InputConsole)); - if (!InputConsole) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Construct it */ - Status = ConsoleInputBaseConstruct(InputConsole); - if (!NT_SUCCESS(Status)) - { - /* Tear down on failure */ - BlMmFreeHeap(InputConsole); - return Status; - } - - /* Set the callback table, and set us as the local input console */ - InputConsole->Callbacks = &ConsoleInputLocalVtbl; - DspLocalInputConsole = InputConsole; - return STATUS_SUCCESS; -} diff --git a/boot/environ/lib/io/etfs.c b/boot/environ/lib/io/etfs.c deleted file mode 100644 index 498f883a258..00000000000 --- a/boot/environ/lib/io/etfs.c +++ /dev/null @@ -1,995 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/etfs.c - * PURPOSE: Boot Library El Torito File System Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include -#include -typedef struct _RAW_ET_VD -{ - UCHAR BootIndicator; - UCHAR StandardId[5]; - UCHAR Version; - UCHAR SystemId[32]; - UCHAR Reserved[32]; - ULONG BootCatalogOffset; - UCHAR Padding[1973]; -} RAW_ET_VD, *PRAW_ET_VD; - -/* DATA VARIABLES ************************************************************/ - -typedef struct _BL_ETFS_DEVICE -{ - ULONG RootDirOffset; - ULONG RootDirSize; - ULONG BlockSize; - ULONG VolumeSize; - BOOLEAN IsIso; - PUCHAR MemoryBlock; - ULONG Offset; -} BL_ETFS_DEVICE, *PBL_ETFS_DEVICE; - -typedef struct _BL_ETFS_FILE -{ - ULONG DiskOffset; - ULONG DirOffset; - ULONG DirEntOffset; - - BL_FILE_INFORMATION; - - ULONG DeviceId; -} BL_ETFS_FILE, *PBL_ETFS_FILE; - -ULONG EtfsDeviceTableEntries; -PVOID* EtfsDeviceTable; - -NTSTATUS -EtfsOpen ( - _In_ PBL_FILE_ENTRY Directory, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ PBL_FILE_ENTRY *FileEntry - ); - -NTSTATUS -EtfsGetInformation ( - _In_ PBL_FILE_ENTRY FileEntry, - _Out_ PBL_FILE_INFORMATION FileInfo - ); - -NTSTATUS -EtfsSetInformation ( - _In_ PBL_FILE_ENTRY FileEntry, - _In_ PBL_FILE_INFORMATION FileInfo - ); - -NTSTATUS -EtfsRead ( - _In_ PBL_FILE_ENTRY FileEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_opt_ PULONG BytesReturned - ); - -BL_FILE_CALLBACKS EtfsFunctionTable = -{ - EtfsOpen, - NULL, - EtfsRead, - NULL, - NULL, - EtfsGetInformation, - EtfsSetInformation -}; - -/* FUNCTIONS *****************************************************************/ - -VOID -EtfspGetDirectoryInfo ( - _In_ PBL_ETFS_DEVICE EtfsDevice, - _In_ PRAW_DIR_REC DirEntry, - _Out_ PULONG FileOffset, - _Out_ PULONG FileSize, - _Out_opt_ PBOOLEAN IsDirectory - ) -{ - ULONG SectorOffset; - BOOLEAN IsDir; - - *FileOffset = *(PULONG)DirEntry->FileLoc * EtfsDevice->BlockSize; - *FileOffset += (DirEntry->XarLen * EtfsDevice->BlockSize); - - SectorOffset = ALIGN_DOWN_BY(*FileOffset, CD_SECTOR_SIZE); - - *FileSize = *(PULONG)DirEntry->DataLen; - - IsDir = DE_FILE_FLAGS(EtfsDevice->IsIso, DirEntry) & ISO_ATTR_DIRECTORY; - if (IsDir) - { - *FileSize += ALIGN_UP_BY(SectorOffset, CD_SECTOR_SIZE) - SectorOffset; - } - - if (IsDirectory) - { - *IsDirectory = IsDir; - } -} - -USHORT -EtfspGetDirentNameLength ( - _In_ PRAW_DIR_REC DirEntry - ) -{ - USHORT Length, RealLength; - PUCHAR Pos; - - RealLength = Length = DirEntry->FileIdLen; - for (Pos = DirEntry->FileId + Length - 1; Length; --Pos) - { - --Length; - - if (*Pos == ';') - { - RealLength = Length; - break; - } - } - - Length = RealLength; - for (Pos = DirEntry->FileId + Length - 1; Length; --Pos) - { - --Length; - - if (*Pos != '.') - { - break; - } - - RealLength = Length; - } - - return RealLength; -} - -LONG -EtfspCompareNames ( - __in PSTRING Name1, - __in PUNICODE_STRING Name2 - ) -{ - ULONG i, l1, l2, l; - - l1 = Name1->Length; - l2 = Name2->Length / sizeof(WCHAR); - l = min(l1, l2); - - for (i = 0; i < l; i++) - { - if (toupper(Name1->Buffer[i]) != toupper(Name2->Buffer[i])) - { - return toupper(Name1->Buffer[i]) - toupper(Name2->Buffer[i]); - } - } - - if (l2 <= l1) - { - return l2 < l1; - } - else - { - return -1; - } -} - -BOOLEAN -EtfspFileMatch ( - _In_ PRAW_DIR_REC DirEntry, - _In_ PUNICODE_STRING FileName - ) -{ - BOOLEAN Match; - USHORT Length; - ANSI_STRING DirName; - - if ((DirEntry->FileIdLen != 1) || - ((DirEntry->FileId[0] != 0) && (DirEntry->FileId[0] != 1))) - { - Length = EtfspGetDirentNameLength(DirEntry); - DirName.Length = Length; - DirName.MaximumLength = Length; - DirName.Buffer = (PCHAR)DirEntry->FileId; - - Match = EtfspCompareNames(&DirName, FileName); - } - else - { - Match = -1; - } - return Match; -} - -NTSTATUS -EtfspGetDirent ( - _In_ PBL_FILE_ENTRY DirectoryEntry, - _Out_ PRAW_DIR_REC *DirEntry, - _Inout_ PULONG DirentOffset - ) -{ - PBL_ETFS_FILE EtfsFile; - ULONG FileOffset, DirectoryOffset, AlignedOffset, RemainderOffset; - ULONG DeviceId, ReadSize, DirLen; - PBL_ETFS_DEVICE EtfsDevice; - BOOLEAN NeedRead, IsMulti; - NTSTATUS result; - PRAW_DIR_REC DirEnt; - PUCHAR MemoryBlock; - - EtfsFile = DirectoryEntry->FsSpecificData; - DeviceId = EtfsFile->DeviceId; - FileOffset = EtfsFile->DiskOffset; - EtfsDevice = EtfsDeviceTable[DeviceId]; - - DirectoryOffset = *DirentOffset; - MemoryBlock = EtfsDevice->MemoryBlock; - - IsMulti = 0; - - AlignedOffset = (FileOffset + *DirentOffset) & ~CD_SECTOR_SIZE; - RemainderOffset = *DirentOffset + FileOffset - AlignedOffset; - - ReadSize = 2048 - RemainderOffset; - NeedRead = AlignedOffset == EtfsDevice->Offset ? 0 : 1; - -ReadAgain: - if (DirectoryOffset >= EtfsFile->Size) - { - return STATUS_NO_SUCH_FILE; - } - - while (ReadSize < MIN_DIR_REC_SIZE) - { - DirectoryOffset += ReadSize; - AlignedOffset += 2048; - ReadSize = 2048; - RemainderOffset = 0; - NeedRead = 1; - if (DirectoryOffset >= EtfsFile->Size) - { - return STATUS_NO_SUCH_FILE; - } - } - - if (NeedRead) - { - result = BlDeviceReadAtOffset(DirectoryEntry->DeviceId, - CD_SECTOR_SIZE, - AlignedOffset, - MemoryBlock, - NULL); - if (!NT_SUCCESS(result)) - { - EfiPrintf(L"Device read failed %lx\r\n", result); - return result; - } - - NeedRead = FALSE; - EtfsDevice->Offset = AlignedOffset; - } - - if (!*(MemoryBlock + RemainderOffset)) - { - AlignedOffset += 2048; - NeedRead = TRUE; - - RemainderOffset = 0; - DirectoryOffset += ReadSize; - ReadSize = 2048; - goto ReadAgain; - } - - DirEnt = (PRAW_DIR_REC)(MemoryBlock + RemainderOffset); - DirLen = DirEnt->DirLen; - if (DirLen > ReadSize) - { - EfiPrintf(L"Dir won't fit %lx %lx\r\n", DirLen, ReadSize); - return STATUS_NO_SUCH_FILE; - } - - if (IsMulti) - { - if (!(DE_FILE_FLAGS(EtfsDevice->IsIso, DirEnt) & ISO_ATTR_MULTI)) - { - IsMulti = TRUE; - } - } - else if (DE_FILE_FLAGS(EtfsDevice->IsIso, DirEnt) & ISO_ATTR_MULTI) - { - IsMulti = TRUE; - } - else - { - if ((DirEnt->FileIdLen != 1) || - ((DirEnt->FileId[0] != 0) && (DirEnt->FileId[0] != 1))) - { - goto Quickie; - } - } - - RemainderOffset += DirLen; - DirectoryOffset += DirLen; - ReadSize -= DirLen; - goto ReadAgain; - -Quickie: - *DirEntry = DirEnt; - *DirentOffset = DirectoryOffset; - return STATUS_SUCCESS; -} - -NTSTATUS -EtfspSearchForDirent ( - _In_ PBL_FILE_ENTRY DirectoryEntry, - _In_ PWCHAR FileName, - _Out_ PRAW_DIR_REC *DirEntry, - _Out_ PULONG DirentOffset - ) -{ - UNICODE_STRING Name; - ULONG NextOffset; - PRAW_DIR_REC DirEnt; - NTSTATUS Status; - - RtlInitUnicodeString(&Name, FileName); - for (NextOffset = *DirentOffset; - ; - NextOffset = NextOffset + DirEnt->DirLen) - { - Status = EtfspGetDirent(DirectoryEntry, &DirEnt, &NextOffset); - if (!NT_SUCCESS(Status)) - { - return STATUS_NO_SUCH_FILE; - } - - if (!EtfspFileMatch(DirEnt, &Name)) - { - break; - } - } - - *DirEntry = DirEnt; - *DirentOffset = NextOffset; - return 0; -} - -NTSTATUS -EtfspCachedSearchForDirent ( - _In_ PBL_FILE_ENTRY DirectoryEntry, - _In_ PWCHAR FileName, - _Out_ PRAW_DIR_REC *DirEntry, - _Out_ PULONG DirOffset, - _In_ BOOLEAN KeepOffset - ) -{ - PBL_ETFS_FILE EtfsFile; - PBL_ETFS_DEVICE EtfsDevice; - NTSTATUS Status; - ULONG DirentOffset; - PRAW_DIR_REC Dirent; - UNICODE_STRING Name; - - EtfsFile = DirectoryEntry->FsSpecificData; - EtfsDevice = EtfsDeviceTable[EtfsFile->DeviceId]; - RtlInitUnicodeString(&Name, FileName); - DirentOffset = EtfsFile->DirEntOffset; - - if ((KeepOffset) || - (ALIGN_DOWN_BY((DirentOffset + EtfsFile->DiskOffset), CD_SECTOR_SIZE) == - EtfsDevice->Offset)) - { - Status = EtfspGetDirent(DirectoryEntry, &Dirent, &DirentOffset); - if (NT_SUCCESS(Status)) - { - if (!EtfspFileMatch(Dirent, &Name)) - { - *DirEntry = Dirent; - *DirOffset = DirentOffset; - return STATUS_SUCCESS; - } - } - else - { - DirentOffset = 0; - } - } - else - { - DirentOffset = 0; - } - - Status = EtfspSearchForDirent(DirectoryEntry, - FileName, - DirEntry, - &DirentOffset); - if (!(NT_SUCCESS(Status)) && (DirentOffset)) - { - DirentOffset = 0; - Status = EtfspSearchForDirent(DirectoryEntry, - FileName, - DirEntry, - &DirentOffset); - } - - if (NT_SUCCESS(Status)) - { - *DirOffset = DirentOffset; - } - - return Status; -} - -NTSTATUS -EtfsRead ( - _In_ PBL_FILE_ENTRY FileEntry, - _In_ PVOID Buffer, - _In_ ULONG Size, - _Out_opt_ PULONG BytesReturned - ) -{ - ULONG BytesRead; - PBL_ETFS_FILE EtfsFile; - NTSTATUS Status; - - /* Assume failure for now */ - BytesRead = 0; - - /* Make sure that the read is within the file's boundaries */ - EtfsFile = FileEntry->FsSpecificData; - if ((Size + EtfsFile->Offset) > EtfsFile->Size) - { - /* Bail out otherwise */ - Status = STATUS_INVALID_PARAMETER; - } - else - { - /* Read the offset that matches this file's offset, on the disk */ - Status = BlDeviceReadAtOffset(FileEntry->DeviceId, - Size, - EtfsFile->Offset + EtfsFile->DiskOffset, - Buffer, - &BytesRead); - if (NT_SUCCESS(Status)) - { - /* Update the file offset and return the size as having been read */ - EtfsFile->Offset += Size; - BytesRead = Size; - } - } - - /* Check if caller wanted to know how many bytes were read */ - if (BytesReturned) - { - /* Return the value */ - *BytesReturned = BytesRead; - } - - /* All done */ - return Status; -} - -NTSTATUS -EtfsSetInformation ( - _In_ PBL_FILE_ENTRY FileEntry, - _In_ PBL_FILE_INFORMATION FileInfo - ) -{ - PBL_ETFS_FILE EtfsFile; - BL_FILE_INFORMATION LocalFileInfo; - - /* Get the underlying ETFS file data structure */ - EtfsFile = (PBL_ETFS_FILE)FileEntry->FsSpecificData; - - /* Make a copy of the incoming attributes, but ignore the new offset */ - LocalFileInfo = *FileInfo; - LocalFileInfo.Offset = EtfsFile->Offset; - - /* Check if these match exactly the current file */ - if (!RtlEqualMemory(&LocalFileInfo, &EtfsFile->Size, sizeof(*FileInfo))) - { - /* Nope -- which means caller is trying to change an immutable */ - EfiPrintf(L"Incorrect information change\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Is the offset past the end of the file? */ - if (FileInfo->Offset >= EtfsFile->Size) - { - /* Don't allow EOF */ - EfiPrintf(L"Offset too large: %lx vs %lx\r\n", FileInfo->Offset, EtfsFile->Size); - return STATUS_INVALID_PARAMETER; - } - - /* Update the offset */ - EtfsFile->Offset = FileInfo->Offset; - return STATUS_SUCCESS; -} - -NTSTATUS -EtfsGetInformation ( - _In_ PBL_FILE_ENTRY FileEntry, - _Out_ PBL_FILE_INFORMATION FileInfo - ) -{ - PBL_ETFS_FILE EtfsFile; - - /* Get the underlying ETFS file data structure */ - EtfsFile = (PBL_ETFS_FILE)FileEntry->FsSpecificData; - - /* Copy the cached information structure within it */ - RtlCopyMemory(FileInfo, &EtfsFile->Size, sizeof(*FileInfo)); - return STATUS_SUCCESS; -} - -NTSTATUS -EtfsOpen ( - _In_ PBL_FILE_ENTRY Directory, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ PBL_FILE_ENTRY *FileEntry - ) -{ - PBL_ETFS_DEVICE EtfsDevice; - NTSTATUS Status; - PBL_FILE_ENTRY NewFile; - PWCHAR FilePath, FormatString; - PBL_ETFS_FILE EtfsFile; - ULONG DeviceId, FileSize, DirOffset, FileOffset; - SIZE_T Size; - PRAW_DIR_REC DirEntry; - BOOLEAN IsDirectory; - - EtfsFile = Directory->FsSpecificData; - DeviceId = EtfsFile->DeviceId; - EtfsDevice = EtfsDeviceTable[DeviceId]; - - /* Find the given file (or directory) in the given directory */ - Status = EtfspCachedSearchForDirent(Directory, - FileName, - &DirEntry, - &DirOffset, - FALSE); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Find out information about the file (or directory) we found */ - EtfspGetDirectoryInfo(EtfsDevice, - DirEntry, - &FileOffset, - &FileSize, - &IsDirectory); - - /* Allocate a file entry */ - NewFile = BlMmAllocateHeap(sizeof(*NewFile)); - if (!NewFile) - { - return STATUS_NO_MEMORY; - } - - /* Zero it out */ - RtlZeroMemory(NewFile, sizeof(*NewFile)); - - /* Figure out the size of the path and filename plus a slash and NUL */ - Size = wcslen(Directory->FilePath) + wcslen(FileName) + 2; - FilePath = BlMmAllocateHeap(Size * sizeof(WCHAR)); - if (!FilePath) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Allocate an ETFS file entry */ - EtfsFile = (PBL_ETFS_FILE)BlMmAllocateHeap(sizeof(*EtfsFile)); - if (!EtfsFile) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Zero it out */ - RtlZeroMemory(EtfsFile, sizeof(*EtfsFile)); - - /* Capture the device ID of the directory */ - NewFile->DeviceId = Directory->DeviceId; - - /* Check if this is the root or a filename\directory under */ - FormatString = L"%ls%ls"; - if (Directory->FilePath[1]) - { - FormatString = L"%ls\\%ls"; - } - - /* Combine the paths, and save the final path in the file entry */ - _snwprintf(FilePath, Size, FormatString, Directory->FilePath, FileName); - NewFile->FilePath = FilePath; - - /* Copy the ETFS function callbacks into the file netry */ - RtlCopyMemory(&NewFile->Callbacks, - &EtfsFunctionTable, - sizeof(NewFile->Callbacks)); - - /* Fill out the rest of the details */ - EtfsFile->DiskOffset = FileOffset; - EtfsFile->DirOffset = DirOffset; - EtfsFile->Size = FileSize; - EtfsFile->DeviceId = DeviceId; - - /* Check if this is a directory */ - if (IsDirectory) - { - EtfsFile->Flags |= BL_ETFS_FILE_ENTRY_DIRECTORY; - NewFile->Flags |= BL_FILE_ENTRY_DIRECTORY; - } - - /* Write down the name of the filesystem */ - EtfsFile->FsName = L"cdfs"; - - /* All done, return the file entry, and save the ETFS side */ - NewFile->FsSpecificData = EtfsFile; - *FileEntry = NewFile; - return Status; - -Quickie: - /* Failure path -- free the file path if we had one */ - if (NewFile->FilePath) - { - BlMmFreeHeap(NewFile->FilePath); - } - - /* Free the ETFS file entry if we had one */ - if (NewFile->FsSpecificData) - { - BlMmFreeHeap(NewFile->FsSpecificData); - } - - /* Free the file entry itself, and return the error code */ - BlMmFreeHeap(NewFile); - return Status; -} - -NTSTATUS -EtfspCheckCdfs ( - _In_ PBL_ETFS_DEVICE EtfsDevice, - _In_ ULONG DeviceId, - _Out_ PRAW_ISO_VD *VolumeDescriptor, - _Out_ PBOOLEAN VolumeIsIso - ) -{ - EfiPrintf(L"Raw Cdfs not implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -EtfspCheckEtfs ( - _In_ PBL_ETFS_DEVICE EtfsDevice, - _In_ ULONG DeviceId, - _Out_ PRAW_ISO_VD *VolumeDescriptor, - _Out_ PBOOLEAN VolumeIsIso - ) -{ - PRAW_ISO_VD IsoVd; - PRAW_ET_VD EtVd; - NTSTATUS Status; - BOOLEAN IsIso; - BL_DEVICE_INFORMATION DeviceInformation; - ULONG Unknown, BytesRead; - ANSI_STRING CompareString, String; - - /* Save our static buffer pointer */ - IsoVd = (PRAW_ISO_VD)EtfsDevice->MemoryBlock; - EtVd = (PRAW_ET_VD)IsoVd; - - /* First, read the El Torito Volume Descriptor */ - BlDeviceGetInformation(DeviceId, &DeviceInformation); - Unknown = DeviceInformation.BlockDeviceInfo.Unknown; - DeviceInformation.BlockDeviceInfo.Unknown |= 1; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - Status = BlDeviceReadAtOffset(DeviceId, - CD_SECTOR_SIZE, - (FIRST_VD_SECTOR + 1) * CD_SECTOR_SIZE, - EtfsDevice->MemoryBlock, - &BytesRead); - DeviceInformation.BlockDeviceInfo.Unknown = Unknown; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L" read failed\r\n"); - return Status; - } - - /* Remember that's where we last read */ - EtfsDevice->Offset = (FIRST_VD_SECTOR + 1) * CD_SECTOR_SIZE; - - /* Check if it's EL TORITO! */ - RtlInitString(&String, "EL TORITO SPECIFICATION"); - CompareString.Buffer = (PCHAR)EtVd->SystemId; - CompareString.Length = 23; - CompareString.MaximumLength = 23; - if (!RtlEqualString(&CompareString, &String, TRUE)) - { - return STATUS_UNSUCCESSFUL; - } - - /* Check the version and boot indicator */ - if ((EtVd->Version != 1) || (EtVd->BootIndicator)) - { - return STATUS_UNSUCCESSFUL; - } - - /* Check if it has the CD0001 identifier */ - RtlInitString(&String, ISO_VOL_ID); - CompareString.Buffer = (PCHAR)EtVd->StandardId; - CompareString.Length = 5; - CompareString.MaximumLength = 5; - if (!RtlEqualString(&CompareString, &String, TRUE)) - { - return STATUS_UNSUCCESSFUL; - } - - /* Step two, we now want to read the ISO Volume Descriptor */ - DeviceInformation.BlockDeviceInfo.Unknown |= 1u; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - Status = BlDeviceReadAtOffset(DeviceId, - CD_SECTOR_SIZE, - FIRST_VD_SECTOR * CD_SECTOR_SIZE, - EtfsDevice->MemoryBlock, - &BytesRead); - DeviceInformation.BlockDeviceInfo.Unknown = Unknown; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remember where we left off */ - EtfsDevice->Offset = FIRST_VD_SECTOR * CD_SECTOR_SIZE; - - /* This should also say CD0001 */ - CompareString.Buffer = (PCHAR)IsoVd->StandardId; - CompareString.Length = 5; - CompareString.MaximumLength = 5; - IsIso = RtlEqualString(&CompareString, &String, TRUE); - if (!IsIso) - { - return STATUS_UNSUCCESSFUL; - } - - /* And should be a version we support */ - if ((IsoVd->Version != VERSION_1) || (IsoVd->DescType != VD_PRIMARY)) - { - return STATUS_UNSUCCESSFUL; - } - - /* Return back to the caller */ - *VolumeDescriptor = IsoVd; - *VolumeIsIso = IsIso; - return STATUS_SUCCESS; -} - -NTSTATUS -EtfspDeviceContextDestroy ( - _In_ PBL_ETFS_DEVICE EtfsDevice - ) -{ - if (EtfsDevice->MemoryBlock) - { - BlMmFreeHeap(EtfsDevice->MemoryBlock); - } - - BlMmFreeHeap(EtfsDevice); - - return STATUS_SUCCESS; -} - -NTSTATUS -EtfspCreateContext ( - _In_ ULONG DeviceId, - _Out_ PBL_ETFS_DEVICE *EtfsDevice - ) -{ - PBL_ETFS_DEVICE NewContext; - PVOID MemoryBlock; - NTSTATUS Status; - BOOLEAN IsIso; - PRAW_ISO_VD RawVd; - - NewContext = (PBL_ETFS_DEVICE)BlMmAllocateHeap(sizeof(*NewContext)); - if (!NewContext) - { - return STATUS_NO_MEMORY; - } - RtlZeroMemory(NewContext, sizeof(*NewContext)); - - MemoryBlock = BlMmAllocateHeap(CD_SECTOR_SIZE); - NewContext->MemoryBlock = MemoryBlock; - if (!MemoryBlock) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - Status = EtfspCheckEtfs(NewContext, DeviceId, &RawVd, &IsIso); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Drive not EDFS. Checking for CDFS: %lx\r\n"); - Status = EtfspCheckCdfs(NewContext, DeviceId, &RawVd, &IsIso); - } - - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Drive not CDFS. Failing: %lx\r\n"); - goto Quickie; - } - - NewContext->IsIso = IsIso; - NewContext->BlockSize = RVD_LB_SIZE(RawVd, IsIso); - NewContext->VolumeSize = RVD_VOL_SIZE(RawVd, IsIso); - - EtfspGetDirectoryInfo(NewContext, - (PRAW_DIR_REC)RVD_ROOT_DE(RawVd, IsIso), - &NewContext->RootDirOffset, - &NewContext->RootDirSize, - 0); - Status = STATUS_SUCCESS; - -Quickie: - if (!NT_SUCCESS(Status)) - { - EtfspDeviceContextDestroy(NewContext); - NewContext = NULL; - } - - *EtfsDevice = NewContext; - return Status; -} - -NTSTATUS -EtfspDeviceTableDestroyEntry ( - _In_ PBL_ETFS_DEVICE EtfsDevice, - _In_ ULONG Index - ) -{ - EtfspDeviceContextDestroy(EtfsDevice); - EtfsDeviceTable[Index] = NULL; - - return STATUS_SUCCESS; -} - -NTSTATUS -EtfsMount ( - _In_ ULONG DeviceId, - _In_ ULONG Unknown, - _Out_ PBL_FILE_ENTRY* FileEntry - ) -{ - PBL_ETFS_DEVICE EtfsDevice = NULL; - PBL_FILE_ENTRY RootEntry; - NTSTATUS Status; - PBL_ETFS_FILE EtfsFile; - - EfiPrintf(L"Trying to mount as ETFS...\r\n"); - - Status = EtfspCreateContext(DeviceId, &EtfsDevice); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"ETFS context failed: %lx\r\n"); - return Status; - } - - Status = BlTblSetEntry(&EtfsDeviceTable, - &EtfsDeviceTableEntries, - EtfsDevice, - &DeviceId, - TblDoNotPurgeEntry); - if (!NT_SUCCESS(Status)) - { - EtfspDeviceContextDestroy(EtfsDevice); - return Status; - } - - RootEntry = BlMmAllocateHeap(sizeof(*RootEntry)); - if (!RootEntry) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - RtlZeroMemory(RootEntry, sizeof(*RootEntry)); - - RootEntry->FilePath = BlMmAllocateHeap(4); - if (!RootEntry->FilePath) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - wcsncpy(RootEntry->FilePath, L"\\", 1); - - RootEntry->DeviceId = DeviceId; - RtlCopyMemory(&RootEntry->Callbacks, - &EtfsFunctionTable, - sizeof(RootEntry->Callbacks)); - - EtfsFile = (PBL_ETFS_FILE)BlMmAllocateHeap(sizeof(*EtfsFile)); - if (!EtfsFile) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - RootEntry->Flags |= 0x10000; - - RtlZeroMemory(EtfsFile, sizeof(*EtfsFile)); - RootEntry->FsSpecificData = EtfsFile; - EtfsFile->DeviceId = DeviceId; - EtfsFile->Flags |= 1; - EtfsFile->DiskOffset = EtfsDevice->RootDirOffset; - EtfsFile->DirOffset = 0; - EtfsFile->Size = EtfsDevice->RootDirSize; - EtfsFile->FsName = L"cdfs"; - *FileEntry = RootEntry; - - return STATUS_SUCCESS; - -Quickie: - if (RootEntry->FilePath) - { - BlMmFreeHeap(RootEntry->FilePath); - } - if (RootEntry->FsSpecificData) - { - BlMmFreeHeap(RootEntry->FsSpecificData); - } - if (RootEntry) - { - BlMmFreeHeap(RootEntry); - } - - EtfspDeviceTableDestroyEntry(EtfsDevice, DeviceId); - - return Status; -} - -NTSTATUS -EtfsInitialize ( - VOID - ) -{ - NTSTATUS Status; - - /* Allocate the device table with 2 entries*/ - EtfsDeviceTableEntries = 2; - EtfsDeviceTable = BlMmAllocateHeap(sizeof(PBL_FILE_ENTRY) * - EtfsDeviceTableEntries); - if (EtfsDeviceTable) - { - /* Zero it out */ - RtlZeroMemory(EtfsDeviceTable, - sizeof(PBL_FILE_ENTRY) * EtfsDeviceTableEntries); - Status = STATUS_SUCCESS; - } - else - { - /* No memory, fail */ - Status = STATUS_NO_MEMORY; - } - - /* Return back to caller */ - return Status; -} - diff --git a/boot/environ/lib/io/fat.c b/boot/environ/lib/io/fat.c deleted file mode 100644 index 5612a89b0ba..00000000000 --- a/boot/environ/lib/io/fat.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/fat.c - * PURPOSE: Boot Library FAT File System Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include -#include - -/* DATA VARIABLES ************************************************************/ - -PVOID* FatDeviceTable; -ULONG FatDeviceTableEntries; -PWCHAR FatpLongFileName; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -FatMount ( - _In_ ULONG DeviceId, - _In_ ULONG Unknown, - _Out_ PBL_FILE_ENTRY* FileEntry - ) -{ - BL_DEVICE_INFORMATION DeviceInformation; - ULONG UnknownFlag; - NTSTATUS Status; - PACKED_BOOT_SECTOR FatBootSector; - BIOS_PARAMETER_BLOCK BiosBlock; - - /* Capture thing */ - BlDeviceGetInformation(DeviceId, &DeviceInformation); - UnknownFlag = DeviceInformation.BlockDeviceInfo.Unknown; - - /* Set thing to 1 */ - DeviceInformation.BlockDeviceInfo.Unknown |= 1; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - - /* Read the boot sector */ - Status = BlDeviceReadAtOffset(DeviceId, - sizeof(FatBootSector), - 0, - &FatBootSector, - NULL); - - /* Restore thing back */ - DeviceInformation.BlockDeviceInfo.Unknown = UnknownFlag; - BlDeviceSetInformation(DeviceId, &DeviceInformation); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed reading drive: %lx\r\n", Status); - return Status; - } - - FatUnpackBios(&BiosBlock, &FatBootSector.PackedBpb); - - /* For now, quickly fail if this isn't FAT */ - if (FatBootSector.Jump[0] != 0xE9) - { - return STATUS_UNSUCCESSFUL; - } - - EfiPrintf(L"Jump: %lx Bytes Per Sector: %d Sectors Per Cluster: %d Reserved: %d Fats: %d Sectors: %d Large Sectors: %d Media: %lx RootEntries: %d\r\n", - FatBootSector.Jump[0], - BiosBlock.BytesPerSector, - BiosBlock.SectorsPerCluster, - BiosBlock.ReservedSectors, - BiosBlock.Fats, - BiosBlock.Sectors, - BiosBlock.LargeSectors, - BiosBlock.Media, - BiosBlock.RootEntries); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -FatInitialize ( - VOID - ) -{ - NTSTATUS Status; - - /* Allocate the device table with 2 entries*/ - FatDeviceTableEntries = 2; - FatDeviceTable = BlMmAllocateHeap(sizeof(PBL_FILE_ENTRY) * - FatDeviceTableEntries); - if (FatDeviceTable) - { - /* Zero it out */ - RtlZeroMemory(FatDeviceTable, - sizeof(PBL_FILE_ENTRY) * FatDeviceTableEntries); - - /* Allocate a 512 byte buffer for long file name conversion */ - FatpLongFileName = BlMmAllocateHeap(512); - Status = FatpLongFileName != NULL ? STATUS_SUCCESS : STATUS_NO_MEMORY; - } - else - { - /* No memory, fail */ - Status = STATUS_NO_MEMORY; - } - - /* Return back to caller */ - return Status; -} - diff --git a/boot/environ/lib/io/file.c b/boot/environ/lib/io/file.c deleted file mode 100644 index c6b4e4328f7..00000000000 --- a/boot/environ/lib/io/file.c +++ /dev/null @@ -1,1004 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/file.c - * PURPOSE: Boot Library File Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PVOID* FileTable; -ULONG FileEntries; - -LIST_ENTRY RegisteredFileSystems; -BL_FILE_SYSTEM_REGISTRATION_TABLE FatRegisterFunctionTable = -{ - FatInitialize, - NULL, - FatMount, - NULL -}; -BL_FILE_SYSTEM_REGISTRATION_TABLE EtfsRegisterFunctionTable = -{ - EtfsInitialize, - NULL, - EtfsMount, - NULL -}; - -extern ULONG DmTableEntries; -extern PVOID* DmDeviceTable; - -/* FUNCTIONS *****************************************************************/ - -PWCHAR -FileIoCopyParentDirectoryPath ( - _In_ PWCHAR FilePath - ) -{ - SIZE_T PathSize, PathSizeWithNull; - PWCHAR Backslash, ParentCopy; - - PathSize = wcslen(FilePath) * sizeof(WCHAR); - - PathSizeWithNull = PathSize + sizeof(UNICODE_NULL); - if (PathSizeWithNull < PathSize) - { - return NULL; - } - - ParentCopy = BlMmAllocateHeap(PathSizeWithNull); - if (!ParentCopy) - { - return NULL; - } - wcsncpy(ParentCopy, FilePath, PathSizeWithNull / sizeof(WCHAR)); - - Backslash = wcsrchr(ParentCopy, '\\'); - if (!Backslash) - { - BlMmFreeHeap(ParentCopy); - return NULL; - } - - if (Backslash == ParentCopy) - { - ++Backslash; - } - - *Backslash = UNICODE_NULL; - return ParentCopy; -} - -PWCHAR -FileIoCopyFileName ( - _In_ PWCHAR FilePath - ) -{ - PWCHAR Separator, FileCopy; - SIZE_T PathSize; - - Separator = wcsrchr(FilePath, '\\'); - if (!Separator) - { - return NULL; - } - - PathSize = wcslen(Separator) * sizeof(WCHAR); - - FileCopy = BlMmAllocateHeap(PathSize); - if (!FileCopy) - { - return NULL; - } - - wcsncpy(FileCopy, Separator + 1, PathSize / sizeof(WCHAR)); - return FileCopy; -} - -BOOLEAN -FileTableCompareWithSubsetAttributes ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ) -{ - PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry; - ULONG DeviceId = *(PULONG)Argument1; - PWCHAR FilePath = (PWCHAR)Argument2; - ULONG Flags = *(PULONG)Argument3; - ULONG Unknown = *(PULONG)Argument4; - BOOLEAN Found; - - Found = FALSE; - - if ((FileEntry->DeviceId == DeviceId) && - !(_wcsicmp(FileEntry->FilePath, FilePath)) && - (FileEntry->Unknown == Unknown)) - { - if ((!(Flags & 1) || (FileEntry->Flags & 2)) && (!(Flags & 2) || (FileEntry->Flags & 4))) - { - if ((!(Flags & 4) || (FileEntry->Flags & 0x10000)) && ((Flags & 4) || !(FileEntry->Flags & 0x10000))) - { - Found = TRUE; - } - } - } - return Found; -} - -BOOLEAN -FileTableCompareWithSameAttributes ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ) -{ - PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry; - ULONG DeviceId = *(PULONG)Argument1; - PWCHAR FilePath = (PWCHAR)Argument2; - ULONG Flags = *(PULONG)Argument3; - ULONG Unknown = *(PULONG)Argument4; - BOOLEAN Found; - - Found = FALSE; - - if ((FileEntry->DeviceId == DeviceId) && - !(_wcsicmp(FileEntry->FilePath, FilePath)) && - (FileEntry->Unknown == Unknown)) - { - if ((!(Flags & 1) || (FileEntry->Flags & 2)) && ((Flags & 1) || !(FileEntry->Flags & 2)) && (!(Flags & 2) || (FileEntry->Flags & 4)) && ((Flags & 2) || !(FileEntry->Flags & 4))) - { - if ((!(Flags & 4) || (FileEntry->Flags & 0x10000)) && ((Flags & 4) || !(FileEntry->Flags & 0x10000))) - { - Found = TRUE; - } - } - } - return Found; -} - -NTSTATUS -FileTableDestroyEntry ( - _In_ PBL_FILE_ENTRY FileEntry, - _In_ ULONG Index - ) -{ - ULONG DeviceId; - PBL_DEVICE_ENTRY DeviceEntry; - NTSTATUS Status; - - DeviceId = FileEntry->DeviceId; - if (DmTableEntries > DeviceId) - { - DeviceEntry = DmDeviceTable[DeviceId]; - if (DeviceEntry) - { - --DeviceEntry->ReferenceCount; - } - } - - Status = FileEntry->Callbacks.Close(FileEntry); - - BlMmFreeHeap(FileEntry); - - FileTable[Index] = NULL; - return Status; -} - -#define BL_FILE_PURGE_LIMIT 512 - -NTSTATUS -FileTablePurgeEntry ( - _In_ PVOID Entry - ) -{ - PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry; - - /* Don't purge opened files, or if there's less than 512 files cached */ - if (((FileEntry->Flags & BL_FILE_ENTRY_OPENED) || - (FileEntry->Flags & 0x10000)) && - (FileEntries < BL_FILE_PURGE_LIMIT)) - { - return STATUS_UNSUCCESSFUL; - } - - /* Purge the entry otherwise */ - return FileTableDestroyEntry(FileEntry, FileEntry->FileId); -} - -NTSTATUS -BlFileClose ( - _In_ ULONG FileId - ) -{ - PBL_FILE_ENTRY FileEntry; - - /* Validate the file ID */ - if (FileEntries <= FileId) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure a file entry actually exists */ - FileEntry = FileTable[FileId]; - if (!FileEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* And that it's actually open */ - if (!(FileEntry->Flags & BL_FILE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Drop a reference, check if this was the last one */ - --FileEntry->ReferenceCount; - if (!FileEntry->ReferenceCount) - { - /* File is no longer open */ - FileEntry->Flags &= ~BL_FILE_ENTRY_OPENED; - } - - /* All good */ - return STATUS_SUCCESS; -} - -NTSTATUS -FileIoOpen ( - _In_ ULONG DeviceId, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _In_ ULONG Unknown, - _In_ PBL_TBL_LOOKUP_ROUTINE CompareRoutine, - _Out_opt_ PBL_FILE_ENTRY *NewFileEntry - ) -{ - PWCHAR FileNameCopy, ParentFileName; - NTSTATUS Status; - PBL_DEVICE_ENTRY DeviceEntry; - PBL_FILE_SYSTEM_ENTRY FileSystem; - ULONG FileId, CheckFlags; - PBL_FILE_ENTRY DirectoryEntry, FileEntry; - PLIST_ENTRY NextEntry, ListHead; - - /* Preinitialize variables for failure */ - DirectoryEntry = NULL; - FileNameCopy = NULL; - ParentFileName = NULL; - Status = STATUS_SUCCESS; - - /* Bail out if the device ID is invalid */ - if (DmTableEntries <= DeviceId) - { - return STATUS_ACCESS_DENIED; - } - - /* Bail out if there's no device entry */ - DeviceEntry = DmDeviceTable[DeviceId]; - if (!DeviceEntry) - { - return STATUS_ACCESS_DENIED; - } - - /* Read access is always required for touching the device */ - CheckFlags = Flags | BL_FILE_READ_ACCESS; - - /* Check if the device is granting us read access */ - if ((CheckFlags & BL_FILE_READ_ACCESS) && - (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED) || - !(DeviceEntry->Flags & BL_DEVICE_ENTRY_READ_ACCESS))) - { - EfiPrintf(L"Access denied\r\n"); - return STATUS_ACCESS_DENIED; - } - - /* Check if the device is granting us write access */ - if ((CheckFlags & BL_FILE_WRITE_ACCESS) && - (!(DeviceEntry->Flags & BL_DEVICE_ENTRY_OPENED) || - !(DeviceEntry->Flags & BL_DEVICE_ENTRY_WRITE_ACCESS))) - { - EfiPrintf(L"Access denied2\r\n"); - return STATUS_ACCESS_DENIED; - } - - /* Check if we already have this file open */ - FileEntry = (PBL_FILE_ENTRY )BlTblFindEntry(FileTable, - FileEntries, - &FileId, - CompareRoutine, - &DeviceId, - FileName, - &Flags, - &Unknown); - if (FileEntry) - { - goto FileOpened; - } - - /* Check if we are opening the root drive or an actual file/directory */ - if ((*FileName != OBJ_NAME_PATH_SEPARATOR) || (FileName[1])) - { - /* Get the name of the directory */ - ParentFileName = FileIoCopyParentDirectoryPath(FileName); - if (!ParentFileName) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Open it */ - Status = FileIoOpen(DeviceId, - ParentFileName, - BL_FILE_READ_ACCESS | BL_DIRECTORY_ACCESS, - Unknown, - FileTableCompareWithSubsetAttributes, - &DirectoryEntry); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Now get the the file name itself */ - FileNameCopy = FileIoCopyFileName(FileName); - if (!FileNameCopy) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Open it */ - Status = DirectoryEntry->Callbacks.Open(DirectoryEntry, - FileNameCopy, - Flags, - &FileEntry); - } - else - { - /* We're opening the root, scan through all the file systems */ - Status = STATUS_UNSUCCESSFUL; - ListHead = &RegisteredFileSystems; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Try to mount this one */ - FileSystem = CONTAINING_RECORD(NextEntry, BL_FILE_SYSTEM_ENTRY, ListEntry); - Status = FileSystem->MountCallback(DeviceId, Unknown, &FileEntry); - if (NT_SUCCESS(Status)) - { - /* Mount successful */ - break; - } - - /* Try the next file system */ - NextEntry = NextEntry->Flink; - } - - /* Nothing to free on this path */ - FileNameCopy = NULL; - } - - /* Handle failure */ - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Could not open file!: %lx\r\n", Status); - goto Quickie; - } - - /* Save the unknown */ - FileEntry->Unknown = Unknown; - - /* Convert open flags into entry flags */ - if (Flags & BL_FILE_READ_ACCESS) - { - FileEntry->Flags |= BL_FILE_ENTRY_READ_ACCESS; - } - if (Flags & BL_FILE_WRITE_ACCESS) - { - FileEntry->Flags |= BL_FILE_ENTRY_WRITE_ACCESS; - } - - /* Save the file into the file table */ - Status = BlTblSetEntry(&FileTable, - &FileEntries, - (PVOID)FileEntry, - &FileId, - FileTablePurgeEntry); - if (!NT_SUCCESS(Status)) - { - /* Close it if that failed */ - FileEntry->Callbacks.Close(FileEntry); - goto Quickie; - } - - /* Add a reference on the device, and save our file ID */ - ++DeviceEntry->ReferenceCount; - Status = STATUS_SUCCESS; - FileEntry->FileId = FileId; - -FileOpened: - /* Add a reference to the file entry, and see if this is the first one */ - if (++FileEntry->ReferenceCount == 1) - { - /* Reset unknowns */ - FileEntry->TotalBytesRead = 0; - FileEntry->Unknown2 = 0; - } - - /* Set the file as opened */ - FileEntry->Flags |= BL_FILE_ENTRY_OPENED; - - /* Not sure what this flag does */ - if (Flags & BL_UNKNOWN_ACCESS) - { - FileEntry->Flags |= BL_FILE_ENTRY_UNKNOWN_ACCESS; - } - - /* If the caller wanted the entry back, return it */ - if (NewFileEntry) - { - *NewFileEntry = FileEntry; - } - -Quickie: - /* Close the parent */ - if (DirectoryEntry) - { - BlFileClose(DirectoryEntry->FileId); - } - - /* Free the parent name copy */ - if (ParentFileName) - { - BlMmFreeHeap(ParentFileName); - } - - /* Free the file name copy */ - if (FileNameCopy) - { - BlMmFreeHeap(FileNameCopy); - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -BlFileOpen ( - _In_ ULONG DeviceId, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ PULONG FileId - ) -{ - NTSTATUS Status; - PBL_FILE_ENTRY FileEntry; - BL_DEVICE_INFORMATION DeviceInformation; - - /* Make sure we have a valid file name, access flags and parameters */ - if (!(FileName) || - (*FileName != OBJ_NAME_PATH_SEPARATOR) || - !(FileId) || - !(Flags & (BL_FILE_READ_ACCESS | BL_FILE_WRITE_ACCESS))) - { - EfiPrintf(L"Invalid file options\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Get information on the underlying device */ - Status = BlDeviceGetInformation(DeviceId, &DeviceInformation); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Get device info failed: %lx\r\n", Status); - return Status; - } - - /* Make sure it's a device that can host files */ - if ((DeviceInformation.DeviceType != DiskDevice) && - (DeviceInformation.DeviceType != LegacyPartitionDevice) && - (DeviceInformation.DeviceType != UdpDevice)) - { - EfiPrintf(L"Invalid device type\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Open a file on this device, creating one if needed */ - Status = FileIoOpen(DeviceId, - FileName, - Flags, - 0, - FileTableCompareWithSameAttributes, - &FileEntry); - if (NT_SUCCESS(Status)) - { - /* Return the file ID back to the caller */ - *FileId = FileEntry->FileId; - } - - /* All good */ - return Status; -} - -NTSTATUS -BlFileSetInformation ( - _In_ ULONG FileId, - _Out_ PBL_FILE_INFORMATION FileInfo - ) -{ - PBL_FILE_ENTRY FileEntry; - - /* Make sure caller passed this in */ - if (!FileInfo) - { - return STATUS_INVALID_PARAMETER; - } - - /* Validate file ID */ - if (FileId > FileEntries) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure an opened file exits with this ID */ - FileEntry = FileTable[FileId]; - if (!(FileEntry) || !(FileEntry->Flags & BL_FILE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Do the I/O operation */ - return FileEntry->Callbacks.SetInfo(FileEntry, FileInfo); -} - -NTSTATUS -BlFileGetInformation ( - _In_ ULONG FileId, - _In_ PBL_FILE_INFORMATION FileInfo - ) -{ - PBL_FILE_ENTRY FileEntry; - - /* Make sure caller passed this in */ - if (!FileInfo) - { - return STATUS_INVALID_PARAMETER; - } - - /* Validate file ID */ - if (FileId > FileEntries) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure an opened file exits with this ID */ - FileEntry = FileTable[FileId]; - if (!(FileEntry) || !(FileEntry->Flags & BL_FILE_ENTRY_OPENED)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Do the I/O operation */ - return FileEntry->Callbacks.GetInfo(FileEntry, FileInfo); -} - -NTSTATUS -FileInformationCheck ( - _In_ PBL_FILE_INFORMATION FileInformation, - _In_ BOOLEAN Write, - _In_opt_ PULONG InputSize, - _In_opt_ PULONG BytesReturned, - _Out_opt_ PULONG RequiredSize - ) -{ - NTSTATUS Status; - ULONG Size; - - /* Initialize variables */ - Status = STATUS_SUCCESS; - Size = 0; - - /* Make sure we didn't overshoot */ - if (FileInformation->Offset > FileInformation->Size) - { - /* Bail out */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Compute the appropriate 32-bit size of this read, based on file size */ - Size = ULONG_MAX; - if ((FileInformation->Size - FileInformation->Offset) <= ULONG_MAX) - { - Size = (ULONG)(FileInformation->Size) - (ULONG)(FileInformation->Offset); - } - - /* Check if the caller has an input buffer */ - if (InputSize) - { - /* Is the size bigger than what the caller can handle? */ - if (Size >= *InputSize) - { - /* Yes, so cap it at the size of the caller's buffer */ - Size = *InputSize; - } - else if (!(BytesReturned) || (Write)) - { - /* Caller's input buffer is too smaller is fatal for writes */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - } - -Quickie: - /* Does the caller want to know how big to make their buffer? */ - if (RequiredSize) - { - /* Let them know*/ - *RequiredSize = Size; - } - - /* Return final status */ - return Status; -} - -NTSTATUS -BlFileReadEx ( - _In_ ULONG FileId, - _Out_ PVOID Buffer, - _In_ ULONG Size, - _Out_ PULONG BytesReturned, - _In_ ULONG Flags - ) -{ - PBL_FILE_ENTRY FileEntry; - NTSTATUS Status; - ULONG OldUnknown, RequiredSize; - BOOLEAN ChangedUnknown; - BL_DEVICE_INFORMATION DeviceInfo; - BL_FILE_INFORMATION fileInfo; - - /* Initialize variables */ - RtlZeroMemory(&DeviceInfo, sizeof(DeviceInfo)); - OldUnknown = 0; - ChangedUnknown = FALSE; - - /* Bail out if there's no buffer */ - if (!Buffer) - { - return STATUS_INVALID_PARAMETER; - } - - /* Bail out of the file ID is invalid */ - if (FileId > FileEntries) - { - return STATUS_INVALID_PARAMETER; - } - - /* Bail out if there's no file opened for read access */ - FileEntry = FileTable[FileId]; - if (!(FileEntry) || - !(FileEntry->Flags & (BL_FILE_ENTRY_OPENED | BL_FILE_ENTRY_READ_ACCESS))) - { - return STATUS_INVALID_PARAMETER; - } - - /* Bail out if we can't read the file's information */ - Status = BlFileGetInformation(FileId, &fileInfo); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Ensure the read attempt is valid, and fix up the size if needed */ - RequiredSize = Size; - Status = FileInformationCheck(&fileInfo, - FALSE, - &RequiredSize, - BytesReturned, - &RequiredSize); - if (!NT_SUCCESS(Status)) - { - /* Invalid or illegal read attempt */ - return Status; - } - - /* Is there anything left to read after all? */ - if (RequiredSize) - { - /* Check if flags 2 or 4 are set */ - if ((Flags & 2) || (Flags & 4)) - { - /* Check if this is a disk or partition device */ - BlDeviceGetInformation(FileEntry->DeviceId, &DeviceInfo); - if ((DeviceInfo.DeviceType == DiskDevice) || - (DeviceInfo.DeviceType == LegacyPartitionDevice)) - { - /* Check if request flags are incompatible with device flags */ - if ((!(DeviceInfo.BlockDeviceInfo.Unknown & 1) && (Flags & 2)) || - (!(DeviceInfo.BlockDeviceInfo.Unknown & 2) && (Flags & 4))) - { - /* We're going to change the device flags */ - ChangedUnknown = TRUE; - - /* Set unknown flag 1 for request flag 2 */ - if (Flags & 2) - { - DeviceInfo.BlockDeviceInfo.Unknown |= 1; - } - - /* Set unknown flag 2 for request flag 4 */ - if (Flags & 4) - { - DeviceInfo.BlockDeviceInfo.Unknown |= 2; - } - - /* Save the new device flags */ - BlDeviceSetInformation(FileEntry->DeviceId, &DeviceInfo); - } - } - } - - /* Issue the read to the underlying file system */ - Status = FileEntry->Callbacks.Read(FileEntry, - Buffer, - RequiredSize, - BytesReturned); - if (!NT_SUCCESS(Status)) - { - /* Don't update the bytes read on failure */ - RequiredSize = 0; - } - } - else - { - /* There's nothing to do, return success and 0 bytes */ - Status = STATUS_SUCCESS; - if (BytesReturned) - { - *BytesReturned = 0; - } - } - - /* Increment the number of bytes read */ - FileEntry->TotalBytesRead += RequiredSize; - - /* Check if the unknown flag on the device was changed during this routine */ - if (ChangedUnknown) - { - /* Reset it back to its original value */ - DeviceInfo.BlockDeviceInfo.Unknown = OldUnknown; - BlDeviceSetInformation(FileEntry->DeviceId, &DeviceInfo); - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -BlFileReadAtOffsetEx ( - _In_ ULONG FileId, - _In_ ULONG Size, - _In_ ULONGLONG ByteOffset, - _In_ PVOID Buffer, - _Out_ PULONG BytesReturned, - _In_ ULONG Flags - ) -{ - NTSTATUS Status; - BL_FILE_INFORMATION FileInfo; - ULONG RequiredSize; - ULONGLONG FileOffset; - - /* Get information on the specified file */ - Status = BlFileGetInformation(FileId, &FileInfo); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Save the current offset, and overwrite it with the one we want */ - FileOffset = FileInfo.Offset; - FileInfo.Offset = ByteOffset; - - /* Check the validity of the read and the actual size to read */ - RequiredSize = Size; - Status = FileInformationCheck(&FileInfo, - FALSE, - &RequiredSize, - BytesReturned, - &RequiredSize); - if (!NT_SUCCESS(Status)) - { - /* Bail out if the read is invalid */ - EfiPrintf(L"File info check failure: %lx\r\n", Status); - return Status; - } - - /* Check if the offset we're requesting is not the current offset */ - if (FileInfo.Offset != FileOffset) - { - /* Set the new offset to use */ - Status = BlFileSetInformation(FileId, &FileInfo); - if (!NT_SUCCESS(Status)) - { - /* Can't do much if that failed */ - return Status; - } - } - - /* Do the read at the required offset now */ - Status = BlFileReadEx(FileId, - Buffer, - RequiredSize, - BytesReturned, - Flags); - if (!NT_SUCCESS(Status)) - { - /* The read failed -- had we modified the offset? */ - if (FileInfo.Offset != FileOffset) - { - /* Restore the offset back to its original value */ - FileInfo.Offset = FileOffset; - BlFileSetInformation(FileId, &FileInfo); - } - } - - /* Return the status of the read */ - return Status; -} - -NTSTATUS -BlpFileRegisterFileSystem ( - _In_ PBL_FS_INIT_CALLBACK InitCallback, - _In_ PBL_FS_DESTROY_CALLBACK DestroyCallback, - _In_ PBL_FS_MOUNT_CALLBACK MountCallback, - _In_ PBL_FS_PURGE_CALLBACK PurgeCallback, - _In_ ULONG Flags - ) -{ - PBL_FILE_SYSTEM_ENTRY FsEntry; - NTSTATUS Status; - - /* Allocate an entry */ - FsEntry = BlMmAllocateHeap(sizeof(*FsEntry)); - if (!FsEntry) - { - return STATUS_NO_MEMORY; - } - - /* Initialize the file system */ - Status = InitCallback(); - if (!NT_SUCCESS(Status)) - { - BlMmFreeHeap(FsEntry); - return Status; - } - - /* Register the callbacks */ - FsEntry->MountCallback = MountCallback; - FsEntry->DestroyCallback = DestroyCallback; - FsEntry->InitCallback = InitCallback; - FsEntry->PurgeCallback = PurgeCallback; - - /* Insert in the right location in the list */ - if (Flags & BL_FS_REGISTER_AT_HEAD_FLAG) - { - InsertHeadList(&RegisteredFileSystems, &FsEntry->ListEntry); - } - else - { - InsertTailList(&RegisteredFileSystems, &FsEntry->ListEntry); - } - - /* Return */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlpFileInitialize ( - VOID - ) -{ - NTSTATUS Status; - - /* Allocate the file table */ - FileEntries = 16; - FileTable = BlMmAllocateHeap(sizeof(PBL_FILE_ENTRY) * FileEntries); - if (!FileTable) - { - return STATUS_INVALID_PARAMETER; - } - - /* Initialize it */ - RtlZeroMemory(FileTable, sizeof(PBL_FILE_ENTRY) * FileEntries); - InitializeListHead(&RegisteredFileSystems); - -#if 0 - /* Initialize the network file system */ - Status = BlpFileRegisterFileSystem(NetRegisterFunctionTable.Init, - NetRegisterFunctionTable.Destroy, - NetRegisterFunctionTable.Mount, - NetRegisterFunctionTable.Purge, - 1); - if (NT_SUCCESS(Status)) - { - /* Initialize NTFS */ - Status = BlpFileRegisterFileSystem(NtfsRegisterFunctionTable.Init, - NtfsRegisterFunctionTable.Destroy, - NtfsRegisterFunctionTable.Mount, - NtfsRegisterFunctionTable.Purge, - 0); - } - - if (NT_SUCCESS(Status)) -#endif - { - /* Initialize FAT */ - Status = BlpFileRegisterFileSystem(FatRegisterFunctionTable.Init, - FatRegisterFunctionTable.Destroy, - FatRegisterFunctionTable.Mount, - FatRegisterFunctionTable.Purge, - 0); - } - -#if 0 - if (NT_SUCCESS(Status)) - { - /* Initialize EXFAT (FatPlus) */ - Status = BlpFileRegisterFileSystem(FppRegisterFunctionTable.Init, - FppRegisterFunctionTable.Destroy, - FppRegisterFunctionTable.Mount, - FppRegisterFunctionTable.Purge, - 0); - } - - if (NT_SUCCESS(Status)) - { - /* Initialize WIM */ - Status = BlpFileRegisterFileSystem(WimRegisterFunctionTable.Init, - WimRegisterFunctionTable.Destroy, - WimRegisterFunctionTable.Mount, - WimRegisterFunctionTable.Purge, - 0); - } - - if (NT_SUCCESS(Status)) - { - /* Initialize UDFS */ - Status = BlpFileRegisterFileSystem(UdfsRegisterFunctionTable.Init, - UdfsRegisterFunctionTable.Destroy, - UdfsRegisterFunctionTable.Mount, - UdfsRegisterFunctionTable.Purge, - 0); - } -#endif - if (NT_SUCCESS(Status)) - { - /* Initialize El-Torito CDFS */ - Status = BlpFileRegisterFileSystem(EtfsRegisterFunctionTable.Init, - EtfsRegisterFunctionTable.Destroy, - EtfsRegisterFunctionTable.Mount, - EtfsRegisterFunctionTable.Purge, - 0); - } - - /* Destroy the file manager if any of the file systems didn't initialize */ - if (!NT_SUCCESS(Status)) - { - if (FileTable) - { - //BlpFileDestroy(); - } - } - return Status; -} diff --git a/boot/environ/lib/io/io.c b/boot/environ/lib/io/io.c deleted file mode 100644 index 4138b498c52..00000000000 --- a/boot/environ/lib/io/io.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/io/io.c - * PURPOSE: Boot Library I/O Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -ULONG IoMgrRoutineEntries; -PVOID* IoMgrDestroyRoutineTable; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BlpIoRegisterDestroyRoutine ( - _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine - ) -{ - ULONG Id; - - return BlTblSetEntry(&IoMgrDestroyRoutineTable, - &IoMgrRoutineEntries, - DestroyRoutine, - &Id, - TblDoNotPurgeEntry); -} - -NTSTATUS -BlpIoInitialize ( - VOID - ) -{ - NTSTATUS Status; - ULONG Size; - - /* Allocate the I/O table */ - IoMgrRoutineEntries = 4; - Size = IoMgrRoutineEntries * sizeof(PVOID); - IoMgrDestroyRoutineTable = BlMmAllocateHeap(Size); - if (IoMgrDestroyRoutineTable) - { - /* Zero it out */ - RtlZeroMemory(IoMgrDestroyRoutineTable, Size); - - /* Initialize the device manager */ - Status = BlpDeviceInitialize(); - - /* Initialize the file manager */ - if (NT_SUCCESS(Status)) - { - Status = BlpFileInitialize(); - } - } - else - { - /* No memory */ - Status = STATUS_NO_MEMORY; - } - - /* Return initialization status */ - return Status; -} - - diff --git a/boot/environ/lib/mc/.keep b/boot/environ/lib/mc/.keep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/boot/environ/lib/misc/bcd.c b/boot/environ/lib/misc/bcd.c deleted file mode 100644 index bd2c85ba573..00000000000 --- a/boot/environ/lib/misc/bcd.c +++ /dev/null @@ -1,1364 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/bcd.c - * PURPOSE: Boot Library BCD Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include - -/* FUNCTIONS *****************************************************************/ - -VOID -BiNotifyEnumerationError ( - _In_ HANDLE ObjectHandle, - _In_ PWCHAR ElementName, - _In_ NTSTATUS Status - ) -{ - /* Stub for now */ - UNREFERENCED_PARAMETER(ObjectHandle); - UNREFERENCED_PARAMETER(ElementName); - UNREFERENCED_PARAMETER(Status); - EfiPrintf(L"Error in BiNotify: %lx for element %s\r\n", Status, ElementName); -} - -ULONG -BiConvertElementFormatToValueType ( - _In_ ULONG Format - ) -{ - /* Strings and objects are strings */ - if ((Format == BCD_TYPE_STRING) || (Format == BCD_TYPE_OBJECT)) - { - return REG_SZ; - } - - /* Object lists are arrays of strings */ - if (Format == BCD_TYPE_OBJECT_LIST) - { - return REG_MULTI_SZ; - } - - /* Everything else is binary */ - return REG_BINARY; -} - -NTSTATUS -BiConvertRegistryDataToElement ( - _In_ HANDLE ObjectHandle, - _In_ PVOID Data, - _In_ ULONG DataLength, - _In_ BcdElementType ElementType, - _Out_ PVOID Element, - _Out_ PULONG ElementSize - ) -{ - NTSTATUS Status; - SIZE_T Length, Size, ReturnedLength; - PBL_DEVICE_DESCRIPTOR Device; - BOOLEAN NullTerminate; - PBCD_DEVICE_OPTION BcdDevice, ElementDevice; - PWCHAR BcdString, ElementString; - PGUID ElementGuid; UNICODE_STRING GuidString; - PULONGLONG ElementInteger; - PUSHORT ElementWord; PBOOLEAN BcdBoolean; - - /* Assume failure */ - ReturnedLength = 0; - - /* Check what type of format we are dealing with */ - switch (ElementType.Format) - { - /* Devices -- they are in a binary format */ - case BCD_TYPE_DEVICE: - - /* First, make sure it's at least big enough for an empty descriptor */ - if (DataLength < FIELD_OFFSET(BCD_DEVICE_OPTION, - DeviceDescriptor.Unknown)) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Both the registry and BCD format are the same */ - BcdDevice = (PBCD_DEVICE_OPTION)Data; - ElementDevice = (PBCD_DEVICE_OPTION)Element; - - /* Make sure the device fits in the registry data */ - Device = &BcdDevice->DeviceDescriptor; - Size = Device->Size; - if ((Size + sizeof(BcdDevice->AssociatedEntry)) != DataLength) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Check if this is a locate device */ - if (Device->DeviceType == LocateDevice) - { - EfiPrintf(L"Locates not yet supported\r\n"); - return STATUS_NOT_SUPPORTED; - } - - /* Make sure the caller's buffer can fit the device */ - ReturnedLength = Size + sizeof(BcdDevice->AssociatedEntry); - if (ReturnedLength > *ElementSize) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* It'll fit -- copy it in */ - RtlCopyMemory(&ElementDevice->DeviceDescriptor, Device, Size); - ElementDevice->AssociatedEntry = BcdDevice->AssociatedEntry; - Status = STATUS_SUCCESS; - break; - - /* Strings -- they are stored as is */ - case BCD_TYPE_STRING: - - /* Make sure the string isn't empty or misaligned */ - if (!(DataLength) || (DataLength & 1)) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Both the registry and BCD format are the same */ - BcdString = (PWCHAR)Data; - ElementString = (PWCHAR)Element; - - /* We'll need as much data as the string has to offer */ - ReturnedLength = DataLength; - - /* If the string isn't NULL-terminated, do it now */ - NullTerminate = FALSE; - if (BcdString[(DataLength / sizeof(WCHAR)) - 1] != UNICODE_NULL) - { - ReturnedLength += sizeof(UNICODE_NULL); - NullTerminate = TRUE; - } - - /* Will we fit in the caller's buffer? */ - if (ReturnedLength > *ElementSize) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Yep -- copy it in, and NULL-terminate if needed */ - RtlCopyMemory(Element, Data, DataLength); - if (NullTerminate) - { - ElementString[DataLength / sizeof(WCHAR)] = UNICODE_NULL; - } - - Status = STATUS_SUCCESS; - break; - - /* Objects -- they are stored as GUID Strings */ - case BCD_TYPE_OBJECT: - - /* Registry data is a string, BCD data is a GUID */ - BcdString = (PWCHAR)Data; - ElementGuid = (PGUID)Element; - - /* We need a GUID-sized buffer, does the caller have one? */ - ReturnedLength = sizeof(*ElementGuid); - if (*ElementSize < ReturnedLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Yep, copy the GUID */ - RtlInitUnicodeString(&GuidString, BcdString); - Status = RtlGUIDFromString(&GuidString, ElementGuid); - break; - - /* Object Lists -- they are stored as arrays of GUID strings */ - case BCD_TYPE_OBJECT_LIST: - - /* Assume an empty list*/ - ReturnedLength = 0; - Length = 0; - Status = STATUS_SUCCESS; - - /* Registry data is an array of strings, BCD data is array of GUIDs */ - BcdString = (PWCHAR)Data; - ElementGuid = (PGUID)Element; - - /* Loop as long as the array still has strings */ - while (*BcdString) - { - /* Don't read beyond the registry data */ - if (Length >= DataLength) - { - break; - } - - /* One more GUID -- does the caller have space? */ - ReturnedLength += sizeof(GUID); - if (ReturnedLength <= *ElementSize) - { - /* Convert and add it in */ - RtlInitUnicodeString(&GuidString, BcdString); - Status = RtlGUIDFromString(&GuidString, ElementGuid); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Move to the next GUID in the caller's buffer */ - ElementGuid++; - } - - /* Move to the next string in the registry array */ - Size = (wcslen(BcdString) * sizeof(WCHAR)) + sizeof(UNICODE_NULL); - Length += Size; - BcdString = (PWCHAR)((ULONG_PTR)BcdString + Length); - } - - /* Check if we failed anywhere */ - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Check if we consumed more space than we have */ - if (ReturnedLength > *ElementSize) - { - Status = STATUS_BUFFER_TOO_SMALL; - } - - /* All good here */ - break; - - /* Integer -- stored as binary */ - case BCD_TYPE_INTEGER: - - /* BCD data is a ULONGLONG, registry data is 8 bytes binary */ - ElementInteger = (PULONGLONG)Element; - ReturnedLength = sizeof(*ElementInteger); - - /* Make sure the registry data makes sense */ - if (DataLength > ReturnedLength) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Make sure the caller has space */ - if (*ElementSize < ReturnedLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Write the integer result */ - *ElementInteger = 0; - RtlCopyMemory(ElementInteger, Data, DataLength); - Status = STATUS_SUCCESS; - break; - - /* Boolean -- stored as binary */ - case BCD_TYPE_BOOLEAN: - - /* BCD data is a BOOLEAN, registry data is 2 bytes binary */ - ElementWord = (PUSHORT)Element; - BcdBoolean = (PBOOLEAN)Data; - ReturnedLength = sizeof(ElementWord); - - /* Make sure the registry data makes sense */ - if (DataLength != sizeof(*BcdBoolean)) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Make sure the caller has space */ - if (*ElementSize < ReturnedLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Write the boolean result */ - *ElementWord = 0; - *ElementWord = *BcdBoolean != 0; - Status = STATUS_SUCCESS; - break; - - /* Integer list --stored as binary */ - case BCD_TYPE_INTEGER_LIST: - - /* BCD Data is n ULONGLONGs, registry data is n*8 bytes binary */ - ReturnedLength = DataLength; - if (!(DataLength) || (DataLength & 7)) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Make sure the caller has space */ - if (*ElementSize < ReturnedLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Write the integer list result */ - RtlCopyMemory(Element, Data, DataLength); - Status = STATUS_SUCCESS; - break; - - /* Arbitrary data */ - default: - - /* Registry data is copied binary as-is */ - ReturnedLength = DataLength; - - /* Make sure it's not empty */ - if (!DataLength) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Make sure the caller has space */ - if (*ElementSize < ReturnedLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Write the result */ - RtlCopyMemory(Element, Data, DataLength); - Status = STATUS_SUCCESS; - break; - } - - /* If we got here due to success or space issues, write the size */ - if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_TOO_SMALL)) - { - *ElementSize = ReturnedLength; - } - - /* All done, return our conversion result */ - return Status; -} - -NTSTATUS -BiConvertBcdElements ( - _In_ PBCD_PACKED_ELEMENT Elements, - _Out_opt_ PBCD_ELEMENT Buffer, - _Inout_ PULONG BufferSize, - _Inout_ PULONG ElementCount - ) -{ - NTSTATUS Status; - ULONG ElementSize, AlignedElementSize, AlignedDataSize; - PBCD_ELEMENT_HEADER Header; - PVOID Data; - BOOLEAN Exists; - ULONG i, j, Count; - - /* Local variable to keep track of objects */ - Count = 0; - - /* Safely compute the element bytes needed */ - Status = RtlULongMult(*ElementCount, sizeof(BCD_ELEMENT), &ElementSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Safely align the element size */ - Status = RtlULongAdd(ElementSize, - sizeof(ULONG) - 1, - &AlignedElementSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - AlignedElementSize = ALIGN_DOWN(AlignedElementSize, ULONG); - - /* Do a safe version of Add2Ptr to figure out where the headers will start */ - Status = RtlULongPtrAdd((ULONG_PTR)Buffer, - AlignedElementSize, - (PULONG_PTR)&Header); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Safely compute the header bytes needed */ - Status = RtlULongMult(*ElementCount, - sizeof(BCD_ELEMENT_HEADER), - &ElementSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Safely align the header size */ - Status = RtlULongAdd(ElementSize, - AlignedElementSize + sizeof(ULONG) - 1, - &AlignedElementSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - AlignedElementSize = ALIGN_DOWN(AlignedElementSize, ULONG); - - /* Do a safe version of Add2Ptr */ - Status = RtlULongPtrAdd((ULONG_PTR)Buffer, - AlignedElementSize, - (PULONG_PTR)&Data); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Iterate over every element */ - for (i = 0; i < *ElementCount; i++) - { - /* Safely align the element size */ - Status = RtlULongAdd(Elements->Size, - sizeof(ULONG) - 1, - &AlignedDataSize); - if (!NT_SUCCESS(Status)) - { - break; - } - AlignedDataSize = ALIGN_DOWN(AlignedDataSize, ULONG); - - /* Safely add the size of this data element */ - Status = RtlULongAdd(AlignedElementSize, - AlignedDataSize, - &AlignedElementSize); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Do we have enough space left? */ - if (*BufferSize >= AlignedElementSize) - { - /* Check if our root is an inherited object */ - Exists = FALSE; - if (Elements->RootType.PackedValue == BcdLibraryObjectList_InheritedObjects) - { - /* Yes, scan for us in the current buffer */ - for (j = 0; j < Count; j++) - { - /* Do we already exist? */ - while (Buffer[j].Header->Type == Elements->RootType.PackedValue) - { - /* Yep */ - Exists = TRUE; - break; - } - } - } - - /* Have we already found ourselves? */ - if (!Exists) - { - /* Nope, one more entry */ - ++Count; - - /* Write out the unpacked object */ - Buffer->Body = Data; - Buffer->Header = Header; - - /* Fill out its header */ - Header->Size = Elements->Size; - Header->Type = Elements->Type; - Header->Version = Elements->Version; - - /* And copy the data */ - RtlCopyMemory(Data, Elements->Data, Header->Size); - - /* Move to the next unpacked object and header */ - ++Buffer; - ++Header; - - /* Move to the next data entry */ - Data = (PVOID)((ULONG_PTR)Data + AlignedDataSize); - } - } - else - { - /* Nope, set failure code, but keep going so we can return count */ - Status = STATUS_BUFFER_TOO_SMALL; - } - - /* Move to the next element entry */ - Elements = Elements->NextEntry; - } - - /* Return the new final buffer size and count */ - *BufferSize = AlignedElementSize; - *ElementCount = Count; - return Status; -} - -NTSTATUS -BcdOpenObject ( - _In_ HANDLE BcdHandle, - _In_ PGUID ObjectId, - _Out_ PHANDLE ObjectHandle - ) -{ - NTSTATUS Status; - GUID LocalGuid; - UNICODE_STRING GuidString; - HANDLE RootObjectHandle; - - /* Assume failure */ - *ObjectHandle = NULL; - - /* Initialize GUID string */ - GuidString.Buffer = NULL; - - /* Open the root "Objects" handle */ - RootObjectHandle = NULL; - Status = BiOpenKey(BcdHandle, L"Objects", &RootObjectHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Capture the object ID and convert it into a string */ - LocalGuid = *ObjectId; - Status = RtlStringFromGUID(&LocalGuid, &GuidString); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Now open the key containing this object ID */ - Status = BiOpenKey(RootObjectHandle, GuidString.Buffer, ObjectHandle); - -Quickie: - /* Free the GUID string if we had one allocated */ - if (GuidString.Buffer) - { - RtlFreeUnicodeString(&GuidString); - } - - /* Close the root handle if it was open */ - if (RootObjectHandle) - { - BiCloseKey(RootObjectHandle); - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -BcdDeleteElement ( - _In_ HANDLE ObjectHandle, - _In_ ULONG Type - ) -{ - NTSTATUS Status; - HANDLE ElementsHandle, ElementHandle; - WCHAR TypeString[22]; - - /* Open the elements key */ - Status = BiOpenKey(ObjectHandle, L"Elements", &ElementsHandle); - if (NT_SUCCESS(Status)) - { - /* Convert the element ID into a string */ - if (!_ultow(Type, TypeString, 16)) - { - /* Failed to do so */ - Status = STATUS_UNSUCCESSFUL; - } - else - { - /* Open the element specifically */ - Status = BiOpenKey(ElementsHandle, TypeString, &ElementHandle); - if (NT_SUCCESS(Status)) - { - /* Delete it */ - Status = BiDeleteKey(ElementHandle); - if (NT_SUCCESS(Status)) - { - /* No point in closing the handle anymore */ - ElementHandle = NULL; - } - } - else - { - /* The element doesn't exist */ - Status = STATUS_NOT_FOUND; - } - - /* Check if we should close the key */ - if (ElementHandle) - { - /* Do it */ - BiCloseKey(ElementHandle); - } - } - } - - /* Check if we should close the elements handle */ - if (ElementsHandle) - { - /* Do it */ - BiCloseKey(ElementsHandle); - } - - /* Return whatever the result was */ - return Status; -} - -NTSTATUS -BiEnumerateSubElements ( - _In_ HANDLE BcdHandle, - _In_ PVOID Object, - _In_ ULONG ElementType, - _In_ ULONG Flags, - _Out_opt_ PBCD_PACKED_ELEMENT* Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCount - ) -{ - NTSTATUS Status; - PBCD_PACKED_ELEMENT Element; - HANDLE ObjectHandle; - ULONG ParsedElements, RequiredSize; - - /* Assume empty */ - *ElementCount = 0; - RequiredSize = 0; - ParsedElements = 0; - - /* Open the object */ - Status = BcdOpenObject(BcdHandle, Object, &ObjectHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Read the first entry, and the size available */ - Element = *Elements; - RequiredSize = *ElementSize; - - /* Enumerate the object into the element array */ - Status = BiEnumerateElements(BcdHandle, - ObjectHandle, - ElementType, - Flags, - Element, - &RequiredSize, - &ParsedElements); - - /* Close the handle and bail out if we couldn't enumerate */ - BiCloseKey(ObjectHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Check if the and subelements were present */ - if (ParsedElements) - { - /* Keep going until the last one */ - while (Element->NextEntry) - { - Element = Element->NextEntry; - } - - /* Set the new buffer location to the last element */ - *Elements = Element; - } - -Quickie: - /* Return the number of sub-elements and their size */ - *ElementCount = ParsedElements; - *ElementSize = RequiredSize; - return Status; -} - -NTSTATUS -BiEnumerateSubObjectElements ( - _In_ HANDLE BcdHandle, - _Out_ PGUID SubObjectList, - _In_ ULONG SubObjectCount, - _In_ ULONG Flags, - _Out_opt_ PBCD_PACKED_ELEMENT Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCount - ) -{ - NTSTATUS Status; - ULONG SubElementCount, TotalSize, RequiredSize, CurrentSize, i; - PBCD_PACKED_ELEMENT PreviousElement; - - /* Assume empty list */ - *ElementCount = 0; - Status = STATUS_SUCCESS; - - /* Initialize variables */ - TotalSize = 0; - PreviousElement = NULL; - - /* Set the currently remaining size based on caller's input */ - CurrentSize = *ElementSize; - - /* Iterate over every subje object */ - for (i = 0; i < SubObjectCount; i++) - { - /* Set the currently remaining buffer space */ - RequiredSize = CurrentSize; - - /* Enumerate the inherited sub elements */ - Status = BiEnumerateSubElements(BcdHandle, - &SubObjectList[i], - BcdLibraryObjectList_InheritedObjects, - Flags, - &Elements, - &RequiredSize, - &SubElementCount); - if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_TOO_SMALL)) - { - /* Safely add the length of the sub elements */ - Status = RtlULongAdd(TotalSize, RequiredSize, &TotalSize); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Add the sub elements to the total */ - *ElementCount += SubElementCount; - - /* See if we have enough space*/ - if (*ElementSize >= TotalSize) - { - /* Were there any subelements? */ - if (SubElementCount) - { - /* Update to keep track of these new subelements */ - CurrentSize = *ElementSize - TotalSize; - - /* Link the subelements into the chain */ - PreviousElement = Elements; - PreviousElement->NextEntry = - (PBCD_PACKED_ELEMENT)((ULONG_PTR)Elements + TotalSize); - Elements = PreviousElement->NextEntry; - } - } - else - { - /* We're out of space */ - CurrentSize = 0; - } - } - else if ((Status != STATUS_NOT_FOUND) && - (Status != STATUS_OBJECT_NAME_NOT_FOUND)) - { - /* Some other fatal error, break out */ - break; - } - else - { - /* The sub element was not found, print a warning but keep going */ - BlStatusPrint(L"Ignoring missing BCD inherit object: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n", - (&SubObjectList[i])->Data1, - (&SubObjectList[i])->Data2, - (&SubObjectList[i])->Data3, - (&SubObjectList[i])->Data4[0], - (&SubObjectList[i])->Data4[1], - (&SubObjectList[i])->Data4[2], - (&SubObjectList[i])->Data4[3], - (&SubObjectList[i])->Data4[4], - (&SubObjectList[i])->Data4[5], - (&SubObjectList[i])->Data4[6], - (&SubObjectList[i])->Data4[7]); - Status = STATUS_SUCCESS; - } - } - - /* Terminate the last element, if one was left */ - if (PreviousElement) - { - PreviousElement->NextEntry = NULL; - } - - /* Set failure code if we ran out of space */ - if (*ElementSize < TotalSize) - { - Status = STATUS_BUFFER_TOO_SMALL; - } - - /* Return final length and status */ - *ElementSize = TotalSize; - return Status; -} - -NTSTATUS -BiEnumerateElements ( - _In_ HANDLE BcdHandle, - _In_ HANDLE ObjectHandle, - _In_ ULONG RootElementType, - _In_ ULONG Flags, - _Out_opt_ PBCD_PACKED_ELEMENT Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCount - ) -{ - HANDLE ElementsHandle, ElementHandle; - ULONG TotalLength, RegistryElementDataLength, RemainingLength; - NTSTATUS Status; - ULONG i; - PVOID ElementData, SubObjectList, RegistryElementData; - BcdElementType ElementType; - PBCD_PACKED_ELEMENT PreviousElement, ElementsStart; - ULONG SubElementCount, SubKeyCount, SubObjectCount, ElementDataLength; - PWCHAR ElementName; - PWCHAR* SubKeys; - - /* Assume failure */ - *ElementCount = 0; - - /* Initialize all locals that are checked at the end*/ - SubKeys = NULL; - ElementsHandle = NULL; - ElementHandle = NULL; - ElementData = NULL; - RegistryElementData = NULL; - PreviousElement = NULL; - ElementName = NULL; - SubObjectList = NULL; - TotalLength = 0; - ElementDataLength = 0; - SubObjectCount = 0; - RemainingLength = 0; - ElementsStart = Elements; - - /* Open the root object key's elements */ - Status = BiOpenKey(ObjectHandle, L"Elements", &ElementsHandle); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Enumerate all elements */ - Status = BiEnumerateSubKeys(ElementsHandle, &SubKeys, &SubKeyCount); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Iterate over each one */ - for (i = 0; i < SubKeyCount; i++) - { - /* Open the element */ - ElementName = SubKeys[i]; - Status = BiOpenKey(ElementsHandle, ElementName, &ElementHandle); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"ELEMENT ERROR: %lx\r\n", Status); - EfiStall(100000); - break; - } - - /* The name of the element is its data type */ - ElementType.PackedValue = wcstoul(SubKeys[i], NULL, 16); - if (!(ElementType.PackedValue) || (ElementType.PackedValue == -1)) - { - EfiPrintf(L"Value invalid\r\n"); - BiCloseKey(ElementHandle); - ElementHandle = NULL; - continue; - } - - /* Read the appropriate registry value type for this element */ - Status = BiGetRegistryValue(ElementHandle, - L"Element", - BiConvertElementFormatToValueType( - ElementType.Format), - &RegistryElementData, - &RegistryElementDataLength); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Element invalid\r\n"); - break; - } - - /* Now figure out how much space the converted element will need */ - ElementDataLength = 0; - Status = BiConvertRegistryDataToElement(ObjectHandle, - RegistryElementData, - RegistryElementDataLength, - ElementType, - NULL, - &ElementDataLength); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - break; - } - - /* Allocate a buffer big enough for the converted element */ - ElementData = BlMmAllocateHeap(ElementDataLength); - if (!ElementData) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - - /* And actually convert it this time around */ - Status = BiConvertRegistryDataToElement(ObjectHandle, - RegistryElementData, - RegistryElementDataLength, - ElementType, - ElementData, - &ElementDataLength); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Safely add space for the packed element header */ - Status = RtlULongAdd(TotalLength, - FIELD_OFFSET(BCD_PACKED_ELEMENT, Data), - &TotalLength); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Safely add space for the data of the element itself */ - Status = RtlULongAdd(TotalLength, ElementDataLength, &TotalLength); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* One more element */ - ++*ElementCount; - - /* See how much space we were given */ - RemainingLength = *ElementSize; - if (RemainingLength >= TotalLength) - { - /* Set the next pointer */ - Elements->NextEntry = (PBCD_PACKED_ELEMENT)((ULONG_PTR)ElementsStart + TotalLength); - - /* Fill this one out */ - Elements->RootType.PackedValue = RootElementType; - Elements->Version = 1; - Elements->Type = ElementType.PackedValue; - Elements->Size = ElementDataLength; - - /* Add the data */ - RtlCopyMemory(Elements->Data, ElementData, ElementDataLength); - RemainingLength -= TotalLength; - - /* Move to the next element on the next pass */ - PreviousElement = Elements; - Elements = Elements->NextEntry; - } - else - { - /* We're out of space */ - RemainingLength = 0; - } - - /* Are we enumerating devices, and is this a device? */ - if ((Flags & BCD_ENUMERATE_FLAG_DEVICES) && - (ElementType.Format == BCD_TYPE_DEVICE)) - { - /* Yep, so go inside to enumerate it */ - Status = BiEnumerateSubElements(BcdHandle, - ElementData, - ElementType.PackedValue, - Flags, - &Elements, - &ElementDataLength, - &SubElementCount); - if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_TOO_SMALL)) - { - /* Safely add the length of the sub elements */ - Status = RtlULongAdd(TotalLength, - ElementDataLength, - &TotalLength); - if (!NT_SUCCESS(Status)) - { - break; - } - - /* Add the sub elements to the total */ - *ElementCount += SubElementCount; - - /* See if we have enough space*/ - if (*ElementSize >= TotalLength) - { - /* Were there any subelements? */ - if (SubElementCount) - { - /* Update to keep track of these new subelements */ - ElementDataLength = *ElementSize - TotalLength; - - /* Link the subelements into the chain */ - PreviousElement = Elements; - PreviousElement->NextEntry = - (PBCD_PACKED_ELEMENT)((ULONG_PTR)ElementsStart + - TotalLength); - Elements = PreviousElement->NextEntry; - } - } - else - { - /* We're out of space */ - ElementDataLength = 0; - } - } - else if ((Status != STATUS_NOT_FOUND) && - (Status != STATUS_OBJECT_NAME_NOT_FOUND)) - { - /* Fatal error trying to read the data, so fail */ - break; - } - } - else if ((Flags & BCD_ENUMERATE_FLAG_DEEP) && - (ElementType.PackedValue == BcdLibraryObjectList_InheritedObjects)) - { - /* Inherited objects are requested, so allocate a buffer for them */ - SubObjectList = BlMmAllocateHeap(ElementDataLength); - if (!SubObjectList) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - break; - } - - /* Copy the elements into the list. They are arrays of GUIDs */ - RtlCopyMemory(SubObjectList, ElementData, ElementDataLength); - SubObjectCount = ElementDataLength / sizeof(GUID); - } - - /* Free our local buffers */ - BlMmFreeHeap(ElementData); - BlMmFreeHeap(RegistryElementData); - ElementData = NULL; - RegistryElementData = NULL; - - /* Close the key */ - BiCloseKey(ElementHandle); - ElementHandle = NULL; - ElementName = NULL; - } - - /* Did we end up here with a sub object list after successful loop parsing? */ - if ((i != 0) && (i == SubKeyCount) && (SubObjectList)) - { - /* We will actually enumerate it now, at the end */ - Status = BiEnumerateSubObjectElements(BcdHandle, - SubObjectList, - SubObjectCount, - Flags, - Elements, - &RemainingLength, - &SubElementCount); - if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_TOO_SMALL)) - { - /* Safely add the length of the sub elements */ - Status = RtlULongAdd(TotalLength, RemainingLength, &TotalLength); - if ((NT_SUCCESS(Status)) && (SubElementCount)) - { - /* Add the sub elements to the total */ - *ElementCount += SubElementCount; - - /* Don't touch PreviousElement anymore */ - PreviousElement = NULL; - } - } - } - -Quickie: - /* Free the sub object list, if any */ - if (SubObjectList) - { - BlMmFreeHeap(SubObjectList); - } - - /* Free any local element data */ - if (ElementData) - { - BlMmFreeHeap(ElementData); - } - - /* Free any local registry data */ - if (RegistryElementData) - { - BlMmFreeHeap(RegistryElementData); - } - - /* Close the handle if still opened */ - if (ElementHandle) - { - BiCloseKey(ElementHandle); - } - - /* Terminate the last element, if any */ - if (PreviousElement) - { - PreviousElement->NextEntry = NULL; - } - - /* Close the root handle if still opened */ - if (ElementsHandle) - { - BiCloseKey(ElementsHandle); - } - - /* Set failure code if out of space */ - if (*ElementSize < TotalLength) - { - Status = STATUS_BUFFER_TOO_SMALL; - } - - /* Other errors will send a notification error */ - if (!(NT_SUCCESS(Status)) && (Status != STATUS_BUFFER_TOO_SMALL)) - { - BiNotifyEnumerationError(ObjectHandle, ElementName, Status); - } - - /* Finally free the subkeys array */ - if (SubKeys) - { - BlMmFreeHeap(SubKeys); - } - - /* And return the required, final length and status */ - *ElementSize = TotalLength; - return Status; -} - -NTSTATUS -BiAddStoreFromFile ( - _In_ PBL_FILE_PATH_DESCRIPTOR FilePath, - _Out_ PHANDLE StoreHandle - ) -{ - NTSTATUS Status; - HANDLE HiveHandle, KeyHandle; - - /* Load the specified hive */ - Status = BiLoadHive(FilePath, &HiveHandle); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Open the description key to make sure this is really a BCD */ - Status = BiOpenKey(HiveHandle, L"Description", &KeyHandle); - if (NT_SUCCESS(Status)) - { - /* It is -- close the key as we don't need it */ - BiCloseKey(KeyHandle); - *StoreHandle = HiveHandle; - } - else - { - /* Failure, drop a reference on the hive and close the key */ - BiDereferenceHive(HiveHandle); - BiCloseKey(HiveHandle); - } - - /* Return the status */ - return Status; -} - -NTSTATUS -BiGetObjectDescription ( - _In_ HANDLE ObjectHandle, - _Out_ PBCD_OBJECT_DESCRIPTION Description - ) -{ - NTSTATUS Status; - HANDLE DescriptionHandle; - PULONG Data; - ULONG Length; - - /* Initialize locals */ - Data = NULL; - DescriptionHandle = NULL; - - /* Open the description key */ - Status = BiOpenKey(ObjectHandle, L"Description", &DescriptionHandle); - if (NT_SUCCESS(Status)) - { - /* It exists */ - Description->Valid = TRUE; - - /* Read the type */ - Length = 0; - Status = BiGetRegistryValue(DescriptionHandle, - L"Type", - REG_DWORD, - (PVOID*)&Data, - &Length); - if (NT_SUCCESS(Status)) - { - /* Make sure it's the length we expected it to be */ - if (Length == sizeof(Data)) - { - /* Return the type that is stored there */ - Description->Type = *Data; - } - else - { - /* Invalid type value */ - Status = STATUS_OBJECT_TYPE_MISMATCH; - } - } - } - - /* Did we have a handle open? */ - if (DescriptionHandle) - { - /* Close it */ - BiCloseKey(DescriptionHandle); - } - - /* Did we have data allocated? */ - if (Data) - { - /* Free it */ - BlMmFreeHeap(Data); - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -BcdEnumerateAndUnpackElements ( - _In_ HANDLE BcdHandle, - _In_ HANDLE ObjectHandle, - _Out_opt_ PBCD_ELEMENT Elements, - _Inout_ PULONG ElementSize, - _Out_ PULONG ElementCount - ) -{ - PVOID LocalElements; - NTSTATUS Status; - ULONG LocalElementCount, LocalElementSize; - - /* Make sure required parameters are there */ - if (!(ElementSize) || !(ElementCount) || ((Elements) && (!*ElementSize))) - { - return STATUS_INVALID_PARAMETER; - } - - /* Set initial count to zero */ - *ElementCount = 0; - - /* Do the initial enumeration to figure out the size required */ - LocalElementSize = 0; - LocalElementCount = 0; - Status = BiEnumerateElements(BcdHandle, - ObjectHandle, - 0, - BCD_ENUMERATE_FLAG_IN_ORDER | - BCD_ENUMERATE_FLAG_DEVICES | - BCD_ENUMERATE_FLAG_DEEP, - NULL, - &LocalElementSize, - &LocalElementCount); - if (Status != STATUS_BUFFER_TOO_SMALL) - { - return Status; - } - - /* Now allocate a buffer large enough to hold them */ - LocalElements = BlMmAllocateHeap(LocalElementSize); - if (!LocalElements) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Zero out the array and do the real enumeration this time around */ - RtlZeroMemory(LocalElements, LocalElementSize); - Status = BiEnumerateElements(BcdHandle, - ObjectHandle, - 0, - BCD_ENUMERATE_FLAG_IN_ORDER | - BCD_ENUMERATE_FLAG_DEVICES | - BCD_ENUMERATE_FLAG_DEEP, - LocalElements, - &LocalElementSize, - &LocalElementCount); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Now we know the real count */ - *ElementCount = LocalElementCount; - - /* Now unpack the data */ - Status = BiConvertBcdElements(LocalElements, - Elements, - ElementSize, - &LocalElementCount); - if (NT_SUCCESS(Status)) - { - /* Not all elements may have been converted */ - *ElementCount = LocalElementCount; - } - - /* Free the local (unpacked) buffer and return status */ - BlMmFreeHeap(LocalElements); - return Status; -} - -NTSTATUS -BcdOpenStoreFromFile ( - _In_ PUNICODE_STRING FileName, - _In_ PHANDLE BcdHandle - ) -{ - ULONG Length; - PBL_FILE_PATH_DESCRIPTOR FilePath; - NTSTATUS Status; - HANDLE LocalHandle; - - /* Assume failure */ - LocalHandle = NULL; - - /* Allocate a path descriptor */ - Length = FileName->Length + sizeof(*FilePath); - FilePath = BlMmAllocateHeap(Length); - if (!FilePath) - { - return STATUS_NO_MEMORY; - } - - /* Initialize it */ - FilePath->Version = 1; - FilePath->PathType = InternalPath; - FilePath->Length = Length; - - /* Copy the name and NULL-terminate it */ - RtlCopyMemory(FilePath->Path, FileName->Buffer, Length); - FilePath->Path[Length / sizeof(WCHAR)] = UNICODE_NULL; - - /* Open the BCD */ - Status = BiAddStoreFromFile(FilePath, &LocalHandle); - if (NT_SUCCESS(Status)) - { - /* Return the handle on success */ - *BcdHandle = LocalHandle; - } - - /* Free the descriptor and return the status */ - BlMmFreeHeap(FilePath); - return Status; -} - diff --git a/boot/environ/lib/misc/bcdopt.c b/boot/environ/lib/misc/bcdopt.c deleted file mode 100644 index 1b1600182ce..00000000000 --- a/boot/environ/lib/misc/bcdopt.c +++ /dev/null @@ -1,872 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/bcdopt.c - * PURPOSE: Boot Library BCD Option Parsing Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include - -/* FUNCTIONS *****************************************************************/ - -PBL_BCD_OPTION -MiscGetBootOption ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type - ) -{ - ULONG_PTR NextOption = 0, ListOption; - PBL_BCD_OPTION Option, FoundOption; - - /* No options, bail out */ - if (!List) - { - return NULL; - } - - /* Loop while we find an option */ - FoundOption = NULL; - do - { - /* Get the next option and see if it matches the type */ - Option = (PBL_BCD_OPTION)((ULONG_PTR)List + NextOption); - if ((Option->Type == Type) && !(Option->Empty)) - { - FoundOption = Option; - break; - } - - /* Store the offset of the next option */ - NextOption = Option->NextEntryOffset; - - /* Failed to match. Check for list options */ - ListOption = Option->ListOffset; - if (ListOption) - { - /* Try to get a match in the associated option */ - Option = MiscGetBootOption((PBL_BCD_OPTION)((ULONG_PTR)Option + - ListOption), - Type); - if (Option) - { - /* Return it */ - FoundOption = Option; - break; - } - } - } while (NextOption); - - /* Return the option that was found, if any */ - return FoundOption; -} - -/*++ - * @name BlGetBootOptionListSize - * - * The BlGetBootOptionListSize routine - * - * @param BcdOption - * UEFI Image Handle for the current loaded application. - * - * @return Size of the BCD option - * - *--*/ -ULONG -BlGetBootOptionListSize ( - _In_ PBL_BCD_OPTION BcdOption - ) -{ - ULONG Size = 0, NextOffset = 0; - PBL_BCD_OPTION NextOption; - - /* Loop all the options*/ - do - { - /* Move to the next one */ - NextOption = (PBL_BCD_OPTION)((ULONG_PTR)BcdOption + NextOffset); - - /* Compute the size of the next one */ - Size += BlGetBootOptionSize(NextOption); - - /* Update the offset */ - NextOffset = NextOption->NextEntryOffset; - } while (NextOffset); - - /* Return final computed size */ - return Size; -} - -/*++ - * @name BlGetBootOptionSize - * - * The BlGetBootOptionSize routine - * - * @param BcdOption - * UEFI Image Handle for the current loaded application. - * - * @return Size of the BCD option - * - *--*/ -ULONG -BlGetBootOptionSize ( - _In_ PBL_BCD_OPTION BcdOption - ) -{ - ULONG Size, Offset; - - /* Check if there's any data */ - if (BcdOption->DataOffset) - { - /* Add the size of the data */ - Size = BcdOption->DataOffset + BcdOption->DataSize; - } - else - { - /* No data, just the structure itself */ - Size = sizeof(*BcdOption); - } - - /* Any associated options? */ - Offset = BcdOption->ListOffset; - if (Offset) - { - /* Go get those too */ - Size += BlGetBootOptionListSize((PVOID)((ULONG_PTR)BcdOption + Offset)); - } - - /* Return the final size */ - return Size; -} - -NTSTATUS -BlGetBootOptionString ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PWCHAR* Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - PWCHAR String, StringCopy; - ULONG StringLength; - BcdElementType ElementType; - //PGUID AppIdentifier; - - /* Make sure this is a BCD_STRING */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_STRING) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (Option) - { - /* Extract the string */ - String = (PWCHAR)((ULONG_PTR)Option + Option->DataOffset); - Status = STATUS_SUCCESS; - } - else - { - /* No string is present */ - String = NULL; - Status = STATUS_NOT_FOUND; - } - - /* Compute the data size */ - StringLength = Option->DataSize / sizeof(WCHAR); - -#ifdef _SECURE_BOOT_ - /* Filter out SecureBoot Options */ - AppIdentifier = BlGetApplicationIdentifier(); - Status = BlpBootOptionCallbackString(AppIdentifier, Type, String, StringLength, &String, &StringLength); -#else -#endif - - /* Make sure we have a valid, non-filtered string */ - if (NT_SUCCESS(Status)) - { - /* Check if we have space for one more character */ - Status = RtlULongAdd(StringLength, 1, &StringLength); - if (NT_SUCCESS(Status)) - { - /* Check if it's safe to multiply by two */ - Status = RtlULongMult(StringLength, sizeof(WCHAR), &StringLength); - if (NT_SUCCESS(Status)) - { - /* Allocate a copy for the string */ - StringCopy = BlMmAllocateHeap(StringLength); - if (StringCopy) - { - /* NULL-terminate it */ - RtlCopyMemory(StringCopy, - String, - StringLength - sizeof(UNICODE_NULL)); - StringCopy[StringLength] = UNICODE_NULL; - *Value = StringCopy; - Status = STATUS_SUCCESS; - } - else - { - /* No memory, fail */ - Status = STATUS_NO_MEMORY; - } - } - } - } - - /* All done */ - return Status; -} - -NTSTATUS -BlGetBootOptionGuid ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PGUID Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - PGUID Guid; - BcdElementType ElementType; - - /* Make sure this is a BCD_TYPE_OBJECT */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_OBJECT) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (!Option) - { - /* Set failure if no data exists */ - Status = STATUS_NOT_FOUND; - } - else - { - /* Copy the GUID */ - Guid = (PGUID)((ULONG_PTR)Option + Option->DataOffset); - RtlCopyMemory(Value, Guid, Option->DataSize); - Status = STATUS_SUCCESS; - } - - /* All good */ - return Status; -} - -NTSTATUS -BlGetBootOptionGuidList ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PGUID *Value, - _In_ PULONG Count - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - PGUID GuidCopy, Guid; - ULONG GuidCount; - BcdElementType ElementType; - - /* Make sure this is a BCD_TYPE_OBJECT_LIST */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_OBJECT_LIST) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (!Option) - { - /* Set failure if no data exists */ - Status = STATUS_NOT_FOUND; - } - else - { - /* Get the GUIDs and allocate a copy for them */ - Guid = (PGUID)((ULONG_PTR)Option + Option->DataOffset); - GuidCopy = BlMmAllocateHeap(Option->DataSize); - if (GuidCopy) - { - /* Copy the GUIDs */ - RtlCopyMemory(GuidCopy, Guid, Option->DataSize); - - /* Return the number of GUIDs and the start of the array */ - GuidCount = Option->DataSize / sizeof(GUID); - *Value = GuidCopy; - *Count = GuidCount; - Status = STATUS_SUCCESS; - } - else - { - /* No memory for the copy */ - Status = STATUS_NO_MEMORY; - } - } - - /* All good */ - return Status; -} - -NTSTATUS -BlGetBootOptionDevice ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PBL_DEVICE_DESCRIPTOR* Value, - _In_opt_ PBL_BCD_OPTION* ExtraOptions - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option, ListData, ListCopy, SecureListData; - PBCD_DEVICE_OPTION BcdDevice; - ULONG DeviceSize, ListOffset, ListSize; - PBL_DEVICE_DESCRIPTOR DeviceDescriptor, SecureDescriptor; - //PGUID AppIdentifier; - BcdElementType ElementType; - - /* Make sure this is a BCD_TYPE_DEVICE */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_DEVICE) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (!Option) - { - /* Set failure if no data exists */ - Status = STATUS_NOT_FOUND; - } - else - { - /* Otherwise, read the size of the BCD device encoded */ - BcdDevice = (PBCD_DEVICE_OPTION)((ULONG_PTR)Option + Option->DataOffset); - DeviceSize = BcdDevice->DeviceDescriptor.Size; - - /* Allocate a buffer to copy it into */ - DeviceDescriptor = BlMmAllocateHeap(DeviceSize); - if (!DeviceDescriptor) - { - return STATUS_NO_MEMORY; - } - - /* Copy it into that buffer */ - RtlCopyMemory(DeviceDescriptor, &BcdDevice->DeviceDescriptor, DeviceSize); - Status = STATUS_SUCCESS; - } - - /* Check if extra options were requested */ - if (ExtraOptions) - { - /* See where they are */ - ListOffset = Option->ListOffset; - if (ListOffset) - { - /* See how big they are */ - ListData = (PBL_BCD_OPTION)((ULONG_PTR)Option + ListOffset); - ListSize = BlGetBootOptionListSize(ListData); - - /* Allocate a buffer to hold them into */ - ListCopy = BlMmAllocateHeap(ListSize); - if (!ListCopy) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Copy them in there */ - RtlCopyMemory(ListCopy, ListData, ListSize); - } - } - -#ifdef _SECURE_BOOT_ - /* Filter out SecureBoot Options */ - AppIdentifier = BlGetApplicationIdentifier(); - if (BlpBootOptionCallbacks) - { - DeviceCallback = BlpBootOptionCallbacks->Device; - if (DeviceCallback) - { - Status = DeviceCallback(BlpBootOptionCallbackCookie, - Status, - 0, - AppIdentifier, - Type, - &SecureDescriptor, - PtrOptionData); - } - } -#else - /* No secure boot, so the secure descriptors are the standard ones */ - SecureDescriptor = DeviceDescriptor; - SecureListData = ListCopy; -#endif - - /* Check if the data was read correctly */ - if (NT_SUCCESS(Status)) - { - /* Check if we had a new descriptor after filtering */ - if (SecureDescriptor != DeviceDescriptor) - { - /* Yep -- if we had an old one, free it */ - if (DeviceDescriptor) - { - BlMmFreeHeap(DeviceDescriptor); - } - } - - /* Check if we had a new list after filtering */ - if (SecureListData != ListCopy) - { - /* Yep -- if we had an old list, free it */ - if (ListCopy) - { - BlMmFreeHeap(ListCopy); - } - } - - /* Finally, check if the caller wanted extra options */ - if (ExtraOptions) - { - /* Yep -- so pass the caller our copy */ - *ExtraOptions = ListCopy; - ListCopy = NULL; - } - - /* Caller always wants data back, so pass them our copy */ - *Value = DeviceDescriptor; - DeviceDescriptor = NULL; - } - -Quickie: - /* On the failure path, if these buffers are active, we should free them */ - if (ListCopy) - { - BlMmFreeHeap(ListCopy); - } - if (DeviceDescriptor) - { - BlMmFreeHeap(DeviceDescriptor); - } - - /* All done */ - return Status; -} - -NTSTATUS -BlGetBootOptionInteger ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PULONGLONG Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - //PGUID AppIdentifier; - BcdElementType ElementType; - - /* Make sure this is a BCD_TYPE_INTEGER */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_INTEGER) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (Option) - { - *Value = *(PULONGLONG)((ULONG_PTR)Option + Option->DataOffset); - } - -#ifdef _SECURE_BOOT_ - /* Filter out SecureBoot Options */ - AppIdentifier = BlGetApplicationIdentifier(); - Status = BlpBootOptionCallbackULongLong(AppIdentifier, Type, Value); -#else - /* Option found */ - Status = Option ? STATUS_SUCCESS : STATUS_NOT_FOUND; -#endif - return Status; -} - -NTSTATUS -BlGetBootOptionBoolean ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PBOOLEAN Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - //PGUID AppIdentifier; - BcdElementType ElementType; - - /* Make sure this is a BCD_TYPE_BOOLEAN */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_BOOLEAN) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (Option) - { - *Value = *(PBOOLEAN)((ULONG_PTR)Option + Option->DataOffset); - } - -#ifdef _SECURE_BOOT_ - /* Filter out SecureBoot Options */ - AppIdentifier = BlGetApplicationIdentifier(); - Status = BlpBootOptionCallbackBoolean(AppIdentifier, Type, Value); -#else - /* Option found */ - Status = Option ? STATUS_SUCCESS : STATUS_NOT_FOUND; -#endif - return Status; -} - -NTSTATUS -BlpGetBootOptionIntegerList ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type, - _Out_ PULONGLONG* Value, - _Out_ PULONGLONG Count, - _In_ BOOLEAN NoCopy - ) -{ - PBL_BCD_OPTION Option; - BcdElementType ElementType; - PULONGLONG ValueCopy; - - /* Make sure this is a BCD_TYPE_INTEGER_LIST */ - ElementType.PackedValue = Type; - if (ElementType.Format != BCD_TYPE_INTEGER_LIST) - { - return STATUS_INVALID_PARAMETER; - } - - /* Return the data */ - Option = MiscGetBootOption(List, Type); - if (!Option) - { - return STATUS_NOT_FOUND; - } - - /* Check if a copy should be made of it */ - if (NoCopy) - { - /* Nope, return the raw value */ - *Value = (PULONGLONG)((ULONG_PTR)Option + Option->DataOffset); - } - else - { - /* Allocate a buffer for the copy */ - ValueCopy = BlMmAllocateHeap(Option->DataSize); - if (!ValueCopy) - { - return STATUS_NO_MEMORY; - } - - /* Copy the data in */ - RtlCopyMemory(ValueCopy, - (PVOID)((ULONG_PTR)Option + Option->DataOffset), - Option->DataSize); - - /* Return our copy */ - *Value = ValueCopy; - } - - /* Return count and success */ - *Count = Option->DataSize / sizeof(ULONGLONG); - return STATUS_SUCCESS; -} - -NTSTATUS -BlCopyBootOptions ( - _In_ PBL_BCD_OPTION OptionList, - _Out_ PBL_BCD_OPTION *CopiedOptions - ) -{ - NTSTATUS Status; - ULONG OptionSize; - PBL_BCD_OPTION Options; - - /* Assume no options */ - Status = STATUS_SUCCESS; - *CopiedOptions = NULL; - - /* Get the size of the list and allocate a copy for it */ - OptionSize = BlGetBootOptionListSize(OptionList); - Options = BlMmAllocateHeap(OptionSize); - if (!Options) - { - return STATUS_NO_MEMORY; - } - - /* Make the copy and return it to the caller */ - RtlCopyMemory(Options, OptionList, OptionSize); - *CopiedOptions = Options; - return Status; -} - -NTSTATUS -BlAppendBootOptionBoolean ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ BOOLEAN Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - - /* Allocate space for the entry -- remember BOOLEANs are USHORTs in BCD */ - Option = BlMmAllocateHeap(sizeof(*Option) + sizeof(USHORT)); - if (!Option) - { - return STATUS_NO_MEMORY; - } - - /* Initialize it and set the boolean to TRUE */ - RtlZeroMemory(Option, sizeof(*Option) + sizeof(USHORT)); - Option->DataSize = sizeof(USHORT); - Option->Type = OptionId; - Option->DataOffset = sizeof(*Option); - *(PBOOLEAN)(Option + 1) = Value; - - /* Append it */ - Status = BlAppendBootOptions(AppEntry, Option); - - /* We're all done, free our initial option */ - BlMmFreeHeap(Option); - return Status; -} - -NTSTATUS -BlAppendBootOptionInteger ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ ULONGLONG Value - ) -{ - NTSTATUS Status; - PBL_BCD_OPTION Option; - - /* Allocate space for the entry */ - Option = BlMmAllocateHeap(sizeof(*Option) + sizeof(Value)); - if (!Option) - { - return STATUS_NO_MEMORY; - } - - /* Initialize it and set the integer to the given value */ - RtlZeroMemory(Option, sizeof(*Option) + sizeof(Value)); - Option->DataSize = sizeof(Value); - Option->Type = OptionId; - Option->DataOffset = sizeof(*Option); - *(PULONGLONG)(Option + 1) = Value; - - /* Append it */ - Status = BlAppendBootOptions(AppEntry, Option); - - /* We're all done, free our initial option */ - BlMmFreeHeap(Option); - return Status; -} - -NTSTATUS -BlAppendBootOptionString ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ ULONG OptionId, - _In_ PWCHAR OptionString - ) -{ - NTSTATUS Status; - ULONG StringSize; - PBL_BCD_OPTION Option; - - /* Get the length in bytes */ - Status = RtlULongLongToULong(wcslen(OptionString) * sizeof(WCHAR), - &StringSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Add a NULL-terminator */ - Status = RtlULongAdd(StringSize, sizeof(UNICODE_NULL), &StringSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Allocate space for the entry */ - Option = BlMmAllocateHeap(sizeof(*Option) + StringSize); - if (!Option) - { - return STATUS_NO_MEMORY; - } - - /* Initialize it and copy the string value */ - RtlZeroMemory(Option, sizeof(*Option) + StringSize); - Option->DataSize = StringSize; - Option->Type = OptionId; - Option->DataOffset = sizeof(*Option); - wcsncpy((PWCHAR)Option + 1, OptionString, StringSize / sizeof(WCHAR)); - - /* Append it */ - Status = BlAppendBootOptions(AppEntry, Option); - - /* We're all done, free our initial option */ - BlMmFreeHeap(Option); - return Status; -} - -NTSTATUS -BlAppendBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ PBL_BCD_OPTION Options - ) -{ - ULONG OptionsSize, CurrentSize; - PBL_BCD_OPTION NewOptions, CurrentOptions, NextOption; - NTSTATUS Status; - ULONG CurrentOffset; - - /* Get the current options */ - CurrentOptions = AppEntry->BcdData; - - /* Calculate the size of the current, and the appended options */ - CurrentSize = BlGetBootOptionListSize(CurrentOptions); - OptionsSize = BlGetBootOptionListSize(Options); - - /* Allocate a buffer for the concatenated (new) options */ - NewOptions = BlMmAllocateHeap(CurrentSize + OptionsSize); - if (!NewOptions) - { - return STATUS_NO_MEMORY; - } - - /* Copy the old options, and the ones to be added */ - RtlCopyMemory(NewOptions, CurrentOptions, CurrentSize); - RtlCopyMemory((PVOID)((ULONG_PTR)NewOptions + CurrentSize), - Options, - OptionsSize); - - /* We made it! */ - Status = STATUS_SUCCESS; - - /* Scan through to the last option in the list */ - CurrentOffset = 0; - do - { - NextOption = (PBL_BCD_OPTION)((ULONG_PTR)NewOptions + CurrentOffset); - CurrentOffset = NextOption->NextEntryOffset; - } while (CurrentOffset); - - /* Every other option now has to have its offset adjusted */ - do - { - NextOption->NextEntryOffset += CurrentSize; - NextOption = (PBL_BCD_OPTION)((ULONG_PTR)NewOptions + NextOption->NextEntryOffset); - } while (NextOption->NextEntryOffset); - - /* If we already had internal options, free them */ - if (AppEntry->Flags & BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL) - { - BlMmFreeHeap(AppEntry->BcdData); - } - - /* Write the new pointer */ - AppEntry->BcdData = NewOptions; - - /* Options are now internal, not external */ - AppEntry->Flags &= ~BL_APPLICATION_ENTRY_BCD_OPTIONS_EXTERNAL; - AppEntry->Flags |= BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL; - return Status; -} - -VOID -BlRemoveBootOption ( - _In_ PBL_BCD_OPTION List, - _In_ ULONG Type - ) -{ - PBL_BCD_OPTION Option; - - /* Keep going until the option is gone */ - while (1) - { - /* Get the BCD option */ - Option = MiscGetBootOption(List, Type); - if (!Option) - { - break; - } - - /* Pretend it's empty */ - Option->Empty = TRUE; - } -} - -NTSTATUS -BlReplaceBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, - _In_ PBL_BCD_OPTION OldOptions - ) -{ - NTSTATUS Status; - ULONG OptionSize; - PBL_BCD_OPTION NewOptions; - - /* Make sure there's something to replace with */ - if (!OldOptions) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if we already had allocated internal options */ - if (AppEntry->Flags & BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL) - { - /* Free them */ - BlMmFreeHeap(AppEntry->BcdData); - } - - /* Reset option flags */ - AppEntry->Flags &= ~(BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL | - BL_APPLICATION_ENTRY_BCD_OPTIONS_EXTERNAL); - - /* Reset the options and set success for now */ - Status = STATUS_SUCCESS; - AppEntry->BcdData = NULL; - - /* Get the size of the new list of options */ - OptionSize = BlGetBootOptionListSize(OldOptions); - - /* Allocate a copy of the new list */ - NewOptions = BlMmAllocateHeap(OptionSize); - if (!NewOptions) - { - return STATUS_NO_MEMORY; - } - - /* Copy it in */ - RtlCopyMemory(NewOptions, OldOptions, OptionSize); - - /* Set it as the new set of options and return */ - AppEntry->Flags |= BL_APPLICATION_ENTRY_BCD_OPTIONS_INTERNAL; - AppEntry->BcdData = NewOptions; - return Status; -} - diff --git a/boot/environ/lib/misc/bootreg.c b/boot/environ/lib/misc/bootreg.c deleted file mode 100644 index fa709678e11..00000000000 --- a/boot/environ/lib/misc/bootreg.c +++ /dev/null @@ -1,953 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/bootreg.c - * PURPOSE: Boot Library Boot Registry Wrapper for CMLIB - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include - -/* DEFINITIONS ***************************************************************/ - -#define BI_FLUSH_HIVE 0x01 -#define BI_HIVE_WRITEABLE 0x02 - -/* DATA STRUCTURES ***********************************************************/ - -typedef struct _BI_KEY_HIVE -{ - PHBASE_BLOCK BaseBlock; - ULONG HiveSize; - PBL_FILE_PATH_DESCRIPTOR FilePath; - CMHIVE Hive; - LONG ReferenceCount; - ULONG Flags; - PCM_KEY_NODE RootNode; -} BI_KEY_HIVE, *PBI_KEY_HIVE; - -typedef struct _BI_KEY_OBJECT -{ - PBI_KEY_HIVE KeyHive; - PCM_KEY_NODE KeyNode; - HCELL_INDEX KeyCell; - PWCHAR KeyName; -} BI_KEY_OBJECT, *PBI_KEY_OBJECT; - -/* GLOBALS *******************************************************************/ - -BOOLEAN BiHiveHashLibraryInitialized; -ULONGLONG HvSymcryptSeed; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -HvIsInPlaceBaseBlockValid ( - _In_ PHBASE_BLOCK BaseBlock - ) -{ - ULONG HiveLength, HeaderSum; - BOOLEAN Valid; - - /* Assume failure */ - Valid = FALSE; - - /* Check for incorrect signature, type, version, or format */ - if ((BaseBlock->Signature == 'fger') && - (BaseBlock->Type == 0) && - (BaseBlock->Major <= 1) && - (BaseBlock->Minor <= 5) && - (BaseBlock->Minor >= 3) && - (BaseBlock->Format == 1)) - { - /* Check for invalid hive size */ - HiveLength = BaseBlock->Length; - if (HiveLength) - { - /* Check for misaligned or too large hive size */ - if (!(HiveLength & 0xFFF) && HiveLength <= 0x7FFFE000) - { - /* Check for invalid header checksum */ - HeaderSum = HvpHiveHeaderChecksum(BaseBlock); - if (HeaderSum == BaseBlock->CheckSum) - { - /* All good */ - Valid = TRUE; - } - } - } - } - - /* Return validity */ - return Valid; -} - -PVOID -NTAPI -CmpAllocate ( - _In_ SIZE_T Size, - _In_ BOOLEAN Paged, - _In_ ULONG Tag - ) -{ - UNREFERENCED_PARAMETER(Paged); - UNREFERENCED_PARAMETER(Tag); - - /* Call the heap allocator */ - return BlMmAllocateHeap(Size); -} - -VOID -NTAPI -CmpFree ( - _In_ PVOID Ptr, - _In_ ULONG Quota - ) -{ - UNREFERENCED_PARAMETER(Quota); - - /* Call the heap allocator */ - BlMmFreeHeap(Ptr); -} - -VOID -BiDereferenceHive ( - _In_ HANDLE KeyHandle - ) -{ - PBI_KEY_OBJECT KeyObject; - - /* Get the key object */ - KeyObject = (PBI_KEY_OBJECT)KeyHandle; - - /* Drop a reference on the parent hive */ - --KeyObject->KeyHive->ReferenceCount; -} - -VOID -BiFlushHive ( - _In_ HANDLE KeyHandle - ) -{ - /* Not yet implemented */ - EfiPrintf(L"NO reg flush\r\n"); - return; -} - -VOID -BiCloseKey ( - _In_ HANDLE KeyHandle - ) -{ - PBI_KEY_HIVE KeyHive; - PBI_KEY_OBJECT KeyObject; - - /* Get the key object and hive */ - KeyObject = (PBI_KEY_OBJECT)KeyHandle; - KeyHive = KeyObject->KeyHive; - - /* Check if we have a hive, or name, or key node */ - if ((KeyHive) || (KeyObject->KeyNode) || (KeyObject->KeyName)) - { - /* Drop a reference, see if it's the last one */ - BiDereferenceHive(KeyHandle); - if (!KeyHive->ReferenceCount) - { - /* Check if we should flush it */ - if (KeyHive->Flags & BI_FLUSH_HIVE) - { - BiFlushHive(KeyHandle); - } - - /* Unmap the hive */ - MmPapFreePages(KeyHive->BaseBlock, BL_MM_INCLUDE_MAPPED_ALLOCATED); - - /* Free the hive and hive path */ - BlMmFreeHeap(KeyHive->FilePath); - BlMmFreeHeap(KeyHive); - } - - /* Check if a key name is present */ - if (KeyObject->KeyName) - { - /* Free it */ - BlMmFreeHeap(KeyObject->KeyName); - } - } - - /* Free the object */ - BlMmFreeHeap(KeyObject); -} - -NTSTATUS -BiOpenKey( - _In_ HANDLE ParentHandle, - _In_ PWCHAR KeyName, - _Out_ PHANDLE Handle - ) -{ - PBI_KEY_OBJECT ParentKey, NewKey; - PBI_KEY_HIVE ParentHive; - NTSTATUS Status; - SIZE_T NameLength, SubNameLength, NameBytes; - PWCHAR NameStart, NameBuffer; - UNICODE_STRING KeyString; - HCELL_INDEX KeyCell; - PHHIVE Hive; - PCM_KEY_NODE ParentNode; - - /* Convert from a handle to our key object */ - ParentKey = (PBI_KEY_OBJECT)ParentHandle; - - /* Extract the hive and node information */ - ParentHive = ParentKey->KeyHive; - ParentNode = ParentKey->KeyNode; - Hive = &ParentKey->KeyHive->Hive.Hive; - - /* Initialize variables */ - KeyCell = HCELL_NIL; - Status = STATUS_SUCCESS; - NameBuffer = NULL; - - /* Loop as long as there's still portions of the key name in play */ - NameLength = wcslen(KeyName); - while (NameLength) - { - /* Find the first path separator */ - NameStart = wcschr(KeyName, OBJ_NAME_PATH_SEPARATOR); - if (NameStart) - { - /* Look only at the key before the separator */ - SubNameLength = NameStart - KeyName; - ++NameStart; - } - else - { - /* No path separator, this is the final leaf key */ - SubNameLength = NameLength; - } - - /* Free the name buffer from the previous pass if needed */ - if (NameBuffer) - { - BlMmFreeHeap(NameBuffer); - } - - /* Allocate a buffer to hold the name of this specific subkey only */ - NameBytes = SubNameLength * sizeof(WCHAR); - NameBuffer = BlMmAllocateHeap(NameBytes + sizeof(UNICODE_NULL)); - if (!NameBuffer) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Copy and null-terminate the name of the subkey */ - RtlCopyMemory(NameBuffer, KeyName, NameBytes); - NameBuffer[SubNameLength] = UNICODE_NULL; - - /* Convert it into a UNICODE_STRING and try to find it */ - RtlInitUnicodeString(&KeyString, NameBuffer); - KeyCell = CmpFindSubKeyByName(Hive, ParentNode, &KeyString); - if (KeyCell == HCELL_NIL) - { - Status = STATUS_OBJECT_NAME_NOT_FOUND; - goto Quickie; - } - - /* We found it -- get the key node out of it */ - ParentNode = (PCM_KEY_NODE)HvGetCell(Hive, KeyCell); - if (!ParentNode) - { - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Update the key name to the next remaining path element */ - KeyName = NameStart; - if (NameStart) - { - /* Update the length to the remainder of the path */ - NameLength += -1 - SubNameLength; - } - else - { - /* There's nothing left, this was the leaf key */ - NameLength = 0; - } - } - - /* Allocate a key object */ - NewKey = BlMmAllocateHeap(sizeof(*NewKey)); - if (!NewKey) - { - /* Bail out if we had no memory for it */ - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Fill out the key object data */ - NewKey->KeyNode = ParentNode; - NewKey->KeyHive = ParentHive; - NewKey->KeyName = NameBuffer; - NewKey->KeyCell = KeyCell; - - /* Add a reference to the hive */ - ++ParentHive->ReferenceCount; - - /* Return the object back to the caller */ - *Handle = NewKey; - -Quickie: - /* If we had a name buffer, free it */ - if (NameBuffer) - { - BlMmFreeHeap(NameBuffer); - } - - /* Return status of the open operation */ - return Status; -} - -NTSTATUS -BiInitializeAndValidateHive ( - _In_ PBI_KEY_HIVE Hive - ) -{ - ULONG HiveSize; - CM_CHECK_REGISTRY_STATUS CmStatusCode; - NTSTATUS Status; - - /* Make sure the hive is at least the size of a base block */ - if (Hive->HiveSize < sizeof(HBASE_BLOCK)) - { - return STATUS_REGISTRY_CORRUPT; - } - - /* Make sure that the base block accurately describes the size of the hive */ - HiveSize = Hive->BaseBlock->Length + sizeof(HBASE_BLOCK); - if ((HiveSize < sizeof(HBASE_BLOCK)) || (HiveSize > Hive->HiveSize)) - { - return STATUS_REGISTRY_CORRUPT; - } - - /* Initialize a flat memory hive */ - RtlZeroMemory(&Hive->Hive, sizeof(Hive->Hive)); - Status = HvInitialize(&Hive->Hive.Hive, - HINIT_FLAT, - 0, - 0, - Hive->BaseBlock, - CmpAllocate, - CmpFree, - NULL, - NULL, - NULL, - NULL, - 0, - NULL); - if (NT_SUCCESS(Status)) - { - /* Cleanup volatile/old data */ - CmStatusCode = CmCheckRegistry(Hive->Hive, CM_CHECK_REGISTRY_BOOTLOADER_PURGE_VOLATILES | CM_CHECK_REGISTRY_VALIDATE_HIVE); - if (!CM_CHECK_REGISTRY_SUCCESS(CmStatusCode)) - { - return STATUS_REGISTRY_CORRUPT; - } - - Status = STATUS_SUCCESS; - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -BiLoadHive ( - _In_ PBL_FILE_PATH_DESCRIPTOR FilePath, - _Out_ PHANDLE HiveHandle - ) -{ - ULONG DeviceId; - PHBASE_BLOCK BaseBlock, NewBaseBlock; - PBI_KEY_OBJECT KeyObject; - PBI_KEY_HIVE BcdHive; - PBL_DEVICE_DESCRIPTOR BcdDevice; - ULONG PathLength, DeviceLength, HiveSize, HiveLength, NewHiveSize; - PWCHAR HiveName, LogName; - BOOLEAN HaveWriteAccess; - NTSTATUS Status; - PVOID LogData; - PHHIVE Hive; - UNICODE_STRING KeyString; - PCM_KEY_NODE RootNode; - HCELL_INDEX CellIndex; - - /* Initialize variables */ - DeviceId = -1; - BaseBlock = NULL; - BcdHive = NULL; - KeyObject = NULL; - LogData = NULL; - LogName = NULL; - - /* Initialize the crypto seed */ - if (!BiHiveHashLibraryInitialized) - { - HvSymcryptSeed = 0x82EF4D887A4E55C5; - BiHiveHashLibraryInitialized = TRUE; - } - - /* Extract and validate the input path */ - BcdDevice = (PBL_DEVICE_DESCRIPTOR)&FilePath->Path; - PathLength = FilePath->Length; - DeviceLength = BcdDevice->Size; - HiveName = (PWCHAR)((ULONG_PTR)BcdDevice + BcdDevice->Size); - if (PathLength <= DeviceLength) - { - /* Doesn't make sense, bail out */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Attempt to open the underlying device for RW access */ - HaveWriteAccess = TRUE; - Status = BlpDeviceOpen(BcdDevice, - BL_DEVICE_READ_ACCESS | BL_DEVICE_WRITE_ACCESS, - 0, - &DeviceId); - if (!NT_SUCCESS(Status)) - { - /* Try for RO access instead */ - HaveWriteAccess = FALSE; - Status = BlpDeviceOpen(BcdDevice, BL_DEVICE_READ_ACCESS, 0, &DeviceId); - if (!NT_SUCCESS(Status)) - { - /* No access at all -- bail out */ - goto Quickie; - } - } - - /* Now try to load the hive on disk */ - Status = BlImgLoadImageWithProgress2(DeviceId, - BlLoaderRegistry, - HiveName, - (PVOID*)&BaseBlock, - &HiveSize, - 0, - FALSE, - NULL, - NULL); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Hive read failure: % lx\r\n", Status); - goto Quickie; - } - - /* Allocate a hive structure */ - BcdHive = BlMmAllocateHeap(sizeof(*BcdHive)); - if (!BcdHive) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Initialize it */ - RtlZeroMemory(BcdHive, sizeof(*BcdHive)); - BcdHive->BaseBlock = BaseBlock; - BcdHive->HiveSize = HiveSize; - if (HaveWriteAccess) - { - BcdHive->Flags |= BI_HIVE_WRITEABLE; - } - - /* Make sure the hive was at least one bin long */ - if (HiveSize < sizeof(*BaseBlock)) - { - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Make sure the hive contents are at least one bin long */ - HiveLength = BaseBlock->Length; - if (BaseBlock->Length < sizeof(*BaseBlock)) - { - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Validate the initial bin (the base block) */ - if (!HvIsInPlaceBaseBlockValid(BaseBlock)) - { - EfiPrintf(L"Recovery not implemented\r\n"); - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Check if there's log recovery that needs to happen */ - if (BaseBlock->Sequence1 != BaseBlock->Sequence2) - { - EfiPrintf(L"Log fix not implemented: %lx %lx\r\n"); - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* - * Check if the whole hive doesn't fit in the buffer. - * Note: HiveLength does not include the size of the baseblock itself - */ - if (HiveSize < (HiveLength + sizeof(*BaseBlock))) - { - EfiPrintf(L"Need bigger hive buffer path\r\n"); - - /* Allocate a slightly bigger buffer */ - NewHiveSize = HiveLength + sizeof(*BaseBlock); - Status = MmPapAllocatePagesInRange((PVOID*)&NewBaseBlock, - BlLoaderRegistry, - NewHiveSize >> PAGE_SHIFT, - 0, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Copy the current data in there */ - RtlCopyMemory(NewBaseBlock, BaseBlock, HiveSize); - - /* Free the old data */ - MmPapFreePages(BaseBlock, BL_MM_INCLUDE_MAPPED_ALLOCATED); - - /* Update our pointers */ - BaseBlock = NewBaseBlock; - HiveSize = NewHiveSize; - BcdHive->BaseBlock = BaseBlock; - BcdHive->HiveSize = HiveSize; - } - - /* Check if any log stuff needs to happen */ - if (LogData) - { - EfiPrintf(L"Log fix not implemented: %lx %lx\r\n"); - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Call Hv to setup the hive library */ - Status = BiInitializeAndValidateHive(BcdHive); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Now get the root node */ - Hive = &BcdHive->Hive.Hive; - RootNode = (PCM_KEY_NODE)HvGetCell(Hive, Hive->BaseBlock->RootCell); - if (!RootNode) - { - Status = STATUS_OBJECT_NAME_NOT_FOUND; - goto Quickie; - } - - /* Find the Objects subkey under it to see if it's a real BCD hive */ - RtlInitUnicodeString(&KeyString, L"Objects"); - CellIndex = CmpFindSubKeyByName(Hive, RootNode, &KeyString); - if (CellIndex == HCELL_NIL) - { - EfiPrintf(L"No OBJECTS subkey found!\r\n"); - Status = STATUS_OBJECT_NAME_NOT_FOUND; - goto Quickie; - } - - /* This is a valid BCD hive, store its root node here */ - BcdHive->RootNode = RootNode; - - /* Allocate a copy of the file path */ - BcdHive->FilePath = BlMmAllocateHeap(FilePath->Length); - if (!BcdHive->FilePath) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Make a copy of it */ - RtlCopyMemory(BcdHive->FilePath, FilePath, FilePath->Length); - - /* Create a key object to describe the rot */ - KeyObject = BlMmAllocateHeap(sizeof(*KeyObject)); - if (!KeyObject) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Fill out the details */ - KeyObject->KeyNode = RootNode; - KeyObject->KeyHive = BcdHive; - KeyObject->KeyName = NULL; - KeyObject->KeyCell = Hive->BaseBlock->RootCell; - - /* One reference for the key object, plus one lifetime reference */ - BcdHive->ReferenceCount = 2; - - /* This is the hive handle */ - *HiveHandle = KeyObject; - - /* We're all good */ - Status = STATUS_SUCCESS; - -Quickie: - /* If we had a log name, free it */ - if (LogName) - { - BlMmFreeHeap(LogName); - } - - /* If we had logging data, free it */ - if (LogData) - { - MmPapFreePages(LogData, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - - /* Check if this is the failure path */ - if (!NT_SUCCESS(Status)) - { - /* If we mapped the hive, free it */ - if (BaseBlock) - { - MmPapFreePages(BaseBlock, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - - /* If we opened the device, close it */ - if (DeviceId != -1) - { - BlDeviceClose(DeviceId); - } - - /* Did we create a hive object? */ - if (BcdHive) - { - /* Free the file path if we made a copy of it */ - if (BcdHive->FilePath) - { - BlMmFreeHeap(BcdHive->FilePath); - } - - /* Free the hive itself */ - BlMmFreeHeap(BcdHive); - } - - /* Finally, free the root key object if we created one */ - if (KeyObject) - { - BlMmFreeHeap(KeyObject); - } - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -BiGetRegistryValue ( - _In_ HANDLE KeyHandle, - _In_ PWCHAR ValueName, - _In_ ULONG Type, - _Out_ PVOID* Buffer, - _Out_ PULONG ValueLength - ) -{ - PCM_KEY_NODE KeyNode; - PHHIVE KeyHive; - UNICODE_STRING ValueString; - PBI_KEY_OBJECT KeyObject; - PCM_KEY_VALUE KeyValue; - PVOID ValueCopy; - ULONG Size; - HCELL_INDEX CellIndex; - PCELL_DATA ValueData; - - /* Get the key object, node,and hive */ - KeyObject = (PBI_KEY_OBJECT)KeyHandle; - KeyNode = KeyObject->KeyNode; - KeyHive = &KeyObject->KeyHive->Hive.Hive; - - /* Find the value cell index in the list of values */ - RtlInitUnicodeString(&ValueString, ValueName); - CmpFindNameInList(KeyHive, - &KeyNode->ValueList, - &ValueString, - NULL, - &CellIndex); - if (CellIndex == HCELL_NIL) - { - return STATUS_OBJECT_NAME_NOT_FOUND; - } - - /* Get the cell data for it */ - KeyValue = (PCM_KEY_VALUE)HvGetCell(KeyHive, CellIndex); - if (!KeyValue) - { - return STATUS_REGISTRY_CORRUPT; - } - - /* Make sure the type matches */ - if (KeyValue->Type != Type) - { - return STATUS_OBJECT_TYPE_MISMATCH; - } - - /* Now get the data cell */ - ValueData = CmpValueToData(KeyHive, KeyValue, &Size); - - /* Make a copy of it */ - ValueCopy = BlMmAllocateHeap(Size); - if (!ValueCopy) - { - return STATUS_NO_MEMORY; - } - - /* Copy it in the buffer, and return it and its size */ - RtlCopyMemory(ValueCopy, ValueData, Size); - *Buffer = ValueCopy; - *ValueLength = Size; - return STATUS_SUCCESS; -} - -NTSTATUS -BiEnumerateSubKeys ( - _In_ HANDLE KeyHandle, - _Out_ PWCHAR** SubKeyList, - _Out_ PULONG SubKeyCount - ) -{ - PCM_KEY_NODE KeyNode, Node; - PBI_KEY_OBJECT KeyObject; - ULONG KeyCount; - ULONG NameLength, NewTotalNameLength, FinalLength, TotalNameLength; - PHHIVE Hive; - PWCHAR KeyName, NameEnd; - HCELL_INDEX CellIndex; - PWCHAR* SubKeys; - NTSTATUS Status; - ULONG i; - - /* Get the key object, node, and hive */ - KeyObject = (PBI_KEY_OBJECT)KeyHandle; - KeyNode = KeyObject->KeyNode; - Hive = &KeyObject->KeyHive->Hive.Hive; - - /* Assume it's empty */ - *SubKeyList = 0; - *SubKeyCount = 0; - - /* Initialize locals */ - KeyCount = 0; - SubKeys = 0; - TotalNameLength = 0; - - /* Find the first subkey cell index */ - CellIndex = CmpFindSubKeyByNumber(Hive, KeyNode, KeyCount); - while (CellIndex != HCELL_NIL) - { - /* Move to the next one */ - KeyCount++; - - /* Get the cell data for it */ - Node = (PCM_KEY_NODE)HvGetCell(Hive, CellIndex); - if (!Node) - { - return STATUS_REGISTRY_CORRUPT; - } - - /* Check if the value is compressed */ - if (Node->Flags & KEY_COMP_NAME) - { - /* Get the compressed name size */ - NameLength = CmpCompressedNameSize(Node->Name, Node->NameLength); - } - else - { - /* Get the real size */ - NameLength = Node->NameLength; - } - - /* Add up the new length, protecting against overflow */ - NewTotalNameLength = TotalNameLength + NameLength + sizeof(UNICODE_NULL); - if (NewTotalNameLength < TotalNameLength) - { - Status = STATUS_NAME_TOO_LONG; - goto Quickie; - } - - /* We're good, use the new length */ - TotalNameLength = NewTotalNameLength; - - /* Find the next subkey cell index */ - CellIndex = CmpFindSubKeyByNumber(Hive, KeyNode, KeyCount); - } - - /* Were there no keys? We're done, if so */ - if (!KeyCount) - { - return STATUS_SUCCESS; - } - - /* Safely compute the size of the array needed */ - Status = RtlULongLongToULong(sizeof(PWCHAR) * KeyCount, &FinalLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Safely add that to the name length */ - Status = RtlULongAdd(TotalNameLength, FinalLength, &FinalLength); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Allocate an array big enough for the names and pointers */ - SubKeys = BlMmAllocateHeap(FinalLength); - if (!SubKeys) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Go over each key again */ - NameEnd = (PWCHAR)&SubKeys[KeyCount]; - for (i = 0; i < KeyCount; i++) - { - /* Get the cell index for this subkey */ - CellIndex = CmpFindSubKeyByNumber(Hive, KeyNode, i); - if (CellIndex == HCELL_NIL) - { - break; - } - - /* Get the cell data for it */ - Node = (PCM_KEY_NODE)HvGetCell(Hive, CellIndex); - if (!Node) - { - Status = STATUS_REGISTRY_CORRUPT; - goto Quickie; - } - - /* Check if the value is compressed */ - KeyName = Node->Name; - if (Node->Flags & KEY_COMP_NAME) - { - /* Get the compressed name size */ - NameLength = CmpCompressedNameSize(KeyName, Node->NameLength); - CmpCopyCompressedName(NameEnd, NameLength, KeyName, Node->NameLength); - } - else - { - /* Get the real size */ - NameLength = Node->NameLength; - RtlCopyMemory(NameEnd, KeyName, NameLength); - } - - /* Move the name buffer to the next spot, and NULL-terminate */ - SubKeys[i] = NameEnd; - NameEnd += (NameLength / sizeof(WCHAR)); - *NameEnd = UNICODE_NULL; - - /* Keep going */ - NameEnd++; - } - - /* Check if the subkeys were empty */ - if (i == 0) - { - /* They disappeared in the middle of enumeration */ - Status = STATUS_OBJECT_NAME_NOT_FOUND; - goto Quickie; - } - - /* Return the count and the array of names */ - *SubKeyList = SubKeys; - *SubKeyCount = i; - SubKeys = NULL; - Status = STATUS_SUCCESS; - -Quickie: - /* On the failure path, free the subkeys if any exist */ - if (SubKeys) - { - BlMmFreeHeap(SubKeys); - } - - /* All done, return the result */ - return Status; -} - -NTSTATUS -BiDeleteKey ( - _In_ HANDLE KeyHandle - ) -{ - NTSTATUS Status; - PBI_KEY_OBJECT KeyObject; - PHHIVE Hive; - ULONG SubKeyCount, i; - PWCHAR* SubKeyList; - HANDLE SubKeyHandle; - - /* Get the key object and hive */ - KeyObject = (PBI_KEY_OBJECT)KeyHandle; - Hive = &KeyObject->KeyHive->Hive.Hive; - - /* Make sure the hive is writeable */ - if (!(KeyObject->KeyHive->Flags & BI_HIVE_WRITEABLE)) - { - return STATUS_MEDIA_WRITE_PROTECTED; - } - - /* Enumerate all of the subkeys */ - Status = BiEnumerateSubKeys(KeyHandle, &SubKeyList, &SubKeyCount); - if ((NT_SUCCESS(Status)) && (SubKeyCount > 0)) - { - /* Loop through each one */ - for (i = 0; i < SubKeyCount; i++) - { - /* Open a handle to it */ - Status = BiOpenKey(KeyHandle, SubKeyList[i], &SubKeyHandle); - if (NT_SUCCESS(Status)) - { - /* Recursively call us to delete it */ - Status = BiDeleteKey(SubKeyHandle); - if (Status != STATUS_SUCCESS) - { - /* Close the key on failure */ - BiCloseKey(SubKeyHandle); - } - } - } - } - - /* Check if we had a list of subkeys */ - if (SubKeyList) - { - /* Free it */ - BlMmFreeHeap(SubKeyList); - } - - /* Delete this key cell */ - Status = CmpFreeKeyByCell(Hive, KeyObject->KeyCell, TRUE); - if (NT_SUCCESS(Status)) - { - /* Mark the hive as requiring a flush */ - KeyObject->KeyHive->Flags |= BI_FLUSH_HIVE; - BiCloseKey(KeyHandle); - } - - /* All done */ - return Status; -} diff --git a/boot/environ/lib/misc/debug.c b/boot/environ/lib/misc/debug.c deleted file mode 100644 index 799d90be8dd..00000000000 --- a/boot/environ/lib/misc/debug.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/debug.c - * PURPOSE: Boot Library Debug Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -CHAR AnsiBuffer[1024]; -BOOLEAN BdDebuggerNotPresent; -BOOLEAN BdSubsystemInitialized; -BOOLEAN BdArchBlockDebuggerOperation; -BOOLEAN BlpStatusErrorInProgress; -PBL_STATUS_ERROR_HANDLER BlpStatusErrorHandler; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -BdDebuggerInitialized ( - VOID - ) -{ - /* Check if BD was initialized, and is currently usable */ - return BdSubsystemInitialized && !BdArchBlockDebuggerOperation; -} - -NTSTATUS -BlBdPullRemoteFile ( - _In_ PWCHAR FilePath, - _Out_ PVOID BaseAddress, - _Out_ PULONGLONG FileSize - ) -{ - /* Is the boot debugger enabled? */ - if (!BlBdDebuggerEnabled()) - { - /* Nothing to pull */ - return STATUS_DEBUGGER_INACTIVE; - } - - /* TODO */ - EfiPrintf(L"Todo\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -BOOLEAN -BlBdDebuggerEnabled ( - VOID - ) -{ - BOOLEAN Initialized, Enabled; - - /* Check if the debugger is initialized */ - Initialized = BdDebuggerInitialized(); - - /* Check if it's currently active */ - Enabled = FALSE; - if ((Initialized) && !(BdDebuggerNotPresent)) - { - /* Yep! */ - Enabled = TRUE; - } - - /* Return enabled state */ - return Enabled; -} - -VOID -BlStatusPrint ( - _In_ PCWCH Format, - ... - ) -{ - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - va_list va; - NTSTATUS Status; - - va_start(va, Format); - - /* Check if the boot debugger is enabled */ - if (BlBdDebuggerEnabled() -#if DBG - || TRUE -#endif - ) - { - /* Print the string out into a buffer */ - if (vswprintf(BlScratchBuffer, Format, va) > 0) - { -#if DBG - EfiPrintf(BlScratchBuffer); - EfiPrintf(L"\r\n"); -#endif - /* Make it a UNICODE_STRING */ - RtlInitUnicodeString(&UnicodeString, BlScratchBuffer); - - /* Then convert it into an ANSI_STRING */ - AnsiString.Length = 0; - AnsiString.MaximumLength = sizeof(AnsiBuffer); - AnsiString.Buffer = AnsiBuffer; - Status = RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE); - if (NT_SUCCESS(Status)) - { - /* Print it out to the debugger if that worked */ - DbgPrint(AnsiString.Buffer); - } - } - } - - va_end(va); -} - -VOID -BlStatusError ( - _In_ ULONG ErrorCode, - _In_ ULONG Parameter1, - _In_ ULONG_PTR Parameter2, - _In_ ULONG_PTR Parameter3, - _In_ ULONG_PTR Parameter4 - ) -{ - NTSTATUS Status; - - /* Is this a non-boot error? */ - if (ErrorCode != 1) - { - /* Is one already ongoing? */ - if (!BlpStatusErrorInProgress) - { - /* Do we have a custom error handler registered? */ - if (BlpStatusErrorHandler) - { - /* Call it, making sure to avoid recursion */ - BlpStatusErrorInProgress = TRUE; - Status = BlpStatusErrorHandler(ErrorCode, - Parameter1, - Parameter2, - Parameter3, - Parameter4); - BlpStatusErrorInProgress = FALSE; - - /* If the error handler consumed the error, we're done */ - if (NT_SUCCESS(Status)) - { - return; - } - } - } - } - - /* Check if the boot debugger is enabled */ - if (BlBdDebuggerEnabled()) - { - /* Print out the fatal error */ - BlStatusPrint(L"\n" - L"*** Fatal Error 0x%08x :\n" - L" (0x%p, 0x%p, 0x%p, 0x%p)\n" - L"\n", - ErrorCode, - Parameter1, - Parameter2, - Parameter3, - Parameter4); - - /* Issue a breakpoint */ - __debugbreak(); - } -} - diff --git a/boot/environ/lib/misc/font.c b/boot/environ/lib/misc/font.c deleted file mode 100644 index 4af6cc52974..00000000000 --- a/boot/environ/lib/misc/font.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/font.c - * PURPOSE: Boot Library Font Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -LIST_ENTRY BfiDeferredListHead; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BfiLoadFontFile ( - _In_ PBL_DEVICE_DESCRIPTOR FontDevice, - _In_ PWCHAR FontPath - ) -{ - EfiPrintf(L"Cannot load font %s, no font loader exists\r\n", FontPath); - return STATUS_NOT_IMPLEMENTED; -} - -VOID -BfiFreeDeferredFontFile ( - _In_ PBL_DEFERRED_FONT_FILE DeferredFontFile - ) -{ - /* Free the device copy if there was one */ - if (DeferredFontFile->Device) - { - BlMmFreeHeap(DeferredFontFile->Device); - } - - /* Free the path copy if there was one */ - if (DeferredFontFile->FontPath) - { - BlMmFreeHeap(DeferredFontFile->FontPath); - } - - /* Free the whole thing */ - BlMmFreeHeap(DeferredFontFile); -} - -NTSTATUS -BfLoadFontFile ( - _In_ PBL_DEVICE_DESCRIPTOR Device, - _In_ PWCHAR FontPath - ) -{ - PBL_DEFERRED_FONT_FILE DeferredFont; - SIZE_T FontPathSize; - - /* Allocate the deferred font structure */ - DeferredFont = (PBL_DEFERRED_FONT_FILE)BlMmAllocateHeap(sizeof(*DeferredFont)); - if (!DeferredFont) - { - return STATUS_NO_MEMORY; - } - - /* Zero it out */ - RtlZeroMemory(DeferredFont, sizeof(*DeferredFont)); - - /* Allocate a copy for the file path */ - FontPathSize = sizeof(WCHAR) * wcslen(FontPath) + sizeof(UNICODE_NULL); - DeferredFont->FontPath = (PWCHAR)BlMmAllocateHeap(FontPathSize); - if (!DeferredFont->FontPath) - { - BfiFreeDeferredFontFile(DeferredFont); - return STATUS_NO_MEMORY; - } - - /* Allocate a copy for the device */ - DeferredFont->Device = BlMmAllocateHeap(Device->Size); - if (!DeferredFont->Device) - { - BfiFreeDeferredFontFile(DeferredFont); - return STATUS_NO_MEMORY; - } - - /* Copy the path and device */ - RtlCopyMemory(DeferredFont->FontPath, FontPath, FontPathSize); - RtlCopyMemory(DeferredFont->Device,Device, Device->Size); - - /* Set pending flag? */ - DeferredFont->Flags = 1; - - /* Insert it into the list */ - InsertTailList(&BfiDeferredListHead, &DeferredFont->ListEntry); - return STATUS_SUCCESS; -} - -NTSTATUS -BfLoadDeferredFontFiles ( - VOID - ) -{ - PLIST_ENTRY NextEntry; - PBL_DEFERRED_FONT_FILE DeferredFont; - NTSTATUS Status, LoadStatus; - - /* Assume empty list */ - Status = STATUS_SUCCESS; - - /* Parse the list */ - NextEntry = BfiDeferredListHead.Flink; - while (NextEntry != &BfiDeferredListHead) - { - /* Get the font */ - DeferredFont = CONTAINING_RECORD(NextEntry, BL_DEFERRED_FONT_FILE, ListEntry); - - /* Move to the next entry and remove this one */ - NextEntry = NextEntry->Flink; - RemoveEntryList(&DeferredFont->ListEntry); - - /* Load the font */ - LoadStatus = BfiLoadFontFile(DeferredFont->Device, - DeferredFont->FontPath); - if (!NT_SUCCESS(LoadStatus)) - { - /* Remember the load failure if there was one */ - Status = LoadStatus; - } - - /* Free the deferred font */ - BfiFreeDeferredFontFile(DeferredFont); - } - - /* Return load status */ - return Status; -} - -NTSTATUS -BfiFlipCursorCharacter ( - _In_ PBL_GRAPHICS_CONSOLE Console, - _In_ BOOLEAN Visible - ) -{ - /* not implemented */ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BfClearToEndOfLine ( - _In_ PBL_GRAPHICS_CONSOLE Console - ) -{ - /* not implemented */ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BfClearScreen ( - _In_ PBL_GRAPHICS_CONSOLE Console - ) -{ - NTSTATUS Status; - - /* Reset the cursor position */ - Console->TextConsole.State.XPos = 0; - Console->TextConsole.State.YPos = 0; - - /* Fill the screen with the background color */ - Status = ConsoleGraphicalClearPixels(Console, - Console->TextConsole.State.BgColor); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Check if the cursor should be visible */ - if (Console->TextConsole.State.CursorVisible) - { - /* Load any fonts at this time */ - if (!IsListEmpty(&BfiDeferredListHead)) - { - BfLoadDeferredFontFiles(); - } - - /* Switch the cursor to visible */ - Status = BfiFlipCursorCharacter(Console, TRUE); - } - else - { - /* Nothing left to do */ - Status = STATUS_SUCCESS; - } - - /* Return cursor flip result, if any */ - return Status; -} diff --git a/boot/environ/lib/misc/image.c b/boot/environ/lib/misc/image.c deleted file mode 100644 index 7abb40baf14..00000000000 --- a/boot/environ/lib/misc/image.c +++ /dev/null @@ -1,2074 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/image.c - * PURPOSE: Boot Library Image Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include - -/* DATA VARIABLES ************************************************************/ - -ULONG IapAllocatedTableEntries; -ULONG IapTableEntries; -PVOID* IapImageTable; - -#ifndef _M_ARM -KDESCRIPTOR GdtRegister; -KDESCRIPTOR IdtRegister; -KDESCRIPTOR BootAppGdtRegister; -KDESCRIPTOR BootAppIdtRegister; -PVOID BootApp32EntryRoutine; -PBOOT_APPLICATION_PARAMETER_BLOCK BootApp32Parameters; -PVOID BootApp32Stack; -#endif - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ImgpGetFileSize ( - _In_ PBL_IMG_FILE File, - _Out_ PULONG FileSize - ) -{ - NTSTATUS Status; - ULONG Size; - BL_FILE_INFORMATION FileInformation; - - /* Check if the file was memory mapped */ - if (File->Flags & BL_IMG_MEMORY_FILE) - { - /* Just read the size of the mapping */ - Size = File->FileSize; - } - else - { - /* Do file I/O to get the file size */ - Status = BlFileGetInformation(File->FileId, - &FileInformation); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* We only support files less than 4GB in the Image Mapped */ - Size = FileInformation.Size; - if (FileInformation.Size > ULONG_MAX) - { - return STATUS_NOT_SUPPORTED; - } - } - - /* Return the size and success */ - *FileSize = Size; - return STATUS_SUCCESS; -} - -NTSTATUS -ImgpReadAtFileOffset ( - _In_ PBL_IMG_FILE File, - _In_ ULONG Size, - _In_ ULONGLONG ByteOffset, - _In_ PVOID Buffer, - _Out_ PULONG BytesReturned - ) -{ - NTSTATUS Status; - - /* Check what if this is a mapped file or not */ - if (File->Flags & BL_IMG_MEMORY_FILE) - { - /* Check if the boundaries are within the file size */ - if ((ByteOffset + Size) <= File->FileSize) - { - /* Yep, copy into the caller-supplied buffer */ - RtlCopyMemory(Buffer, - (PVOID)((ULONG_PTR)File->BaseAddress + (ULONG_PTR)ByteOffset), - Size); - - /* If caller wanted to know, return the size copied */ - if (BytesReturned) - { - *BytesReturned = Size; - } - - /* All good */ - Status = STATUS_SUCCESS; - } - else - { - /* Doesn't fit */ - Status = STATUS_INVALID_PARAMETER; - } - } - else - { - /* Issue the file I/O instead */ - Status = BlFileReadAtOffsetEx(File->FileId, - Size, - ByteOffset, - Buffer, - BytesReturned, - 0); - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -ImgpOpenFile ( - _In_ ULONG DeviceId, - _In_ PWCHAR FileName, - _In_ ULONG Flags, - _Out_ PBL_IMG_FILE NewFile - ) -{ - NTSTATUS Status; - ULONG FileSize; - ULONGLONG RemoteFileSize; - PVOID RemoteFileAddress; - ULONG FileId; - - /* First, try to see if BD has this file remotely */ - Status = BlBdPullRemoteFile(FileName, - &RemoteFileAddress, - &RemoteFileSize); - if (NT_SUCCESS(Status)) - { - /* Yep, get the file size and make sure it's < 4GB */ - FileSize = RemoteFileSize; - if (RemoteFileSize <= ULONG_MAX) - { - /* Remember this is a memory mapped remote file */ - NewFile->Flags |= (BL_IMG_MEMORY_FILE | BL_IMG_REMOTE_FILE); - NewFile->FileSize = FileSize; - NewFile->BaseAddress = RemoteFileAddress; - goto Quickie; - } - } - - /* Use File I/O instead */ - Status = BlFileOpen(DeviceId, - FileName, - BL_FILE_READ_ACCESS, - &FileId); - if (!NT_SUCCESS(Status)) - { - /* Bail out on failure */ - return Status; - } - - /* Make sure nobody thinks this is a memory file */ - NewFile->Flags &= ~BL_IMG_MEMORY_FILE; - NewFile->FileId = FileId; - -Quickie: - /* Set common data for both memory and I/O based file */ - NewFile->Flags |= BL_IMG_VALID_FILE; - NewFile->FileName = FileName; - return Status; -} - -NTSTATUS -ImgpCloseFile ( - _In_ PBL_IMG_FILE File - ) -{ - NTSTATUS Status; - - /* Make sure this is a valid file, otherwise no-op */ - Status = STATUS_SUCCESS; - if (File->Flags & BL_IMG_VALID_FILE) - { - /* Is this a memory mapped file? */ - if (!(File->Flags & BL_IMG_MEMORY_FILE)) - { - /* Nope, close the file handle */ - return BlFileClose(File->FileId); - } - - /* Is this a remote file? */ - if (File->Flags & BL_IMG_REMOTE_FILE) - { - /* Then only free the memory in that scenario */ - return MmPapFreePages(File->BaseAddress, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - } - - /* Return the final status */ - return Status; -} - -NTSTATUS -BlImgUnallocateImageBuffer ( - _In_ PVOID ImageBase, - _In_ ULONG ImageSize, - _In_ ULONG ImageFlags - ) -{ - PHYSICAL_ADDRESS PhysicalAddress; - NTSTATUS Status; - - /* Make sure required parameters are present */ - if (!(ImageBase) || !(ImageSize)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if this was a physical allocation */ - if (!(ImageFlags & BL_LOAD_IMG_VIRTUAL_BUFFER)) - { - return MmPapFreePages(ImageBase, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - - /* It's virtual, so translate it first */ - if (!BlMmTranslateVirtualAddress(ImageBase, &PhysicalAddress)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Unmap the virtual mapping */ - Status = BlMmUnmapVirtualAddressEx(ImageBase, ROUND_TO_PAGES(ImageSize)); - if (NT_SUCCESS(Status)) - { - /* Now free the physical pages */ - Status = BlMmFreePhysicalPages(PhysicalAddress); - } - - /* All done */ - return Status; -} - -NTSTATUS -BlImgAllocateImageBuffer ( - _Inout_ PVOID* ImageBuffer, - _In_ ULONG MemoryType, - _In_ ULONGLONG ImageSize, - _In_ ULONG Flags - ) -{ - ULONG Attributes; - ULONGLONG Pages, Size; - PVOID MappedBase, CurrentBuffer; - NTSTATUS Status; - PHYSICAL_ADDRESS PhysicalAddress; - - /* Read and reset the current buffer address */ - CurrentBuffer = *ImageBuffer; - *ImageBuffer = NULL; - - /* Align the image size to page */ - Size = ROUND_TO_PAGES(ImageSize); - - /* Not sure what this attribute does yet */ - Attributes = 0; - if (Flags & BL_LOAD_IMG_UNKNOWN_BUFFER_FLAG) - { - Attributes = 0x10000; - } - - /* Check if the caller wants a virtual buffer */ - if (Flags & BL_LOAD_IMG_VIRTUAL_BUFFER) - { - /* Set the physical address to the current buffer */ - PhysicalAddress.QuadPart = (ULONG_PTR)CurrentBuffer; - Pages = Size >> PAGE_SHIFT; - - /* Allocate the physical pages */ - Status = BlMmAllocatePhysicalPages(&PhysicalAddress, - Pages, - MemoryType, - Attributes, - 0); - if (!NT_SUCCESS(Status)) - { - /* If that failed, remove allocation attributes */ - PhysicalAddress.QuadPart = 0; - Attributes &= ~BlMemoryValidAllocationAttributeMask, - Status = BlMmAllocatePhysicalPages(&PhysicalAddress, - Pages, - MemoryType, - Attributes, - 0); - } - - /* Check if either attempts succeeded */ - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Now map the physical buffer at the address requested */ - MappedBase = PhysicalAddressToPtr(PhysicalAddress); - Status = BlMmMapPhysicalAddressEx(&MappedBase, - BlMemoryFixed, - Size, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - /* Free on failure if needed */ - BlMmFreePhysicalPages(PhysicalAddress); - return Status; - } - } - else - { - /* Otherwise, allocate raw physical pages */ - MappedBase = CurrentBuffer; - Pages = Size >> PAGE_SHIFT; - Status = MmPapAllocatePagesInRange(&MappedBase, - MemoryType, - Pages, - Attributes, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - /* If that failed, try without allocation attributes */ - MappedBase = NULL; - Attributes &= ~BlMemoryValidAllocationAttributeMask, - Status = MmPapAllocatePagesInRange(&MappedBase, - MemoryType, - Pages, - Attributes, - 0, - NULL, - 0); - } - - /* Check if either attempts succeeded */ - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Success path, returned allocated address */ - *ImageBuffer = MappedBase; - return STATUS_SUCCESS; -} - -NTSTATUS -BlImgLoadImageWithProgress2 ( - _In_ ULONG DeviceId, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ PWCHAR FileName, - _Inout_ PVOID* MappedBase, - _Inout_ PULONG MappedSize, - _In_ ULONG ImageFlags, - _In_ BOOLEAN ShowProgress, - _Out_opt_ PUCHAR* HashBuffer, - _Out_opt_ PULONG HashSize - ) -{ - NTSTATUS Status; - PVOID BaseAddress, Buffer; - ULONG RemainingLength, CurrentSize, ImageSize, ReadSize; - BOOLEAN ComputeSignature, ComputeHash, Completed; - BL_IMG_FILE FileHandle; - ULONGLONG ByteOffset; - PHYSICAL_ADDRESS PhysicalAddress; - - /* Initialize variables */ - BaseAddress = 0; - ImageSize = 0; - Completed = FALSE; - RtlZeroMemory(&FileHandle, sizeof(FileHandle)); - - /* Check for missing parameters */ - if (!MappedBase) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - if (!FileName) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - if (!MappedSize) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check if the image buffer is being provided */ - if (ImageFlags & BL_LOAD_IMG_EXISTING_BUFFER) - { - /* An existing base must already exist */ - if (!(*MappedBase)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - } - - /* Check of a hash is being requested */ - if (ImageFlags & BL_LOAD_IMG_COMPUTE_HASH) - { - /* Make sure we can return the hash */ - if (!HashBuffer) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - if (!HashSize) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - } - - /* Check for invalid combination of parameters */ - if ((ImageFlags & BL_LOAD_IMG_COMPUTE_HASH) && (ImageFlags & 0x270)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Initialize hash if requested by caller */ - if (HashBuffer) - { - *HashBuffer = 0; - } - - /* Do the same for the hash size */ - if (HashSize) - { - *HashSize = 0; - } - - /* Open the image file */ - Status = ImgpOpenFile(DeviceId, FileName, DeviceId, &FileHandle); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Error opening file: %lx\r\n", Status); - goto Quickie; - } - - /* Get the size of the image */ - Status = ImgpGetFileSize(&FileHandle, &ImageSize); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Error getting file size: %lx\r\n", Status); - goto Quickie; - } - - /* Read the current base address */ - BaseAddress = *MappedBase; - if (ImageFlags & BL_LOAD_IMG_EXISTING_BUFFER) - { - /* Check if the current buffer is too small */ - if (*MappedSize < ImageSize) - { - /* Return the required size of the buffer */ - *MappedSize = ImageSize; - Status = STATUS_BUFFER_TOO_SMALL; - } - } - else - { - /* A buffer was not provided, allocate one ourselves */ - Status = BlImgAllocateImageBuffer(&BaseAddress, - MemoryType, - ImageSize, - ImageFlags); - } - - /* Bail out if allocation failed */ - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Set the initial byte offset and length to read */ - RemainingLength = ImageSize; - ByteOffset = 0; - Buffer = BaseAddress; - - /* Update the initial progress */ - Completed = FALSE; - if (ShowProgress) - { - BlUtlUpdateProgress(0, &Completed); - ShowProgress &= (Completed != 0) - 1; - } - - /* Set the chunk size for each read */ - ReadSize = 0x100000; - if (ReadSize > ImageSize) - { - ReadSize = ImageSize; - } - - /* Check if we should compute hash and/or signatures */ - ComputeSignature = ImageFlags & BL_LOAD_IMG_COMPUTE_SIGNATURE; - ComputeHash = FALSE; - if ((ComputeSignature) || (ImageFlags & BL_LOAD_IMG_COMPUTE_HASH)) - { - ComputeHash = TRUE; - // todo: crypto is hard - } - - /* Begin the read loop */ - while (RemainingLength) - { - /* Check if we've got more than a chunk left to read */ - if (RemainingLength > ReadSize) - { - /* Read a chunk*/ - CurrentSize = ReadSize; - } - else - { - /* Read only what's left */ - CurrentSize = RemainingLength; - } - - /* Read the chunk */ - Status = ImgpReadAtFileOffset(&FileHandle, - CurrentSize, - ByteOffset, - Buffer, - 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Check if we need to compute the hash of this chunk */ - if (ComputeHash) - { - // todo: crypto is hard - } - - /* Update our position and read information */ - Buffer = (PVOID)((ULONG_PTR)Buffer + CurrentSize); - RemainingLength -= CurrentSize; - ByteOffset += CurrentSize; - - /* Check if we should update the progress bar */ - if (ShowProgress) - { - /* Compute new percentage completed, check if we're done */ - BlUtlUpdateProgress(100 - 100 * RemainingLength / ImageSize, - &Completed); - ShowProgress &= (Completed != 0) - 1; - } - } - - /* Is the read fully complete? We need to finalize the hash if requested */ - if (ComputeHash) - { - // todo: CRYPTO IS HARD - } - - /* Success path, return back the buffer and the size of the image */ - *MappedBase = BaseAddress; - *MappedSize = ImageSize; - -Quickie: - /* Close the file handle */ - ImgpCloseFile(&FileHandle); - - /* Check if we failed and had allocated a buffer */ - if (!(NT_SUCCESS(Status)) && - (BaseAddress) && - !(ImageFlags & BL_LOAD_IMG_EXISTING_BUFFER)) - { - /* Check what kind of buffer we had allocated */ - if (ImageFlags & BL_LOAD_IMG_VIRTUAL_BUFFER) - { - /* Unmap and free the virtual buffer */ - PhysicalAddress.QuadPart = (ULONG_PTR)BaseAddress; - BlMmUnmapVirtualAddressEx(BaseAddress, ImageSize); - BlMmFreePhysicalPages(PhysicalAddress); - } - else - { - /* Free the physical buffer */ - MmPapFreePages(BaseAddress, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - } - - /* If we hadn't gotten to 100% yet, do it now */ - if (ShowProgress) - { - BlUtlUpdateProgress(100, &Completed); - } - - /* Return the final status */ - return Status; -} - -PIMAGE_SECTION_HEADER -BlImgFindSection ( - _In_ PVOID ImageBase, - _In_ ULONG ImageSize - ) -{ - PIMAGE_SECTION_HEADER FoundSection; - ULONG i; - PIMAGE_SECTION_HEADER SectionHeader; - PIMAGE_NT_HEADERS NtHeader; - NTSTATUS Status; - - /* Assume failure */ - FoundSection = NULL; - - /* Make sure the image is valid */ - Status = RtlImageNtHeaderEx(0, ImageBase, ImageSize, &NtHeader); - if (NT_SUCCESS(Status)) - { - /* Get the first section and loop through them all */ - SectionHeader = IMAGE_FIRST_SECTION(NtHeader); - for (i = 0; i < NtHeader->FileHeader.NumberOfSections; i++) - { - /* Check if this is the resource section */ - if (!_stricmp((PCCH)SectionHeader->Name, ".rsrc")) - { - /* Yep, we're done */ - FoundSection = SectionHeader; - break; - } - - /* Nope, keep going */ - SectionHeader++; - } - } - - /* Return the matching section */ - return FoundSection; -} - -VOID -BlImgQueryCodeIntegrityBootOptions ( - _In_ PBL_LOADED_APPLICATION_ENTRY ApplicationEntry, - _Out_ PBOOLEAN IntegrityChecksDisabled, - _Out_ PBOOLEAN TestSigning - ) -{ - - NTSTATUS Status; - BOOLEAN Value; - - /* Check if /DISABLEINTEGRITYCHECKS is on */ - Status = BlGetBootOptionBoolean(ApplicationEntry->BcdData, - BcdLibraryBoolean_DisableIntegrityChecks, - &Value); - *IntegrityChecksDisabled = NT_SUCCESS(Status) && (Value); - - /* Check if /TESTSIGNING is on */ - Status = BlGetBootOptionBoolean(ApplicationEntry->BcdData, - BcdLibraryBoolean_AllowPrereleaseSignatures, - &Value); - *TestSigning = NT_SUCCESS(Status) && (Value); -} - -NTSTATUS -BlImgUnLoadImage ( - _In_ PVOID ImageBase, - _In_ ULONG ImageSize, - _In_ ULONG ImageFlags - ) -{ - /* Check for missing parameters */ - if (!(ImageSize) || !(ImageBase)) - { - /* Bail out */ - return STATUS_INVALID_PARAMETER; - } - - /* Unallocate the image buffer */ - return BlImgUnallocateImageBuffer(ImageBase, ImageSize, ImageFlags); -} - -NTSTATUS -ImgpLoadPEImage ( - _In_ PBL_IMG_FILE ImageFile, - _In_ BL_MEMORY_TYPE MemoryType, - _Inout_ PVOID* ImageBase, - _Out_opt_ PULONG ImageSize, - _Inout_opt_ PVOID Hash, - _In_ ULONG Flags - ) -{ - NTSTATUS Status; - ULONG FileSize, HeaderSize; - BL_IMG_FILE LocalFileBuffer; - PBL_IMG_FILE LocalFile; - PVOID VirtualAddress, PreferredBase, ImageBuffer, CertBuffer, HashBuffer; - ULONGLONG VirtualSize; - PIMAGE_DATA_DIRECTORY CertDirectory; - PHYSICAL_ADDRESS PhysicalAddress; - PIMAGE_NT_HEADERS NtHeaders; - USHORT SectionCount, CheckSum, PartialSum, FinalSum; - PIMAGE_SECTION_HEADER Section; - ULONG_PTR EndOfHeaders, SectionStart, Slack, SectionEnd; - ULONG i, SectionSize, RawSize, BytesRead, RemainingLength, Offset, AlignSize; - BOOLEAN First, ImageHashValid; - UCHAR LocalBuffer[1024]; - UCHAR TrustedBootInformation[52]; - ULONG WorkaroundForBinutils; - - /* Initialize locals */ - WorkaroundForBinutils = 0; - LocalFile = NULL; - ImageBuffer = NULL; - FileSize = 0; - First = FALSE; - VirtualAddress = NULL; - CertBuffer = NULL; - CertDirectory = NULL; - HashBuffer = NULL; - Offset = 0; - VirtualSize = 0; - ImageHashValid = FALSE; - RtlZeroMemory(&TrustedBootInformation, sizeof(TrustedBootInformation)); - - /* Get the size of the image */ - Status = ImgpGetFileSize(ImageFile, &FileSize); - if (!NT_SUCCESS(Status)) - { - return STATUS_FILE_INVALID; - } - - /* Allocate a flat buffer for it */ - Status = BlImgAllocateImageBuffer(&ImageBuffer, BlLoaderData, FileSize, 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Read the whole file flat for now */ - Status = ImgpReadAtFileOffset(ImageFile, FileSize, 0, ImageBuffer, NULL); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Build a local file handle */ - LocalFile = &LocalFileBuffer; - LocalFileBuffer.FileName = ImageFile->FileName; - LocalFileBuffer.Flags = BL_IMG_MEMORY_FILE | BL_IMG_VALID_FILE; - LocalFileBuffer.BaseAddress = ImageBuffer; - LocalFileBuffer.FileSize = FileSize; - - /* Get the NT headers of the file */ - Status = RtlImageNtHeaderEx(0, ImageBuffer, FileSize, &NtHeaders); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Check if we should validate the machine type */ - if (Flags & BL_LOAD_PE_IMG_CHECK_MACHINE) - { - /* Is it different than our current machine type? */ -#if _M_AMD64 - if (NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64) -#else - if (NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) -#endif - { - /* Is it x86 (implying we are x64) ? */ - if (NtHeaders->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) - { - /* Return special error code */ - Status = STATUS_INVALID_IMAGE_WIN_32; - } - else if (NtHeaders->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) - { - /* Otherwise, it's x64 but we are x86 */ - Status = STATUS_INVALID_IMAGE_WIN_64; - } - else - { - /* Or it's ARM or something... */ - Status = STATUS_INVALID_IMAGE_FORMAT; - } - - /* Return with the distinguished error code */ - goto Quickie; - } - } - - /* Check if we should validate the subsystem */ - if (Flags & BL_LOAD_PE_IMG_CHECK_SUBSYSTEM) - { - /* It must be a Windows boot Application */ - if (NtHeaders->OptionalHeader.Subsystem != - IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION) - { - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - } - - /* Check if we should validate the /INTEGRITYCHECK flag */ - if (Flags & BL_LOAD_PE_IMG_CHECK_FORCED_INTEGRITY) - { - /* Check if it's there */ - if (!(NtHeaders->OptionalHeader.DllCharacteristics & - IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY)) - { - /* Nope, fail otherwise */ - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - } - - /* Check if we should compute the image hash */ - if ((Flags & BL_LOAD_PE_IMG_COMPUTE_HASH) || (Hash)) - { - EfiPrintf(L"No hash support\r\n"); - } - - /* Read the current base address, if any */ - VirtualAddress = *ImageBase; - - /* Get the virtual size of the image */ - VirtualSize = NtHeaders->OptionalHeader.SizeOfImage; - - /* Safely align the virtual size to a page */ - Status = RtlULongLongAdd(VirtualSize, - PAGE_SIZE - 1, - &VirtualSize); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - VirtualSize = ALIGN_DOWN_BY(VirtualSize, PAGE_SIZE); - - /* Make sure the image isn't larger than 4GB */ - if (VirtualSize > ULONG_MAX) - { - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Check if we have a buffer already */ - if (Flags & BL_LOAD_IMG_EXISTING_BUFFER) - { - /* Check if it's too small */ - if (*ImageSize < VirtualSize) - { - /* Fail, letting the caller know how big to make it */ - *ImageSize = VirtualSize; - Status = STATUS_BUFFER_TOO_SMALL; - } - } - else - { - /* Allocate the buffer with the flags and type the caller wants */ - Status = BlImgAllocateImageBuffer(&VirtualAddress, - MemoryType, - VirtualSize, - Flags); - } - - /* Bail out if allocation failed, or existing buffer is too small */ - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Read the size of the headers */ - HeaderSize = NtHeaders->OptionalHeader.SizeOfHeaders; - if (VirtualSize < HeaderSize) - { - /* Bail out if they're bigger than the image! */ - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Now read the header into the buffer */ - Status = ImgpReadAtFileOffset(LocalFile, HeaderSize, 0, VirtualAddress, NULL); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Get the NT headers of the file */ - Status = RtlImageNtHeaderEx(0, VirtualAddress, HeaderSize, &NtHeaders); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - First = FALSE; - - /* Record how many sections we have */ - SectionCount = NtHeaders->FileHeader.NumberOfSections; - - /* Capture the current checksum and reset it */ - CheckSum = NtHeaders->OptionalHeader.CheckSum; - NtHeaders->OptionalHeader.CheckSum = 0; - - /* Calculate the checksum of the header, and restore the original one */ - PartialSum = BlUtlCheckSum(0, - VirtualAddress, - HeaderSize, - BL_UTL_CHECKSUM_COMPLEMENT | - BL_UTL_CHECKSUM_USHORT_BUFFER); - NtHeaders->OptionalHeader.CheckSum = CheckSum; - - /* Record our current position (right after the headers) */ - EndOfHeaders = (ULONG_PTR)VirtualAddress + HeaderSize; - - /* Get the first section and iterate through each one */ - Section = IMAGE_FIRST_SECTION(NtHeaders); - for (i = 0; i < SectionCount; i++) - { - /* Compute where this section starts */ - SectionStart = (ULONG_PTR)VirtualAddress + Section->VirtualAddress; - - /* Make sure that the section fits within the image */ - if ((VirtualSize < Section->VirtualAddress) || - ((PVOID)SectionStart < VirtualAddress)) - { - EfiPrintf(L"fail 1\r\n"); - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Check if there's slack space between header end and the section */ - if (!(First) && (EndOfHeaders < SectionStart)) - { - /* Zero it out */ - Slack = SectionStart - EndOfHeaders; - RtlZeroMemory((PVOID)EndOfHeaders, Slack); - } - - /* Get the section virtual size and the raw size */ - SectionSize = Section->Misc.VirtualSize; - RawSize = Section->SizeOfRawData; - - /* Safely align the raw size by 2 */ - Status = RtlULongAdd(RawSize, 1, &AlignSize); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - AlignSize = ALIGN_DOWN_BY(AlignSize, 2); - - /* IF we don't have a virtual size, use the raw size */ - if (!SectionSize) - { - SectionSize = RawSize; - } - - /* If we don't have raw data, ignore the raw size */ - if (!Section->PointerToRawData) - { - RawSize = 0; - } - else if (SectionSize < RawSize) - { - /* And if the virtual size is smaller, use it as the final size */ - RawSize = SectionSize; - } - - /* Make sure that the section doesn't overflow in memory */ - Status = RtlULongPtrAdd(Section->VirtualAddress, - SectionSize, - &SectionEnd); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"fail 21\r\n"); - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Make sure that it fits within the image */ - if (VirtualSize < SectionEnd) - { - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Make sure it doesn't overflow on disk */ - Status = RtlULongPtrAdd(Section->VirtualAddress, - AlignSize, - &SectionEnd); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"fail 31\r\n"); - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* Make sure that it fits within the disk image as well */ - if (VirtualSize < SectionEnd) - { - Status = STATUS_INVALID_IMAGE_FORMAT; - goto Quickie; - } - - /* So does this section have a valid size after all? */ - if (RawSize) - { - /* Are we in the first iteration? */ - if (!First) - { - /* FUCK YOU BINUTILS */ - if (NtHeaders->OptionalHeader.MajorLinkerVersion < 7) - { - if ((*(PULONG)&Section->Name == 'ler.') && (RawSize < AlignSize)) - { - /* Piece of shit won't build relocations when you tell it to, - * either by using --emit-relocs or --dynamicbase. People online - * have found out that by using -pie-executable you can get this - * to happen, but then it turns out that the .reloc section is - * incorrectly sized, and results in a corrupt PE. However, they - * still compute the checksum using the correct value. What idiots. - */ - WorkaroundForBinutils = AlignSize - RawSize; - AlignSize -= WorkaroundForBinutils; - } - } - - /* Yes, read the section data */ - Status = ImgpReadAtFileOffset(LocalFile, - AlignSize, - Section->PointerToRawData, - (PVOID)SectionStart, - NULL); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Update our current offset */ - Offset = AlignSize + Section->PointerToRawData; - - /* Update the checksum to include this section */ - PartialSum = BlUtlCheckSum(PartialSum, - (PUCHAR)SectionStart, - AlignSize, - BL_UTL_CHECKSUM_COMPLEMENT | - BL_UTL_CHECKSUM_USHORT_BUFFER); - AlignSize += WorkaroundForBinutils; - } - } - - /* Are we in the first iteration? */ - if (!First) - { - /* Is there space at the end of the section? */ - if (RawSize < SectionSize) - { - /* Zero out the slack space that's there */ - Slack = SectionSize - RawSize; - RtlZeroMemory((PVOID)(SectionStart + RawSize), Slack); - } - - /* Update our tail offset */ - EndOfHeaders = SectionStart + SectionSize; - } - - /* Move to the next section */ - Section++; - } - - /* Are we in the first iteration? */ - if (!First) - { - /* Go to the end of the file */ - SectionStart = (ULONG_PTR)VirtualAddress + VirtualSize; - - /* Is there still some slack space left? */ - if (EndOfHeaders < SectionStart) - { - /* Zero it out */ - Slack = SectionStart - EndOfHeaders; - RtlZeroMemory((PVOID)EndOfHeaders, Slack); - } - } - - /* Did the first iteration complete OK? */ - if ((NT_SUCCESS(Status)) && !(First)) - { - /* Check how many non-image bytes are left in the file */ - RemainingLength = FileSize - Offset; - while (RemainingLength) - { - /* See if the read will fit into our local buffer */ - if (RemainingLength >= sizeof(LocalBuffer)) - { - /* Nope, cap it */ - BytesRead = sizeof(LocalBuffer); - } - else - { - /* Yes, but there's less to read */ - BytesRead = RemainingLength; - } - - /* Read 1024 bytes into the local buffer */ - Status = ImgpReadAtFileOffset(LocalFile, - BytesRead, - Offset, - LocalBuffer, - &BytesRead); - if (!(NT_SUCCESS(Status)) || !(BytesRead)) - { - Status = STATUS_FILE_INVALID; - goto Quickie; - } - - /* Advance the offset and reduce the length */ - RemainingLength -= BytesRead; - Offset += BytesRead; - - /* Compute the checksum of this leftover space */ - PartialSum = BlUtlCheckSum(PartialSum, - LocalBuffer, - BytesRead, - BL_UTL_CHECKSUM_COMPLEMENT | - BL_UTL_CHECKSUM_USHORT_BUFFER); - } - - /* Finally, calculate the final checksum and compare it */ - FinalSum = FileSize + PartialSum + WorkaroundForBinutils; - if ((FinalSum != CheckSum) && (PartialSum == 0xFFFF)) - { - /* It hit overflow, so set it to the file size */ - FinalSum = FileSize; - } - - /* If the checksum doesn't match, and caller is enforcing, bail out */ - if ((FinalSum != CheckSum) && - !(Flags & BL_LOAD_PE_IMG_IGNORE_CHECKSUM_MISMATCH)) - { - Status = STATUS_IMAGE_CHECKSUM_MISMATCH; - goto Quickie; - } - } - - /* Check if the .rsrc section should be checked with the filename */ - if (Flags & BL_LOAD_PE_IMG_VALIDATE_ORIGINAL_FILENAME) - { - EfiPrintf(L"Not yet supported\r\n"); - Status = 0xC0430007; // STATUS_SECUREBOOT_FILE_REPLACED - goto Quickie; - } - - /* Check if we should relocate */ - if (!(Flags & BL_LOAD_PE_IMG_SKIP_RELOCATIONS)) - { - /* Check if we loaded at a different address */ - PreferredBase = (PVOID)NtHeaders->OptionalHeader.ImageBase; - if (VirtualAddress != PreferredBase) - { - /* Yep -- do relocations */ - Status = LdrRelocateImage(VirtualAddress, - "Boot Environment Library", - STATUS_SUCCESS, - STATUS_UNSUCCESSFUL, - STATUS_INVALID_IMAGE_FORMAT); - if (!NT_SUCCESS(Status)) - { - /* That's bad */ - goto Quickie; - } - } - } - -#if BL_TPM_SUPPORT - /* Check if the image hash was valid */ - if (!ImageHashValid) - { - /* Send a TPM/SI notification without a context */ - BlEnNotifyEvent(0x10000002, NULL); - } - - /* Now send a TPM/SI notification with the hash of the loaded image */ - BlMmTranslateVirtualAddress(VirtualAddress, &Context.ImageBase); - Context.HashAlgorithm = HashAlgorithm; - Context.HashSize = HashSize; - Context.FileName = ImageFile->FileName; - Context.ImageSize = VirtualSize; - Context.HashValid = ImageHashValid; - Context.Hash = Hash; - BlEnNotifyEvent(0x10000002, &Context); -#endif - - /* Return the loaded address to the caller */ - *ImageBase = VirtualAddress; - - /* If the caller wanted the image size, return it too */ - if (ImageSize) - { - *ImageSize = VirtualSize; - } - -Quickie: - /* Check if we computed the image hash OK */ - if (ImageHashValid) - { - /* Then free the information that ImgpValidateImageHash set up */ - EfiPrintf(L"leadking trusted boot\r\n"); - //ImgpDestroyTrustedBootInformation(&TrustedBootInformation); - } - - /* Check if we had a hash buffer */ - if (HashBuffer) - { - /* Free it */ - MmPapFreePages(HashBuffer, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - - /* Check if we have a certificate directory */ - if ((CertBuffer) && (CertDirectory)) - { - /* Free it */ - BlImgUnallocateImageBuffer(CertBuffer, CertDirectory->Size, 0); - } - - /* Check if we had an image buffer allocated */ - if ((ImageBuffer) && (FileSize)) - { - /* Free it */ - BlImgUnallocateImageBuffer(ImageBuffer, FileSize, 0); - } - - /* Check if we had a local file handle */ - if (LocalFile) - { - /* Close it */ - ImgpCloseFile(LocalFile); - } - - /* Check if this is the failure path */ - if (!NT_SUCCESS(Status)) - { - /* Check if we had started mapping in the image already */ - if ((VirtualAddress) && !(Flags & BL_LOAD_PE_IMG_EXISTING_BUFFER)) - { - /* Into a virtual buffer? */ - if (Flags & BL_LOAD_PE_IMG_VIRTUAL_BUFFER) - { - /* Unmap and free it */ - BlMmUnmapVirtualAddressEx(VirtualAddress, VirtualSize); - PhysicalAddress.QuadPart = (ULONG_PTR)VirtualAddress; - BlMmFreePhysicalPages(PhysicalAddress); - } - else - { - /* Into a physical buffer -- free it */ - MmPapFreePages(VirtualAddress, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } - } - } - - /* Return back to caller */ - return Status; -} - -NTSTATUS -BlImgLoadPEImageEx ( - _In_ ULONG DeviceId, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ PWCHAR Path, - _Out_ PVOID* ImageBase, - _Out_ PULONG ImageSize, - _Out_ PVOID Hash, - _In_ ULONG Flags - ) -{ - BL_IMG_FILE ImageFile; - NTSTATUS Status; - - /* Initialize the image file structure */ - ImageFile.Flags = 0; - ImageFile.FileName = NULL; - - /* Check if the required parameter are missing */ - if (!(ImageBase) || !(Path)) - { - return STATUS_INVALID_PARAMETER; - } - - /* If we are loading a pre-allocated image, make sure we have it */ - if ((Flags & BL_LOAD_IMG_EXISTING_BUFFER) && (!(*ImageBase) || !(ImageSize))) - { - return STATUS_INVALID_PARAMETER; - } - - /* Load the file from disk */ - Status = ImgpOpenFile(DeviceId, Path, 0, &ImageFile); - if (NT_SUCCESS(Status)) - { - /* If that worked, do the PE parsing */ - Status = ImgpLoadPEImage(&ImageFile, - MemoryType, - ImageBase, - ImageSize, - Hash, - Flags); - } - - /* Close the image file and return back to caller */ - ImgpCloseFile(&ImageFile); - return Status; -} - -NTSTATUS -BlImgLoadBootApplication ( - _In_ PBL_LOADED_APPLICATION_ENTRY BootEntry, - _Out_ PULONG AppHandle - ) -{ - NTSTATUS Status; - PULONGLONG AllowedList; - ULONGLONG AllowedCount; - ULONG i, DeviceId, ImageSize, Flags, ListSize; - LARGE_INTEGER Frequency; - PVOID UnlockCode, ImageBase; - PBL_DEVICE_DESCRIPTOR Device, BitLockerDevice; - PWCHAR Path; - PBL_APPLICATION_ENTRY AppEntry; - PBL_IMG_FILE ImageFile; - BOOLEAN DisableIntegrity, TestSigning; - UCHAR Hash[64]; - PBL_IMAGE_APPLICATION_ENTRY ImageAppEntry; - - /* Initialize all locals */ - BitLockerDevice = NULL; - UnlockCode = NULL; - ImageFile = NULL; - DeviceId = -1; - Device = NULL; - ImageAppEntry = NULL; - AppEntry = NULL; - Path = NULL; - ImageSize = 0; - ImageBase = NULL; - - /* Check for "allowed in-memory settings" */ - Status = BlpGetBootOptionIntegerList(BootEntry->BcdData, - BcdLibraryIntegerList_AllowedInMemorySettings, - &AllowedList, - &AllowedCount, - TRUE); - if (Status == STATUS_SUCCESS) - { - /* Loop through the list of allowed setting */ - for (i = 0; i < AllowedCount; i++) - { - /* Find the super undocumented one */ - if (AllowedList[i] == BcdLibraryInteger_UndocumentedMagic) - { - /* If it's present, append the current perf frequence to it */ - BlTimeQueryPerformanceCounter(&Frequency); - BlAppendBootOptionInteger(BootEntry, - BcdLibraryInteger_UndocumentedMagic, - Frequency.QuadPart); - } - } - } - -#if BL_BITLOCKER_SUPPORT - /* Do bitlocker stuff */ - Status = BlFveSecureBootUnlockBootDevice(BootEntry, &BitLockerDevice, &UnlockCode); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } -#endif - - /* Get the device on which this application is on*/ - Status = BlGetBootOptionDevice(BootEntry->BcdData, - BcdLibraryDevice_ApplicationDevice, - &Device, - NULL); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Get the path of the application */ - Status = BlGetBootOptionString(BootEntry->BcdData, - BcdLibraryString_ApplicationPath, - &Path); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Open the device */ - Status = BlpDeviceOpen(Device, - BL_DEVICE_READ_ACCESS, - 0, - &DeviceId); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Check for integrity BCD options */ - BlImgQueryCodeIntegrityBootOptions(BootEntry, - &DisableIntegrity, - &TestSigning); - -#if BL_TPM_SUPPORT - RtlZeroMemory(&Context, sizeof(Context); - Context.BootEntry = BootEntry; - BlEnNotifyEvent(0x10000003, &Context); -#endif - - /* Enable signing and hashing checks if integrity is enabled */ - Flags = 0; - if (!DisableIntegrity) - { - Flags = 0x8070; - } - - /* Now call the PE loader to load the image */ - Status = BlImgLoadPEImageEx(DeviceId, - BlLoaderMemory, - Path, - &ImageBase, - &ImageSize, - Hash, - Flags); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - -#if BL_KD_SUPPORT - /* Check if we should notify the debugger of load */ - if (BdDebugTransitions) - { - /* Initialize it */ - BdForceDebug = 1; - Status = BlBdInitialize(); - if (NT_SUCCESS(Status)) - { - /* Check if it's enabled */ - if (BlBdDebuggerEnabled()) - { - /* Send it an image load notification */ - BdDebuggerNotPresent = FALSE; - RtlInitUnicodeString(&PathString, Path); - BlBdLoadImageSymbols(&PathString, ImageBase); - } - } - } -#endif - -#if BL_BITLOCKER_SUPPORT - /* Do bitlocker stuff */ - Status = BlSecureBootCheckPolicyOnFveDevice(BitLockerDevice); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } -#endif - -#if BL_BITLOCKER_SUPPORT - /* Do bitlocker stuff */ - Status = BlFveSecureBootCheckpointBootApp(BootEntry, BitLockerDevice, Hash, UnlockCode); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } -#endif - - /* Get the BCD option size */ - ListSize = BlGetBootOptionListSize(BootEntry->BcdData); - - /* Allocate an entry with all the BCD options */ - AppEntry = BlMmAllocateHeap(ListSize + sizeof(*AppEntry)); - if (!AppEntry) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Zero it out */ - RtlZeroMemory(AppEntry, sizeof(*AppEntry)); - - /* Initialize it */ - strcpy(AppEntry->Signature, "BTAPENT"); - AppEntry->Guid = BootEntry->Guid; - AppEntry->Flags = BootEntry->Flags; - - /* Copy the BCD options */ - RtlCopyMemory(&AppEntry->BcdData, BootEntry->BcdData, ListSize); - - /* Allocate the image entry */ - ImageAppEntry = BlMmAllocateHeap(sizeof(*ImageAppEntry)); - if (!ImageAppEntry) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Initialize it */ - ImageAppEntry->ImageBase = ImageBase; - ImageAppEntry->ImageSize = ImageSize; - ImageAppEntry->AppEntry = AppEntry; - - /* Check if this is the first entry */ - if (!IapTableEntries) - { - /* Allocate two entries */ - IapAllocatedTableEntries = 0; - IapTableEntries = 2; - IapImageTable = BlMmAllocateHeap(IapTableEntries * sizeof(PVOID)); - if (!IapImageTable) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Zero out the entries for now */ - RtlZeroMemory(IapImageTable, IapTableEntries * sizeof(PVOID)); - } - - /* Set this entry into the table */ - Status = BlTblSetEntry(&IapImageTable, - &IapTableEntries, - ImageAppEntry, - AppHandle, - TblDoNotPurgeEntry); - -Quickie: - /* Is the device open? Close it if so */ - if (DeviceId != 1) - { - BlDeviceClose(DeviceId); - } - - /* Is there an allocated device? Free it */ - if (Device) - { - BlMmFreeHeap(Device); - } - - /* Is there an allocated path? Free it */ - if (Path) - { - BlMmFreeHeap(Path); - } - - /* Is there a bitlocker device? Free it */ - if (BitLockerDevice) - { - BlMmFreeHeap(BitLockerDevice); - } - - /* Is there a bitlocker unlock code? Free it */ - if (UnlockCode) - { - BlMmFreeHeap(UnlockCode); - } - - /* Did we succeed in creating an entry? */ - if (NT_SUCCESS(Status)) - { - /* Remember there's one more in the table */ - IapAllocatedTableEntries++; - - /* Return success */ - return Status; - } - - /* Did we load an image after all? */ - if (ImageBase) - { - /* Unload it */ - BlImgUnLoadImage(ImageBase, ImageSize, 0); - } - - /* Did we allocate an app entry? Free it */ - if (AppEntry) - { - BlMmFreeHeap(AppEntry); - } - - /* Do we have an image file entry? Free it */ - if (ImageFile) - { - BlMmFreeHeap(ImageFile); - } - - /* Do we no longer have a single entry in the table? */ - if (!(IapAllocatedTableEntries) && (IapImageTable)) - { - /* Free and destroy the table */ - BlMmFreeHeap(IapImageTable); - IapTableEntries = 0; - IapImageTable = NULL; - } - - /* Return the failure code */ - return Status; -} - -NTSTATUS -BlpPdParseReturnArguments ( - _In_ PBL_RETURN_ARGUMENTS ReturnArguments - ) -{ - /* Check if any custom data was returned */ - if (ReturnArguments->DataPage == 0) - { - /* Nope, nothing to do */ - return STATUS_SUCCESS; - } - - /* Yes, we have to parse it */ - EfiPrintf(L"Return arguments not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -ImgpCopyApplicationBootDevice ( - __in PBL_DEVICE_DESCRIPTOR DestinationDevice, - __in PBL_DEVICE_DESCRIPTOR SourceDevice - ) -{ - /* Is this a partition device? */ - if (SourceDevice->DeviceType != PartitionDevice) - { - /* It's not -- a simple copy will do */ - RtlCopyMemory(DestinationDevice, SourceDevice, SourceDevice->Size); - return STATUS_SUCCESS; - } - - /* TODO */ - EfiPrintf(L"Partition copy not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; - -} - -NTSTATUS -ImgpInitializeBootApplicationParameters ( - _In_ PBL_BUFFER_DESCRIPTOR ImageParameters, - _In_ PBL_APPLICATION_ENTRY AppEntry, - _In_ PVOID ImageBase, - _In_ ULONG ImageSize - ) -{ - NTSTATUS Status; - PIMAGE_NT_HEADERS NtHeaders; - BL_BUFFER_DESCRIPTOR MemoryParameters; - LIST_ENTRY MemoryList; - PBL_FIRMWARE_DESCRIPTOR FirmwareParameters; - PBL_DEVICE_DESCRIPTOR BootDevice; - PBL_MEMORY_DATA MemoryData; - PBL_APPLICATION_ENTRY BootAppEntry; - PBL_RETURN_ARGUMENTS ReturnArguments; - PBOOT_APPLICATION_PARAMETER_BLOCK ParameterBlock; - ULONG EntrySize, BufferSize; - - /* Get the image headers and validate it */ - Status = RtlImageNtHeaderEx(0, ImageBase, ImageSize, &NtHeaders); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Get the size of the entire non-firmware, allocated, memory map */ - MemoryParameters.BufferSize = 0; - Status = BlMmGetMemoryMap(&MemoryList, - &MemoryParameters, - BL_MM_INCLUDE_PERSISTENT_MEMORY | - BL_MM_INCLUDE_MAPPED_ALLOCATED | - BL_MM_INCLUDE_MAPPED_UNALLOCATED | - BL_MM_INCLUDE_UNMAPPED_ALLOCATED | - BL_MM_INCLUDE_RESERVED_ALLOCATED, - 0); - if ((Status != STATUS_BUFFER_TOO_SMALL) && (Status != STATUS_SUCCESS)) - { - /* We failed due to an unknown reason -- bail out */ - return Status; - } - - /* Compute the list of the BCD plus the application entry */ - EntrySize = BlGetBootOptionListSize(&AppEntry->BcdData) + - FIELD_OFFSET(BL_APPLICATION_ENTRY, BcdData); - - /* Compute the total size required for the entire structure */ - BufferSize = EntrySize + - BlpBootDevice->Size + - MemoryParameters.BufferSize + - sizeof(*ReturnArguments) + - sizeof(*MemoryData) + - sizeof(*FirmwareParameters) + - sizeof(*ParameterBlock); - - /* Check if this gives us enough space */ - if (ImageParameters->BufferSize < BufferSize) - { - /* It does not -- free the existing buffer */ - if (ImageParameters->BufferSize) - { - BlMmFreeHeap(ImageParameters->Buffer); - } - - /* Allocate a new buffer of sufficient size */ - ImageParameters->BufferSize = BufferSize; - ImageParameters->Buffer = BlMmAllocateHeap(BufferSize); - if (!ImageParameters->Buffer) - { - /* Bail out if we couldn't allocate it */ - return STATUS_NO_MEMORY; - } - } - - /* Zero out the parameter block */ - ParameterBlock = (PBOOT_APPLICATION_PARAMETER_BLOCK)ImageParameters->Buffer; - RtlZeroMemory(ParameterBlock, BufferSize); - - /* Initialize it */ - ParameterBlock->Version = BOOT_APPLICATION_VERSION; - ParameterBlock->Size = BufferSize; - ParameterBlock->Signature[0] = BOOT_APPLICATION_SIGNATURE_1; - ParameterBlock->Signature[1] = BOOT_APPLICATION_SIGNATURE_2; - ParameterBlock->MemoryTranslationType = MmTranslationType; - ParameterBlock->ImageType = IMAGE_FILE_MACHINE_I386; - ParameterBlock->ImageBase = (ULONG_PTR)ImageBase; - ParameterBlock->ImageSize = NtHeaders->OptionalHeader.SizeOfImage; - - /* Get the offset to the memory data */ - ParameterBlock->MemoryDataOffset = sizeof(*ParameterBlock); - - /* Fill it out */ - MemoryData = (PBL_MEMORY_DATA)((ULONG_PTR)ParameterBlock + - ParameterBlock->MemoryDataOffset); - MemoryData->Version = BL_MEMORY_DATA_VERSION; - MemoryData->MdListOffset = sizeof(*MemoryData); - MemoryData->DescriptorSize = sizeof(BL_MEMORY_DESCRIPTOR); - MemoryData->DescriptorOffset = FIELD_OFFSET(BL_MEMORY_DESCRIPTOR, BasePage); - - /* And populate the memory map */ - MemoryParameters.Buffer = MemoryData + 1; - Status = BlMmGetMemoryMap(&MemoryList, - &MemoryParameters, - BL_MM_INCLUDE_PERSISTENT_MEMORY | - BL_MM_INCLUDE_MAPPED_ALLOCATED | - BL_MM_INCLUDE_MAPPED_UNALLOCATED | - BL_MM_INCLUDE_UNMAPPED_ALLOCATED | - BL_MM_INCLUDE_RESERVED_ALLOCATED, - 0); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Now that we have the map, indicate the number of descriptors */ - MemoryData->DescriptorCount = MemoryParameters.ActualSize / - MemoryData->DescriptorSize; - - /* Get the offset to the application entry */ - ParameterBlock->AppEntryOffset = ParameterBlock->MemoryDataOffset + - MemoryData->MdListOffset + - MemoryParameters.BufferSize; - - /* Fill it out */ - BootAppEntry = (PBL_APPLICATION_ENTRY)((ULONG_PTR)ParameterBlock + - ParameterBlock->AppEntryOffset); - RtlCopyMemory(BootAppEntry, AppEntry, EntrySize); - - /* Get the offset to the boot device */ - ParameterBlock->BootDeviceOffset = ParameterBlock->AppEntryOffset + - EntrySize; - - /* Fill it out */ - BootDevice = (PBL_DEVICE_DESCRIPTOR)((ULONG_PTR)ParameterBlock + - ParameterBlock->BootDeviceOffset); - Status = ImgpCopyApplicationBootDevice(BootDevice, BlpBootDevice); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Get the offset to the firmware data */ - ParameterBlock->FirmwareParametersOffset = ParameterBlock->BootDeviceOffset + - BootDevice->Size; - - /* Fill it out */ - FirmwareParameters = (PBL_FIRMWARE_DESCRIPTOR)((ULONG_PTR)ParameterBlock + - ParameterBlock-> - FirmwareParametersOffset); - Status = BlFwGetParameters(FirmwareParameters); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Get the offset to the return arguments */ - ParameterBlock->ReturnArgumentsOffset = ParameterBlock->FirmwareParametersOffset + - sizeof(BL_FIRMWARE_DESCRIPTOR); - - /* Fill them out */ - ReturnArguments = (PBL_RETURN_ARGUMENTS)((ULONG_PTR)ParameterBlock + - ParameterBlock-> - ReturnArgumentsOffset); - ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION; - ReturnArguments->DataPage = 0; - ReturnArguments->DataSize = 0; - - /* Structure complete */ - ImageParameters->ActualSize = ParameterBlock->ReturnArgumentsOffset + - sizeof(*ReturnArguments); - return STATUS_SUCCESS; -} - -NTSTATUS -ImgArchEfiStartBootApplication ( - _In_ PBL_APPLICATION_ENTRY AppEntry, - _In_ PVOID ImageBase, - _In_ ULONG ImageSize, - _In_ PBL_RETURN_ARGUMENTS ReturnArguments - ) -{ -#ifndef _M_ARM - KDESCRIPTOR Gdt, Idt; - ULONG BootSizeNeeded; - NTSTATUS Status; - PVOID BootData; - PIMAGE_NT_HEADERS NtHeaders; - PVOID NewStack, NewGdt, NewIdt; - BL_BUFFER_DESCRIPTOR Parameters; - - /* Read the current IDT and GDT */ - _sgdt(&Gdt.Limit); - __sidt(&Idt.Limit); - - /* Allocate space for the IDT, GDT, and 24 pages of stack */ - BootSizeNeeded = (ULONG_PTR)PAGE_ALIGN(Idt.Limit + Gdt.Limit + 1 + 25 * PAGE_SIZE); - Status = MmPapAllocatePagesInRange(&BootData, - BlLoaderArchData, - BootSizeNeeded >> PAGE_SHIFT, - 0, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Zero the boot data */ - RtlZeroMemory(BootData, BootSizeNeeded); - - /* Set the new stack, GDT and IDT */ - NewStack = (PVOID)((ULONG_PTR)BootData + (24 * PAGE_SIZE) - 8); - NewGdt = (PVOID)((ULONG_PTR)BootData + (24 * PAGE_SIZE)); - NewIdt = (PVOID)((ULONG_PTR)BootData + (24 * PAGE_SIZE) + Gdt.Limit + 1); - - /* Copy the current (firmware) GDT and IDT */ - RtlCopyMemory(NewGdt, (PVOID)Gdt.Base, Gdt.Limit + 1); - RtlCopyMemory(NewIdt, (PVOID)Idt.Base, Idt.Limit + 1); - - /* Read the NT headers so that we can get the entrypoint later on */ - RtlImageNtHeaderEx(0, ImageBase, ImageSize, &NtHeaders); - - /* Prepare the application parameters */ - RtlZeroMemory(&Parameters, sizeof(Parameters)); - Status = ImgpInitializeBootApplicationParameters(&Parameters, - AppEntry, - ImageBase, - ImageSize); - if (NT_SUCCESS(Status)) - { - /* Set the firmware GDT/IDT as the one the application will use */ - BootAppGdtRegister = Gdt; - BootAppIdtRegister = Idt; - - /* Set the entrypoint, parameters, and stack */ - BootApp32EntryRoutine = (PVOID)((ULONG_PTR)ImageBase + - NtHeaders->OptionalHeader. - AddressOfEntryPoint); - BootApp32Parameters = Parameters.Buffer; - BootApp32Stack = NewStack; - -#if BL_KD_SUPPORT - /* Disable the kernel debugger */ - BlBdStop(); -#endif - /* Make it so */ - Archx86TransferTo32BitApplicationAsm(); - - /* Not yet implemented. This is the last step! */ - EfiPrintf(L"EFI APPLICATION RETURNED!!!\r\n"); - EfiStall(100000000); - -#if BL_KD_SUPPORT - /* Re-enable the kernel debugger */ - BlBdStart(); -#endif - } - -Quickie: - /* Check if we had boot data allocated */ - if (BootData) - { - /* Free it */ - MmPapFreePages(BootData, BL_MM_INCLUDE_MAPPED_ALLOCATED); - } -#else - EfiPrintf(L"ImgArchEfiStartBootApplication not implemented for this platform.\r\n"); -#endif - - /* All done */ - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlImgStartBootApplication ( - _In_ ULONG AppHandle, - _Inout_opt_ PBL_RETURN_ARGUMENTS ReturnArguments - ) -{ - PBL_IMAGE_APPLICATION_ENTRY ImageAppEntry; - BL_RETURN_ARGUMENTS LocalReturnArgs; - PBL_FILE_SYSTEM_ENTRY FileSystem; - PLIST_ENTRY NextEntry, ListHead; - NTSTATUS Status; - - /* Check if we don't have an argument structure */ - if (!ReturnArguments) - { - /* Initialize a local copy and use it instead */ - LocalReturnArgs.Version = BL_RETURN_ARGUMENTS_VERSION; - LocalReturnArgs.Status = STATUS_SUCCESS; - LocalReturnArgs.Flags = 0; - LocalReturnArgs.DataPage = 0; - LocalReturnArgs.DataSize = 0; - ReturnArguments = &LocalReturnArgs; - } - - /* Make sure the handle index is valid */ - if (IapTableEntries <= AppHandle) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the entry for this handle, making sure it exists */ - ImageAppEntry = IapImageTable[AppHandle]; - if (!ImageAppEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* Loop the registered file systems */ - ListHead = &RegisteredFileSystems; - NextEntry = RegisteredFileSystems.Flink; - while (NextEntry != ListHead) - { - /* Get the filesystem entry */ - FileSystem = CONTAINING_RECORD(NextEntry, - BL_FILE_SYSTEM_ENTRY, - ListEntry); - - /* See if it has a purge callback */ - if (FileSystem->PurgeCallback) - { - /* Call it */ - FileSystem->PurgeCallback(); - } - - /* Move to the next entry */ - NextEntry = NextEntry->Flink; - } - - /* TODO -- flush the block I/O cache too */ - //BlockIoPurgeCache(); - - /* Call into EFI land to start the boot application */ - Status = ImgArchEfiStartBootApplication(ImageAppEntry->AppEntry, - ImageAppEntry->ImageBase, - ImageAppEntry->ImageSize, - ReturnArguments); - - /* Parse any arguments we got on the way back */ - BlpPdParseReturnArguments(ReturnArguments); - -#if BL_BITLOCKER_SUPPORT - /* Bitlocker stuff */ - FvebpCheckAllPartitions(TRUE); -#endif - -#if BL_TPM_SUPPORT - /* Notify a TPM/SI event */ - BlEnNotifyEvent(0x10000005, NULL); -#endif - - /* Reset the display */ - BlpDisplayReinitialize(); - - /* TODO -- reset ETW */ - //BlpLogInitialize(); - - /* All done */ - return Status; -} - -NTSTATUS -BlImgUnloadBootApplication ( - _In_ ULONG AppHandle - ) -{ - PBL_IMAGE_APPLICATION_ENTRY ImageAppEntry; - NTSTATUS Status; - - /* Make sure the handle index is valid */ - if (IapTableEntries <= AppHandle) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the entry for this handle, making sure it exists */ - ImageAppEntry = IapImageTable[AppHandle]; - if (!ImageAppEntry) - { - return STATUS_INVALID_PARAMETER; - } - - /* Unload the image */ - Status = BlImgUnLoadImage(ImageAppEntry->ImageBase, - ImageAppEntry->ImageSize, - 0); - if (NT_SUCCESS(Status)) - { - /* Normalize the success code */ - Status = STATUS_SUCCESS; - } - else - { - /* Normalize the failure code */ - Status = STATUS_MEMORY_NOT_ALLOCATED; - } - - /* Free the entry and the image entry as well */ - BlMmFreeHeap(ImageAppEntry->AppEntry); - BlMmFreeHeap(ImageAppEntry); - - /* Clear the handle */ - IapImageTable[AppHandle] = NULL; - - /* Free one entry */ - if (!(--IapAllocatedTableEntries)) - { - /* There are no more, so get rid of the table itself */ - BlMmFreeHeap(IapImageTable); - IapImageTable = NULL; - IapTableEntries = 0; - } - - /* All good */ - return Status; -} diff --git a/boot/environ/lib/misc/resource.c b/boot/environ/lib/misc/resource.c deleted file mode 100644 index 5b3adc33f42..00000000000 --- a/boot/environ/lib/misc/resource.c +++ /dev/null @@ -1,550 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/resource.c - * PURPOSE: Boot Library Resource Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PVOID ResPeImageBase; -PVOID ResPeImageEnd; -PVOID ResRootDirectory; - -PVOID ResPeImageBasePrimary; -PVOID ResPeImageEndPrimary; -PVOID ResRootDirectoryPrimary; -ULONG_PTR ResRootDirectoryPrimaryOffset; -ULONG_PTR ResRootDirectoryOffset; -ULONG_PTR ResRootDirectoryFallbackOffset; -PVOID ResPeImageBaseFallback; -PVOID ResPeImageEndFallback; -PVOID ResRootDirectoryFallback; - -BOOLEAN ResLoadedFontFiles; -PVOID ResMuiImageBase; -ULONG_PTR ResMuiImageSize; - -PWCHAR ResLocale; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -ResSelectLocale ( - _In_ BOOLEAN Primary - ) -{ - NTSTATUS Status; - - /* Check if we're using the primary (MUI) or fallback resources */ - if (Primary) - { - /* Use the primary ones */ - ResRootDirectory = ResRootDirectoryPrimary; - ResRootDirectoryOffset = ResRootDirectoryPrimaryOffset; - ResPeImageBase = ResPeImageBasePrimary; - ResPeImageEnd = ResPeImageEndPrimary; - - /* Register the locale with the display */ - Status = BlpDisplayRegisterLocale(ResLocale); - } - - /* Check if that failed, or if we're using fallback */ - if (!(Primary) || !(NT_SUCCESS(Status))) - { - /* Set the fallback pointers */ - ResRootDirectory = ResRootDirectoryFallback; - ResRootDirectoryOffset = ResRootDirectoryFallbackOffset; - ResPeImageBase = ResPeImageBaseFallback; - ResPeImageEnd = ResPeImageEndFallback; - - /* Register the fallback (America baby!) locale */ - Status = BlpDisplayRegisterLocale(L"en-US"); - if (!NT_SUCCESS(Status)) - { - /* Fallback to text mode (yes, this is the API...) */ - return BlDisplaySetScreenResolution(); - } - } - - /* No fonts loaded -- return failure code */ - ResLoadedFontFiles = FALSE; - return Status; -} - -PIMAGE_RESOURCE_DIRECTORY_ENTRY -ResFindDirectoryEntry ( - _In_ PIMAGE_RESOURCE_DIRECTORY Directory, - _In_opt_ PUSHORT Id, - _In_opt_ PWCHAR Name, - _In_ ULONG_PTR SectionStart - ) -{ - PIMAGE_RESOURCE_DIRECTORY_ENTRY EntryTable, IdEntryTable; - ULONG i; - SIZE_T NameLength; - PIMAGE_RESOURCE_DIRECTORY_STRING NameString; - - /* Are we looking by ID or name? */ - if (Id) - { - /* By ID, so were we passed a name? */ - if (Name) - { - /* That doesn't make sense */ - return NULL; - } - } - else if (!Name) - { - /* By name, but we weren't given one. Also bad. */ - return NULL; - } - - /* Get the table of names */ - EntryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(Directory + 1); - - /* Check if we are doing ID lookup instead */ - if (Id) - { - /* The IDs come after the names */ - IdEntryTable = &EntryTable[Directory->NumberOfNamedEntries]; - - /* Parse them */ - for (i = 0; i < Directory->NumberOfIdEntries; i++) - { - /* Check if the ID matches, or if the wildcard is being used*/ - if ((IdEntryTable[i].Id == *Id) || (*Id == 0xFFFF)) - { - /* Return a pointer to the data */ - return (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(SectionStart + IdEntryTable[i].OffsetToDirectory); - } - } - - /* ID was not found */ - return NULL; - } - - /* Searching by name, so parse them */ - for (i = 0; i < Directory->NumberOfNamedEntries; i++) - { - /* Get the name itself and count its length */ - NameString = (PIMAGE_RESOURCE_DIRECTORY_STRING)(SectionStart + EntryTable[i].NameOffset); - NameLength = wcslen(Name); - - /* If the length matches, compare the bytes */ - if ((NameLength == NameString->Length) && - (RtlCompareMemory(NameString->NameString, Name, NameLength) == NameLength)) - { - /* They both match, so this is our entry. Return it */ - return (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(SectionStart + EntryTable[i].OffsetToDirectory); - } - } - - /* Name was not found */ - return NULL; -} - -NTSTATUS -ResFindDataEntryFromImage ( - _In_opt_ PVOID ImageBase, - _In_opt_ ULONG ImageSize, - _In_ USHORT DirectoryId, - _In_ PUSHORT EntryId, - _In_ PWCHAR Name, - _Out_ PIMAGE_RESOURCE_DATA_ENTRY *DataEntryOut, - _Out_ PVOID* ResourceOut - ) -{ - NTSTATUS Status; - PIMAGE_SECTION_HEADER ResourceSection; - PIMAGE_RESOURCE_DIRECTORY ResourceDir, RootDir; - PIMAGE_RESOURCE_DIRECTORY_ENTRY DirEntry; - PIMAGE_RESOURCE_DATA_ENTRY DataEntry; - PVOID Data, DataEnd, ImageEnd; - BOOLEAN UseFallbackDirectory; - - /* Assume nothing found */ - UseFallbackDirectory = TRUE; - Status = STATUS_NOT_FOUND; - - /* Are we looking at a particular image? */ - if (ImageBase) - { - /* Then make sure we know its size */ - if (!ImageSize) - { - return Status; - } - - /* Find the resource section for it */ - ResourceSection = BlImgFindSection(ImageBase, ImageSize); - if (!ResourceSection) - { - return STATUS_INVALID_IMAGE_FORMAT; - } - - /* Remember how big the image is, and find the resource directory */ - ImageEnd = (PVOID)((ULONG_PTR)ImageBase + ImageSize); - RootDir = (PIMAGE_RESOURCE_DIRECTORY)((ULONG_PTR)ImageBase + - ResourceSection->VirtualAddress); - if ((PVOID)RootDir < ImageBase) - { - /* It's out of bounds, so bail out */ - return STATUS_INVALID_PARAMETER; - } - - /* We have a valid directory, don't use fallback for now */ - UseFallbackDirectory = FALSE; - } - else - { - /* We are using the current library settings instead */ - ImageBase = ResPeImageBase; - RootDir = ResRootDirectory; - ImageEnd = ResPeImageEnd; - } - - /* If we don't have a resource directory, there's nothing to find */ - if (!RootDir) - { - return Status; - } - - /* Try two loops, once for primary, once for fallback */ - while (1) - { - /* Find the directory first */ - ResourceDir = (PIMAGE_RESOURCE_DIRECTORY)ResFindDirectoryEntry(RootDir, - &DirectoryId, - NULL, - (ULONG_PTR)RootDir); - if (ResourceDir) - { - break; - } - - /* We didn't find it -- is it time to use the fallback? */ - if (UseFallbackDirectory) - { - /* Were were not using the fallback already? */ - if (RootDir != ResRootDirectoryFallback) - { - /* Then attempt with the fallback instead*/ - RootDir = ResRootDirectoryFallback; - ImageBase = ResPeImageBaseFallback; - ImageEnd = ResPeImageEndFallback; - - /* Making sure we have one... */ - if (RootDir) - { - continue; - } - } - } - - /* Otherwise, return failure here */ - return Status; - } - - /* Now that we are in the right directory, lookup the resource */ - ResourceDir = (PIMAGE_RESOURCE_DIRECTORY)ResFindDirectoryEntry(ResourceDir, - EntryId, - Name, - (ULONG_PTR)RootDir); - if (!ResourceDir) - { - return Status; - } - - /* The entry is right after */ - DirEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(ResourceDir + 1); - if ((PVOID)DirEntry < (PVOID)ResourceDir) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the data entry for it */ - DataEntry = (PIMAGE_RESOURCE_DATA_ENTRY)((ULONG_PTR)RootDir + - DirEntry->OffsetToData); - - /* Check if the data entry is out of bounds */ - if (((PVOID)DataEntry < ImageBase) || ((PVOID)DataEntry > ImageEnd)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Finally read the data offset */ - Data = (PVOID)((ULONG_PTR)ImageBase + DataEntry->OffsetToData); - - /* Check if the data is out of bounds */ - if (((PVOID)Data < ImageBase) || ((PVOID)Data > ImageEnd)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Make sure the data end isn't out of bounds either */ - DataEnd = (PVOID)((ULONG_PTR)Data + DataEntry->Size); - if (((PVOID)DataEnd < ImageBase) || ((PVOID)DataEnd > ImageEnd)) - { - return STATUS_INVALID_PARAMETER; - } - - /* We finally made it. Return the entry and the raw data */ - *DataEntryOut = DataEntry; - *ResourceOut = Data; - return STATUS_SUCCESS; -} - -PWCHAR -BlResourceFindHtml ( - VOID - ) -{ - NTSTATUS Status; - PIMAGE_RESOURCE_DATA_ENTRY HtmlDataEntry; - PWCHAR Stylesheet; - - /* Assume failure */ - Stylesheet = NULL; - - /* Look for an RT_HTML resource called BOOTMGR.XSL */ - Status = ResFindDataEntryFromImage(NULL, - 0, - 23, - NULL, - L"BOOTMGR.XSL", - &HtmlDataEntry, - (PVOID*)&Stylesheet); - if (!NT_SUCCESS(Status)) - { - return Stylesheet; - } - - /* Check for Unicode BOM */ - if (*Stylesheet == 0xFEFF) - { - /* Overwrite it, and NULL-terminate */ - RtlMoveMemory(Stylesheet, - Stylesheet + 1, - HtmlDataEntry->Size - sizeof(WCHAR)); - Stylesheet[(HtmlDataEntry->Size / sizeof(WCHAR)) - 1] = UNICODE_NULL; - } - else if (Stylesheet[(HtmlDataEntry->Size / sizeof(WCHAR)) - 1] != UNICODE_NULL) - { - /* If it's not NULL-terminated, fail */ - Stylesheet = NULL; - } - - /* Return it back */ - return Stylesheet; -} - -PWCHAR -BlResourceFindMessage ( - _In_ ULONG MsgId - ) -{ - PWCHAR Message; - PIMAGE_RESOURCE_DIRECTORY ResourceDir; - PIMAGE_RESOURCE_DATA_ENTRY DataEntry; - PMESSAGE_RESOURCE_DATA MsgData; - PMESSAGE_RESOURCE_ENTRY MsgEntry; - ULONG i, j; - USHORT Id; - PVOID MsgEnd; - NTSTATUS Status; - - /* Bail out if there's no resource directory */ - Message = NULL; - if (!ResRootDirectory) - { - return Message; - } - - /* Check if we've loaded fonts already */ - if (!ResLoadedFontFiles) - { - /* Nope, load them now */ - Status = BfLoadDeferredFontFiles(); - if (!NT_SUCCESS(Status)) - { - /* We failed to load fonts, fallback to fallback locale */ - Status = ResSelectLocale(FALSE); - if (NT_SUCCESS(Status)) - { - /* Try fonts now */ - Status = BfLoadDeferredFontFiles(); - if (!NT_SUCCESS(Status)) - { - /* Still didn't work -- fallback to text mode */ - EfiPrintf(L"Font loading failed, falling back to text mode\r\n"); - Status = BlDisplaySetScreenResolution(); - if (!NT_SUCCESS(Status)) - { - /* That didn't work either. F*ck it. */ - return Message; - } - } - } - } - - /* Now we have a resource directory, and fonts are loaded */ - NT_ASSERT(ResRootDirectory != NULL); - ResLoadedFontFiles = TRUE; - } - - /* Go look for RT_MESSAGETABLE */ - Id = 11; - ResourceDir = (PIMAGE_RESOURCE_DIRECTORY)ResFindDirectoryEntry(ResRootDirectory, - &Id, - NULL, - (ULONG_PTR)ResRootDirectory); - if (!ResourceDir) - { - return Message; - } - - /* Go look for the first directory in the table */ - Id = 1; - ResourceDir = (PIMAGE_RESOURCE_DIRECTORY)ResFindDirectoryEntry(ResourceDir, - &Id, - NULL, - (ULONG_PTR)ResRootDirectory); - if (!ResourceDir) - { - return Message; - } - - /* Go look for any language entry in the table */ - Id = -1; - DataEntry = (PIMAGE_RESOURCE_DATA_ENTRY)ResFindDirectoryEntry(ResourceDir, - &Id, - NULL, - (ULONG_PTR)ResRootDirectory); - if (!DataEntry) - { - return Message; - } - - /* Get the message data*/ - MsgData = (PMESSAGE_RESOURCE_DATA)((ULONG_PTR)ResRootDirectory + - DataEntry->OffsetToData - - ResRootDirectoryOffset); - - /* Loop through the message blocks */ - for (j = 0; j < MsgData->NumberOfBlocks; j++) - { - /* Check if the ID is within this range */ - if ((MsgId >= MsgData->Blocks[j].LowId) && - (MsgId <= MsgData->Blocks[j].HighId)) - { - /* Get the first entry */ - MsgEntry = (PMESSAGE_RESOURCE_ENTRY)((ULONG_PTR)MsgData + - MsgData->Blocks[j].OffsetToEntries); - - /* Loop till we find the right one */ - for (i = MsgId - MsgData->Blocks[j].LowId; i; --i) - { - MsgEntry = (PMESSAGE_RESOURCE_ENTRY)((ULONG_PTR)MsgEntry + - MsgEntry->Length); - } - - /* Find where this message ends */ - MsgEnd = (PVOID)((ULONG_PTR)MsgEntry + MsgEntry->Length); - - /* Now make sure that the message is within bounds */ - if ((MsgEnd >= (PVOID)MsgEntry) && - ((PVOID)MsgEntry >= ResPeImageBase) && - (MsgEnd <= ResPeImageEnd)) - { - /* If so, read the text associated with it */ - Message = (PWCHAR)MsgEntry->Text; - break; - } - } - } - - /* Return the text, if one was found */ - return Message; -} - -NTSTATUS -BlpResourceInitialize ( - VOID - ) -{ - NTSTATUS Status; - PIMAGE_SECTION_HEADER ResourceSection; - PVOID ImageBase; - ULONG ImageSize, VRes, HRes; - BOOLEAN UsePrimary; - - /* Default to using fallback */ - UsePrimary = FALSE; - - /* Initialize all globals */ - ResMuiImageBase = 0; - ResMuiImageSize = 0; - ResRootDirectoryPrimary = 0; - ResRootDirectoryPrimaryOffset = 0; - ResPeImageBasePrimary = 0; - ResPeImageEndPrimary = 0; - ResRootDirectoryFallback = 0; - ResRootDirectoryFallbackOffset = 0; - ResPeImageBaseFallback = 0; - ResPeImageEndFallback = 0; - ResRootDirectory = 0; - ResRootDirectoryOffset = 0; - ResPeImageBase = 0; - ResPeImageEnd = 0; - ResLoadedFontFiles = 0; - - /* Check if we had allocated a locale already */ - if (ResLocale) - { - /* Free it and reset */ - BlMmFreeHeap(ResLocale); - ResLocale = 0; - } - - /* Get our base address and size*/ - Status = BlGetApplicationBaseAndSize(&ImageBase, &ImageSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Find our resource section */ - ResourceSection = BlImgFindSection(ImageBase, ImageSize); - if (ResourceSection) - { - /* The resource section will be our fallback. Save down its details */ - ResRootDirectoryFallbackOffset = ResourceSection->VirtualAddress; - ResPeImageBaseFallback = ImageBase; - ResPeImageEndFallback = (PVOID)((ULONG_PTR)ImageBase + ImageSize); - ResRootDirectoryFallback = (PIMAGE_RESOURCE_DIRECTORY)((ULONG_PTR)ImageBase + - ResRootDirectoryFallbackOffset); - } - - /* Get the current screen resolution and check if we're in graphics mode */ - Status = BlDisplayGetScreenResolution(&HRes, &VRes); - if ((NT_SUCCESS(Status)) && ((HRes != 640) || (VRes != 200))) - { - /* We are... we should load MUI data */ - Status = STATUS_NOT_IMPLEMENTED;//ResInitializeMuiResources(); - if (NT_SUCCESS(Status)) - { - /* And not rely on the fallback */ - UsePrimary = TRUE; - } - } - - /* Load the locale resources */ - return ResSelectLocale(UsePrimary); -} diff --git a/boot/environ/lib/misc/rtlcompat.c b/boot/environ/lib/misc/rtlcompat.c deleted file mode 100644 index cdb516b4a89..00000000000 --- a/boot/environ/lib/misc/rtlcompat.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -* COPYRIGHT: See COPYING.ARM in the top level directory -* PROJECT: ReactOS UEFI Boot Manager -* FILE: boot/environ/lib/misc/rtlcompat.c -* PURPOSE: RTL Library Compatibility Routines -* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* FUNCTIONS *****************************************************************/ - -#if DBG -VOID FASTCALL -CHECK_PAGED_CODE_RTL ( - char *file, - int line - ) -{ - // boot-code is always ok -} -#endif - -#ifdef _WIN64 -PVOID MmHighestUserAddress = (PVOID)0xFFFFFFFFULL; // CHECKME -#else -PVOID MmHighestUserAddress = (PVOID)0xFFFFFFFF; -#endif - -PVOID -NTAPI -RtlpAllocateMemory ( - _In_ ULONG Bytes, - _In_ ULONG Tag - ) -{ - UNREFERENCED_PARAMETER(Tag); - return BlMmAllocateHeap(Bytes); -} - -VOID -NTAPI -RtlpFreeMemory ( - _In_ PVOID Mem, - _In_ ULONG Tag - ) -{ - UNREFERENCED_PARAMETER(Tag); - BlMmFreeHeap(Mem); -} - -NTSTATUS -NTAPI -RtlpSafeCopyMemory ( - _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination, - _In_reads_bytes_(Length) CONST VOID UNALIGNED *Source, - _In_ SIZE_T Length - ) -{ - RtlCopyMemory(Destination, Source, Length); - return STATUS_SUCCESS; -} - -VOID -NTAPI -RtlAssert ( - IN PVOID FailedAssertion, - IN PVOID FileName, - IN ULONG LineNumber, - IN PCHAR Message OPTIONAL - ) -{ - if (Message != NULL) - { - EfiPrintf(L"*** ASSERTION \'%S\' FAILED AT line %lu in %S (%S) ***\r\n", - (PCHAR)FailedAssertion, - LineNumber, - (PCHAR)FileName, - Message); - } - else - { - EfiPrintf(L"*** ASSERTION \'%S\' FAILED AT line %lu in %S ***\r\n", - (PCHAR)FailedAssertion, - LineNumber, - (PCHAR)FileName); - } - - /* Issue a breakpoint */ - __debugbreak(); -} - -ULONG -DbgPrint ( - const char *Format, - ... - ) -{ - EfiPrintf(L"%S\r\n", Format); - return 0; -} - -// FIXME: DECLSPEC_NORETURN -VOID -NTAPI -KeBugCheckEx( - _In_ ULONG BugCheckCode, - _In_ ULONG_PTR BugCheckParameter1, - _In_ ULONG_PTR BugCheckParameter2, - _In_ ULONG_PTR BugCheckParameter3, - _In_ ULONG_PTR BugCheckParameter4) -{ - __assume(0); -} diff --git a/boot/environ/lib/misc/util.c b/boot/environ/lib/misc/util.c deleted file mode 100644 index da0cae92792..00000000000 --- a/boot/environ/lib/misc/util.c +++ /dev/null @@ -1,983 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/misc/util.c - * PURPOSE: Boot Library Utility Functions - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PRSDT UtlRsdt; -PXSDT UtlXsdt; - -PVOID UtlMcContext; -PVOID UtlMcDisplayMessageRoutine; -PVOID UtlMcUpdateMessageRoutine; - -PVOID UtlProgressRoutine; -PVOID UtlProgressContext; -PVOID UtlProgressInfoRoutine; -ULONG UtlProgressGranularity; -ULONG UtlCurrentPercentComplete; -ULONG UtlNextUpdatePercentage; -BOOLEAN UtlProgressNeedsInfoUpdate; -PVOID UtlProgressInfo; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BlUtlGetAcpiTable ( - _Out_ PVOID* TableAddress, - _In_ ULONG Signature - ) -{ - ULONG i, TableCount, HeaderLength; - NTSTATUS Status; - PRSDT Rsdt; - PXSDT Xsdt; - PHYSICAL_ADDRESS PhysicalAddress; - PDESCRIPTION_HEADER Header; - - Header = 0; - - /* Make sure there's an output parameter */ - if (!TableAddress) - { - return STATUS_INVALID_PARAMETER; - } - - /* Get the currently known RSDT and XSDT */ - Rsdt = (PRSDT)UtlRsdt; - Xsdt = (PXSDT)UtlXsdt; - - /* Is there an RSDT? */ - if (!Rsdt) - { - /* No -- is there an XSDT? */ - if (!Xsdt) - { - /* No. Look up the RSDT */ - Status = EfipGetRsdt(&PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"no rsdp found\r\n"); - return Status; - } - - /* Map the header */ - Status = BlMmMapPhysicalAddressEx((PVOID)&Header, - 0, - sizeof(*Header), - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Unmap the header */ - BlMmUnmapVirtualAddressEx(Header, sizeof(*Header)); - - /* Map the whole table */ - Status = BlMmMapPhysicalAddressEx((PVOID)&Header, - 0, - Header->Length, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Check if its an XSDT or an RSDT */ - if (Header->Signature == XSDT_SIGNATURE) - { - /* It's an XSDT */ - Xsdt = (PXSDT)Header; - UtlXsdt = Xsdt; - } - else - { - /* It's an RSDT */ - Rsdt = (PRSDT)Header; - UtlRsdt = Rsdt; - } - } - } - - /* OK, so do we have an XSDT after all? */ - if (Xsdt) - { - /* Yes... how big is it? */ - HeaderLength = Xsdt->Header.Length; - if (HeaderLength >= sizeof(*Header)) - { - HeaderLength = sizeof(*Header); - } - - /* Based on that, how many tables are there? */ - TableCount = (Xsdt->Header.Length - HeaderLength) / sizeof(PHYSICAL_ADDRESS); - } - else - { - /* Nope, we have an RSDT. How big is it? */ - HeaderLength = Rsdt->Header.Length; - if (HeaderLength >= sizeof(*Header)) - { - HeaderLength = sizeof(*Header); - } - - /* Based on that, how many tables are there? */ - TableCount = (Rsdt->Header.Length - HeaderLength) / sizeof(ULONG); - } - - /* Loop through the ACPI tables */ - for (i = 0; i < TableCount; i++) - { - /* For an XSDT, read the 64-bit address directly */ - if (Xsdt) - { - PhysicalAddress = Xsdt->Tables[i]; - } - else - { - /* For RSDT, cast it */ - PhysicalAddress.QuadPart = Rsdt->Tables[i]; - } - - /* Map the header */ - Status = BlMmMapPhysicalAddressEx((PVOID)&Header, - 0, - sizeof(*Header), - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Is it the right one? */ - if (Header->Signature == Signature) - { - /* Unmap the header */ - BlMmUnmapVirtualAddressEx(Header, sizeof(*Header)); - - /* Map the whole table */ - return BlMmMapPhysicalAddressEx(TableAddress, - 0, - Header->Length, - PhysicalAddress); - } - } - - /* Requested table does not exist */ - return STATUS_NOT_FOUND; -} - - -VOID -BlUtlUpdateProgress ( - _In_ ULONG Percentage, - _Out_opt_ PBOOLEAN Completed - ) -{ - if (UtlProgressRoutine) - { - EfiPrintf(L"Unimplemented\r\n"); - } - else if (*Completed) - { - *Completed = TRUE; - } -} - -NTSTATUS -BlUtlInitialize ( - VOID - ) -{ - UtlRsdt = 0; - UtlXsdt = 0; - - UtlMcContext = 0; - UtlMcDisplayMessageRoutine = 0; - UtlMcUpdateMessageRoutine = 0; - - UtlProgressRoutine = 0; - UtlProgressContext = 0; - UtlProgressInfoRoutine = 0; - UtlProgressGranularity = 0; - UtlCurrentPercentComplete = 0; - UtlNextUpdatePercentage = 0; - UtlProgressNeedsInfoUpdate = 0; - UtlProgressInfo = 0; - - return STATUS_SUCCESS; -} - -VOID -BmUpdateProgressInfo ( - _In_ PVOID Unknown, - _In_ PWCHAR ProgressInfo - ) -{ - EfiPrintf(L"Progress Info: %s\r\n", ProgressInfo); -} - -VOID -BmUpdateProgress ( - _In_ PVOID Unknown, - _In_ ULONG Percent, - _Out_ PBOOLEAN Completed - ) -{ - EfiPrintf(L"Progress: %d\r\n", Percent); - if (Completed) - { - *Completed = TRUE; - } -} - -NTSTATUS -BlUtlRegisterProgressRoutine ( - VOID - ) -{ - /* One shouldn't already exist */ - if (UtlProgressRoutine) - { - return STATUS_UNSUCCESSFUL; - } - - /* Set the routine, and no context */ - UtlProgressRoutine = BmUpdateProgress; - UtlProgressContext = NULL; - - /* Progress increases by one */ - UtlProgressGranularity = 1; - - /* Set progress to zero for now */ - UtlCurrentPercentComplete = 0; - UtlNextUpdatePercentage = 0; - - /* Set the info routine if there is one */ - UtlProgressInfoRoutine = BmUpdateProgressInfo; - - /* All good */ - return STATUS_SUCCESS; -} - -PVOID -BlTblFindEntry ( - _In_ PVOID *Table, - _In_ ULONG Count, - _Out_ PULONG EntryIndex, - _In_ PBL_TBL_LOOKUP_ROUTINE Callback, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ) -{ - PVOID Entry = NULL; - ULONG Index; - BOOLEAN Result; - - /* Check for invalid parameters */ - if (!(Table) || !(EntryIndex)) - { - return Entry; - } - - /* Loop each entry in the table */ - for (Index = 0; Index < Count; Index++) - { - /* Check if this entry is filled out */ - if (Table[Index]) - { - /* Call the comparison function */ - Result = Callback(Table[Index], - Argument1, - Argument2, - Argument3, - Argument4); - if (Result) - { - /* Entry found return it */ - *EntryIndex = Index; - Entry = Table[Index]; - break; - } - } - } - - /* Return the entry that was (or wasn't) found */ - return Entry; -} - -NTSTATUS -BlTblSetEntry ( - _Inout_ PVOID** Table, - _Inout_ PULONG Count, - _In_ PVOID Entry, - _Out_ PULONG EntryIndex, - _In_ PBL_TBL_SET_ROUTINE Callback - ) -{ - ULONG NewCount; - NTSTATUS Status = STATUS_SUCCESS; - ULONG Index = 0; - PVOID* NewTable; - - /* Make sure all the parameters were specified */ - if (!(Table) || !(*Table) || !(Count) || !(Callback)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Read the current table */ - NewTable = *Table; - NewCount = *Count; - - /* Iterate over it */ - while (Index < NewCount) - { - /* Look for a free index */ - if (!NewTable[Index]) - { - goto SetIndex; - } - - /* No free index yet, keep going */ - ++Index; - } - - /* No free index was found, try to purge some entries */ - Index = 0; - while (Index < NewCount) - { - /* Call each purge callback, trying to make space */ - Status = Callback(NewTable[Index]); - if (NT_SUCCESS(Status)) - { - /* We should have this slot available now */ - goto SetIndex; - } - - /* Keep trying to purge more */ - ++Index; - } - - /* Double the table */ - NewTable = BlMmAllocateHeap(2 * sizeof(PVOID) * NewCount); - if (!NewTable) - { - return STATUS_NO_MEMORY; - } - - /* Clear the new table, and copy the old entries */ - RtlZeroMemory(&NewTable[NewCount], sizeof(PVOID) * NewCount); - RtlCopyMemory(NewTable, *Table, sizeof(PVOID) * NewCount); - - /* Free the old table */ - BlMmFreeHeap(*Table); - - /* Return the new table and count */ - *Count = 2 * NewCount; - *Table = NewTable; - -SetIndex: - /* Set the index and return */ - NewTable[Index] = Entry; - *EntryIndex = Index; - return Status; -} - -NTSTATUS -BlTblMap ( - _In_ PVOID *Table, - _In_ ULONG Count, - _In_ PBL_TBL_MAP_ROUTINE MapCallback - ) -{ - NTSTATUS Status, LocalStatus; - PVOID Entry; - ULONG Index; - - /* Bail out if there's no table */ - if (!Table) - { - return STATUS_INVALID_PARAMETER; - } - - /* Assume success and loop each index */ - Status = STATUS_SUCCESS; - for (Index = 0; Index < Count; Index++) - { - /* See if an entry exists at this index */ - Entry = Table[Index]; - if (Entry) - { - /* Call the map routine for this entry */ - LocalStatus = MapCallback(Entry, Index); - if (!NT_SUCCESS(LocalStatus)) - { - /* Propagate failure only */ - Status = LocalStatus; - } - } - } - - /* Return status to caller */ - return Status; -} - -ULONG HtTableSize; -PBL_HASH_TABLE* HtTableArray; -ULONG HtTableEntries; - -ULONG -DefaultHashFunction ( - _In_ PBL_HASH_ENTRY Entry, - _In_ ULONG TableSize - ) -{ - PUCHAR Value; - ULONG KeyHash, i; - - /* Check if the value is a pointer, or embedded inline */ - Value = (Entry->Flags & BL_HT_VALUE_IS_INLINE) ? Entry->Value : (PUCHAR)&Entry->Value; - - /* Iterate over each byte, and sum it */ - for (i = 0, KeyHash = 0; i < Entry->Size; i++) - { - KeyHash += Value[i++]; - } - - /* Modulo the number of buckets */ - return KeyHash % TableSize; -} - -BOOLEAN -HtpCompareKeys ( - _In_ PBL_HASH_ENTRY Entry1, - _In_ PBL_HASH_ENTRY Entry2 - ) -{ - ULONG Flags; - BOOLEAN ValueMatch; - - /* Check if the flags or sizes are not matching */ - Flags = Entry1->Flags; - if ((Entry1->Size != Entry2->Size) || (Flags != Entry2->Flags)) - { - ValueMatch = FALSE; - } - else if (Flags & BL_HT_VALUE_IS_INLINE) - { - /* Check if this is an in-line value, compare it */ - ValueMatch = Entry1->Value == Entry2->Value; - } - else - { - /* This is a pointer value, compare it */ - ValueMatch = (RtlCompareMemory(Entry1->Value, Entry2->Value, Entry1->Size) == - Entry1->Size); - } - - /* Return if it matched */ - return ValueMatch; -} - -NTSTATUS -TblDoNotPurgeEntry ( - _In_ PVOID Entry - ) -{ - /* Never purge this entry */ - return STATUS_UNSUCCESSFUL; -} - -NTSTATUS -BlHtCreate ( - _In_ ULONG Size, - _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction, - _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction, - _Out_ PULONG Id - ) -{ - NTSTATUS Status; - PBL_HASH_TABLE HashTable; - ULONG i; - - /* Assume failure */ - HashTable = NULL; - - /* Can't create a table with no ID */ - if (!Id) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if we don't already have a hash table table */ - if (!HtTableSize) - { - /* Allocate it and zero it out */ - HtTableSize = 4; - HtTableArray = BlMmAllocateHeap(HtTableSize * sizeof(PVOID)); - if (!HtTableArray) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - RtlZeroMemory(HtTableArray, HtTableSize * sizeof(PVOID)); - HtTableEntries = 0; - } - - /* Allocate the hash table */ - HashTable = BlMmAllocateHeap(sizeof(*HashTable)); - if (!HashTable) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Fill it out */ - HashTable->HashFunction = HashFunction ? HashFunction : DefaultHashFunction; - HashTable->CompareFunction = CompareFunction ? CompareFunction : HtpCompareKeys; - HashTable->Size = Size ? Size : 13; - - /* Allocate the hash links, one for each bucket */ - HashTable->HashLinks = BlMmAllocateHeap(sizeof(LIST_ENTRY) * HashTable->Size); - if (!HashTable->HashLinks) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Initialize the hash links */ - for (i = 0; i < HashTable->Size; i++) - { - InitializeListHead(&HashTable->HashLinks[i]); - } - - /* Save us in the table of hash tables */ - Status = BlTblSetEntry((PVOID**)&HtTableArray, - &Size, - HashTable, - Id, - TblDoNotPurgeEntry); - if (NT_SUCCESS(Status)) - { - /* One more -- we're done */ - ++HtTableEntries; - return Status; - } - -Quickie: - /* Check if we just allocated the table array now */ - if (!(HtTableEntries) && (HtTableArray)) - { - /* Free it */ - BlMmFreeHeap(HtTableArray); - HtTableArray = NULL; - HtTableSize = 0; - } - - /* Check if we allocated a hash table*/ - if (HashTable) - { - /* With links? */ - if (HashTable->HashLinks) - { - /* Free them */ - BlMmFreeHeap(HashTable->HashLinks); - } - - /* Free the table*/ - BlMmFreeHeap(HashTable); - } - - /* We're done */ - return Status; -} - -NTSTATUS -BlHtLookup ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry, - _Out_opt_ PBL_HASH_VALUE *Value - ) -{ - PBL_HASH_TABLE HashTable; - ULONG HashValue; - NTSTATUS Status; - PLIST_ENTRY HashLinkHead, HashLink; - PBL_HASH_NODE HashNode; - - /* Check if the table ID is invalid, or we have no entry, or it's malformed */ - if ((HtTableSize <= TableId) || - !(Entry) || - ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG)))) - { - /* Fail */ - Status = STATUS_INVALID_PARAMETER; - } - else - { - /* Otherwise, get the hash table for this index */ - HashTable = HtTableArray[TableId]; - - /* Get the hash bucket */ - HashValue = HashTable->HashFunction(Entry, HashTable->Size); - - /* Start iterating each entry in the bucket, assuming failure */ - Status = STATUS_NOT_FOUND; - HashLinkHead = &HashTable->HashLinks[HashValue]; - HashLink = HashLinkHead->Flink; - while (HashLink != HashLinkHead) - { - /* Get a node in this bucket, and compare the value */ - HashNode = CONTAINING_RECORD(HashLink, BL_HASH_NODE, ListEntry); - if (HashTable->CompareFunction(&HashNode->Entry, Entry)) - { - /* Does the caller want the value? */ - if (Value) - { - /* Return it */ - *Value = &HashNode->Value; - } - - /* Return success and stop scanning */ - Status = STATUS_SUCCESS; - break; - } - - /* Try the next node */ - HashLink = HashLink->Flink; - } - } - - /* Return back to the caller */ - return Status; -} - -NTSTATUS -BlHtStore ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry, - _In_ PVOID Data, - _In_ ULONG DataSize - ) -{ - PBL_HASH_NODE HashNode; - NTSTATUS Status; - PLIST_ENTRY HashLinkHead; - PBL_HASH_TABLE HashTable; - - /* Check for invalid table ID, missing arguments, or malformed entry */ - if ((HtTableSize <= TableId) || - !(Entry) || - !(Data) || - !(Entry->Size) || - !(Entry->Value) || - !(DataSize) || - ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG)))) - { - /* Fail the call */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Get the hash table for this ID */ - HashTable = HtTableArray[TableId]; - - /* Allocate a hash node */ - HashNode = BlMmAllocateHeap(sizeof(*HashNode)); - if (!HashNode) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Capture all the data*/ - HashNode->Entry.Size = Entry->Size; - HashNode->Entry.Flags = Entry->Flags; - HashNode->Entry.Value = Entry->Value; - HashNode->Value.DataSize = DataSize; - HashNode->Value.Data = Data; - - /* Insert it into the bucket list and return success */ - HashLinkHead = &HashTable->HashLinks[HashTable->HashFunction(Entry, HashTable->Size)]; - InsertTailList(HashLinkHead, &HashNode->ListEntry); - Status = STATUS_SUCCESS; - -Quickie: - return Status; -} - -NTSTATUS -BlHtDelete ( - _In_ ULONG TableId, - _In_ PBL_HASH_ENTRY Entry - ) -{ - PBL_HASH_TABLE HashTable; - ULONG HashValue; - NTSTATUS Status; - PLIST_ENTRY HashLinkHead, HashLink; - PBL_HASH_NODE HashNode; - - /* Check if the table ID is invalid, or we have no entry, or it's malformed */ - if ((HtTableSize <= TableId) || - !(Entry) || - !(Entry->Size) || - !(Entry->Value) || - ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG)))) - { - /* Fail */ - Status = STATUS_INVALID_PARAMETER; - } - else - { - /* Otherwise, get the hash table for this index */ - HashTable = HtTableArray[TableId]; - - /* Get the hash bucket */ - HashValue = HashTable->HashFunction(Entry, HashTable->Size); - - /* Start iterating each entry in the bucket, assuming failure */ - Status = STATUS_NOT_FOUND; - HashLinkHead = &HashTable->HashLinks[HashValue]; - HashLink = HashLinkHead->Flink; - while (HashLink != HashLinkHead) - { - /* Get a node in this bucket, and compare the value */ - HashNode = CONTAINING_RECORD(HashLink, BL_HASH_NODE, ListEntry); - if (HashTable->CompareFunction(&HashNode->Entry, Entry)) - { - /* Remove it from the list and free it */ - RemoveEntryList(&HashNode->ListEntry); - BlMmFreeHeap(HashNode); - return STATUS_SUCCESS; - } - - /* Try the next node */ - HashLink = HashLink->Flink; - } - } - - /* Return back to the caller */ - return Status; -} - -ULONG -BlUtlCheckSum ( - _In_ ULONG PartialSum, - _In_ PUCHAR Buffer, - _In_ ULONG Length, - _In_ ULONG Flags - ) -{ - ULONG i; - - if (Flags & BL_UTL_CHECKSUM_UCHAR_BUFFER) - { - EfiPrintf(L"Not supported\r\n"); - return 0; - } - else if (Flags & BL_UTL_CHECKSUM_USHORT_BUFFER) - { - PartialSum = (unsigned __int16)PartialSum; - Length &= ~1; - - for (i = 0; i < Length; i += 2) - { - PartialSum += *(unsigned __int16 *)&Buffer[i]; - if (Flags & BL_UTL_CHECKSUM_COMPLEMENT) - { - PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); - } - } - - if (i != Length) - { - PartialSum += (unsigned __int8)Buffer[Length]; - if (Flags & BL_UTL_CHECKSUM_COMPLEMENT) - { - PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum); - } - } - - if (Flags & BL_UTL_CHECKSUM_NEGATE) - { - return ~PartialSum; - } - - PartialSum = (unsigned __int16)PartialSum; - } - else - { - /* Invalid mode */ - return 0; - } - - if (Flags & BL_UTL_CHECKSUM_NEGATE) - { - return ~PartialSum; - } - - return PartialSum; -} - -#if defined(_M_IX86) || defined(_M_X64) -BOOLEAN -Archx86IsCpuidSupported ( - VOID - ) -{ - ULONG CallerFlags, Flags; - - /* Read the original flags, and add the CPUID bit */ - CallerFlags = __readeflags() ^ 0x200000; - __writeeflags(CallerFlags); - - /* Read our flags now */ - Flags = __readeflags(); - - /* Check if the bit stuck */ - return (((CallerFlags ^ Flags) >> 21) & 1) ^ 1; -} -#endif - -BOOLEAN -BlArchIsCpuIdFunctionSupported ( - _In_ ULONG Function - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - BOOLEAN Supported; - INT CpuInfo[4]; - - /* Check if the CPU supports this instruction */ - Supported = Archx86IsCpuidSupported(); - if (!Supported) - { - return FALSE; - } - - /* Check if it's the extended function */ - if (Function >= 0x80000000) - { - /* Check if extended functions are supported */ - __cpuid(CpuInfo, 0x80000000); - if ((CpuInfo[0] & 0xFFFFFF00) != 0x80000000) - { - /* Nope */ - return FALSE; - } - } - else - { - /* It's a regular function, get the maximum one supported */ - __cpuid(CpuInfo, 0); - } - - /* Check if our function is within bounds */ - if (Function <= CpuInfo[0]) - { - return TRUE; - } -#else - EfiPrintf(L"BlArchIsCpuIdFunctionSupported not implemented for this platform.\r\n"); -#endif - - /* Nope */ - return FALSE; -} - -ULONGLONG -BlArchGetPerformanceCounter ( - VOID - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - CPU_INFO CpuInfo; - - /* Serialize with CPUID, if it exists */ - if (Archx86IsCpuidSupported()) - { - BlArchCpuId(0, 0, &CpuInfo); - } - - /* Read the TSC */ - return __rdtsc(); -#else - EfiPrintf(L"BlArchGetPerformanceCounter not implemented for this platform.\r\n"); - return 0; -#endif -} - -VOID -BlArchCpuId ( - _In_ ULONG Function, - _In_ ULONG SubFunction, - _Out_ PCPU_INFO Result - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - /* Use the intrinsic */ - __cpuidex((INT*)Result->AsUINT32, Function, SubFunction); -#endif -} - -CPU_VENDORS -BlArchGetCpuVendor ( - VOID - ) -{ - CPU_INFO CpuInfo; - INT Temp; - - /* Get the CPU Vendor */ - BlArchCpuId(0, 0, &CpuInfo); -#if defined(_M_IX86) || defined(_M_X64) - Temp = CpuInfo.Ecx; - CpuInfo.Ecx = CpuInfo.Edx; - CpuInfo.Edx = Temp; - - /* Check against supported values */ - if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineIntel", 12)) - { - return CPU_INTEL; - } - if (!strncmp((PCHAR)&CpuInfo.Ebx, "AuthenticAMD", 12)) - { - return CPU_AMD; - } - if (!strncmp((PCHAR)&CpuInfo.Ebx, "CentaurHauls", 12)) - { - return CPU_VIA; - } -#ifdef _M_IX86 - if (!strncmp((PCHAR)&CpuInfo.Ebx, "CyrixInstead", 12)) - { - return CPU_CYRIX; - } - if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineTMx86", 12)) - { - return CPU_TRANSMETA; - } - if (!strncmp((PCHAR)&CpuInfo.Ebx, "RiseRiseRise", 12)) - { - return CPU_RISE; - } -#endif // _M_IX86 -#else // defined(_M_IX86) || defined(_M_X64) - EfiPrintf(L"BlArchGetCpuVendor not implemented for this platform.\r\n"); -#endif - /* Other */ - return CPU_UNKNOWN; -} diff --git a/boot/environ/lib/mm/blkalloc.c b/boot/environ/lib/mm/blkalloc.c deleted file mode 100644 index 53dae681dd1..00000000000 --- a/boot/environ/lib/mm/blkalloc.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/blkalloc.c - * PURPOSE: Boot Library Memory Manager Block Allocator - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -PVOID* MmBlockAllocatorTable; -ULONG MmBlockAllocatorTableEntries; -BOOLEAN MmBlockAllocatorInitialized; - -typedef struct _BL_BLOCK_DESCRIPTOR -{ - LIST_ENTRY ListHead; - ULONG Unknown; - BL_MEMORY_TYPE Type; - ULONG Attributes; - ULONG Unknown2; - ULONG Count; - ULONG Count2; - ULONG Size; - ULONG BlockId; - ULONG ReferenceCount; -} BL_BLOCK_DESCRIPTOR, *PBL_BLOCK_DESCRIPTOR; - -typedef struct _BL_BLOCK_ENTRY -{ - LIST_ENTRY ListEntry; - ULONG Todo; -} BL_BLOCK_ENTRY, *PBL_BLOCK_ENTRY; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -MmBapCompareBlockAllocatorTableEntry ( - _In_ PVOID Entry, - _In_ PVOID Argument1, - _In_ PVOID Argument2, - _In_ PVOID Argument3, - _In_ PVOID Argument4 - ) -{ - PBL_BLOCK_DESCRIPTOR BlockInfo = (PBL_BLOCK_DESCRIPTOR)Entry; - ULONG BlockId = PtrToUlong(Argument1); - - /* Check if the block ID matches */ - return BlockInfo->BlockId == BlockId; -} - -PBL_BLOCK_DESCRIPTOR -MmBapFindBlockInformation ( - ULONG BlockId - ) -{ - ULONG EntryId; - - /* Find the block that matches */ - EntryId = BlockId; - return BlTblFindEntry(MmBlockAllocatorTable, - MmBlockAllocatorTableEntries, - &EntryId, - MmBapCompareBlockAllocatorTableEntry, - UlongToPtr(EntryId), - NULL, - NULL, - NULL); -} - -NTSTATUS -MmBapFreeBlockAllocatorDescriptor ( - _In_ PBL_BLOCK_DESCRIPTOR BlockInfo, - _In_ PBL_BLOCK_ENTRY BlockEntry - ) -{ - /* @TODO FIXME: Later */ - EfiPrintf(L"Block free not yet implemented\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -BlpMmDeleteBlockAllocator ( - _In_ ULONG BlockId - ) -{ - NTSTATUS Status, LocalStatus; - PBL_BLOCK_DESCRIPTOR BlockInfo; - PLIST_ENTRY ListHead, NextEntry; - PBL_BLOCK_ENTRY BlockEntry; - - /* Nothing to delete if we're not initialized */ - if (!MmBlockAllocatorInitialized) - { - return STATUS_UNSUCCESSFUL; - } - - /* Find the block descriptor */ - BlockInfo = MmBapFindBlockInformation(BlockId); - if (BlockInfo) - { - /* Assume success for now */ - Status = STATUS_SUCCESS; - - /* Do we have at least one reference? */ - if (BlockInfo->ReferenceCount) - { - /* Iterate over the allocated blocks */ - ListHead = &BlockInfo->ListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Free each one */ - BlockEntry = CONTAINING_RECORD(NextEntry, - BL_BLOCK_ENTRY, - ListEntry); - LocalStatus = MmBapFreeBlockAllocatorDescriptor(BlockInfo, - BlockEntry); - if (!NT_SUCCESS(LocalStatus)) - { - /* Remember status on failure only */ - Status = LocalStatus; - } - } - - /* Drop a reference */ - BlockInfo->ReferenceCount--; - } - else - { - /* There aren't any references, so why are we being called? */ - Status = STATUS_INVALID_PARAMETER; - } - } - else - { - /* No block exists with this ID */ - Status = STATUS_UNSUCCESSFUL; - } - - /* Return back */ - return Status; -} - -NTSTATUS -MmBapFreeBlockAllocatorTableEntry ( - _In_ PVOID Entry, - _In_ ULONG Index - ) -{ - PBL_BLOCK_DESCRIPTOR BlockInfo = (PBL_BLOCK_DESCRIPTOR)Entry; - NTSTATUS Status, LocalStatus; - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Check if there was at least one reference */ - if (BlockInfo->ReferenceCount > 1) - { - /* Try to delete the allocator */ - LocalStatus = BlpMmDeleteBlockAllocator(BlockInfo->BlockId); - if (!NT_SUCCESS(LocalStatus)) - { - /* Remember status on failure only */ - Status = LocalStatus; - } - } - - /* Now destroy the allocator's descriptor */ - LocalStatus = BlMmFreeHeap(BlockInfo); - if (!NT_SUCCESS(LocalStatus)) - { - /* Remember status on failure only */ - Status = LocalStatus; - } - - /* Free the entry, and return failure, if any */ - MmBlockAllocatorTable[Index] = NULL; - return Status; -} - -NTSTATUS -MmBapPurgeBlockAllocatorTableEntry ( - _In_ PVOID Entry - ) -{ - PBL_BLOCK_DESCRIPTOR BlockInfo = (PBL_BLOCK_DESCRIPTOR)Entry; - NTSTATUS Status; - - /* Check if there's a reference on the block descriptor */ - if (BlockInfo->ReferenceCount) - { - /* Don't allow purging */ - Status = STATUS_UNSUCCESSFUL; - } - else - { - /* Free the entry */ - Status = MmBapFreeBlockAllocatorTableEntry(BlockInfo, - BlockInfo->BlockId); - } - - /* Return purge status */ - return Status; -} - -NTSTATUS -BlpMmCreateBlockAllocator ( - VOID - ) -{ - PBL_BLOCK_DESCRIPTOR BlockInfo; - ULONG BlockId; - NTSTATUS Status; - - /* If the block allocator isn't initialized, bail out */ - BlockId = -1; - if (!MmBlockAllocatorInitialized) - { - goto Quickie; - } - - /* Allocate a block descriptor and zero it out */ - BlockInfo = BlMmAllocateHeap(sizeof(*BlockInfo)); - if (!BlockInfo) - { - goto Quickie; - } - RtlZeroMemory(BlockInfo, sizeof(*BlockInfo)); - - /* Setup the block descriptor */ - BlockInfo->Attributes = 0; - BlockInfo->Type = BlLoaderBlockMemory; - BlockInfo->Unknown = 1; - BlockInfo->Unknown2 = 1; - BlockInfo->Size = PAGE_SIZE; - BlockInfo->Count = 128; - BlockInfo->Count2 = 128; - InitializeListHead(&BlockInfo->ListHead); - - /* Add it to the list of block descriptors */ - Status = BlTblSetEntry(&MmBlockAllocatorTable, - &MmBlockAllocatorTableEntries, - BlockInfo, - &BlockId, - MmBapPurgeBlockAllocatorTableEntry); - if (NT_SUCCESS(Status)) - { - /* Add the initial reference and store the block ID */ - BlockInfo->ReferenceCount = 1; - BlockInfo->BlockId = BlockId; - } - -Quickie: - /* On failure, free the block descriptor */ - if (BlockId == -1) - { - BlMmFreeHeap(BlockInfo); - } - - /* Return the block descriptor ID, or -1 on failure */ - return BlockId; -} - -NTSTATUS -MmBaInitialize ( - VOID - ) -{ - NTSTATUS Status; - ULONG Size; - - /* Allocate 8 table entries */ - MmBlockAllocatorTableEntries = 8; - Size = sizeof(BL_BLOCK_DESCRIPTOR) * MmBlockAllocatorTableEntries; - MmBlockAllocatorTable = BlMmAllocateHeap(Size); - if (MmBlockAllocatorTable) - { - /* Zero them out -- we're all done */ - Status = STATUS_SUCCESS; - RtlZeroMemory(MmBlockAllocatorTable, Size); - MmBlockAllocatorInitialized = 1; - } - else - { - /* Bail out since we're out of memory */ - Status = STATUS_NO_MEMORY; - MmBlockAllocatorInitialized = 0; - } - - /* Return initialization status */ - return Status; -} diff --git a/boot/environ/lib/mm/descriptor.c b/boot/environ/lib/mm/descriptor.c deleted file mode 100644 index 6c212ed7efe..00000000000 --- a/boot/environ/lib/mm/descriptor.c +++ /dev/null @@ -1,1406 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/descriptor.c - * PURPOSE: Boot Library Memory Manager Descriptor Manager - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -BL_MEMORY_DESCRIPTOR MmStaticMemoryDescriptors[512]; -ULONG MmGlobalMemoryDescriptorCount; -PBL_MEMORY_DESCRIPTOR MmGlobalMemoryDescriptors; -ULONG MmGlobalMemoryDescriptorsUsed; -PBL_MEMORY_DESCRIPTOR MmDynamicMemoryDescriptors; -ULONG MmDynamicMemoryDescriptorCount; - -BL_MEMORY_TYPE MmPlatformMemoryTypePrecedence[] = -{ - BlReservedMemory, - BlUnusableMemory, - BlDeviceIoMemory, - BlDevicePortMemory, - BlPalMemory, - BlEfiRuntimeCodeMemory, - BlEfiRuntimeDataMemory, - BlAcpiNvsMemory, - BlAcpiReclaimMemory, - BlEfiBootMemory, - BlConventionalMemory, - BlConventionalZeroedMemory -}; - -/* FUNCTIONS *****************************************************************/ - -LONG -MmMdpLookupTypePrecedenceIndex ( - _In_ BL_MEMORY_TYPE Type - ) -{ - ULONG i; - - /* Check the precedence array */ - for (i = 0; i < RTL_NUMBER_OF(MmPlatformMemoryTypePrecedence); i++) - { - /* Check for a match */ - if (MmPlatformMemoryTypePrecedence[i] == Type) - { - /* Return the index */ - return i; - } - } - - /* Invalid index type */ - return -1; -} - -/* The order is Conventional > Other > System > Loader > Application */ -BOOLEAN -MmMdpHasPrecedence ( - _In_ BL_MEMORY_TYPE Type1, - _In_ BL_MEMORY_TYPE Type2 - ) -{ - BL_MEMORY_CLASS Class1, Class2; - ULONG i, j; - - /* It isn't free RAM, but the comparator is -- it succeeds it */ - if (Type2 == BlConventionalMemory) - { - return TRUE; - } - - /* Descriptor is free RAM -- it precedes */ - if (Type1 == BlConventionalMemory) - { - return FALSE; - } - - /* Descriptor is not system, application, or loader class -- it precedes */ - Class1 = Type1 >> BL_MEMORY_CLASS_SHIFT; - if ((Class1 != BlSystemClass) && - (Class1 != BlApplicationClass) && - (Class1 != BlLoaderClass)) - { - return TRUE; - } - - /* It isn't one of those classes, but the comparator it -- it succeeds it */ - Class2 = Type2 >> BL_MEMORY_CLASS_SHIFT; - if ((Class2 != BlSystemClass) && - (Class2 != BlApplicationClass) && - (Class2 != BlLoaderClass)) - { - return FALSE; - } - - /* Descriptor is system class */ - if (Class1 == BlSystemClass) - { - /* If the other guy isn't, system wins */ - if (Class2 != BlSystemClass) - { - return TRUE; - } - - /* Scan for the descriptor's system precedence index */ - i = MmMdpLookupTypePrecedenceIndex(Type1); - j = MmMdpLookupTypePrecedenceIndex(Type2); - - /* Does the current have a valid index? */ - if (i == 0xFFFFFFFF) - { - return TRUE; - } - - /* Yes, what about the comparator? */ - if (j == 0xFFFFFFFF) - { - return FALSE; - } - - /* Let the indexes fight! */ - return i <= j; - } - - /* Descriptor is not system class, but comparator is -- it succeeds it */ - if (Class2 == BlSystemClass) - { - return FALSE; - } - - /* Descriptor is loader class -- it preceedes */ - if (Class1 == BlLoaderClass) - { - return TRUE; - } - - /* It isn't loader class -- if the other guy is, succeed it */ - return Class2 != BlLoaderClass; -} - -VOID -MmMdpSwitchToDynamicDescriptors ( - _In_ ULONG Count - ) -{ - EfiPrintf(L"Dynamic switch NOT SUPPORTED!!!\r\n"); - EfiStall(10000000); -} - -NTSTATUS -MmMdFreeDescriptor ( - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor - ) -{ - NTSTATUS Status; - - /* Check if this is a valid static descriptor */ - if (((MmDynamicMemoryDescriptors) && - (MemoryDescriptor >= MmDynamicMemoryDescriptors) && - (MemoryDescriptor < &MmDynamicMemoryDescriptors[MmDynamicMemoryDescriptorCount])) || - ((MemoryDescriptor >= MmStaticMemoryDescriptors) && - (MemoryDescriptor < &MmStaticMemoryDescriptors[RTL_NUMBER_OF(MmStaticMemoryDescriptors)]))) - { - /* It's a global/static descriptor, so just zero it */ - RtlZeroMemory(MemoryDescriptor, sizeof(BL_MEMORY_DESCRIPTOR)); - Status = STATUS_SUCCESS; - } - else - { - /* It's a dynamic descriptor, so free it */ - Status = BlMmFreeHeap(MemoryDescriptor); - } - - /* Done */ - return Status; -} - -VOID -MmMdpSaveCurrentListPointer ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PLIST_ENTRY Current - ) -{ - PBL_MEMORY_DESCRIPTOR FirstEntry, LastEntry; - - /* Make sure that this is not a global descriptor and not the first one */ - FirstEntry = &MmGlobalMemoryDescriptors[0]; - LastEntry = &MmGlobalMemoryDescriptors[MmGlobalMemoryDescriptorCount]; - if ((((ULONG_PTR)Current < (ULONG_PTR)FirstEntry) || - ((ULONG_PTR)Current >= (ULONG_PTR)LastEntry)) && - (Current != MdList->First)) - { - /* Save this as the current pointer */ - MdList->This = Current; - } -} - -ULONG -MmMdCountList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList - ) -{ - PLIST_ENTRY First, NextEntry; - ULONG Count; - - /* Iterate the list */ - for (Count = 0, First = MdList->First, NextEntry = First->Flink; - NextEntry != First; - NextEntry = NextEntry->Flink, Count++); - - /* Return the count */ - return Count; -} - -VOID -MmMdInitializeList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ ULONG Type, - _In_ PLIST_ENTRY ListHead - ) -{ - /* Check if a list was specified */ - if (ListHead) - { - /* Use it */ - MdList->First = ListHead; - } - else - { - /* Otherwise, use the internal, built-in list */ - InitializeListHead(&MdList->ListHead); - MdList->First = &MdList->ListHead; - } - - /* Set the type */ - MdList->Type = Type; - - /* Initialize current iterator to nothing */ - MdList->This = NULL; -} - -NTSTATUS -MmMdCopyList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST DestinationList, - _In_ PBL_MEMORY_DESCRIPTOR_LIST SourceList, - _In_opt_ PBL_MEMORY_DESCRIPTOR ListDescriptor, - _Out_ PULONG ActualCount, - _In_ ULONG Count, - _In_ ULONG Flags - ) -{ - NTSTATUS Status; - PULONG Used; - PLIST_ENTRY First, NextEntry; - PBL_MEMORY_DESCRIPTOR Descriptor; - - /* Both parameters must be present */ - if (!(DestinationList) || !(SourceList)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Assume success */ - Status = STATUS_SUCCESS; - - /* Check if a descriptor is being used to store the list */ - if (ListDescriptor) - { - /* See how big it is */ - Flags |= BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG; - Used = ActualCount; - } - else - { - /* We are using our internal descriptors instead */ - Used = &MmGlobalMemoryDescriptorsUsed; - ++MmDescriptorCallTreeCount; - - /* Use as many as are available */ - Count = MmGlobalMemoryDescriptorCount; - ListDescriptor = MmGlobalMemoryDescriptors; - } - - /* Never truncate descriptors during a list copy */ - Flags |= BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG; - - /* Iterate through the list */ - First = SourceList->First; - NextEntry = First->Flink; - while ((NextEntry != First) && (NT_SUCCESS(Status))) - { - /* Make sure there's still space */ - if (Count <= *Used) - { - Status = STATUS_NO_MEMORY; - break; - } - - /* Get the current descriptor */ - Descriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - - /* Copy it into one of the descriptors we have */ - RtlCopyMemory(&ListDescriptor[*Used], - Descriptor, - sizeof(*Descriptor)); - - /* Add it to the list we have */ - Status = MmMdAddDescriptorToList(DestinationList, - &ListDescriptor[*Used], - Flags); - ++*Used; - - /* Move to the next entry */ - NextEntry = NextEntry->Flink; - } - - /* Check if the global descriptors were used */ - if (ListDescriptor == MmGlobalMemoryDescriptors) - { - /* Unwind our usage */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - } - - /* Return back to caller */ - return Status; -} - -VOID -MmMdRemoveDescriptorFromList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR Entry - ) -{ - /* Remove the entry */ - RemoveEntryList(&Entry->ListEntry); - - /* Check if this was the current link */ - if (MdList->This == &Entry->ListEntry) - { - /* Remove the current link and set the next one */ - MdList->This = NULL; - MmMdpSaveCurrentListPointer(MdList, Entry->ListEntry.Blink); - } -} - -VOID -MmMdFreeList( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList - ) -{ - PLIST_ENTRY FirstEntry, NextEntry; - PBL_MEMORY_DESCRIPTOR Entry; - - /* Go over every descriptor from the top */ - FirstEntry = MdList->First; - NextEntry = FirstEntry->Flink; - while (NextEntry != FirstEntry) - { - /* Remove and free each one */ - Entry = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - NextEntry = NextEntry->Flink; - MmMdRemoveDescriptorFromList(MdList, Entry); - MmMdFreeDescriptor(Entry); - } -} - -PBL_MEMORY_DESCRIPTOR -MmMdInitByteGranularDescriptor ( - _In_ ULONG Flags, - _In_ BL_MEMORY_TYPE Type, - _In_ ULONGLONG BasePage, - _In_ ULONGLONG VirtualPage, - _In_ ULONGLONG PageCount - ) -{ - PBL_MEMORY_DESCRIPTOR MemoryDescriptor; - - /* If we're out of descriptors, bail out */ - if (MmGlobalMemoryDescriptorsUsed >= MmGlobalMemoryDescriptorCount) - { - EfiPrintf(L"Out of descriptors!\r\n"); - EfiStall(1000000); - return NULL; - } - - /* Take one of the available descriptors and fill it out */ - MemoryDescriptor = &MmGlobalMemoryDescriptors[MmGlobalMemoryDescriptorsUsed]; - MemoryDescriptor->BasePage = BasePage; - MemoryDescriptor->VirtualPage = VirtualPage; - MemoryDescriptor->PageCount = PageCount; - MemoryDescriptor->Flags = Flags; - MemoryDescriptor->Type = Type; - InitializeListHead(&MemoryDescriptor->ListEntry); - - /* Increment the count and return the descriptor */ - MmGlobalMemoryDescriptorsUsed++; - return MemoryDescriptor; -} - -NTSTATUS -MmMdTruncateDescriptors ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _In_ ULONGLONG BasePage - ) -{ - PLIST_ENTRY ListHead, NextEntry; - PBL_MEMORY_DESCRIPTOR Descriptor, NewDescriptor; - ULONGLONG FoundEndPage; - - /* Search the descriptor list */ - ListHead = MdList->First; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptor */ - Descriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - - /* Go to the next entry in case we have to remove */ - NextEntry = NextEntry->Flink; - - /* Don't touch anything else but free RAM */ - if (((Descriptor->Type >> BL_MEMORY_CLASS_SHIFT) == BlSystemClass) && - (Descriptor->Type != BlConventionalMemory)) - { - continue; - } - - /* Check if this page is within the descriptor's region */ - FoundEndPage = Descriptor->BasePage + Descriptor->PageCount; - if (BasePage > Descriptor->BasePage) - { - /* Check if it doesn't go beyond the descriptor */ - if (BasePage < FoundEndPage) - { - /* Create a new descriptor to describe this region */ - EfiPrintf(L"Truncating descriptor type %lx base: %llx end: %llx\r\n", - Descriptor->Type, Descriptor->BasePage, FoundEndPage); - NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - Descriptor->Type, - BasePage, - 0, - FoundEndPage - BasePage); - if (!NewDescriptor) - { - return STATUS_NO_MEMORY; - } - - /* Cut off this descriptor to make it shorter */ - Descriptor->PageCount = BasePage - Descriptor->BasePage; - - /* Add the region to the new list */ - MmMdAddDescriptorToList(NewList, - NewDescriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG); - } - } - else - { - /* This whole descriptor covers the truncated area */ - EfiPrintf(L"Truncating descriptor type %lx base: %llx end: %llx\r\n", - Descriptor->Type, Descriptor->BasePage, FoundEndPage); - MmMdRemoveDescriptorFromList(MdList, Descriptor); - MmMdAddDescriptorToList(NewList, - Descriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG); - } - } - - /* All good if we got here */ - return STATUS_SUCCESS; -} - -BOOLEAN -MmMdpTruncateDescriptor ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, - _In_ ULONG Flags - ) -{ - PBL_MEMORY_DESCRIPTOR NextDescriptor, PreviousDescriptor; - PLIST_ENTRY NextEntry, PreviousEntry; - ULONGLONG EndPage, PreviousEndPage;// , NextEndPage; - - /* Get the next descriptor */ - NextEntry = MemoryDescriptor->ListEntry.Flink; - NextDescriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Get the previous descriptor */ - PreviousEntry = MemoryDescriptor->ListEntry.Blink; - PreviousDescriptor = CONTAINING_RECORD(PreviousEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Calculate end pages */ - EndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount; - //NextEndPage = NextDescriptor->BasePage + NextDescriptor->PageCount; - PreviousEndPage = PreviousDescriptor->BasePage + PreviousDescriptor->PageCount; - - /* Check for backward overlap */ - if ((PreviousEntry != MdList->First) && (MemoryDescriptor->BasePage < PreviousEndPage)) - { - EfiPrintf(L"Overlap detected -- this is unexpected on x86/x64 platforms\r\n"); - EfiStall(1000000); - } - - /* Check for forward overlap */ - if ((NextEntry != MdList->First) && (NextDescriptor->BasePage < EndPage)) - { - EfiPrintf(L"Overlap detected -- this is unexpected on x86/x64 platforms\r\n"); - EfiStall(1000000); - } - - /* Nothing to do */ - return FALSE; -} - -BOOLEAN -MmMdpCoalesceDescriptor ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, - _In_ ULONG Flags - ) -{ - PBL_MEMORY_DESCRIPTOR NextDescriptor, PreviousDescriptor; - PLIST_ENTRY NextEntry, PreviousEntry; - ULONGLONG EndPage, PreviousEndPage, PreviousMappedEndPage, MappedEndPage; - - /* Get the next descriptor */ - NextEntry = MemoryDescriptor->ListEntry.Flink; - NextDescriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Get the previous descriptor */ - PreviousEntry = MemoryDescriptor->ListEntry.Blink; - PreviousDescriptor = CONTAINING_RECORD(PreviousEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Calculate end pages */ - EndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount; - MappedEndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount; - PreviousMappedEndPage = PreviousDescriptor->VirtualPage + PreviousDescriptor->PageCount; - PreviousEndPage = PreviousDescriptor->BasePage + PreviousDescriptor->PageCount; - PreviousMappedEndPage = PreviousDescriptor->VirtualPage + PreviousDescriptor->PageCount; - - /* Check if the previous entry touches the current entry, and is compatible */ - if ((PreviousEntry != MdList->First) && - (PreviousDescriptor->Type == MemoryDescriptor->Type) && - ((PreviousDescriptor->Flags ^ MemoryDescriptor->Flags) & 0x1B19FFFF) && - (PreviousEndPage == MemoryDescriptor->BasePage) && - ((!(MemoryDescriptor->VirtualPage) && !(PreviousDescriptor->VirtualPage)) || - ((MemoryDescriptor->VirtualPage) && (PreviousDescriptor->VirtualPage) && - (PreviousMappedEndPage == MemoryDescriptor->VirtualPage)))) - { - EfiPrintf(L"Previous descriptor coalescable!\r\n"); - } - - /* CHeck if the current entry touches the next entry, and is compatible */ - if ((NextEntry != MdList->First) && - (NextDescriptor->Type == MemoryDescriptor->Type) && - ((NextDescriptor->Flags ^ MemoryDescriptor->Flags) & 0x1B19FFFF) && - (EndPage == NextDescriptor->BasePage) && - ((!(MemoryDescriptor->VirtualPage) && !(NextDescriptor->VirtualPage)) || - ((MemoryDescriptor->VirtualPage) && (NextDescriptor->VirtualPage) && - (MappedEndPage == NextDescriptor->VirtualPage)))) - { - EfiPrintf(L"Next descriptor coalescable!\r\n"); - } - - /* Nothing to do */ - return FALSE; -} - -NTSTATUS -MmMdAddDescriptorToList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor, - _In_ ULONG Flags - ) -{ - PLIST_ENTRY ThisEntry, FirstEntry; - PBL_MEMORY_DESCRIPTOR ThisDescriptor; - - /* Arguments must be present */ - if (!(MdList) || !(MemoryDescriptor)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Check if coalescing is forcefully disabled */ - if (Flags & BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG) - { - /* Then we won't be coalescing */ - Flags &= ~BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG; - } - else if (MemoryDescriptor->Flags & BlMemoryCoalesced) - { - /* Coalesce if the descriptor requires it */ - Flags |= BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG; - } - - /* Check if truncation is forcefully disabled */ - if (Flags & BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG) - { - Flags &= ~BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG; - } - - /* Update the current list pointer if the descriptor requires it */ - if (MemoryDescriptor->Flags & BlMemoryUpdate) - { - Flags |= BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG; - } - - /* Get the current descriptor */ - ThisEntry = MdList->This; - ThisDescriptor = CONTAINING_RECORD(ThisEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Also get the first descriptor */ - FirstEntry = MdList->First; - - /* Check if there's no current pointer, or if it's higher than the new one */ - if (!(ThisEntry) || - (MemoryDescriptor->BasePage <= ThisDescriptor->BasePage)) - { - /* Start at the first descriptor instead, since current is past us */ - ThisEntry = FirstEntry->Flink; - } - - /* Loop until we find the right location to insert */ - while (ThisEntry != FirstEntry) - { - /* Get the descriptor part of this entry */ - ThisDescriptor = CONTAINING_RECORD(ThisEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Is the address smaller, or equal but more important? */ - if ((MemoryDescriptor->BasePage < ThisDescriptor->BasePage) || - ((MemoryDescriptor->BasePage == ThisDescriptor->BasePage) && - (MmMdpHasPrecedence(MemoryDescriptor->Type, ThisDescriptor->Type)))) - { - /* Then insert right here */ - InsertTailList(ThisEntry, &MemoryDescriptor->ListEntry); - goto Quickie; - } - - /* Try the next entry */ - ThisEntry = ThisEntry->Flink; - } - - /* Then we didn't find a good match, so insert it right here */ - InsertTailList(FirstEntry, &MemoryDescriptor->ListEntry); - -Quickie: - /* Do we have to truncate? */ - if (Flags & BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG) - { - /* Do it and then exit */ - if (MmMdpTruncateDescriptor(MdList, MemoryDescriptor, Flags)) - { - return STATUS_SUCCESS; - } - } - - /* Do we have to coalesce? */ - if (Flags & BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG) - { - /* Do it and then exit */ - if (MmMdpCoalesceDescriptor(MdList, MemoryDescriptor, Flags)) - { - return STATUS_SUCCESS; - } - } - - /* Do we have to update the current pointer? */ - if (Flags & BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG) - { - /* Do it */ - MmMdpSaveCurrentListPointer(MdList, &MemoryDescriptor->ListEntry); - } - - /* We're done */ - return STATUS_SUCCESS; -} - -NTSTATUS -MmMdRemoveRegionFromMdlEx ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ ULONG Flags, - _In_ ULONGLONG BasePage, - _In_ ULONGLONG PageCount, - _Out_opt_ PBL_MEMORY_DESCRIPTOR_LIST NewMdList - ) -{ - BOOLEAN HaveNewList, UseVirtualPage; - NTSTATUS Status; - PLIST_ENTRY ListHead, NextEntry; - PBL_MEMORY_DESCRIPTOR Descriptor, NewDescriptor, ListDescriptor; - BL_MEMORY_DESCRIPTOR OldDescriptor; - ULONGLONG RegionSize; - ULONGLONG FoundBasePage, FoundEndPage, FoundPageCount, EndPage, VirtualPage; - - /* Set initial status */ - Status = STATUS_SUCCESS; - ListDescriptor = NULL; - NewDescriptor = NULL; - HaveNewList = FALSE; - - /* Check if removed descriptors should go into a new list */ - if (NewMdList != NULL) - { - /* Initialize it */ - MmMdInitializeList(NewMdList, MdList->Type, NULL); - - /* Remember for later */ - HaveNewList = TRUE; - } - - /* Is the region being removed physical? */ - UseVirtualPage = FALSE; - if (!(Flags & BL_MM_REMOVE_VIRTUAL_REGION_FLAG)) - { - /* Is this a list of virtual descriptors? */ - if (MdList->Type == BlMdVirtual) - { - /* Request is nonsensical, fail */ - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - } - else - { - /* Is this a list of physical descriptors? */ - if (MdList->Type == BlMdPhysical) - { - /* We'll have to use the virtual page instead */ - UseVirtualPage = TRUE; - } - } - - /* Loop the list*/ - ListHead = MdList->First; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the descriptor */ - Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Extract range details */ - FoundBasePage = UseVirtualPage ? Descriptor->VirtualPage : Descriptor->BasePage; - FoundPageCount = Descriptor->PageCount; - FoundEndPage = FoundBasePage + FoundPageCount; - EndPage = PageCount + BasePage; - - /* Make a copy of the original descriptor */ - OldDescriptor = *Descriptor; - - /* Check if the region to be removed starts after the found region starts */ - if ((BasePage > FoundBasePage) || (FoundBasePage >= EndPage)) - { - /* Check if the region ends after the found region */ - if ((BasePage >= FoundEndPage) || (FoundEndPage > EndPage)) - { - /* Check if the found region starts after the region or ends before the region */ - if ((FoundBasePage >= BasePage) || (EndPage >= FoundEndPage)) - { - /* This is a fully-mapped descriptor -- change nothing */ - OldDescriptor.PageCount = 0; - } - else - { - /* This descriptor fully covers the entire allocation */ - FoundBasePage = Descriptor->BasePage; - VirtualPage = Descriptor->VirtualPage; - FoundPageCount = BasePage - FoundBasePage; - - /* This is how many pages we will eat away from the descriptor */ - RegionSize = FoundPageCount + PageCount; - - /* Update the descriptor to account for the consumed pages */ - Descriptor->BasePage += RegionSize; - Descriptor->PageCount -= RegionSize; - if (VirtualPage) - { - Descriptor->VirtualPage += RegionSize; - } - - /* Initialize a descriptor for the start of the region */ - NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - Descriptor->Type, - FoundBasePage, - VirtualPage, - FoundPageCount); - if (!NewDescriptor) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Add it into the list */ - Status = MmMdAddDescriptorToList(MdList, NewDescriptor, Flags); - if (!NT_SUCCESS(Status)) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Don't free it on exit path */ - NewDescriptor = NULL; - - /* Adjust the leftover descriptor */ - OldDescriptor.BasePage += FoundPageCount; - OldDescriptor.PageCount = PageCount; - if (OldDescriptor.VirtualPage) - { - OldDescriptor.VirtualPage += FoundPageCount; - } - } - } - else - { - /* This descriptor contains the entire allocation */ - RegionSize = FoundEndPage - BasePage; - Descriptor->PageCount -= RegionSize; - - /* Adjust the leftover descriptor */ - OldDescriptor.BasePage += Descriptor->PageCount; - OldDescriptor.PageCount = RegionSize; - if (OldDescriptor.VirtualPage) - { - OldDescriptor.VirtualPage += FoundPageCount; - } - } - - /* Go to the next entry */ - NextEntry = NextEntry->Flink; - } - else - { - /* - * This descriptor contains the end of the allocation. It may: - * - * - Contain the full allocation (i.e.: the start is aligned) - * - Contain parts of the end of the allocation (i.e.: the end is beyond) - * - Contain the entire tail end of the allocation (i..e:the end is within) - * - * So first, figure out if we cover the entire end or not - */ - if (EndPage < FoundEndPage) - { - /* The allocation goes past the end of this descriptor */ - FoundEndPage = EndPage; - } - - /* This is how many pages we will eat away from the descriptor */ - FoundPageCount = FoundEndPage - FoundBasePage; - - /* Update the descriptor to account for the consumed pages */ - Descriptor->BasePage += FoundPageCount; - Descriptor->PageCount -= FoundPageCount; - if (Descriptor->VirtualPage) - { - Descriptor->VirtualPage += FoundPageCount; - } - - /* Go to the next entry */ - NextEntry = NextEntry->Flink; - - /* Check if the descriptor is now empty */ - if (!Descriptor->PageCount) - { - /* Remove it */ - MmMdRemoveDescriptorFromList(MdList, Descriptor); - - /* Check if we're supposed to insert it into a new list */ - if (HaveNewList) - { - /* This is the one to add */ - ListDescriptor = Descriptor; - } - else - { - /* Nope -- just get rid of it */ - MmMdFreeDescriptor(Descriptor); - } - } - } - - /* Is there a remainder descriptor, and do we have a list for it */ - if ((OldDescriptor.PageCount) && (HaveNewList)) - { - /* Did we already chop off the descriptor? */ - if (ListDescriptor) - { - /* Use what we previously chopped */ - *ListDescriptor = OldDescriptor; - } - else - { - /* First time, so build a descriptor to describe the leftover */ - ListDescriptor = MmMdInitByteGranularDescriptor(OldDescriptor.Flags, - OldDescriptor.Type, - OldDescriptor.BasePage, - OldDescriptor.VirtualPage, - OldDescriptor.PageCount); - if (!ListDescriptor) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Add it into the list */ - Status = MmMdAddDescriptorToList(NewMdList, ListDescriptor, 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Don't free on exit path */ - ListDescriptor = NULL; - } - } - } - -Quickie: - /* Check for failure cleanup */ - if (!NT_SUCCESS(Status)) - { - /* Did we have to build a new list? */ - if (HaveNewList) - { - /* Free and re-initialize it */ - MmMdFreeList(NewMdList); - MmMdInitializeList(NewMdList, MdList->Type, NULL); - } - - /* Check if we had a list descriptor, and free it */ - if (ListDescriptor) - { - MmMdFreeDescriptor(ListDescriptor); - } - - /* Check if we had a new descriptor, and free it */ - if (NewDescriptor) - { - MmMdFreeDescriptor(NewDescriptor); - } - } - - /* All done */ - return Status; -} - -PBL_MEMORY_DESCRIPTOR -MmMdFindDescriptorFromMdl ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList, - _In_ ULONG Flags, - _In_ ULONGLONG Page - ) -{ - BOOLEAN IsVirtual; - PLIST_ENTRY NextEntry, ListHead; - PBL_MEMORY_DESCRIPTOR Current; - ULONGLONG BasePage; - - /* Assume physical */ - IsVirtual = FALSE; - - /* Check if the caller wants physical memory */ - if (!(Flags & BL_MM_REMOVE_VIRTUAL_REGION_FLAG)) - { - /* Check if this is a virtual memory list */ - if (MdList->Type == BlMdVirtual) - { - /* We won't find anything */ - return NULL; - } - } - else if (MdList->Type == BlMdPhysical) - { - /* Otherwise, caller wants virtual, but this is a physical list */ - IsVirtual = TRUE; - NextEntry = MdList->First->Flink; - } - - /* Check if this is a physical search */ - if (!IsVirtual) - { - /* Check if we can use the current pointer */ - NextEntry = MdList->This; - if (!NextEntry) - { - /* We can't -- start at the beginning */ - NextEntry = MdList->First->Flink; - } - else - { - /* If the page is below the current pointer, restart */ - Current = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - if (Page < Current->BasePage) - { - NextEntry = MdList->First->Flink; - } - } - } - - /* Loop the list of descriptors */ - ListHead = MdList->First; - while (NextEntry != ListHead) - { - /* Get the current one */ - Current = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Check if we are looking for virtual memory */ - if (IsVirtual) - { - /* Use the base address */ - BasePage = Current->VirtualPage; - } - else - { - /* Use the page */ - BasePage = Current->BasePage; - } - - /* If this is a virtual descriptor, make sure it has a base address */ - if ((!(IsVirtual) || (BasePage)) && - (BasePage <= Page) && - (Page < (BasePage + Current->PageCount))) - { - /* The descriptor fits the page being requested */ - return Current; - } - - /* Try the next one */ - NextEntry = NextEntry->Flink; - } - - /* Nothing found if we're here */ - return NULL; -} - -PBL_MEMORY_DESCRIPTOR -MmMdFindDescriptor ( - _In_ ULONG WhichList, - _In_ ULONG Flags, - _In_ ULONGLONG Page - ) -{ - PBL_MEMORY_DESCRIPTOR FoundDescriptor; - - /* Check if the caller is looking for mapped, allocated memory */ - if (WhichList & BL_MM_INCLUDE_MAPPED_ALLOCATED) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlMappedAllocated, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for mapped, unallocated memory */ - if (WhichList & BL_MM_INCLUDE_MAPPED_UNALLOCATED) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlMappedUnallocated, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for unmapped, allocated memory */ - if (WhichList & BL_MM_INCLUDE_UNMAPPED_ALLOCATED) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlUnmappedAllocated, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for unmapped, unallocated memory */ - if (WhichList & BL_MM_INCLUDE_UNMAPPED_UNALLOCATED) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlUnmappedUnallocated, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for reserved, allocated memory */ - if (WhichList & BL_MM_INCLUDE_RESERVED_ALLOCATED) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlReservedAllocated, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for bad memory */ - if (WhichList & BL_MM_INCLUDE_BAD_MEMORY) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlBadMemory, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for truncated memory */ - if (WhichList & BL_MM_INCLUDE_TRUNCATED_MEMORY) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlTruncatedMemory, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Check if the caller is looking for persistent memory */ - if (WhichList & BL_MM_INCLUDE_PERSISTENT_MEMORY) - { - /* Find a descriptor in that list */ - FoundDescriptor = MmMdFindDescriptorFromMdl(&MmMdlPersistentMemory, Flags, Page); - if (FoundDescriptor) - { - /* Got it */ - return FoundDescriptor; - } - } - - /* Nothing if we got here */ - return NULL; -} - -BOOLEAN -MmMdFindSatisfyingRegion ( - _In_ PBL_MEMORY_DESCRIPTOR Descriptor, - _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor, - _In_ ULONGLONG Pages, - _In_ PBL_ADDRESS_RANGE BaseRange, - _In_ PBL_ADDRESS_RANGE VirtualRange, - _In_ BOOLEAN TopDown, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONG Flags, - _In_ ULONG Alignment - ) -{ - ULONGLONG BaseMin, BaseMax, AlignedMin; - ULONGLONG VirtualPage, BasePage; - ULONGLONG BaseDelta, AlignedBase; - ULONGLONG VirtualMin, VirtualMax; - - /* Extract the minimum and maximum range */ - BaseMin = BaseRange->Minimum; - BaseMax = BaseRange->Maximum; - - /* Don't go below where the descriptor starts */ - if (BaseMin < Descriptor->BasePage) - { - BaseMin = Descriptor->BasePage; - } - - /* Don't go beyond where the descriptor ends */ - if (BaseMax > (Descriptor->BasePage + Descriptor->PageCount - 1)) - { - BaseMax = (Descriptor->BasePage + Descriptor->PageCount - 1); - } - - /* Check for start overflow */ - if (BaseMin > BaseMax) - { - return FALSE; - } - - /* Align the base as required */ - if (Alignment != 1) - { - AlignedMin = ALIGN_UP_BY(BaseMin, Alignment); - } - else - { - AlignedMin = BaseMin; - } - - /* Check for range overflow */ - if (((AlignedMin + Pages - 1) < AlignedMin) || ((AlignedMin + Pages - 1) > BaseMax)) - { - return FALSE; - } - - /* Check if this was a top-down request */ - if (TopDown) - { - /* Then get the highest page possible */ - BasePage = BaseMax - Pages + 1; - if (Alignment != 1) - { - /* Align it as needed */ - AlignedBase = ALIGN_DOWN_BY(BasePage, Alignment); - } - else - { - AlignedBase = BasePage; - } - - /* Calculate the delta between max address and our aligned base */ - BaseDelta = BasePage - AlignedBase; - BasePage -= BaseDelta; - } - else - { - /* Otherwise, get the lowest page possible */ - BasePage = AlignedMin; - BaseDelta = 0; - } - - /* If a virtual address range was passed in, this must be a virtual descriptor */ - if (((VirtualRange->Minimum) || (VirtualRange->Maximum)) && - !(Descriptor->VirtualPage)) - { - return FALSE; - } - - /* Any mapped page already? */ - if (Descriptor->VirtualPage) - { - /* Get virtual min/max */ - VirtualMin = VirtualRange->Minimum; - VirtualMax = VirtualRange->Maximum; - - /* Don't go below where the descriptor maps */ - if (VirtualMin <= Descriptor->VirtualPage) - { - VirtualMin = Descriptor->VirtualPage; - } - - /* Don't go above where the descriptor maps */ - if (VirtualMax >= (Descriptor->VirtualPage + Descriptor->PageCount - 1)) - { - VirtualMax = Descriptor->VirtualPage + Descriptor->PageCount - 1; - } - - /* Don't let the base overflow */ - if (VirtualMin > VirtualMax) - { - return FALSE; - } - - /* Adjust the base by the alignment delta */ - VirtualMin += AlignedMin - BaseMin; - - /* Check that the bounds don't overflow or underflow */ - if (((VirtualMin + Pages - 1) < VirtualMin) || - ((VirtualMin + Pages - 1) > VirtualMax)) - { - return FALSE; - } - - /* Finally, pick the correct address based on direction */ - if (TopDown) - { - /* Highest possible base address, aligned */ - VirtualPage = VirtualMax - Pages + 1 - BaseDelta; - } - else - { - /* Lowest possible base address, aligned */ - VirtualPage = VirtualMin; - } - } - else - { - /* Nothing to worry about */ - VirtualPage = 0; - } - - /* Bail out if the memory type attributes don't match */ - if ((((Flags & 0xFF) & (Descriptor->Flags & 0xFF)) != (Flags & 0xFF)) || - (((Flags & 0xFF00) & (Descriptor->Flags & 0xFF00)) != (Flags & 0xFF00))) - { - //EfiPrintf(L"Incorrect memory attributes\r\n"); - return FALSE; - } - - /* Bail out if the allocation flags don't match */ - if (((Flags ^ Descriptor->Flags) & (BlMemoryRuntime | BlMemoryBelow1MB | BlMemoryLargePages))) - { - //EfiPrintf(L"Incorrect memory allocation flags\r\n"); - return FALSE; - } - - /* Bail out if the type doesn't match */ - if (Descriptor->Type != MemoryType) - { - //EfiPrintf(L"Incorrect descriptor type: %lx %lx\r\n", Descriptor->Type, MemoryType); - return FALSE; - } - - /* We have a matching region, fill out the descriptor for it */ - NewDescriptor->BasePage = BasePage; - NewDescriptor->PageCount = Pages; - NewDescriptor->Type = Descriptor->Type; - NewDescriptor->VirtualPage = VirtualPage; - NewDescriptor->Flags = Descriptor->Flags; - //EfiPrintf(L"Found a matching descriptor: %08I64X with %08I64X pages\r\n", BasePage, Pages); - return TRUE; -} - -VOID -MmMdFreeGlobalDescriptors ( - VOID - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor, OldDescriptor; - ULONG Index = 0; - PLIST_ENTRY OldFlink, OldBlink; - - /* Make sure we're not int middle of a call using a descriptor */ - if (MmDescriptorCallTreeCount != 1) - { - return; - } - - /* Loop every current global descriptor */ - while (Index < MmGlobalMemoryDescriptorsUsed) - { - /* Does it have any valid pages? */ - OldDescriptor = &MmGlobalMemoryDescriptors[Index]; - if (OldDescriptor->PageCount) - { - /* Allocate a copy of it */ - Descriptor = BlMmAllocateHeap(sizeof(*Descriptor)); - if (!Descriptor) - { - return; - } - - /* Save the links */ - OldBlink = OldDescriptor->ListEntry.Blink; - OldFlink = OldDescriptor->ListEntry.Flink; - - /* Make the copy */ - *Descriptor = *OldDescriptor; - - /* Fix the links */ - OldBlink->Flink = &Descriptor->ListEntry; - OldFlink->Blink = &Descriptor->ListEntry; - - /* Zero the descriptor */ - RtlZeroMemory(OldDescriptor, sizeof(*OldDescriptor)); - } - - /* Keep going */ - Index++; - } - - /* All global descriptors freed */ - MmGlobalMemoryDescriptorsUsed = 0; -} - -VOID -MmMdInitialize ( - _In_ ULONG Phase, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ) -{ - /* Are we in phase 1? */ - if (Phase != 0) - { - /* Switch to dynamic descriptors if we have too many */ - if (LibraryParameters->DescriptorCount > RTL_NUMBER_OF(MmStaticMemoryDescriptors)) - { - MmMdpSwitchToDynamicDescriptors(LibraryParameters->DescriptorCount); - } - } - else - { - /* In phase 0, start with a pool of 512 static descriptors */ - MmGlobalMemoryDescriptorCount = RTL_NUMBER_OF(MmStaticMemoryDescriptors); - MmGlobalMemoryDescriptors = MmStaticMemoryDescriptors; - RtlZeroMemory(MmStaticMemoryDescriptors, sizeof(MmStaticMemoryDescriptors)); - MmGlobalMemoryDescriptorsUsed = 0; - } -} diff --git a/boot/environ/lib/mm/heapalloc.c b/boot/environ/lib/mm/heapalloc.c deleted file mode 100644 index 973417fc539..00000000000 --- a/boot/environ/lib/mm/heapalloc.c +++ /dev/null @@ -1,716 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/heapalloc.c - * PURPOSE: Boot Library Memory Manager Heap Allocator - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -#define BL_HEAP_POINTER_FLAG_BITS 3 - -typedef struct _BL_HEAP_POINTER -{ - union - { - struct - { - ULONG_PTR BufferFree : 1; - ULONG_PTR BufferOnHeap : 1; - ULONG_PTR NotUsed : 1; - ULONG_PTR BufferPointer : ((8 * sizeof(ULONG_PTR)) - BL_HEAP_POINTER_FLAG_BITS); - }; - PVOID P; - }; -} BL_HEAP_POINTER, *PBL_HEAP_POINTER; - -typedef struct _BL_FREE_HEAP_ENTRY -{ - BL_HEAP_POINTER BufferNext; - BL_HEAP_POINTER BufferPrevious; - BL_HEAP_POINTER FreeNext; - BL_HEAP_POINTER FreePrevious; -} BL_FREE_HEAP_ENTRY, *PBL_FREE_HEAP_ENTRY; - -typedef struct _BL_BUSY_HEAP_ENTRY -{ - BL_HEAP_POINTER BufferNext; - BL_HEAP_POINTER BufferPrevious; - UCHAR Buffer[ANYSIZE_ARRAY]; -} BL_BUSY_HEAP_ENTRY, *PBL_BUSY_HEAP_ENTRY; - -typedef struct _BL_HEAP_BOUNDARIES -{ - LIST_ENTRY ListEntry; - ULONG_PTR HeapEnd; - ULONG_PTR HeapLimit; - ULONG_PTR HeapBase; - PBL_BUSY_HEAP_ENTRY HeapStart; -} BL_HEAP_BOUNDARIES, *PBL_HEAP_BOUNDARIES; - -ULONG HapInitializationStatus; -LIST_ENTRY MmHeapBoundaries; -ULONG HapMinimumHeapSize; -ULONG HapAllocationAttributes; -PBL_FREE_HEAP_ENTRY* MmFreeList; - -/* INLINES *******************************************************************/ - -FORCEINLINE -PBL_FREE_HEAP_ENTRY -MmHapDecodeLink ( - _In_ BL_HEAP_POINTER Link - ) -{ - /* Decode the buffer pointer by ignoring the flags */ - return (PBL_FREE_HEAP_ENTRY)(Link.BufferPointer << BL_HEAP_POINTER_FLAG_BITS); -} - -FORCEINLINE -ULONG -MmHapBufferSize ( - _In_ PVOID FreeEntry - ) -{ - PBL_FREE_HEAP_ENTRY Entry = FreeEntry; - - /* The space between the next buffer header and this one is the size */ - return (ULONG_PTR)MmHapDecodeLink(Entry->BufferNext) - (ULONG_PTR)Entry; -} - -FORCEINLINE -ULONG -MmHapUserBufferSize ( - _In_ PVOID FreeEntry - ) -{ - PBL_FREE_HEAP_ENTRY Entry = FreeEntry; - - /* Get the size of the buffer as the user sees it */ - return MmHapBufferSize(Entry) - FIELD_OFFSET(BL_BUSY_HEAP_ENTRY, Buffer); -} - - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -MmHapHeapAllocatorExtend ( - _In_ ULONG ExtendSize - ) -{ - ULONG HeapSize, AlignedSize, HeapLimit; - PBL_HEAP_BOUNDARIES Heap, NewHeap; - NTSTATUS Status; - PBL_BUSY_HEAP_ENTRY HeapBase = NULL; - - /* Compute a new heap, and add 2 more pages for the free list */ - HeapSize = ExtendSize + (2 * PAGE_SIZE); - if (HeapSize < ExtendSize) - { - return STATUS_INTEGER_OVERFLOW; - } - - /* Make sure the new heap is at least the minimum configured size */ - if (HapMinimumHeapSize > HeapSize) - { - HeapSize = HapMinimumHeapSize; - } - - /* Align it on a page boundary */ - AlignedSize = ALIGN_UP_BY(HeapSize, PAGE_SIZE); - if (!AlignedSize) - { - return STATUS_INTEGER_OVERFLOW; - } - - /* Check if we already have a heap */ - if (!IsListEmpty(&MmHeapBoundaries)) - { - /* Find the first heap*/ - Heap = CONTAINING_RECORD(MmHeapBoundaries.Flink, - BL_HEAP_BOUNDARIES, - ListEntry); - - /* Check if we have a page free above the heap */ - HeapLimit = Heap->HeapLimit + PAGE_SIZE; - if (HeapLimit <= Heap->HeapEnd) - { - EfiPrintf(L"Heap extension TODO\r\n"); - return STATUS_INSUFFICIENT_RESOURCES; - } - } - - /* We do not -- allocate one */ - Status = MmPapAllocatePagesInRange((PVOID*)&HeapBase, - BlLoaderHeap, - AlignedSize >> PAGE_SHIFT, - HapAllocationAttributes, - 0, - NULL, - 0); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"HEAP ALLOCATION FAILED\r\n"); - EfiStall(1000000); - return Status; - } - - /* Set the heap bottom, limit, and top */ - NewHeap = (PBL_HEAP_BOUNDARIES)HeapBase->Buffer; - NewHeap->HeapBase = (ULONG_PTR)HeapBase; - NewHeap->HeapLimit = (ULONG_PTR)HeapBase + AlignedSize; - NewHeap->HeapStart = (PBL_BUSY_HEAP_ENTRY)(NewHeap + 1); - - /* Set the buffer links */ - HeapBase->BufferPrevious.P = NULL; - HeapBase->BufferNext.P = NewHeap->HeapStart; - - /* Set the buffer at the top of the heap and mark it as being free */ - NewHeap->HeapStart->BufferPrevious.P = HeapBase; - NewHeap->HeapStart->BufferNext.P = NewHeap->HeapStart; - NewHeap->HeapStart->BufferNext.BufferFree = 1; - NewHeap->HeapStart->BufferNext.BufferOnHeap = 1; - - /* Is this the first heap ever? */ - if (IsListEmpty(&MmHeapBoundaries)) - { - /* We will host the free list at the top of the heap */ - MmFreeList = (PBL_FREE_HEAP_ENTRY*)((ULONG_PTR)NewHeap->HeapLimit - 8 * sizeof(PBL_FREE_HEAP_ENTRY)); - NewHeap->HeapLimit = (ULONG_PTR)MmFreeList; - RtlZeroMemory(MmFreeList, 8 * sizeof(PBL_FREE_HEAP_ENTRY)); - } - - /* Remove a page on top */ - HeapLimit = NewHeap->HeapLimit; - NewHeap->HeapEnd = NewHeap->HeapLimit; - NewHeap->HeapLimit -= PAGE_SIZE; - - /* Add us into the heap list */ - InsertTailList(&MmHeapBoundaries, &NewHeap->ListEntry); - return STATUS_SUCCESS; -} - -ULONG -MmHapGetBucketId ( - _In_ ULONG Size - ) -{ - ULONG BucketIndex = 0; - - /* Use the last bucket if this is a large allocation */ - if (Size >= PAGE_SIZE) - { - return 7; - } - - /* Otherwise, use a higher index for each new power of two */ - while (Size >> BucketIndex) - { - BucketIndex++; - } - - /* Allocations are at least 16 bytes (2^4 = 5th index) */ - return BucketIndex - 5; -} - -VOID -MmHapReportHeapCorruption ( - _In_ PBL_FREE_HEAP_ENTRY BufferEntry - ) -{ -#if 0 - BOOLEAN DebuggerEnabled; - - BlStatusPrint(L"Heap corruption in the links surrounding %p!\r\n", BufferEntry); - - DebuggerEnabled = BlBdDebuggerEnabled(); - if (DebuggerEnabled) - { - BlStatusPrint(L"\n*** Fatal Error 0x%08x :\n (0x%p, 0x%p, 0x%p, 0x%p)\n\r\n", 2, BufferEntry, NULL, NULL, NULL); - __debugbreak(); - } -#else - EfiPrintf(L"Heap corruption in the links surrounding %p!\r\n", BufferEntry); -#endif -} - -PVOID -MmHapCheckFreeLinks ( - _In_ PVOID BufferEntry - ) -{ - PBL_FREE_HEAP_ENTRY Prev, Next; - PBL_FREE_HEAP_ENTRY Entry = BufferEntry; - - /* Get the previous and next free pointers */ - Prev = MmHapDecodeLink(Entry->FreePrevious); - Next = MmHapDecodeLink(Entry->FreeNext); - - /* Make sure that both the previous and next entries point to this one */ - if (((Next) && (MmHapDecodeLink(Next->FreePrevious)) != Entry) || - ((Prev) && (MmHapDecodeLink(Prev->FreeNext)) != Entry)) - { - /* They don't, so the free headers are corrupted */ - MmHapReportHeapCorruption(Entry); - return NULL; - } - - /* They do, return the free entry as valid */ - return Entry; -} - -PVOID -MmHapCheckBufferLinks ( - _In_ PVOID BufferEntry - ) -{ - PBL_FREE_HEAP_ENTRY Prev, Next; - PBL_FREE_HEAP_ENTRY Entry = BufferEntry; - - /* Get the previous and next buffer pointers */ - Prev = MmHapDecodeLink(Entry->BufferPrevious); - Next = MmHapDecodeLink(Entry->BufferNext); - - /* Make sure that both the previous and next entries point to this one */ - if (((Next) && (MmHapDecodeLink(Next->BufferPrevious)) != Entry) || - ((Prev) && (MmHapDecodeLink(Prev->BufferNext)) != Entry)) - { - /* They don't, so the heap headers are corrupted */ - MmHapReportHeapCorruption(Entry); - return NULL; - } - - /* They, do the entry is valid */ - return Entry; -} - -PBL_FREE_HEAP_ENTRY -MmHapRemoveBufferFromFreeList ( - _In_ PBL_FREE_HEAP_ENTRY FreeEntry - ) -{ - PBL_FREE_HEAP_ENTRY Prev, Next; - - /* Firest, make sure the free entry is valid */ - FreeEntry = MmHapCheckFreeLinks(FreeEntry); - if (!FreeEntry) - { - return FreeEntry; - } - - /* Get the previous and next entry */ - Prev = MmHapDecodeLink(FreeEntry->FreePrevious); - Next = MmHapDecodeLink(FreeEntry->FreeNext); - - /* Update the next entry to point to our previous entry */ - if (Next) - { - Next->FreePrevious.P = Prev; - } - - /* Are we at the head? */ - if (Prev) - { - /* Nope, so update our previous entry to point to our next entry */ - Prev->FreeNext.P = Next; - } - else - { - /* Yep, so update the appropriate bucket listhead */ - MmFreeList[MmHapGetBucketId(MmHapBufferSize(FreeEntry))] = Prev; - } - - /* Return the (now removed) entry */ - return FreeEntry; -} - -PBL_FREE_HEAP_ENTRY -MmHapCoalesceFreeBuffer ( - _In_ PBL_FREE_HEAP_ENTRY FreeEntry - ) -{ - PBL_FREE_HEAP_ENTRY Prev, Next; - - /* First make sure that this is a valid buffer entry */ - if (!MmHapCheckBufferLinks(FreeEntry)) - { - return NULL; - } - - /* Get the next entry and check if it's free */ - Next = MmHapDecodeLink(FreeEntry->BufferNext); - if (!(Next->BufferNext.BufferOnHeap) && (Next->BufferNext.BufferFree)) - { - /* Remove the next buffer from the free list since we're coalescing */ - Next = MmHapRemoveBufferFromFreeList(Next); - if (!Next) - { - return NULL; - } - - /* The forward link of the *new* free buffer should now point to us */ - MmHapDecodeLink(Next->BufferNext)->BufferPrevious.P = FreeEntry; - - /* Our forward link should point to the *new* free buffer as well */ - FreeEntry->BufferNext.P = MmHapDecodeLink(Next->BufferNext); - - /* Mark our buffer as free */ - FreeEntry->BufferNext.BufferFree = 1; - } - - /* Get the previous entry and check if it's free */ - Prev = MmHapDecodeLink(FreeEntry->BufferPrevious); - if (!(Prev) || !(Prev->BufferNext.BufferFree)) - { - return FreeEntry; - } - - /* It's free, so remove it */ - Prev = MmHapRemoveBufferFromFreeList(Prev); - if (!Prev) - { - return NULL; - } - - /* The previous link of our next buffer should now point to our *previous* */ - MmHapDecodeLink(FreeEntry->BufferNext)->BufferPrevious.P = Prev; - - /* Our previous link should point the next free buffer now */ - Prev->BufferNext.P = MmHapDecodeLink(FreeEntry->BufferNext); - - /* Set the new freed buffer as the previous buffer, and mark it free */ - FreeEntry = Prev; - FreeEntry->BufferNext.BufferFree = 1; - return FreeEntry; -} - -PBL_FREE_HEAP_ENTRY -MmHapAddToFreeList ( - _In_ PBL_BUSY_HEAP_ENTRY Entry, - _In_ ULONG Flags - ) -{ - PBL_FREE_HEAP_ENTRY FreeEntry, Head; - ULONG BucketId; - BL_LIBRARY_PARAMETERS LocalParameters; - - /* First, check if the entry is valid */ - Entry = MmHapCheckBufferLinks(Entry); - if (!Entry) - { - return NULL; - } - - /* Check if we should zero the entry */ - LocalParameters = BlpLibraryParameters; - if ((LocalParameters.LibraryFlags & BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE) && - !(Flags)) - { - /* Yep, zero it out */ - RtlZeroMemory(Entry->Buffer, MmHapUserBufferSize(Entry)); - } - - /* Now mark the entry as free */ - Entry->BufferNext.BufferFree = 1; - - /* Now that this buffer is free, try to coalesce it */ - FreeEntry = MmHapCoalesceFreeBuffer((PBL_FREE_HEAP_ENTRY)Entry); - if (!FreeEntry) - { - return FreeEntry; - } - - /* Compute the bucket ID for the free list */ - BucketId = MmHapGetBucketId(MmHapBufferSize(Entry)); - - /* Get the current head for this bucket, if one exists */ - Head = MmFreeList ? MmFreeList[BucketId] : NULL; - - /* Update the head's backlink to point to this newly freed entry */ - if (Head) - { - Head->FreePrevious.P = FreeEntry; - } - - /* Nobody behind us, the old head in front of us */ - FreeEntry->FreePrevious.P = NULL; - FreeEntry->FreeNext.P = Head; - - /* Put us at the head of list now, and return the entry */ - MmFreeList[BucketId] = FreeEntry; - return FreeEntry; -} - -PBL_BUSY_HEAP_ENTRY -MmHapFindBufferInFreeList ( - _In_ ULONG Size - ) -{ - PBL_FREE_HEAP_ENTRY FreeEntry = NULL; - PBL_BUSY_HEAP_ENTRY NextEntry; - ULONG BucketId; - - /* Get the appropriate bucket for our size */ - BucketId = MmHapGetBucketId(Size); - if (BucketId >= 8) - { - return NULL; - } - - /* Keep going as long as we don't have a free entry */ - while (!FreeEntry) - { - /* Fet the first free entry in this list */ - FreeEntry = MmFreeList ? MmFreeList[BucketId] : NULL; - - /* Loop as long as there's entries in the list */ - while (FreeEntry) - { - /* Can this free entry satisfy our needs? */ - if (MmHapBufferSize(FreeEntry) >= Size) - { - /* All good */ - break; - } - - /* It cannot, keep going to the next one */ - FreeEntry = MmHapDecodeLink(FreeEntry->FreeNext); - } - - /* Try the next list -- have we exhausted all the lists? */ - if (++BucketId >= 8) - { - /* Have we not found an entry yet? Fail if so... */ - if (!FreeEntry) - { - return NULL; - } - } - } - - /* We should have an entry if we're here. Remove it from the free list */ - NT_ASSERT(FreeEntry != NULL); - FreeEntry = MmHapRemoveBufferFromFreeList(FreeEntry); - if (!FreeEntry) - { - return NULL; - } - - /* Make sure it's not corrupted */ - FreeEntry = MmHapCheckBufferLinks(FreeEntry); - if (!FreeEntry) - { - return NULL; - } - - /* Do we have space for at least another buffer? */ - if ((MmHapBufferSize(FreeEntry) - Size) >= sizeof(BL_FREE_HEAP_ENTRY)) - { - /* Go to where the new next buffer will start */ - NextEntry = (PBL_BUSY_HEAP_ENTRY)((ULONG_PTR)FreeEntry + Size); - - /* Make the new next buffer point to the next buffer */ - NextEntry->BufferNext.P = MmHapDecodeLink(FreeEntry->BufferNext); - - /* Make the old next buffer point back to the new one */ - MmHapDecodeLink(FreeEntry->BufferNext)->BufferPrevious.P = NextEntry; - - /* Point the new next buffer point back to us */ - NextEntry->BufferPrevious.P = FreeEntry; - - /* Point us to the new next buffer */ - FreeEntry->BufferNext.P = NextEntry; - - /* And insert the new next buffer into the free list */ - MmHapAddToFreeList(NextEntry, 1); - } - - /* Return the entry, which is now allocated */ - return (PBL_BUSY_HEAP_ENTRY)FreeEntry; -} - -NTSTATUS -MmHaInitialize ( - _In_ ULONG HeapSize, - _In_ ULONG HeapAttributes - ) -{ - NTSTATUS Status; - - /* No free list to begin with */ - MmFreeList = NULL; - - /* Configure the minimum heap size and allocation attributes */ - HapMinimumHeapSize = ALIGN_UP_BY(HeapSize, PAGE_SIZE); - HapAllocationAttributes = HeapAttributes & 0x20000; - - /* Initialize the heap boundary list */ - InitializeListHead(&MmHeapBoundaries); - - /* Initialize a heap big enough to handle a one pointer long allocation */ - Status = MmHapHeapAllocatorExtend(sizeof(PVOID)); - if (NT_SUCCESS(Status)) - { - /* The heap is ready! */ - HapInitializationStatus = 1; - Status = STATUS_SUCCESS; - } - - /* Return initialization status */ - return Status; -} - -PVOID -BlMmAllocateHeap ( - _In_ SIZE_T Size - ) -{ - ULONG BufferSize; - PBL_HEAP_BOUNDARIES Heap; - PBL_BUSY_HEAP_ENTRY BusyEntry, FreeEntry, NextEntry; - - /* Ignore heap allocation if the heap allocator isn't ready yet */ - if (HapInitializationStatus != 1) - { - return NULL; - } - - /* Align the buffer size to the minimum size required */ - BufferSize = ALIGN_UP_BY(Size + FIELD_OFFSET(BL_BUSY_HEAP_ENTRY, Buffer), - FIELD_OFFSET(BL_BUSY_HEAP_ENTRY, Buffer)); - - /* Watch out for overflow */ - if (BufferSize <= Size) - { - return NULL; - } - - /* Make sure it's at least big enough to hold a free entry later on */ - if (BufferSize < sizeof(BL_FREE_HEAP_ENTRY)) - { - BufferSize = sizeof(BL_FREE_HEAP_ENTRY); - } - - /* Loop while we try to allocate memory */ - while (1) - { - /* Find a free buffer for this allocation */ - BusyEntry = MmHapFindBufferInFreeList(BufferSize); - if (BusyEntry) - { - break; - } - - /* We couldn't find a free buffer. Do we have any heaps? */ - if (!IsListEmpty(&MmHeapBoundaries)) - { - /* Get the current heap */ - Heap = CONTAINING_RECORD(MmHeapBoundaries.Flink, - BL_HEAP_BOUNDARIES, - ListEntry); - - /* Check if we have space in the heap page for this allocation? */ - FreeEntry = Heap->HeapStart; - NextEntry = (PBL_BUSY_HEAP_ENTRY)((ULONG_PTR)FreeEntry + BufferSize); - - if ((NextEntry >= FreeEntry) && - ((ULONG_PTR)NextEntry <= - Heap->HeapLimit - FIELD_OFFSET(BL_BUSY_HEAP_ENTRY, Buffer))) - { - /* Update the heap top pointer past this allocation */ - Heap->HeapStart = NextEntry; - - /* Make this allocation point to the slot */ - FreeEntry->BufferNext.P = Heap->HeapStart; - - /* And make the free heap entry point back to us */ - Heap->HeapStart->BufferPrevious.P = FreeEntry; - - /* Mark the heap entry as being free and on the heap */ - Heap->HeapStart->BufferNext.BufferFree = 1; - Heap->HeapStart->BufferNext.BufferOnHeap = 1; - - /* The previously freed entry on the heap page is now ours */ - BusyEntry = FreeEntry; - break; - } - } - - /* We have no heaps or space on any heap -- extend the heap and retry */ - if (!NT_SUCCESS(MmHapHeapAllocatorExtend(BufferSize))) - { - EfiPrintf(L"Heap extension failed!\r\n"); - return NULL; - } - - EfiPrintf(L"Heap extended -- trying again\r\n"); - } - - /* Clear all the bits, marking this entry as allocated */ - BusyEntry->BufferNext.P = MmHapDecodeLink(BusyEntry->BufferNext); - - /* Return the entry's data buffer */ - //EfiPrintf(L"Returning buffer at 0x%p\r\n", &BusyEntry->Buffer); - return &BusyEntry->Buffer; -} - -NTSTATUS -BlMmFreeHeap ( - _In_ PVOID Buffer - ) -{ - PBL_BUSY_HEAP_ENTRY BusyEntry; - PBL_HEAP_BOUNDARIES Heap; - PLIST_ENTRY NextEntry; - - /* If the heap is not initialized, fail */ - if (HapInitializationStatus != 1) - { - return STATUS_UNSUCCESSFUL; - } - - /* Get the heap header */ - //EfiPrintf(L"Freeing entry at: %p\r\n", Buffer); - if (Buffer) - { - /* Don't free heap until we discover the corruption */ - return STATUS_SUCCESS; - } - - BusyEntry = CONTAINING_RECORD(Buffer, BL_BUSY_HEAP_ENTRY, Buffer); - - /* Loop all the heaps */ - NextEntry = MmHeapBoundaries.Flink; - while (NextEntry != &MmHeapBoundaries) - { - /* Get the current heap in the list */ - Heap = CONTAINING_RECORD(NextEntry, BL_HEAP_BOUNDARIES, ListEntry); - - /* Is this entry part of this heap? */ - if (((ULONG_PTR)Heap->HeapBase <= (ULONG_PTR)BusyEntry) && - ((ULONG_PTR)BusyEntry < (ULONG_PTR)Heap->HeapStart)) - { - /* Ignore double-free */ - if (BusyEntry->BufferNext.BufferFree) - { - return STATUS_INVALID_PARAMETER; - } - - /* It is -- add it to the free list */ - MmHapAddToFreeList(BusyEntry, 0); - return STATUS_SUCCESS; - } - - /* It isn't, move to the next heap */ - NextEntry = NextEntry->Flink; - } - - /* The entry is not on any valid heap */ - return STATUS_INVALID_PARAMETER; -} - diff --git a/boot/environ/lib/mm/i386/mmx86.c b/boot/environ/lib/mm/i386/mmx86.c deleted file mode 100644 index a0cb15e01d8..00000000000 --- a/boot/environ/lib/mm/i386/mmx86.c +++ /dev/null @@ -1,1151 +0,0 @@ -/* -* COPYRIGHT: See COPYING.ARM in the top level directory -* PROJECT: ReactOS UEFI Boot Library -* FILE: boot/environ/lib/mm/i386/mmx86.c -* PURPOSE: Boot Library Memory Manager x86-Specific Code -* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include "bcd.h" - -#define PTE_BASE 0xC0000000 - -// -// Specific PDE/PTE macros to be used inside the boot library environment -// -#define MiAddressToPte(x) ((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + (ULONG_PTR)MmPteBase)) -#define MiAddressToPde(x) ((PMMPDE)(((((ULONG)(x)) >> 22) << 2) + (ULONG_PTR)MmPdeBase)) -#define MiAddressToPteOffset(x) ((((ULONG)(x)) << 10) >> 22) -#define MiAddressToPdeOffset(x) (((ULONG)(x)) / (1024 * PAGE_SIZE)) - -/* DATA VARIABLES ************************************************************/ - -ULONG_PTR MmArchKsegBase; -ULONG_PTR MmArchKsegBias; -ULONG MmArchLargePageSize; -BL_ADDRESS_RANGE MmArchKsegAddressRange; -ULONG_PTR MmArchTopOfApplicationAddressSpace; -PHYSICAL_ADDRESS Mmx86SelfMapBase; -ULONG MmDeferredMappingCount; -PMMPTE MmPdpt; -PULONG MmArchReferencePage; -PVOID MmPteBase; -PVOID MmPdeBase; -ULONG MmArchReferencePageSize; - -PBL_MM_TRANSLATE_VIRTUAL_ADDRESS Mmx86TranslateVirtualAddress; -PBL_MM_MAP_PHYSICAL_ADDRESS Mmx86MapPhysicalAddress; -PBL_MM_REMAP_VIRTUAL_ADDRESS Mmx86RemapVirtualAddress; -PBL_MM_UNMAP_VIRTUAL_ADDRESS Mmx86UnmapVirtualAddress; -PBL_MM_FLUSH_TLB Mmx86FlushTlb; -PBL_MM_FLUSH_TLB_ENTRY Mmx86FlushTlbEntry; -PBL_MM_DESTROY_SELF_MAP Mmx86DestroySelfMap; - -PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap; -PBL_MM_FLUSH_TLB BlMmFlushTlb; -PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE BlMmMoveVirtualAddressRange; -PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE BlMmZeroVirtualAddressRange; - -PBL_MM_FLUSH_TLB Mmx86FlushTlb; - -/* FUNCTIONS *****************************************************************/ - -BOOLEAN -BlMmIsTranslationEnabled ( - VOID - ) -{ - /* Return if paging is on */ - return ((CurrentExecutionContext) && - (CurrentExecutionContext->ContextFlags & BL_CONTEXT_PAGING_ON)); -} - -VOID -MmArchNullFunction ( - VOID - ) -{ - /* Nothing to do */ - return; -} - -VOID -MmDefRelocateSelfMap ( - VOID - ) -{ - if (MmPteBase != (PVOID)PTE_BASE) - { - EfiPrintf(L"Supposed to relocate CR3\r\n"); - } -} - -NTSTATUS -MmDefMoveVirtualAddressRange ( - _In_ PVOID DestinationAddress, - _In_ PVOID SourceAddress, - _In_ ULONGLONG Size - ) -{ - EfiPrintf(L"Supposed to move shit\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -MmDefZeroVirtualAddressRange ( - _In_ PVOID DestinationAddress, - _In_ ULONGLONG Size - ) -{ - EfiPrintf(L"Supposed to zero shit\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -BOOLEAN -MmArchTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_opt_ PULONG CachingFlags - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor; - - /* Check if paging is on */ - if ((CurrentExecutionContext) && - (CurrentExecutionContext->ContextFlags & BL_CONTEXT_PAGING_ON)) - { - /* Yes -- we have to translate this from virtual */ - return Mmx86TranslateVirtualAddress(VirtualAddress, - PhysicalAddress, - CachingFlags); - } - - /* Look in all descriptors except truncated and firmware ones */ - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_NO_FIRMWARE_MEMORY & - ~BL_MM_INCLUDE_TRUNCATED_MEMORY, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - (ULONG_PTR)VirtualAddress >> PAGE_SHIFT); - - /* Return the virtual address as the physical address */ - if (PhysicalAddress) - { - PhysicalAddress->HighPart = 0; - PhysicalAddress->LowPart = (ULONG_PTR)VirtualAddress; - } - - /* There's no caching on physical memory */ - if (CachingFlags) - { - *CachingFlags = 0; - } - - /* Success is if we found a descriptor */ - return Descriptor != NULL; -} - -VOID -MmDefpDestroySelfMap ( - VOID - ) -{ - EfiPrintf(L"No destroy\r\n"); -} - -VOID -MmDefpFlushTlbEntry ( - _In_ PVOID VirtualAddress - ) -{ - /* Flush the TLB */ - __invlpg(VirtualAddress); -} - -VOID -MmDefpFlushTlb ( - VOID - ) -{ - /* Flush the TLB */ - __writecr3(__readcr3()); -} - -NTSTATUS -MmDefpUnmapVirtualAddress ( - _In_ PVOID VirtualAddress, - _In_ ULONG Size - ) -{ - EfiPrintf(L"No unmap\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -MmDefpRemapVirtualAddress ( - _In_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_ PVOID VirtualAddress, - _In_ ULONG Size, - _In_ ULONG CacheAttributes - ) -{ - EfiPrintf(L"No remap\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -MmDefpMapPhysicalAddress ( - _In_ PHYSICAL_ADDRESS PhysicalAddress, - _In_ PVOID VirtualAddress, - _In_ ULONG Size, - _In_ ULONG CacheAttributes - ) -{ - BOOLEAN Enabled; - ULONG i, PageCount, PdeOffset; - ULONGLONG CurrentAddress; - PMMPDE Pde; - PMMPTE Pte; - PMMPTE PageTable; - PHYSICAL_ADDRESS PageTableAddress; - NTSTATUS Status; - - /* Check if paging is on yet */ - Enabled = BlMmIsTranslationEnabled(); - - /* Get the physical address aligned */ - CurrentAddress = (PhysicalAddress.QuadPart >> PAGE_SHIFT) << PAGE_SHIFT; - - /* Get the number of pages and loop through each one */ - PageCount = Size >> PAGE_SHIFT; - for (i = 0; i < PageCount; i++) - { - /* Check if translation already exists for this page */ - if (Mmx86TranslateVirtualAddress(VirtualAddress, NULL, NULL)) - { - /* Ignore it and move to the next one */ - VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); - CurrentAddress += PAGE_SIZE; - continue; - } - - /* Get the PDE offset */ - PdeOffset = MiAddressToPdeOffset(VirtualAddress); - - /* Check if paging is actually turned on */ - if (Enabled) - { - /* Get the PDE entry using the self-map */ - Pde = MiAddressToPde(VirtualAddress); - } - else - { - /* Get it using our physical mappings */ - Pde = &MmPdpt[PdeOffset]; - PageTable = (PMMPDE)(Pde->u.Hard.PageFrameNumber << PAGE_SHIFT); - } - - /* Check if we don't yet have a PDE */ - if (!Pde->u.Hard.Valid) - { - /* Allocate a page table */ - Status = MmPapAllocatePhysicalPagesInRange(&PageTableAddress, - BlLoaderPageDirectory, - 1, - 0, - 0, - &MmMdlUnmappedAllocated, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"PDE alloc failed!\r\n"); - EfiStall(1000000); - return STATUS_NO_MEMORY; - } - - /* This is our page table */ - PageTable = (PVOID)(ULONG_PTR)PageTableAddress.QuadPart; - - /* Build the PDE for it */ - Pde->u.Hard.PageFrameNumber = PageTableAddress.QuadPart >> PAGE_SHIFT; - Pde->u.Hard.Write = 1; - Pde->u.Hard.CacheDisable = 1; - Pde->u.Hard.WriteThrough = 1; - Pde->u.Hard.Valid = 1; - - /* Check if paging is enabled */ - if (Enabled) - { - /* Then actually, get the page table's virtual address */ - PageTable = (PVOID)PAGE_ROUND_DOWN(MiAddressToPte(VirtualAddress)); - - /* Flush the TLB */ - Mmx86FlushTlb(); - } - - /* Zero out the page table */ - RtlZeroMemory(PageTable, PAGE_SIZE); - - /* Reset caching attributes now */ - Pde->u.Hard.CacheDisable = 0; - Pde->u.Hard.WriteThrough = 0; - - /* Check for paging again */ - if (Enabled) - { - /* Flush the TLB entry for the page table only */ - Mmx86FlushTlbEntry(PageTable); - } - } - - /* Add a reference to this page table */ - MmArchReferencePage[PdeOffset]++; - - /* Check if a physical address was given */ - if (PhysicalAddress.QuadPart != -1) - { - /* Check if paging is turned on */ - if (Enabled) - { - /* Get the PTE using the self-map */ - Pte = MiAddressToPte(VirtualAddress); - } - else - { - /* Get the PTE using physical addressing */ - Pte = &PageTable[MiAddressToPteOffset(VirtualAddress)]; - } - - /* Build a valid PTE for it */ - Pte->u.Hard.PageFrameNumber = CurrentAddress >> PAGE_SHIFT; - Pte->u.Hard.Write = 1; - Pte->u.Hard.Valid = 1; - - /* Check if this is uncached */ - if (CacheAttributes == BlMemoryUncached) - { - /* Set the flags */ - Pte->u.Hard.CacheDisable = 1; - Pte->u.Hard.WriteThrough = 1; - } - else if (CacheAttributes == BlMemoryWriteThrough) - { - /* It's write-through, set the flag */ - Pte->u.Hard.WriteThrough = 1; - } - } - - /* Move to the next physical/virtual address */ - VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); - CurrentAddress += PAGE_SIZE; - } - - /* All done! */ - return STATUS_SUCCESS; -} - -BOOLEAN -MmDefpTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_opt_ PULONG CacheAttributes - ) -{ - PMMPDE Pde; - PMMPTE Pte; - PMMPTE PageTable; - BOOLEAN Enabled; - - /* Is there no page directory yet? */ - if (!MmPdpt) - { - return FALSE; - } - - /* Is paging enabled? */ - Enabled = BlMmIsTranslationEnabled(); - - /* Check if paging is actually turned on */ - if (Enabled) - { - /* Get the PDE entry using the self-map */ - Pde = MiAddressToPde(VirtualAddress); - } - else - { - /* Get it using our physical mappings */ - Pde = &MmPdpt[MiAddressToPdeOffset(VirtualAddress)]; - } - - /* Is the PDE valid? */ - if (!Pde->u.Hard.Valid) - { - return FALSE; - } - - /* Check if paging is turned on */ - if (Enabled) - { - /* Get the PTE using the self-map */ - Pte = MiAddressToPte(VirtualAddress); - } - else - { - /* Get the PTE using physical addressing */ - PageTable = (PMMPTE)(Pde->u.Hard.PageFrameNumber << PAGE_SHIFT); - Pte = &PageTable[MiAddressToPteOffset(VirtualAddress)]; - } - - /* Is the PTE valid? */ - if (!Pte->u.Hard.Valid) - { - return FALSE; - } - - /* Does caller want the physical address? */ - if (PhysicalAddress) - { - /* Return it */ - PhysicalAddress->QuadPart = (Pte->u.Hard.PageFrameNumber << PAGE_SHIFT) + - BYTE_OFFSET(VirtualAddress); - } - - /* Does caller want cache attributes? */ - if (CacheAttributes) - { - /* Not yet -- lie and say it's cached */ - EfiPrintf(L"Cache checking not yet enabled\r\n"); - *CacheAttributes = BlMemoryWriteBack; - } - - /* It exists! */ - return TRUE; -} - -NTSTATUS -MmMapPhysicalAddress ( - _Inout_ PPHYSICAL_ADDRESS PhysicalAddressPtr, - _Inout_ PVOID* VirtualAddressPtr, - _Inout_ PULONGLONG SizePtr, - _In_ ULONG CacheAttributes - ) -{ - ULONGLONG Size; - ULONGLONG PhysicalAddress; - PVOID VirtualAddress; - PHYSICAL_ADDRESS TranslatedAddress; - ULONG_PTR CurrentAddress, VirtualAddressEnd; - NTSTATUS Status; - - /* Fail if any parameters are missing */ - if (!(PhysicalAddressPtr) || !(VirtualAddressPtr) || !(SizePtr)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Fail if the size is over 32-bits */ - Size = *SizePtr; - if (Size > 0xFFFFFFFF) - { - return STATUS_INVALID_PARAMETER; - } - - /* Nothing to do if we're in physical mode */ - if (MmTranslationType == BlNone) - { - return STATUS_SUCCESS; - } - - /* Can't use virtual memory in real mode */ - if (CurrentExecutionContext->Mode == BlRealMode) - { - return STATUS_UNSUCCESSFUL; - } - - /* Capture the current virtual and physical addresses */ - VirtualAddress = *VirtualAddressPtr; - PhysicalAddress = PhysicalAddressPtr->QuadPart; - - /* Check if a physical address was requested */ - if (PhysicalAddress != 0xFFFFFFFF) - { - /* Round down the base addresses */ - PhysicalAddress = PAGE_ROUND_DOWN(PhysicalAddress); - VirtualAddress = (PVOID)PAGE_ROUND_DOWN(VirtualAddress); - - /* Round up the size */ - Size = ROUND_TO_PAGES(PhysicalAddressPtr->QuadPart - - PhysicalAddress + - Size); - - /* Loop every virtual page */ - CurrentAddress = (ULONG_PTR)VirtualAddress; - VirtualAddressEnd = CurrentAddress + Size - 1; - while (CurrentAddress < VirtualAddressEnd) - { - /* Get the physical page of this virtual page */ - if (MmArchTranslateVirtualAddress((PVOID)CurrentAddress, - &TranslatedAddress, - &CacheAttributes)) - { - /* Make sure the physical page of the virtual page, matches our page */ - if (TranslatedAddress.QuadPart != - (PhysicalAddress + - (CurrentAddress - (ULONG_PTR)VirtualAddress))) - { - /* There is an existing virtual mapping for a different address */ - EfiPrintf(L"Existing mapping exists: %lx vs %lx\r\n", - TranslatedAddress.QuadPart, - PhysicalAddress + (CurrentAddress - (ULONG_PTR)VirtualAddress)); - EfiStall(10000000); - return STATUS_INVALID_PARAMETER; - } - } - - /* Try the next one */ - CurrentAddress += PAGE_SIZE; - } - } - - /* Aactually do the mapping */ - TranslatedAddress.QuadPart = PhysicalAddress; - Status = Mmx86MapPhysicalAddress(TranslatedAddress, - VirtualAddress, - Size, - CacheAttributes); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to map!: %lx\r\n", Status); - EfiStall(1000000); - return Status; - } - - /* Return aligned/fixed up output parameters */ - PhysicalAddressPtr->QuadPart = PhysicalAddress; - *VirtualAddressPtr = VirtualAddress; - *SizePtr = Size; - - /* Flush the TLB if paging is enabled */ - if (BlMmIsTranslationEnabled()) - { - Mmx86FlushTlb(); - } - - /* All good! */ - return STATUS_SUCCESS; -} - -NTSTATUS -Mmx86MapInitStructure ( - _In_ PVOID VirtualAddress, - _In_ ULONGLONG Size, - _In_ PHYSICAL_ADDRESS PhysicalAddress - ) -{ - NTSTATUS Status; - - /* Make a virtual mapping for this physical address */ - Status = MmMapPhysicalAddress(&PhysicalAddress, &VirtualAddress, &Size, 0); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Nothing else to do if we're not in paging mode */ - if (MmTranslationType == BlNone) - { - return STATUS_SUCCESS; - } - - /* Otherwise, remove this region from the list of free virtual ranges */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlFreeVirtual, - BL_MM_REMOVE_VIRTUAL_REGION_FLAG, - (ULONG_PTR)VirtualAddress >> PAGE_SHIFT, - Size >> PAGE_SHIFT, - 0); - if (!NT_SUCCESS(Status)) - { - /* Unmap the address if that failed */ - MmUnmapVirtualAddress(&VirtualAddress, &Size); - } - - /* Return back to caller */ - return Status; -} - -VOID -MmMdDbgDumpList ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST DescriptorList, - _In_opt_ ULONG MaxCount - ) -{ - ULONGLONG EndPage, VirtualEndPage; - PBL_MEMORY_DESCRIPTOR MemoryDescriptor; - PLIST_ENTRY NextEntry; - - /* If no maximum was provided, use essentially infinite */ - if (MaxCount == 0) - { - MaxCount = 0xFFFFFFFF; - } - - /* Loop the list as long as there's entries and max isn't reached */ - NextEntry = DescriptorList->First->Flink; - while ((NextEntry != DescriptorList->First) && (MaxCount--)) - { - /* Get the descriptor */ - MemoryDescriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - - /* Get the descriptor end page, and see if it was virtually mapepd */ - EndPage = MemoryDescriptor->BasePage + MemoryDescriptor->PageCount; - if (MemoryDescriptor->VirtualPage) - { - /* Get the virtual end page too, then */ - VirtualEndPage = MemoryDescriptor->VirtualPage + - MemoryDescriptor->PageCount; - } - else - { - VirtualEndPage = 0; - } - - /* Print out the descriptor, physical range, virtual range, and type */ - EfiPrintf(L"%p - [%08llx-%08llx @ %08llx-%08llx]:%x\r\n", - MemoryDescriptor, - MemoryDescriptor->BasePage << PAGE_SHIFT, - (EndPage << PAGE_SHIFT) - 1, - MemoryDescriptor->VirtualPage << PAGE_SHIFT, - VirtualEndPage ? (VirtualEndPage << PAGE_SHIFT) - 1 : 0, - (ULONG)MemoryDescriptor->Type); - - /* Next entry */ - NextEntry = NextEntry->Flink; - } -} - -NTSTATUS -Mmx86pMapMemoryRegions ( - _In_ ULONG Phase, - _In_ PBL_MEMORY_DATA MemoryData - ) -{ - BOOLEAN DoDeferred; - ULONG DescriptorCount; - PBL_MEMORY_DESCRIPTOR Descriptor; - ULONG FinalOffset; - PHYSICAL_ADDRESS PhysicalAddress; - ULONGLONG Size; - NTSTATUS Status; - PVOID VirtualAddress; - BL_MEMORY_DESCRIPTOR_LIST FirmwareMdl; - PLIST_ENTRY Head, NextEntry; - - /* Check which phase this is */ - if (Phase == 1) - { - /* In phase 1 we don't initialize deferred mappings */ - DoDeferred = FALSE; - } - else - { - /* Don't do anything if there's nothing to initialize */ - if (!MmDeferredMappingCount) - { - return STATUS_SUCCESS; - } - - /* We'll do deferred descriptors in phase 2 */ - DoDeferred = TRUE; - } - - /* - * Because BL supports cross x86-x64 application launches and a LIST_ENTRY - * is of variable size, care must be taken here to ensure that we see a - * consistent view of descriptors. BL uses some offset magic to figure out - * where the data actually starts, since everything is ULONGLONG past the - * LIST_ENTRY itself - */ - FinalOffset = MemoryData->MdListOffset + MemoryData->DescriptorOffset; - Descriptor = (PBL_MEMORY_DESCRIPTOR)((ULONG_PTR)MemoryData + FinalOffset - - FIELD_OFFSET(BL_MEMORY_DESCRIPTOR, BasePage)); - - /* Scan all of them */ - DescriptorCount = MemoryData->DescriptorCount; - while (DescriptorCount != 0) - { - /* Ignore application data */ - if (Descriptor->Type != BlApplicationData) - { - /* If this is a ramdisk, do it in phase 2 */ - if ((Descriptor->Type == BlLoaderRamDisk) == DoDeferred) - { - /* Get the current physical address and size */ - PhysicalAddress.QuadPart = Descriptor->BasePage << PAGE_SHIFT; - Size = Descriptor->PageCount << PAGE_SHIFT; - - /* Check if it was already mapped */ - if (Descriptor->VirtualPage) - { - /* Use the existing address */ - VirtualAddress = (PVOID)(ULONG_PTR)(Descriptor->VirtualPage << PAGE_SHIFT); - } - else - { - /* Use the physical address */ - VirtualAddress = (PVOID)(ULONG_PTR)PhysicalAddress.QuadPart; - } - - /* Crete the mapping */ - Status = Mmx86MapInitStructure(VirtualAddress, - Size, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Check if we're in phase 1 and deferring RAM disk */ - if ((Phase == 1) && (Descriptor->Type == BlLoaderRamDisk)) - { - MmDeferredMappingCount++; - } - } - - /* Move on to the next descriptor */ - DescriptorCount--; - Descriptor = (PBL_MEMORY_DESCRIPTOR)((ULONG_PTR)Descriptor + MemoryData->DescriptorSize); - } - - /* In phase 1, also do UEFI mappings */ - if (Phase != 2) - { - /* Get the memory map */ - MmMdInitializeListHead(&FirmwareMdl); - Status = MmFwGetMemoryMap(&FirmwareMdl, BL_MM_FLAG_REQUEST_COALESCING); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Iterate over it */ - Head = FirmwareMdl.First; - NextEntry = Head->Flink; - while (NextEntry != Head) - { - /* Check if this is a UEFI-related descriptor, unless it's the self-map page */ - Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - if (((Descriptor->Type == BlEfiBootMemory) || - (Descriptor->Type == BlEfiRuntimeCodeMemory) || - (Descriptor->Type == BlEfiRuntimeDataMemory) || // WINBUG? - (Descriptor->Type == BlLoaderMemory)) && - ((Descriptor->BasePage << PAGE_SHIFT) != Mmx86SelfMapBase.QuadPart)) - { - /* Identity-map it */ - PhysicalAddress.QuadPart = Descriptor->BasePage << PAGE_SHIFT; - Status = Mmx86MapInitStructure((PVOID)((ULONG_PTR)Descriptor->BasePage << PAGE_SHIFT), - Descriptor->PageCount << PAGE_SHIFT, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Move to the next descriptor */ - NextEntry = NextEntry->Flink; - } - - /* Reset */ - NextEntry = Head->Flink; - while (NextEntry != Head) - { - /* Get the descriptor */ - Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - /* Skip to the next entry before we free */ - NextEntry = NextEntry->Flink; - - /* Remove and free it */ - MmMdRemoveDescriptorFromList(&FirmwareMdl, Descriptor); - MmMdFreeDescriptor(Descriptor); - } - } - - /* All library mappings identity mapped now */ - return STATUS_SUCCESS; -} - -NTSTATUS -Mmx86InitializeMemoryMap ( - _In_ ULONG Phase, - _In_ PBL_MEMORY_DATA MemoryData - ) -{ - ULONG ImageSize; - PVOID ImageBase; - KDESCRIPTOR Gdt, Idt; - NTSTATUS Status; - PHYSICAL_ADDRESS PhysicalAddress; - - /* If this is phase 2, map the memory regions */ - if (Phase != 1) - { - return Mmx86pMapMemoryRegions(Phase, MemoryData); - } - - /* Get the application image base/size */ - Status = BlGetApplicationBaseAndSize(&ImageBase, &ImageSize); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Map the image back at the same place */ - PhysicalAddress.QuadPart = (ULONG_PTR)ImageBase; - Status = Mmx86MapInitStructure(ImageBase, ImageSize, PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Map the first 4MB of memory */ - PhysicalAddress.QuadPart = 0; - Status = Mmx86MapInitStructure(NULL, 4 * 1024 * 1024, PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Map the GDT */ - _sgdt(&Gdt.Limit); - PhysicalAddress.QuadPart = Gdt.Base; - Status = Mmx86MapInitStructure((PVOID)Gdt.Base, Gdt.Limit + 1, PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Map the IDT */ - __sidt(&Idt.Limit); - PhysicalAddress.QuadPart = Idt.Base; - Status = Mmx86MapInitStructure((PVOID)Idt.Base, Idt.Limit + 1, PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Map the reference page */ - PhysicalAddress.QuadPart = (ULONG_PTR)MmArchReferencePage; - Status = Mmx86MapInitStructure(MmArchReferencePage, - MmArchReferencePageSize, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* More to do */ - return Mmx86pMapMemoryRegions(Phase, MemoryData); -} - -NTSTATUS -MmDefInitializeTranslation ( - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType - ) -{ - NTSTATUS Status; - PHYSICAL_ADDRESS PhysicalAddress; - ULONG PdeIndex; - - /* Set the global function pointers for memory translation */ - Mmx86TranslateVirtualAddress = MmDefpTranslateVirtualAddress; - Mmx86MapPhysicalAddress = MmDefpMapPhysicalAddress; - Mmx86UnmapVirtualAddress = MmDefpUnmapVirtualAddress; - Mmx86RemapVirtualAddress = MmDefpRemapVirtualAddress; - Mmx86FlushTlb = MmDefpFlushTlb; - Mmx86FlushTlbEntry = MmDefpFlushTlbEntry; - Mmx86DestroySelfMap = MmDefpDestroySelfMap; - - /* Check what mode we're currently in */ - if (TranslationType == BlVirtual) - { - EfiPrintf(L"Virtual->Virtual not yet supported\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - else if (TranslationType != BlNone) - { - /* Not even Windows supports PAE->Virtual downgrade */ - return STATUS_NOT_IMPLEMENTED; - } - - /* The None->Virtual case */ - MmPdpt = NULL; - Mmx86SelfMapBase.QuadPart = 0; - MmArchReferencePage = NULL; - - /* Truncate all memory above 4GB so that we don't use it */ - Status = MmPaTruncateMemory(0x100000); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Allocate a page directory */ - Status = MmPapAllocatePhysicalPagesInRange(&PhysicalAddress, - BlLoaderPageDirectory, - 1, - 0, - 0, - &MmMdlUnmappedAllocated, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Zero out the page directory */ - MmPdpt = (PVOID)PhysicalAddress.LowPart; - RtlZeroMemory(MmPdpt, PAGE_SIZE); - - /* Set the page size */ - MmArchReferencePageSize = PAGE_SIZE; - - /* Allocate the self-map page */ - Status = MmPapAllocatePhysicalPagesInRange(&PhysicalAddress, - BlLoaderReferencePage, - 1, - 0, - 0, - &MmMdlUnmappedAllocated, - 0, - 0); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Set the reference page */ - MmArchReferencePage = (PVOID)PhysicalAddress.LowPart; - - /* Zero it out */ - RtlZeroMemory(MmArchReferencePage, MmArchReferencePageSize); - - /* Allocate 4MB worth of self-map pages */ - Status = MmPaReserveSelfMapPages(&Mmx86SelfMapBase, - (4 * 1024 * 1024) >> PAGE_SHIFT, - (4 * 1024 * 1024) >> PAGE_SHIFT); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Zero them out */ - RtlZeroMemory((PVOID)Mmx86SelfMapBase.LowPart, 4 * 1024 * 1024); - EfiPrintf(L"PDPT at 0x%p Reference Page at 0x%p Self-map at 0x%p\r\n", - MmPdpt, MmArchReferencePage, Mmx86SelfMapBase.LowPart); - - /* Align PTE base to 4MB region */ - MmPteBase = (PVOID)(Mmx86SelfMapBase.LowPart & ~0x3FFFFF); - - /* The PDE is the PTE of the PTE base */ - MmPdeBase = MiAddressToPte(MmPteBase); - PdeIndex = MiAddressToPdeOffset(MmPdeBase); - MmPdpt[PdeIndex].u.Hard.Valid = 1; - MmPdpt[PdeIndex].u.Hard.Write = 1; - MmPdpt[PdeIndex].u.Hard.PageFrameNumber = (ULONG_PTR)MmPdpt >> PAGE_SHIFT; - MmArchReferencePage[PdeIndex]++; - - /* Remove PTE_BASE from free virtual memory */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlFreeVirtual, - BL_MM_REMOVE_VIRTUAL_REGION_FLAG, - PTE_BASE >> PAGE_SHIFT, - (4 * 1024 * 1024) >> PAGE_SHIFT, - 0); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Remove HAL_HEAP from free virtual memory */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlFreeVirtual, - BL_MM_REMOVE_VIRTUAL_REGION_FLAG, - MM_HAL_VA_START >> PAGE_SHIFT, - (4 * 1024 * 1024) >> PAGE_SHIFT, - 0); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Initialize the virtual->physical memory mappings */ - Status = Mmx86InitializeMemoryMap(1, MemoryData); - if (!NT_SUCCESS(Status)) - { - goto Failure; - } - - /* Turn on paging with the new CR3 */ - __writecr3((ULONG_PTR)MmPdpt); - BlpArchEnableTranslation(); - EfiPrintf(L"Paging... %d\r\n", BlMmIsTranslationEnabled()); - - /* Return success */ - return Status; - -Failure: - /* Free reference page if we allocated it */ - if (MmArchReferencePage) - { - PhysicalAddress.QuadPart = (ULONG_PTR)MmArchReferencePage; - BlMmFreePhysicalPages(PhysicalAddress); - } - - /* Free page directory if we allocated it */ - if (MmPdpt) - { - PhysicalAddress.QuadPart = (ULONG_PTR)MmPdpt; - BlMmFreePhysicalPages(PhysicalAddress); - } - - /* Free the self map if we allocated it */ - if (Mmx86SelfMapBase.QuadPart) - { - MmPaReleaseSelfMapPages(Mmx86SelfMapBase); - } - - /* All done */ - return Status; -} - -NTSTATUS -MmArchInitialize ( - _In_ ULONG Phase, - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType, - _In_ BL_TRANSLATION_TYPE RequestedTranslationType - ) -{ - NTSTATUS Status; - ULONGLONG IncreaseUserVa, PerfCounter, CpuRandom; - CPU_INFO CpuInfo; - - /* For phase 2, just map deferred regions */ - if (Phase != 1) - { - return Mmx86pMapMemoryRegions(2, MemoryData); - } - - /* What translation type are we switching to? */ - switch (RequestedTranslationType) - { - /* Physical memory */ - case BlNone: - - /* Initialize everything to default/null values */ - MmArchLargePageSize = 1; - MmArchKsegBase = 0; - MmArchKsegBias = 0; - MmArchKsegAddressRange.Minimum = 0; - MmArchKsegAddressRange.Maximum = (ULONGLONG)~0; - MmArchTopOfApplicationAddressSpace = 0; - Mmx86SelfMapBase.QuadPart = 0; - - /* Set stub functions */ - BlMmRelocateSelfMap = MmArchNullFunction; - BlMmFlushTlb = MmArchNullFunction; - - /* Set success */ - Status = STATUS_SUCCESS; - break; - - case BlVirtual: - - /* Set the large page size to 1024 pages (4MB) */ - MmArchLargePageSize = (4 * 1024 * 1024) / PAGE_SIZE; - - /* Check if /USERVA option was used */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdOSLoaderInteger_IncreaseUserVa, - &IncreaseUserVa); - if (NT_SUCCESS(Status) && (IncreaseUserVa)) - { - /* Yes -- load the kernel at 0xE0000000 instead */ - MmArchKsegBase = 0xE0000000; - } - else - { - /* Nope, load at the standard 2GB split */ - MmArchKsegBase = 0x80000000; - } - - /* Check if CPUID 01h is supported */ - CpuRandom = 0; - if (BlArchIsCpuIdFunctionSupported(1)) - { - /* Call it */ - BlArchCpuId(1, 0, &CpuInfo); - - /* Check if RDRAND is supported */ - if (CpuInfo.Ecx & 0x40000000) - { - EfiPrintf(L"Your CPU can do RDRAND! Good for you!\r\n"); - CpuRandom = 0; - } - } - - /* Read the TSC */ - PerfCounter = BlArchGetPerformanceCounter(); - PerfCounter >>= 4; - _rotl16(PerfCounter, 5); - - /* Set the address range */ - MmArchKsegAddressRange.Minimum = 0; - MmArchKsegAddressRange.Maximum = (ULONGLONG)~0; - - /* Set the KASLR bias */ - MmArchKsegBias = ((PerfCounter ^ CpuRandom) & 0xFFF) << 12; - MmArchKsegBias = 0; - MmArchKsegBase += MmArchKsegBias; - - /* Set the kernel range */ - MmArchKsegAddressRange.Minimum = MmArchKsegBase; - MmArchKsegAddressRange.Maximum = (ULONGLONG)~0; - - /* Set the boot application top maximum */ - MmArchTopOfApplicationAddressSpace = 0x70000000 - 1; // Windows bug - - /* Initialize virtual address space translation */ - Status = MmDefInitializeTranslation(MemoryData, TranslationType); - if (NT_SUCCESS(Status)) - { - /* Set stub functions */ - BlMmRelocateSelfMap = MmDefRelocateSelfMap; - BlMmFlushTlb = Mmx86FlushTlb; - BlMmMoveVirtualAddressRange = MmDefMoveVirtualAddressRange; - BlMmZeroVirtualAddressRange = MmDefZeroVirtualAddressRange; - } - break; - - case BlPae: - - /* We don't support PAE */ - Status = STATUS_NOT_SUPPORTED; - break; - - default: - - /* Invalid architecture type*/ - Status = STATUS_INVALID_PARAMETER; - break; - } - - /* Back to caller */ - return Status; -} diff --git a/boot/environ/lib/mm/mm.c b/boot/environ/lib/mm/mm.c deleted file mode 100644 index e2ea911e0cf..00000000000 --- a/boot/environ/lib/mm/mm.c +++ /dev/null @@ -1,657 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/mm.c - * PURPOSE: Boot Library Memory Manager Core - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include "bcd.h" - -/* DATA VARIABLES ************************************************************/ - -/* This is a bug in Windows, but is required for MmTrInitialize to load */ -BL_TRANSLATION_TYPE MmTranslationType = BlMax; -BL_TRANSLATION_TYPE MmOriginalTranslationType; -ULONG MmDescriptorCallTreeCount; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -TrpGenerateMappingTracker ( - _In_ PVOID VirtualAddress, - _In_ ULONG Flags, - _In_ LARGE_INTEGER PhysicalAddress, - _In_ ULONGLONG Size - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor, NextDescriptor; - PLIST_ENTRY ListHead, NextEntry; - - /* Increment descriptor call count */ - MmDescriptorCallTreeCount++; - - /* Initialize a descriptor for this allocation */ - Descriptor = MmMdInitByteGranularDescriptor(Flags, - 0, - PhysicalAddress.QuadPart, - (ULONG_PTR)VirtualAddress, - Size); - - /* Loop the current tracker list */ - ListHead = MmMdlMappingTrackers.First; - NextEntry = ListHead->Flink; - if (IsListEmpty(ListHead)) - { - /* If it's empty, just add the descriptor at the end */ - InsertTailList(ListHead, &Descriptor->ListEntry); - goto Quickie; - } - - /* Otherwise, go to the last descriptor */ - NextDescriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - while (NextDescriptor->VirtualPage < Descriptor->VirtualPage) - { - /* Keep going... */ - NextEntry = NextEntry->Flink; - NextDescriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - - /* If we hit the end of the list, just add it at the end */ - if (NextEntry == ListHead) - { - goto Quickie; - } - - /* Otherwise, add it right after this descriptor */ - InsertTailList(&NextDescriptor->ListEntry, &Descriptor->ListEntry); - } - -Quickie: - /* Release any global descriptors allocated */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return STATUS_SUCCESS; -} - -NTSTATUS -MmTrInitialize ( - VOID - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor; - NTSTATUS Status; - PLIST_ENTRY NextEntry; - - /* Nothing to track if we're using physical memory */ - if (MmTranslationType == BlNone) - { - return STATUS_SUCCESS; - } - - /* Initialize all the virtual lists */ - MmMdInitializeListHead(&MmMdlMappingTrackers); - MmMdlMappingTrackers.Type = BlMdTracker; - MmMdInitializeListHead(&MmMdlFreeVirtual); - MmMdlFreeVirtual.Type = BlMdVirtual; - - /* Initialize a 4GB free descriptor */ - Descriptor = MmMdInitByteGranularDescriptor(0, - BlConventionalMemory, - 0, - 0, - ((ULONGLONG)4 * 1024 * 1024 * 1024) >> - PAGE_SHIFT); - if (!Descriptor) - { - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* Add this 4GB region to the free virtual address space list */ - Status = MmMdAddDescriptorToList(&MmMdlFreeVirtual, - Descriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG); - if (!NT_SUCCESS(Status)) - { - RtlZeroMemory(Descriptor, sizeof(*Descriptor)); - goto Quickie; - } - - /* Remove any reserved regions of virtual address space */ - NextEntry = MmMdlReservedAllocated.First->Flink; - while (NextEntry != MmMdlReservedAllocated.First) - { - /* Grab the descriptor and see if it's mapped */ - Descriptor = CONTAINING_RECORD(NextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - if (Descriptor->VirtualPage) - { - EfiPrintf(L"Need to handle reserved allocation: %llx %llx\r\n", - Descriptor->VirtualPage, Descriptor->PageCount); - EfiStall(100000); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - } - - /* Next entry */ - NextEntry = NextEntry->Flink; - } - - /* Set success if we made it */ - Status = STATUS_SUCCESS; - -Quickie: - /* Return back to caller */ - return Status; -} - -NTSTATUS -BlMmRemoveBadMemory ( - VOID - ) -{ - BOOLEAN AllowBad; - NTSTATUS Status; - PULONGLONG BadPages; - ULONGLONG BadPageCount; - - /* First check if bad memory access is allowed */ - AllowBad = FALSE; - Status = BlGetBootOptionBoolean(BlpApplicationEntry.BcdData, - BcdLibraryBoolean_AllowBadMemoryAccess, - &AllowBad); - if ((NT_SUCCESS(Status)) && (AllowBad)) - { - /* No point checking the list if it is */ - return STATUS_SUCCESS; - } - - /* Otherwise, check if there's a persisted bad page list */ - Status = BlpGetBootOptionIntegerList(BlpApplicationEntry.BcdData, - BcdLibraryIntegerList_BadMemoryList, - &BadPages, - &BadPageCount, - TRUE); - if (NT_SUCCESS(Status)) - { - EfiPrintf(L"Persistent bad page list not supported\r\n"); - return STATUS_NOT_IMPLEMENTED; - } - - /* All done here */ - return STATUS_SUCCESS; -} - -NTSTATUS -BlMmMapPhysicalAddressEx ( - _In_ PVOID* VirtualAddress, - _In_ ULONG Flags, - _In_ ULONGLONG Size, - _In_ PHYSICAL_ADDRESS PhysicalAddress - ) -{ - NTSTATUS Status; - PVOID MappingAddress; - PHYSICAL_ADDRESS MappedAddress; - PVOID MappedBase; - ULONGLONG MapSize; - UCHAR CacheAttributes; - ULONGLONG BasePage, EndPage, MappedPage, FoundBasePage; - ULONGLONG PageOffset, FoundPageCount; - PBL_MEMORY_DESCRIPTOR Descriptor, NewDescriptor; - PBL_MEMORY_DESCRIPTOR_LIST List; - ULONG AddPages; - - /* Increase call depth */ - ++MmDescriptorCallTreeCount; - - /* Check if any parameters are missing */ - if (!(VirtualAddress) || !(Size)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check for fixed allocation without an actual address */ - if ((Flags & BlMemoryFixed) && - (PhysicalAddress.QuadPart == -1) && - !(*VirtualAddress)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check for invalid requirement flag, if one is present */ - if (((Flags & BlMemoryValidAllocationAttributes) != BlMemoryFixed) && - ((Flags & BlMemoryValidAllocationAttributes) != BlMemoryKernelRange) && - (Flags & BlMemoryValidAllocationAttributes)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Check for invalid cache attribute flags */ - if (((Flags & BlMemoryValidCacheAttributeMask) - 1) & - (Flags & BlMemoryValidCacheAttributeMask)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Select an address to map this at */ - Status = MmSelectMappingAddress(&MappingAddress, - *VirtualAddress, - Size, - Flags & BlMemoryValidAllocationAttributes, - Flags, - PhysicalAddress); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Map the selected address, using the appropriate caching attributes */ - MappedAddress = PhysicalAddress; - MapSize = Size; - CacheAttributes = ((Flags & BlMemoryValidCacheAttributeMask) != 0x20) ? - (Flags & BlMemoryValidCacheAttributeMask) : 0; - Status = MmMapPhysicalAddress(&MappedAddress, - &MappingAddress, - &MapSize, - CacheAttributes); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Compute the final address where the mapping was made */ - MappedBase = (PVOID)(ULONG_PTR)((ULONG_PTR)MappingAddress + - PhysicalAddress.QuadPart - - MappedAddress.QuadPart); - MappedAddress.QuadPart = (ULONG_PTR)MappedBase; - - /* Check if we're in physical or virtual mode */ - if (MmTranslationType == BlNone) - { - /* We are in physical mode -- just return this address directly */ - Status = STATUS_SUCCESS; - *VirtualAddress = MappedBase; - goto Quickie; - } - - /* Remove the mapping address from the list of free virtual memory */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlFreeVirtual, - BL_MM_REMOVE_VIRTUAL_REGION_FLAG, - (ULONG_PTR)MappingAddress >> PAGE_SHIFT, - MapSize >> PAGE_SHIFT, - NULL); - if (NT_SUCCESS(Status)) - { - /* And then add an entry for the fact we mapped it */ - Status = TrpGenerateMappingTracker(MappedBase, - CacheAttributes, - PhysicalAddress, - MapSize); - } - - /* Abandon if we didn't update the memory map successfully */ - if (!NT_SUCCESS(Status)) - { - /* Unmap the virtual address so it can be used later */ - MmUnmapVirtualAddress(MappingAddress, &MapSize); - goto Quickie; - } - - /* Check if no real mapping into RAM was made */ - if (PhysicalAddress.QuadPart == -1) - { - /* Then we're done here */ - Status = STATUS_SUCCESS; - *VirtualAddress = MappedBase; - goto Quickie; - } - - - /* Loop over the entire allocation */ - BasePage = MappedAddress.QuadPart >> PAGE_SHIFT; - EndPage = (MappedAddress.QuadPart + MapSize) >> PAGE_SHIFT; - MappedPage = (ULONG_PTR)MappingAddress >> PAGE_SHIFT; - do - { - /* Start with the unmapped allocated list */ - List = &MmMdlUnmappedAllocated; - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_UNMAPPED_ALLOCATED, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - BasePage); - if (!Descriptor) - { - /* Try persistent next */ - List = &MmMdlPersistentMemory; - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_PERSISTENT_MEMORY, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - BasePage); - } - if (!Descriptor) - { - /* Try unmapped, unallocated, next */ - List = &MmMdlUnmappedUnallocated; - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_UNMAPPED_UNALLOCATED, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - BasePage); - } - if (!Descriptor) - { - /* Try reserved next */ - List = &MmMdlReservedAllocated; - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_RESERVED_ALLOCATED, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - BasePage); - } - - /* Check if we have a descriptor */ - if (Descriptor) - { - /* Remove it from its list */ - MmMdRemoveDescriptorFromList(List, Descriptor); - - /* Check if it starts before our allocation */ - FoundBasePage = Descriptor->BasePage; - if (FoundBasePage < BasePage) - { - /* Create a new descriptor to cover the gap before our allocation */ - PageOffset = BasePage - FoundBasePage; - NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - Descriptor->Type, - FoundBasePage, - 0, - PageOffset); - - /* Insert it */ - MmMdAddDescriptorToList(List, NewDescriptor, 0); - - /* Adjust ours to ignore that piece */ - Descriptor->PageCount -= PageOffset; - Descriptor->BasePage = BasePage; - } - - /* Check if it goes beyond our allocation */ - FoundPageCount = Descriptor->PageCount; - if (EndPage < (FoundPageCount + Descriptor->BasePage)) - { - /* Create a new descriptor to cover the range after our allocation */ - PageOffset = EndPage - BasePage; - NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - Descriptor->Type, - EndPage, - 0, - FoundPageCount - - PageOffset); - - /* Insert it */ - MmMdAddDescriptorToList(List, NewDescriptor, 0); - - /* Adjust ours to ignore that piece */ - Descriptor->PageCount = PageOffset; - } - - /* Update the descriptor to be mapepd at this virtual page */ - Descriptor->VirtualPage = MappedPage; - - /* Check if this was one of the regular lists */ - if ((List != &MmMdlReservedAllocated) && - (List != &MmMdlPersistentMemory)) - { - /* Was it allocated, or unallocated? */ - if (List != &MmMdlUnmappedAllocated) - { - /* In which case use the unallocated mapped list */ - List = &MmMdlMappedUnallocated; - } - else - { - /* Insert it into the mapped list */ - List = &MmMdlMappedAllocated; - } - } - - /* Add the descriptor that was removed, into the right list */ - MmMdAddDescriptorToList(List, Descriptor, 0); - - /* Add the pages this descriptor had */ - AddPages = Descriptor->PageCount; - } - else - { - /* Nope, so just add one page */ - AddPages = 1; - } - - /* Increment the number of pages the descriptor had */ - MappedPage += AddPages; - BasePage += AddPages; - } - while (BasePage < EndPage); - - /* We're done -- returned the address */ - Status = STATUS_SUCCESS; - *VirtualAddress = MappedBase; - -Quickie: - /* Cleanup descriptors and reduce depth */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -NTSTATUS -MmUnmapVirtualAddress ( - _Inout_ PVOID* VirtualAddress, - _Inout_ PULONGLONG Size - ) -{ - NTSTATUS Status; - - /* Make sure parameters were passed in and are valid */ - if ((VirtualAddress) && (Size) && (*Size <= 0xFFFFFFFF)) - { - /* Nothing to do if translation isn't active */ - if (MmTranslationType == BlNone) - { - Status = STATUS_SUCCESS; - } - else - { - /* We don't support virtual memory yet @TODO */ - EfiPrintf(L"unmap not yet implemented in %S\r\n", __FUNCTION__); - EfiStall(1000000); - Status = STATUS_NOT_IMPLEMENTED; - } - } - else - { - /* Fail */ - Status = STATUS_INVALID_PARAMETER; - } - - /* All done */ - return Status; -} - -NTSTATUS -BlMmUnmapVirtualAddressEx ( - _In_ PVOID VirtualAddress, - _In_ ULONGLONG Size - ) -{ - NTSTATUS Status; - - /* Increment call depth */ - ++MmDescriptorCallTreeCount; - - /* Make sure all parameters are there */ - if ((VirtualAddress) && (Size)) - { - /* Unmap the virtual address */ - Status = MmUnmapVirtualAddress(&VirtualAddress, &Size); - - /* Check if we actually had a virtual mapping active */ - if ((NT_SUCCESS(Status)) && (MmTranslationType != BlNone)) - { - /* We don't support virtual memory yet @TODO */ - EfiPrintf(L"not yet implemented in %S\r\n", __FUNCTION__); - EfiStall(1000000); - Status = STATUS_NOT_IMPLEMENTED; - } - } - else - { - /* Fail */ - Status = STATUS_INVALID_PARAMETER; - } - - /* Cleanup descriptors and reduce depth */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -BOOLEAN -BlMmTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_ PPHYSICAL_ADDRESS PhysicalAddress - ) -{ - /* Make sure arguments are present */ - if (!(VirtualAddress) || !(PhysicalAddress)) - { - return FALSE; - } - - /* Do the architecture-specific translation */ - return MmArchTranslateVirtualAddress(VirtualAddress, PhysicalAddress, NULL); -} - -NTSTATUS -BlpMmInitialize ( - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType, - _In_ PBL_LIBRARY_PARAMETERS LibraryParameters - ) -{ - NTSTATUS Status; - - /* Take a reference */ - MmDescriptorCallTreeCount = 1; - - /* Only support valid translation types */ - if ((TranslationType > BlPae) || (LibraryParameters->TranslationType > BlPae)) - { - /* Bail out */ - EfiPrintf(L"Invalid translation types present\r\n"); - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Initialize memory descriptors */ - MmMdInitialize(0, LibraryParameters); - - /* Remember the page type we came in with */ - MmOriginalTranslationType = TranslationType; - - /* Initialize the physical page allocator */ - Status = MmPaInitialize(MemoryData, - LibraryParameters->MinimumAllocationCount); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Initialize the memory tracker */ - Status = MmTrInitialize(); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"TR Mm init failed: %lx\r\n", Status); - //MmArchDestroy(); - //MmPaDestroy(1); - goto Quickie; - } - - /* Initialize paging, large pages, self-mapping, PAE, if needed */ - Status = MmArchInitialize(1, - MemoryData, - TranslationType, - LibraryParameters->TranslationType); - if (NT_SUCCESS(Status)) - { - /* Save the newly active transation type */ - MmTranslationType = LibraryParameters->TranslationType; - - /* Initialize the heap allocator now */ - Status = MmHaInitialize(LibraryParameters->MinimumHeapSize, - LibraryParameters->HeapAllocationAttributes); - } - - /* If Phase 1 init failed, bail out */ - if (!NT_SUCCESS(Status)) - { - /* Kill everything set setup so far */ - EfiPrintf(L"Phase 1 Mm init failed: %lx\r\n", Status); - //MmPaDestroy(0); - //MmTrDestroy(); - //MmArchDestroy(); - //MmPaDestroy(1); - goto Quickie; - } - - /* Do we have too many descriptors? */ - if (LibraryParameters->DescriptorCount > 512) - { - /* Switch to using a dynamic buffer instead */ - EfiPrintf(L"Warning: too many descriptors\r\n"); - Status = STATUS_NOT_IMPLEMENTED; - goto Quickie; - //MmMdpSwitchToDynamicDescriptors(LibraryParameters->DescriptorCount); - } - - /* Remove memory that the BCD says is bad */ - BlMmRemoveBadMemory(); - - /* Now map all the memory regions as needed */ - Status = MmArchInitialize(2, - MemoryData, - TranslationType, - LibraryParameters->TranslationType); - if (NT_SUCCESS(Status)) - { - /* Initialize the block allocator */ - Status = MmBaInitialize(); - } - - /* Check if anything in phase 2 failed */ - if (!NT_SUCCESS(Status)) - { - /* Go back to static descriptors and kill the heap */ - EfiPrintf(L"Phase 2 Mm init failed: %lx\r\n", Status); - //MmMdpSwitchToStaticDescriptors(); - //HapInitializationStatus = 0; - //++MmDescriptorCallTreeCount; - - /* Destroy the Phase 1 initialization */ - //MmPaDestroy(0); - //MmTrDestroy(); - //MmArchDestroy(); - //MmPaDestroy(1); - } - -Quickie: - /* Free the memory descriptors and return the initialization state */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} diff --git a/boot/environ/lib/mm/pagealloc.c b/boot/environ/lib/mm/pagealloc.c deleted file mode 100644 index e77106b6a57..00000000000 --- a/boot/environ/lib/mm/pagealloc.c +++ /dev/null @@ -1,1702 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/pagealloc.c - * PURPOSE: Boot Library Memory Manager Page Allocator - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) -*/ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" -#include "bcd.h" - -typedef struct _BL_PA_REQUEST -{ - BL_ADDRESS_RANGE BaseRange; - BL_ADDRESS_RANGE VirtualRange; - ULONG Type; - ULONGLONG Pages; - ULONG MemoryType; - ULONG Alignment; - ULONG Flags; -} BL_PA_REQUEST, *PBL_PA_REQUEST; - -/* DATA VARIABLES ************************************************************/ - -extern ULONG MmArchLargePageSize; - -ULONGLONG PapMaximumPhysicalPage, PapMinimumPhysicalPage; - -ULONG PapMinimumAllocationCount; - -BOOLEAN PapInitializationStatus; - -BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedAllocated; -BL_MEMORY_DESCRIPTOR_LIST MmMdlMappedUnallocated; -BL_MEMORY_DESCRIPTOR_LIST MmMdlFwAllocationTracker; -BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedAllocated; -BL_MEMORY_DESCRIPTOR_LIST MmMdlUnmappedUnallocated; -BL_MEMORY_DESCRIPTOR_LIST MmMdlReservedAllocated; -BL_MEMORY_DESCRIPTOR_LIST MmMdlBadMemory; -BL_MEMORY_DESCRIPTOR_LIST MmMdlTruncatedMemory; -BL_MEMORY_DESCRIPTOR_LIST MmMdlPersistentMemory; -BL_MEMORY_DESCRIPTOR_LIST MmMdlCompleteBadMemory; -BL_MEMORY_DESCRIPTOR_LIST MmMdlFreeVirtual; -BL_MEMORY_DESCRIPTOR_LIST MmMdlMappingTrackers; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -MmPaTruncateMemory ( - _In_ ULONGLONG BasePage - ) -{ - NTSTATUS Status; - - /* Increase nesting depth */ - ++MmDescriptorCallTreeCount; - - /* Set the maximum page to the truncated request */ - if (BasePage < PapMaximumPhysicalPage) - { - PapMaximumPhysicalPage = BasePage; - } - - /* Truncate mapped and allocated memory */ - Status = MmMdTruncateDescriptors(&MmMdlMappedAllocated, - &MmMdlTruncatedMemory, - BasePage); - if (NT_SUCCESS(Status)) - { - /* Truncate unmapped and allocated memory */ - Status = MmMdTruncateDescriptors(&MmMdlUnmappedAllocated, - &MmMdlTruncatedMemory, - BasePage); - if (NT_SUCCESS(Status)) - { - /* Truncate mapped and unallocated memory */ - Status = MmMdTruncateDescriptors(&MmMdlMappedUnallocated, - &MmMdlTruncatedMemory, - BasePage); - if (NT_SUCCESS(Status)) - { - /* Truncate unmapped and unallocated memory */ - Status = MmMdTruncateDescriptors(&MmMdlUnmappedUnallocated, - &MmMdlTruncatedMemory, - BasePage); - if (NT_SUCCESS(Status)) - { - /* Truncate reserved memory */ - Status = MmMdTruncateDescriptors(&MmMdlReservedAllocated, - &MmMdlTruncatedMemory, - BasePage); - } - } - } - } - - /* Restore the nesting depth */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -NTSTATUS -BlpMmInitializeConstraints ( - VOID - ) -{ - NTSTATUS Status, ReturnStatus; - ULONGLONG LowestAddressValid, HighestAddressValid; - ULONGLONG LowestPage, HighestPage; - - /* Assume success */ - ReturnStatus = STATUS_SUCCESS; - - /* Check for LOWMEM */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdLibraryInteger_AvoidLowPhysicalMemory, - &LowestAddressValid); - if (NT_SUCCESS(Status)) - { - /* Align the address */ - LowestAddressValid = (ULONG_PTR)PAGE_ALIGN(LowestAddressValid); - LowestPage = LowestAddressValid >> PAGE_SHIFT; - - /* Make sure it's below 4GB */ - if (LowestPage <= 0x100000) - { - PapMinimumPhysicalPage = LowestPage; - } - } - - /* Check for MAXMEM */ - Status = BlGetBootOptionInteger(BlpApplicationEntry.BcdData, - BcdLibraryInteger_TruncatePhysicalMemory, - &HighestAddressValid); - if (NT_SUCCESS(Status)) - { - /* Get the page */ - HighestPage = HighestAddressValid >> PAGE_SHIFT; - - /* Truncate memory above this page */ - ReturnStatus = MmPaTruncateMemory(HighestPage); - } - - /* Return back to the caller */ - return ReturnStatus; -} - -PWCHAR -MmMdListPointerToName (_In_ PBL_MEMORY_DESCRIPTOR_LIST MdList) -{ - if (MdList == &MmMdlUnmappedAllocated) - { - return L"UnmapAlloc"; - } - else if (MdList == &MmMdlUnmappedUnallocated) - { - return L"UnmapUnalloc"; - } - else if (MdList == &MmMdlMappedAllocated) - { - return L"MapAlloc"; - } - else if (MdList == &MmMdlMappedUnallocated) - { - return L"MapUnalloc"; - } - else - { - return L"Other"; - } -} - -NTSTATUS -MmPapAllocateRegionFromMdl ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _Out_opt_ PBL_MEMORY_DESCRIPTOR Descriptor, - _In_ PBL_MEMORY_DESCRIPTOR_LIST CurrentList, - _In_ PBL_PA_REQUEST Request, - _In_ BL_MEMORY_TYPE Type - ) -{ - NTSTATUS Status; - BL_MEMORY_DESCRIPTOR LocalDescriptor = {{0}}; - PBL_MEMORY_DESCRIPTOR FoundDescriptor, TempDescriptor; - PLIST_ENTRY ListHead, NextEntry; - BOOLEAN TopDown, GotFwPages; - EFI_PHYSICAL_ADDRESS EfiAddress; - ULONGLONG LocalEndPage, FoundEndPage, LocalVirtualEndPage; - - /* Check if any parameters were not passed in correctly */ - if (!(CurrentList) || !(Request) || (!(NewList) && !(Descriptor))) - { - return STATUS_INVALID_PARAMETER; - } - - /* Set failure by default */ - Status = STATUS_NO_MEMORY; - - /* Take the head and next entry in the list, as appropriate */ - ListHead = CurrentList->First; - if (Request->Type & BL_MM_REQUEST_TOP_DOWN_TYPE) - { - NextEntry = ListHead->Blink; - TopDown = TRUE; - } - else - { - NextEntry = ListHead->Flink; - TopDown = FALSE; - } - - /* Loop through the list */ - GotFwPages = FALSE; - while (NextEntry != ListHead) - { - /* Grab a descriptor */ - FoundDescriptor = CONTAINING_RECORD(NextEntry, - BL_MEMORY_DESCRIPTOR, - ListEntry); - - /* See if it matches the request */ - if (MmMdFindSatisfyingRegion(FoundDescriptor, - &LocalDescriptor, - Request->Pages, - &Request->BaseRange, - &Request->VirtualRange, - TopDown, - Request->MemoryType, - Request->Flags, - Request->Alignment)) - { - break; - } - - /* It doesn't, move to the next appropriate entry */ - if (TopDown) - { - NextEntry = NextEntry->Blink; - } - else - { - NextEntry = NextEntry->Flink; - } - } - - /* Check if we exhausted the list */ - if (NextEntry == ListHead) - { - return Status; - } - - /* Copy all the flags that are not request flag */ - LocalDescriptor.Flags = (Request->Flags & 0xFFFF0000) | - (LocalDescriptor.Flags & 0x0000FFFF); - - /* Are we using the physical memory list, and are we OK with using firmware? */ - if ((CurrentList == &MmMdlUnmappedUnallocated) && - !((Request->Flags & BlMemoryNonFirmware) || - (LocalDescriptor.Flags & BlMemoryNonFirmware))) - { - /* Allocate the requested address from EFI */ - EfiAddress = LocalDescriptor.BasePage << PAGE_SHIFT; - Status = EfiAllocatePages(AllocateAddress, - (ULONG)LocalDescriptor.PageCount, - &EfiAddress); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"EFI memory allocation failure\r\n"); - EfiStall(10000000); - return Status; - } - - /* Remember we got memory from EFI */ - GotFwPages = TRUE; - } - - /* Remove the descriptor from the original list it was on */ - MmMdRemoveDescriptorFromList(CurrentList, FoundDescriptor); - - /* Get the end pages */ - LocalEndPage = LocalDescriptor.PageCount + LocalDescriptor.BasePage; - FoundEndPage = FoundDescriptor->PageCount + FoundDescriptor->BasePage; - - /* Are we allocating from the virtual memory list? */ - if (CurrentList == &MmMdlMappedUnallocated) - { - /* Check if the region matches perfectly */ - if ((LocalDescriptor.BasePage == FoundDescriptor->BasePage) && - (LocalEndPage == FoundEndPage)) - { - /* Check if the original descriptor had the flag set */ - if ((FoundDescriptor->Flags & 0x40000000) && (Descriptor)) - { - /* Make our local one have it too, even if not needed */ - LocalDescriptor.Flags |= 0x40000000; - } - } - else - { - /* Write the 'incomplete mapping' flag */ - FoundDescriptor->Flags |= 0x40000000; - if (Descriptor) - { - /* Including on the local one if there's one passed in */ - LocalDescriptor.Flags |= 0x40000000; - } - } - } - - /* Does the memory we received not exactly fall onto the beginning of its descriptor? */ - if (LocalDescriptor.BasePage != FoundDescriptor->BasePage) - { - TempDescriptor = MmMdInitByteGranularDescriptor(FoundDescriptor->Flags, - FoundDescriptor->Type, - FoundDescriptor->BasePage, - FoundDescriptor->VirtualPage, - LocalDescriptor.BasePage - - FoundDescriptor->BasePage); - Status = MmMdAddDescriptorToList(CurrentList, TempDescriptor, 0); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Does the memory we received not exactly fall onto the end of its descriptor? */ - LocalVirtualEndPage = LocalDescriptor.VirtualPage ? - LocalDescriptor.VirtualPage + LocalDescriptor.PageCount : 0; - if (LocalEndPage != FoundEndPage) - { - TempDescriptor = MmMdInitByteGranularDescriptor(FoundDescriptor->Flags, - FoundDescriptor->Type, - LocalEndPage, - LocalVirtualEndPage, - FoundEndPage - LocalEndPage); - Status = MmMdAddDescriptorToList(CurrentList, TempDescriptor, 0); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* We got the memory we needed */ - Status = STATUS_SUCCESS; - - /* Are we supposed to insert it into a new list? */ - if (NewList) - { - /* Copy the allocated region descriptor into the one we found */ - FoundDescriptor->BaseAddress = LocalDescriptor.BaseAddress; - FoundDescriptor->VirtualPage = LocalDescriptor.VirtualPage; - FoundDescriptor->PageCount = LocalDescriptor.PageCount; - FoundDescriptor->Type = Type; - FoundDescriptor->Flags = LocalDescriptor.Flags; - - /* Remember if it came from EFI */ - if (GotFwPages) - { - FoundDescriptor->Flags |= BlMemoryFirmware; - } - - /* Add the descriptor to the requested list */ - Status = MmMdAddDescriptorToList(NewList, FoundDescriptor, 0); - } - else - { - /* Free the descriptor, nobody wants to know about it anymore */ - MmMdFreeDescriptor(FoundDescriptor); - } - - /* Return the allocation region back */ - RtlCopyMemory(Descriptor, &LocalDescriptor, sizeof(LocalDescriptor)); - return Status; -} - -NTSTATUS -MmPaAllocatePages ( - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _In_ PBL_MEMORY_DESCRIPTOR Descriptor, - _In_ PBL_MEMORY_DESCRIPTOR_LIST CurrentList, - _In_ PBL_PA_REQUEST Request, - _In_ BL_MEMORY_TYPE MemoryType - ) -{ - NTSTATUS Status; - - /* Heap and page directory/table pages have a special flag */ - if ((MemoryType >= BlLoaderHeap) && (MemoryType <= BlLoaderReferencePage)) - { - Request->Flags |= BlMemorySpecial; - } - - /* Try to find a free region of RAM matching this range and request */ - Request->MemoryType = BlConventionalMemory; - Status = MmPapAllocateRegionFromMdl(NewList, - Descriptor, - CurrentList, - Request, - MemoryType); - if (Status == STATUS_NOT_FOUND) - { - /* Need to re-synchronize the memory map and check other lists */ - EfiPrintf(L"No RAM found -- backup plan not yet implemented\r\n"); - } - - /* Did we get the region we wanted? */ - if (NT_SUCCESS(Status)) - { - /* All good, return back */ - return Status; - } - - /* Are we failing due to some attributes? */ - if (Request->Flags & BlMemoryValidAllocationAttributeMask) - { - if (Request->Flags & BlMemoryLargePages) - { - EfiPrintf(L"large alloc fail not yet implemented %lx\r\n", Status); - EfiStall(1000000); - return STATUS_NOT_IMPLEMENTED; - } - if (Request->Flags & BlMemoryFixed) - { - EfiPrintf(L"fixed alloc fail not yet implemented %lx\r\n", Status); - EfiStall(1000000); - return STATUS_NOT_IMPLEMENTED; - } - } - - /* Nope, just fail the entire call */ - return Status; -} - -NTSTATUS -MmPapAllocatePhysicalPagesInRange ( - _Inout_ PPHYSICAL_ADDRESS BaseAddress, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG Pages, - _In_ ULONG Attributes, - _In_ ULONG Alignment, - _In_ PBL_MEMORY_DESCRIPTOR_LIST NewList, - _In_opt_ PBL_ADDRESS_RANGE Range, - _In_ ULONG RangeType - ) -{ - NTSTATUS Status; - BL_PA_REQUEST Request; - BL_MEMORY_DESCRIPTOR Descriptor; - - /* Increase nesting depth */ - ++MmDescriptorCallTreeCount; - - /* Bail out if no address was specified */ - if (!BaseAddress) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Bail out if no page count was passed in, or a bad list was specified */ - if (!(Pages) || - ((NewList != &MmMdlUnmappedAllocated) && - (NewList != &MmMdlPersistentMemory))) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Bail out if the passed in range is invalid */ - if ((Range) && (Range->Minimum >= Range->Maximum)) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Adjust alignment as needed */ - if (!Alignment) - { - Alignment = 1; - } - - /* Clear the virtual range */ - Request.VirtualRange.Minimum = 0; - Request.VirtualRange.Maximum = 0; - - /* Check if a fixed allocation was requested*/ - if (Attributes & BlMemoryFixed) - { - /* Force the only available range to be the passed in address */ - Request.BaseRange.Minimum = BaseAddress->QuadPart >> PAGE_SHIFT; - Request.BaseRange.Maximum = Request.BaseRange.Minimum + Pages - 1; - } - else if (Range) - { - /* Otherwise, a manual range was specified, use it */ - Request.BaseRange.Minimum = Range->Minimum >> PAGE_SHIFT; - Request.BaseRange.Maximum = Request.BaseRange.Minimum + - (Range->Maximum >> PAGE_SHIFT) - 1; - } - else - { - /* Otherwise, use any possible range of pages */ - Request.BaseRange.Minimum = PapMinimumPhysicalPage; - Request.BaseRange.Maximum = MAXULONG >> PAGE_SHIFT; - } - - /* Check if no type was specified, or if it was invalid */ - if (!(RangeType) || - (RangeType & ~(BL_MM_REQUEST_TOP_DOWN_TYPE | BL_MM_REQUEST_DEFAULT_TYPE))) - { - /* Use default type */ - Request.Type = BL_MM_REQUEST_DEFAULT_TYPE; - } - else - { - /* Use the requested type */ - Request.Type = RangeType; - } - - /* Capture the other request parameters */ - Request.Alignment = Alignment; - Request.Pages = Pages; - Request.Flags = Attributes; - Status = MmPaAllocatePages(NewList, - &Descriptor, - &MmMdlUnmappedUnallocated, - &Request, - MemoryType); - if (NT_SUCCESS(Status)) - { - /* We got a descriptor back, return its address */ - BaseAddress->QuadPart = Descriptor.BasePage << PAGE_SHIFT; - } - -Quickie: - /* Restore the nesting depth */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -NTSTATUS -MmPapPageAllocatorExtend ( - _In_ ULONG Attributes, - _In_ ULONG Alignment, - _In_ ULONGLONG PageCount, - _In_ ULONGLONG VirtualPage, - _In_opt_ PBL_ADDRESS_RANGE Range, - _In_opt_ ULONG Type - ) -{ - BL_PA_REQUEST Request; - ULONGLONG PageRange; - BL_MEMORY_DESCRIPTOR NewDescriptor; - ULONG AllocationFlags, CacheAttributes, AddFlags; - NTSTATUS Status; - PBL_MEMORY_DESCRIPTOR_LIST MdList; - PBL_MEMORY_DESCRIPTOR Descriptor; - PVOID VirtualAddress; - PHYSICAL_ADDRESS PhysicalAddress; - - /* Is the caller requesting less pages than allowed? */ - if (!(Attributes & BlMemoryFixed) && - !(Range) && - (PageCount < PapMinimumAllocationCount)) - { - /* Unless this is a fixed request, then adjust the original requirements */ - PageCount = PapMinimumAllocationCount; - Alignment = PapMinimumAllocationCount; - } - - /* Extract only the allocation attributes */ - AllocationFlags = Attributes & BlMemoryValidAllocationAttributeMask; - - /* Check if the caller wants large pages */ - if ((AllocationFlags & BlMemoryLargePages) && (MmArchLargePageSize != 1)) - { - EfiPrintf(L"Large pages not supported!\r\n"); - EfiStall(10000000); - return STATUS_NOT_IMPLEMENTED; - } - - /* Set an emty virtual range */ - Request.VirtualRange.Minimum = 0; - Request.VirtualRange.Maximum = 0; - - /* Check if the caller requested a range */ - if (Range) - { - /* Calculate it size in pages, minus a page as this is a 0-based range */ - PageRange = ((Range->Maximum - Range->Minimum) >> PAGE_SHIFT) - 1; - - /* Set the minimum and maximum, in pages */ - Request.BaseRange.Minimum = Range->Minimum >> PAGE_SHIFT; - Request.BaseRange.Maximum = Request.BaseRange.Minimum + PageRange; - } - else - { - /* Initialize a range from the smallest page to the biggest */ - Request.BaseRange.Minimum = PapMinimumPhysicalPage; - Request.BaseRange.Maximum = 0xFFFFFFFF / PAGE_SIZE; - } - - /* Get the cache attributes */ - CacheAttributes = Attributes & BlMemoryValidCacheAttributeMask; - - /* Check if the caller requested a valid allocation type */ - if ((Type) && !(Type & ~(BL_MM_REQUEST_DEFAULT_TYPE | - BL_MM_REQUEST_TOP_DOWN_TYPE))) - { - /* Use what the caller wanted */ - Request.Type = Type; - } - else - { - /* Use the default bottom-up type */ - Request.Type = BL_MM_REQUEST_DEFAULT_TYPE; - } - - /* Use the original protection and type, but ignore other attributes */ - Request.Flags = Attributes & ~(BlMemoryValidAllocationAttributeMask | - BlMemoryValidCacheAttributeMask); - Request.Alignment = Alignment; - Request.Pages = PageCount; - - /* Allocate some free pages */ - Status = MmPaAllocatePages(NULL, - &NewDescriptor, - &MmMdlUnmappedUnallocated, - &Request, - BlConventionalMemory); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"Failed to get unmapped, unallocated memory!\r\n"); - EfiStall(10000000); - return Status; - } - - /* Initialize a descriptor for these pages, adding in the allocation flags */ - Descriptor = MmMdInitByteGranularDescriptor(AllocationFlags | - NewDescriptor.Flags, - BlConventionalMemory, - NewDescriptor.BasePage, - NewDescriptor.VirtualPage, - NewDescriptor.PageCount); - - /* Now map a virtual address for these physical pages */ - VirtualAddress = (PVOID)((ULONG_PTR)VirtualPage << PAGE_SHIFT); - PhysicalAddress.QuadPart = NewDescriptor.BasePage << PAGE_SHIFT; - Status = BlMmMapPhysicalAddressEx(&VirtualAddress, - AllocationFlags | CacheAttributes, - NewDescriptor.PageCount << PAGE_SHIFT, - PhysicalAddress); - if (Status == STATUS_SUCCESS) - { - /* Add the cache attributes now that the mapping worked */ - Descriptor->Flags |= CacheAttributes; - - /* Update the virtual page now that we mapped it */ - Descriptor->VirtualPage = (ULONG_PTR)VirtualAddress >> PAGE_SHIFT; - - /* Add this as a mapped region */ - Status = MmMdAddDescriptorToList(&MmMdlMappedUnallocated, - Descriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG); - - /* Make new descriptor that we'll add in firmware allocation tracker */ - MdList = &MmMdlFwAllocationTracker; - Descriptor = MmMdInitByteGranularDescriptor(0, - BlConventionalMemory, - NewDescriptor.BasePage, - 0, - NewDescriptor.PageCount); - - /* Do not coalesce */ - AddFlags = 0; - } - else - { - /* We failed, free the physical pages */ - Status = MmFwFreePages(NewDescriptor.BasePage, NewDescriptor.PageCount); - if (!NT_SUCCESS(Status)) - { - /* We failed to free the pages, so this is still around */ - MdList = &MmMdlUnmappedAllocated; - } - else - { - /* This is now back to unmapped/unallocated memory */ - Descriptor->Flags = 0; - MdList = &MmMdlUnmappedUnallocated; - } - - /* Coalesce the free descriptor */ - AddFlags = BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG; - } - - /* Either add to firmware list, or to unmapped list, then return result */ - MmMdAddDescriptorToList(MdList, Descriptor, AddFlags); - return Status; -} - -NTSTATUS -MmPapAllocatePagesInRange ( - _Inout_ PVOID* PhysicalAddress, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG Pages, - _In_ ULONG Attributes, - _In_ ULONG Alignment, - _In_opt_ PBL_ADDRESS_RANGE Range, - _In_ ULONG Type - ) -{ - NTSTATUS Status; - PHYSICAL_ADDRESS BaseAddress; - BL_PA_REQUEST Request; - PBL_MEMORY_DESCRIPTOR_LIST List; - BL_MEMORY_DESCRIPTOR Descriptor; - - /* Increment nesting depth */ - ++MmDescriptorCallTreeCount; - - /* Default list */ - List = &MmMdlMappedAllocated; - - /* Check for missing parameters or invalid range */ - if (!(PhysicalAddress) || - !(Pages) || - ((Range) && (Range->Minimum >= Range->Maximum))) - { - Status = STATUS_INVALID_PARAMETER; - goto Exit; - } - - /* What translation mode are we using? */ - if (MmTranslationType != BlNone) - { - /* Use 1 page alignment if none was requested */ - if (!Alignment) - { - Alignment = 1; - } - - /* Check if we got a range */ - if (Range) - { - /* We don't support virtual memory yet @TODO */ - EfiPrintf(L"virt range not yet implemented in %S\r\n", __FUNCTION__); - EfiStall(1000000); - Status = STATUS_NOT_IMPLEMENTED; - goto Exit; - } - else - { - /* Use the entire range that's possible */ - Request.BaseRange.Minimum = PapMinimumPhysicalPage; - Request.BaseRange.Maximum = 0xFFFFFFFF >> PAGE_SHIFT; - } - - /* Check if a fixed allocation was requested */ - if (Attributes & BlMemoryFixed) - { - /* We don't support virtual memory yet @TODO */ - EfiPrintf(L"fixed not yet implemented in %S\r\n", __FUNCTION__); - EfiStall(1000000); - Status = STATUS_NOT_IMPLEMENTED; - goto Exit; - } - else - { - /* Check if kernel range was specifically requested */ - if (Attributes & BlMemoryKernelRange) - { - /* Use the kernel range */ - Request.VirtualRange.Minimum = MmArchKsegAddressRange.Minimum >> PAGE_SHIFT; - Request.VirtualRange.Maximum = MmArchKsegAddressRange.Maximum >> PAGE_SHIFT; - } - else - { - /* Set the virtual address range */ - Request.VirtualRange.Minimum = 0; - Request.VirtualRange.Maximum = 0xFFFFFFFF >> PAGE_SHIFT; - } - } - - /* Check what type of allocation was requested */ - if ((Type) && !(Type & ~(BL_MM_REQUEST_DEFAULT_TYPE | - BL_MM_REQUEST_TOP_DOWN_TYPE))) - { - /* Save it if it was valid */ - Request.Type = Type; - } - else - { - /* Set the default */ - Request.Type = BL_MM_REQUEST_DEFAULT_TYPE; - } - - /* Fill out the request of the request */ - Request.Flags = Attributes; - Request.Alignment = Alignment; - Request.Pages = Pages; - - /* Try to allocate the pages */ - Status = MmPaAllocatePages(List, - &Descriptor, - &MmMdlMappedUnallocated, - &Request, - MemoryType); - if (!NT_SUCCESS(Status)) - { - /* Extend the physical allocator */ - Status = MmPapPageAllocatorExtend(Attributes, - Alignment, - Pages, - ((ULONG_PTR)*PhysicalAddress) >> - PAGE_SHIFT, - Range, - Type); - if (!NT_SUCCESS(Status)) - { - /* Fail since we're out of memory */ - EfiPrintf(L"EXTEND OUT OF MEMORY: %lx\r\n", Status); - Status = STATUS_NO_MEMORY; - goto Exit; - } - - /* Try the allocation again now */ - Status = MmPaAllocatePages(&MmMdlMappedAllocated, - &Descriptor, - &MmMdlMappedUnallocated, - &Request, - MemoryType); - if (!NT_SUCCESS(Status)) - { - /* Fail since we're out of memory */ - EfiPrintf(L"PALLOC OUT OF MEMORY: %lx\r\n", Status); - goto Exit; - } - } - - /* Return the allocated address */ - *PhysicalAddress = (PVOID)((ULONG_PTR)Descriptor.VirtualPage << PAGE_SHIFT); - } - else - { - /* Check if this is a fixed allocation */ - BaseAddress.QuadPart = (Attributes & BlMemoryFixed) ? - (ULONG_PTR)*PhysicalAddress : 0; - - /* Allocate the pages */ - Status = MmPapAllocatePhysicalPagesInRange(&BaseAddress, - MemoryType, - Pages, - Attributes, - Alignment, - (&MmMdlMappedAllocated != - &MmMdlPersistentMemory) ? - &MmMdlUnmappedAllocated : - &MmMdlMappedAllocated, - Range, - Type); - - /* Return the allocated address */ - *PhysicalAddress = PhysicalAddressToPtr(BaseAddress); - } - -Exit: - /* Restore the nesting depth */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -NTSTATUS -MmPaInitialize ( - __in PBL_MEMORY_DATA BootMemoryData, - __in ULONG MinimumAllocationCount - ) -{ - NTSTATUS Status; - ULONG ExistingDescriptors, FinalOffset; - PBL_MEMORY_DESCRIPTOR Descriptor, NewDescriptor; - - /* Initialize physical allocator variables */ - PapMaximumPhysicalPage = 0xFFFFFFFFFFFFF; - PapMinimumAllocationCount = MinimumAllocationCount; - PapMinimumPhysicalPage = 0; - - /* Initialize all the lists */ - MmMdInitializeListHead(&MmMdlMappedAllocated); - MmMdInitializeListHead(&MmMdlMappedUnallocated); - MmMdInitializeListHead(&MmMdlFwAllocationTracker); - MmMdInitializeListHead(&MmMdlUnmappedAllocated); - MmMdInitializeListHead(&MmMdlReservedAllocated); - MmMdInitializeListHead(&MmMdlBadMemory); - MmMdInitializeListHead(&MmMdlTruncatedMemory); - MmMdInitializeListHead(&MmMdlPersistentMemory); - MmMdInitializeListHead(&MmMdlUnmappedUnallocated); - MmMdInitializeListHead(&MmMdlCompleteBadMemory); - - /* Get the BIOS memory map */ - Status = MmFwGetMemoryMap(&MmMdlUnmappedUnallocated, - BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS | - BL_MM_FLAG_REQUEST_COALESCING); - if (NT_SUCCESS(Status)) - { -#if 0 - PLIST_ENTRY listHead, nextEntry; - - /* Loop the NT firmware memory list */ - EfiPrintf(L"NT MEMORY MAP\n\r\n"); - listHead = &MmMdlUnmappedUnallocated.ListHead; - nextEntry = listHead->Flink; - while (listHead != nextEntry) - { - Descriptor = CONTAINING_RECORD(nextEntry, BL_MEMORY_DESCRIPTOR, ListEntry); - - EfiPrintf(L"Type: %08lX Flags: %08lX Base: 0x%016I64X End: 0x%016I64X\r\n", - Descriptor->Type, - Descriptor->Flags, - Descriptor->BasePage << PAGE_SHIFT, - (Descriptor->BasePage + Descriptor->PageCount) << PAGE_SHIFT); - - nextEntry = nextEntry->Flink; - } -#endif - - /* - * Because BL supports cross x86-x64 application launches and a LIST_ENTRY - * is of variable size, care must be taken here to ensure that we see a - * consistent view of descriptors. BL uses some offset magic to figure out - * where the data actually starts, since everything is ULONGLONG past the - * LIST_ENTRY itself - */ - FinalOffset = BootMemoryData->MdListOffset + BootMemoryData->DescriptorOffset; - Descriptor = (PBL_MEMORY_DESCRIPTOR)((ULONG_PTR)BootMemoryData + FinalOffset - - FIELD_OFFSET(BL_MEMORY_DESCRIPTOR, BasePage)); - - /* Scan all of them */ - ExistingDescriptors = BootMemoryData->DescriptorCount; - while (ExistingDescriptors != 0) - { - /* Remove this region from our free memory MDL */ - //EfiPrintf(L"Handling existing descriptor: %llx %llx\r\n", Descriptor->BasePage, Descriptor->PageCount); - Status = MmMdRemoveRegionFromMdlEx(&MmMdlUnmappedUnallocated, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - Descriptor->BasePage, - Descriptor->PageCount, - NULL); - if (!NT_SUCCESS(Status)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Build a descriptor for it */ - NewDescriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - Descriptor->Type, - Descriptor->BasePage, - Descriptor->VirtualPage, - Descriptor->PageCount); - if (!NewDescriptor) - { - return STATUS_NO_MEMORY; - } - - /* And add this region to the reserved & allocated MDL */ - Status = MmMdAddDescriptorToList(&MmMdlReservedAllocated, NewDescriptor, 0); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Move on to the next descriptor */ - ExistingDescriptors--; - Descriptor = (PBL_MEMORY_DESCRIPTOR)((ULONG_PTR)Descriptor + BootMemoryData->DescriptorSize); - } - - /* We are done, so check for any RAM constraints which will make us truncate memory */ - Status = BlpMmInitializeConstraints(); - if (NT_SUCCESS(Status)) - { - /* The Page Allocator has initialized */ - PapInitializationStatus = TRUE; - Status = STATUS_SUCCESS; - } - } - - /* Return status */ - return Status; -} - -NTSTATUS -BlMmAllocatePhysicalPages( - _In_ PPHYSICAL_ADDRESS Address, - _In_ BL_MEMORY_TYPE MemoryType, - _In_ ULONGLONG PageCount, - _In_ ULONG Attributes, - _In_ ULONG Alignment - ) -{ - /* Call the physical allocator */ - return MmPapAllocatePhysicalPagesInRange(Address, - MemoryType, - PageCount, - Attributes, - Alignment, - &MmMdlUnmappedAllocated, - NULL, - 0); -} - -NTSTATUS -MmPapFreePhysicalPages ( - _In_ ULONG WhichList, - _In_ ULONGLONG PageCount, - _In_ PHYSICAL_ADDRESS Address - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor; - ULONGLONG Page; - ULONG DescriptorFlags, Flags; - BOOLEAN DontFree, HasPageData; - BL_LIBRARY_PARAMETERS LibraryParameters; - NTSTATUS Status; - - /* Set some defaults */ - Flags = BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG; - DontFree = FALSE; - HasPageData = FALSE; - - /* Only page-aligned addresses are accepted */ - if (Address.QuadPart & (PAGE_SIZE - 1)) - { - EfiPrintf(L"free mem fail 1\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Try to find the descriptor containing this address */ - Page = Address.QuadPart >> PAGE_SHIFT; - Descriptor = MmMdFindDescriptor(WhichList, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - Page); - if (!Descriptor) - { - EfiPrintf(L"free mem fail 2\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* If a page count was given, it must match, unless it's coalesced */ - DescriptorFlags = Descriptor->Flags; - if (!(DescriptorFlags & BlMemoryCoalesced) && - (PageCount) && (PageCount != Descriptor->PageCount)) - { - EfiPrintf(L"free mem fail 3\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Check if this is persistent memory in teardown status */ - if ((PapInitializationStatus == 2) && - (DescriptorFlags & BlMemoryPersistent)) - { - /* Then we should keep it */ - DontFree = TRUE; - } - else - { - /* Mark it as non-persistent, since we're freeing it */ - Descriptor->Flags &= ~BlMemoryPersistent; - } - - /* Check if this memory contains paging data */ - if ((Descriptor->Type == BlLoaderPageDirectory) || - (Descriptor->Type == BlLoaderReferencePage)) - { - HasPageData = TRUE; - } - - /* Check if a page count was given */ - if (PageCount) - { - /* The pages must fit within the descriptor */ - if ((PageCount + Page - Descriptor->BasePage) > Descriptor->PageCount) - { - EfiPrintf(L"free mem fail 4\r\n"); - return STATUS_INVALID_PARAMETER; - } - } - else - { - /* No page count given, so the address must be at the beginning then */ - if (Descriptor->BasePage != Page) - { - EfiPrintf(L"free mem fail 5\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* And we'll use the page count in the descriptor */ - PageCount = Descriptor->PageCount; - } - - /* Copy library parameters since we will read them */ - RtlCopyMemory(&LibraryParameters, - &BlpLibraryParameters, - sizeof(LibraryParameters)); - - /* Check if this is teardown */ - if (PapInitializationStatus == 2) - { - EfiPrintf(L"Case 2 not yet handled!\r\n"); - return STATUS_NOT_SUPPORTED; - } - else if (!DontFree) - { - /* Caller wants memory to be freed -- should we zero it? */ - if (!(HasPageData) && - (LibraryParameters.LibraryFlags & - BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE)) - { - EfiPrintf(L"Freeing zero data not yet handled!\r\n"); - return STATUS_NOT_SUPPORTED; - } - } - - /* Now call into firmware to actually free the physical pages */ - Status = MmFwFreePages(Page, PageCount); - if (!NT_SUCCESS(Status)) - { - EfiPrintf(L"free mem fail 6\r\n"); - return Status; - } - - /* Remove the firmware flags */ - Descriptor->Flags &= ~(BlMemoryNonFirmware | - BlMemoryFirmware | - BlMemoryPersistent); - - /* If we're not actually freeing, don't coalesce with anyone nearby */ - if (DontFree) - { - Flags |= BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG; - } - - /* Check if the entire allocation is being freed */ - if (PageCount == Descriptor->PageCount) - { - /* Remove the descriptor from the allocated list */ - MmMdRemoveDescriptorFromList(&MmMdlUnmappedAllocated, Descriptor); - - /* Mark the entire descriptor as free */ - Descriptor->Type = BlConventionalMemory; - } - else - { - /* Init a descriptor for what we're actually freeing */ - Descriptor = MmMdInitByteGranularDescriptor(Descriptor->Flags, - BlConventionalMemory, - Page, - 0, - PageCount); - if (!Descriptor) - { - return STATUS_NO_MEMORY; - } - - /* Remove the region from the existing descriptor */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlUnmappedAllocated, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - Page, - PageCount, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - - /* Add the new descriptor into in the list (or the old, repurposed one) */ - Descriptor->Flags &= ~BlMemoryCoalesced; - return MmMdAddDescriptorToList(&MmMdlUnmappedUnallocated, Descriptor, Flags); -} - -NTSTATUS -BlMmFreePhysicalPages ( - _In_ PHYSICAL_ADDRESS Address - ) -{ - /* Call the physical allocator */ - return MmPapFreePhysicalPages(BL_MM_INCLUDE_UNMAPPED_ALLOCATED, 0, Address); -} - -NTSTATUS -MmPapFreePages ( - _In_ PVOID Address, - _In_ ULONG WhichList - ) -{ - PHYSICAL_ADDRESS PhysicalAddress; - - /* Handle virtual memory scenario */ - if (MmTranslationType != BlNone) - { - EfiPrintf(L"Unimplemented free virtual path: %p %lx\r\n", Address, WhichList); - return STATUS_SUCCESS; - } - - /* Physical memory should be in the unmapped allocated list */ - if (WhichList != BL_MM_INCLUDE_PERSISTENT_MEMORY) - { - WhichList = BL_MM_INCLUDE_UNMAPPED_ALLOCATED; - } - - /* Free it from there */ - PhysicalAddress.QuadPart = (ULONG_PTR)Address; - return MmPapFreePhysicalPages(WhichList, 0, PhysicalAddress); -} - -NTSTATUS -BlMmGetMemoryMap ( - _In_ PLIST_ENTRY MemoryMap, - _In_ PBL_BUFFER_DESCRIPTOR MemoryParameters, - _In_ ULONG WhichTypes, - _In_ ULONG Flags - ) -{ - BL_MEMORY_DESCRIPTOR_LIST FirmwareMdList, FullMdList; - BOOLEAN DoFirmware, DoPersistent, DoTruncated, DoBad; - BOOLEAN DoReserved, DoUnmapUnalloc, DoUnmapAlloc; - BOOLEAN DoMapAlloc, DoMapUnalloc, DoFirmware2; - ULONG LoopCount, MdListCount, MdListSize, Used; - NTSTATUS Status; - - /* Initialize the firmware list if we use it */ - MmMdInitializeListHead(&FirmwareMdList); - - /* Make sure we got our input parameters */ - if (!(MemoryMap) || !(MemoryParameters)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Either ask for firmware memory, or don't. Not neither */ - if ((WhichTypes & ~BL_MM_INCLUDE_NO_FIRMWARE_MEMORY) && - (WhichTypes & ~BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Either ask for firmware memory, or don't. Not both */ - if ((WhichTypes & BL_MM_INCLUDE_NO_FIRMWARE_MEMORY) && - (WhichTypes & BL_MM_INCLUDE_ONLY_FIRMWARE_MEMORY)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Initialize the memory map list */ - InitializeListHead(MemoryMap); - - /* Check which types of memory to dump */ - DoFirmware = WhichTypes & BL_MM_INCLUDE_FIRMWARE_MEMORY; - DoPersistent = WhichTypes & BL_MM_INCLUDE_PERSISTENT_MEMORY; - DoTruncated = WhichTypes & BL_MM_INCLUDE_TRUNCATED_MEMORY; - DoBad = WhichTypes & BL_MM_INCLUDE_BAD_MEMORY; - DoReserved = WhichTypes & BL_MM_INCLUDE_RESERVED_ALLOCATED; - DoUnmapUnalloc = WhichTypes & BL_MM_INCLUDE_UNMAPPED_UNALLOCATED; - DoUnmapAlloc = WhichTypes & BL_MM_INCLUDE_UNMAPPED_ALLOCATED; - DoMapAlloc = WhichTypes & BL_MM_INCLUDE_MAPPED_ALLOCATED; - DoMapUnalloc = WhichTypes & BL_MM_INCLUDE_MAPPED_UNALLOCATED; - DoFirmware2 = WhichTypes & BL_MM_INCLUDE_FIRMWARE_MEMORY_2; - - /* Begin the attempt loop */ - LoopCount = 0; - while (TRUE) - { - /* Count how many entries we will need */ - MdListCount = 0; - if (DoMapAlloc) MdListCount = MmMdCountList(&MmMdlMappedAllocated); - if (DoMapUnalloc) MdListCount += MmMdCountList(&MmMdlMappedUnallocated); - if (DoUnmapAlloc) MdListCount += MmMdCountList(&MmMdlUnmappedAllocated); - if (DoUnmapUnalloc) MdListCount += MmMdCountList(&MmMdlUnmappedUnallocated); - if (DoReserved) MdListCount += MmMdCountList(&MmMdlReservedAllocated); - if (DoBad) MdListCount += MmMdCountList(&MmMdlBadMemory); - if (DoTruncated) MdListCount += MmMdCountList(&MmMdlTruncatedMemory); - if (DoPersistent) MdListCount += MmMdCountList(&MmMdlPersistentMemory); - - /* Plus firmware entries */ - if (DoFirmware) - { - /* Free the previous entries, if any */ - MmMdFreeList(&FirmwareMdList); - - /* Get the firmware map, coalesced */ - Status = MmFwGetMemoryMap(&FirmwareMdList, - BL_MM_FLAG_REQUEST_COALESCING); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* We overwrite, since this type is exclusive */ - MdListCount = MmMdCountList(&FirmwareMdList); - } - - /* Plus firmware entries-2 */ - if (DoFirmware2) - { - /* Free the previous entries, if any */ - MmMdFreeList(&FirmwareMdList); - - /* Get the firmware map, uncoalesced */ - Status = MmFwGetMemoryMap(&FirmwareMdList, 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* We overwrite, since this type is exclusive */ - MdListCount = MmMdCountList(&FirmwareMdList); - } - - /* If there's no descriptors, we're done */ - if (!MdListCount) - { - Status = STATUS_SUCCESS; - goto Quickie; - } - - /* Check if the buffer we have is big enough */ - if (MemoryParameters->BufferSize >= - (sizeof(BL_MEMORY_DESCRIPTOR) * MdListCount)) - { - break; - } - - /* It's not, allocate it, with a slack of 4 extra descriptors */ - MdListSize = sizeof(BL_MEMORY_DESCRIPTOR) * (MdListCount + 4); - - /* Except if we weren't asked to */ - if (!(Flags & BL_MM_ADD_DESCRIPTOR_ALLOCATE_FLAG)) - { - MemoryParameters->BufferSize = MdListSize; - Status = STATUS_BUFFER_TOO_SMALL; - goto Quickie; - } - - /* Has it been less than 4 times we've tried this? */ - if (++LoopCount <= 4) - { - /* Free the previous attempt, if any */ - if (MemoryParameters->BufferSize) - { - BlMmFreeHeap(MemoryParameters->Buffer); - } - - /* Allocate a new buffer */ - MemoryParameters->BufferSize = MdListSize; - MemoryParameters->Buffer = BlMmAllocateHeap(MdListSize); - if (MemoryParameters->Buffer) - { - /* Try again */ - continue; - } - } - - /* If we got here, we're out of memory after 4 attempts */ - Status = STATUS_NO_MEMORY; - goto Quickie; - } - - /* We should have a buffer by now... */ - if (MemoryParameters->Buffer) - { - /* Zero it out */ - RtlZeroMemory(MemoryParameters->Buffer, - MdListCount * sizeof(BL_MEMORY_DESCRIPTOR)); - } - - /* Initialize our list of descriptors */ - MmMdInitializeList(&FullMdList, 0, MemoryMap); - Used = 0; - - /* Handle mapped, allocated */ - if (DoMapAlloc) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlMappedAllocated, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle mapped, unallocated */ - if (DoMapUnalloc) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlMappedUnallocated, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle unmapped, allocated */ - if (DoUnmapAlloc) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlUnmappedAllocated, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle unmapped, unallocated */ - if (DoUnmapUnalloc) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlUnmappedUnallocated, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle reserved, allocated */ - if (DoReserved) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlReservedAllocated, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle bad */ - if (DoBad) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlBadMemory, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle truncated */ - if (DoTruncated) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlTruncatedMemory, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle persistent */ - if (DoPersistent) - { - Status = MmMdCopyList(&FullMdList, - &MmMdlPersistentMemory, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle firmware */ - if (DoFirmware) - { - Status = MmMdCopyList(&FullMdList, - &FirmwareMdList, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Handle firmware2 */ - if (DoFirmware2) - { - Status = MmMdCopyList(&FullMdList, - &FirmwareMdList, - MemoryParameters->Buffer, - &Used, - MdListCount, - Flags); - } - - /* Add up the final size */ - Status = RtlULongLongToULong(Used * sizeof(BL_MEMORY_DESCRIPTOR), - &MemoryParameters->ActualSize); - -Quickie: - MmMdFreeList(&FirmwareMdList); - return Status; -} - -NTSTATUS -MmPaReleaseSelfMapPages ( - _In_ PHYSICAL_ADDRESS Address - ) -{ - PBL_MEMORY_DESCRIPTOR Descriptor; - ULONGLONG BasePage; - NTSTATUS Status; - - /* Only page-aligned addresses are accepted */ - if (Address.QuadPart & (PAGE_SIZE - 1)) - { - EfiPrintf(L"free mem fail 1\r\n"); - return STATUS_INVALID_PARAMETER; - } - - /* Get the base page, and find a descriptor that matches */ - BasePage = Address.QuadPart >> PAGE_SHIFT; - Descriptor = MmMdFindDescriptor(BL_MM_INCLUDE_UNMAPPED_UNALLOCATED, - BL_MM_REMOVE_PHYSICAL_REGION_FLAG, - BasePage); - if (!(Descriptor) || (Descriptor->BasePage != BasePage)) - { - return STATUS_INVALID_PARAMETER; - } - - /* Free the physical pages */ - Status = MmFwFreePages(BasePage, Descriptor->PageCount); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Remove the firmware flags */ - Descriptor->Flags &= ~(BlMemoryNonFirmware | - BlMemoryFirmware | - BlMemoryPersistent); - - /* Set it as free memory */ - Descriptor->Type = BlConventionalMemory; - - /* Create a new descriptor that's free memory, covering the old range */ - Descriptor = MmMdInitByteGranularDescriptor(0, - BlConventionalMemory, - BasePage, - 0, - Descriptor->PageCount); - if (!Descriptor) - { - return STATUS_NO_MEMORY; - } - - /* Insert it into the virtual free list */ - return MmMdAddDescriptorToList(&MmMdlFreeVirtual, - Descriptor, - BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG | - BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG); -} - -NTSTATUS -MmPaReserveSelfMapPages ( - _Inout_ PPHYSICAL_ADDRESS PhysicalAddress, - _In_ ULONG Alignment, - _In_ ULONG PageCount - ) -{ - NTSTATUS Status; - BL_PA_REQUEST Request; - BL_MEMORY_DESCRIPTOR Descriptor; - - /* Increment descriptor usage count */ - ++MmDescriptorCallTreeCount; - - /* Bail if we don't have an address */ - if (!PhysicalAddress) - { - Status = STATUS_INVALID_PARAMETER; - goto Quickie; - } - - /* Make a request for the required number of self-map pages */ - Request.BaseRange.Minimum = PapMinimumPhysicalPage; - Request.BaseRange.Maximum = 0xFFFFFFFF >> PAGE_SHIFT; - Request.VirtualRange.Minimum = 0; - Request.VirtualRange.Maximum = 0; - Request.Pages = PageCount; - Request.Alignment = Alignment; - Request.Type = BL_MM_REQUEST_DEFAULT_TYPE; - Request.Flags = 0; - Status = MmPaAllocatePages(&MmMdlUnmappedUnallocated, - &Descriptor, - &MmMdlUnmappedUnallocated, - &Request, - BlLoaderSelfMap); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Remove this region from free virtual memory */ - Status = MmMdRemoveRegionFromMdlEx(&MmMdlFreeVirtual, - BL_MM_REMOVE_VIRTUAL_REGION_FLAG, - Descriptor.BasePage, - Descriptor.PageCount, - 0); - if (!NT_SUCCESS(Status)) - { - goto Quickie; - } - - /* Return the physical address */ - PhysicalAddress->QuadPart = Descriptor.BasePage << PAGE_SHIFT; - -Quickie: - /* Free global descriptors and reduce the count by one */ - MmMdFreeGlobalDescriptors(); - --MmDescriptorCallTreeCount; - return Status; -} - -NTSTATUS -MmSelectMappingAddress ( - _Out_ PVOID* MappingAddress, - _In_ PVOID PreferredAddress, - _In_ ULONGLONG Size, - _In_ ULONG AllocationAttributes, - _In_ ULONG Flags, - _In_ PHYSICAL_ADDRESS PhysicalAddress - ) -{ - BL_PA_REQUEST Request; - NTSTATUS Status; - BL_MEMORY_DESCRIPTOR NewDescriptor; - - /* Are we in physical mode? */ - if (MmTranslationType == BlNone) - { - /* Just return the physical address as the mapping address */ - PreferredAddress = PhysicalAddressToPtr(PhysicalAddress); - goto Success; - } - - /* If no physical address, or caller wants a fixed address... */ - if ((PhysicalAddress.QuadPart == -1) || (Flags & BlMemoryFixed)) - { - /* Then just return the preferred address */ - goto Success; - } - - /* Check which range of virtual memory should be used */ - if (AllocationAttributes & BlMemoryKernelRange) - { - /* Use kernel range */ - Request.BaseRange.Minimum = MmArchKsegAddressRange.Minimum >> PAGE_SHIFT; - Request.BaseRange.Maximum = MmArchKsegAddressRange.Maximum >> PAGE_SHIFT; - Request.Type = BL_MM_REQUEST_DEFAULT_TYPE; - } - else - { - /* User user/application range */ - Request.BaseRange.Minimum = 0 >> PAGE_SHIFT; - Request.BaseRange.Maximum = MmArchTopOfApplicationAddressSpace >> PAGE_SHIFT; - Request.Type = BL_MM_REQUEST_TOP_DOWN_TYPE; - } - - /* Build a request */ - Request.VirtualRange.Minimum = 0; - Request.VirtualRange.Maximum = 0; - Request.Flags = AllocationAttributes & BlMemoryLargePages; - Request.Alignment = 1; - Request.Pages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(PhysicalAddress.LowPart, Size); - - /* Allocate the physical pages */ - Status = MmPaAllocatePages(NULL, - &NewDescriptor, - &MmMdlFreeVirtual, - &Request, - BlConventionalMemory); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - /* Return the address we got back */ - PreferredAddress = (PVOID)((ULONG_PTR)NewDescriptor.BasePage << PAGE_SHIFT); - - /* Check if the existing physical address was not aligned */ - if (PhysicalAddress.QuadPart != -1) - { - /* Add the offset to the returned virtual address */ - PreferredAddress = (PVOID)((ULONG_PTR)PreferredAddress + - BYTE_OFFSET(PhysicalAddress.QuadPart)); - } - -Success: - /* Return the mapping address and success */ - *MappingAddress = PreferredAddress; - return STATUS_SUCCESS; -} diff --git a/boot/environ/lib/mm/stub/mm.c b/boot/environ/lib/mm/stub/mm.c deleted file mode 100644 index ad8a3b38dd9..00000000000 --- a/boot/environ/lib/mm/stub/mm.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/mm/stub/mm.c - * PURPOSE: Boot Library Memory Manager Skeleton Code - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -BL_ADDRESS_RANGE MmArchKsegAddressRange; -ULONG_PTR MmArchTopOfApplicationAddressSpace; -ULONG MmArchLargePageSize; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -MmArchInitialize ( - _In_ ULONG Phase, - _In_ PBL_MEMORY_DATA MemoryData, - _In_ BL_TRANSLATION_TYPE TranslationType, - _In_ BL_TRANSLATION_TYPE RequestedTranslationType - ) -{ - EfiPrintf(L" MmArchInitialize NOT IMPLEMENTED for this platform\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -MmMapPhysicalAddress ( - _Inout_ PPHYSICAL_ADDRESS PhysicalAddressPtr, - _Inout_ PVOID* VirtualAddressPtr, - _Inout_ PULONGLONG SizePtr, - _In_ ULONG CacheAttributes - ) -{ - EfiPrintf(L" MmMapPhysicalAddress NOT IMPLEMENTED for this platform\r\n"); - return STATUS_NOT_IMPLEMENTED; -} - -BOOLEAN -MmArchTranslateVirtualAddress ( - _In_ PVOID VirtualAddress, - _Out_opt_ PPHYSICAL_ADDRESS PhysicalAddress, - _Out_opt_ PULONG CachingFlags - ) -{ - EfiPrintf(L" MmMapPhysicalAddress NOT IMPLEMENTED for this platform\r\n"); - return FALSE; -} diff --git a/boot/environ/lib/platform/time.c b/boot/environ/lib/platform/time.c deleted file mode 100644 index bef1b460c34..00000000000 --- a/boot/environ/lib/platform/time.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/platform/time.c - * PURPOSE: Boot Library Time Management Routines - * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* DATA VARIABLES ************************************************************/ - -ULONGLONG BlpTimePerformanceFrequency; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -BlpTimeMeasureTscFrequency ( - VOID - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - ULONG Count; - INT CpuInfo[4]; - ULONGLONG TimeStamp1, TimeStamp2, Delta; - - /* Check if the ISVM bit it set, meaning we're in a hypervisor */ - __cpuid(CpuInfo, 1); - Count = CpuInfo[2] & 0x80000000 ? 10 : 1; - - /* Loop trying to get an accurate TSC */ - do - { - /* Stall for 1us and get count 1 */ - EfiStall(1); - TimeStamp1 = __rdtsc(); - - /* Stall for 1000us and get count 2*/ - EfiStall(1000); - TimeStamp2 = __rdtsc(); - - /* Stall for 9000us and get the difference */ - EfiStall(9000); - Delta = __rdtsc() - TimeStamp2; - - /* Keep going as long as the TSC is fluctuating */ - --Count; - } while (((TimeStamp2 - TimeStamp1) > Delta) && (Count)); - - /* Set the frequency based on the two measurements we took */ - BlpTimePerformanceFrequency = 125 * (Delta - (TimeStamp2 - TimeStamp1)) & 0x1FFFFFFFFFFFFFF; - return STATUS_SUCCESS; -#else - EfiPrintf(L"BlpTimeMeasureTscFrequency not implemented for this platform.\r\n"); - return STATUS_NOT_IMPLEMENTED; -#endif -} - -NTSTATUS -BlpTimeCalibratePerformanceCounter ( - VOID - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - INT CpuInfo[4]; - - /* Check if the ISVM bit it set, meaning we're in a hypervisor */ - __cpuid(CpuInfo, 1); - if (CpuInfo[2] & 0x80000000) - { - /* Get the Hypervisor Identification Leaf */ - __cpuid(CpuInfo, 0x40000001); - - /* Is this Hyper-V? */ - if (CpuInfo[0] == '1#vH') - { - /* Get the Hypervisor Feature Identification Leaf */ - __cpuid(CpuInfo, 0x40000003); - - /* Check if HV_X64_MSR_REFERENCE_TSC is present */ - if (CpuInfo[3] & 0x100) - { - /* Read the TSC frequency from the MSR */ - BlpTimePerformanceFrequency = __readmsr(0x40000022); - return STATUS_SUCCESS; - } - } - } - - /* On other systems, compute it */ - return BlpTimeMeasureTscFrequency(); -#else - EfiPrintf(L"BlpTimeCalibratePerformanceCounter not implemented for this platform.\r\n"); - return STATUS_NOT_IMPLEMENTED; -#endif -} - -ULONGLONG -BlTimeQueryPerformanceCounter ( - _Out_opt_ PLARGE_INTEGER Frequency - ) -{ -#if defined(_M_IX86) || defined(_M_X64) - /* Check if caller wants frequency */ - if (Frequency) - { - /* Return it */ - Frequency->QuadPart = BlpTimePerformanceFrequency; - } - - /* Return the TSC value */ - return __rdtsc(); -#else - EfiPrintf(L"BlTimeQueryPerformanceCounter not implemented for this platform.\r\n"); - return 0; -#endif -}; diff --git a/boot/environ/lib/rtl/libsupp.c b/boot/environ/lib/rtl/libsupp.c deleted file mode 100644 index 257b859893a..00000000000 --- a/boot/environ/lib/rtl/libsupp.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * COPYRIGHT: See COPYING.ARM in the top level directory - * PROJECT: ReactOS UEFI Boot Library - * FILE: boot/environ/lib/rtl/libsupp.c - * PURPOSE: RTL Support Routines - * PROGRAMMER: Mark Jansen (mark.jansen@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#include "bl.h" - -/* FUNCTIONS *****************************************************************/ - -/* Ldr access to IMAGE_NT_HEADERS without SEH */ - -/* Rtl SEH-Free version of this */ -NTSTATUS -NTAPI -RtlpImageNtHeaderEx( - _In_ ULONG Flags, - _In_ PVOID Base, - _In_ ULONG64 Size, - _Out_ PIMAGE_NT_HEADERS *OutHeaders); - - -/* - * @implemented - */ -NTSTATUS -NTAPI -RtlImageNtHeaderEx( - _In_ ULONG Flags, - _In_ PVOID Base, - _In_ ULONG64 Size, - _Out_ PIMAGE_NT_HEADERS *OutHeaders) -{ - return RtlpImageNtHeaderEx(Flags, Base, Size, OutHeaders); -} diff --git a/boot/freeldr/freeldr/uefi.cmake b/boot/freeldr/freeldr/uefi.cmake index 1800d9509f5..50f293bacd7 100644 --- a/boot/freeldr/freeldr/uefi.cmake +++ b/boot/freeldr/freeldr/uefi.cmake @@ -6,7 +6,7 @@ ## include_directories(BEFORE - ${REACTOS_SOURCE_DIR}/boot/environ/include/efi + ${REACTOS_SOURCE_DIR}/sdk/include/reactos/edk2 ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr/include ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr/include/arch/uefi) diff --git a/boot/environ/include/efi/Acpi.h b/sdk/include/reactos/edk2/Acpi.h similarity index 80% rename from boot/environ/include/efi/Acpi.h rename to sdk/include/reactos/edk2/Acpi.h index 3897ae62ff3..5cb4ec5261f 100644 --- a/boot/environ/include/efi/Acpi.h +++ b/sdk/include/reactos/edk2/Acpi.h @@ -2,17 +2,17 @@ GUIDs used for ACPI entries in the EFI system table These GUIDs point the ACPI tables as defined in the ACPI specifications. - ACPI 2.0 specification defines the ACPI 2.0 GUID. UEFI 2.0 defines the + ACPI 2.0 specification defines the ACPI 2.0 GUID. UEFI 2.0 defines the ACPI 2.0 Table GUID and ACPI Table GUID. Copyright (c) 2006 - 2009, 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 + 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. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. @par Revision Reference: GUIDs defined in UEFI 2.0 spec. diff --git a/boot/environ/include/efi/Base.h b/sdk/include/reactos/edk2/Base.h similarity index 100% rename from boot/environ/include/efi/Base.h rename to sdk/include/reactos/edk2/Base.h diff --git a/boot/environ/include/efi/BlockIo.h b/sdk/include/reactos/edk2/BlockIo.h similarity index 96% rename from boot/environ/include/efi/BlockIo.h rename to sdk/include/reactos/edk2/BlockIo.h index 4bc2109db12..12c5f74598a 100644 --- a/boot/environ/include/efi/BlockIo.h +++ b/sdk/include/reactos/edk2/BlockIo.h @@ -5,13 +5,13 @@ DVD-ROMs and floppy drives. Copyright (c) 2006 - 2011, 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 + 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. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ diff --git a/boot/environ/include/efi/DevicePath.h b/sdk/include/reactos/edk2/DevicePath.h similarity index 100% rename from boot/environ/include/efi/DevicePath.h rename to sdk/include/reactos/edk2/DevicePath.h diff --git a/boot/environ/include/efi/GlobalVariable.h b/sdk/include/reactos/edk2/GlobalVariable.h similarity index 96% rename from boot/environ/include/efi/GlobalVariable.h rename to sdk/include/reactos/edk2/GlobalVariable.h index f9737b36528..c8377066cb2 100644 --- a/boot/environ/include/efi/GlobalVariable.h +++ b/sdk/include/reactos/edk2/GlobalVariable.h @@ -2,13 +2,13 @@ GUID for EFI (NVRAM) Variables. Copyright (c) 2006 - 2015, 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 + 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. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. @par Revision Reference: GUID defined in UEFI 2.1 diff --git a/boot/environ/include/efi/GraphicsOutput.h b/sdk/include/reactos/edk2/GraphicsOutput.h similarity index 97% rename from boot/environ/include/efi/GraphicsOutput.h rename to sdk/include/reactos/edk2/GraphicsOutput.h index a3432ce1d6e..9ce3546734e 100644 --- a/boot/environ/include/efi/GraphicsOutput.h +++ b/sdk/include/reactos/edk2/GraphicsOutput.h @@ -4,13 +4,13 @@ Abstraction of a very simple graphics device. Copyright (c) 2006 - 2012, 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 + 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. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ diff --git a/boot/environ/include/efi/LoadedImage.h b/sdk/include/reactos/edk2/LoadedImage.h similarity index 100% rename from boot/environ/include/efi/LoadedImage.h rename to sdk/include/reactos/edk2/LoadedImage.h diff --git a/boot/environ/include/efi/ProcessorBind.h b/sdk/include/reactos/edk2/ProcessorBind.h similarity index 100% rename from boot/environ/include/efi/ProcessorBind.h rename to sdk/include/reactos/edk2/ProcessorBind.h diff --git a/boot/environ/include/efi/SimpleTextIn.h b/sdk/include/reactos/edk2/SimpleTextIn.h similarity index 100% rename from boot/environ/include/efi/SimpleTextIn.h rename to sdk/include/reactos/edk2/SimpleTextIn.h diff --git a/boot/environ/include/efi/SimpleTextInEx.h b/sdk/include/reactos/edk2/SimpleTextInEx.h similarity index 100% rename from boot/environ/include/efi/SimpleTextInEx.h rename to sdk/include/reactos/edk2/SimpleTextInEx.h diff --git a/boot/environ/include/efi/SimpleTextOut.h b/sdk/include/reactos/edk2/SimpleTextOut.h similarity index 100% rename from boot/environ/include/efi/SimpleTextOut.h rename to sdk/include/reactos/edk2/SimpleTextOut.h diff --git a/boot/environ/include/efi/Uefi.h b/sdk/include/reactos/edk2/Uefi.h similarity index 100% rename from boot/environ/include/efi/Uefi.h rename to sdk/include/reactos/edk2/Uefi.h diff --git a/boot/environ/include/efi/UefiBaseType.h b/sdk/include/reactos/edk2/UefiBaseType.h similarity index 100% rename from boot/environ/include/efi/UefiBaseType.h rename to sdk/include/reactos/edk2/UefiBaseType.h diff --git a/boot/environ/include/efi/UefiMultiPhase.h b/sdk/include/reactos/edk2/UefiMultiPhase.h similarity index 100% rename from boot/environ/include/efi/UefiMultiPhase.h rename to sdk/include/reactos/edk2/UefiMultiPhase.h diff --git a/boot/environ/include/efi/UefiSpec.h b/sdk/include/reactos/edk2/UefiSpec.h similarity index 100% rename from boot/environ/include/efi/UefiSpec.h rename to sdk/include/reactos/edk2/UefiSpec.h diff --git a/boot/environ/include/efi/UgaDraw.h b/sdk/include/reactos/edk2/UgaDraw.h similarity index 100% rename from boot/environ/include/efi/UgaDraw.h rename to sdk/include/reactos/edk2/UgaDraw.h diff --git a/boot/environ/include/efi/WinCertificate.h b/sdk/include/reactos/edk2/WinCertificate.h similarity index 100% rename from boot/environ/include/efi/WinCertificate.h rename to sdk/include/reactos/edk2/WinCertificate.h