diff --git a/Languages/norwegian.lang b/Languages/norwegian.lang index af180410..dbef7817 100644 --- a/Languages/norwegian.lang +++ b/Languages/norwegian.lang @@ -1,1382 +1,1382 @@ -# USB Loader GX language source file. -# norwegian.lang - r813 -# don't delete/change this line (é). -msgid "" -msgstr "" -"Project-Id-Version: USB Loader GX\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-30 23:36+0200\n" -"PO-Revision-Date: 2009-10-01 01:00+0200\n" -"Last-Translator: raschi\n" -"Language-Team: raschi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -msgid " " -msgstr "" - -msgid " Wad Saved as:" -msgstr " WAD lagret som:" - -msgid " could not be downloaded." -msgstr " kan ikke lastes ned." - -msgid " has been Saved. The text has not been verified. Some of the code may not work right with each other. If you experience trouble, open the text in a real text editor for more information." -msgstr " har blitt lagret. Teksten har ikke blitt verifisert. Noe av koden vil kanskje ikke fungere riktig. Hvis du fÃ¥r problemer, Ã¥pne teksten i et ekte redigeringsprogram for mer informasjon." - -msgid " is not on the server." -msgstr " finnes ikke pÃ¥ serveren." - -#, c-format -msgid "%s : %s May not boot correctly if your System Menu is not up to date." -msgstr "%s : %s vil kanskje ikke starte riktig hvis System Menyen ikke er oppdatert." - -msgid "0 (Everyone)" -msgstr "0 (Alle)" - -msgid "1 (Child 7+)" -msgstr "1 (Barn 7+)" - -msgid "1 hour" -msgstr "1 time" - -msgid "10 min" -msgstr "" - -msgid "2 (Teen 12+)" -msgstr "2 (Ungdom 12+)" - -msgid "20 min" -msgstr "" - -msgid "2D Cover Path" -msgstr "2D Cover sti" - -msgid "3 (Mature 16+)" -msgstr "3 (Ungdom 16+)" - -msgid "3 min" -msgstr "" - -msgid "30 min" -msgstr "" - -msgid "3D Cover Path" -msgstr "3D Cover sti" - -msgid "3D Covers" -msgstr "3D cover" - -msgid "4 (Adults Only 18+)" -msgstr "4 (Voksen 18+)" - -msgid "5 min" -msgstr "" - -msgid ">> Deleting tickets..." -msgstr ">> Sletter tickets..." - -msgid ">> Deleting tickets...ERROR! " -msgstr ">> Sletter tickets...FEIL! " - -msgid ">> Deleting tickets...Ok! " -msgstr ">> Sletter tickets...OK! " - -msgid ">> Deleting title ...ERROR! " -msgstr ">> Sletter tittel ...FEIL! " - -msgid ">> Deleting title ...Ok!" -msgstr ">> Sletter tittel ...OK!" - -msgid ">> Deleting title contents..." -msgstr ">> Sletter tittel innhold..." - -msgid ">> Deleting title contents...ERROR! " -msgstr ">> Sletter tittel innhold...FEIL! " - -msgid ">> Deleting title contents...Ok!" -msgstr ">> Sletter tittel innhold...OK!" - -msgid ">> Deleting title..." -msgstr ">> Sletter tittel..." - -msgid ">> Finishing installation..." -msgstr ">> Sluttfører installasjon..." - -msgid ">> Installing content #" -msgstr ">> Installerer innhold #" - -msgid ">> Installing ticket..." -msgstr ">> Installerer ticket..." - -msgid ">> Installing title..." -msgstr ">> Installerer tittel..." - -msgid ">> Reading WAD data..." -msgstr ">> Leser WAD data..." - -msgid ">> Reading WAD data...ERROR! " -msgstr ">> Leser WAD data...FEIL! " - -msgid ">> Reading WAD data...Ok!" -msgstr ">> Leser WAD data...OK!" - -msgid "AUTO" -msgstr "" - -msgid "All partitions" -msgstr "" - -msgid "All the features of USB Loader GX are unlocked." -msgstr "Alle funksjonene til USB Loader GX er opplÃ¥st." - -msgid "Alternate DOL" -msgstr "Alternativ DOL" - -msgid "An Error occured" -msgstr "En feil oppstod" - -msgid "Anti" -msgstr "" - -msgid "App Language" -msgstr "Program sprÃ¥k" - -msgid "Apr" -msgstr "" - -msgid "Are you sure you want to enable Parent Control?" -msgstr "" - -msgid "Are you sure?" -msgstr "Er du sikker?" - -msgid "Aug" -msgstr "" - -msgid "Author:" -msgstr "Forfatter:" - -msgid "AutoInit Network" -msgstr "Autostart nettverk" - -msgid "AutoPatch" -msgstr "" - -msgid "BCA Codes Path" -msgstr "" - -msgid "BCA Codes Path changed" -msgstr "" - -msgid "BETA revisions" -msgstr "" - -msgid "Back" -msgstr "Tilbake" - -msgid "Back to HBC or Wii Menu" -msgstr "Tilbake til HBC eller Wii meny" - -msgid "Back to Loader" -msgstr "HBC/Loader" - -msgid "Back to Wii Menu" -msgstr "Wii meny" - -msgid "Backgroundmusic" -msgstr "Bakgrunnsmusikk" - -msgid "Big thanks to:" -msgstr "Stor takk til:" - -msgid "Block IOS Reload" -msgstr "Blokkér IOS Reload" - -msgid "Boot/Standard" -msgstr "Boot/Standard" - -msgid "Boot?" -msgstr "Start?" - -msgid "Both" -msgstr "Begge" - -msgid "Can't be formatted" -msgstr "Kan ikke formateres" - -msgid "Can't create directory" -msgstr "Kan ikke opprette mappe" - -msgid "Can't create file" -msgstr "Kan ikke opprette fil" - -msgid "Can't delete:" -msgstr "Kan ikke slette:" - -msgid "Cancel" -msgstr "Avbryt" - -msgid "Change Play Path" -msgstr "" - -msgid "Channels" -msgstr "Kanaler" - -msgid "Cheatfile is blank" -msgstr "Juksefil er blank" - -msgid "Checking existing artwork" -msgstr "Sjekker eksisterende bilder" - -msgid "Checking for Updates" -msgstr "Søker etter oppdateringer" - -msgid "Click to Download Covers" -msgstr "Klikk for Ã¥ laste ned cover" - -msgid "Click to change game ID" -msgstr "Klikk for Ã¥ endre spill ID" - -msgid "Clock" -msgstr "Klokke" - -msgid "Close" -msgstr "Lukk" - -msgid "Code Download" -msgstr "Kode nedlasting" - -#, c-format -msgid "Coded by: %s" -msgstr "Kodet av: %s" - -msgid "Coding:" -msgstr "Koding:" - -msgid "Confirm" -msgstr "Bekreft" - -msgid "Connection lost..." -msgstr "" - -msgid "Console" -msgstr "Konsoll" - -msgid "Console Default" -msgstr "Konsoll Standard" - -msgid "Console Locked" -msgstr "Konsoll lÃ¥st" - -msgid "Console should be unlocked to modify it." -msgstr "Konsoll mÃ¥ være opplÃ¥st for Ã¥ modifisere." - -msgid "Continue to install game?" -msgstr "Fortsett Ã¥ installere spill?" - -msgid "Controllevel" -msgstr "KontrollnivÃ¥" - -msgid "Correct Password" -msgstr "Riktig passord" - -msgid "Could not create GCT file" -msgstr "Kan ikke opprette GCT fil" - -msgid "Could not find a WBFS partition." -msgstr "Kan ikke finne en WBFS partisjon." - -msgid "Could not initialize DIP module!" -msgstr "Kan ikke initialisere DIP modul!" - -msgid "Could not initialize network!" -msgstr "Kan ikke initialisere nettverk!" - -msgid "Could not open Disc" -msgstr "Kan ikke Ã¥pne plate" - -msgid "Could not open WBFS partition" -msgstr "Kan ikke Ã¥pne WBFS partisjon" - -msgid "Could not read the disc." -msgstr "Kan ikke lese plate." - -msgid "Could not save." -msgstr "Kan ikke lagre." - -msgid "Could not set USB." -msgstr "Kan ikke velge USB." - -msgid "Cover Download" -msgstr "Cover nedlasting" - -msgid "Cover Path Changed" -msgstr "Cover sti endret" - -msgid "Create" -msgstr "Opprett" - -msgid "Credits" -msgstr "Medvirkende" - -msgid "Custom Paths" -msgstr "Endre stier" - -msgid "Customs/Original" -msgstr "Custom/Original" - -msgid "DOL Path" -msgstr "DOL sti" - -msgid "DOL path changed" -msgstr "DOL sti endret" - -msgid "Dec" -msgstr "Des" - -msgid "Default" -msgstr "Standard" - -msgid "Default Gamesettings" -msgstr "Standard innstillinger" - -msgid "Default Settings" -msgstr "Standard innstillinger" - -msgid "Delete" -msgstr "Slett" - -msgid "Delete ?" -msgstr "Slett ?" - -msgid "Delete Cheat GCT" -msgstr "Slett juksefil GCT" - -msgid "Delete Cheat TXT" -msgstr "Slett juksefil TXT" - -msgid "Delete Cover Artwork" -msgstr "Slett cover" - -msgid "Delete Disc Artwork" -msgstr "Slett platebilde" - -msgid "Design:" -msgstr "" - -msgid "Developed by" -msgstr "Utviklet av" - -msgid "Directory does not exist!" -msgstr "Mappestruktur finnes ikke!" - -msgid "Disc Artwork Download" -msgstr "Platebilde nedlasting" - -msgid "Disc Artwork Path" -msgstr "Platebilde sti" - -msgid "Disc Default" -msgstr "Spill Standard" - -msgid "Disc Images" -msgstr "Plate bilder" - -msgid "Disc Path Changed" -msgstr "Plate sti endret" - -msgid "DiskFlip" -msgstr "Snu plate" - -msgid "Display" -msgstr "Vis" - -msgid "Display as a carousel" -msgstr "Vis som karusell" - -msgid "Display as a grid" -msgstr "Vis som rutemønster" - -msgid "Display as a list" -msgstr "Vis som liste" - -msgid "Display favorites" -msgstr "Vis favoritter" - -msgid "Do you really want to delete:" -msgstr "Er du sikker pÃ¥ at du vil slette:" - -msgid "Do you want to apply it now?" -msgstr "" - -msgid "Do you want to change language?" -msgstr "Vil du endre sprÃ¥k?" - -msgid "Do you want to download this theme?" -msgstr "Vil du laste ned dette temaet?" - -msgid "Do you want to format:" -msgstr "Vil du formatere:" - -msgid "Do you want to retry for 30 secs?" -msgstr "Vil du fortsette Ã¥ prøve i 30 sekunder?" - -msgid "Do you want to use the alternate DOL that is known to be correct?" -msgstr "Vil du bruke alt DOL filen som er kjent for Ã¥ være riktig?" - -msgid "Do you wish to update/download all language files?" -msgstr "Vil du oppdatere/laste ned alle sprÃ¥kfiler?" - -msgid "Done!" -msgstr "Ferdig!" - -msgid "Download" -msgstr "Last ned" - -msgid "Download Boxart image?" -msgstr "Last ned cover bilde?" - -msgid "Download Discart image?" -msgstr "Last ned plate bilde?" - -msgid "Download Now" -msgstr "Last ned nÃ¥" - -msgid "Download failed." -msgstr "Nedlasting feilet." - -msgid "Download finished" -msgstr "Nedlasting ferdig" - -msgid "Download request failed." -msgstr "Nedlast spørring feilet." - -msgid "Downloading" -msgstr "Laster ned" - -msgid "Downloading Page List:" -msgstr "Laster ned side liste:" - -msgid "Downloading file" -msgstr "Laster ned fil" - -msgid "Downloading image:" -msgstr "Laster ned bilde:" - -msgid "Dutch" -msgstr "Nederlandsk" - -msgid "ERROR" -msgstr "FEIL" - -msgid "ERROR:" -msgstr "FEIL:" - -msgid "ERROR: Can't set up theme." -msgstr "" - -msgid "Enable Parental Control" -msgstr "" - -msgid "English" -msgstr "Engelsk" - -msgid "Error" -msgstr "Feil" - -msgid "Error !" -msgstr "Feil !" - -msgid "Error 002 fix" -msgstr "Error 002 fiks" - -msgid "Error reading Disc" -msgstr "Feil ved lesing av plate" - -msgid "Error while transfering data." -msgstr "Feil ved overføring av data." - -msgid "Error..." -msgstr "Feil..." - -msgid "Error:" -msgstr "Feil:" - -msgid "Extracting files..." -msgstr "Pakker ut filer..." - -msgid "FAT: Use directories" -msgstr "" - -msgid "Failed formating" -msgstr "Feil ved formatering" - -msgid "Failed to extract." -msgstr "Utpakking feilet." - -msgid "Failed to open partition" -msgstr "Feil ved Ã¥pning av partisjon" - -msgid "Feb" -msgstr "" - -msgid "File not found." -msgstr "Fil ikke funnet." - -msgid "Finishing installation... Ok!" -msgstr "Sluttfører installasjon... OK!" - -msgid "Flip-X" -msgstr "" - -msgid "Force" -msgstr "Tving" - -msgid "Format" -msgstr "Formatér" - -msgid "Formatting, please wait..." -msgstr "Formaterer, vennligst vent..." - -msgid "Free Space" -msgstr "Ledig plass" - -msgid "French" -msgstr "Fransk" - -msgid "Full Shutdown" -msgstr "Skru helt av" - -msgid "GAMEID_Gamename" -msgstr "" - -msgid "GCT Cheatcodes Path" -msgstr "GCT Juksekode sti" - -msgid "GCT Cheatcodes Path changed" -msgstr "GCT Juksekode sti endret" - -msgid "GCT File created" -msgstr "GCT fil opprettet" - -msgid "GUI Settings" -msgstr "GUI innstillinger" - -msgid "GXtheme.cfg not found in any subfolder." -msgstr "" - -msgid "Game ID" -msgstr "Spill ID" - -msgid "Game Language" -msgstr "SprÃ¥k" - -msgid "Game Load" -msgstr "Lasting av spill" - -msgid "Game Region" -msgstr "Region" - -msgid "Game Size" -msgstr "Spill størrelse" - -msgid "Game Sound Mode" -msgstr "" - -msgid "Game Sound Volume" -msgstr "" - -msgid "Game is already installed:" -msgstr "Spillet er allerede installert:" - -msgid "Game partition" -msgstr "" - -msgid "Gamename [GAMEID]" -msgstr "" - -msgid "Games" -msgstr "Spill" - -msgid "German" -msgstr "Tysk" - -msgid "HOME Menu" -msgstr "HOME Meny" - -msgid "Hermes CIOS" -msgstr "" - -msgid "Homebrew Apps Path" -msgstr "Homebrew Apps sti" - -msgid "Homebrew Appspath changed" -msgstr "Homebrew Apps sti endret" - -msgid "Homebrew Launcher" -msgstr "Homebrew Laster" - -msgid "Hour" -msgstr "Timer" - -msgid "How do you want to update?" -msgstr "Hvordan vil du oppdatere?" - -msgid "How to Shutdown?" -msgstr "Hvordan skru av?" - -msgid "If you don't have WiFi, press 1 to get an URL to get your WiiTDB.zip" -msgstr "Hvis du ikke har WiFi, klikk 1 for Ã¥ fÃ¥ en URL til din WiiTDB.zip" - -#, c-format -msgid "Incoming file %0.2fKB" -msgstr "Laster ned fil %0.2fKB" - -#, c-format -msgid "Incoming file %0.2fMB" -msgstr "Laster ned fil %0.2fMB" - -msgid "Initializing Network" -msgstr "Initialiserer nettverk" - -msgid "Insert Disk" -msgstr "Sett inn plate" - -msgid "Insert a Wii Disc!" -msgstr "Sett inn en Wii plate!" - -msgid "Insert an SD-Card to download images." -msgstr "Sett inn et SD-kort for Ã¥ laste ned bilder." - -msgid "Insert an SD-Card to save." -msgstr "Sett inn et SD-kort for Ã¥ lagre." - -msgid "Insert an SD-Card to use this option." -msgstr "Sett inn et SD-kort for Ã¥ bruke innstillingen." - -msgid "Install" -msgstr "Installér" - -msgid "Install 1:1 Copy" -msgstr "" - -msgid "Install Error!" -msgstr "Installasjonsfeil!" - -msgid "Install a game" -msgstr "Installér et spill" - -msgid "Install not possible" -msgstr "" - -msgid "Install partitions" -msgstr "" - -msgid "Installing content... Ok!" -msgstr "Installerer innhold... OK!" - -msgid "Installing game:" -msgstr "Installerer spill:" - -msgid "Installing ticket... Ok!" -msgstr "Installerer ticket... OK!" - -msgid "Installing title... Ok!" -msgstr "Installerer tittel... OK!" - -msgid "Installing wad" -msgstr "Installerer WAD" - -msgid "Invalid PIN code" -msgstr "" - -msgid "It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team." -msgstr "Det ser ut til at du har informasjon som kan være nyttig for oss. Vennligst videresend denne informasjonen til utviklerteamet." - -msgid "Italian" -msgstr "Italiensk" - -msgid "Jan" -msgstr "" - -msgid "Japanese" -msgstr "Japansk" - -msgid "July" -msgstr "Jul" - -msgid "June" -msgstr "Jun" - -msgid "Keep" -msgstr "Behold" - -msgid "Keyboard" -msgstr "Tastatur" - -msgid "Korean" -msgstr "Koreansk" - -msgid "Language File" -msgstr "SprÃ¥k Fil" - -msgid "Language change:" -msgstr "Endre sprÃ¥k" - -msgid "Languagepath changed." -msgstr "SprÃ¥ksti endret." - -msgid "Left" -msgstr "Venstre" - -msgid "Like SysMenu" -msgstr "Lik Systemmeny" - -msgid "Load" -msgstr "Start" - -msgid "Load From SD/USB" -msgstr "Start fra SD/USB" - -#, c-format -msgid "Load file from: %s ?" -msgstr "Start fil fra: %s ?" - -msgid "Load this DOL as alternate DOL?" -msgstr "Last denne DOL som alternativ DOL?" - -msgid "Loading standard language." -msgstr "Laster standard sprÃ¥k." - -msgid "Loading standard music." -msgstr "Laster standard musikk." - -msgid "Lock Console" -msgstr "LÃ¥s konsoll" - -msgid "Locked" -msgstr "LÃ¥st" - -msgid "Loop Directory" -msgstr "" - -msgid "Loop Music" -msgstr "" - -msgid "Loop Sound" -msgstr "" - -msgid "Mar" -msgstr "" - -msgid "Mark new games" -msgstr "" - -msgid "May" -msgstr "Mai" - -msgid "Missing files" -msgstr "Manglende filer" - -msgid "Most likely it has dimensions that are not evenly divisible by 4." -msgstr "Sannsynligvis har bildet dimensjoner som ikke kan deles med 4." - -msgid "Mount DVD drive" -msgstr "Last DVD stasjon" - -msgid "Music Loop Mode" -msgstr "" - -msgid "Music Volume" -msgstr "Musikk volum" - -msgid "Neither" -msgstr "Ingen" - -msgid "Network init error" -msgstr "Nettverk init feil" - -msgid "New Disc Detected" -msgstr "Ny plate oppdaget" - -msgid "Next" -msgstr "Neste" - -msgid "No" -msgstr "Nei" - -msgid "No .dol or .elf files found." -msgstr "Ingen .dol eller .elf filer funnet." - -msgid "No Cheatfile found" -msgstr "Ingen juksefil funnet" - -msgid "No DOL file found on disc." -msgstr "Ingen DOL fil funnet pÃ¥ plate." - -msgid "No Favorites" -msgstr "Ingen favoritter" - -msgid "No SD-Card inserted!" -msgstr "Intet SD-kort satt i!" - -msgid "No USB Device" -msgstr "Ingen USB enhet" - -msgid "No USB Device found." -msgstr "Ingen USB enhet funnet." - -msgid "No WBFS or FAT/NTFS partition found" -msgstr "" - -msgid "No cheats were selected" -msgstr "Ingen juksefiler valgt" - -msgid "No data could be read." -msgstr "Ingen data kan leses." - -msgid "No file missing!" -msgstr "Ingen filer mangler!" - -msgid "No new updates." -msgstr "Ingen nye oppdateringer." - -msgid "No themes found on the site." -msgstr "Ingen temaer funnet pÃ¥ websiden." - -msgid "None" -msgstr "" - -msgid "Normal" -msgstr "" - -msgid "Normal Covers" -msgstr "Normale cover" - -msgid "Not Found" -msgstr "Ikke funnet" - -msgid "Not a DOL/ELF file." -msgstr "Ikke en DOL/ELF fil." - -msgid "Not a WAD file." -msgstr "" - -msgid "Not a Wii Disc" -msgstr "Ikke en Wii plate" - -msgid "Not enough free memory." -msgstr "Ikke nok ledig minne." - -msgid "Not enough free space!" -msgstr "Ikke nok ledig plass!" - -msgid "Not supported format!" -msgstr "Ikke et støttet format!" - -msgid "Nov" -msgstr "" - -msgid "OFF" -msgstr "AV" - -msgid "OK" -msgstr "" - -msgid "ON" -msgstr "PÃ…" - -msgid "Oct" -msgstr "Okt" - -msgid "Official Site:" -msgstr "Offisiell nettside:" - -msgid "Only Customs" -msgstr "Kun custom" - -msgid "Only Original" -msgstr "Kun original" - -msgid "Only for Install" -msgstr "Kun for installering" - -msgid "Original/Customs" -msgstr "Original/Custom" - -msgid "Parental Control" -msgstr "Foreldrekontroll" - -msgid "Parental Control disabled" -msgstr "" - -msgid "Partition" -msgstr "Partisjon" - -msgid "Password" -msgstr "Passord" - -msgid "Password Changed" -msgstr "Passord endret" - -msgid "Password has been changed" -msgstr "Passord har blitt endret" - -msgid "Paste it into your browser to get your WiiTDB.zip." -msgstr "Lim den inn i nettleseren din for Ã¥ fÃ¥ WiiTDB.zip." - -msgid "Patch Country Strings" -msgstr "Patch land strenger" - -msgid "Pick from a list" -msgstr "Velg fra liste" - -msgid "Play Count" -msgstr "Ganger spilt" - -msgid "Play Next" -msgstr "" - -msgid "Play Once" -msgstr "" - -msgid "Play Previous" -msgstr "" - -msgid "Playing Music:" -msgstr "" - -msgid "Please wait..." -msgstr "Vennligst vent..." - -msgid "Power off the Wii" -msgstr "Skru av Wii" - -msgid "Prev" -msgstr "Forrige" - -msgid "Prompts Buttons" -msgstr "Dialog knapper" - -msgid "Published by" -msgstr "Publisert av" - -msgid "Quick Boot" -msgstr "Hurtig start" - -msgid "Random Directory Music" -msgstr "" - -msgid "Reading WAD data... Ok!" -msgstr "Leser WAD data... OK!" - -msgid "Receiving file from:" -msgstr "Mottar fil fra:" - -msgid "Released" -msgstr "Utgitt" - -msgid "Reload SD" -msgstr "Les SD pÃ¥ nytt" - -msgid "Remove update" -msgstr "" - -msgid "Rename Game on WBFS" -msgstr "Gi nytt navn til spill pÃ¥ WBFS" - -msgid "Reset BG Music" -msgstr "" - -msgid "Reset Playcounter" -msgstr "Nullstill teller" - -msgid "Reset to standard BGM?" -msgstr "" - -msgid "Restarting..." -msgstr "Starter pÃ¥ nytt..." - -msgid "Return" -msgstr "GÃ¥ tilbake" - -msgid "Return to Wii Menu" -msgstr "Tilbake til Wii meny" - -msgid "Right" -msgstr "Høyre" - -msgid "Rumble" -msgstr "Vibrasjon" - -msgid "SChinese" -msgstr "S.Kinesisk" - -msgid "SFX Volume" -msgstr "Effekt volum" - -msgid "Save" -msgstr "Lagre" - -msgid "Save Failed" -msgstr "Lagring feilet" - -msgid "Save Game List to" -msgstr "Lagre spilliste som" - -msgid "Saved" -msgstr "Lagret" - -msgid "Screensaver" -msgstr "Skjermbeskytter" - -msgid "Select" -msgstr "" - -msgid "Select a DOL" -msgstr "Velg en DOL fil" - -msgid "Selected DOL" -msgstr "Valgt DOL fil" - -msgid "Sept" -msgstr "Sep" - -msgid "Set Search-Filter" -msgstr "Angi søkefilter" - -msgid "Settings" -msgstr "Innstillinger" - -msgid "Shutdown System" -msgstr "Skru helt av" - -msgid "Shutdown to Idle" -msgstr "Skru av" - -msgid "Sort alphabetically" -msgstr "Sortér alfabetisk" - -msgid "Sort by rank" -msgstr "Sortér etter rangering" - -msgid "Sort order by most played" -msgstr "Sortér etter ganger spilt" - -msgid "Sound" -msgstr "Lyd" - -msgid "Sound+BGM" -msgstr "" - -msgid "Sound+Quiet" -msgstr "" - -msgid "Spanish" -msgstr "Spansk" - -msgid "Special thanks to:" -msgstr "Spesielt takk til:" - -msgid "Standard" -msgstr "Standard" - -msgid "Success" -msgstr "Suksess" - -msgid "Success:" -msgstr "Suksess:" - -msgid "Successfully Saved" -msgstr "Vellykket lagring" - -msgid "Successfully Updated" -msgstr "Vellykket oppdatering" - -msgid "Successfully Updated thanks to www.techjawa.com" -msgstr "" - -msgid "Successfully deleted:" -msgstr "Vellykket sletting:" - -msgid "Successfully extracted theme." -msgstr "Vellykket utpakking av tema." - -msgid "Successfully installed:" -msgstr "Vellykket installering:" - -msgid "System Default" -msgstr "System Standard" - -msgid "TChinese" -msgstr "T.Kinesisk" - -msgid "TXT Cheatcodes Path" -msgstr "TXTjuksekode sti" - -msgid "TXT Cheatcodes Path changed" -msgstr "TXTjuksekode sti endret" - -msgid "The entered directory does not exist. Would you like to create it?" -msgstr "Valgt mappe finnes ikke. Vil du opprette den?" - -msgid "The wad file was installed. But It could not be deleted from the SD card." -msgstr "WAD filen ble installert. Men ble ikke slettet fra SD kort." - -#, c-format -msgid "The wad installation failed with error %ld" -msgstr "WAD installasjonen feilet med feilkode %ld" - -msgid "Theme Download Path" -msgstr "Tema nedlasting sti" - -msgid "Theme Download Path changed" -msgstr "Tema nedlasting sti endret" - -msgid "Theme Downloader" -msgstr "Tema Nedlaster" - -msgid "Theme Path" -msgstr "Tema sti" - -msgid "Theme Path Changed" -msgstr "Tema sti endret" - -msgid "Theme Title:" -msgstr "Tema tittel:" - -msgid "Time left:" -msgstr "Tid igjen:" - -msgid "Title Launcher" -msgstr "Tittel Laster" - -msgid "Titles from WiiTDB" -msgstr "Titler fra WiiTDB" - -msgid "Tooltips" -msgstr "Verktøystips" - -msgid "Transfer failed." -msgstr "Overføring feilet." - -msgid "USB Device not found" -msgstr "USB enhet ikke funnet" - -msgid "USB Loader GX is protected" -msgstr "USB Loader GX er beskyttet" - -msgid "USB Loader GX will only run with Hermes CIOS rev 4! Please make sure you have revision 4 installed!" -msgstr "" - -#, c-format -msgid "Unable to open the wad that was just downloaded (%s)." -msgstr "Kan ikke Ã¥pne nedlastet WAD fil (%s)." - -msgid "Uninstall" -msgstr "Avinstallér" - -msgid "Uninstall Game" -msgstr "Avinstallér spill" - -msgid "Uninstall Menu" -msgstr "Avinstallér Meny" - -msgid "Uninstalling wad" -msgstr "Avinstallerer WAD" - -msgid "Unlock Parental Control" -msgstr "" - -msgid "Unlock console to use this option." -msgstr "LÃ¥s opp konsollen for Ã¥ bruke denne innstillingen." - -msgid "Unlocked" -msgstr "OpplÃ¥st" - -msgid "Unsupported format, try to extract manually." -msgstr "Format ikke støttet, prøv Ã¥ pakk ut manuelt." - -msgid "Update" -msgstr "Oppdater" - -msgid "Update All" -msgstr "Oppdater alt" - -msgid "Update DOL" -msgstr "Oppdater DOL" - -msgid "Update Files" -msgstr "Oppdater filer" - -msgid "Update Path" -msgstr "Oppdatering sti" - -msgid "Update Path changed." -msgstr "Oppdatering sti endret." - -msgid "Update all Language Files" -msgstr "Oppdater alle sprÃ¥kfiler" - -msgid "Update failed" -msgstr "Mislykket oppdatering" - -msgid "Update to" -msgstr "Oppdater til" - -msgid "Updating" -msgstr "Oppdaterer" - -msgid "Updating Language Files..." -msgstr "Oppdaterer sprÃ¥kfiler..." - -msgid "Updating Language Files:" -msgstr "Oppdaterer sprÃ¥kfiler:" - -msgid "Updating WiiTDB.zip" -msgstr "Oppdaterer WiiTDB.zip" - -msgid "Uploaded ZIP file installed to homebrew directory." -msgstr "Opplastet ZIP fil installert i homebrew mappen." - -msgid "VIDTV Patch" -msgstr "" - -#, c-format -msgid "Version: %s" -msgstr "Versjon: %s" - -msgid "Video Mode" -msgstr "Video modus" - -msgid "WIP Patches Path" -msgstr "" - -msgid "WIP Patches Path changed" -msgstr "" - -msgid "Waiting for USB Device" -msgstr "Venter pÃ¥ USB enhet" - -msgid "Waiting..." -msgstr "Venter..." - -msgid "What do you want to update?" -msgstr "Hva vil du oppdatere?" - -msgid "WiFi Features" -msgstr "WiFi egenskaper" - -msgid "Widescreen Fix" -msgstr "Widescreen fiks" - -msgid "Wii Menu" -msgstr "Wii Meny" - -msgid "Wii Settings" -msgstr "Wii Innstillinger" - -msgid "WiiTDB Files" -msgstr "WiiTDB filer" - -msgid "WiiTDB Path" -msgstr "WiiTDB sti" - -msgid "WiiTDB Path changed." -msgstr "WiiTDB sti endret." - -msgid "Wiilight" -msgstr "Wii DVD lys" - -msgid "Wrong Password" -msgstr "Feil passord" - -msgid "Yes" -msgstr "Ja" - -msgid "You are about to delete " -msgstr "Du er i ferd med Ã¥ slette " - -msgid "You are choosing to display favorites and you do not have any selected." -msgstr "Du prøver Ã¥ vise favoritter nÃ¥r du ikke har noen valgt." - -msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible." -msgstr "" - -msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." -msgstr "" - -msgid "You have attempted to load a bad image" -msgstr "Du har forsøkt Ã¥ vise et korrupt bilde" - -msgid "You need to select or format a partition" -msgstr "" - -#, c-format -msgid "Your URL has been saved in %sWiiTDB_URL.txt." -msgstr "Din URL ble lagret i %sWiiTDB_URL.txt." - -msgid "and translaters for language files updates" -msgstr "og oversettere for sprÃ¥kfiler" - -msgid "available" -msgstr "tilgjengelig" - -msgid "does not exist!" -msgstr "finnes ikke!" - -msgid "does not exist! Loading game without cheats." -msgstr "finnes ikke! Laster spill uten juksekode." - -msgid "does not exist! You Messed something up, Idiot." -msgstr "finnes ikke! Du har gjort noe galt." - -msgid "file left" -msgstr "fil gjenstÃ¥r" - -msgid "files left" -msgstr "filer gjenstÃ¥r" - -msgid "files not found on the server!" -msgstr "filer ikke funnet pÃ¥ serveren!" - -msgid "for FAT/NTFS support" -msgstr "" - -msgid "for Ocarina" -msgstr "" - -msgid "for WiiTDB and hosting covers / disc images" -msgstr "for WiiTDB og hosting av bilder" - -msgid "for diverse patches" -msgstr "for diverse patcher" - -msgid "for his awesome tool LibWiiGui" -msgstr "for hans rÃ¥e verktøy LibWiiGui" - -msgid "for hosting the themes" -msgstr "for hosting av tema" - -msgid "for hosting the update files" -msgstr "for hosting av oppdateringer" - -msgid "for the USB Loader source" -msgstr "for kilden til USB Loader" - -msgid "formatted!" -msgstr "formatert!" - -msgid "free" -msgstr "ledig" - -msgid "not set" -msgstr "ikke satt" - -msgid "of" -msgstr "av" - -msgid "seconds left" -msgstr "sekunder gjenstÃ¥r" +# USB Loader GX language source file. +# norwegian.lang - r813 +# don't delete/change this line (é). +msgid "" +msgstr "" +"Project-Id-Version: USB Loader GX\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-30 23:36+0200\n" +"PO-Revision-Date: 2009-10-01 01:00+0200\n" +"Last-Translator: raschi\n" +"Language-Team: raschi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid " " +msgstr "" + +msgid " Wad Saved as:" +msgstr " WAD lagret som:" + +msgid " could not be downloaded." +msgstr " kan ikke lastes ned." + +msgid " has been Saved. The text has not been verified. Some of the code may not work right with each other. If you experience trouble, open the text in a real text editor for more information." +msgstr " har blitt lagret. Teksten har ikke blitt verifisert. Noe av koden vil kanskje ikke fungere riktig. Hvis du fÃ¥r problemer, Ã¥pne teksten i et ekte redigeringsprogram for mer informasjon." + +msgid " is not on the server." +msgstr " finnes ikke pÃ¥ serveren." + +#, c-format +msgid "%s : %s May not boot correctly if your System Menu is not up to date." +msgstr "%s : %s vil kanskje ikke starte riktig hvis System Menyen ikke er oppdatert." + +msgid "0 (Everyone)" +msgstr "0 (Alle)" + +msgid "1 (Child 7+)" +msgstr "1 (Barn 7+)" + +msgid "1 hour" +msgstr "1 time" + +msgid "10 min" +msgstr "" + +msgid "2 (Teen 12+)" +msgstr "2 (Ungdom 12+)" + +msgid "20 min" +msgstr "" + +msgid "2D Cover Path" +msgstr "2D Cover sti" + +msgid "3 (Mature 16+)" +msgstr "3 (Ungdom 16+)" + +msgid "3 min" +msgstr "" + +msgid "30 min" +msgstr "" + +msgid "3D Cover Path" +msgstr "3D Cover sti" + +msgid "3D Covers" +msgstr "3D cover" + +msgid "4 (Adults Only 18+)" +msgstr "4 (Voksen 18+)" + +msgid "5 min" +msgstr "" + +msgid ">> Deleting tickets..." +msgstr ">> Sletter tickets..." + +msgid ">> Deleting tickets...ERROR! " +msgstr ">> Sletter tickets...FEIL! " + +msgid ">> Deleting tickets...Ok! " +msgstr ">> Sletter tickets...OK! " + +msgid ">> Deleting title ...ERROR! " +msgstr ">> Sletter tittel ...FEIL! " + +msgid ">> Deleting title ...Ok!" +msgstr ">> Sletter tittel ...OK!" + +msgid ">> Deleting title contents..." +msgstr ">> Sletter tittel innhold..." + +msgid ">> Deleting title contents...ERROR! " +msgstr ">> Sletter tittel innhold...FEIL! " + +msgid ">> Deleting title contents...Ok!" +msgstr ">> Sletter tittel innhold...OK!" + +msgid ">> Deleting title..." +msgstr ">> Sletter tittel..." + +msgid ">> Finishing installation..." +msgstr ">> Sluttfører installasjon..." + +msgid ">> Installing content #" +msgstr ">> Installerer innhold #" + +msgid ">> Installing ticket..." +msgstr ">> Installerer ticket..." + +msgid ">> Installing title..." +msgstr ">> Installerer tittel..." + +msgid ">> Reading WAD data..." +msgstr ">> Leser WAD data..." + +msgid ">> Reading WAD data...ERROR! " +msgstr ">> Leser WAD data...FEIL! " + +msgid ">> Reading WAD data...Ok!" +msgstr ">> Leser WAD data...OK!" + +msgid "AUTO" +msgstr "" + +msgid "All partitions" +msgstr "" + +msgid "All the features of USB Loader GX are unlocked." +msgstr "Alle funksjonene til USB Loader GX er opplÃ¥st." + +msgid "Alternate DOL" +msgstr "Alternativ DOL" + +msgid "An Error occured" +msgstr "En feil oppstod" + +msgid "Anti" +msgstr "" + +msgid "App Language" +msgstr "Program sprÃ¥k" + +msgid "Apr" +msgstr "" + +msgid "Are you sure you want to enable Parent Control?" +msgstr "" + +msgid "Are you sure?" +msgstr "Er du sikker?" + +msgid "Aug" +msgstr "" + +msgid "Author:" +msgstr "Forfatter:" + +msgid "AutoInit Network" +msgstr "Autostart nettverk" + +msgid "AutoPatch" +msgstr "" + +msgid "BCA Codes Path" +msgstr "" + +msgid "BCA Codes Path changed" +msgstr "" + +msgid "BETA revisions" +msgstr "" + +msgid "Back" +msgstr "Tilbake" + +msgid "Back to HBC or Wii Menu" +msgstr "Tilbake til HBC eller Wii meny" + +msgid "Back to Loader" +msgstr "HBC/Loader" + +msgid "Back to Wii Menu" +msgstr "Wii meny" + +msgid "Backgroundmusic" +msgstr "Bakgrunnsmusikk" + +msgid "Big thanks to:" +msgstr "Stor takk til:" + +msgid "Block IOS Reload" +msgstr "Blokkér IOS Reload" + +msgid "Boot/Standard" +msgstr "Boot/Standard" + +msgid "Boot?" +msgstr "Start?" + +msgid "Both" +msgstr "Begge" + +msgid "Can't be formatted" +msgstr "Kan ikke formateres" + +msgid "Can't create directory" +msgstr "Kan ikke opprette mappe" + +msgid "Can't create file" +msgstr "Kan ikke opprette fil" + +msgid "Can't delete:" +msgstr "Kan ikke slette:" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "Change Play Path" +msgstr "" + +msgid "Channels" +msgstr "Kanaler" + +msgid "Cheatfile is blank" +msgstr "Juksefil er blank" + +msgid "Checking existing artwork" +msgstr "Sjekker eksisterende bilder" + +msgid "Checking for Updates" +msgstr "Søker etter oppdateringer" + +msgid "Click to Download Covers" +msgstr "Klikk for Ã¥ laste ned cover" + +msgid "Click to change game ID" +msgstr "Klikk for Ã¥ endre spill ID" + +msgid "Clock" +msgstr "Klokke" + +msgid "Close" +msgstr "Lukk" + +msgid "Code Download" +msgstr "Kode nedlasting" + +#, c-format +msgid "Coded by: %s" +msgstr "Kodet av: %s" + +msgid "Coding:" +msgstr "Koding:" + +msgid "Confirm" +msgstr "Bekreft" + +msgid "Connection lost..." +msgstr "" + +msgid "Console" +msgstr "Konsoll" + +msgid "Console Default" +msgstr "Konsoll Standard" + +msgid "Console Locked" +msgstr "Konsoll lÃ¥st" + +msgid "Console should be unlocked to modify it." +msgstr "Konsoll mÃ¥ være opplÃ¥st for Ã¥ modifisere." + +msgid "Continue to install game?" +msgstr "Fortsett Ã¥ installere spill?" + +msgid "Controllevel" +msgstr "KontrollnivÃ¥" + +msgid "Correct Password" +msgstr "Riktig passord" + +msgid "Could not create GCT file" +msgstr "Kan ikke opprette GCT fil" + +msgid "Could not find a WBFS partition." +msgstr "Kan ikke finne en WBFS partisjon." + +msgid "Could not initialize DIP module!" +msgstr "Kan ikke initialisere DIP modul!" + +msgid "Could not initialize network!" +msgstr "Kan ikke initialisere nettverk!" + +msgid "Could not open Disc" +msgstr "Kan ikke Ã¥pne plate" + +msgid "Could not open WBFS partition" +msgstr "Kan ikke Ã¥pne WBFS partisjon" + +msgid "Could not read the disc." +msgstr "Kan ikke lese plate." + +msgid "Could not save." +msgstr "Kan ikke lagre." + +msgid "Could not set USB." +msgstr "Kan ikke velge USB." + +msgid "Cover Download" +msgstr "Cover nedlasting" + +msgid "Cover Path Changed" +msgstr "Cover sti endret" + +msgid "Create" +msgstr "Opprett" + +msgid "Credits" +msgstr "Medvirkende" + +msgid "Custom Paths" +msgstr "Endre stier" + +msgid "Customs/Original" +msgstr "Custom/Original" + +msgid "DOL Path" +msgstr "DOL sti" + +msgid "DOL path changed" +msgstr "DOL sti endret" + +msgid "Dec" +msgstr "Des" + +msgid "Default" +msgstr "Standard" + +msgid "Default Gamesettings" +msgstr "Standard innstillinger" + +msgid "Default Settings" +msgstr "Standard innstillinger" + +msgid "Delete" +msgstr "Slett" + +msgid "Delete ?" +msgstr "Slett ?" + +msgid "Delete Cheat GCT" +msgstr "Slett juksefil GCT" + +msgid "Delete Cheat TXT" +msgstr "Slett juksefil TXT" + +msgid "Delete Cover Artwork" +msgstr "Slett cover" + +msgid "Delete Disc Artwork" +msgstr "Slett platebilde" + +msgid "Design:" +msgstr "" + +msgid "Developed by" +msgstr "Utviklet av" + +msgid "Directory does not exist!" +msgstr "Mappestruktur finnes ikke!" + +msgid "Disc Artwork Download" +msgstr "Platebilde nedlasting" + +msgid "Disc Artwork Path" +msgstr "Platebilde sti" + +msgid "Disc Default" +msgstr "Spill Standard" + +msgid "Disc Images" +msgstr "Plate bilder" + +msgid "Disc Path Changed" +msgstr "Plate sti endret" + +msgid "DiskFlip" +msgstr "Snu plate" + +msgid "Display" +msgstr "Vis" + +msgid "Display as a carousel" +msgstr "Vis som karusell" + +msgid "Display as a grid" +msgstr "Vis som rutemønster" + +msgid "Display as a list" +msgstr "Vis som liste" + +msgid "Display favorites" +msgstr "Vis favoritter" + +msgid "Do you really want to delete:" +msgstr "Er du sikker pÃ¥ at du vil slette:" + +msgid "Do you want to apply it now?" +msgstr "" + +msgid "Do you want to change language?" +msgstr "Vil du endre sprÃ¥k?" + +msgid "Do you want to download this theme?" +msgstr "Vil du laste ned dette temaet?" + +msgid "Do you want to format:" +msgstr "Vil du formatere:" + +msgid "Do you want to retry for 30 secs?" +msgstr "Vil du fortsette Ã¥ prøve i 30 sekunder?" + +msgid "Do you want to use the alternate DOL that is known to be correct?" +msgstr "Vil du bruke alt DOL filen som er kjent for Ã¥ være riktig?" + +msgid "Do you wish to update/download all language files?" +msgstr "Vil du oppdatere/laste ned alle sprÃ¥kfiler?" + +msgid "Done!" +msgstr "Ferdig!" + +msgid "Download" +msgstr "Last ned" + +msgid "Download Boxart image?" +msgstr "Last ned cover bilde?" + +msgid "Download Discart image?" +msgstr "Last ned plate bilde?" + +msgid "Download Now" +msgstr "Last ned nÃ¥" + +msgid "Download failed." +msgstr "Nedlasting feilet." + +msgid "Download finished" +msgstr "Nedlasting ferdig" + +msgid "Download request failed." +msgstr "Nedlast spørring feilet." + +msgid "Downloading" +msgstr "Laster ned" + +msgid "Downloading Page List:" +msgstr "Laster ned side liste:" + +msgid "Downloading file" +msgstr "Laster ned fil" + +msgid "Downloading image:" +msgstr "Laster ned bilde:" + +msgid "Dutch" +msgstr "Nederlandsk" + +msgid "ERROR" +msgstr "FEIL" + +msgid "ERROR:" +msgstr "FEIL:" + +msgid "ERROR: Can't set up theme." +msgstr "" + +msgid "Enable Parental Control" +msgstr "" + +msgid "English" +msgstr "Engelsk" + +msgid "Error" +msgstr "Feil" + +msgid "Error !" +msgstr "Feil !" + +msgid "Error 002 fix" +msgstr "Error 002 fiks" + +msgid "Error reading Disc" +msgstr "Feil ved lesing av plate" + +msgid "Error while transfering data." +msgstr "Feil ved overføring av data." + +msgid "Error..." +msgstr "Feil..." + +msgid "Error:" +msgstr "Feil:" + +msgid "Extracting files..." +msgstr "Pakker ut filer..." + +msgid "FAT: Use directories" +msgstr "" + +msgid "Failed formating" +msgstr "Feil ved formatering" + +msgid "Failed to extract." +msgstr "Utpakking feilet." + +msgid "Failed to open partition" +msgstr "Feil ved Ã¥pning av partisjon" + +msgid "Feb" +msgstr "" + +msgid "File not found." +msgstr "Fil ikke funnet." + +msgid "Finishing installation... Ok!" +msgstr "Sluttfører installasjon... OK!" + +msgid "Flip-X" +msgstr "" + +msgid "Force" +msgstr "Tving" + +msgid "Format" +msgstr "Formatér" + +msgid "Formatting, please wait..." +msgstr "Formaterer, vennligst vent..." + +msgid "Free Space" +msgstr "Ledig plass" + +msgid "French" +msgstr "Fransk" + +msgid "Full Shutdown" +msgstr "Skru helt av" + +msgid "GAMEID_Gamename" +msgstr "" + +msgid "GCT Cheatcodes Path" +msgstr "GCT Juksekode sti" + +msgid "GCT Cheatcodes Path changed" +msgstr "GCT Juksekode sti endret" + +msgid "GCT File created" +msgstr "GCT fil opprettet" + +msgid "GUI Settings" +msgstr "GUI innstillinger" + +msgid "GXtheme.cfg not found in any subfolder." +msgstr "" + +msgid "Game ID" +msgstr "Spill ID" + +msgid "Game Language" +msgstr "SprÃ¥k" + +msgid "Game Load" +msgstr "Lasting av spill" + +msgid "Game Region" +msgstr "Region" + +msgid "Game Size" +msgstr "Spill størrelse" + +msgid "Game Sound Mode" +msgstr "" + +msgid "Game Sound Volume" +msgstr "" + +msgid "Game is already installed:" +msgstr "Spillet er allerede installert:" + +msgid "Game partition" +msgstr "" + +msgid "Gamename [GAMEID]" +msgstr "" + +msgid "Games" +msgstr "Spill" + +msgid "German" +msgstr "Tysk" + +msgid "HOME Menu" +msgstr "HOME Meny" + +msgid "Hermes CIOS" +msgstr "" + +msgid "Homebrew Apps Path" +msgstr "Homebrew Apps sti" + +msgid "Homebrew Appspath changed" +msgstr "Homebrew Apps sti endret" + +msgid "Homebrew Launcher" +msgstr "Homebrew Laster" + +msgid "Hour" +msgstr "Timer" + +msgid "How do you want to update?" +msgstr "Hvordan vil du oppdatere?" + +msgid "How to Shutdown?" +msgstr "Hvordan skru av?" + +msgid "If you don't have WiFi, press 1 to get an URL to get your WiiTDB.zip" +msgstr "Hvis du ikke har WiFi, klikk 1 for Ã¥ fÃ¥ en URL til din WiiTDB.zip" + +#, c-format +msgid "Incoming file %0.2fKB" +msgstr "Laster ned fil %0.2fKB" + +#, c-format +msgid "Incoming file %0.2fMB" +msgstr "Laster ned fil %0.2fMB" + +msgid "Initializing Network" +msgstr "Initialiserer nettverk" + +msgid "Insert Disk" +msgstr "Sett inn plate" + +msgid "Insert a Wii Disc!" +msgstr "Sett inn en Wii plate!" + +msgid "Insert an SD-Card to download images." +msgstr "Sett inn et SD-kort for Ã¥ laste ned bilder." + +msgid "Insert an SD-Card to save." +msgstr "Sett inn et SD-kort for Ã¥ lagre." + +msgid "Insert an SD-Card to use this option." +msgstr "Sett inn et SD-kort for Ã¥ bruke innstillingen." + +msgid "Install" +msgstr "Installér" + +msgid "Install 1:1 Copy" +msgstr "" + +msgid "Install Error!" +msgstr "Installasjonsfeil!" + +msgid "Install a game" +msgstr "Installér et spill" + +msgid "Install not possible" +msgstr "" + +msgid "Install partitions" +msgstr "" + +msgid "Installing content... Ok!" +msgstr "Installerer innhold... OK!" + +msgid "Installing game:" +msgstr "Installerer spill:" + +msgid "Installing ticket... Ok!" +msgstr "Installerer ticket... OK!" + +msgid "Installing title... Ok!" +msgstr "Installerer tittel... OK!" + +msgid "Installing wad" +msgstr "Installerer WAD" + +msgid "Invalid PIN code" +msgstr "" + +msgid "It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team." +msgstr "Det ser ut til at du har informasjon som kan være nyttig for oss. Vennligst videresend denne informasjonen til utviklerteamet." + +msgid "Italian" +msgstr "Italiensk" + +msgid "Jan" +msgstr "" + +msgid "Japanese" +msgstr "Japansk" + +msgid "July" +msgstr "Jul" + +msgid "June" +msgstr "Jun" + +msgid "Keep" +msgstr "Behold" + +msgid "Keyboard" +msgstr "Tastatur" + +msgid "Korean" +msgstr "Koreansk" + +msgid "Language File" +msgstr "SprÃ¥k Fil" + +msgid "Language change:" +msgstr "Endre sprÃ¥k" + +msgid "Languagepath changed." +msgstr "SprÃ¥ksti endret." + +msgid "Left" +msgstr "Venstre" + +msgid "Like SysMenu" +msgstr "Lik Systemmeny" + +msgid "Load" +msgstr "Start" + +msgid "Load From SD/USB" +msgstr "Start fra SD/USB" + +#, c-format +msgid "Load file from: %s ?" +msgstr "Start fil fra: %s ?" + +msgid "Load this DOL as alternate DOL?" +msgstr "Last denne DOL som alternativ DOL?" + +msgid "Loading standard language." +msgstr "Laster standard sprÃ¥k." + +msgid "Loading standard music." +msgstr "Laster standard musikk." + +msgid "Lock Console" +msgstr "LÃ¥s konsoll" + +msgid "Locked" +msgstr "LÃ¥st" + +msgid "Loop Directory" +msgstr "" + +msgid "Loop Music" +msgstr "" + +msgid "Loop Sound" +msgstr "" + +msgid "Mar" +msgstr "" + +msgid "Mark new games" +msgstr "" + +msgid "May" +msgstr "Mai" + +msgid "Missing files" +msgstr "Manglende filer" + +msgid "Most likely it has dimensions that are not evenly divisible by 4." +msgstr "Sannsynligvis har bildet dimensjoner som ikke kan deles med 4." + +msgid "Mount DVD drive" +msgstr "Last DVD stasjon" + +msgid "Music Loop Mode" +msgstr "" + +msgid "Music Volume" +msgstr "Musikk volum" + +msgid "Neither" +msgstr "Ingen" + +msgid "Network init error" +msgstr "Nettverk init feil" + +msgid "New Disc Detected" +msgstr "Ny plate oppdaget" + +msgid "Next" +msgstr "Neste" + +msgid "No" +msgstr "Nei" + +msgid "No .dol or .elf files found." +msgstr "Ingen .dol eller .elf filer funnet." + +msgid "No Cheatfile found" +msgstr "Ingen juksefil funnet" + +msgid "No DOL file found on disc." +msgstr "Ingen DOL fil funnet pÃ¥ plate." + +msgid "No Favorites" +msgstr "Ingen favoritter" + +msgid "No SD-Card inserted!" +msgstr "Intet SD-kort satt i!" + +msgid "No USB Device" +msgstr "Ingen USB enhet" + +msgid "No USB Device found." +msgstr "Ingen USB enhet funnet." + +msgid "No WBFS or FAT/NTFS partition found" +msgstr "" + +msgid "No cheats were selected" +msgstr "Ingen juksefiler valgt" + +msgid "No data could be read." +msgstr "Ingen data kan leses." + +msgid "No file missing!" +msgstr "Ingen filer mangler!" + +msgid "No new updates." +msgstr "Ingen nye oppdateringer." + +msgid "No themes found on the site." +msgstr "Ingen temaer funnet pÃ¥ websiden." + +msgid "None" +msgstr "" + +msgid "Normal" +msgstr "" + +msgid "Normal Covers" +msgstr "Normale cover" + +msgid "Not Found" +msgstr "Ikke funnet" + +msgid "Not a DOL/ELF file." +msgstr "Ikke en DOL/ELF fil." + +msgid "Not a WAD file." +msgstr "" + +msgid "Not a Wii Disc" +msgstr "Ikke en Wii plate" + +msgid "Not enough free memory." +msgstr "Ikke nok ledig minne." + +msgid "Not enough free space!" +msgstr "Ikke nok ledig plass!" + +msgid "Not supported format!" +msgstr "Ikke et støttet format!" + +msgid "Nov" +msgstr "" + +msgid "OFF" +msgstr "AV" + +msgid "OK" +msgstr "" + +msgid "ON" +msgstr "PÃ…" + +msgid "Oct" +msgstr "Okt" + +msgid "Official Site:" +msgstr "Offisiell nettside:" + +msgid "Only Customs" +msgstr "Kun custom" + +msgid "Only Original" +msgstr "Kun original" + +msgid "Only for Install" +msgstr "Kun for installering" + +msgid "Original/Customs" +msgstr "Original/Custom" + +msgid "Parental Control" +msgstr "Foreldrekontroll" + +msgid "Parental Control disabled" +msgstr "" + +msgid "Partition" +msgstr "Partisjon" + +msgid "Password" +msgstr "Passord" + +msgid "Password Changed" +msgstr "Passord endret" + +msgid "Password has been changed" +msgstr "Passord har blitt endret" + +msgid "Paste it into your browser to get your WiiTDB.zip." +msgstr "Lim den inn i nettleseren din for Ã¥ fÃ¥ WiiTDB.zip." + +msgid "Patch Country Strings" +msgstr "Patch land strenger" + +msgid "Pick from a list" +msgstr "Velg fra liste" + +msgid "Play Count" +msgstr "Ganger spilt" + +msgid "Play Next" +msgstr "" + +msgid "Play Once" +msgstr "" + +msgid "Play Previous" +msgstr "" + +msgid "Playing Music:" +msgstr "" + +msgid "Please wait..." +msgstr "Vennligst vent..." + +msgid "Power off the Wii" +msgstr "Skru av Wii" + +msgid "Prev" +msgstr "Forrige" + +msgid "Prompts Buttons" +msgstr "Dialog knapper" + +msgid "Published by" +msgstr "Publisert av" + +msgid "Quick Boot" +msgstr "Hurtig start" + +msgid "Random Directory Music" +msgstr "" + +msgid "Reading WAD data... Ok!" +msgstr "Leser WAD data... OK!" + +msgid "Receiving file from:" +msgstr "Mottar fil fra:" + +msgid "Released" +msgstr "Utgitt" + +msgid "Reload SD" +msgstr "Les SD pÃ¥ nytt" + +msgid "Remove update" +msgstr "" + +msgid "Rename Game on WBFS" +msgstr "Gi nytt navn til spill pÃ¥ WBFS" + +msgid "Reset BG Music" +msgstr "" + +msgid "Reset Playcounter" +msgstr "Nullstill teller" + +msgid "Reset to standard BGM?" +msgstr "" + +msgid "Restarting..." +msgstr "Starter pÃ¥ nytt..." + +msgid "Return" +msgstr "GÃ¥ tilbake" + +msgid "Return to Wii Menu" +msgstr "Tilbake til Wii meny" + +msgid "Right" +msgstr "Høyre" + +msgid "Rumble" +msgstr "Vibrasjon" + +msgid "SChinese" +msgstr "S.Kinesisk" + +msgid "SFX Volume" +msgstr "Effekt volum" + +msgid "Save" +msgstr "Lagre" + +msgid "Save Failed" +msgstr "Lagring feilet" + +msgid "Save Game List to" +msgstr "Lagre spilliste som" + +msgid "Saved" +msgstr "Lagret" + +msgid "Screensaver" +msgstr "Skjermbeskytter" + +msgid "Select" +msgstr "" + +msgid "Select a DOL" +msgstr "Velg en DOL fil" + +msgid "Selected DOL" +msgstr "Valgt DOL fil" + +msgid "Sept" +msgstr "Sep" + +msgid "Set Search-Filter" +msgstr "Angi søkefilter" + +msgid "Settings" +msgstr "Innstillinger" + +msgid "Shutdown System" +msgstr "Skru helt av" + +msgid "Shutdown to Idle" +msgstr "Skru av" + +msgid "Sort alphabetically" +msgstr "Sortér alfabetisk" + +msgid "Sort by rank" +msgstr "Sortér etter rangering" + +msgid "Sort order by most played" +msgstr "Sortér etter ganger spilt" + +msgid "Sound" +msgstr "Lyd" + +msgid "Sound+BGM" +msgstr "" + +msgid "Sound+Quiet" +msgstr "" + +msgid "Spanish" +msgstr "Spansk" + +msgid "Special thanks to:" +msgstr "Spesielt takk til:" + +msgid "Standard" +msgstr "Standard" + +msgid "Success" +msgstr "Suksess" + +msgid "Success:" +msgstr "Suksess:" + +msgid "Successfully Saved" +msgstr "Vellykket lagring" + +msgid "Successfully Updated" +msgstr "Vellykket oppdatering" + +msgid "Successfully Updated thanks to www.techjawa.com" +msgstr "" + +msgid "Successfully deleted:" +msgstr "Vellykket sletting:" + +msgid "Successfully extracted theme." +msgstr "Vellykket utpakking av tema." + +msgid "Successfully installed:" +msgstr "Vellykket installering:" + +msgid "System Default" +msgstr "System Standard" + +msgid "TChinese" +msgstr "T.Kinesisk" + +msgid "TXT Cheatcodes Path" +msgstr "TXTjuksekode sti" + +msgid "TXT Cheatcodes Path changed" +msgstr "TXTjuksekode sti endret" + +msgid "The entered directory does not exist. Would you like to create it?" +msgstr "Valgt mappe finnes ikke. Vil du opprette den?" + +msgid "The wad file was installed. But It could not be deleted from the SD card." +msgstr "WAD filen ble installert. Men ble ikke slettet fra SD kort." + +#, c-format +msgid "The wad installation failed with error %ld" +msgstr "WAD installasjonen feilet med feilkode %ld" + +msgid "Theme Download Path" +msgstr "Tema nedlasting sti" + +msgid "Theme Download Path changed" +msgstr "Tema nedlasting sti endret" + +msgid "Theme Downloader" +msgstr "Tema Nedlaster" + +msgid "Theme Path" +msgstr "Tema sti" + +msgid "Theme Path Changed" +msgstr "Tema sti endret" + +msgid "Theme Title:" +msgstr "Tema tittel:" + +msgid "Time left:" +msgstr "Tid igjen:" + +msgid "Title Launcher" +msgstr "Tittel Laster" + +msgid "Titles from WiiTDB" +msgstr "Titler fra WiiTDB" + +msgid "Tooltips" +msgstr "Verktøystips" + +msgid "Transfer failed." +msgstr "Overføring feilet." + +msgid "USB Device not found" +msgstr "USB enhet ikke funnet" + +msgid "USB Loader GX is protected" +msgstr "USB Loader GX er beskyttet" + +msgid "USB Loader GX will only run with Hermes CIOS rev 4! Please make sure you have revision 4 installed!" +msgstr "" + +#, c-format +msgid "Unable to open the wad that was just downloaded (%s)." +msgstr "Kan ikke Ã¥pne nedlastet WAD fil (%s)." + +msgid "Uninstall" +msgstr "Avinstallér" + +msgid "Uninstall Game" +msgstr "Avinstallér spill" + +msgid "Uninstall Menu" +msgstr "Avinstallér Meny" + +msgid "Uninstalling wad" +msgstr "Avinstallerer WAD" + +msgid "Unlock Parental Control" +msgstr "" + +msgid "Unlock console to use this option." +msgstr "LÃ¥s opp konsollen for Ã¥ bruke denne innstillingen." + +msgid "Unlocked" +msgstr "OpplÃ¥st" + +msgid "Unsupported format, try to extract manually." +msgstr "Format ikke støttet, prøv Ã¥ pakk ut manuelt." + +msgid "Update" +msgstr "Oppdater" + +msgid "Update All" +msgstr "Oppdater alt" + +msgid "Update DOL" +msgstr "Oppdater DOL" + +msgid "Update Files" +msgstr "Oppdater filer" + +msgid "Update Path" +msgstr "Oppdatering sti" + +msgid "Update Path changed." +msgstr "Oppdatering sti endret." + +msgid "Update all Language Files" +msgstr "Oppdater alle sprÃ¥kfiler" + +msgid "Update failed" +msgstr "Mislykket oppdatering" + +msgid "Update to" +msgstr "Oppdater til" + +msgid "Updating" +msgstr "Oppdaterer" + +msgid "Updating Language Files..." +msgstr "Oppdaterer sprÃ¥kfiler..." + +msgid "Updating Language Files:" +msgstr "Oppdaterer sprÃ¥kfiler:" + +msgid "Updating WiiTDB.zip" +msgstr "Oppdaterer WiiTDB.zip" + +msgid "Uploaded ZIP file installed to homebrew directory." +msgstr "Opplastet ZIP fil installert i homebrew mappen." + +msgid "VIDTV Patch" +msgstr "" + +#, c-format +msgid "Version: %s" +msgstr "Versjon: %s" + +msgid "Video Mode" +msgstr "Video modus" + +msgid "WIP Patches Path" +msgstr "" + +msgid "WIP Patches Path changed" +msgstr "" + +msgid "Waiting for USB Device" +msgstr "Venter pÃ¥ USB enhet" + +msgid "Waiting..." +msgstr "Venter..." + +msgid "What do you want to update?" +msgstr "Hva vil du oppdatere?" + +msgid "WiFi Features" +msgstr "WiFi egenskaper" + +msgid "Widescreen Fix" +msgstr "Widescreen fiks" + +msgid "Wii Menu" +msgstr "Wii Meny" + +msgid "Wii Settings" +msgstr "Wii Innstillinger" + +msgid "WiiTDB Files" +msgstr "WiiTDB filer" + +msgid "WiiTDB Path" +msgstr "WiiTDB sti" + +msgid "WiiTDB Path changed." +msgstr "WiiTDB sti endret." + +msgid "Wiilight" +msgstr "Wii DVD lys" + +msgid "Wrong Password" +msgstr "Feil passord" + +msgid "Yes" +msgstr "Ja" + +msgid "You are about to delete " +msgstr "Du er i ferd med Ã¥ slette " + +msgid "You are choosing to display favorites and you do not have any selected." +msgstr "Du prøver Ã¥ vise favoritter nÃ¥r du ikke har noen valgt." + +msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible." +msgstr "" + +msgid "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." +msgstr "" + +msgid "You have attempted to load a bad image" +msgstr "Du har forsøkt Ã¥ vise et korrupt bilde" + +msgid "You need to select or format a partition" +msgstr "" + +#, c-format +msgid "Your URL has been saved in %sWiiTDB_URL.txt." +msgstr "Din URL ble lagret i %sWiiTDB_URL.txt." + +msgid "and translaters for language files updates" +msgstr "og oversettere for sprÃ¥kfiler" + +msgid "available" +msgstr "tilgjengelig" + +msgid "does not exist!" +msgstr "finnes ikke!" + +msgid "does not exist! Loading game without cheats." +msgstr "finnes ikke! Laster spill uten juksekode." + +msgid "does not exist! You Messed something up, Idiot." +msgstr "finnes ikke! Du har gjort noe galt." + +msgid "file left" +msgstr "fil gjenstÃ¥r" + +msgid "files left" +msgstr "filer gjenstÃ¥r" + +msgid "files not found on the server!" +msgstr "filer ikke funnet pÃ¥ serveren!" + +msgid "for FAT/NTFS support" +msgstr "" + +msgid "for Ocarina" +msgstr "" + +msgid "for WiiTDB and hosting covers / disc images" +msgstr "for WiiTDB og hosting av bilder" + +msgid "for diverse patches" +msgstr "for diverse patcher" + +msgid "for his awesome tool LibWiiGui" +msgstr "for hans rÃ¥e verktøy LibWiiGui" + +msgid "for hosting the themes" +msgstr "for hosting av tema" + +msgid "for hosting the update files" +msgstr "for hosting av oppdateringer" + +msgid "for the USB Loader source" +msgstr "for kilden til USB Loader" + +msgid "formatted!" +msgstr "formatert!" + +msgid "free" +msgstr "ledig" + +msgid "not set" +msgstr "ikke satt" + +msgid "of" +msgstr "av" + +msgid "seconds left" +msgstr "sekunder gjenstÃ¥r" diff --git a/Make.config.default b/Make.config.default index 1a10dbf2..63e7993a 100644 --- a/Make.config.default +++ b/Make.config.default @@ -1,12 +1,12 @@ -# -# to use this file rename Make.config.default to Make.config -# or create a new Make.config -# -# you can here add defines -# -# in example i have included a switch to diseble -# the gecko-debug stuff. so also in source gecko.c+gecko.h -# -# NOTE when add, remove or change a define here then a "make clean" is needed -# -CFLAGS += -DNO_DEBUG DDEBUG_WBFS +# +# to use this file rename Make.config.default to Make.config +# or create a new Make.config +# +# you can here add defines +# +# in example i have included a switch to diseble +# the gecko-debug stuff. so also in source gecko.c+gecko.h +# +# NOTE when add, remove or change a define here then a "make clean" is needed +# +CFLAGS += -DNO_DEBUG DDEBUG_WBFS diff --git a/Makefile b/Makefile index 26947e51..f85e4935 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,8 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lzip -lext2fs +LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec \ + -lmad -lmxml -ljpeg -lzip -lcustomext2fs #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib @@ -99,7 +100,7 @@ PCMFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.pcm))) WAVFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.wav))) DOLFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.dol))) MP3FILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.mp3))) - + #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C #--------------------------------------------------------------------------------- @@ -127,7 +128,7 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -L$(CURDIR)/source/libs/libext2fs/ \ -L$(LIBOGC_LIB) export OUTPUT := $(CURDIR)/$(TARGET) @@ -167,15 +168,15 @@ run: $(MAKE) @echo Done building ... @echo Now Run That Shit ... - + wiiload $(OUTPUT).dol #--------------------------------------------------------------------------------- reload: wiiload -r $(OUTPUT).dol -#--------------------------------------------------------------------------------- -release: +#--------------------------------------------------------------------------------- +release: $(MAKE) cp boot.dol ./hbc/boot.dol @@ -183,7 +184,7 @@ release: #--------------------------------------------------------------------------------- else -DEPENDS := $(OFILES:.o=.d) +DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- # main targets @@ -211,15 +212,15 @@ language: $(wildcard $(PROJECTDIR)/Languages/*.lang) %.png.o : %.png @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.ogg.o : %.ogg @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.pcm.o : %.pcm @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.wav.o : %.wav @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) @@ -227,7 +228,7 @@ language: $(wildcard $(PROJECTDIR)/Languages/*.lang) %.mp3.o : %.mp3 @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) - + %.certs.o : %.certs @echo $(notdir $<) @bin2s -a 32 $< | $(AS) -o $(@) diff --git a/data/app_booter.dol b/data/app_booter.dol index 2f1df769..a2a2e52d 100644 Binary files a/data/app_booter.dol and b/data/app_booter.dol differ diff --git a/gui.pnproj b/gui.pnproj index 02a4005a..7a64453e 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/ZipFile.h b/source/ZipFile.h index 237c1290..7e714625 100644 --- a/source/ZipFile.h +++ b/source/ZipFile.h @@ -1,58 +1,58 @@ -/*************************************************************************** - * Copyright (C) 2009 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * ZipFile.cpp - * - * for Wii-FileXplorer 2009 - ***************************************************************************/ -#ifndef _ZIPFILE_H_ -#define _ZIPFILE_H_ - -#include - -typedef struct -{ - u64 offset; // ZipFile offset - u64 length; // uncompressed file length in 64 bytes for sizes higher than 4GB - bool isdir; // 0 - file, 1 - directory - char filename[256]; // full filename -} FileStructure; - -class ZipFile -{ - public: - //!Constructor - ZipFile(const char *filepath); - //!Destructor - ~ZipFile(); - //!Extract all files from a zip file to a directory - //!\param dest Destination path to where to extract - bool ExtractAll(const char *dest); - protected: - bool LoadList(); - unzFile File; - unz_file_info cur_file_info; - FileStructure *FileList; -}; - -#endif +/*************************************************************************** + * Copyright (C) 2009 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * ZipFile.cpp + * + * for Wii-FileXplorer 2009 + ***************************************************************************/ +#ifndef _ZIPFILE_H_ +#define _ZIPFILE_H_ + +#include + +typedef struct +{ + u64 offset; // ZipFile offset + u64 length; // uncompressed file length in 64 bytes for sizes higher than 4GB + bool isdir; // 0 - file, 1 - directory + char filename[256]; // full filename +} FileStructure; + +class ZipFile +{ + public: + //!Constructor + ZipFile(const char *filepath); + //!Destructor + ~ZipFile(); + //!Extract all files from a zip file to a directory + //!\param dest Destination path to where to extract + bool ExtractAll(const char *dest); + protected: + bool LoadList(); + unzFile File; + unz_file_info cur_file_info; + FileStructure *FileList; +}; + +#endif diff --git a/source/banner/MD5.h b/source/banner/MD5.h index 1faa9fa0..07902c2b 100644 --- a/source/banner/MD5.h +++ b/source/banner/MD5.h @@ -1,241 +1,241 @@ -#ifndef MD5_H -#define MD5_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* ========================================================================== ** - * - * MD5.h - * - * Copyright: - * Copyright (C) 2003-2005 by Christopher R. Hertel - * - * Email: crh@ubiqx.mn.org - * - * $Id: MD5.h,v 0.6 2005/06/08 18:35:59 crh Exp $ - * - * Modifications and additions by dimok - * - * -------------------------------------------------------------------------- ** - * - * Description: - * Implements the MD5 hash algorithm, as described in RFC 1321. - * - * -------------------------------------------------------------------------- ** - * - * License: - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * -------------------------------------------------------------------------- ** - * - * Notes: - * - * None of this will make any sense unless you're studying RFC 1321 as you - * read the code. - * - * MD5 is described in RFC 1321. - * The MD*4* algorithm is described in RFC 1320 (that's 1321 - 1). - * MD5 is very similar to MD4, but not quite similar enough to justify - * putting the two into a single module. Besides, I wanted to add a few - * extra functions to this one to expand its usability. - * - * There are three primary motivations for this particular implementation. - * 1) Programmer's pride. I wanted to be able to say I'd done it, and I - * wanted to learn from the experience. - * 2) Portability. I wanted an implementation that I knew to be portable - * to a reasonable number of platforms. In particular, the algorithm is - * designed with little-endian platforms in mind, but I wanted an - * endian-agnostic implementation. - * 3) Compactness. While not an overriding goal, I thought it worth-while - * to see if I could reduce the overall size of the result. This is in - * keeping with my hopes that this library will be suitable for use in - * some embedded environments. - * Beyond that, cleanliness and clarity are always worth pursuing. - * - * As mentioned above, the code really only makes sense if you are familiar - * with the MD5 algorithm or are using RFC 1321 as a guide. This code is - * quirky, however, so you'll want to be reading carefully. - * - * Yeah...most of the comments are cut-and-paste from my MD4 implementation. - * - * -------------------------------------------------------------------------- ** - * - * References: - * IETF RFC 1321: The MD5 Message-Digest Algorithm - * Ron Rivest. IETF, April, 1992 - * - * ========================================================================== ** - */ - /* -------------------------------------------------------------------------- ** - * Typedefs: - */ - - typedef struct - { - unsigned int len; - unsigned int ABCD[4]; - int b_used; - unsigned char block[64]; - } auth_md5Ctx; - - /* -------------------------------------------------------------------------- ** - * Functions: - */ - - auth_md5Ctx *auth_md5InitCtx(auth_md5Ctx *ctx); - /* ------------------------------------------------------------------------ ** - * Initialize an MD5 context. - * - * Input: ctx - A pointer to the MD5 context structure to be initialized. - * Contexts are typically created thusly: - * ctx = (auth_md5Ctx *)malloc( sizeof(auth_md5Ctx) ); - * - * Output: A pointer to the initialized context (same as ). - * - * Notes: The purpose of the context is to make it possible to generate - * an MD5 Message Digest in stages, rather than having to pass a - * single large block to a single MD5 function. The context - * structure keeps track of various bits of state information. - * - * Once the context is initialized, the blocks of message data - * are passed to the function. Once the - * final bit of data has been handed to the - * context can be closed out by calling , - * which also calculates the final MD5 result. - * - * Don't forget to free an allocated context structure when - * you've finished using it. - * - * See Also: , - * - * ------------------------------------------------------------------------ ** - */ - - auth_md5Ctx *auth_md5SumCtx(auth_md5Ctx *ctx, const unsigned char *src, const int len); - /* ------------------------------------------------------------------------ ** - * Build an MD5 Message Digest within the given context. - * - * Input: ctx - Pointer to the context in which the MD5 sum is being - * built. - * src - A chunk of source data. This will be used to drive - * the MD5 algorithm. - * len - The number of bytes in . - * - * Output: A pointer to the updated context (same as ). - * - * See Also: , , - * - * ------------------------------------------------------------------------ ** - */ - - auth_md5Ctx *auth_md5CloseCtx(auth_md5Ctx *ctx, unsigned char *dst); - /* ------------------------------------------------------------------------ ** - * Close an MD5 Message Digest context and generate the final MD5 sum. - * - * Input: ctx - Pointer to the context in which the MD5 sum is being - * built. - * dst - A pointer to at least 16 bytes of memory, which will - * receive the finished MD5 sum. - * - * Output: A pointer to the closed context (same as ). - * You might use this to free a malloc'd context structure. :) - * - * Notes: The context () is returned in an undefined state. - * It must be re-initialized before re-use. - * - * See Also: , - * - * ------------------------------------------------------------------------ ** - */ - - unsigned char * MD5(unsigned char * hash, const unsigned char *src, const int len); - /* ------------------------------------------------------------------------ ** - * Compute an MD5 message digest. - * - * Input: dst - Destination buffer into which the result will be written. - * Must be 16 bytes, minimum. - * src - Source data block to be MD5'd. - * len - The length, in bytes, of the source block. - * (Note that the length is given in bytes, not bits.) - * - * Output: A pointer to , which will contain the calculated 16-byte - * MD5 message digest. - * - * Notes: This function is a shortcut. It takes a single input block. - * For more drawn-out operations, see . - * - * This function is interface-compatible with the - * function in the MD4 module. - * - * The MD5 algorithm is designed to work on data with an - * arbitrary *bit* length. Most implementations, this one - * included, handle the input data in byte-sized chunks. - * - * The MD5 algorithm does much of its work using four-byte - * words, and so can be tuned for speed based on the endian-ness - * of the host. This implementation is intended to be - * endian-neutral, which may make it a teeny bit slower than - * others. ...maybe. - * - * See Also: - * - * ------------------------------------------------------------------------ ** - */ - - unsigned char * MD5fromFile(unsigned char *dst, const char *src); - /* ------------------------------------------------------------------------ ** - * Compute an MD5 message digest. - * - * Input: dst - Destination buffer into which the result will be written. - * Must be 16 bytes, minimum. - * src - filepath to the file to be MD5'd. - * - * Output: A pointer to , which will contain the calculated 16-byte - * MD5 message digest. - * - * Notes: This function is a shortcut. It takes a single input block. - * For more drawn-out operations, see . - * - * This function is interface-compatible with the - * function in the MD4 module. - * - * The MD5 algorithm is designed to work on data with an - * arbitrary *bit* length. Most implementations, this one - * included, handle the input data in byte-sized chunks. - * - * The MD5 algorithm does much of its work using four-byte - * words, and so can be tuned for speed based on the endian-ness - * of the host. This implementation is intended to be - * endian-neutral, which may make it a teeny bit slower than - * others. ...maybe. - * - * See Also: - * - * ------------------------------------------------------------------------ ** - */ - - const char * MD5ToString(const unsigned char *hash, char *dst); - unsigned char * StringToMD5(const char * hash, unsigned char * dst); - -/* ========================================================================== */ - -#ifdef __cplusplus -} -#endif -#endif /* AUTH_MD5_H */ +#ifndef MD5_H +#define MD5_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* ========================================================================== ** + * + * MD5.h + * + * Copyright: + * Copyright (C) 2003-2005 by Christopher R. Hertel + * + * Email: crh@ubiqx.mn.org + * + * $Id: MD5.h,v 0.6 2005/06/08 18:35:59 crh Exp $ + * + * Modifications and additions by dimok + * + * -------------------------------------------------------------------------- ** + * + * Description: + * Implements the MD5 hash algorithm, as described in RFC 1321. + * + * -------------------------------------------------------------------------- ** + * + * License: + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * -------------------------------------------------------------------------- ** + * + * Notes: + * + * None of this will make any sense unless you're studying RFC 1321 as you + * read the code. + * + * MD5 is described in RFC 1321. + * The MD*4* algorithm is described in RFC 1320 (that's 1321 - 1). + * MD5 is very similar to MD4, but not quite similar enough to justify + * putting the two into a single module. Besides, I wanted to add a few + * extra functions to this one to expand its usability. + * + * There are three primary motivations for this particular implementation. + * 1) Programmer's pride. I wanted to be able to say I'd done it, and I + * wanted to learn from the experience. + * 2) Portability. I wanted an implementation that I knew to be portable + * to a reasonable number of platforms. In particular, the algorithm is + * designed with little-endian platforms in mind, but I wanted an + * endian-agnostic implementation. + * 3) Compactness. While not an overriding goal, I thought it worth-while + * to see if I could reduce the overall size of the result. This is in + * keeping with my hopes that this library will be suitable for use in + * some embedded environments. + * Beyond that, cleanliness and clarity are always worth pursuing. + * + * As mentioned above, the code really only makes sense if you are familiar + * with the MD5 algorithm or are using RFC 1321 as a guide. This code is + * quirky, however, so you'll want to be reading carefully. + * + * Yeah...most of the comments are cut-and-paste from my MD4 implementation. + * + * -------------------------------------------------------------------------- ** + * + * References: + * IETF RFC 1321: The MD5 Message-Digest Algorithm + * Ron Rivest. IETF, April, 1992 + * + * ========================================================================== ** + */ + /* -------------------------------------------------------------------------- ** + * Typedefs: + */ + + typedef struct + { + unsigned int len; + unsigned int ABCD[4]; + int b_used; + unsigned char block[64]; + } auth_md5Ctx; + + /* -------------------------------------------------------------------------- ** + * Functions: + */ + + auth_md5Ctx *auth_md5InitCtx(auth_md5Ctx *ctx); + /* ------------------------------------------------------------------------ ** + * Initialize an MD5 context. + * + * Input: ctx - A pointer to the MD5 context structure to be initialized. + * Contexts are typically created thusly: + * ctx = (auth_md5Ctx *)malloc( sizeof(auth_md5Ctx) ); + * + * Output: A pointer to the initialized context (same as ). + * + * Notes: The purpose of the context is to make it possible to generate + * an MD5 Message Digest in stages, rather than having to pass a + * single large block to a single MD5 function. The context + * structure keeps track of various bits of state information. + * + * Once the context is initialized, the blocks of message data + * are passed to the function. Once the + * final bit of data has been handed to the + * context can be closed out by calling , + * which also calculates the final MD5 result. + * + * Don't forget to free an allocated context structure when + * you've finished using it. + * + * See Also: , + * + * ------------------------------------------------------------------------ ** + */ + + auth_md5Ctx *auth_md5SumCtx(auth_md5Ctx *ctx, const unsigned char *src, const int len); + /* ------------------------------------------------------------------------ ** + * Build an MD5 Message Digest within the given context. + * + * Input: ctx - Pointer to the context in which the MD5 sum is being + * built. + * src - A chunk of source data. This will be used to drive + * the MD5 algorithm. + * len - The number of bytes in . + * + * Output: A pointer to the updated context (same as ). + * + * See Also: , , + * + * ------------------------------------------------------------------------ ** + */ + + auth_md5Ctx *auth_md5CloseCtx(auth_md5Ctx *ctx, unsigned char *dst); + /* ------------------------------------------------------------------------ ** + * Close an MD5 Message Digest context and generate the final MD5 sum. + * + * Input: ctx - Pointer to the context in which the MD5 sum is being + * built. + * dst - A pointer to at least 16 bytes of memory, which will + * receive the finished MD5 sum. + * + * Output: A pointer to the closed context (same as ). + * You might use this to free a malloc'd context structure. :) + * + * Notes: The context () is returned in an undefined state. + * It must be re-initialized before re-use. + * + * See Also: , + * + * ------------------------------------------------------------------------ ** + */ + + unsigned char * MD5(unsigned char * hash, const unsigned char *src, const int len); + /* ------------------------------------------------------------------------ ** + * Compute an MD5 message digest. + * + * Input: dst - Destination buffer into which the result will be written. + * Must be 16 bytes, minimum. + * src - Source data block to be MD5'd. + * len - The length, in bytes, of the source block. + * (Note that the length is given in bytes, not bits.) + * + * Output: A pointer to , which will contain the calculated 16-byte + * MD5 message digest. + * + * Notes: This function is a shortcut. It takes a single input block. + * For more drawn-out operations, see . + * + * This function is interface-compatible with the + * function in the MD4 module. + * + * The MD5 algorithm is designed to work on data with an + * arbitrary *bit* length. Most implementations, this one + * included, handle the input data in byte-sized chunks. + * + * The MD5 algorithm does much of its work using four-byte + * words, and so can be tuned for speed based on the endian-ness + * of the host. This implementation is intended to be + * endian-neutral, which may make it a teeny bit slower than + * others. ...maybe. + * + * See Also: + * + * ------------------------------------------------------------------------ ** + */ + + unsigned char * MD5fromFile(unsigned char *dst, const char *src); + /* ------------------------------------------------------------------------ ** + * Compute an MD5 message digest. + * + * Input: dst - Destination buffer into which the result will be written. + * Must be 16 bytes, minimum. + * src - filepath to the file to be MD5'd. + * + * Output: A pointer to , which will contain the calculated 16-byte + * MD5 message digest. + * + * Notes: This function is a shortcut. It takes a single input block. + * For more drawn-out operations, see . + * + * This function is interface-compatible with the + * function in the MD4 module. + * + * The MD5 algorithm is designed to work on data with an + * arbitrary *bit* length. Most implementations, this one + * included, handle the input data in byte-sized chunks. + * + * The MD5 algorithm does much of its work using four-byte + * words, and so can be tuned for speed based on the endian-ness + * of the host. This implementation is intended to be + * endian-neutral, which may make it a teeny bit slower than + * others. ...maybe. + * + * See Also: + * + * ------------------------------------------------------------------------ ** + */ + + const char * MD5ToString(const unsigned char *hash, char *dst); + unsigned char * StringToMD5(const char * hash, unsigned char * dst); + +/* ========================================================================== */ + +#ifdef __cplusplus +} +#endif +#endif /* AUTH_MD5_H */ diff --git a/source/bannersound.h b/source/bannersound.h index 6cf7b526..b6da62d1 100644 --- a/source/bannersound.h +++ b/source/bannersound.h @@ -1,6 +1,6 @@ -#ifndef BANNERSOUND_H -#define BANNERSOUND_H - -const u8 *LoadBannerSound(const u8 *discid, u32 *size); - -#endif /* BANNERSOUND_H */ +#ifndef BANNERSOUND_H +#define BANNERSOUND_H + +const u8 *LoadBannerSound(const u8 *discid, u32 *size); + +#endif /* BANNERSOUND_H */ diff --git a/source/gecko.c b/source/gecko.c index 21bbf356..06a1e15a 100644 --- a/source/gecko.c +++ b/source/gecko.c @@ -21,7 +21,7 @@ void gprintf(const char *format, ...) if((vasprintf(&tmp, format, va) >= 0) && tmp) { u32 level = IRQ_Disable(); - usb_sendbuffer(1, tmp, strlen(tmp)); + usb_sendbuffer_safe(1, tmp, strlen(tmp)); IRQ_Restore(level); } va_end(va); diff --git a/source/homebrewboot/dolloader.c b/source/homebrewboot/dolloader.c index 32f0ef29..d957f7e8 100644 --- a/source/homebrewboot/dolloader.c +++ b/source/homebrewboot/dolloader.c @@ -8,52 +8,57 @@ #include "dolloader.h" -typedef struct _dolheader -{ - u32 text_pos[7]; - u32 data_pos[11]; - u32 text_start[7]; - u32 data_start[11]; - u32 text_size[7]; - u32 data_size[11]; - u32 bss_start; - u32 bss_size; - u32 entry_point; +typedef struct _dolheader { + u32 text_pos[7]; + u32 data_pos[11]; + u32 text_start[7]; + u32 data_start[11]; + u32 text_size[7]; + u32 data_size[11]; + u32 bss_start; + u32 bss_size; + u32 entry_point; } dolheader; u32 load_dol(const void *dolstart, struct __argv *argv) { - u32 i; - dolheader *dolfile; + u32 i; + dolheader *dolfile; - if (dolstart) - { - dolfile = (dolheader *) dolstart; - for (i = 0; i < 7; i++) - { - if ((!dolfile->text_size[i]) || (dolfile->text_start[i] < 0x100)) continue; - ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); - memcpy((void *) dolfile->text_start[i], dolstart + dolfile->text_pos[i], dolfile->text_size[i]); - } + if (dolstart) + { + dolfile = (dolheader *) dolstart; + for (i = 0; i < 7; i++) + { + if ((!dolfile->text_size[i]) || (dolfile->text_start[i] < 0x100)) + continue; - for (i = 0; i < 11; i++) - { - if ((!dolfile->data_size[i]) || (dolfile->data_start[i] < 0x100)) continue; - memcpy((void *) dolfile->data_start[i], dolstart + dolfile->data_pos[i], dolfile->data_size[i]); - DCFlushRangeNoSync((void *) dolfile->data_start[i], dolfile->data_size[i]); - } + memmove((void *) dolfile->text_start[i], dolstart + + dolfile->text_pos[i], dolfile->text_size[i]); - memset((void *) dolfile->bss_start, 0, dolfile->bss_size); - DCFlushRange((void *) dolfile->bss_start, dolfile->bss_size); + DCFlushRange ((void *) dolfile->text_start[i], dolfile->text_size[i]); + ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); + } - if (argv && argv->argvMagic == ARGV_MAGIC) - { - void *new_argv = (void *) (dolfile->entry_point + 8); - memcpy(new_argv, argv, sizeof(*argv)); - DCFlushRange(new_argv, sizeof(*argv)); - } + for (i = 0; i < 11; i++) + { + if ((!dolfile->data_size[i]) || (dolfile->data_start[i] < 0x100)) + continue; - return dolfile->entry_point; - } - return 0; + memmove((void *) dolfile->data_start[i], dolstart + + dolfile->data_pos[i], dolfile->data_size[i]); + + DCFlushRange((void *) dolfile->data_start[i], + dolfile->data_size[i]); + } + + if (argv && argv->argvMagic == ARGV_MAGIC) + { + void *new_argv = (void *) (dolfile->entry_point + 8); + memmove(new_argv, argv, sizeof(*argv)); + DCFlushRange(new_argv, sizeof(*argv)); + } + return dolfile->entry_point; + } + return 0; } diff --git a/source/homebrewboot/dolloader.h b/source/homebrewboot/dolloader.h index 96d2abc8..af644414 100644 --- a/source/homebrewboot/dolloader.h +++ b/source/homebrewboot/dolloader.h @@ -2,14 +2,14 @@ #define _DOLLOADER_H_ #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - extern void __exception_closeall(); - typedef void (*entrypoint)(void); +extern void __exception_closeall(); +typedef void (*entrypoint) (void); + +u32 load_dol(const void *dolstart, struct __argv *argv); - u32 load_dol(const void *dolstart, struct __argv *argv); #ifdef __cplusplus } diff --git a/source/libs/libext2fs/bitops.h b/source/libs/libext2fs/bitops.h new file mode 100644 index 00000000..bf6ee82a --- /dev/null +++ b/source/libs/libext2fs/bitops.h @@ -0,0 +1,638 @@ +/* + * bitops.h --- Bitmap frobbing code. The byte swapping routines are + * also included here. + * + * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ +#ifndef _BITOPS_H_ +#define _BITOPS_H_ + +extern int ext2fs_set_bit(unsigned int nr,void * addr); +extern int ext2fs_clear_bit(unsigned int nr, void * addr); +extern int ext2fs_test_bit(unsigned int nr, const void * addr); +extern void ext2fs_fast_set_bit(unsigned int nr,void * addr); +extern void ext2fs_fast_clear_bit(unsigned int nr, void * addr); +extern int ext2fs_set_bit64(__u64 nr,void * addr); +extern int ext2fs_clear_bit64(__u64 nr, void * addr); +extern int ext2fs_test_bit64(__u64 nr, const void * addr); +extern void ext2fs_fast_set_bit64(__u64 nr,void * addr); +extern void ext2fs_fast_clear_bit64(__u64 nr, void * addr); +extern __u16 ext2fs_swab16(__u16 val); +extern __u32 ext2fs_swab32(__u32 val); +extern __u64 ext2fs_swab64(__u64 val); + +#ifdef WORDS_BIGENDIAN +#define ext2fs_cpu_to_le64(x) ext2fs_swab64((x)) +#define ext2fs_le64_to_cpu(x) ext2fs_swab64((x)) +#define ext2fs_cpu_to_le32(x) ext2fs_swab32((x)) +#define ext2fs_le32_to_cpu(x) ext2fs_swab32((x)) +#define ext2fs_cpu_to_le16(x) ext2fs_swab16((x)) +#define ext2fs_le16_to_cpu(x) ext2fs_swab16((x)) +#define ext2fs_cpu_to_be32(x) ((__u32)(x)) +#define ext2fs_be32_to_cpu(x) ((__u32)(x)) +#define ext2fs_cpu_to_be16(x) ((__u16)(x)) +#define ext2fs_be16_to_cpu(x) ((__u16)(x)) +#else +#define ext2fs_cpu_to_le64(x) ((__u64)(x)) +#define ext2fs_le64_to_cpu(x) ((__u64)(x)) +#define ext2fs_cpu_to_le32(x) ((__u32)(x)) +#define ext2fs_le32_to_cpu(x) ((__u32)(x)) +#define ext2fs_cpu_to_le16(x) ((__u16)(x)) +#define ext2fs_le16_to_cpu(x) ((__u16)(x)) +#define ext2fs_cpu_to_be32(x) ext2fs_swab32((x)) +#define ext2fs_be32_to_cpu(x) ext2fs_swab32((x)) +#define ext2fs_cpu_to_be16(x) ext2fs_swab16((x)) +#define ext2fs_be16_to_cpu(x) ext2fs_swab16((x)) +#endif + +/* + * EXT2FS bitmap manipulation routines. + */ + +/* Support for sending warning messages from the inline subroutines */ +extern const char *ext2fs_block_string; +extern const char *ext2fs_inode_string; +extern const char *ext2fs_mark_string; +extern const char *ext2fs_unmark_string; +extern const char *ext2fs_test_string; +extern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg, + const char *description); +extern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap, + int code, unsigned long arg); + +extern int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block); +extern int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block); + +extern int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode); +extern int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ext2_ino_t inode); + +extern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); +extern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block); + +extern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap); +extern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap); + +extern void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_test_inode_bitmap_range(ext2fs_inode_bitmap bitmap, + ino_t inode, int num); +extern void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map); + +/* These routines moved to gen_bitmap.c (actually, some of the above, too) */ +extern int ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap, + __u32 bitno); +extern int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno); +extern int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap, + blk_t bitno); +extern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num); +extern __u32 ext2fs_get_generic_bitmap_start(ext2fs_generic_bitmap bitmap); +extern __u32 ext2fs_get_generic_bitmap_end(ext2fs_generic_bitmap bitmap); + +/* 64-bit versions */ + +extern int ext2fs_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); + +extern int ext2fs_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); + +extern void ext2fs_fast_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern void ext2fs_fast_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); +extern int ext2fs_fast_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block); + +extern void ext2fs_fast_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern void ext2fs_fast_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern int ext2fs_fast_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode); +extern blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap); +extern blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap); +extern ext2_ino_t ext2fs_get_inode_bitmap_end2(ext2fs_inode_bitmap bitmap); + +extern int ext2fs_fast_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +extern void ext2fs_fast_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +extern void ext2fs_fast_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num); +/* These routines moved to gen_bitmap64.c */ +extern void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap); +extern errcode_t ext2fs_compare_generic_bmap(errcode_t neq, + ext2fs_generic_bitmap bm1, + ext2fs_generic_bitmap bm2); +extern void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap); +extern int ext2fs_mark_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_unmark_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_test_generic_bmap(ext2fs_generic_bitmap bitmap, + blk64_t bitno); +extern int ext2fs_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern __u64 ext2fs_get_generic_bmap_start(ext2fs_generic_bitmap bitmap); +extern __u64 ext2fs_get_generic_bmap_end(ext2fs_generic_bitmap bitmap); +extern int ext2fs_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern void ext2fs_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); +extern void ext2fs_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, unsigned int num); + +/* + * The inline routines themselves... + * + * If NO_INLINE_FUNCS is defined, then we won't try to do inline + * functions at all; they will be included as normal functions in + * inline.c + */ +#ifdef NO_INLINE_FUNCS +#if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \ + defined(__i586__) || defined(__mc68000__))) + /* This prevents bitops.c from trying to include the C */ + /* function version of these functions */ +#define _EXT2_HAVE_ASM_BITOPS_ +#endif +#endif /* NO_INLINE_FUNCS */ + +#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) +#ifdef INCLUDE_INLINE_FUNCS +#define _INLINE_ extern +#else +#ifdef __GNUC__ +#define _INLINE_ extern __inline__ +#else /* For Watcom C */ +#define _INLINE_ extern inline +#endif +#endif + +/* + * Fast bit set/clear functions that doesn't need to return the + * previous bit value. + */ + +_INLINE_ void ext2fs_fast_set_bit(unsigned int nr,void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR |= (1 << (nr & 0x07)); +} + +_INLINE_ void ext2fs_fast_clear_bit(unsigned int nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR &= ~(1 << (nr & 0x07)); +} + + +_INLINE_ void ext2fs_fast_set_bit64(__u64 nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR |= (1 << (nr & 0x07)); +} + +_INLINE_ void ext2fs_fast_clear_bit64(__u64 nr, void * addr) +{ + unsigned char *ADDR = (unsigned char *) addr; + + ADDR += nr >> 3; + *ADDR &= ~(1 << (nr & 0x07)); +} + + +#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \ + (defined(__i386__) || defined(__i486__) || defined(__i586__))) + +#define _EXT2_HAVE_ASM_BITOPS_ +#define _EXT2_HAVE_ASM_SWAB_ + +/* + * These are done by inline assembly for speed reasons..... + * + * All bitoperations return 0 if the bit was cleared before the + * operation and != 0 if it was not. Bit 0 is the LSB of addr; bit 32 + * is the LSB of (addr+1). + */ + +/* + * Some hacks to defeat gcc over-optimizations.. + */ +struct __dummy_h { unsigned long a[100]; }; +#define EXT2FS_ADDR (*(struct __dummy_h *) addr) +#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr) + +_INLINE_ int ext2fs_set_bit(unsigned int nr, void * addr) +{ + int oldbit; + + addr = (void *) (((unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (EXT2FS_ADDR) + :"r" (nr & 7)); + return oldbit; +} + +_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr) +{ + int oldbit; + + addr = (void *) (((unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (EXT2FS_ADDR) + :"r" (nr & 7)); + return oldbit; +} + +_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr) +{ + int oldbit; + + addr = (const void *) (((const unsigned char *) addr) + (nr >> 3)); + __asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit) + :"m" (EXT2FS_CONST_ADDR),"r" (nr & 7)); + return oldbit; +} + +_INLINE_ __u32 ext2fs_swab32(__u32 val) +{ +#ifdef EXT2FS_REQUIRE_486 + __asm__("bswap %0" : "=r" (val) : "0" (val)); +#else + __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ + "rorl $16,%0\n\t" /* swap words */ + "xchgb %b0,%h0" /* swap higher bytes */ + :"=q" (val) + : "0" (val)); +#endif + return val; +} + +_INLINE_ __u16 ext2fs_swab16(__u16 val) +{ + __asm__("xchgb %b0,%h0" /* swap bytes */ \ + : "=q" (val) \ + : "0" (val)); \ + return val; +} + +#undef EXT2FS_ADDR + +#endif /* i386 */ + +#if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \ + (defined(__mc68000__))) + +#define _EXT2_HAVE_ASM_BITOPS_ + +_INLINE_ int ext2fs_set_bit(unsigned int nr,void * addr) +{ + char retval; + + __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +_INLINE_ int ext2fs_clear_bit(unsigned int nr, void * addr) +{ + char retval; + + __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +_INLINE_ int ext2fs_test_bit(unsigned int nr, const void * addr) +{ + char retval; + + __asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0" + : "=d" (retval) : "d" (nr^7), "a" (addr)); + + return retval; +} + +#endif /* __mc68000__ */ + + +#if !defined(_EXT2_HAVE_ASM_SWAB_) + +_INLINE_ __u16 ext2fs_swab16(__u16 val) +{ + return (val >> 8) | (val << 8); +} + +_INLINE_ __u32 ext2fs_swab32(__u32 val) +{ + return ((val>>24) | ((val>>8)&0xFF00) | + ((val<<8)&0xFF0000) | (val<<24)); +} + +#endif /* !_EXT2_HAVE_ASM_SWAB */ + +_INLINE_ __u64 ext2fs_swab64(__u64 val) +{ + return (ext2fs_swab32(val >> 32) | + (((__u64)ext2fs_swab32(val & 0xFFFFFFFFUL)) << 32)); +} + +_INLINE_ int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap, + blk_t block) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bitmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + return ext2fs_test_block_bitmap_range(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + ext2fs_mark_block_bitmap_range(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap, + blk_t block, int num) +{ + ext2fs_unmark_block_bitmap_range(bitmap, block, num); +} + +/* 64-bit versions */ + +_INLINE_ int ext2fs_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ int ext2fs_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ int ext2fs_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, block); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap2(ext2fs_block_bitmap bitmap, + blk64_t block) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + block); +} + +_INLINE_ void ext2fs_fast_mark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_mark_generic_bmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ void ext2fs_fast_unmark_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + ext2fs_unmark_generic_bmap((ext2fs_generic_bitmap) bitmap, inode); +} + +_INLINE_ int ext2fs_fast_test_inode_bitmap2(ext2fs_inode_bitmap bitmap, + ext2_ino_t inode) +{ + return ext2fs_test_generic_bmap((ext2fs_generic_bitmap) bitmap, + inode); +} + +_INLINE_ blk64_t ext2fs_get_block_bitmap_start2(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_start2(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_start((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ blk64_t ext2fs_get_block_bitmap_end2(ext2fs_block_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ ext2_ino_t ext2fs_get_inode_bitmap_end2(ext2fs_inode_bitmap bitmap) +{ + return ext2fs_get_generic_bmap_end((ext2fs_generic_bitmap) bitmap); +} + +_INLINE_ int ext2fs_fast_test_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + return ext2fs_test_block_bitmap_range2(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_mark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + ext2fs_mark_block_bitmap_range2(bitmap, block, num); +} + +_INLINE_ void ext2fs_fast_unmark_block_bitmap_range2(ext2fs_block_bitmap bitmap, + blk64_t block, + unsigned int num) +{ + ext2fs_unmark_block_bitmap_range2(bitmap, block, num); +} + +#undef _INLINE_ +#endif + +#endif diff --git a/source/libs/libext2fs/com_err.h b/source/libs/libext2fs/com_err.h new file mode 100644 index 00000000..0c31a4ec --- /dev/null +++ b/source/libs/libext2fs/com_err.h @@ -0,0 +1,70 @@ +/* + * Header file for common error description library. + * + * Copyright 1988, Student Information Processing Board of the + * Massachusetts Institute of Technology. + * + * For copyright and distribution info, see the documentation supplied + * with this package. + */ + +#if !defined(__COM_ERR_H) && !defined(__COM_ERR_H__) + +#ifdef __GNUC__ +#define COM_ERR_ATTR(x) __attribute__(x) +#else +#define COM_ERR_ATTR(x) +#endif + +#ifndef DEBUG_GEKKO +#define OMIT_COM_ERR +#endif + +#include +#include + +typedef long errcode_t; + +struct error_table { + char const * const * msgs; + long base; + int n_msgs; +}; +struct et_list; + +extern void com_err (const char *, long, const char *, ...) + COM_ERR_ATTR((format(printf, 3, 4))); + +extern void com_err_va (const char *whoami, errcode_t code, const char *fmt, + va_list args) + COM_ERR_ATTR((format(printf, 3, 0))); + +extern char const *error_message (long); +extern void (*com_err_hook) (const char *, long, const char *, va_list); +extern void (*set_com_err_hook (void (*) (const char *, long, + const char *, va_list))) + (const char *, long, const char *, va_list); +extern void (*reset_com_err_hook (void)) (const char *, long, + const char *, va_list); +extern int init_error_table(const char * const *msgs, long base, int count); + +extern errcode_t add_error_table(const struct error_table * et); +extern errcode_t remove_error_table(const struct error_table * et); +extern void add_to_error_table(struct et_list *new_table); + +/* Provided for Heimdall compatibility */ +extern const char *com_right(struct et_list *list, long code); +extern const char *com_right_r(struct et_list *list, long code, char *str, size_t len); +extern void initialize_error_table_r(struct et_list **list, + const char **messages, + int num_errors, + long base); +extern void free_error_table(struct et_list *et); + +/* Provided for compatibility with other com_err libraries */ +extern int et_list_lock(void); +extern int et_list_unlock(void); + +#define __COM_ERR_H +#define __COM_ERR_H__ +#endif /* !defined(__COM_ERR_H) && !defined(__COM_ERR_H__)*/ diff --git a/source/libs/libext2fs/ext2_err.h b/source/libs/libext2fs/ext2_err.h new file mode 100644 index 00000000..4f127443 --- /dev/null +++ b/source/libs/libext2fs/ext2_err.h @@ -0,0 +1,152 @@ +// +// Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. +// +// This file may be redistributed under the terms of the GNU Public +// License. +#ifndef EXT2_ERR_H_ +#define EXT2_ERR_H_ + +#define EXT2_ET_OK 0 +#define EXT2_ET_BASE -1 +#define EXT2_ET_MAGIC_EXT2FS_FILSYS -2 +#define EXT2_ET_MAGIC_BADBLOCKS_LIST -3 +#define EXT2_ET_MAGIC_BADBLOCKS_ITERATE -4 +#define EXT2_ET_MAGIC_INODE_SCAN -5 +#define EXT2_ET_MAGIC_IO_CHANNEL -6 +#define EXT2_ET_MAGIC_UNIX_IO_CHANNEL -7 +#define EXT2_ET_MAGIC_IO_MANAGER -8 +#define EXT2_ET_MAGIC_BLOCK_BITMAP -9 +#define EXT2_ET_MAGIC_INODE_BITMAP -10 +#define EXT2_ET_MAGIC_GENERIC_BITMAP -11 +#define EXT2_ET_MAGIC_TEST_IO_CHANNEL -12 +#define EXT2_ET_MAGIC_DBLIST -13 +#define EXT2_ET_MAGIC_ICOUNT -14 +#define EXT2_ET_MAGIC_PQ_IO_CHANNEL -15 +#define EXT2_ET_MAGIC_EXT2_FILE -16 +#define EXT2_ET_MAGIC_E2IMAGE -17 +#define EXT2_ET_MAGIC_INODE_IO_CHANNEL -18 +#define EXT2_ET_MAGIC_EXTENT_HANDLE -19 +#define EXT2_ET_BAD_MAGIC -20 +#define EXT2_ET_REV_TOO_HIGH -21 +#define EXT2_ET_RO_FILSYS -22 +#define EXT2_ET_GDESC_READ -23 +#define EXT2_ET_GDESC_WRITE -24 +#define EXT2_ET_GDESC_BAD_BLOCK_MAP -25 +#define EXT2_ET_GDESC_BAD_INODE_MAP -26 +#define EXT2_ET_GDESC_BAD_INODE_TABLE -27 +#define EXT2_ET_INODE_BITMAP_WRITE -28 +#define EXT2_ET_INODE_BITMAP_READ -29 +#define EXT2_ET_BLOCK_BITMAP_WRITE -30 +#define EXT2_ET_BLOCK_BITMAP_READ -31 +#define EXT2_ET_INODE_TABLE_WRITE -32 +#define EXT2_ET_INODE_TABLE_READ -33 +#define EXT2_ET_NEXT_INODE_READ -34 +#define EXT2_ET_UNEXPECTED_BLOCK_SIZE -35 +#define EXT2_ET_DIR_CORRUPTED -36 +#define EXT2_ET_SHORT_READ -37 +#define EXT2_ET_SHORT_WRITE -38 +#define EXT2_ET_DIR_NO_SPACE -39 +#define EXT2_ET_NO_INODE_BITMAP -40 +#define EXT2_ET_NO_BLOCK_BITMAP -41 +#define EXT2_ET_BAD_INODE_NUM -42 +#define EXT2_ET_BAD_BLOCK_NUM -45 +#define EXT2_ET_EXPAND_DIR_ERR -46 +#define EXT2_ET_TOOSMALL -47 +#define EXT2_ET_BAD_BLOCK_MARK -48 +#define EXT2_ET_BAD_BLOCK_UNMARK -49 +#define EXT2_ET_BAD_BLOCK_TEST -50 +#define EXT2_ET_BAD_INODE_MARK -51 +#define EXT2_ET_BAD_INODE_UNMARK -52 +#define EXT2_ET_BAD_INODE_TEST -53 +#define EXT2_ET_FUDGE_BLOCK_BITMAP_END -54 +#define EXT2_ET_FUDGE_INODE_BITMAP_END -55 +#define EXT2_ET_BAD_IND_BLOCK -56 +#define EXT2_ET_BAD_DIND_BLOCK -57 +#define EXT2_ET_BAD_TIND_BLOCK -58 +#define EXT2_ET_NEQ_BLOCK_BITMAP -59 +#define EXT2_ET_NEQ_INODE_BITMAP -60 +#define EXT2_ET_BAD_DEVICE_NAME -61 +#define EXT2_ET_MISSING_INODE_TABLE -62 +#define EXT2_ET_CORRUPT_SUPERBLOCK -63 +#define EXT2_ET_BAD_GENERIC_MARK -64 +#define EXT2_ET_BAD_GENERIC_UNMARK -65 +#define EXT2_ET_BAD_GENERIC_TEST -66 +#define EXT2_ET_SYMLINK_LOOP -67 +#define EXT2_ET_CALLBACK_NOTHANDLED -68 +#define EXT2_ET_BAD_BLOCK_IN_INODE_TABLE -69 +#define EXT2_ET_UNSUPP_FEATURE -70 +#define EXT2_ET_RO_UNSUPP_FEATURE -71 +#define EXT2_ET_LLSEEK_FAILED -72 +#define EXT2_ET_NO_MEMORY -73 +#define EXT2_ET_INVALID_ARGUMENT -74 +#define EXT2_ET_BLOCK_ALLOC_FAIL -75 +#define EXT2_ET_INODE_ALLOC_FAIL -76 +#define EXT2_ET_NO_DIRECTORY -77 +#define EXT2_ET_TOO_MANY_REFS -78 +#define EXT2_ET_FILE_NOT_FOUND -79 +#define EXT2_ET_FILE_RO -80 +#define EXT2_ET_DB_NOT_FOUND -81 +#define EXT2_ET_DIR_EXISTS -82 +#define EXT2_ET_UNIMPLEMENTED -83 +#define EXT2_ET_CANCEL_REQUESTED -84 +#define EXT2_ET_FILE_TOO_BIG -85 +#define EXT2_ET_JOURNAL_NOT_BLOCK -86 +#define EXT2_ET_NO_JOURNAL_SB -87 +#define EXT2_ET_JOURNAL_TOO_SMALL -88 +#define EXT2_ET_JOURNAL_UNSUPP_VERSION -89 +#define EXT2_ET_LOAD_EXT_JOURNAL -90 +#define EXT2_ET_NO_JOURNAL -91 +#define EXT2_ET_DIRHASH_UNSUPP -92 +#define EXT2_ET_BAD_EA_BLOCK_NUM -93 +#define EXT2_ET_TOO_MANY_INODES -94 +#define EXT2_ET_NOT_IMAGE_FILE -95 +#define EXT2_ET_RES_GDT_BLOCKS -96 +#define EXT2_ET_RESIZE_INODE_CORRUPT -97 +#define EXT2_ET_SET_BMAP_NO_IND -98 +#define EXT2_ET_TDB_SUCCESS -99 +#define EXT2_ET_TDB_ERR_CORRUPT -100 +#define EXT2_ET_TDB_ERR_IO -101 +#define EXT2_ET_TDB_ERR_LOCK -102 +#define EXT2_ET_TDB_ERR_OOM -103 +#define EXT2_ET_TDB_ERR_EXISTS -104 +#define EXT2_ET_TDB_ERR_NOLOCK -105 +#define EXT2_ET_TDB_ERR_EINVAL -106 +#define EXT2_ET_TDB_ERR_NOEXIST -107 +#define EXT2_ET_TDB_ERR_RDONLY -108 +#define EXT2_ET_DBLIST_EMPTY -109 +#define EXT2_ET_RO_BLOCK_ITERATE -110 +#define EXT2_ET_MAGIC_EXTENT_PATH -111 +#define EXT2_ET_MAGIC_RESERVED_10 -112 +#define EXT2_ET_MAGIC_RESERVED_11 -113 +#define EXT2_ET_MAGIC_RESERVED_12 -114 +#define EXT2_ET_MAGIC_RESERVED_13 -115 +#define EXT2_ET_MAGIC_RESERVED_14 -116 +#define EXT2_ET_MAGIC_RESERVED_15 -117 +#define EXT2_ET_MAGIC_RESERVED_16 -118 +#define EXT2_ET_MAGIC_RESERVED_17 -119 +#define EXT2_ET_MAGIC_RESERVED_18 -120 +#define EXT2_ET_MAGIC_RESERVED_19 -121 +#define EXT2_ET_EXTENT_HEADER_BAD -122 +#define EXT2_ET_EXTENT_INDEX_BAD -123 +#define EXT2_ET_EXTENT_LEAF_BAD -124 +#define EXT2_ET_EXTENT_NO_SPACE -125 +#define EXT2_ET_INODE_NOT_EXTENT -126 +#define EXT2_ET_EXTENT_NO_NEXT -127 +#define EXT2_ET_EXTENT_NO_PREV -128 +#define EXT2_ET_EXTENT_NO_UP -129 +#define EXT2_ET_EXTENT_NO_DOWN -130 +#define EXT2_ET_NO_CURRENT_NODE -131 +#define EXT2_ET_OP_NOT_SUPPORTED -132 +#define EXT2_ET_CANT_INSERT_EXTENT -133 +#define EXT2_ET_CANT_SPLIT_EXTENT -134 +#define EXT2_ET_EXTENT_NOT_FOUND -135 +#define EXT2_ET_EXTENT_NOT_SUPPORTED -136 +#define EXT2_ET_EXTENT_INVALID_LENGTH -137 +#define EXT2_ET_IO_CHANNEL_NO_SUPPORT_64 -138 +#define EXT2_NO_MTAB_FILE -139 +#define EXT2_ET_MAGIC_GENERIC_BITMAP64 -140 +#define EXT2_ET_MAGIC_BLOCK_BITMAP64 -141 +#define EXT2_ET_MAGIC_INODE_BITMAP64 -142 +#define EXT2_ET_CANT_USE_LEGACY_BITMAPS -143 + +#endif diff --git a/source/libs/libext2fs/ext2_ext_attr.h b/source/libs/libext2fs/ext2_ext_attr.h new file mode 100644 index 00000000..ed548d12 --- /dev/null +++ b/source/libs/libext2fs/ext2_ext_attr.h @@ -0,0 +1,71 @@ +/* + File: linux/ext2_ext_attr.h + + On-disk format of extended attributes for the ext2 filesystem. + + (C) 2000 Andreas Gruenbacher, +*/ + +#ifndef _EXT2_EXT_ATTR_H +#define _EXT2_EXT_ATTR_H +/* Magic value in attribute blocks */ +#define EXT2_EXT_ATTR_MAGIC_v1 0xEA010000 +#define EXT2_EXT_ATTR_MAGIC 0xEA020000 + +/* Maximum number of references to one attribute block */ +#define EXT2_EXT_ATTR_REFCOUNT_MAX 1024 + +struct ext2_ext_attr_header { + __u32 h_magic; /* magic number for identification */ + __u32 h_refcount; /* reference count */ + __u32 h_blocks; /* number of disk blocks used */ + __u32 h_hash; /* hash value of all attributes */ + __u32 h_reserved[4]; /* zero right now */ +}; + +struct ext2_ext_attr_entry { + __u8 e_name_len; /* length of name */ + __u8 e_name_index; /* attribute name index */ + __u16 e_value_offs; /* offset in disk block of value */ + __u32 e_value_block; /* disk block attribute is stored on (n/i) */ + __u32 e_value_size; /* size of attribute value */ + __u32 e_hash; /* hash value of name and value */ +#if 0 + char e_name[0]; /* attribute name */ +#endif +}; + +#define EXT2_EXT_ATTR_PAD_BITS 2 +#define EXT2_EXT_ATTR_PAD ((unsigned) 1<e_name_len)) ) +#define EXT2_EXT_ATTR_SIZE(size) \ + (((size) + EXT2_EXT_ATTR_ROUND) & ~EXT2_EXT_ATTR_ROUND) +#define EXT2_EXT_IS_LAST_ENTRY(entry) (*((__u32 *)(entry)) == 0UL) +#define EXT2_EXT_ATTR_NAME(entry) \ + (((char *) (entry)) + sizeof(struct ext2_ext_attr_entry)) +#define EXT2_XATTR_LEN(name_len) \ + (((name_len) + EXT2_EXT_ATTR_ROUND + \ + sizeof(struct ext2_xattr_entry)) & ~EXT2_EXT_ATTR_ROUND) +#define EXT2_XATTR_SIZE(size) \ + (((size) + EXT2_EXT_ATTR_ROUND) & ~EXT2_EXT_ATTR_ROUND) + +#ifdef __KERNEL__ +# ifdef CONFIG_EXT2_FS_EXT_ATTR +extern int ext2_get_ext_attr(struct inode *, const char *, char *, size_t, int); +extern int ext2_set_ext_attr(struct inode *, const char *, char *, size_t, int); +extern void ext2_ext_attr_free_inode(struct inode *inode); +extern void ext2_ext_attr_put_super(struct super_block *sb); +extern int ext2_ext_attr_init(void); +extern void ext2_ext_attr_done(void); +# else +# define ext2_get_ext_attr NULL +# define ext2_set_ext_attr NULL +# endif +#endif /* __KERNEL__ */ +#endif /* _EXT2_EXT_ATTR_H */ diff --git a/source/libs/libext2fs/ext2_frag.c b/source/libs/libext2fs/ext2_frag.c index bf008f7a..e05a4bc7 100644 --- a/source/libs/libext2fs/ext2_frag.c +++ b/source/libs/libext2fs/ext2_frag.c @@ -7,10 +7,10 @@ typedef struct _PrivData void * callback_data; } PrivDataST; -static int block_iter_callback(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *privateData) +static int block_iter_callback(ext2_filsys fs, blk64_t *blocknr, e2_blkcnt_t blockcnt, blk64_t ref_block, int ref_offset, void *privateData) { PrivDataST *priv = (PrivDataST *) privateData; - blk_t block; + blk64_t block; block = *blocknr; return priv->append_fragment(priv->callback_data, blockcnt*fs->io->block_size/512, block*fs->io->block_size/512, fs->io->block_size/512); @@ -47,9 +47,10 @@ int _EXT2_get_fragments(const char *in_path, _ext2_frag_append_t append_fragment priv.callback_data = callback_data; priv.append_fragment = append_fragment; - ext2fs_block_iterate(vd->fs, ni->ino, 0, NULL, block_iter_callback, &priv); + int ret = ext2fs_block_iterate3(vd->fs, ni->ino, BLOCK_FLAG_DATA_ONLY, NULL, block_iter_callback, &priv); - int ret = priv.append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); + if(ret == 0) + ret = priv.append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); ext2UpdateTimes(vd, ni, EXT2_UPDATE_ATIME); diff --git a/source/libs/libext2fs/ext2_frag.j b/source/libs/libext2fs/ext2_frag.j new file mode 100644 index 00000000..fe4ca658 --- /dev/null +++ b/source/libs/libext2fs/ext2_frag.j @@ -0,0 +1,107 @@ +#include "ext2_internal.h" +#include "ext2_frag.h" +#include "mem_allocate.h" + +typedef struct _DataBlocks +{ + u32 block; + u32 blockcnt; +} DataBlocks; + +typedef struct _PrivData +{ + DataBlocks * blocks; + u32 blocksCnt; +} PrivDataST; + +static int block_iter_callback(ext2_filsys fs, blk_t *blocknr, int blockcnt, void *privateData) +{ + PrivDataST *priv = (PrivDataST *) privateData; + + if(!priv->blocks) + priv->blocks = (DataBlocks *) mem_alloc(sizeof(DataBlocks)); + + priv->blocksCnt++; + + DataBlocks * tmp = (DataBlocks *) mem_realloc(priv->blocks, priv->blocksCnt*sizeof(DataBlocks)); + if(!tmp) + { + free(priv->blocks); + priv->blocks = NULL; + return -1; + } + + priv->blocks = tmp; + + priv->blocks[priv->blocksCnt-1].block = *blocknr; + priv->blocks[priv->blocksCnt-1].blockcnt = blockcnt; + return 0; +} + +int _EXT2_get_fragments(const char *in_path, _ext2_frag_append_t append_fragment, void *callback_data) +{ + ext2_inode_t *ni = NULL; + ext2_vd *vd; + + vd = ext2GetVolume(in_path); + + if(!vd) + { + errno = EXDEV; + return -1; + } + + // Get the actual path of the entry + const char * path = ext2RealPath(in_path); + if (!path) { + errno = EINVAL; + return -1; + } + + // Find the entry + ni = ext2OpenEntry(vd, path); + if (!ni) { + errno = ENOENT; + return -1; + } + + PrivDataST priv; + priv.blocks = NULL; + priv.blocksCnt = 0; + + int ret = ext2fs_block_iterate(vd->fs, ni->ino, BLOCK_FLAG_DATA_ONLY, NULL, block_iter_callback, &priv); + if(ret == 0 && priv.blocksCnt > 0) + { + int i = 0; + u32 size = 1; + u32 block_size = vd->fs->io->block_size/512; + int printfs = 30; + + for(i = 0; i < priv.blocksCnt-1; ++i) + { + //size = priv.blocks[i+1].blockcnt-priv.blocks[i].blockcnt; + ret = append_fragment(callback_data, priv.blocks[i].blockcnt*block_size, priv.blocks[i].block*block_size, size*block_size); + if(ret) + break; + if(printfs > 0) + { + printfs--; + } + } + + if(ret == 0) + ret = append_fragment(callback_data, priv.blocks[i].blockcnt*block_size, priv.blocks[i].block*block_size, block_size); + } + + if(ret == 0) + ret = append_fragment(callback_data, EXT2_I_SIZE(&ni->ni) >> 9, 0, 0); + + if(priv.blocks) + mem_free(priv.blocks); + + ext2UpdateTimes(vd, ni, EXT2_UPDATE_ATIME); + + ext2CloseEntry(vd, ni); + + return ret; +} diff --git a/source/libs/libext2fs/ext2_io.h b/source/libs/libext2fs/ext2_io.h new file mode 100644 index 00000000..25aec665 --- /dev/null +++ b/source/libs/libext2fs/ext2_io.h @@ -0,0 +1,136 @@ +/* + * io.h --- the I/O manager abstraction + * + * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ + +#ifndef _EXT2FS_EXT2_IO_H +#define _EXT2FS_EXT2_IO_H + +#include "ext2fs.h" + +/* + * ext2_loff_t is defined here since unix_io.c needs it. + */ +typedef long long ext2_loff_t; + +/* llseek.c */ +ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int); + +typedef struct struct_io_manager *io_manager; +typedef struct struct_io_channel *io_channel; +typedef struct struct_io_stats *io_stats; + +#define CHANNEL_FLAGS_WRITETHROUGH 0x01 + +struct struct_io_channel { + errcode_t magic; + io_manager manager; + char *name; + int block_size; + errcode_t (*read_error)(io_channel channel, + unsigned long block, + int count, + void *data, + size_t size, + int actual_bytes_read, + errcode_t error); + errcode_t (*write_error)(io_channel channel, + unsigned long block, + int count, + const void *data, + size_t size, + int actual_bytes_written, + errcode_t error); + int refcount; + int flags; + long reserved[14]; + void *private_data; + void *app_data; +}; + +struct struct_io_stats { + int num_fields; + int reserved; + unsigned long long bytes_read; + unsigned long long bytes_written; +}; + +struct struct_io_manager { + errcode_t magic; + const char *name; + errcode_t (*open)(const char *name, int flags, io_channel *channel); + errcode_t (*close)(io_channel channel); + errcode_t (*set_blksize)(io_channel channel, int blksize); + errcode_t (*read_blk)(io_channel channel, unsigned long block, + int count, void *data); + errcode_t (*write_blk)(io_channel channel, unsigned long block, + int count, const void *data); + errcode_t (*flush)(io_channel channel); + errcode_t (*write_byte)(io_channel channel, unsigned long offset, + int count, const void *data); + errcode_t (*set_option)(io_channel channel, const char *option, + const char *arg); + errcode_t (*get_stats)(io_channel channel, io_stats *io_stats); + errcode_t (*read_blk64)(io_channel channel, unsigned long long block, + int count, void *data); + errcode_t (*write_blk64)(io_channel channel, unsigned long long block, + int count, const void *data); + long reserved[16]; +}; + +#define IO_FLAG_RW 0x0001 +#define IO_FLAG_EXCLUSIVE 0x0002 +#define IO_FLAG_DIRECT_IO 0x0004 + +/* + * Convenience functions.... + */ +#define io_channel_close(c) ((c)->manager->close((c))) +#define io_channel_set_blksize(c,s) ((c)->manager->set_blksize((c),s)) +#define io_channel_read_blk(c,b,n,d) ((c)->manager->read_blk((c),b,n,d)) +#define io_channel_write_blk(c,b,n,d) ((c)->manager->write_blk((c),b,n,d)) +#define io_channel_flush(c) ((c)->manager->flush((c))) +#define io_channel_bumpcount(c) ((c)->refcount++) + +/* io_manager.c */ +extern errcode_t io_channel_set_options(io_channel channel, + const char *options); +extern errcode_t io_channel_write_byte(io_channel channel, + unsigned long offset, + int count, const void *data); +extern errcode_t io_channel_read_blk64(io_channel channel, + unsigned long long block, + int count, void *data); +extern errcode_t io_channel_write_blk64(io_channel channel, + unsigned long long block, + int count, const void *data); + +/* unix_io.c */ +extern io_manager unix_io_manager; + +/* undo_io.c */ +extern io_manager undo_io_manager; +extern errcode_t set_undo_io_backing_manager(io_manager manager); +extern errcode_t set_undo_io_backup_file(char *file_name); + +/* test_io.c */ +extern io_manager test_io_manager, test_io_backing_manager; +extern void (*test_io_cb_read_blk) + (unsigned long block, int count, errcode_t err); +extern void (*test_io_cb_write_blk) + (unsigned long block, int count, errcode_t err); +extern void (*test_io_cb_read_blk64) + (unsigned long long block, int count, errcode_t err); +extern void (*test_io_cb_write_blk64) + (unsigned long long block, int count, errcode_t err); +extern void (*test_io_cb_set_blksize) + (int blksize, errcode_t err); + +#endif /* _EXT2FS_EXT2_IO_H */ + diff --git a/source/libs/libext2fs/ext2_types.h b/source/libs/libext2fs/ext2_types.h new file mode 100644 index 00000000..5f5f7a57 --- /dev/null +++ b/source/libs/libext2fs/ext2_types.h @@ -0,0 +1,18 @@ +/* + * If linux/types.h is already been included, assume it has defined + * everything we need. (cross fingers) Other header files may have + * also defined the types that we need. + */ +#ifndef _EXT2_TYPES_H +#define _EXT2_TYPES_H + +typedef unsigned char __u8; +typedef signed char __s8; +typedef unsigned short __u16; +typedef short __s16; +typedef unsigned int __u32; +typedef int __s32; +typedef unsigned long long __u64; +typedef signed long long __s64; + +#endif /* _EXT2_TYPES_H */ diff --git a/source/libs/libext2fs/ext2fs.h b/source/libs/libext2fs/ext2fs.h index b55b2179..ce3b88de 100644 --- a/source/libs/libext2fs/ext2fs.h +++ b/source/libs/libext2fs/ext2fs.h @@ -1356,6 +1356,7 @@ extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b); #ifndef EXT2_CUSTOM_MEMORY_ROUTINES #include +#include "mem_allocate.h" /* * Allocate memory */ @@ -1363,7 +1364,7 @@ _INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr) { void *pp; - pp = malloc(size); + pp = mem_alloc(size); if (!pp) return EXT2_ET_NO_MEMORY; memcpy(ptr, &pp, sizeof (pp)); @@ -1376,9 +1377,9 @@ _INLINE_ errcode_t ext2fs_get_memalign(unsigned long size, void *pp; #ifdef HWRVL - pp = memalign(32, size); + pp = mem_align(32, size); #else - pp = malloc(size); + pp = mem_alloc(size); #endif if (!pp) return EXT2_ET_NO_MEMORY; @@ -1402,7 +1403,7 @@ _INLINE_ errcode_t ext2fs_free_mem(void *ptr) void *p; memcpy(&p, ptr, sizeof(p)); - free(p); + mem_free(p); p = 0; memcpy(ptr, &p, sizeof(p)); return 0; @@ -1419,7 +1420,7 @@ _INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_siz /* Use "memcpy" for pointer assignments here to avoid problems * with C99 strict type aliasing rules. */ memcpy(&p, ptr, sizeof(p)); - p = realloc(p, size); + p = mem_realloc(p, size); if (!p) return EXT2_ET_NO_MEMORY; memcpy(ptr, &p, sizeof(p)); diff --git a/source/libs/libext2fs/ext3_extents.h b/source/libs/libext2fs/ext3_extents.h new file mode 100644 index 00000000..88fabc9d --- /dev/null +++ b/source/libs/libext2fs/ext3_extents.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2003,2004 Cluster File Systems, Inc, info@clusterfs.com + * Written by Alex Tomas + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. + * %End-Header% + */ + +#ifndef _LINUX_EXT3_EXTENTS +#define _LINUX_EXT3_EXTENTS + +/* + * ext3_inode has i_block array (total 60 bytes) + * first 4 bytes are used to store: + * - tree depth (0 mean there is no tree yet. all extents in the inode) + * - number of alive extents in the inode + */ + +/* + * this is extent on-disk structure + * it's used at the bottom of the tree + */ +struct ext3_extent { + __u32 ee_block; /* first logical block extent covers */ + __u16 ee_len; /* number of blocks covered by extent */ + __u16 ee_start_hi; /* high 16 bits of physical block */ + __u32 ee_start; /* low 32 bigs of physical block */ +}; + +/* + * this is index on-disk structure + * it's used at all the levels, but the bottom + */ +struct ext3_extent_idx { + __u32 ei_block; /* index covers logical blocks from 'block' */ + __u32 ei_leaf; /* pointer to the physical block of the next * + * level. leaf or next index could bet here */ + __u16 ei_leaf_hi; /* high 16 bits of physical block */ + __u16 ei_unused; +}; + +/* + * each block (leaves and indexes), even inode-stored has header + */ +struct ext3_extent_header { + __u16 eh_magic; /* probably will support different formats */ + __u16 eh_entries; /* number of valid entries */ + __u16 eh_max; /* capacity of store in entries */ + __u16 eh_depth; /* has tree real underlaying blocks? */ + __u32 eh_generation; /* generation of the tree */ +}; + +#define EXT3_EXT_MAGIC 0xf30a + +/* + * array of ext3_ext_path contains path to some extent + * creation/lookup routines use it for traversal/splitting/etc + * truncate uses it to simulate recursive walking + */ +struct ext3_ext_path { + __u32 p_block; + __u16 p_depth; + struct ext3_extent *p_ext; + struct ext3_extent_idx *p_idx; + struct ext3_extent_header *p_hdr; + struct buffer_head *p_bh; +}; + +/* + * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an + * initialized extent. This is 2^15 and not (2^16 - 1), since we use the + * MSB of ee_len field in the extent datastructure to signify if this + * particular extent is an initialized extent or an uninitialized (i.e. + * preallocated). + * EXT_UNINIT_MAX_LEN is the maximum number of blocks we can have in an + * uninitialized extent. + * If ee_len is <= 0x8000, it is an initialized extent. Otherwise, it is an + * uninitialized one. In other words, if MSB of ee_len is set, it is an + * uninitialized extent with only one special scenario when ee_len = 0x8000. + * In this case we can not have an uninitialized extent of zero length and + * thus we make it as a special case of initialized extent with 0x8000 length. + * This way we get better extent-to-group alignment for initialized extents. + * Hence, the maximum number of blocks we can have in an *initialized* + * extent is 2^15 (32768) and in an *uninitialized* extent is 2^15-1 (32767). + */ +#define EXT_INIT_MAX_LEN (1UL << 15) +#define EXT_UNINIT_MAX_LEN (EXT_INIT_MAX_LEN - 1) + +#define EXT_FIRST_EXTENT(__hdr__) \ + ((struct ext3_extent *) (((char *) (__hdr__)) + \ + sizeof(struct ext3_extent_header))) +#define EXT_FIRST_INDEX(__hdr__) \ + ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ + sizeof(struct ext3_extent_header))) +#define EXT_HAS_FREE_INDEX(__path__) \ + ((__path__)->p_hdr->eh_entries < (__path__)->p_hdr->eh_max) +#define EXT_LAST_EXTENT(__hdr__) \ + (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->eh_entries - 1) +#define EXT_LAST_INDEX(__hdr__) \ + (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->eh_entries - 1) +#define EXT_MAX_EXTENT(__hdr__) \ + (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->eh_max - 1) +#define EXT_MAX_INDEX(__hdr__) \ + (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->eh_max - 1) + +#endif /* _LINUX_EXT3_EXTENTS */ + diff --git a/source/libs/libext2fs/libcustomext2fs.a b/source/libs/libext2fs/libcustomext2fs.a new file mode 100644 index 00000000..a53a8496 Binary files /dev/null and b/source/libs/libext2fs/libcustomext2fs.a differ diff --git a/source/libs/libext2fs/mem_allocate.h b/source/libs/libext2fs/mem_allocate.h index 3cbc3064..46a2dd07 100644 --- a/source/libs/libext2fs/mem_allocate.h +++ b/source/libs/libext2fs/mem_allocate.h @@ -2,25 +2,22 @@ #define _MEM_ALLOCATE_H #include +#include "memory/mem2.h" -static inline void* mem_alloc (size_t size) { - return malloc(size); +extern __inline__ void* mem_alloc (size_t size) { + return MEM2_alloc(size); } -static inline void* mem_realloc (void *p, size_t size) { - return realloc(p, size); +extern __inline__ void* mem_realloc (void *p, size_t size) { + return MEM2_realloc(p, size); } -static inline void* mem_align (size_t size) { - #ifdef __wii__ - return memalign(32, size); - #else - return malloc(size); - #endif +extern __inline__ void* mem_align (size_t a, size_t size) { + return MEM2_alloc(size); } -static inline void mem_free (void* mem) { - free(mem); +extern __inline__ void mem_free (void* mem) { + MEM2_free(mem); } #endif /* _MEM_ALLOCATE_H */ diff --git a/source/libs/libwbfs/rijndael.c b/source/libs/libwbfs/rijndael.c index 09790080..473023d9 100644 --- a/source/libs/libwbfs/rijndael.c +++ b/source/libs/libwbfs/rijndael.c @@ -1,432 +1,432 @@ -/* Rijndael Block Cipher - rijndael.c - - Written by Mike Scott 21st April 1999 - mike@compapp.dcu.ie - - Permission for free direct or derivative use is granted subject - to compliance with any conditions that the originators of the - algorithm place on its exploitation. - - */ - -#include -#include - -#define u8 unsigned char /* 8 bits */ -#define u32 unsigned long /* 32 bits */ -#define u64 unsigned long long - -/* rotates x one bit to the left */ - -#define ROTL(x) (((x)>>7)|((x)<<1)) - -/* Rotates 32-bit word left by 1, 2 or 3 byte */ - -#define ROTL8(x) (((x)<<8)|((x)>>24)) -#define ROTL16(x) (((x)<<16)|((x)>>16)) -#define ROTL24(x) (((x)<<24)|((x)>>8)) - -/* Fixed Data */ - -static u8 InCo[4] = { 0xB, 0xD, 0x9, 0xE }; /* Inverse Coefficients */ - -static u8 fbsub[256]; -static u8 rbsub[256]; -static u8 ptab[256], ltab[256]; -static u32 ftable[256]; -static u32 rtable[256]; -static u32 rco[30]; - -/* Parameter-dependent data */ - -int Nk, Nb, Nr; -u8 fi[24], ri[24]; -u32 fkey[120]; -u32 rkey[120]; - -static u32 pack(u8 *b) -{ /* pack bytes into a 32-bit Word */ - return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0]; -} - -static void unpack(u32 a, u8 *b) -{ /* unpack bytes from a word */ - b[0] = (u8 ) a; - b[1] = (u8 ) (a >> 8); - b[2] = (u8 ) (a >> 16); - b[3] = (u8 ) (a >> 24); -} - -static u8 xtime(u8 a) -{ - u8 b; - if (a & 0x80) - b = 0x1B; - else b = 0; - a <<= 1; - a ^= b; - return a; -} - -static u8 bmul(u8 x, u8 y) -{ /* x.y= AntiLog(Log(x) + Log(y)) */ - if (x && y) - return ptab[(ltab[x] + ltab[y]) % 255]; - else return 0; -} - -static u32 SubByte(u32 a) -{ - u8 b[4]; - unpack(a, b); - b[0] = fbsub[b[0]]; - b[1] = fbsub[b[1]]; - b[2] = fbsub[b[2]]; - b[3] = fbsub[b[3]]; - return pack(b); -} - -static u8 product(u32 x, u32 y) -{ /* dot product of two 4-byte arrays */ - u8 xb[4], yb[4]; - unpack(x, xb); - unpack(y, yb); - return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]); -} - -static u32 InvMixCol(u32 x) -{ /* matrix Multiplication */ - u32 y, m; - u8 b[4]; - - m = pack(InCo); - b[3] = product(m, x); - m = ROTL24( m ); - b[2] = product(m, x); - m = ROTL24( m ); - b[1] = product(m, x); - m = ROTL24( m ); - b[0] = product(m, x); - y = pack(b); - return y; -} - -u8 ByteSub(u8 x) -{ - u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */ - x = y; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - x = ROTL( x ); - y ^= x; - y ^= 0x63; - return y; -} - -void gentables(void) -{ /* generate tables */ - int i; - u8 y, b[4]; - - /* use 3 as primitive root to generate power and log tables */ - - ltab[0] = 0; - ptab[0] = 1; - ltab[1] = 0; - ptab[1] = 3; - ltab[3] = 1; - for (i = 2; i < 256; i++) - { - ptab[i] = ptab[i - 1] ^ xtime(ptab[i - 1]); - ltab[ptab[i]] = i; - } - - /* affine transformation:- each bit is xored with itself shifted one bit */ - - fbsub[0] = 0x63; - rbsub[0x63] = 0; - for (i = 1; i < 256; i++) - { - y = ByteSub((u8 ) i); - fbsub[i] = y; - rbsub[y] = i; - } - - for (i = 0, y = 1; i < 30; i++) - { - rco[i] = y; - y = xtime(y); - } - - /* calculate forward and reverse tables */ - for (i = 0; i < 256; i++) - { - y = fbsub[i]; - b[3] = y ^ xtime(y); - b[2] = y; - b[1] = y; - b[0] = xtime(y); - ftable[i] = pack(b); - - y = rbsub[i]; - b[3] = bmul(InCo[0], y); - b[2] = bmul(InCo[1], y); - b[1] = bmul(InCo[2], y); - b[0] = bmul(InCo[3], y); - rtable[i] = pack(b); - } -} - -void gkey(int nb, int nk, char *key) -{ /* blocksize=32*nb bits. Key=32*nk bits */ - /* currently nb,bk = 4, 6 or 8 */ - /* key comes as 4*Nk bytes */ - /* Key Scheduler. Create expanded encryption key */ - int i, j, k, m, N; - int C1, C2, C3; - u32 CipherKey[8]; - - Nb = nb; - Nk = nk; - - /* Nr is number of rounds */ - if (Nb >= Nk) - Nr = 6 + Nb; - else Nr = 6 + Nk; - - C1 = 1; - if (Nb < 8) - { - C2 = 2; - C3 = 3; - } - else - { - C2 = 3; - C3 = 4; - } - - /* pre-calculate forward and reverse increments */ - for (m = j = 0; j < nb; j++, m += 3) - { - fi[m] = (j + C1) % nb; - fi[m + 1] = (j + C2) % nb; - fi[m + 2] = (j + C3) % nb; - ri[m] = (nb + j - C1) % nb; - ri[m + 1] = (nb + j - C2) % nb; - ri[m + 2] = (nb + j - C3) % nb; - } - - N = Nb * (Nr + 1); - - for (i = j = 0; i < Nk; i++, j += 4) - { - CipherKey[i] = pack((u8 *) &key[j]); - } - for (i = 0; i < Nk; i++) - fkey[i] = CipherKey[i]; - for (j = Nk, k = 0; j < N; j += Nk, k++) - { - fkey[j] = fkey[j - Nk] ^ SubByte(ROTL24( fkey[j-1] )) ^ rco[k]; - if (Nk <= 6) - { - for (i = 1; i < Nk && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - } - else - { - for (i = 1; i < 4 && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - if ((j + 4) < N) fkey[j + 4] = fkey[j + 4 - Nk] ^ SubByte(fkey[j + 3]); - for (i = 5; i < Nk && (i + j) < N; i++) - fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; - } - - } - - /* now for the expanded decrypt key in reverse order */ - - for (j = 0; j < Nb; j++) - rkey[j + N - Nb] = fkey[j]; - for (i = Nb; i < N - Nb; i += Nb) - { - k = N - Nb - i; - for (j = 0; j < Nb; j++) - rkey[k + j] = InvMixCol(fkey[i + j]); - } - for (j = N - Nb; j < N; j++) - rkey[j - N + Nb] = fkey[j]; -} - -/* There is an obvious time/space trade-off possible here. * - * Instead of just one ftable[], I could have 4, the other * - * 3 pre-rotated to save the ROTL8, ROTL16 and ROTL24 overhead */ - -void encrypt(char *buff) -{ - int i, j, k, m; - u32 a[8], b[8], *x, *y, *t; - - for (i = j = 0; i < Nb; i++, j += 4) - { - a[i] = pack((u8 *) &buff[j]); - a[i] ^= fkey[i]; - } - k = Nb; - x = a; - y = b; - - /* State alternates between a and b */ - for (i = 1; i < Nr; i++) - { /* Nr is number of rounds. May be odd. */ - - /* if Nb is fixed - unroll this next - loop and hard-code in the values of fi[] */ - - for (m = j = 0; j < Nb; j++, m += 3) - { /* deal with each 32-bit element of the State */ - /* This is the time-critical bit */ - y[j] = fkey[k++] ^ ftable[(u8 ) x[j]] ^ ROTL8( ftable[( u8 )( x[fi[m]] >> 8 )] ) - ^ ROTL16( ftable[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ftable[x[fi[m+2]] >> 24] ); - } - t = x; - x = y; - y = t; /* swap pointers */ - } - - /* Last Round - unroll if possible */ - for (m = j = 0; j < Nb; j++, m += 3) - { - y[j] = fkey[k++] ^ (u32 ) fbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )fbsub[( u8 )( x[fi[m]] >> 8 )] ) - ^ ROTL16( ( u32 )fbsub[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )fbsub[x[fi[m+2]] >> 24] ); - } - for (i = j = 0; i < Nb; i++, j += 4) - { - unpack(y[i], (u8 *) &buff[j]); - x[i] = y[i] = 0; /* clean up stack */ - } - return; -} - -void decrypt(char *buff) -{ - int i, j, k, m; - u32 a[8], b[8], *x, *y, *t; - - for (i = j = 0; i < Nb; i++, j += 4) - { - a[i] = pack((u8 *) &buff[j]); - a[i] ^= rkey[i]; - } - k = Nb; - x = a; - y = b; - - /* State alternates between a and b */ - for (i = 1; i < Nr; i++) - { /* Nr is number of rounds. May be odd. */ - - /* if Nb is fixed - unroll this next - loop and hard-code in the values of ri[] */ - - for (m = j = 0; j < Nb; j++, m += 3) - { /* This is the time-critical bit */ - y[j] = rkey[k++] ^ rtable[(u8 ) x[j]] ^ ROTL8( rtable[( u8 )( x[ri[m]] >> 8 )] ) - ^ ROTL16( rtable[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( rtable[x[ri[m+2]] >> 24] ); - } - t = x; - x = y; - y = t; /* swap pointers */ - } - - /* Last Round - unroll if possible */ - for (m = j = 0; j < Nb; j++, m += 3) - { - y[j] = rkey[k++] ^ (u32 ) rbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )rbsub[( u8 )( x[ri[m]] >> 8 )] ) - ^ ROTL16( ( u32 )rbsub[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )rbsub[x[ri[m+2]] >> 24] ); - } - for (i = j = 0; i < Nb; i++, j += 4) - { - unpack(y[i], (u8 *) &buff[j]); - x[i] = y[i] = 0; /* clean up stack */ - } - return; -} - -void aes_set_key(u8 *key) -{ - gentables(); - gkey(4, 4, (char*) key); -} - -// CBC mode decryption -void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) -{ - u8 block[16]; - unsigned int blockno = 0, i; - - //printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); - - for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) - { - unsigned int fraction; - if (blockno == (len / sizeof(block))) // last block - { - fraction = len % sizeof(block); - if (fraction == 0) break; - memset(block, 0, sizeof(block)); - } - else fraction = 16; - - // debug_printf("block %d: fraction = %d\n", blockno, fraction); - memcpy(block, inbuf + blockno * sizeof(block), fraction); - decrypt((char*) block); - u8 *ctext_ptr; - if (blockno == 0) - ctext_ptr = iv; - else ctext_ptr = inbuf + (blockno - 1) * sizeof(block); - - for (i = 0; i < fraction; i++) - outbuf[blockno * sizeof(block) + i] = ctext_ptr[i] ^ block[i]; - // debug_printf("Block %d output: ", blockno); - // hexdump(outbuf + blockno*sizeof(block), 16); - } -} - -// CBC mode encryption -void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) -{ - u8 block[16]; - unsigned int blockno = 0, i; - - // debug_printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); - - for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) - { - unsigned int fraction; - if (blockno == (len / sizeof(block))) // last block - { - fraction = len % sizeof(block); - if (fraction == 0) break; - memset(block, 0, sizeof(block)); - } - else fraction = 16; - - // debug_printf("block %d: fraction = %d\n", blockno, fraction); - memcpy(block, inbuf + blockno * sizeof(block), fraction); - - for (i = 0; i < fraction; i++) - block[i] = inbuf[blockno * sizeof(block) + i] ^ iv[i]; - - encrypt((char*) block); - memcpy(iv, block, sizeof(block)); - memcpy(outbuf + blockno * sizeof(block), block, sizeof(block)); - // debug_printf("Block %d output: ", blockno); - // hexdump(outbuf + blockno*sizeof(block), 16); - } -} - +/* Rijndael Block Cipher - rijndael.c + + Written by Mike Scott 21st April 1999 + mike@compapp.dcu.ie + + Permission for free direct or derivative use is granted subject + to compliance with any conditions that the originators of the + algorithm place on its exploitation. + + */ + +#include +#include + +#define u8 unsigned char /* 8 bits */ +#define u32 unsigned long /* 32 bits */ +#define u64 unsigned long long + +/* rotates x one bit to the left */ + +#define ROTL(x) (((x)>>7)|((x)<<1)) + +/* Rotates 32-bit word left by 1, 2 or 3 byte */ + +#define ROTL8(x) (((x)<<8)|((x)>>24)) +#define ROTL16(x) (((x)<<16)|((x)>>16)) +#define ROTL24(x) (((x)<<24)|((x)>>8)) + +/* Fixed Data */ + +static u8 InCo[4] = { 0xB, 0xD, 0x9, 0xE }; /* Inverse Coefficients */ + +static u8 fbsub[256]; +static u8 rbsub[256]; +static u8 ptab[256], ltab[256]; +static u32 ftable[256]; +static u32 rtable[256]; +static u32 rco[30]; + +/* Parameter-dependent data */ + +int Nk, Nb, Nr; +u8 fi[24], ri[24]; +u32 fkey[120]; +u32 rkey[120]; + +static u32 pack(u8 *b) +{ /* pack bytes into a 32-bit Word */ + return ((u32 ) b[3] << 24) | ((u32 ) b[2] << 16) | ((u32 ) b[1] << 8) | (u32 ) b[0]; +} + +static void unpack(u32 a, u8 *b) +{ /* unpack bytes from a word */ + b[0] = (u8 ) a; + b[1] = (u8 ) (a >> 8); + b[2] = (u8 ) (a >> 16); + b[3] = (u8 ) (a >> 24); +} + +static u8 xtime(u8 a) +{ + u8 b; + if (a & 0x80) + b = 0x1B; + else b = 0; + a <<= 1; + a ^= b; + return a; +} + +static u8 bmul(u8 x, u8 y) +{ /* x.y= AntiLog(Log(x) + Log(y)) */ + if (x && y) + return ptab[(ltab[x] + ltab[y]) % 255]; + else return 0; +} + +static u32 SubByte(u32 a) +{ + u8 b[4]; + unpack(a, b); + b[0] = fbsub[b[0]]; + b[1] = fbsub[b[1]]; + b[2] = fbsub[b[2]]; + b[3] = fbsub[b[3]]; + return pack(b); +} + +static u8 product(u32 x, u32 y) +{ /* dot product of two 4-byte arrays */ + u8 xb[4], yb[4]; + unpack(x, xb); + unpack(y, yb); + return bmul(xb[0], yb[0]) ^ bmul(xb[1], yb[1]) ^ bmul(xb[2], yb[2]) ^ bmul(xb[3], yb[3]); +} + +static u32 InvMixCol(u32 x) +{ /* matrix Multiplication */ + u32 y, m; + u8 b[4]; + + m = pack(InCo); + b[3] = product(m, x); + m = ROTL24( m ); + b[2] = product(m, x); + m = ROTL24( m ); + b[1] = product(m, x); + m = ROTL24( m ); + b[0] = product(m, x); + y = pack(b); + return y; +} + +u8 ByteSub(u8 x) +{ + u8 y = ptab[255 - ltab[x]]; /* multiplicative inverse */ + x = y; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + x = ROTL( x ); + y ^= x; + y ^= 0x63; + return y; +} + +void gentables(void) +{ /* generate tables */ + int i; + u8 y, b[4]; + + /* use 3 as primitive root to generate power and log tables */ + + ltab[0] = 0; + ptab[0] = 1; + ltab[1] = 0; + ptab[1] = 3; + ltab[3] = 1; + for (i = 2; i < 256; i++) + { + ptab[i] = ptab[i - 1] ^ xtime(ptab[i - 1]); + ltab[ptab[i]] = i; + } + + /* affine transformation:- each bit is xored with itself shifted one bit */ + + fbsub[0] = 0x63; + rbsub[0x63] = 0; + for (i = 1; i < 256; i++) + { + y = ByteSub((u8 ) i); + fbsub[i] = y; + rbsub[y] = i; + } + + for (i = 0, y = 1; i < 30; i++) + { + rco[i] = y; + y = xtime(y); + } + + /* calculate forward and reverse tables */ + for (i = 0; i < 256; i++) + { + y = fbsub[i]; + b[3] = y ^ xtime(y); + b[2] = y; + b[1] = y; + b[0] = xtime(y); + ftable[i] = pack(b); + + y = rbsub[i]; + b[3] = bmul(InCo[0], y); + b[2] = bmul(InCo[1], y); + b[1] = bmul(InCo[2], y); + b[0] = bmul(InCo[3], y); + rtable[i] = pack(b); + } +} + +void gkey(int nb, int nk, char *key) +{ /* blocksize=32*nb bits. Key=32*nk bits */ + /* currently nb,bk = 4, 6 or 8 */ + /* key comes as 4*Nk bytes */ + /* Key Scheduler. Create expanded encryption key */ + int i, j, k, m, N; + int C1, C2, C3; + u32 CipherKey[8]; + + Nb = nb; + Nk = nk; + + /* Nr is number of rounds */ + if (Nb >= Nk) + Nr = 6 + Nb; + else Nr = 6 + Nk; + + C1 = 1; + if (Nb < 8) + { + C2 = 2; + C3 = 3; + } + else + { + C2 = 3; + C3 = 4; + } + + /* pre-calculate forward and reverse increments */ + for (m = j = 0; j < nb; j++, m += 3) + { + fi[m] = (j + C1) % nb; + fi[m + 1] = (j + C2) % nb; + fi[m + 2] = (j + C3) % nb; + ri[m] = (nb + j - C1) % nb; + ri[m + 1] = (nb + j - C2) % nb; + ri[m + 2] = (nb + j - C3) % nb; + } + + N = Nb * (Nr + 1); + + for (i = j = 0; i < Nk; i++, j += 4) + { + CipherKey[i] = pack((u8 *) &key[j]); + } + for (i = 0; i < Nk; i++) + fkey[i] = CipherKey[i]; + for (j = Nk, k = 0; j < N; j += Nk, k++) + { + fkey[j] = fkey[j - Nk] ^ SubByte(ROTL24( fkey[j-1] )) ^ rco[k]; + if (Nk <= 6) + { + for (i = 1; i < Nk && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + } + else + { + for (i = 1; i < 4 && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + if ((j + 4) < N) fkey[j + 4] = fkey[j + 4 - Nk] ^ SubByte(fkey[j + 3]); + for (i = 5; i < Nk && (i + j) < N; i++) + fkey[i + j] = fkey[i + j - Nk] ^ fkey[i + j - 1]; + } + + } + + /* now for the expanded decrypt key in reverse order */ + + for (j = 0; j < Nb; j++) + rkey[j + N - Nb] = fkey[j]; + for (i = Nb; i < N - Nb; i += Nb) + { + k = N - Nb - i; + for (j = 0; j < Nb; j++) + rkey[k + j] = InvMixCol(fkey[i + j]); + } + for (j = N - Nb; j < N; j++) + rkey[j - N + Nb] = fkey[j]; +} + +/* There is an obvious time/space trade-off possible here. * + * Instead of just one ftable[], I could have 4, the other * + * 3 pre-rotated to save the ROTL8, ROTL16 and ROTL24 overhead */ + +void encrypt(char *buff) +{ + int i, j, k, m; + u32 a[8], b[8], *x, *y, *t; + + for (i = j = 0; i < Nb; i++, j += 4) + { + a[i] = pack((u8 *) &buff[j]); + a[i] ^= fkey[i]; + } + k = Nb; + x = a; + y = b; + + /* State alternates between a and b */ + for (i = 1; i < Nr; i++) + { /* Nr is number of rounds. May be odd. */ + + /* if Nb is fixed - unroll this next + loop and hard-code in the values of fi[] */ + + for (m = j = 0; j < Nb; j++, m += 3) + { /* deal with each 32-bit element of the State */ + /* This is the time-critical bit */ + y[j] = fkey[k++] ^ ftable[(u8 ) x[j]] ^ ROTL8( ftable[( u8 )( x[fi[m]] >> 8 )] ) + ^ ROTL16( ftable[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ftable[x[fi[m+2]] >> 24] ); + } + t = x; + x = y; + y = t; /* swap pointers */ + } + + /* Last Round - unroll if possible */ + for (m = j = 0; j < Nb; j++, m += 3) + { + y[j] = fkey[k++] ^ (u32 ) fbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )fbsub[( u8 )( x[fi[m]] >> 8 )] ) + ^ ROTL16( ( u32 )fbsub[( u8 )( x[fi[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )fbsub[x[fi[m+2]] >> 24] ); + } + for (i = j = 0; i < Nb; i++, j += 4) + { + unpack(y[i], (u8 *) &buff[j]); + x[i] = y[i] = 0; /* clean up stack */ + } + return; +} + +void decrypt(char *buff) +{ + int i, j, k, m; + u32 a[8], b[8], *x, *y, *t; + + for (i = j = 0; i < Nb; i++, j += 4) + { + a[i] = pack((u8 *) &buff[j]); + a[i] ^= rkey[i]; + } + k = Nb; + x = a; + y = b; + + /* State alternates between a and b */ + for (i = 1; i < Nr; i++) + { /* Nr is number of rounds. May be odd. */ + + /* if Nb is fixed - unroll this next + loop and hard-code in the values of ri[] */ + + for (m = j = 0; j < Nb; j++, m += 3) + { /* This is the time-critical bit */ + y[j] = rkey[k++] ^ rtable[(u8 ) x[j]] ^ ROTL8( rtable[( u8 )( x[ri[m]] >> 8 )] ) + ^ ROTL16( rtable[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( rtable[x[ri[m+2]] >> 24] ); + } + t = x; + x = y; + y = t; /* swap pointers */ + } + + /* Last Round - unroll if possible */ + for (m = j = 0; j < Nb; j++, m += 3) + { + y[j] = rkey[k++] ^ (u32 ) rbsub[(u8 ) x[j]] ^ ROTL8( ( u32 )rbsub[( u8 )( x[ri[m]] >> 8 )] ) + ^ ROTL16( ( u32 )rbsub[( u8 )( x[ri[m+1]] >> 16 )] ) ^ ROTL24( ( u32 )rbsub[x[ri[m+2]] >> 24] ); + } + for (i = j = 0; i < Nb; i++, j += 4) + { + unpack(y[i], (u8 *) &buff[j]); + x[i] = y[i] = 0; /* clean up stack */ + } + return; +} + +void aes_set_key(u8 *key) +{ + gentables(); + gkey(4, 4, (char*) key); +} + +// CBC mode decryption +void aes_decrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) +{ + u8 block[16]; + unsigned int blockno = 0, i; + + //printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); + + for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) + { + unsigned int fraction; + if (blockno == (len / sizeof(block))) // last block + { + fraction = len % sizeof(block); + if (fraction == 0) break; + memset(block, 0, sizeof(block)); + } + else fraction = 16; + + // debug_printf("block %d: fraction = %d\n", blockno, fraction); + memcpy(block, inbuf + blockno * sizeof(block), fraction); + decrypt((char*) block); + u8 *ctext_ptr; + if (blockno == 0) + ctext_ptr = iv; + else ctext_ptr = inbuf + (blockno - 1) * sizeof(block); + + for (i = 0; i < fraction; i++) + outbuf[blockno * sizeof(block) + i] = ctext_ptr[i] ^ block[i]; + // debug_printf("Block %d output: ", blockno); + // hexdump(outbuf + blockno*sizeof(block), 16); + } +} + +// CBC mode encryption +void aes_encrypt(u8 *iv, u8 *inbuf, u8 *outbuf, unsigned long long len) +{ + u8 block[16]; + unsigned int blockno = 0, i; + + // debug_printf("aes_decrypt(%p, %p, %p, %lld)\n", iv, inbuf, outbuf, len); + + for (blockno = 0; blockno <= (len / sizeof(block)); blockno++) + { + unsigned int fraction; + if (blockno == (len / sizeof(block))) // last block + { + fraction = len % sizeof(block); + if (fraction == 0) break; + memset(block, 0, sizeof(block)); + } + else fraction = 16; + + // debug_printf("block %d: fraction = %d\n", blockno, fraction); + memcpy(block, inbuf + blockno * sizeof(block), fraction); + + for (i = 0; i < fraction; i++) + block[i] = inbuf[blockno * sizeof(block) + i] ^ iv[i]; + + encrypt((char*) block); + memcpy(iv, block, sizeof(block)); + memcpy(outbuf + blockno * sizeof(block), block, sizeof(block)); + // debug_printf("Block %d output: ", blockno); + // hexdump(outbuf + blockno*sizeof(block), 16); + } +} + diff --git a/source/libs/libwbfs/wiidisc.h b/source/libs/libwbfs/wiidisc.h index 3cd6bcc0..c2bb0636 100644 --- a/source/libs/libwbfs/wiidisc.h +++ b/source/libs/libwbfs/wiidisc.h @@ -1,68 +1,68 @@ -#ifndef WIIDISC_H -#define WIIDISC_H -#include -#include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs and wiidisc -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ -#if 0 //removes extra automatic indentation by editors -} -#endif - // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) - // offset points 32bit words, count counts bytes - typedef int (*read_wiidisc_callback_t)(void*fp, u32 offset, u32 count, void*iobuf); - - typedef enum - { - UPDATE_PARTITION_TYPE = 0, GAME_PARTITION_TYPE, OTHER_PARTITION_TYPE, - // value in between selects partition types of that value - ALL_PARTITIONS = 0xffffffff - 3, - REMOVE_UPDATE_PARTITION, // keeps game + channel installers - ONLY_GAME_PARTITION, - } partition_selector_t; - - typedef struct wiidisc_s - { - read_wiidisc_callback_t read; - void *fp; - u8 *sector_usage_table; - - // everything points 32bit words. - u32 disc_raw_offset; - u32 partition_raw_offset; - u32 partition_data_offset; - u32 partition_data_size; - u32 partition_block; - - u8 *tmp_buffer; - u8 *tmp_buffer2; - u8 disc_key[16]; - int dont_decrypt; - - partition_selector_t part_sel; - - char *extract_pathname; - u8 *extracted_buffer; - int extracted_size; - } wiidisc_t; - - wiidisc_t *wd_open_disc(read_wiidisc_callback_t read, void*fp); - void wd_close_disc(wiidisc_t *); - // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error - u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname); - - void wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table); - - // effectively remove not copied partition from the partition table. - void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table); - u8 * wd_get_fst(wiidisc_t *d, partition_selector_t partition_type); - -#if 0 -{ -#endif -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif +#ifndef WIIDISC_H +#define WIIDISC_H +#include +#include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs and wiidisc +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ +#if 0 //removes extra automatic indentation by editors +} +#endif + // callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..) + // offset points 32bit words, count counts bytes + typedef int (*read_wiidisc_callback_t)(void*fp, u32 offset, u32 count, void*iobuf); + + typedef enum + { + UPDATE_PARTITION_TYPE = 0, GAME_PARTITION_TYPE, OTHER_PARTITION_TYPE, + // value in between selects partition types of that value + ALL_PARTITIONS = 0xffffffff - 3, + REMOVE_UPDATE_PARTITION, // keeps game + channel installers + ONLY_GAME_PARTITION, + } partition_selector_t; + + typedef struct wiidisc_s + { + read_wiidisc_callback_t read; + void *fp; + u8 *sector_usage_table; + + // everything points 32bit words. + u32 disc_raw_offset; + u32 partition_raw_offset; + u32 partition_data_offset; + u32 partition_data_size; + u32 partition_block; + + u8 *tmp_buffer; + u8 *tmp_buffer2; + u8 disc_key[16]; + int dont_decrypt; + + partition_selector_t part_sel; + + char *extract_pathname; + u8 *extracted_buffer; + int extracted_size; + } wiidisc_t; + + wiidisc_t *wd_open_disc(read_wiidisc_callback_t read, void*fp); + void wd_close_disc(wiidisc_t *); + // returns a buffer allocated with wbfs_ioalloc() or NULL if not found of alloc error + u8 * wd_extract_file(wiidisc_t *d, partition_selector_t partition_type, char *pathname); + + void wd_build_disc_usage(wiidisc_t *d, partition_selector_t selector, u8* usage_table); + + // effectively remove not copied partition from the partition table. + void wd_fix_partition_table(wiidisc_t *d, partition_selector_t selector, u8* partition_table); + u8 * wd_get_fst(wiidisc_t *d, partition_selector_t partition_type); + +#if 0 +{ +#endif +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h index 340d5bb2..a7ab4ec2 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -968,8 +968,6 @@ class GuiNumpad: public GuiWindow GuiImageData * keyTextbox; GuiImageData * keyMedium; GuiImageData * keyMediumOver; - GuiSound * keySoundOver; - GuiSound * keySoundClick; GuiTrigger * trigA; GuiTrigger * trigB; }; @@ -1026,8 +1024,6 @@ class GuiOptionBrowser: public GuiElement GuiImageData * scrollbarBox; GuiImageData * scrollbarBoxOver; - GuiSound * btnSoundOver; - GuiSound * btnSoundClick; GuiTrigger * trigA; GuiTrigger * trigB; GuiTrigger * trigHeldA; @@ -1088,8 +1084,6 @@ class GuiFileBrowser: public GuiElement GuiImageData * arrowUp; GuiImageData * scrollbarBox; - GuiSound * btnSoundOver; - GuiSound * btnSoundClick; GuiTrigger * trigA; GuiTrigger * trigHeldA; }; diff --git a/source/libwiigui/gui_element.cpp b/source/libwiigui/gui_element.cpp index f91337fb..8c31bc6b 100644 --- a/source/libwiigui/gui_element.cpp +++ b/source/libwiigui/gui_element.cpp @@ -1,820 +1,820 @@ -/**************************************************************************** - * libwiigui - * - * Tantric 2009 - * - * gui_element.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" - -/** - * Constructor for the Object class. - */ -//mutex_t GuiElement::mutex = LWP_MUTEX_NULL; -mutex_t GuiElement::_lock_mutex = LWP_MUTEX_NULL; -GuiElement::GuiElement() -{ - xoffset = 0; - yoffset = 0; - zoffset = 0; - xmin = 0; - xmax = 0; - ymin = 0; - ymax = 0; - width = 0; - height = 0; - alpha = 255; - scale = 1; - state = STATE_DEFAULT; - stateChan = -1; - trigger[0] = NULL; - trigger[1] = NULL; - trigger[2] = NULL; - trigger[3] = NULL; - trigger[4] = NULL; - trigger[5] = NULL; - parentElement = NULL; - rumble = true; - selectable = false; - clickable = false; - holdable = false; - visible = true; - focus = -1; // cannot be focused - updateCB = NULL; - yoffsetDyn = 0; - xoffsetDyn = 0; - yoffsetDynFloat = 0; - alphaDyn = -1; - scaleDyn = 1; - effects = 0; - effectAmount = 0; - effectTarget = 0; - effectsOver = 0; - effectAmountOver = 0; - effectTargetOver = 0; - frequency = 0.0f; - changervar = 0; - degree = -90.0f; - circleamount = 360.0f; - Radius = 150; - angleDyn = 0.0f; - anglespeed = 0.0f; - - // default alignment - align to top left - alignmentVert = ALIGN_TOP; - alignmentHor = ALIGN_LEFT; - // if(mutex == LWP_MUTEX_NULL) LWP_MutexInit(&mutex, true); - if (_lock_mutex == LWP_MUTEX_NULL) LWP_MutexInit(&_lock_mutex, true); - _lock_thread = LWP_THREAD_NULL; - _lock_count = 0; - _lock_queue = LWP_TQUEUE_NULL; - -} - -/** - * Destructor for the GuiElement class. - */ -GuiElement::~GuiElement() -{ - // LWP_MutexDestroy(mutex); -} - -void GuiElement::SetParent(GuiElement * e) -{ - LOCK( this ); - parentElement = e; -} - -GuiElement * GuiElement::GetParent() -{ - return parentElement; -} -/** - * Get the left position of the GuiElement. - * @see SetLeft() - * @return Left position in pixel. - */ -int GuiElement::GetLeft() -{ - int x = 0; - int pWidth = 0; - int pLeft = 0; - - if (parentElement) - { - pWidth = parentElement->GetWidth(); - pLeft = parentElement->GetLeft(); - } - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pLeft += xoffsetDyn; - - switch (alignmentHor) - { - case ALIGN_LEFT: - x = pLeft; - break; - case ALIGN_CENTRE: - x = pLeft + (pWidth / 2) - (width / 2); - break; - case ALIGN_RIGHT: - x = pLeft + pWidth - width; - break; - } - return x + xoffset; -} - -/** - * Get the top position of the GuiElement. - * @see SetTop() - * @return Top position in pixel. - */ -int GuiElement::GetTop() -{ - int y = 0; - int pHeight = 0; - int pTop = 0; - - if (parentElement) - { - pHeight = parentElement->GetHeight(); - pTop = parentElement->GetTop(); - } - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pTop += yoffsetDyn; - - switch (alignmentVert) - { - case ALIGN_TOP: - y = pTop; - break; - case ALIGN_MIDDLE: - y = pTop + (pHeight / 2) - (height / 2); - break; - case ALIGN_BOTTOM: - y = pTop + pHeight - height; - break; - } - return y + yoffset; -} - -void GuiElement::SetMinX(int x) -{ - LOCK( this ); - xmin = x; -} - -int GuiElement::GetMinX() -{ - return xmin; -} - -void GuiElement::SetMaxX(int x) -{ - LOCK( this ); - xmax = x; -} - -int GuiElement::GetMaxX() -{ - return xmax; -} - -void GuiElement::SetMinY(int y) -{ - LOCK( this ); - ymin = y; -} - -int GuiElement::GetMinY() -{ - return ymin; -} - -void GuiElement::SetMaxY(int y) -{ - LOCK( this ); - ymax = y; -} - -int GuiElement::GetMaxY() -{ - return ymax; -} - -/** - * Get the width of the GuiElement. - * @see SetWidth() - * @return Width of the GuiElement. - */ -int GuiElement::GetWidth() -{ - return width; -} - -/** - * Get the height of the GuiElement. - * @see SetHeight() - * @return Height of the GuiElement. - */ -int GuiElement::GetHeight() -{ - return height; -} - -/** - * Set the width and height of the GuiElement. - * @param[in] Width Width in pixel. - * @param[in] Height Height in pixel. - * @see SetWidth() - * @see SetHeight() - */ -void GuiElement::SetSize(int w, int h) -{ - LOCK( this ); - - width = w; - height = h; -} - -/** - * Get visible. - * @see SetVisible() - * @return true if visible, false otherwise. - */ -bool GuiElement::IsVisible() -{ - return visible; -} - -/** - * Set visible. - * @param[in] Visible Set to true to show GuiElement. - * @see IsVisible() - */ -void GuiElement::SetVisible(bool v) -{ - LOCK( this ); - visible = v; -} - -void GuiElement::SetAlpha(int a) -{ - LOCK( this ); - alpha = a; -} - -int GuiElement::GetAlpha() -{ - int a; - - if (alphaDyn >= 0) - a = alphaDyn; - else a = alpha; - - if (parentElement) a *= parentElement->GetAlpha() / 255.0; - - return a; -} - -float GuiElement::GetAngleDyn() -{ - float a = 0.0; - - if (angleDyn) a = angleDyn; - - if (parentElement && !angleDyn) a = parentElement->GetAngleDyn(); - - return a; -} - -void GuiElement::SetScale(float s) -{ - LOCK( this ); - scale = s; -} - -float GuiElement::GetScale() -{ - float s = scale * scaleDyn; - - if (parentElement) s *= parentElement->GetScale(); - - return s; -} - -int GuiElement::GetState() -{ - return state; -} - -int GuiElement::GetStateChan() -{ - return stateChan; -} - -void GuiElement::SetState(int s, int c) -{ - LOCK( this ); - state = s; - stateChan = c; -} - -void GuiElement::ResetState() -{ - LOCK( this ); - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } -} - -void GuiElement::SetClickable(bool c) -{ - LOCK( this ); - clickable = c; -} - -void GuiElement::SetSelectable(bool s) -{ - LOCK( this ); - selectable = s; -} - -void GuiElement::SetHoldable(bool d) -{ - LOCK( this ); - holdable = d; -} - -bool GuiElement::IsSelectable() -{ - if (state == STATE_DISABLED || state == STATE_CLICKED) - return false; - else return selectable; -} - -bool GuiElement::IsClickable() -{ - if (state == STATE_DISABLED || state == STATE_CLICKED || state == STATE_HELD) - return false; - else return clickable; -} - -bool GuiElement::IsHoldable() -{ - if (state == STATE_DISABLED) - return false; - else return holdable; -} - -void GuiElement::SetFocus(int f) -{ - LOCK( this ); - focus = f; -} - -int GuiElement::IsFocused() -{ - return focus; -} - -void GuiElement::SetTrigger(GuiTrigger * t) -{ - LOCK( this ); - if (!trigger[0]) - trigger[0] = t; - else if (!trigger[1]) - trigger[1] = t; - else if (!trigger[2]) - trigger[2] = t; - else if (!trigger[3]) - trigger[3] = t; - else if (!trigger[4]) - trigger[4] = t; - else if (!trigger[5]) - trigger[5] = t; - else // both were assigned, so we'll just overwrite the first one - trigger[0] = t; -} - -void GuiElement::SetTrigger(u8 i, GuiTrigger * t) -{ - LOCK( this ); - trigger[i] = t; -} - -void GuiElement::RemoveTrigger(u8 i) -{ - LOCK( this ); - trigger[i] = NULL; -} - -bool GuiElement::Rumble() -{ - return rumble; -} - -void GuiElement::SetRumble(bool r) -{ - LOCK( this ); - rumble = r; -} - -int GuiElement::GetEffect() -{ - LOCK( this ); - return effects; -} - -int GuiElement::GetEffectOnOver() -{ - LOCK( this ); - return effectsOver; -} - -float GuiElement::GetFrequency() -{ - LOCK( this ); - return frequency; -} - -void GuiElement::SetEffect(int eff, int speed, f32 circles, int r, f32 startdegree, f32 anglespeedset, int center_x, - int center_y) -{ - - if (eff & EFFECT_GOROUND) - { - xoffsetDyn = 0; //!position of circle in x - yoffsetDyn = 0; //!position of circle in y - Radius = r; //!radius of the circle - degree = startdegree; //!for example -90 (°) to start at top of circle - circleamount = circles; //!circleamoutn in degrees for example 360 for 1 circle - angleDyn = 0.0f; //!this is used by the code to calc the angle - anglespeed = anglespeedset; //!This is anglespeed depending on circle speed 1 is same speed and 0.5 half speed - temp_xoffset = center_x; //!position of center in x - temp_yoffset = center_y; //!position of center in y - } - effects |= eff; - effectAmount = speed; //!Circlespeed -} - -void GuiElement::SetEffect(int eff, int amount, int target) -{ - LOCK( this ); - if (eff & EFFECT_SLIDE_IN) - { - // these calculations overcompensate a little - if (eff & EFFECT_SLIDE_TOP) - yoffsetDyn = -screenheight; - else if (eff & EFFECT_SLIDE_LEFT) - xoffsetDyn = -screenwidth; - else if (eff & EFFECT_SLIDE_BOTTOM) - yoffsetDyn = screenheight; - else if (eff & EFFECT_SLIDE_RIGHT) xoffsetDyn = screenwidth; - } - - if (eff & EFFECT_FADE && amount > 0) - { - alphaDyn = 0; - } - else if (eff & EFFECT_FADE && amount < 0) - { - alphaDyn = alpha; - - } - else if (eff & EFFECT_ROCK_VERTICLE) - { - changervar = 0; - yoffsetDyn = 0; - yoffsetDynFloat = 0.0; - } - - effects |= eff; - effectAmount = amount; - effectTarget = target; -} - -void GuiElement::SetEffectOnOver(int eff, int amount, int target) -{ - LOCK( this ); - effectsOver |= eff; - effectAmountOver = amount; - effectTargetOver = target; -} - -void GuiElement::SetEffectGrow() -{ - SetEffectOnOver(EFFECT_SCALE, 4, 110); -} - -void GuiElement::StopEffect() -{ - xoffsetDyn = 0; - yoffsetDyn = 0; - effects = 0; - effectsOver = 0; - effectAmount = 0; - effectAmountOver = 0; - effectTarget = 0; - effectTargetOver = 0; - scaleDyn = 1; - frequency = 0.0f; - changervar = 0; - //angleDyn = 0.0f; - anglespeed = 0.0f; -} - -void GuiElement::UpdateEffects() -{ - LOCK( this ); - - if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND)) - { - if (effects & EFFECT_SLIDE_IN) - { - if (effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn += effectAmount; - - if (xoffsetDyn >= 0) - { - xoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn -= effectAmount; - - if (xoffsetDyn <= 0) - { - xoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn += effectAmount; - - if (yoffsetDyn >= 0) - { - yoffsetDyn = 0; - effects = 0; - } - } - else if (effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn -= effectAmount; - - if (yoffsetDyn <= 0) - { - yoffsetDyn = 0; - effects = 0; - } - } - } - else - { - if (effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn -= effectAmount; - - if (xoffsetDyn <= -screenwidth) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn += effectAmount; - - if (xoffsetDyn >= screenwidth) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn -= effectAmount; - - if (yoffsetDyn <= -screenheight) effects = 0; // shut off effect - } - else if (effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn += effectAmount; - - if (yoffsetDyn >= screenheight) effects = 0; // shut off effect - } - } - } - - if (effects & EFFECT_GOROUND) - { - //!< check out gui.h for info - xoffset = temp_xoffset; - yoffset = temp_yoffset; - if (fabs(frequency) < circleamount) - { - angleDyn = (frequency + degree + 90.0f) * anglespeed; - xoffsetDyn = (int) lround(((f32) Radius) * cos((frequency + degree) * PI / 180.0f)); - yoffsetDyn = (int) lround(((f32) Radius) * sin((frequency + degree) * PI / 180.0f)); - frequency += ((f32) effectAmount) * 0.01f; - } - else - { - f32 temp_frequency = ((effectAmount < 0) ? -1.0f : 1.0f) * circleamount; - angleDyn = (temp_frequency + degree + 90.0f) * anglespeed; - xoffsetDyn = (int) lround(((f32) Radius) * cos((temp_frequency + degree) * PI / 180.0f)); - yoffsetDyn = (int) lround(((f32) Radius) * sin((temp_frequency + degree) * PI / 180.0f)); - xoffset += xoffsetDyn; - yoffset += yoffsetDyn; - effects ^= EFFECT_GOROUND; - frequency = 0.0f; - } - } - - if (effects & EFFECT_ROCK_VERTICLE) - { - //move up to 10pixel above 0 - if (changervar == 0 && yoffsetDynFloat < 11.0) - { - yoffsetDynFloat += (effectAmount * 0.01); - } - else if (yoffsetDynFloat > 10.0) - { - changervar = 1; - } - //move down till 10pixel under 0 - if (changervar == 1 && yoffsetDynFloat > -11.0) - { - yoffsetDynFloat -= (effectAmount * 0.01); - } - else if (yoffsetDynFloat < -10.0) - { - changervar = 0; - } - yoffsetDyn = (int) (yoffsetDynFloat); - } - - if (effects & EFFECT_FADE) - { - alphaDyn += effectAmount; - - if (effectAmount < 0 && alphaDyn <= 0) - { - alphaDyn = 0; - effects = 0; // shut off effect - } - else if (effectAmount > 0 && alphaDyn >= alpha) - { - alphaDyn = alpha; - effects = 0; // shut off effect - } - } - if (effects & EFFECT_SCALE) - { - scaleDyn += effectAmount / 100.0; - - if ((effectAmount < 0 && scaleDyn <= effectTarget / 100.0) || (effectAmount > 0 && scaleDyn >= effectTarget - / 100.0)) - { - scaleDyn = effectTarget / 100.0; - effects = 0; // shut off effect - } - } - if (effects & EFFECT_PULSE) - { - int percent = 10; //go down from target by this - - if ((scaleDyn <= (effectTarget * 0.01)) && (!changervar)) - { - scaleDyn += (effectAmount * 0.001); - } - else if (scaleDyn > (effectTarget * 0.01)) - { - changervar = 1; - } - if ((scaleDyn >= ((effectTarget - percent) * 0.01)) && (changervar)) - { - scaleDyn -= (effectAmount * 0.001); - } - else if (scaleDyn < ((effectTarget - percent) * 0.01)) - { - changervar = 0; - } - } -} - -void GuiElement::Update(GuiTrigger * t) -{ - LOCK( this ); - if (updateCB) updateCB(this); -} - -void GuiElement::SetUpdateCallback(UpdateCallback u) -{ - LOCK( this ); - updateCB = u; -} - -void GuiElement::SetPosition(int xoff, int yoff, int zoff) -{ - LOCK( this ); - xoffset = xoff; - yoffset = yoff; - zoffset = zoff; -} - -void GuiElement::SetAlignment(int hor, int vert) -{ - LOCK( this ); - alignmentHor = hor; - alignmentVert = vert; -} - -int GuiElement::GetSelected() -{ - return -1; -} - -/** - * Draw an element on screen. - */ -void GuiElement::Draw() -{ -} - -/** - * Draw Tooltips on screen. - */ -void GuiElement::DrawTooltip() -{ -} - -/** - * Check if a position is inside the GuiElement. - * @param[in] x X position in pixel. - * @param[in] y Y position in pixel. - */ -bool GuiElement::IsInside(int x, int y) -{ - if (x > this->GetLeft() && x < (this->GetLeft() + width) && y > this->GetTop() && y < (this->GetTop() + height)) return true; - return false; -} -void GuiElement::Lock() -{ - // LWP_MutexLock(mutex); - for (;;) // loop while element is locked by self - { - LWP_MutexLock(_lock_mutex); - - if (_lock_thread == LWP_THREAD_NULL) // element is not locked - { - _lock_thread = LWP_GetSelf(); // mark as locked - _lock_count = 1; // set count of lock to 1 - LWP_MutexUnlock(_lock_mutex); - return; - } - else if (_lock_thread == LWP_GetSelf()) // thread is locked by my self - { - _lock_count++; // inc count of locks; - LWP_MutexUnlock(_lock_mutex); - return; - } - else // otherwise the element is locked by an other thread - { - if (_lock_queue == LWP_TQUEUE_NULL) // no queue - meens it is the first access to the locked element - LWP_InitQueue(&_lock_queue); // init queue - LWP_MutexUnlock(_lock_mutex); - LWP_ThreadSleep(_lock_queue); // and sleep - // try lock again; - } - } -} -void GuiElement::Unlock() -{ - // LWP_MutexUnlock(mutex); - LWP_MutexLock(_lock_mutex); - // only the thread was locked this element, can call unlock - if (_lock_thread == LWP_GetSelf()) // but we check it here – safe is safe - { - if (--_lock_count == 0) // dec count of locks and check if it last lock; - { - _lock_thread = LWP_THREAD_NULL; // mark as unlocked - if (_lock_queue != LWP_TQUEUE_NULL) // has a queue - { - LWP_CloseQueue(_lock_queue); // close the queue and wake all waited threads - _lock_queue = LWP_TQUEUE_NULL; - } - } - } - LWP_MutexUnlock(_lock_mutex); -} - -SimpleLock::SimpleLock(GuiElement *e) : - element(e) -{ - element->Lock(); -} -SimpleLock::~SimpleLock() -{ - element->Unlock(); -} +/**************************************************************************** + * libwiigui + * + * Tantric 2009 + * + * gui_element.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" + +/** + * Constructor for the Object class. + */ +//mutex_t GuiElement::mutex = LWP_MUTEX_NULL; +mutex_t GuiElement::_lock_mutex = LWP_MUTEX_NULL; +GuiElement::GuiElement() +{ + xoffset = 0; + yoffset = 0; + zoffset = 0; + xmin = 0; + xmax = 0; + ymin = 0; + ymax = 0; + width = 0; + height = 0; + alpha = 255; + scale = 1; + state = STATE_DEFAULT; + stateChan = -1; + trigger[0] = NULL; + trigger[1] = NULL; + trigger[2] = NULL; + trigger[3] = NULL; + trigger[4] = NULL; + trigger[5] = NULL; + parentElement = NULL; + rumble = true; + selectable = false; + clickable = false; + holdable = false; + visible = true; + focus = -1; // cannot be focused + updateCB = NULL; + yoffsetDyn = 0; + xoffsetDyn = 0; + yoffsetDynFloat = 0; + alphaDyn = -1; + scaleDyn = 1; + effects = 0; + effectAmount = 0; + effectTarget = 0; + effectsOver = 0; + effectAmountOver = 0; + effectTargetOver = 0; + frequency = 0.0f; + changervar = 0; + degree = -90.0f; + circleamount = 360.0f; + Radius = 150; + angleDyn = 0.0f; + anglespeed = 0.0f; + + // default alignment - align to top left + alignmentVert = ALIGN_TOP; + alignmentHor = ALIGN_LEFT; + // if(mutex == LWP_MUTEX_NULL) LWP_MutexInit(&mutex, true); + if (_lock_mutex == LWP_MUTEX_NULL) LWP_MutexInit(&_lock_mutex, true); + _lock_thread = LWP_THREAD_NULL; + _lock_count = 0; + _lock_queue = LWP_TQUEUE_NULL; + +} + +/** + * Destructor for the GuiElement class. + */ +GuiElement::~GuiElement() +{ + // LWP_MutexDestroy(mutex); +} + +void GuiElement::SetParent(GuiElement * e) +{ + LOCK( this ); + parentElement = e; +} + +GuiElement * GuiElement::GetParent() +{ + return parentElement; +} +/** + * Get the left position of the GuiElement. + * @see SetLeft() + * @return Left position in pixel. + */ +int GuiElement::GetLeft() +{ + int x = 0; + int pWidth = 0; + int pLeft = 0; + + if (parentElement) + { + pWidth = parentElement->GetWidth(); + pLeft = parentElement->GetLeft(); + } + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pLeft += xoffsetDyn; + + switch (alignmentHor) + { + case ALIGN_LEFT: + x = pLeft; + break; + case ALIGN_CENTRE: + x = pLeft + (pWidth / 2) - (width / 2); + break; + case ALIGN_RIGHT: + x = pLeft + pWidth - width; + break; + } + return x + xoffset; +} + +/** + * Get the top position of the GuiElement. + * @see SetTop() + * @return Top position in pixel. + */ +int GuiElement::GetTop() +{ + int y = 0; + int pHeight = 0; + int pTop = 0; + + if (parentElement) + { + pHeight = parentElement->GetHeight(); + pTop = parentElement->GetTop(); + } + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND | EFFECT_ROCK_VERTICLE)) pTop += yoffsetDyn; + + switch (alignmentVert) + { + case ALIGN_TOP: + y = pTop; + break; + case ALIGN_MIDDLE: + y = pTop + (pHeight / 2) - (height / 2); + break; + case ALIGN_BOTTOM: + y = pTop + pHeight - height; + break; + } + return y + yoffset; +} + +void GuiElement::SetMinX(int x) +{ + LOCK( this ); + xmin = x; +} + +int GuiElement::GetMinX() +{ + return xmin; +} + +void GuiElement::SetMaxX(int x) +{ + LOCK( this ); + xmax = x; +} + +int GuiElement::GetMaxX() +{ + return xmax; +} + +void GuiElement::SetMinY(int y) +{ + LOCK( this ); + ymin = y; +} + +int GuiElement::GetMinY() +{ + return ymin; +} + +void GuiElement::SetMaxY(int y) +{ + LOCK( this ); + ymax = y; +} + +int GuiElement::GetMaxY() +{ + return ymax; +} + +/** + * Get the width of the GuiElement. + * @see SetWidth() + * @return Width of the GuiElement. + */ +int GuiElement::GetWidth() +{ + return width; +} + +/** + * Get the height of the GuiElement. + * @see SetHeight() + * @return Height of the GuiElement. + */ +int GuiElement::GetHeight() +{ + return height; +} + +/** + * Set the width and height of the GuiElement. + * @param[in] Width Width in pixel. + * @param[in] Height Height in pixel. + * @see SetWidth() + * @see SetHeight() + */ +void GuiElement::SetSize(int w, int h) +{ + LOCK( this ); + + width = w; + height = h; +} + +/** + * Get visible. + * @see SetVisible() + * @return true if visible, false otherwise. + */ +bool GuiElement::IsVisible() +{ + return visible; +} + +/** + * Set visible. + * @param[in] Visible Set to true to show GuiElement. + * @see IsVisible() + */ +void GuiElement::SetVisible(bool v) +{ + LOCK( this ); + visible = v; +} + +void GuiElement::SetAlpha(int a) +{ + LOCK( this ); + alpha = a; +} + +int GuiElement::GetAlpha() +{ + int a; + + if (alphaDyn >= 0) + a = alphaDyn; + else a = alpha; + + if (parentElement) a *= parentElement->GetAlpha() / 255.0; + + return a; +} + +float GuiElement::GetAngleDyn() +{ + float a = 0.0; + + if (angleDyn) a = angleDyn; + + if (parentElement && !angleDyn) a = parentElement->GetAngleDyn(); + + return a; +} + +void GuiElement::SetScale(float s) +{ + LOCK( this ); + scale = s; +} + +float GuiElement::GetScale() +{ + float s = scale * scaleDyn; + + if (parentElement) s *= parentElement->GetScale(); + + return s; +} + +int GuiElement::GetState() +{ + return state; +} + +int GuiElement::GetStateChan() +{ + return stateChan; +} + +void GuiElement::SetState(int s, int c) +{ + LOCK( this ); + state = s; + stateChan = c; +} + +void GuiElement::ResetState() +{ + LOCK( this ); + if (state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } +} + +void GuiElement::SetClickable(bool c) +{ + LOCK( this ); + clickable = c; +} + +void GuiElement::SetSelectable(bool s) +{ + LOCK( this ); + selectable = s; +} + +void GuiElement::SetHoldable(bool d) +{ + LOCK( this ); + holdable = d; +} + +bool GuiElement::IsSelectable() +{ + if (state == STATE_DISABLED || state == STATE_CLICKED) + return false; + else return selectable; +} + +bool GuiElement::IsClickable() +{ + if (state == STATE_DISABLED || state == STATE_CLICKED || state == STATE_HELD) + return false; + else return clickable; +} + +bool GuiElement::IsHoldable() +{ + if (state == STATE_DISABLED) + return false; + else return holdable; +} + +void GuiElement::SetFocus(int f) +{ + LOCK( this ); + focus = f; +} + +int GuiElement::IsFocused() +{ + return focus; +} + +void GuiElement::SetTrigger(GuiTrigger * t) +{ + LOCK( this ); + if (!trigger[0]) + trigger[0] = t; + else if (!trigger[1]) + trigger[1] = t; + else if (!trigger[2]) + trigger[2] = t; + else if (!trigger[3]) + trigger[3] = t; + else if (!trigger[4]) + trigger[4] = t; + else if (!trigger[5]) + trigger[5] = t; + else // both were assigned, so we'll just overwrite the first one + trigger[0] = t; +} + +void GuiElement::SetTrigger(u8 i, GuiTrigger * t) +{ + LOCK( this ); + trigger[i] = t; +} + +void GuiElement::RemoveTrigger(u8 i) +{ + LOCK( this ); + trigger[i] = NULL; +} + +bool GuiElement::Rumble() +{ + return rumble; +} + +void GuiElement::SetRumble(bool r) +{ + LOCK( this ); + rumble = r; +} + +int GuiElement::GetEffect() +{ + LOCK( this ); + return effects; +} + +int GuiElement::GetEffectOnOver() +{ + LOCK( this ); + return effectsOver; +} + +float GuiElement::GetFrequency() +{ + LOCK( this ); + return frequency; +} + +void GuiElement::SetEffect(int eff, int speed, f32 circles, int r, f32 startdegree, f32 anglespeedset, int center_x, + int center_y) +{ + + if (eff & EFFECT_GOROUND) + { + xoffsetDyn = 0; //!position of circle in x + yoffsetDyn = 0; //!position of circle in y + Radius = r; //!radius of the circle + degree = startdegree; //!for example -90 (°) to start at top of circle + circleamount = circles; //!circleamoutn in degrees for example 360 for 1 circle + angleDyn = 0.0f; //!this is used by the code to calc the angle + anglespeed = anglespeedset; //!This is anglespeed depending on circle speed 1 is same speed and 0.5 half speed + temp_xoffset = center_x; //!position of center in x + temp_yoffset = center_y; //!position of center in y + } + effects |= eff; + effectAmount = speed; //!Circlespeed +} + +void GuiElement::SetEffect(int eff, int amount, int target) +{ + LOCK( this ); + if (eff & EFFECT_SLIDE_IN) + { + // these calculations overcompensate a little + if (eff & EFFECT_SLIDE_TOP) + yoffsetDyn = -screenheight; + else if (eff & EFFECT_SLIDE_LEFT) + xoffsetDyn = -screenwidth; + else if (eff & EFFECT_SLIDE_BOTTOM) + yoffsetDyn = screenheight; + else if (eff & EFFECT_SLIDE_RIGHT) xoffsetDyn = screenwidth; + } + + if (eff & EFFECT_FADE && amount > 0) + { + alphaDyn = 0; + } + else if (eff & EFFECT_FADE && amount < 0) + { + alphaDyn = alpha; + + } + else if (eff & EFFECT_ROCK_VERTICLE) + { + changervar = 0; + yoffsetDyn = 0; + yoffsetDynFloat = 0.0; + } + + effects |= eff; + effectAmount = amount; + effectTarget = target; +} + +void GuiElement::SetEffectOnOver(int eff, int amount, int target) +{ + LOCK( this ); + effectsOver |= eff; + effectAmountOver = amount; + effectTargetOver = target; +} + +void GuiElement::SetEffectGrow() +{ + SetEffectOnOver(EFFECT_SCALE, 4, 110); +} + +void GuiElement::StopEffect() +{ + xoffsetDyn = 0; + yoffsetDyn = 0; + effects = 0; + effectsOver = 0; + effectAmount = 0; + effectAmountOver = 0; + effectTarget = 0; + effectTargetOver = 0; + scaleDyn = 1; + frequency = 0.0f; + changervar = 0; + //angleDyn = 0.0f; + anglespeed = 0.0f; +} + +void GuiElement::UpdateEffects() +{ + LOCK( this ); + + if (effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_GOROUND)) + { + if (effects & EFFECT_SLIDE_IN) + { + if (effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn += effectAmount; + + if (xoffsetDyn >= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn -= effectAmount; + + if (xoffsetDyn <= 0) + { + xoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn += effectAmount; + + if (yoffsetDyn >= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + else if (effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn -= effectAmount; + + if (yoffsetDyn <= 0) + { + yoffsetDyn = 0; + effects = 0; + } + } + } + else + { + if (effects & EFFECT_SLIDE_LEFT) + { + xoffsetDyn -= effectAmount; + + if (xoffsetDyn <= -screenwidth) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_RIGHT) + { + xoffsetDyn += effectAmount; + + if (xoffsetDyn >= screenwidth) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_TOP) + { + yoffsetDyn -= effectAmount; + + if (yoffsetDyn <= -screenheight) effects = 0; // shut off effect + } + else if (effects & EFFECT_SLIDE_BOTTOM) + { + yoffsetDyn += effectAmount; + + if (yoffsetDyn >= screenheight) effects = 0; // shut off effect + } + } + } + + if (effects & EFFECT_GOROUND) + { + //!< check out gui.h for info + xoffset = temp_xoffset; + yoffset = temp_yoffset; + if (fabs(frequency) < circleamount) + { + angleDyn = (frequency + degree + 90.0f) * anglespeed; + xoffsetDyn = (int) lround(((f32) Radius) * cos((frequency + degree) * PI / 180.0f)); + yoffsetDyn = (int) lround(((f32) Radius) * sin((frequency + degree) * PI / 180.0f)); + frequency += ((f32) effectAmount) * 0.01f; + } + else + { + f32 temp_frequency = ((effectAmount < 0) ? -1.0f : 1.0f) * circleamount; + angleDyn = (temp_frequency + degree + 90.0f) * anglespeed; + xoffsetDyn = (int) lround(((f32) Radius) * cos((temp_frequency + degree) * PI / 180.0f)); + yoffsetDyn = (int) lround(((f32) Radius) * sin((temp_frequency + degree) * PI / 180.0f)); + xoffset += xoffsetDyn; + yoffset += yoffsetDyn; + effects ^= EFFECT_GOROUND; + frequency = 0.0f; + } + } + + if (effects & EFFECT_ROCK_VERTICLE) + { + //move up to 10pixel above 0 + if (changervar == 0 && yoffsetDynFloat < 11.0) + { + yoffsetDynFloat += (effectAmount * 0.01); + } + else if (yoffsetDynFloat > 10.0) + { + changervar = 1; + } + //move down till 10pixel under 0 + if (changervar == 1 && yoffsetDynFloat > -11.0) + { + yoffsetDynFloat -= (effectAmount * 0.01); + } + else if (yoffsetDynFloat < -10.0) + { + changervar = 0; + } + yoffsetDyn = (int) (yoffsetDynFloat); + } + + if (effects & EFFECT_FADE) + { + alphaDyn += effectAmount; + + if (effectAmount < 0 && alphaDyn <= 0) + { + alphaDyn = 0; + effects = 0; // shut off effect + } + else if (effectAmount > 0 && alphaDyn >= alpha) + { + alphaDyn = alpha; + effects = 0; // shut off effect + } + } + if (effects & EFFECT_SCALE) + { + scaleDyn += effectAmount / 100.0; + + if ((effectAmount < 0 && scaleDyn <= effectTarget / 100.0) || (effectAmount > 0 && scaleDyn >= effectTarget + / 100.0)) + { + scaleDyn = effectTarget / 100.0; + effects = 0; // shut off effect + } + } + if (effects & EFFECT_PULSE) + { + int percent = 10; //go down from target by this + + if ((scaleDyn <= (effectTarget * 0.01)) && (!changervar)) + { + scaleDyn += (effectAmount * 0.001); + } + else if (scaleDyn > (effectTarget * 0.01)) + { + changervar = 1; + } + if ((scaleDyn >= ((effectTarget - percent) * 0.01)) && (changervar)) + { + scaleDyn -= (effectAmount * 0.001); + } + else if (scaleDyn < ((effectTarget - percent) * 0.01)) + { + changervar = 0; + } + } +} + +void GuiElement::Update(GuiTrigger * t) +{ + LOCK( this ); + if (updateCB) updateCB(this); +} + +void GuiElement::SetUpdateCallback(UpdateCallback u) +{ + LOCK( this ); + updateCB = u; +} + +void GuiElement::SetPosition(int xoff, int yoff, int zoff) +{ + LOCK( this ); + xoffset = xoff; + yoffset = yoff; + zoffset = zoff; +} + +void GuiElement::SetAlignment(int hor, int vert) +{ + LOCK( this ); + alignmentHor = hor; + alignmentVert = vert; +} + +int GuiElement::GetSelected() +{ + return -1; +} + +/** + * Draw an element on screen. + */ +void GuiElement::Draw() +{ +} + +/** + * Draw Tooltips on screen. + */ +void GuiElement::DrawTooltip() +{ +} + +/** + * Check if a position is inside the GuiElement. + * @param[in] x X position in pixel. + * @param[in] y Y position in pixel. + */ +bool GuiElement::IsInside(int x, int y) +{ + if (x > this->GetLeft() && x < (this->GetLeft() + width) && y > this->GetTop() && y < (this->GetTop() + height)) return true; + return false; +} +void GuiElement::Lock() +{ + // LWP_MutexLock(mutex); + for (;;) // loop while element is locked by self + { + LWP_MutexLock(_lock_mutex); + + if (_lock_thread == LWP_THREAD_NULL) // element is not locked + { + _lock_thread = LWP_GetSelf(); // mark as locked + _lock_count = 1; // set count of lock to 1 + LWP_MutexUnlock(_lock_mutex); + return; + } + else if (_lock_thread == LWP_GetSelf()) // thread is locked by my self + { + _lock_count++; // inc count of locks; + LWP_MutexUnlock(_lock_mutex); + return; + } + else // otherwise the element is locked by an other thread + { + if (_lock_queue == LWP_TQUEUE_NULL) // no queue - meens it is the first access to the locked element + LWP_InitQueue(&_lock_queue); // init queue + LWP_MutexUnlock(_lock_mutex); + LWP_ThreadSleep(_lock_queue); // and sleep + // try lock again; + } + } +} +void GuiElement::Unlock() +{ + // LWP_MutexUnlock(mutex); + LWP_MutexLock(_lock_mutex); + // only the thread was locked this element, can call unlock + if (_lock_thread == LWP_GetSelf()) // but we check it here – safe is safe + { + if (--_lock_count == 0) // dec count of locks and check if it last lock; + { + _lock_thread = LWP_THREAD_NULL; // mark as unlocked + if (_lock_queue != LWP_TQUEUE_NULL) // has a queue + { + LWP_CloseQueue(_lock_queue); // close the queue and wake all waited threads + _lock_queue = LWP_TQUEUE_NULL; + } + } + } + LWP_MutexUnlock(_lock_mutex); +} + +SimpleLock::SimpleLock(GuiElement *e) : + element(e) +{ + element->Lock(); +} +SimpleLock::~SimpleLock() +{ + element->Unlock(); +} diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp index f6320859..b8cb48cd 100644 --- a/source/libwiigui/gui_gamebrowser.cpp +++ b/source/libwiigui/gui_gamebrowser.cpp @@ -27,15 +27,15 @@ int txtscroll = 0; /** * Constructor for the GuiGameBrowser class. */ -GuiGameBrowser::GuiGameBrowser(int w, int h, int selected, int offset) +GuiGameBrowser::GuiGameBrowser(int w, int h, int selectedGame) { width = w; height = h; pagesize = Theme.pagesize; scrollbaron = (gameList.size() > pagesize) ? 1 : 0; selectable = true; - listOffset = MAX( 0, MIN( offset, ( gameList.size() - pagesize ) ) ); - selectedItem = selected - offset; + listOffset = selectedGame - (selectedGame % pagesize); + selectedItem = selectedGame - listOffset; focus = 1; // allow focus trigA = new GuiTrigger; diff --git a/source/libwiigui/gui_gamebrowser.h b/source/libwiigui/gui_gamebrowser.h index 3918f239..f685033a 100644 --- a/source/libwiigui/gui_gamebrowser.h +++ b/source/libwiigui/gui_gamebrowser.h @@ -7,7 +7,7 @@ class GuiGameBrowser: public GuiElement { public: - GuiGameBrowser(int w, int h, int selected = 0, int offset = 0); + GuiGameBrowser(int w, int h, int selectedGame = 0); ~GuiGameBrowser(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamecarousel.cpp b/source/libwiigui/gui_gamecarousel.cpp index 2c2db0cc..bd8e5ca8 100644 --- a/source/libwiigui/gui_gamecarousel.cpp +++ b/source/libwiigui/gui_gamecarousel.cpp @@ -45,13 +45,13 @@ static GuiImageData *GameCarouselLoadCoverImage(void * Arg) /** * Constructor for the GuiGameCarousel class. */ -GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected, int offset) : +GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selectedGame) : noCover(nocover_png, nocover_png_size) { width = w; height = h; pagesize = (gameList.size() < 11) ? gameList.size() : 11; - listOffset = 0; + listOffset = (selectedGame >= 0 && selectedGame < gameList.size()) ? selectedGame : 0; selectable = true; selectedItem = -1; focus = 1; // allow focus diff --git a/source/libwiigui/gui_gamecarousel.h b/source/libwiigui/gui_gamecarousel.h index ae654ac5..8f8320e3 100644 --- a/source/libwiigui/gui_gamecarousel.h +++ b/source/libwiigui/gui_gamecarousel.h @@ -7,7 +7,7 @@ class GuiImageAsync; class GuiGameCarousel: public GuiElement { public: - GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected = 0, int offset = 0); + GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selectedGame = 0); ~GuiGameCarousel(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamegrid.cpp b/source/libwiigui/gui_gamegrid.cpp index c4c33f2c..b85dbeda 100644 --- a/source/libwiigui/gui_gamegrid.cpp +++ b/source/libwiigui/gui_gamegrid.cpp @@ -201,7 +201,7 @@ static GuiImageData *GameGridLoadCoverImage(void * Arg) /** * Constructor for the GuiGamegrid class. */ -GuiGameGrid::GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selected, int offset) : +GuiGameGrid::GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selectedGame) : noCover(nocoverFlat_png, nocoverFlat_png_size) { width = w; diff --git a/source/libwiigui/gui_gamegrid.h b/source/libwiigui/gui_gamegrid.h index 86a0cc9b..4279a0bc 100644 --- a/source/libwiigui/gui_gamegrid.h +++ b/source/libwiigui/gui_gamegrid.h @@ -7,7 +7,7 @@ class GuiImageAsync; class GuiGameGrid: public GuiElement { public: - GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selected = 0, int offset = 0); + GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selectedGame = 0); ~GuiGameGrid(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_numpad.cpp b/source/libwiigui/gui_numpad.cpp index a6596376..5e770305 100644 --- a/source/libwiigui/gui_numpad.cpp +++ b/source/libwiigui/gui_numpad.cpp @@ -61,8 +61,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyBackText = new GuiText("Back", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyBack = new GuiButton(keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, keySoundOver, - keySoundClick, 1); + keyBack = new GuiButton(keyBackImg, keyBackOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, 90, 80, trigA, btnSoundOver, btnSoundClick, 1); keyBack->SetLabel(keyBackText); keyBack->SetTrigger(trigB); this->Append(keyBack); @@ -71,8 +70,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyClearOverImg = new GuiImage(keyMediumOver); keyClearText = new GuiText("Clear", 20, ( GXColor ) { 0, 0, 0, 0xff}); - keyClear = new GuiButton(keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, keySoundOver, - keySoundClick, 1); + keyClear = new GuiButton(keyClearImg, keyClearOverImg, ALIGN_CENTRE, ALIGN_MIDDLE, -90, 80, trigA, btnSoundOver, btnSoundClick, 1); keyClear->SetLabel(keyClearText); this->Append(keyClear); @@ -92,7 +90,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) keyTxt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); keyTxt[i]->SetPosition(0, -10); keyBtn[i] = new GuiButton(keyImg[i], keyImgOver[i], ALIGN_CENTRE, ALIGN_MIDDLE, -90 + 90 * col, -70 + 50 - * row, trigA, keySoundOver, keySoundClick, 1); + * row, trigA, btnSoundOver, btnSoundClick, 1); keyBtn[i]->SetLabel(keyTxt[i]); this->Append(keyBtn[i]); diff --git a/source/libwiigui/gui_searchbar.h b/source/libwiigui/gui_searchbar.h index 23bbb82e..32d953f8 100644 --- a/source/libwiigui/gui_searchbar.h +++ b/source/libwiigui/gui_searchbar.h @@ -1,3 +1,5 @@ +#ifndef GUI_SEARCHBAR_H_ +#define GUI_SEARCHBAR_H_ #include "gui.h" class cSearchButton; @@ -32,3 +34,5 @@ class GuiSearchBar: public GuiWindow GuiTrigger trig; }; + +#endif \ No newline at end of file diff --git a/source/lstub.cpp b/source/lstub.cpp index 1b65b417..5047e27f 100644 --- a/source/lstub.cpp +++ b/source/lstub.cpp @@ -1,100 +1,100 @@ -//functions for manipulating the HBC stub by giantpune - -#include -#include -#include -#include - -#include "lstub.h" -#include "filelist.h" -#include "gecko.h" - -#include "wad/nandtitle.h" - -static char* determineStubTIDLocation() -{ - u32 *stubID = (u32*) 0x80001818; - - //HBC stub 1.0.6 and lower, and stub.bin - if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) - return (char *) 0x800024C6; - - //HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 - else if (stubID[0] == 0x48000859 && stubID[1] == 0x4800088d) return (char *) 0x8000286A; - - //hexdump( stubID, 0x20 ); - return NULL; - -} - -s32 Set_Stub(u64 reqID) -{ - if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; - - char *stub = determineStubTIDLocation(); - if (!stub) return -68; - - stub[0] = TITLE_7( reqID ); - stub[1] = TITLE_6( reqID ); - stub[8] = TITLE_5( reqID ); - stub[9] = TITLE_4( reqID ); - stub[4] = TITLE_3( reqID ); - stub[5] = TITLE_2( reqID ); - stub[12] = TITLE_1( reqID ); - stub[13] = ((u8) (reqID)); - - DCFlushRange(stub, 0x10); - - return 1; - -} - -s32 Set_Stub_Split(u32 type, const char* reqID) -{ - char tmp[4]; - u32 lower; - sprintf(tmp, "%c%c%c%c", reqID[0], reqID[1], reqID[2], reqID[3]); - memcpy(&lower, tmp, 4); - u64 reqID64 = TITLE_ID( type, lower ); - return Set_Stub(reqID64); - -} - -void loadStub() -{ - char *stubLoc = (char *) 0x80001800; - memcpy(stubLoc, stub_bin, stub_bin_size); - DCFlushRange(stubLoc, stub_bin_size); -} - -u64 getStubDest() -{ - if (!hbcStubAvailable()) return 0; - - char ret[8]; - u64 retu = 0; - - char *stub = determineStubTIDLocation(); - if (!stub) return 0; - - ret[0] = stub[0]; - ret[1] = stub[1]; - ret[2] = stub[8]; - ret[3] = stub[9]; - ret[4] = stub[4]; - ret[5] = stub[5]; - ret[6] = stub[12]; - ret[7] = stub[13]; - - memcpy(&retu, ret, 8); - - return retu; -} - -u8 hbcStubAvailable() -{ - char * sig = (char *) 0x80001804; - return (sig[0] == 'S' && sig[1] == 'T' && sig[2] == 'U' && sig[3] == 'B' && sig[4] == 'H' && sig[5] == 'A' - && sig[6] == 'X' && sig[7] == 'X') ? 1 : 0; -} - +//functions for manipulating the HBC stub by giantpune + +#include +#include +#include +#include + +#include "lstub.h" +#include "filelist.h" +#include "gecko.h" + +#include "wad/nandtitle.h" + +static char* determineStubTIDLocation() +{ + u32 *stubID = (u32*) 0x80001818; + + //HBC stub 1.0.6 and lower, and stub.bin + if (stubID[0] == 0x480004c1 && stubID[1] == 0x480004f5) + return (char *) 0x800024C6; + + //HBC stub changed @ version 1.0.7. this file was last updated for HBC 1.0.8 + else if (stubID[0] == 0x48000859 && stubID[1] == 0x4800088d) return (char *) 0x8000286A; + + //hexdump( stubID, 0x20 ); + return NULL; + +} + +s32 Set_Stub(u64 reqID) +{ + if (NandTitles.IndexOf(reqID) < 0) return WII_EINSTALL; + + char *stub = determineStubTIDLocation(); + if (!stub) return -68; + + stub[0] = TITLE_7( reqID ); + stub[1] = TITLE_6( reqID ); + stub[8] = TITLE_5( reqID ); + stub[9] = TITLE_4( reqID ); + stub[4] = TITLE_3( reqID ); + stub[5] = TITLE_2( reqID ); + stub[12] = TITLE_1( reqID ); + stub[13] = ((u8) (reqID)); + + DCFlushRange(stub, 0x10); + + return 1; + +} + +s32 Set_Stub_Split(u32 type, const char* reqID) +{ + char tmp[4]; + u32 lower; + sprintf(tmp, "%c%c%c%c", reqID[0], reqID[1], reqID[2], reqID[3]); + memcpy(&lower, tmp, 4); + u64 reqID64 = TITLE_ID( type, lower ); + return Set_Stub(reqID64); + +} + +void loadStub() +{ + char *stubLoc = (char *) 0x80001800; + memcpy(stubLoc, stub_bin, stub_bin_size); + DCFlushRange(stubLoc, stub_bin_size); +} + +u64 getStubDest() +{ + if (!hbcStubAvailable()) return 0; + + char ret[8]; + u64 retu = 0; + + char *stub = determineStubTIDLocation(); + if (!stub) return 0; + + ret[0] = stub[0]; + ret[1] = stub[1]; + ret[2] = stub[8]; + ret[3] = stub[9]; + ret[4] = stub[4]; + ret[5] = stub[5]; + ret[6] = stub[12]; + ret[7] = stub[13]; + + memcpy(&retu, ret, 8); + + return retu; +} + +u8 hbcStubAvailable() +{ + char * sig = (char *) 0x80001804; + return (sig[0] == 'S' && sig[1] == 'T' && sig[2] == 'U' && sig[3] == 'B' && sig[4] == 'H' && sig[5] == 'A' + && sig[6] == 'X' && sig[7] == 'X') ? 1 : 0; +} + diff --git a/source/memory/memory.h b/source/memory/memory.h index f86f16cf..84250b91 100644 --- a/source/memory/memory.h +++ b/source/memory/memory.h @@ -1,36 +1,36 @@ -#ifndef __MEMORY_H_ -#define __MEMORY_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define Disc_ID ((u32*) 0x80000000) -#define Disc_Region ((u32*) 0x80000003) -#define Disc_Magic ((u32*) 0x80000018) -#define Sys_Magic ((u32*) 0x80000020) -#define Version ((u32*) 0x80000024) -#define Mem_Size ((u32*) 0x80000028) -#define Board_Model ((u32*) 0x8000002C) -#define Arena_L ((u32*) 0x80000030) -#define Arena_H ((u32*) 0x80000034) -#define FST ((u32*) 0x80000038) -#define Max_FST ((u32*) 0x8000003C) -#define Assembler ((u32*) 0x80000060) -#define Video_Mode ((u32*) 0x800000CC) -#define Dev_Debugger ((u32*) 0x800000EC) -#define Simulated_Mem ((u32*) 0x800000F0) -#define BI2 ((u32*) 0x800000F4) -#define Bus_Speed ((u32*) 0x800000F8) -#define CPU_Speed ((u32*) 0x800000FC) -#define Online_Check ((u32*) 0x80003180) -#define GameID_Address ((u32*) 0x80003184) - -#define allocate_memory(size) memalign(32, (size+31)&(~31)) - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef __MEMORY_H_ +#define __MEMORY_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define Disc_ID ((u32*) 0x80000000) +#define Disc_Region ((u32*) 0x80000003) +#define Disc_Magic ((u32*) 0x80000018) +#define Sys_Magic ((u32*) 0x80000020) +#define Version ((u32*) 0x80000024) +#define Mem_Size ((u32*) 0x80000028) +#define Board_Model ((u32*) 0x8000002C) +#define Arena_L ((u32*) 0x80000030) +#define Arena_H ((u32*) 0x80000034) +#define FST ((u32*) 0x80000038) +#define Max_FST ((u32*) 0x8000003C) +#define Assembler ((u32*) 0x80000060) +#define Video_Mode ((u32*) 0x800000CC) +#define Dev_Debugger ((u32*) 0x800000EC) +#define Simulated_Mem ((u32*) 0x800000F0) +#define BI2 ((u32*) 0x800000F4) +#define Bus_Speed ((u32*) 0x800000F8) +#define CPU_Speed ((u32*) 0x800000FC) +#define Online_Check ((u32*) 0x80003180) +#define GameID_Address ((u32*) 0x80003184) + +#define allocate_memory(size) memalign(32, (size+31)&(~31)) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/source/menu/GameBrowseMenu.cpp b/source/menu/GameBrowseMenu.cpp new file mode 100644 index 00000000..bf1fd71a --- /dev/null +++ b/source/menu/GameBrowseMenu.cpp @@ -0,0 +1,1341 @@ +#include +#include "GameBrowseMenu.hpp" +#include "prompts/PromptWindows.h" +#include "prompts/gameinfo.h" +#include "prompts/DiscBrowser.h" +#include "themes/CTheme.h" +#include "language/gettext.h" +#include "usbloader/wbfs.h" +#include "usbloader/wdvd.h" +#include "usbloader/GameList.h" +#include "network/networkops.h" +#include "FileOperations/fileops.h" +#include "settings/Settings.h" +#include "settings/CSettings.h" +#include "settings/CGameStatistics.h" +#include "settings/CGameSettings.h" +#include "settings/GameTitles.h" +#include "utils/StringTools.h" +#include "GameBootProcess.h" +#include "utils/rockout.h" +#include "utils/tools.h" +#include "fatmounter.h" +#include "gecko.h" +#include "menus.h" +#include "wpad.h" +#include "sys.h" + +extern int load_from_fs; +extern u8 mountMethod; +extern bool updateavailable; +extern struct discHdr *dvdheader; +extern int cntMissFiles; + +static int lastSelectedGame = 0; + +GameBrowseMenu::GameBrowseMenu() + : GuiWindow(screenwidth, screenheight) +{ + float freespace = 0.0, used = 0.0; + gameSelectedOld = -1; + show_searchwindow = false; + gameBrowser = NULL; + gameGrid = NULL; + gameCarousel = NULL; + searchBar = NULL; + gameCover = NULL; + gameCoverImg = NULL; + ScreensaverTimer = 0; + memset(theTime, 0, sizeof(theTime)); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + + if (mountMethod != 3 && WBFS_ShowFreeSpace()) + WBFS_DiskSpace(&used, &freespace); + + btnInstall = Resources::GetImageData("button_install.png"); + btnInstallOver = Resources::GetImageData("button_install_over.png"); + btnSettings = Resources::GetImageData("settings_button.png"); + btnSettingsOver = Resources::GetImageData("settings_button_over.png"); + btnpwroff = Resources::GetImageData("wiimote_poweroff.png"); + btnpwroffOver = Resources::GetImageData("wiimote_poweroff_over.png"); + btnhome = Resources::GetImageData("menu_button.png"); + btnhomeOver = Resources::GetImageData("menu_button_over.png"); + btnsdcardOver = Resources::GetImageData("sdcard_over.png"); + btnsdcard = Resources::GetImageData("sdcard.png"); + + imgfavIcon = Resources::GetImageData("favIcon.png"); + imgfavIcon_gray = Resources::GetImageData("favIcon_gray.png"); + imgsearchIcon = Resources::GetImageData("searchIcon.png"); + imgsearchIcon_gray = Resources::GetImageData("searchIcon_gray.png"); + imgabcIcon = Resources::GetImageData("abcIcon.png"); + imgrankIcon = Resources::GetImageData("rankIcon.png"); + imgplayCountIcon = Resources::GetImageData("playCountIcon.png"); + imgarrangeGrid = Resources::GetImageData("arrangeGrid.png"); + imgarrangeGrid_gray = Resources::GetImageData("arrangeGrid_gray.png"); + imgarrangeList = Resources::GetImageData("arrangeList.png"); + imgarrangeList_gray = Resources::GetImageData("arrangeList_gray.png"); + imgarrangeCarousel = Resources::GetImageData("arrangeCarousel.png"); + imgarrangeCarousel_gray = Resources::GetImageData("arrangeCarousel_gray.png"); + imgdvd = Resources::GetImageData("dvd.png"); + imgdvd_gray = Resources::GetImageData("dvd_gray.png"); + imgLock = Resources::GetImageData("lock.png"); + imgLock_gray = Resources::GetImageData("lock_gray.png"); + imgUnlock = Resources::GetImageData("lock_gray.png"); + imgUnlock_gray = Resources::GetImageData("unlock_gray.png"); + + homebrewImgData = Resources::GetImageData("browser.png"); + homebrewImgDataOver = Resources::GetImageData("browser_over.png"); + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trigHome = new GuiTrigger; + trigHome->SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); + trig2 = new GuiTrigger; + trig2->SetButtonOnlyTrigger(-1, WPAD_BUTTON_2 | WPAD_CLASSIC_BUTTON_X, 0); + trig1 = new GuiTrigger; + trig1->SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_Y, 0); + + char spaceinfo[30]; + if (load_from_fs == PART_FS_FAT || mountMethod == 3) + { + memset(spaceinfo, 0, 30); + } + else + { + if (strcmp(Settings.db_language, "JA") == 0) + { + // needs to be "total...used" for Japanese + sprintf(spaceinfo, "%.2fGB %s %.2fGB %s", (freespace + used), tr( "of" ), freespace, tr( "free" )); + } + else + { + sprintf(spaceinfo, "%.2fGB %s %.2fGB %s", freespace, tr( "of" ), (freespace + used), tr( "free" )); + } + } + usedSpaceTxt = new GuiText(spaceinfo, 18, Theme.info); + usedSpaceTxt->SetAlignment(Theme.hddinfo_align, ALIGN_TOP); + usedSpaceTxt->SetPosition(Theme.hddinfo_x, Theme.hddinfo_y); + + gamecntTxt = new GuiText((char *) NULL, 18, Theme.info); + gamecntBtn = new GuiButton(100, 18); + gamecntBtn->SetAlignment(Theme.gamecount_align, ALIGN_TOP); + gamecntBtn->SetPosition(Theme.gamecount_x, Theme.gamecount_y); + gamecntBtn->SetLabel(gamecntTxt); + gamecntBtn->SetEffectGrow(); + gamecntBtn->SetTrigger(trigA); + + installBtnTT = new GuiTooltip(tr( "Install a game" )); + if (Settings.wsprompt) installBtnTT->SetWidescreen(Settings.widescreen); + installBtnTT->SetAlpha(Theme.tooltipAlpha); + installBtnImg = new GuiImage(btnInstall); + installBtnImgOver = new GuiImage(btnInstallOver); + installBtnImg->SetWidescreen(Settings.widescreen); + installBtnImgOver->SetWidescreen(Settings.widescreen); + + installBtn = new GuiButton(installBtnImg, installBtnImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.install_x, Theme.install_y, + trigA, btnSoundOver, btnSoundClick2, 1, installBtnTT, 24, -30, 0, 5); + + settingsBtnTT = new GuiTooltip(tr( "Settings" )); + if (Settings.wsprompt) settingsBtnTT->SetWidescreen(Settings.widescreen); + settingsBtnTT->SetAlpha(Theme.tooltipAlpha); + settingsBtnImg = new GuiImage(btnSettings); + settingsBtnImg->SetWidescreen(Settings.widescreen); + settingsBtnImgOver = new GuiImage(btnSettingsOver); + settingsBtnImgOver->SetWidescreen(Settings.widescreen); + settingsBtn = new GuiButton(settingsBtnImg, settingsBtnImgOver, 0, 3, Theme.setting_x, Theme.setting_y, trigA, + btnSoundOver, btnSoundClick2, 1, settingsBtnTT, 65, -30, 0, 5); + + homeBtnTT = new GuiTooltip(tr( "Back to HBC or Wii Menu" )); + if (Settings.wsprompt) homeBtnTT->SetWidescreen(Settings.widescreen); + settingsBtnTT->SetAlpha(Theme.tooltipAlpha); + homeBtnImg = new GuiImage(btnhome); + homeBtnImg->SetWidescreen(Settings.widescreen); + homeBtnImgOver = new GuiImage(btnhomeOver); + homeBtnImgOver->SetWidescreen(Settings.widescreen); + homeBtn = new GuiButton(homeBtnImg, homeBtnImgOver, 0, 3, Theme.home_x, Theme.home_y, trigA, btnSoundOver, btnSoundClick2, + 1, homeBtnTT, 15, -30, 1, 5); + homeBtn->RemoveSoundClick(); + homeBtn->SetTrigger(trigHome); + + poweroffBtnTT = new GuiTooltip(tr( "Power off the Wii" )); + if (Settings.wsprompt) poweroffBtnTT->SetWidescreen(Settings.widescreen); + poweroffBtnTT->SetAlpha(Theme.tooltipAlpha); + poweroffBtnImg = new GuiImage(btnpwroff); + poweroffBtnImgOver = new GuiImage(btnpwroffOver); + poweroffBtnImg->SetWidescreen(Settings.widescreen); + poweroffBtnImgOver->SetWidescreen(Settings.widescreen); + poweroffBtn = new GuiButton(poweroffBtnImg, poweroffBtnImgOver, 0, 3, Theme.power_x, Theme.power_y, trigA, + btnSoundOver, btnSoundClick2, 1, poweroffBtnTT, -10, -30, 1, 5); + + sdcardBtnTT = new GuiTooltip(tr( "Reload SD" )); + if (Settings.wsprompt) sdcardBtnTT->SetWidescreen(Settings.widescreen); + sdcardBtnTT->SetAlpha(Theme.tooltipAlpha); + sdcardImg = new GuiImage(btnsdcard); + sdcardImgOver = new GuiImage(btnsdcardOver); + sdcardImg->SetWidescreen(Settings.widescreen); + sdcardImgOver->SetWidescreen(Settings.widescreen); + sdcardBtn = new GuiButton(sdcardImg, sdcardImgOver, 0, 3, Theme.sdcard_x, Theme.sdcard_y, trigA, btnSoundOver, + btnSoundClick2, 1, sdcardBtnTT, 15, -30, 0, 5); + + gameInfo = new GuiButton(0, 0); + gameInfo->SetTrigger(trig2); + gameInfo->SetSoundClick(btnSoundClick2); + + favoriteBtnTT = new GuiTooltip(tr( "Display favorites only" )); + if (Settings.wsprompt) favoriteBtnTT->SetWidescreen(Settings.widescreen); + favoriteBtnTT->SetAlpha(Theme.tooltipAlpha); + favoriteBtnImg = new GuiImage(imgfavIcon); + favoriteBtnImg->SetWidescreen(Settings.widescreen); + favoriteBtnImg_g = new GuiImage(imgfavIcon_gray); + favoriteBtnImg_g->SetWidescreen(Settings.widescreen); + favoriteBtn = new GuiButton(favoriteBtnImg_g, favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_favorite_x, + Theme.gamelist_favorite_y, trigA, btnSoundOver, btnSoundClick2, 1, favoriteBtnTT, -15, 52, 0, 3); + + searchBtnTT = new GuiTooltip(tr( "Set Search-Filter" )); + if (Settings.wsprompt) searchBtnTT->SetWidescreen(Settings.widescreen); + searchBtnTT->SetAlpha(Theme.tooltipAlpha); + searchBtnImg = new GuiImage(imgsearchIcon); + searchBtnImg->SetWidescreen(Settings.widescreen); + searchBtnImg_g = new GuiImage(imgsearchIcon_gray); + searchBtnImg_g->SetWidescreen(Settings.widescreen); + searchBtn = new GuiButton(searchBtnImg_g, searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_search_x, + Theme.gamelist_search_y, trigA, btnSoundOver, btnSoundClick2, 1, searchBtnTT, -15, 52, 0, 3); + + sortBtnTT = new GuiTooltip(" "); + if (Settings.wsprompt) sortBtnTT->SetWidescreen(Settings.widescreen); + sortBtnTT->SetAlpha(Theme.tooltipAlpha); + + sortBtnImg = new GuiImage(imgabcIcon); + sortBtnImg->SetWidescreen(Settings.widescreen); + sortBtn = new GuiButton(sortBtnImg, sortBtnImg, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_abc_x, Theme.gamelist_abc_y, trigA, btnSoundOver, btnSoundClick2, 1, sortBtnTT, -15, 52, 0, 3); + + listBtnTT = new GuiTooltip(tr( "Display as a list" )); + if (Settings.wsprompt) listBtnTT->SetWidescreen(Settings.widescreen); + listBtnTT->SetAlpha(Theme.tooltipAlpha); + listBtnImg = new GuiImage(imgarrangeList); + listBtnImg->SetWidescreen(Settings.widescreen); + listBtnImg_g = new GuiImage(imgarrangeList_gray); + listBtnImg_g->SetWidescreen(Settings.widescreen); + listBtn = new GuiButton(listBtnImg_g, listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_list_x, + Theme.gamelist_list_y, trigA, btnSoundOver, btnSoundClick2, 1, listBtnTT, 15, 52, 1, 3); + + gridBtnTT = new GuiTooltip(tr( "Display as a grid" )); + if (Settings.wsprompt) gridBtnTT->SetWidescreen(Settings.widescreen); + gridBtnTT->SetAlpha(Theme.tooltipAlpha); + gridBtnImg = new GuiImage(imgarrangeGrid); + gridBtnImg->SetWidescreen(Settings.widescreen); + gridBtnImg_g = new GuiImage(imgarrangeGrid_gray); + gridBtnImg_g->SetWidescreen(Settings.widescreen); + gridBtn = new GuiButton(gridBtnImg_g, gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_grid_x, + Theme.gamelist_grid_y, trigA, btnSoundOver, btnSoundClick2, 1, gridBtnTT, 15, 52, 1, 3); + + carouselBtnTT = new GuiTooltip(tr( "Display as a carousel" )); + if (Settings.wsprompt) carouselBtnTT->SetWidescreen(Settings.widescreen); + carouselBtnTT->SetAlpha(Theme.tooltipAlpha); + carouselBtnImg = new GuiImage(imgarrangeCarousel); + carouselBtnImg->SetWidescreen(Settings.widescreen); + carouselBtnImg_g = new GuiImage(imgarrangeCarousel_gray); + carouselBtnImg_g->SetWidescreen(Settings.widescreen); + carouselBtn = new GuiButton(carouselBtnImg_g, carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_carousel_x, + Theme.gamelist_carousel_y, trigA, btnSoundOver, btnSoundClick2, 1, carouselBtnTT, 15, 52, 1, 3); + + lockBtnTT = new GuiTooltip(NULL); + if (Settings.wsprompt) lockBtnTT->SetWidescreen(Settings.widescreen); + lockBtnTT->SetAlpha(Theme.tooltipAlpha); + lockBtnImg = new GuiImage(imgLock); + lockBtnImg->SetWidescreen(Settings.widescreen); + lockBtnImg_g = new GuiImage(imgLock_gray); + lockBtnImg_g->SetWidescreen(Settings.widescreen); + lockBtn = new GuiButton(lockBtnImg_g, lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_lock_x, + Theme.gamelist_lock_y, trigA, btnSoundOver, btnSoundClick2, 1, lockBtnTT, 15, 52, 1, 3); + + unlockBtnImg = new GuiImage(imgUnlock); + unlockBtnImg->SetWidescreen(Settings.widescreen); + unlockBtnImg_g = new GuiImage(imgUnlock_gray); + unlockBtnImg_g->SetWidescreen(Settings.widescreen); + + dvdBtnTT = new GuiTooltip(tr( "Mount DVD drive" )); + if (Settings.wsprompt) dvdBtnTT->SetWidescreen(Settings.widescreen); + dvdBtnTT->SetAlpha(Theme.tooltipAlpha); + dvdBtnImg = new GuiImage(imgdvd); + dvdBtnImg->SetWidescreen(Settings.widescreen); + dvdBtnImg_g = new GuiImage(dvdBtnImg); + dvdBtnImg_g->SetWidescreen(Settings.widescreen); + dvdBtn = new GuiButton(dvdBtnImg_g, dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y, + trigA, btnSoundOver, btnSoundClick2, 1, dvdBtnTT, 15, 52, 1, 3); + + homebrewBtnTT = new GuiTooltip(tr( "Homebrew Launcher" )); + if (Settings.wsprompt) homebrewBtnTT->SetWidescreen(Settings.widescreen); + homebrewBtnTT->SetAlpha(Theme.tooltipAlpha); + homebrewImg = new GuiImage(homebrewImgData); + homebrewImgOver = new GuiImage(homebrewImgDataOver); + homebrewImg->SetWidescreen(Settings.widescreen); + homebrewImgOver->SetWidescreen(Settings.widescreen); + homebrewBtn = new GuiButton(homebrewImg, homebrewImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.homebrew_x, Theme.homebrew_y, + trigA, btnSoundOver, btnSoundClick2, 1, homebrewBtnTT, 15, -30, 1, 5); + //Downloading Covers + DownloadBtnTT = new GuiTooltip(tr( "Click to Download Covers" )); + if (Settings.wsprompt) DownloadBtnTT->SetWidescreen(Settings.widescreen); + DownloadBtnTT->SetAlpha(Theme.tooltipAlpha); + DownloadBtn = new GuiButton (0, 0); + DownloadBtn->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + DownloadBtn->SetPosition(Theme.covers_x, Theme.covers_y); + + IDBtnTT = new GuiTooltip(tr( "Click to change game ID" )); + if (Settings.wsprompt) IDBtnTT->SetWidescreen(Settings.widescreen); + IDBtnTT->SetAlpha(Theme.tooltipAlpha); + idBtn = new GuiButton(60, 23); + idBtn->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + idBtn->SetPosition(Theme.id_x, Theme.id_y); + + clockTimeBack = new GuiText("88:88", 40, (GXColor) {Theme.clock.r, Theme.clock.g, Theme.clock.b, Theme.clock.a / 6}); + clockTimeBack->SetAlignment(Theme.clock_align, ALIGN_TOP); + clockTimeBack->SetPosition(Theme.clock_x, Theme.clock_y); + clockTimeBack->SetFont(clock_ttf, clock_ttf_size); + + clockTime = new GuiText(theTime, 40, Theme.clock); + clockTime->SetAlignment(Theme.clock_align, ALIGN_TOP); + clockTime->SetPosition(Theme.clock_x, Theme.clock_y); + clockTime->SetFont(clock_ttf, clock_ttf_size); + + ToolBar.push_back(favoriteBtn); + ToolBar.push_back(searchBtn); + ToolBar.push_back(sortBtn); + ToolBar.push_back(listBtn); + ToolBar.push_back(gridBtn); + ToolBar.push_back(carouselBtn); + ToolBar.push_back(lockBtn); + ToolBar.push_back(dvdBtn); + SetUpdateCallback(UpdateCallback); + + ReloadBrowser(); +} + +GameBrowseMenu::~GameBrowseMenu() +{ + ResumeGui(); + + SetEffect(EFFECT_FADE, -20); + while(parentElement && this->GetEffect() > 0) usleep(100); + + HaltGui(); + if(parentElement) + ((GuiWindow *) parentElement)->Remove(this); + + RemoveAll(); + + delete btnInstall; + delete btnInstallOver; + delete btnSettings; + delete btnSettingsOver; + delete btnpwroff; + delete btnpwroffOver; + delete btnhome; + delete btnhomeOver; + delete btnsdcardOver; + delete btnsdcard; + delete imgfavIcon; + delete imgfavIcon_gray; + delete imgsearchIcon; + delete imgsearchIcon_gray; + delete imgabcIcon; + delete imgrankIcon; + delete imgplayCountIcon; + delete imgarrangeGrid; + delete imgarrangeGrid_gray; + delete imgarrangeCarousel; + delete imgarrangeCarousel_gray; + delete imgarrangeList; + delete imgarrangeList_gray; + delete imgdvd; + delete imgdvd_gray; + delete imgLock; + delete imgLock_gray; + delete imgUnlock; + delete imgUnlock_gray; + delete homebrewImgData; + delete homebrewImgDataOver; + delete gameCover; + + delete trigA; + delete trigHome; + delete trig1; + delete trig2; + + delete installBtnImg; + delete installBtnImgOver; + delete settingsBtnImg; + delete settingsBtnImgOver; + delete homeBtnImg; + delete homeBtnImgOver; + delete poweroffBtnImg; + delete poweroffBtnImgOver; + delete sdcardImg; + delete sdcardImgOver; + delete favoriteBtnImg; + delete favoriteBtnImg_g; + delete searchBtnImg; + delete searchBtnImg_g; + delete sortBtnImg; + delete listBtnImg; + delete listBtnImg_g; + delete gridBtnImg; + delete gridBtnImg_g; + delete carouselBtnImg; + delete carouselBtnImg_g; + delete lockBtnImg; + delete lockBtnImg_g; + delete unlockBtnImg; + delete unlockBtnImg_g; + delete dvdBtnImg; + delete dvdBtnImg_g; + delete homebrewImg; + delete homebrewImgOver; + delete gameCoverImg; + + delete usedSpaceTxt; + delete gamecntTxt; + delete clockTimeBack; + delete clockTime; + + delete gamecntBtn; + delete installBtn; + delete settingsBtn; + delete homeBtn; + delete poweroffBtn; + delete sdcardBtn; + delete gameInfo; + delete favoriteBtn; + delete searchBtn; + delete sortBtn; + delete listBtn; + delete gridBtn; + delete carouselBtn; + delete lockBtn; + delete dvdBtn; + delete homebrewBtn; + delete DownloadBtn; + delete idBtn; + + delete installBtnTT; + delete settingsBtnTT; + delete homeBtnTT; + delete poweroffBtnTT; + delete sdcardBtnTT; + delete favoriteBtnTT; + delete searchBtnTT; + delete sortBtnTT; + delete listBtnTT; + delete gridBtnTT; + delete carouselBtnTT; + delete lockBtnTT; + delete dvdBtnTT; + delete homebrewBtnTT; + delete DownloadBtnTT; + delete IDBtnTT; + + lastSelectedGame = cut_bounds(GetSelectedGame(), 0, gameList.size()-1); + + delete gameBrowser; + delete gameGrid; + delete gameCarousel; + mainWindow->Remove(searchBar); + delete searchBar; + + ResumeGui(); +} + +void GameBrowseMenu::ReloadBrowser() +{ + ResumeGui(); + + SetEffect(EFFECT_FADE, -40); + while(parentElement && this->GetEffect() > 0) usleep(100); + + HaltGui(); + RemoveAll(); + mainWindow->Remove(searchBar); + + gamecntTxt->SetText(fmt("%s: %i", (mountMethod != 3 ? tr( "Games" ) : tr( "Channels" )), gameList.size())); + + const char * sortTTText = NULL; + GuiImageData * sortImgData = NULL; + + if(Settings.GameSort & SORT_RANKING) + { + sortTTText = tr( "Sort by rank" ); + sortImgData = imgrankIcon; + } + else if(Settings.GameSort & SORT_PLAYCOUNT) + { + sortTTText = tr( "Sort order by most played"); + sortImgData = imgplayCountIcon; + } + else + { + sortTTText = tr("Sort alphabetically"); + sortImgData = imgabcIcon; + } + + sortBtnTT->SetText(sortTTText); + sortBtnImg->SetImage(sortImgData); + + if (Settings.GameSort & SORT_FAVORITE) + { + favoriteBtn->SetImage(favoriteBtnImg); + favoriteBtn->SetImageOver(favoriteBtnImg); + } + else + { + favoriteBtn->SetImage(favoriteBtnImg_g); + favoriteBtn->SetImageOver(favoriteBtnImg_g); + } + + if (*gameList.GetCurrentFilter()) + { + if (!show_searchwindow) searchBtn->SetEffect(EFFECT_PULSE, 10, 105); + searchBtn->SetImage(searchBtnImg); + searchBtn->SetImageOver(searchBtnImg); + } + else if(!show_searchwindow) + { + searchBtn->SetImage(searchBtnImg_g); + searchBtn->SetImageOver(searchBtnImg_g); + } + + if (Settings.godmode == 1 && mountMethod != 3) //only make the button have trigger & tooltip if in godmode + { + DownloadBtn->SetSoundOver(btnSoundOver); + DownloadBtn->SetTrigger(0, trigA); + DownloadBtn->SetTrigger(1, trig1); + DownloadBtn->SetToolTip(DownloadBtnTT, 205, -30); + idBtn->SetSoundOver(btnSoundOver); + idBtn->SetTrigger(0, trigA); + idBtn->SetToolTip(IDBtnTT, 205, -30); + } + else + { + DownloadBtn->SetToolTip(NULL, 0, 0); + DownloadBtn->SetSoundOver(NULL); + DownloadBtn->SetTrigger(0, NULL); + DownloadBtn->SetTrigger(1, NULL); + idBtn->SetSoundOver(NULL); + idBtn->SetTrigger(0, NULL); + idBtn->SetToolTip(NULL, 0, 0); + } + + if ((Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1) && Settings.godmode) + { + lockBtn->SetImage(unlockBtnImg_g); + lockBtn->SetImageOver(unlockBtnImg_g); + lockBtnTT->SetText(tr( "Unlock Parental Control" )); + } + else + { + lockBtn->SetImage(lockBtnImg_g); + lockBtn->SetImageOver(lockBtnImg_g); + lockBtnTT->SetText(tr( "Parental Control disabled" )); + } + + if(GetSelectedGame() >= 0) + lastSelectedGame = cut_bounds(GetSelectedGame(), 0, gameList.size()-1); + else + lastSelectedGame = cut_bounds(lastSelectedGame, 0, gameList.size()-1); + + delete gameBrowser; + delete gameGrid; + delete gameCarousel; + delete searchBar; + gameBrowser = NULL; + gameGrid = NULL; + gameCarousel = NULL; + searchBar = NULL; + + if (Settings.gameDisplay == LIST_MODE) + { + DownloadBtn->SetSize(160, 224); + listBtn->SetImage(listBtnImg); + listBtn->SetImageOver(listBtnImg); + gridBtn->SetImage(gridBtnImg_g); + gridBtn->SetImageOver(gridBtnImg_g); + carouselBtn->SetImage(carouselBtnImg_g); + carouselBtn->SetImageOver(carouselBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamelist_favorite_x, Theme.gamelist_favorite_y); + searchBtn->SetPosition(Theme.gamelist_search_x, Theme.gamelist_search_y); + sortBtn->SetPosition(Theme.gamelist_abc_x, Theme.gamelist_abc_y); + listBtn->SetPosition(Theme.gamelist_list_x, Theme.gamelist_list_y); + gridBtn->SetPosition(Theme.gamelist_grid_x, Theme.gamelist_grid_y); + carouselBtn->SetPosition(Theme.gamelist_carousel_x, Theme.gamelist_carousel_y); + lockBtn->SetPosition(Theme.gamelist_lock_x, Theme.gamelist_lock_y); + dvdBtn->SetPosition(Theme.gamelist_dvd_x, Theme.gamelist_dvd_y); + + gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, lastSelectedGame); + gameBrowser->SetPosition(Theme.gamelist_x, Theme.gamelist_y); + gameBrowser->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + else if (Settings.gameDisplay == GRID_MODE) + { + DownloadBtn->SetImage(NULL); + DownloadBtn->SetSize(0, 0); + gridBtn->SetImage(gridBtnImg); + gridBtn->SetImageOver(gridBtnImg); + listBtn->SetImage(listBtnImg_g); + listBtn->SetImageOver(listBtnImg_g); + carouselBtn->SetImage(carouselBtnImg_g); + carouselBtn->SetImageOver(carouselBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamegrid_favorite_x, Theme.gamegrid_favorite_y); + searchBtn->SetPosition(Theme.gamegrid_search_x, Theme.gamegrid_search_y); + sortBtn->SetPosition(Theme.gamegrid_abc_x, Theme.gamegrid_abc_y); + listBtn->SetPosition(Theme.gamegrid_list_x, Theme.gamegrid_list_y); + gridBtn->SetPosition(Theme.gamegrid_grid_x, Theme.gamegrid_grid_y); + carouselBtn->SetPosition(Theme.gamegrid_carousel_x, Theme.gamegrid_carousel_y); + lockBtn->SetPosition(Theme.gamegrid_lock_x, Theme.gamegrid_lock_y); + dvdBtn->SetPosition(Theme.gamegrid_dvd_x, Theme.gamegrid_dvd_y); + + gameGrid = new GuiGameGrid(Theme.gamegrid_w, Theme.gamegrid_h, Settings.theme_path, bg_options_png, lastSelectedGame); + gameGrid->SetPosition(Theme.gamegrid_x, Theme.gamegrid_y); + gameGrid->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + else if (Settings.gameDisplay == CAROUSEL_MODE) + { + DownloadBtn->SetImage(NULL); + DownloadBtn->SetSize(0, 0); + carouselBtn->SetImage(carouselBtnImg); + carouselBtn->SetImageOver(carouselBtnImg); + listBtn->SetImage(listBtnImg_g); + listBtn->SetImageOver(listBtnImg_g); + gridBtn->SetImage(gridBtnImg_g); + gridBtn->SetImageOver(gridBtnImg_g); + + favoriteBtn->SetPosition(Theme.gamecarousel_favorite_x, Theme.gamecarousel_favorite_y); + searchBtn->SetPosition(Theme.gamecarousel_search_x, Theme.gamecarousel_favorite_y); + sortBtn->SetPosition(Theme.gamecarousel_abc_x, Theme.gamecarousel_abc_y); + listBtn->SetPosition(Theme.gamecarousel_list_x, Theme.gamecarousel_list_y); + gridBtn->SetPosition(Theme.gamecarousel_grid_x, Theme.gamecarousel_grid_y); + carouselBtn->SetPosition(Theme.gamecarousel_carousel_x, Theme.gamecarousel_carousel_y); + lockBtn->SetPosition(Theme.gamecarousel_lock_x, Theme.gamecarousel_lock_y); + dvdBtn->SetPosition(Theme.gamecarousel_dvd_x, Theme.gamecarousel_dvd_y); + + gameCarousel = new GuiGameCarousel(640, 400, Settings.theme_path, bg_options_png, lastSelectedGame); + gameCarousel->SetPosition(Theme.gamecarousel_x, Theme.gamecarousel_y); + gameCarousel->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); + } + + + if (Theme.show_hddinfo == -1 || Theme.show_hddinfo == 1) //force show hdd info + Append(usedSpaceTxt); + if (Theme.show_gamecount == -1 || Theme.show_gamecount == 1) //force show game cnt info + Append(gamecntBtn); + Append(sdcardBtn); + Append(poweroffBtn); + Append(gameInfo); + if (Settings.godmode) Append(installBtn); + Append(homeBtn); + Append(settingsBtn); + Append(DownloadBtn); + Append(idBtn); + Append(homebrewBtn); + + Append(favoriteBtn); + Append(searchBtn); + Append(sortBtn); + Append(listBtn); + Append(gridBtn); + Append(carouselBtn); + Append(lockBtn); + Append(dvdBtn); + + if ((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) + { + Append(clockTimeBack); + Append(clockTime); + } + + if (gameBrowser) + Append(gameBrowser); + + else if (gameGrid) + Append(gameGrid); + + else if (gameCarousel) + Append(gameCarousel); + + if (show_searchwindow) + { + searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); + mainWindow->Append(searchBar); + } + + SetEffect(EFFECT_FADE, 40); + ResumeGui(); + + while(parentElement && this->GetEffect() > 0) usleep(100); +} + +int GameBrowseMenu::Show() +{ + int menu = MENU_NONE; + + while(menu == MENU_NONE) + { + usleep(100); + + if (shutdown) + Sys_Shutdown(); + if (reset) + Sys_Reboot(); + + menu = MainLoop(); + } + + return menu; +} + + +int GameBrowseMenu::MainLoop() +{ + WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if i disc has been inserted + + //CLOCK + if (Settings.hddinfo == CLOCK_HR12 || Settings.hddinfo == CLOCK_HR24) + { + time_t rawtime = time(0); + if(rawtime != lastrawtime) + { + lastrawtime = rawtime; + struct tm * timeinfo = localtime(&rawtime); + if (Settings.hddinfo == CLOCK_HR12) + { + if (rawtime & 1) + strftime(theTime, sizeof(theTime), "%I:%M", timeinfo); + else + strftime(theTime, sizeof(theTime), "%I %M", timeinfo); + } + if (Settings.hddinfo == CLOCK_HR24) + { + if (rawtime & 1) + strftime(theTime, sizeof(theTime), "%H:%M", timeinfo); + else + strftime(theTime, sizeof(theTime), "%H %M", timeinfo); + } + clockTime->SetText(theTime); + } + } + + if (updateavailable == true) + { + gprintf("\tUpdate Available\n"); + SetState(STATE_DISABLED); + ProgressUpdateWindow(); + updateavailable = false; + SetState(STATE_DEFAULT); + } + + else if (poweroffBtn->GetState() == STATE_CLICKED) + { + gprintf("\tpoweroffBtn clicked\n"); + int choice = WindowPrompt(tr( "How to Shutdown?" ), 0, tr( "Full Shutdown" ), tr( "Shutdown to Idle" ), tr( "Cancel" )); + if (choice == 2) + Sys_ShutdownToIdle(); + else if (choice == 1) + Sys_ShutdownToStandby(); + + poweroffBtn->ResetState(); + } + else if (gamecntBtn->GetState() == STATE_CLICKED) + { + gprintf("\tgameCntBtn clicked\n"); + gamecntBtn->ResetState(); + if(mountMethod == 3) + return MENU_NONE; + + int choice = WindowPrompt(0, fmt("%s %sGameList ?", tr( "Save Game List to" ), Settings.update_path), "TXT", "CSV", tr( "Back" )); + if (choice) + { + if (save_gamelist(choice - 1)) + WindowPrompt(0, tr( "Saved" ), tr( "OK" )); + else + WindowPrompt(tr( "Error" ), tr( "Could not save." ), tr( "OK" )); + } + } + else if (homeBtn->GetState() == STATE_CLICKED) + { + gprintf("\thomeBtn clicked\n"); + bgMusic->Pause(); + int choice = WindowExitPrompt(); + bgMusic->Resume(); + + if (choice == 3) + Sys_LoadMenu(); // Back to System Menu + else if (choice == 2) + Sys_BackToLoader(); + + homeBtn->ResetState(); + } + else if (installBtn->GetState() == STATE_CLICKED) + { + int choice = WindowPrompt(tr( "Install a game" ), 0, tr( "Yes" ), tr( "No" )); + if (choice == 1) + return MENU_INSTALL; + + installBtn->ResetState(); + } + else if ((DiscDriveCover & 0x02) && (DiscDriveCover != DiscDriveCoverOld)) + { + gprintf("\tNew Disc Detected\n"); + int choice = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), tr( "Cancel" )); + if (choice == 1) + return MENU_INSTALL; + else if (choice == 2) + dvdBtn->SetState(STATE_CLICKED); + } + + else if (sdcardBtn->GetState() == STATE_CLICKED) + { + gprintf("\tsdCardBtn Clicked\n"); + HaltGui(); + bgMusic->Pause(); + SDCard_Init(); + Settings.Load(); + bgMusic->Resume(); + ReloadBrowser(); + ResumeGui(); + sdcardBtn->ResetState(); + } + + else if (DownloadBtn->GetState() == STATE_CLICKED) + { + gprintf("\tDownloadBtn Clicked\n"); + CoverDownload(); + ReloadBrowser(); + DownloadBtn->ResetState(); + } + + else if (settingsBtn->GetState() == STATE_CLICKED) + { + return MENU_SETTINGS; + } + + else if (favoriteBtn->GetState() == STATE_CLICKED) + { + favoriteBtn->ResetState(); + gprintf("\tfavoriteBtn Clicked\n"); + + if(Settings.GameSort & SORT_FAVORITE) + Settings.GameSort &= ~SORT_FAVORITE; + else + Settings.GameSort |= SORT_FAVORITE; + Settings.Save(); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + + else if (searchBtn->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tsearchBtn Clicked\n"); + show_searchwindow = !show_searchwindow; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + searchBtn->ResetState(); + } + + else if (searchBar && (searchChar = searchBar->GetClicked())) + { + if (searchChar > 27) + { + int len = gameList.GetCurrentFilter() ? wcslen(gameList.GetCurrentFilter()) : 0; + wchar_t newFilter[len + 2]; + if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); + newFilter[len] = searchChar; + newFilter[len + 1] = 0; + + gameList.FilterList(newFilter); + } + else if (searchChar == 7) // Close + { + show_searchwindow = false; + searchBtn->StopEffect(); + } + else if (searchChar == 8) // Backspace + { + int len = wcslen(gameList.GetCurrentFilter()); + wchar_t newFilter[len + 1]; + if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); + newFilter[len > 0 ? len - 1 : 0] = 0; + gameList.FilterList(newFilter); + } + ReloadBrowser(); + return MENU_NONE; + } + + else if (sortBtn->GetState() == STATE_CLICKED) + { + sortBtn->ResetState(); + gprintf("\tsortBtn clicked\n"); + if(Settings.GameSort & SORT_ABC) + { + Settings.GameSort &= ~SORT_ABC; + Settings.GameSort |= SORT_RANKING; + } + else if(Settings.GameSort & SORT_RANKING) + { + Settings.GameSort &= ~SORT_RANKING; + Settings.GameSort |= SORT_PLAYCOUNT; + } + else if(Settings.GameSort & SORT_PLAYCOUNT) + { + Settings.GameSort &= ~SORT_PLAYCOUNT; + Settings.GameSort |= SORT_ABC; + } + Settings.Save(); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + + else if (listBtn->GetState() == STATE_CLICKED) + { + gprintf("\tlistBtn Clicked\n"); + if (Settings.gameDisplay != LIST_MODE) + { + Settings.gameDisplay = LIST_MODE; + Settings.Save(); + ReloadBrowser(); + } + listBtn->ResetState(); + } + + else if (gridBtn->GetState() == STATE_CLICKED) + { + gprintf("\tgridBtn Clicked\n"); + if (Settings.gameDisplay != GRID_MODE) + { + Settings.gameDisplay = GRID_MODE; + Settings.Save(); + ReloadBrowser(); + } + gridBtn->ResetState(); + } + + else if (carouselBtn->GetState() == STATE_CLICKED) + { + gprintf("\tcarouselBtn Clicked\n"); + if (Settings.gameDisplay != CAROUSEL_MODE) + { + Settings.gameDisplay = CAROUSEL_MODE; + Settings.Save(); + ReloadBrowser(); + } + carouselBtn->ResetState(); + } + + else if (homebrewBtn->GetState() == STATE_CLICKED) + { + gprintf("\thomebrewBtn Clicked\n"); + return MENU_HOMEBREWBROWSE; + } + + else if (gameInfo->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tgameinfo Clicked\n"); + int SelectedGame = GetSelectedGame(); + gameInfo->ResetState(); + if (SelectedGame >= 0 && SelectedGame < (s32) gameList.size()) + { + rockout(SelectedGame); + struct discHdr *header = gameList[SelectedGame]; + char IDfull[7]; + snprintf(IDfull, sizeof(IDfull), "%s", (char *) header->id); + SetState(STATE_DISABLED); + int choice = showGameInfo(IDfull); + SetState(STATE_DEFAULT); + rockout(SelectedGame, 2); + if (choice == 2) + homeBtn->SetState(STATE_CLICKED); + } + } + else if (lockBtn->GetState() == STATE_CLICKED) + { + gprintf("\tlockBtn clicked\n"); + lockBtn->ResetState(); + if (!(Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1)) + { + WindowPrompt(tr( "Parental Control" ), tr( "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." ), tr( "OK" )); + return MENU_NONE; + } + + if (Settings.godmode && WindowPrompt(tr( "Parental Control" ), tr( "Are you sure you want to enable Parent Control?" ), tr( "Yes" ), tr( "No" )) == 1) + { + Settings.godmode = 0; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + else + { + // Require the user to enter the PIN code + char pin[5]; + memset(&pin, 0, 5); + int ret = OnScreenNumpad((char *) &pin, 5); + + if (ret <= 0) + return MENU_NONE; + + if (memcmp(pin, Settings.Parental.pin, 4) == 0) + { + Settings.godmode = 1; + wString oldFilter(gameList.GetCurrentFilter()); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + else + WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" )); + } + } + else if (dvdBtn->GetState() == STATE_CLICKED) + { + gprintf("\tdvdBtn Clicked\n"); + mountMethod = DiscMount(dvdheader); + dvdBtn->ResetState(); + + rockout(GetSelectedGame()); + } + + else if (Settings.gameDisplay == LIST_MODE && idBtn->GetState() == STATE_CLICKED && mountMethod != 3) + { + gprintf("\tidBtn Clicked\n"); + struct discHdr * header = gameList[GetSelectedGame()]; + //enter new game ID + char entered[7]; + snprintf(entered, sizeof(entered), "%s", (char *) header->id); + int result = OnScreenKeyboard(entered, sizeof(entered), 0); + if (result == 1) + { + WBFS_ReIDGame(header->id, entered); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + ReloadBrowser(); + } + idBtn->ResetState(); + } + + if (Settings.gameDisplay == LIST_MODE && GetSelectedGame() != gameSelectedOld) + { + gameSelectedOld = GetSelectedGame(); + int gameSelected = gameSelectedOld; + if(gameSelected >= 0 && gameSelected < (s32) gameList.size()) + { + struct discHdr *header = gameList[gameSelected]; + LoadCover(header); + UpdateGameInfoText(header->id); + } + } + + gameClicked = GetClickedGame(); + if ((gameClicked >= 0 && gameClicked < (s32) gameList.size()) || mountMethod == 1 || mountMethod == 2) + { + OpenClickedGame(); + } + + if (!IsWpadConnected() && Settings.screensaver != 0) + { + if(ScreensaverTimer == 0) + ScreensaverTimer = time(0); + //30s delay to not start screensaver on startup + if(time(0)-ScreensaverTimer > 30) + WindowScreensaver(); + } + else + ScreensaverTimer = 0; + + DiscDriveCoverOld = DiscDriveCover; + + return MENU_NONE; +} + +int GameBrowseMenu::GetSelectedGame() +{ + if(gameBrowser) + return gameBrowser->GetSelectedOption(); + + else if(gameCarousel) + return gameCarousel->GetSelectedOption(); + + else if(gameGrid) + return gameGrid->GetSelectedOption(); + + return -1; +} + +int GameBrowseMenu::GetClickedGame() +{ + if(gameBrowser) + return gameBrowser->GetClickedOption(); + + else if(gameCarousel) + return gameCarousel->GetClickedOption(); + + else if(gameGrid) + return gameGrid->GetClickedOption(); + + return -1; +} + +void GameBrowseMenu::UpdateGameInfoText(const u8 * gameId) +{ + char gameregion[10]; + char IDfull[7]; + memset(IDfull, 0, sizeof(IDfull)); + snprintf(IDfull, sizeof(IDfull), (char *) gameId); + + switch (IDfull[3]) + { + case 'E': + sprintf(gameregion, "NTSC U"); + break; + case 'J': + sprintf(gameregion, "NTSC J"); + break; + case 'W': + sprintf(gameregion, "NTSC T"); + break; + default: + case 'K': + sprintf(gameregion, "NTSC K"); + break; + case 'P': + case 'D': + case 'F': + case 'I': + case 'S': + case 'H': + case 'U': + case 'X': + case 'Y': + case 'Z': + sprintf(gameregion, " PAL "); + break; + } + + HaltGui(); + if ((Settings.sinfo == GAMEINFO_ID) || (Settings.sinfo == GAMEINFO_BOTH)) + { + Remove(GameIDTxt); + delete GameIDTxt; + GameIDTxt = new GuiText(IDfull, 22, Theme.info); + GameIDTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + idBtn->SetEffect(EFFECT_FADE, 20); + idBtn->SetLabel(GameIDTxt); + Append(idBtn); + } + //don't try to show region for channels because all the custom channels wont follow the rules + if (((Settings.sinfo == GAMEINFO_REGION) || (Settings.sinfo == GAMEINFO_BOTH)) && mountMethod != 3) + { + Remove(GameRegionTxt); + delete GameRegionTxt; + GameRegionTxt = new GuiText(gameregion, 22, Theme.info); + GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + GameRegionTxt->SetPosition(Theme.region_x, Theme.region_y); + GameRegionTxt->SetEffect(EFFECT_FADE, 20); + Append(GameRegionTxt); + } + ResumeGui(); +} + +int GameBrowseMenu::OpenClickedGame() +{ + int gameSelected = GetSelectedGame(); + if(gameSelected < 0 || gameSelected >= gameList.size()) + return -1; + + if (searchBar) + { + HaltGui(); + mainWindow->Remove(searchBar); + ResumeGui(); + } + + float size = 0.0; + rockout(gameSelected); + + struct discHdr *header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); + if (!mountMethod)//only get this stuff if we are booting a game from USB + WBFS_GameSize(header->id, &size); + + char IDfull[7]; + snprintf(IDfull, sizeof(IDfull), "%s", (char *) header->id); + + u8 alternatedol = OFF; + u8 ocarinaChoice = Settings.ocarina; + + GameCFG* game_cfg = GameSettings.GetGameCFG(header->id); + if (game_cfg) + { + alternatedol = game_cfg->loadalternatedol; + ocarinaChoice = game_cfg->ocarina; + } + + bool returnHere = true;// prompt to start game + int choice = -1; + + while (returnHere) + { + returnHere = false; + + if (Settings.wiilight == ON) + wiilight(1); + + if (Settings.quickboot) //quickboot game + choice = 1; + else + { + SetState(STATE_DISABLED); + choice = GameWindowPrompt(gameSelected); + SetState(STATE_DEFAULT); + } + + if (choice == 1) + { + if (alternatedol == 2) + CheckAlternativeDOL(IDfull); + + if (ocarinaChoice != OFF) + CheckOcarina(IDfull); + + wiilight(0); + GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); + GameStatistics.Save(); + + //Just calling that shuts down everything and starts game + BootGame(IDfull); + } + else if (choice == 2) + { + wiilight(0); + + header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); + SetState(STATE_DISABLED); + int settret = MenuGameSettings(header); + SetState(STATE_DEFAULT); + if (settret != MENU_DISCLIST) + returnHere = true; + else + ReloadBrowser(); + + rockout(2, GetSelectedGame()); + } + else if(choice == 3) + returnHere = true; + } + + if (searchBar) + { + HaltGui(); + mainWindow->Append(searchBar); + ResumeGui(); + } + + return 0; +} + +void GameBrowseMenu::LoadCover(struct discHdr *header) +{ + DownloadBtn->SetImage(NULL); + if(gameCover) + delete gameCover; + + gameCover = LoadCoverImage(header); + + if (gameCoverImg) + delete gameCoverImg; + + gameCoverImg = new GuiImage(gameCover); + gameCoverImg->SetWidescreen(Settings.widescreen); + + DownloadBtn->SetImage(gameCoverImg);// put the new image on the download button +} + +void GameBrowseMenu::CheckOcarina(const char * IDfull) +{ + char filepath[200]; + snprintf(filepath, sizeof(filepath), "%s%s.gct", Settings.Cheatcodespath, IDfull); + if (CheckFile(filepath) == false) + { + gprintf("\ttried to load missing gct.\n"); + sprintf(filepath, "%s %s", filepath, tr( "does not exist! Loading game without cheats." )); + WindowPrompt(tr( "Error" ), filepath, NULL, NULL, NULL, NULL, 170); + } +} + +void GameBrowseMenu::CheckAlternativeDOL(const char * IDfull) +{ + char filepath[200]; + snprintf(filepath, sizeof(filepath), "%s%s.dol", Settings.dolpath, IDfull); + if (CheckFile(filepath) == false) + { + sprintf(filepath, "%s %s", filepath, tr( "does not exist!" )); + WindowPrompt(tr( "Error" ), filepath, tr( "OK" )); + } +} + +void GameBrowseMenu::CoverDownload() +{ + int choice = WindowPrompt(tr( "Cover Download" ), 0, tr( "Normal Covers" ), tr( "3D Covers" ), + tr( "Disc Images" ), tr( "Back" )); // ask for download choice + if (choice == 0) + return; + + int choice2 = choice; + bool missing; + missing = SearchMissingImages(choice2); + if (IsNetworkInit() == false && missing == true) + { + WindowPrompt(tr( "Network init error" ), 0, tr( "OK" )); + return; + } + + if (cntMissFiles > 0) + { + char tempCnt[40]; + sprintf(tempCnt, "%i %s", cntMissFiles, tr( "Missing files" )); + if (choice != 3) + choice = WindowPrompt(tr( "Download Boxart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); + else if (choice == 3) + choice = WindowPrompt(tr( "Download Discart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); + if (choice == 1) + { + int ret = ProgressDownloadWindow(choice2); + if (ret == 0) + { + WindowPrompt(tr( "Download finished" ), 0, tr( "OK" )); + } + else + { + sprintf(tempCnt, "%i %s", ret, tr( "files not found on the server!" )); + WindowPrompt(tr( "Download finished" ), tempCnt, tr( "OK" )); + } + } + } +} + +void GameBrowseMenu::UpdateCallback(void * e) +{ + //! Draw the selected Icon allways on top + GameBrowseMenu * w = (GameBrowseMenu *) e; + + for(u32 i = 0; i < w->ToolBar.size(); ++i) + { + if(w->ToolBar[i]->GetState() == STATE_SELECTED) + { + w->Remove(w->ToolBar[i]); + w->Append(w->ToolBar[i]); + break; + } + } +} diff --git a/source/menu/GameBrowseMenu.hpp b/source/menu/GameBrowseMenu.hpp new file mode 100644 index 00000000..2d513465 --- /dev/null +++ b/source/menu/GameBrowseMenu.hpp @@ -0,0 +1,155 @@ +#ifndef GAMEBROWSEMENU_HPP_ +#define GAMEBROWSEMENU_HPP_ + +#include "libwiigui/gui.h" +#include "libwiigui/gui_gamebrowser.h" +#include "libwiigui/gui_gamegrid.h" +#include "libwiigui/gui_gamecarousel.h" +#include "libwiigui/gui_searchbar.h" + +class GameBrowseMenu : public GuiWindow +{ + public: + GameBrowseMenu(); + ~GameBrowseMenu(); + int Show(); + protected: + int MainLoop(); + void ReloadBrowser(); + int OpenClickedGame(); + int GetSelectedGame(); + int GetClickedGame(); + void UpdateGameInfoText(const u8 * gameId); + void LoadCover(struct discHdr *header); + void CheckAlternativeDOL(const char * IDfull); + void CheckOcarina(const char * IDfull); + void CoverDownload(); + static void UpdateCallback(void * e); + + GuiImageData * btnInstall; + GuiImageData * btnInstallOver; + GuiImageData * btnSettings; + GuiImageData * btnSettingsOver; + GuiImageData * btnpwroff; + GuiImageData * btnpwroffOver; + GuiImageData * btnhome; + GuiImageData * btnhomeOver; + GuiImageData * btnsdcardOver; + GuiImageData * btnsdcard; + GuiImageData * imgfavIcon; + GuiImageData * imgfavIcon_gray; + GuiImageData * imgsearchIcon; + GuiImageData * imgsearchIcon_gray; + GuiImageData * imgabcIcon; + GuiImageData * imgrankIcon; + GuiImageData * imgplayCountIcon; + GuiImageData * imgarrangeGrid; + GuiImageData * imgarrangeGrid_gray; + GuiImageData * imgarrangeCarousel; + GuiImageData * imgarrangeCarousel_gray; + GuiImageData * imgarrangeList; + GuiImageData * imgarrangeList_gray; + GuiImageData * imgdvd; + GuiImageData * imgdvd_gray; + GuiImageData * imgLock; + GuiImageData * imgLock_gray; + GuiImageData * imgUnlock; + GuiImageData * imgUnlock_gray; + GuiImageData * homebrewImgData; + GuiImageData * homebrewImgDataOver; + GuiImageData * gameCover; + + GuiTrigger * trigA; + GuiTrigger * trigHome; + GuiTrigger * trig1; + GuiTrigger * trig2; + + GuiImage * installBtnImg; + GuiImage * installBtnImgOver; + GuiImage * settingsBtnImg; + GuiImage * settingsBtnImgOver; + GuiImage * homeBtnImg; + GuiImage * homeBtnImgOver; + GuiImage * poweroffBtnImg; + GuiImage * poweroffBtnImgOver; + GuiImage * sdcardImg; + GuiImage * sdcardImgOver; + GuiImage * favoriteBtnImg; + GuiImage * favoriteBtnImg_g; + GuiImage * searchBtnImg; + GuiImage * searchBtnImg_g; + GuiImage * sortBtnImg; + GuiImage * listBtnImg; + GuiImage * listBtnImg_g; + GuiImage * gridBtnImg; + GuiImage * gridBtnImg_g; + GuiImage * carouselBtnImg; + GuiImage * carouselBtnImg_g; + GuiImage * lockBtnImg; + GuiImage * lockBtnImg_g; + GuiImage * unlockBtnImg; + GuiImage * unlockBtnImg_g; + GuiImage * dvdBtnImg; + GuiImage * dvdBtnImg_g; + GuiImage * homebrewImg; + GuiImage * homebrewImgOver; + GuiImage * gameCoverImg; + + GuiText * usedSpaceTxt; + GuiText * gamecntTxt; + GuiText * clockTimeBack; + GuiText * clockTime; + + GuiButton * gamecntBtn; + GuiButton * installBtn; + GuiButton * settingsBtn; + GuiButton * homeBtn; + GuiButton * poweroffBtn; + GuiButton * sdcardBtn; + GuiButton * gameInfo; + GuiButton * favoriteBtn; + GuiButton * searchBtn; + GuiButton * sortBtn; + GuiButton * listBtn; + GuiButton * gridBtn; + GuiButton * carouselBtn; + GuiButton * lockBtn; + GuiButton * dvdBtn; + GuiButton * homebrewBtn; + GuiButton * DownloadBtn; + GuiButton * idBtn; + + GuiTooltip * installBtnTT; + GuiTooltip * settingsBtnTT; + GuiTooltip * homeBtnTT; + GuiTooltip * poweroffBtnTT; + GuiTooltip * sdcardBtnTT; + GuiTooltip * favoriteBtnTT; + GuiTooltip * searchBtnTT; + GuiTooltip * sortBtnTT; + GuiTooltip * listBtnTT; + GuiTooltip * gridBtnTT; + GuiTooltip * carouselBtnTT; + GuiTooltip * lockBtnTT; + GuiTooltip * dvdBtnTT; + GuiTooltip * homebrewBtnTT; + GuiTooltip * DownloadBtnTT; + GuiTooltip * IDBtnTT; + + GuiGameBrowser * gameBrowser; + GuiGameGrid * gameGrid; + GuiGameCarousel * gameCarousel; + GuiSearchBar * searchBar; + char theTime[50]; + u32 DiscDriveCover; + u32 DiscDriveCoverOld; + int gameSelectedOld; + int gameClicked; + time_t lastrawtime; + time_t ScreensaverTimer; + bool show_searchwindow; + wchar_t searchChar; + std::vector ToolBar; +}; + +#endif diff --git a/source/menu/menu_disclist.cpp b/source/menu/menu_disclist.cpp index 3453401c..4060b7a6 100644 --- a/source/menu/menu_disclist.cpp +++ b/source/menu/menu_disclist.cpp @@ -1,1642 +1,19 @@ +#include "GameBrowseMenu.hpp" #include "menus.h" -#include "fatmounter.h" -#include "usbloader/wdvd.h" -#include "usbloader/GameList.h" -#include "usbloader/wbfs.h" -#include "patches/fst.h" -#include "network/networkops.h" -#include "prompts/gameinfo.h" -#include "prompts/DiscBrowser.h" -#include "prompts/TitleBrowser.h" -#include "settings/Settings.h" -#include "settings/CGameSettings.h" -#include "settings/CGameStatistics.h" -#include "settings/GameTitles.h" -#include "themes/CTheme.h" -#include "GameBootProcess.h" -#include "wpad.h" -#include "sys.h" - -#include "libwiigui/gui_gamebrowser.h" -#include "libwiigui/gui_gamegrid.h" -#include "libwiigui/gui_gamecarousel.h" -#include "libwiigui/gui_searchbar.h" - -extern u8 * gameScreenTex; -extern struct discHdr *dvdheader; -extern u8 mountMethod; -extern int load_from_fs; -extern s32 gameSelected; -extern GuiText * GameIDTxt; -extern GuiText * GameRegionTxt; -extern const u8 data1; -extern FreeTypeGX *fontClock; -extern bool updateavailable; -extern int cntMissFiles; -extern GuiImageData * cover; -extern GuiImage * coverImg; -extern GuiImageData * pointer[4]; -extern bool altdoldefault; -extern GuiImage * bgImg; - -GuiButton *Toolbar[9]; -int idiotFlag = -1; -char idiotChar[50]; - -void DiscListWinUpdateCallback(void * e); -void rockout(int f = 0); - -static u32 startat = 0; /**************************************************************************** * MenuDiscList ***************************************************************************/ int MenuDiscList() { - gprintf("MenuDiscList()\n"); - gameList.FilterList(); - int offset = MIN( ( int )startat, gameList.size() - 1 ); - startat = offset; - int datagB = 0; - int dataed = -1; - int selectImg1 = 0; - char ID[4]; - char IDfull[7]; - u32 covert = 0; - if (!dvdheader) dvdheader = new struct discHdr; - u8 mountMethodOLD = 0; + int retMenu = MENU_NONE; - WDVD_GetCoverStatus(&covert); - u32 covertOld = covert; + GameBrowseMenu * Menu = new GameBrowseMenu(); + mainWindow->Append(Menu); - f32 freespace, used, size = 0.0; - wchar_t searchChar; - //SCREENSAVER - int check = 0; //to skip the first cycle when wiimote isn't completely connected + retMenu = Menu->Show(); - datagB = 0; - int menu = MENU_NONE; + delete Menu; - u32 nolist; - int choice = 0, selectedold = 100; - s32 ret; - - //CLOCK - struct tm * timeinfo; - char theTime[80] = ""; - time_t lastrawtime = 0; - - if (mountMethod != 3 && WBFS_ShowFreeSpace()) - { - WBFS_DiskSpace(&used, &freespace); - } - - if (!gameList.size()) //if there is no list of games to display - { - nolist = 1; - } - - GuiImageData btnInstall(Resources::GetFile("button_install.png"), Resources::GetFileSize("button_install.png")); - GuiImageData btnInstallOver(Resources::GetFile("button_install_over.png"), Resources::GetFileSize("button_install_over.png")); - - GuiImageData btnSettings(Resources::GetFile("settings_button.png"), Resources::GetFileSize("settings_button.png")); - GuiImageData btnSettingsOver(Resources::GetFile("settings_button_over.png"), Resources::GetFileSize("settings_button_over.png")); - - GuiImageData btnpwroff(Resources::GetFile("wiimote_poweroff.png"), Resources::GetFileSize("wiimote_poweroff.png")); - GuiImageData btnpwroffOver(Resources::GetFile("wiimote_poweroff_over.png"), Resources::GetFileSize("wiimote_poweroff_over.png")); - GuiImageData btnhome(Resources::GetFile("menu_button.png"), Resources::GetFileSize("menu_button.png")); - GuiImageData btnhomeOver(Resources::GetFile("menu_button_over.png"), Resources::GetFileSize("menu_button_over.png")); - GuiImageData btnsdcardOver(Resources::GetFile("sdcard_over.png"), Resources::GetFileSize("sdcard_over.png")); - GuiImageData btnsdcard(Resources::GetFile("sdcard.png"), Resources::GetFileSize("sdcard.png")); - - GuiImageData imgfavIcon(Resources::GetFile("favIcon.png"), Resources::GetFileSize("favIcon.png")); - GuiImageData imgfavIcon_gray(Resources::GetFile("favIcon_gray.png"), Resources::GetFileSize("favIcon_gray.png")); - GuiImageData imgsearchIcon(Resources::GetFile("searchIcon.png"), Resources::GetFileSize("searchIcon.png")); - GuiImageData imgsearchIcon_gray(Resources::GetFile("searchIcon_gray.png"), Resources::GetFileSize("searchIcon_gray.png")); - GuiImageData imgabcIcon(Resources::GetFile("abcIcon.png"), Resources::GetFileSize("abcIcon.png")); - GuiImageData imgrankIcon(Resources::GetFile("rankIcon.png"), Resources::GetFileSize("rankIcon.png")); - GuiImageData imgplayCountIcon(Resources::GetFile("playCountIcon.png"), Resources::GetFileSize("playCountIcon.png")); - GuiImageData imgarrangeGrid(Resources::GetFile("arrangeGrid.png"), Resources::GetFileSize("arrangeGrid.png")); - GuiImageData imgarrangeGrid_gray(Resources::GetFile("arrangeGrid_gray.png"), Resources::GetFileSize("arrangeGrid_gray.png")); - GuiImageData imgarrangeList(Resources::GetFile("arrangeList.png"), Resources::GetFileSize("arrangeList.png")); - GuiImageData imgarrangeList_gray(Resources::GetFile("arrangeList_gray.png"), Resources::GetFileSize("arrangeList_gray.png")); - GuiImageData imgarrangeCarousel(Resources::GetFile("arrangeCarousel.png"), Resources::GetFileSize("arrangeCarousel.png")); - GuiImageData imgarrangeCarousel_gray(Resources::GetFile("arrangeCarousel_gray.png"), Resources::GetFileSize("arrangeCarousel_gray.png")); - - GuiImageData imgLock(Resources::GetFile("lock.png"), Resources::GetFileSize("lock.png")); - GuiImageData imgLock_gray(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); - GuiImageData imgUnlock(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); - GuiImageData imgUnlock_gray(Resources::GetFile("unlock_gray.png"), Resources::GetFileSize("unlock_gray.png")); - - GuiImageData imgdvd(Resources::GetFile("dvd.png"), Resources::GetFileSize("dvd.png")); - GuiImageData imgdvd_gray(Resources::GetFile("dvd_gray.png"), Resources::GetFileSize("dvd_gray.png")); - - GuiImageData homebrewImgData(Resources::GetFile("browser.png"), Resources::GetFileSize("browser.png")); - GuiImageData homebrewImgDataOver(Resources::GetFile("browser_over.png"), Resources::GetFileSize("browser_over.png")); - - GuiTrigger trigA; - trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, PAD_BUTTON_START); - GuiTrigger trig2; - trig2.SetButtonOnlyTrigger(-1, WPAD_BUTTON_2 | WPAD_CLASSIC_BUTTON_X, 0); - GuiTrigger trig1; - trig1.SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_Y, 0); - GuiTrigger trigZ; - trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z); - - GuiButton screenShotBtn(0, 0); - screenShotBtn.SetPosition(0, 0); - screenShotBtn.SetTrigger(&trigZ); - - char spaceinfo[30]; - if (load_from_fs == PART_FS_FAT) - { - memset(spaceinfo, 0, 30); - } - else - { - if (!strcmp(Settings.db_language, "JA")) - { - // needs to be "total...used" for Japanese - sprintf(spaceinfo, (mountMethod != 3 ? "%.2fGB %s %.2fGB %s" : " "), (freespace + used), tr( "of" ), - freespace, tr( "free" )); - } - else - { - sprintf(spaceinfo, (mountMethod != 3 ? "%.2fGB %s %.2fGB %s" : " "), freespace, tr( "of" ), (freespace - + used), tr( "free" )); - } - } - GuiText usedSpaceTxt(spaceinfo, 18, Theme.info); - usedSpaceTxt.SetAlignment(Theme.hddinfo_align, ALIGN_TOP); - usedSpaceTxt.SetPosition(Theme.hddinfo_x, Theme.hddinfo_y); - - char GamesCnt[15]; - sprintf(GamesCnt, "%s: %i", (mountMethod != 3 ? tr( "Games" ) : tr( "Channels" )), gameList.size()); - GuiText gamecntTxt(GamesCnt, 18, Theme.info); - - GuiButton gamecntBtn(100, 18); - gamecntBtn.SetAlignment(Theme.gamecount_align, ALIGN_TOP); - gamecntBtn.SetPosition(Theme.gamecount_x, Theme.gamecount_y); - gamecntBtn.SetLabel(&gamecntTxt); - gamecntBtn.SetEffectGrow(); - gamecntBtn.SetTrigger(&trigA); - - GuiTooltip installBtnTT(tr( "Install a game" )); - if (Settings.wsprompt) installBtnTT.SetWidescreen(Settings.widescreen); - installBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage installBtnImg(&btnInstall); - GuiImage installBtnImgOver(&btnInstallOver); - installBtnImg.SetWidescreen(Settings.widescreen); - installBtnImgOver.SetWidescreen(Settings.widescreen); - - GuiButton installBtn(&installBtnImg, &installBtnImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.install_x, Theme.install_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &installBtnTT, 24, -30, 0, 5); - - GuiTooltip settingsBtnTT(tr( "Settings" )); - if (Settings.wsprompt) settingsBtnTT.SetWidescreen(Settings.widescreen); - settingsBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage settingsBtnImg(&btnSettings); - settingsBtnImg.SetWidescreen(Settings.widescreen); - GuiImage settingsBtnImgOver(&btnSettingsOver); - settingsBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton settingsBtn(&settingsBtnImg, &settingsBtnImgOver, 0, 3, Theme.setting_x, Theme.setting_y, &trigA, - btnSoundOver, btnSoundClick2, 1, &settingsBtnTT, 65, -30, 0, 5); - - GuiTooltip homeBtnTT(tr( "Back to HBC or Wii Menu" )); - if (Settings.wsprompt) homeBtnTT.SetWidescreen(Settings.widescreen); - settingsBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage homeBtnImg(&btnhome); - homeBtnImg.SetWidescreen(Settings.widescreen); - GuiImage homeBtnImgOver(&btnhomeOver); - homeBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton homeBtn(&homeBtnImg, &homeBtnImgOver, 0, 3, Theme.home_x, Theme.home_y, &trigA, btnSoundOver, btnSoundClick2, - 1, &homeBtnTT, 15, -30, 1, 5); - homeBtn.RemoveSoundClick(); - homeBtn.SetTrigger(&trigHome); - - GuiTooltip poweroffBtnTT(tr( "Power off the Wii" )); - if (Settings.wsprompt) poweroffBtnTT.SetWidescreen(Settings.widescreen); - poweroffBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage poweroffBtnImg(&btnpwroff); - GuiImage poweroffBtnImgOver(&btnpwroffOver); - poweroffBtnImg.SetWidescreen(Settings.widescreen); - poweroffBtnImgOver.SetWidescreen(Settings.widescreen); - GuiButton poweroffBtn(&poweroffBtnImg, &poweroffBtnImgOver, 0, 3, Theme.power_x, Theme.power_y, &trigA, - btnSoundOver, btnSoundClick2, 1, &poweroffBtnTT, -10, -30, 1, 5); - - GuiTooltip sdcardBtnTT(tr( "Reload SD" )); - if (Settings.wsprompt) sdcardBtnTT.SetWidescreen(Settings.widescreen); - sdcardBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage sdcardImg(&btnsdcard); - GuiImage sdcardImgOver(&btnsdcardOver); - sdcardImg.SetWidescreen(Settings.widescreen); - sdcardImgOver.SetWidescreen(Settings.widescreen); - GuiButton sdcardBtn(&sdcardImg, &sdcardImgOver, 0, 3, Theme.sdcard_x, Theme.sdcard_y, &trigA, btnSoundOver, - btnSoundClick2, 1, &sdcardBtnTT, 15, -30, 0, 5); - - GuiButton gameInfo(0, 0); - gameInfo.SetTrigger(&trig2); - gameInfo.SetSoundClick(btnSoundClick2); - - GuiTooltip favoriteBtnTT(tr( "Display favorites only" )); - if (Settings.wsprompt) favoriteBtnTT.SetWidescreen(Settings.widescreen); - favoriteBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage favoriteBtnImg(&imgfavIcon); - favoriteBtnImg.SetWidescreen(Settings.widescreen); - GuiImage favoriteBtnImg_g(&imgfavIcon_gray); - favoriteBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton favoriteBtn(&favoriteBtnImg_g, &favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_favorite_x, - Theme.gamelist_favorite_y, &trigA, btnSoundOver, btnSoundClick2, 1, &favoriteBtnTT, -15, 52, 0, 3); - favoriteBtn.SetAlpha(180); - - GuiTooltip searchBtnTT(tr( "Set Search-Filter" )); - if (Settings.wsprompt) searchBtnTT.SetWidescreen(Settings.widescreen); - searchBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage searchBtnImg(&imgsearchIcon); - searchBtnImg.SetWidescreen(Settings.widescreen); - GuiImage searchBtnImg_g(&imgsearchIcon_gray); - searchBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton searchBtn(&searchBtnImg_g, &searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_search_x, - Theme.gamelist_search_y, &trigA, btnSoundOver, btnSoundClick2, 1, &searchBtnTT, -15, 52, 0, 3); - searchBtn.SetAlpha(180); - - const char * sortTTText = NULL; - GuiImageData * sortImgData = NULL; - - if(Settings.GameSort & SORT_RANKING) - { - sortTTText = tr( "Sort by rank" ); - sortImgData = &imgrankIcon; - } - else if(Settings.GameSort & SORT_PLAYCOUNT) - { - sortTTText = tr( "Sort order by most played"); - sortImgData = &imgplayCountIcon; - } - else - { - sortTTText = tr("Sort alphabetically"); - sortImgData = &imgabcIcon; - } - - GuiTooltip sortBtnTT(sortTTText); - if (Settings.wsprompt) sortBtnTT.SetWidescreen(Settings.widescreen); - sortBtnTT.SetAlpha(Theme.tooltipAlpha); - - GuiImage sortBtnImg(sortImgData); - sortBtnImg.SetWidescreen(Settings.widescreen); - GuiButton sortBtn(&sortBtnImg, &sortBtnImg, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_abc_x, Theme.gamelist_abc_y, &trigA, btnSoundOver, btnSoundClick2, 1, &sortBtnTT, -15, 52, 0, 3); - - GuiTooltip listBtnTT(tr( "Display as a list" )); - if (Settings.wsprompt) listBtnTT.SetWidescreen(Settings.widescreen); - listBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage listBtnImg(&imgarrangeList); - listBtnImg.SetWidescreen(Settings.widescreen); - GuiImage listBtnImg_g(&imgarrangeList_gray); - listBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton listBtn(&listBtnImg_g, &listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_list_x, - Theme.gamelist_list_y, &trigA, btnSoundOver, btnSoundClick2, 1, &listBtnTT, 15, 52, 1, 3); - listBtn.SetAlpha(180); - - GuiTooltip gridBtnTT(tr( "Display as a grid" )); - if (Settings.wsprompt) gridBtnTT.SetWidescreen(Settings.widescreen); - gridBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage gridBtnImg(&imgarrangeGrid); - gridBtnImg.SetWidescreen(Settings.widescreen); - GuiImage gridBtnImg_g(&imgarrangeGrid_gray); - gridBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton gridBtn(&gridBtnImg_g, &gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_grid_x, - Theme.gamelist_grid_y, &trigA, btnSoundOver, btnSoundClick2, 1, &gridBtnTT, 15, 52, 1, 3); - gridBtn.SetAlpha(180); - - GuiTooltip carouselBtnTT(tr( "Display as a carousel" )); - if (Settings.wsprompt) carouselBtnTT.SetWidescreen(Settings.widescreen); - carouselBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage carouselBtnImg(&imgarrangeCarousel); - carouselBtnImg.SetWidescreen(Settings.widescreen); - GuiImage carouselBtnImg_g(&imgarrangeCarousel_gray); - carouselBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton carouselBtn(&carouselBtnImg_g, &carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_carousel_x, - Theme.gamelist_carousel_y, &trigA, btnSoundOver, btnSoundClick2, 1, &carouselBtnTT, 15, 52, 1, 3); - carouselBtn.SetAlpha(180); - - bool canUnlock = (Settings.parentalcontrol == 0 && Settings.Parental.enabled == 1); - - GuiTooltip lockBtnTT(canUnlock ? tr( "Unlock Parental Control" ) : tr( "Parental Control disabled" )); - if (Settings.wsprompt) lockBtnTT.SetWidescreen(Settings.widescreen); - lockBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage lockBtnImg(&imgLock); - lockBtnImg.SetWidescreen(Settings.widescreen); - GuiImage lockBtnImg_g(&imgLock_gray); - lockBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton lockBtn(&lockBtnImg_g, &lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_lock_x, - Theme.gamelist_lock_y, &trigA, btnSoundOver, btnSoundClick2, 1, &lockBtnTT, 15, 52, 1, 3); - lockBtn.SetAlpha(180); - - GuiTooltip unlockBtnTT(tr( "Enable Parental Control" )); - if (Settings.wsprompt) unlockBtnTT.SetWidescreen(Settings.widescreen); - unlockBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage unlockBtnImg(&imgUnlock); - unlockBtnImg.SetWidescreen(Settings.widescreen); - GuiImage unlockBtnImg_g(&imgUnlock_gray); - unlockBtnImg_g.SetWidescreen(Settings.widescreen); - - if (canUnlock && Settings.godmode) - { - lockBtn.SetImage(&unlockBtnImg_g); - lockBtn.SetImageOver(&unlockBtnImg_g); - lockBtn.SetToolTip(&unlockBtnTT, 15, 52, 1, 3); - } - - GuiTooltip dvdBtnTT(tr( "Mount DVD drive" )); - if (Settings.wsprompt) dvdBtnTT.SetWidescreen(Settings.widescreen); - dvdBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage dvdBtnImg(&imgdvd); - dvdBtnImg.SetWidescreen(Settings.widescreen); - GuiImage dvdBtnImg_g(dvdBtnImg); - dvdBtnImg_g.SetWidescreen(Settings.widescreen); - GuiButton dvdBtn(&dvdBtnImg_g, &dvdBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_dvd_x, Theme.gamelist_dvd_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &dvdBtnTT, 15, 52, 1, 3); - dvdBtn.SetAlpha(180); - - GuiTooltip homebrewBtnTT(tr( "Homebrew Launcher" )); - if (Settings.wsprompt) homebrewBtnTT.SetWidescreen(Settings.widescreen); - homebrewBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiImage homebrewImg(&homebrewImgData); - GuiImage homebrewImgOver(&homebrewImgDataOver); - homebrewImg.SetWidescreen(Settings.widescreen); - homebrewImgOver.SetWidescreen(Settings.widescreen); - GuiButton homebrewBtn(&homebrewImg, &homebrewImgOver, ALIGN_LEFT, ALIGN_TOP, Theme.homebrew_x, Theme.homebrew_y, - &trigA, btnSoundOver, btnSoundClick2, 1, &homebrewBtnTT, 15, -30, 1, 5); - - if (Settings.GameSort & SORT_FAVORITE) - { - favoriteBtn.SetImage(&favoriteBtnImg); - favoriteBtn.SetImageOver(&favoriteBtnImg); - favoriteBtn.SetAlpha(255); - } - static bool show_searchwindow = false; - if (*gameList.GetCurrentFilter()) - { - if (show_searchwindow && gameList.size() == 1) show_searchwindow = false; - if (!show_searchwindow) searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - searchBtn.SetImage(&searchBtnImg); - searchBtn.SetImageOver(&searchBtnImg); - searchBtn.SetAlpha(255); - } - if (Settings.gameDisplay == LIST_MODE) - { - listBtn.SetImage(&listBtnImg); - listBtn.SetImageOver(&listBtnImg); - listBtn.SetAlpha(255); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gridBtn.SetImage(&gridBtnImg); - gridBtn.SetImageOver(&gridBtnImg); - gridBtn.SetAlpha(255); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - carouselBtn.SetImage(&carouselBtnImg); - carouselBtn.SetImageOver(&carouselBtnImg); - carouselBtn.SetAlpha(255); - } - - if (Settings.gameDisplay == LIST_MODE) - { - favoriteBtn.SetPosition(Theme.gamelist_favorite_x, Theme.gamelist_favorite_y); - searchBtn.SetPosition(Theme.gamelist_search_x, Theme.gamelist_search_y); - sortBtn.SetPosition(Theme.gamelist_abc_x, Theme.gamelist_abc_y); - listBtn.SetPosition(Theme.gamelist_list_x, Theme.gamelist_list_y); - gridBtn.SetPosition(Theme.gamelist_grid_x, Theme.gamelist_grid_y); - carouselBtn.SetPosition(Theme.gamelist_carousel_x, Theme.gamelist_carousel_y); - lockBtn.SetPosition(Theme.gamelist_lock_x, Theme.gamelist_lock_y); - dvdBtn.SetPosition(Theme.gamelist_dvd_x, Theme.gamelist_dvd_y); - } - else if (Settings.gameDisplay == GRID_MODE) - { - favoriteBtn.SetPosition(Theme.gamegrid_favorite_x, Theme.gamegrid_favorite_y); - searchBtn.SetPosition(Theme.gamegrid_search_x, Theme.gamegrid_search_y); - sortBtn.SetPosition(Theme.gamegrid_abc_x, Theme.gamegrid_abc_y); - listBtn.SetPosition(Theme.gamegrid_list_x, Theme.gamegrid_list_y); - gridBtn.SetPosition(Theme.gamegrid_grid_x, Theme.gamegrid_grid_y); - carouselBtn.SetPosition(Theme.gamegrid_carousel_x, Theme.gamegrid_carousel_y); - lockBtn.SetPosition(Theme.gamegrid_lock_x, Theme.gamegrid_lock_y); - dvdBtn.SetPosition(Theme.gamegrid_dvd_x, Theme.gamegrid_dvd_y); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - favoriteBtn.SetPosition(Theme.gamecarousel_favorite_x, Theme.gamecarousel_favorite_y); - searchBtn.SetPosition(Theme.gamecarousel_search_x, Theme.gamecarousel_favorite_y); - sortBtn.SetPosition(Theme.gamecarousel_abc_x, Theme.gamecarousel_abc_y); - listBtn.SetPosition(Theme.gamecarousel_list_x, Theme.gamecarousel_list_y); - gridBtn.SetPosition(Theme.gamecarousel_grid_x, Theme.gamecarousel_grid_y); - carouselBtn.SetPosition(Theme.gamecarousel_carousel_x, Theme.gamecarousel_carousel_y); - lockBtn.SetPosition(Theme.gamecarousel_lock_x, Theme.gamecarousel_lock_y); - dvdBtn.SetPosition(Theme.gamecarousel_dvd_x, Theme.gamecarousel_dvd_y); - } - - //Downloading Covers - GuiTooltip DownloadBtnTT(tr( "Click to Download Covers" )); - if (Settings.wsprompt) DownloadBtnTT.SetWidescreen(Settings.widescreen); - DownloadBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiButton DownloadBtn(0, 0); - DownloadBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - DownloadBtn.SetPosition(Theme.covers_x, Theme.covers_y); - - GuiTooltip IDBtnTT(tr( "Click to change game ID" )); - if (Settings.wsprompt) IDBtnTT.SetWidescreen(Settings.widescreen); - IDBtnTT.SetAlpha(Theme.tooltipAlpha); - GuiButton idBtn(0, 0); - idBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - idBtn.SetPosition(Theme.id_x, Theme.id_y); - - if (Settings.godmode == 1 && mountMethod != 3) //only make the button have trigger & tooltip if in godmode - { - DownloadBtn.SetSoundOver(btnSoundOver); - DownloadBtn.SetTrigger(&trigA); - DownloadBtn.SetTrigger(&trig1); - DownloadBtn.SetToolTip(&DownloadBtnTT, 205, -30); - - idBtn.SetSoundOver(btnSoundOver); - idBtn.SetTrigger(&trigA); - idBtn.SetToolTip(&IDBtnTT, 205, -30); - - } - else - { - DownloadBtn.SetRumble(false); - idBtn.SetRumble(false); - } - - GuiGameBrowser * gameBrowser = NULL; - GuiGameGrid * gameGrid = NULL; - GuiGameCarousel * gameCarousel = NULL; - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, startat, offset); - gameBrowser->SetPosition(Theme.gamelist_x, Theme.gamelist_y); - gameBrowser->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid = new GuiGameGrid(Theme.gamegrid_w, Theme.gamegrid_h, Settings.theme_path, bg_options_png, 0, 0); - gameGrid->SetPosition(Theme.gamegrid_x, Theme.gamegrid_y); - gameGrid->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - //GuiGameCarousel gameCarousel(Theme.gamecarousel_w, Theme.gamecarousel_h, gameList, gameList.size(), Settings.theme_path, bg_options_png, startat, offset); - gameCarousel = new GuiGameCarousel(640, 400, Settings.theme_path, bg_options_png, startat, offset); - gameCarousel->SetPosition(Theme.gamecarousel_x, Theme.gamecarousel_y); - gameCarousel->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); - } - - GuiText clockTimeBack("88:88", 40, (GXColor) {Theme.clock.r, Theme.clock.g, Theme.clock.b, Theme.clock.a / 6}); - clockTimeBack.SetAlignment(Theme.clock_align, ALIGN_TOP); - clockTimeBack.SetPosition(Theme.clock_x, Theme.clock_y); - clockTimeBack.SetFont(clock_ttf, clock_ttf_size); - GuiText clockTime(theTime, 40, Theme.clock); - clockTime.SetAlignment(Theme.clock_align, ALIGN_TOP); - clockTime.SetPosition(Theme.clock_x, Theme.clock_y); - clockTime.SetFont(clock_ttf, clock_ttf_size); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - - if (Theme.show_hddinfo == -1 || Theme.show_hddinfo == 1) //force show hdd info - { - w.Append(&usedSpaceTxt); - } - if (Theme.show_gamecount == -1 || Theme.show_gamecount == 1) //force show game cnt info - { - w.Append(&gamecntBtn); - } - w.Append(&sdcardBtn); - w.Append(&poweroffBtn); - w.Append(&gameInfo); - if (Settings.godmode) w.Append(&installBtn); - w.Append(&homeBtn); - w.Append(&settingsBtn); - w.Append(&DownloadBtn); - w.Append(&idBtn); - w.Append(&screenShotBtn); - - // Begin Toolbar - w.Append(&favoriteBtn); - Toolbar[0] = &favoriteBtn; - w.Append(&searchBtn); - Toolbar[1] = &searchBtn; - w.Append(&sortBtn); - Toolbar[2] = &sortBtn; - w.Append(&listBtn); - Toolbar[3] = &listBtn; - w.Append(&gridBtn); - Toolbar[4] = &gridBtn; - w.Append(&carouselBtn); - Toolbar[5] = &carouselBtn; - w.Append(&lockBtn); - Toolbar[6] = &lockBtn; - w.Append(&dvdBtn); - Toolbar[7] = &dvdBtn; - w.SetUpdateCallback(DiscListWinUpdateCallback); - // End Toolbar - - if (Settings.godmode == 1) w.Append(&homebrewBtn); - - if ((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) - { - w.Append(&clockTimeBack); - w.Append(&clockTime); - } - - if (Settings.gameDisplay == LIST_MODE) - { - mainWindow->Append(gameBrowser); - } - if (Settings.gameDisplay == GRID_MODE) - { - mainWindow->Append(gameGrid); - } - if (Settings.gameDisplay == CAROUSEL_MODE) - { - mainWindow->Append(gameCarousel); - } - mainWindow->Append(&w); - - GuiSearchBar *searchBar = NULL; - if (show_searchwindow) - { - searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); - if (searchBar) mainWindow->Append(searchBar); - } - - ResumeGui(); - - // ShowMemInfo(); - - while (menu == MENU_NONE) - { - - if (idiotFlag == 1) - { - gprintf("\tIdiot flag\n"); - char idiotBuffer[200]; - snprintf(idiotBuffer, sizeof(idiotBuffer), "%s (%s). %s", tr( "You have attempted to load a bad image" ), - idiotChar, tr( "Most likely it has dimensions that are not evenly divisible by 4." )); - - int deleteImg = WindowPrompt(0, idiotBuffer, tr( "OK" ), tr( "Delete" )); - if (deleteImg == 0) - { - snprintf(idiotBuffer, sizeof(idiotBuffer), "%s %s.", tr( "You are about to delete " ), idiotChar); - deleteImg = WindowPrompt(tr( "Confirm" ), idiotBuffer, tr( "Delete" ), tr( "Cancel" )); - if (deleteImg == 1) - { - remove(idiotChar); - } - } - idiotFlag = -1; - } - - WDVD_GetCoverStatus(&covert);//for detecting if i disc has been inserted - - //CLOCK - time_t rawtime = time(0); - if (((Settings.hddinfo == CLOCK_HR12) || (Settings.hddinfo == CLOCK_HR24)) && rawtime != lastrawtime) - { - lastrawtime = rawtime; - timeinfo = localtime(&rawtime); - if (dataed < 1) - { - if (Settings.hddinfo == CLOCK_HR12) - { - if (rawtime & 1) - strftime(theTime, sizeof(theTime), "%I:%M", timeinfo); - else strftime(theTime, sizeof(theTime), "%I %M", timeinfo); - } - if (Settings.hddinfo == CLOCK_HR24) - { - if (rawtime & 1) - strftime(theTime, sizeof(theTime), "%H:%M", timeinfo); - else strftime(theTime, sizeof(theTime), "%H %M", timeinfo); - } - clockTime.SetText(theTime); - - } - else if (dataed > 0) - { - - clockTime.SetTextf("%i", (dataed - 1)); - } - - } - - // respond to button presses - if (shutdown == 1) - { - gprintf("\n\tshutdown"); - Sys_Shutdown(); - } - if (reset == 1) Sys_Reboot(); - - if (updateavailable == true) - { - gprintf("\tUpdate Available\n"); - HaltGui(); - GuiWindow ww(640, 480); - w.SetState(STATE_DISABLED); - mainWindow->Append(&ww); - ResumeGui(); - ProgressUpdateWindow(); - updateavailable = false; - mainWindow->Remove(&ww); - w.SetState(STATE_DEFAULT); - menu = MENU_DISCLIST; - } - - if (poweroffBtn.GetState() == STATE_CLICKED) - { - - gprintf("\tpoweroffBtn clicked\n"); - choice = WindowPrompt(tr( "How to Shutdown?" ), 0, tr( "Full Shutdown" ), tr( "Shutdown to Idle" ), - tr( "Cancel" )); - if (choice == 2) - { - Sys_ShutdownToIdel(); - } - else if (choice == 1) - { - Sys_ShutdownToStandby(); - } - else - { - poweroffBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - else if (gamecntBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tgameCntBtn clicked\n"); - gamecntBtn.ResetState(); - char linebuf[150]; - snprintf(linebuf, sizeof(linebuf), "%s %sGameList ?", tr( "Save Game List to" ), Settings.update_path); - choice = WindowPrompt(0, linebuf, "TXT", "CSV", tr( "Back" )); - if (choice) - { - if (save_gamelist(choice - 1)) - WindowPrompt(0, tr( "Saved" ), tr( "OK" )); - else WindowPrompt(tr( "Error" ), tr( "Could not save." ), tr( "OK" )); - } - menu = MENU_DISCLIST; - break; - - } - else if (screenShotBtn.GetState() == STATE_CLICKED) - { - gprintf("\tscreenShotBtn clicked\n"); - screenShotBtn.ResetState(); - ScreenShot(); - } - else if (homeBtn.GetState() == STATE_CLICKED) - { - gprintf("\thomeBtn clicked\n"); - bgMusic->Pause(); - choice = WindowExitPrompt(); - bgMusic->Resume(); - - if (choice == 3) - { - Sys_LoadMenu(); // Back to System Menu - } - else if (choice == 2) - { - Sys_BackToLoader(); - } - else - { - homeBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - else if (installBtn.GetState() == STATE_CLICKED) - { - choice = WindowPrompt(tr( "Install a game" ), 0, tr( "Yes" ), tr( "No" )); - if (choice == 1) - { - menu = MENU_INSTALL; - break; - } - else - { - installBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - } - else if ((covert & 0x2) && (covert != covertOld)) - { - gprintf("\tNew Disc Detected\n"); - choice - = WindowPrompt(tr( "New Disc Detected" ), 0, tr( "Install" ), tr( "Mount DVD drive" ), - tr( "Cancel" )); - if (choice == 1) - { - menu = MENU_INSTALL; - break; - } - else if (choice == 2) - { - dvdBtn.SetState(STATE_CLICKED); - } - else - { - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - } - - else if (sdcardBtn.GetState() == STATE_CLICKED) - { - gprintf("\tsdCardBtn Clicked\n"); - SDCard_deInit(); - SDCard_Init(); - if (Settings.gameDisplay == LIST_MODE) - { - startat = gameBrowser->GetSelectedOption(); - offset = gameBrowser->GetOffset(); - } - else if (Settings.gameDisplay == GRID_MODE) - { - startat = gameGrid->GetSelectedOption(); - offset = gameGrid->GetOffset(); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - startat = gameCarousel->GetSelectedOption(); - offset = gameCarousel->GetOffset(); - } - if (isInserted(Settings.BootDevice)) - { - HaltGui(); // to fix endless rumble when clicking on the SD icon when rumble is disabled because rumble is set to on in Global_Default() - Settings.Load(); - ResumeGui(); - } - sdcardBtn.ResetState(); - menu = MENU_DISCLIST; - break; - } - - else if (DownloadBtn.GetState() == STATE_CLICKED) - { - gprintf("\tDownloadBtn Clicked\n"); - if (isInserted(Settings.BootDevice)) - { - choice = WindowPrompt(tr( "Cover Download" ), 0, tr( "Normal Covers" ), tr( "3D Covers" ), - tr( "Disc Images" ), tr( "Back" )); // ask for download choice - if (choice != 0) - { - int choice2 = choice; - bool missing; - missing = SearchMissingImages(choice2); - if (IsNetworkInit() == false && missing == true) - { - WindowPrompt(tr( "Network init error" ), 0, tr( "OK" )); - } - else - { - if (GetMissingFiles() != NULL && cntMissFiles > 0) - { - char tempCnt[40]; - sprintf(tempCnt, "%i %s", cntMissFiles, tr( "Missing files" )); - if (choice != 3) - choice = WindowPrompt(tr( "Download Boxart image?" ), tempCnt, tr( "Yes" ), tr( "No" )); - else if (choice == 3) choice = WindowPrompt(tr( "Download Discart image?" ), tempCnt, - tr( "Yes" ), tr( "No" )); - if (choice == 1) - { - ret = ProgressDownloadWindow(choice2); - if (ret == 0) - { - WindowPrompt(tr( "Download finished" ), 0, tr( "OK" )); - } - else - { - sprintf(tempCnt, "%i %s", ret, tr( "files not found on the server!" )); - WindowPrompt(tr( "Download finished" ), tempCnt, tr( "OK" )); - } - } - } - } - } - } - else - { - WindowPrompt(tr( "No SD-Card inserted!" ), tr( "Insert an SD-Card to download images." ), tr( "OK" )); - } - menu = MENU_DISCLIST; - DownloadBtn.ResetState(); - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - }//end download - - else if (settingsBtn.GetState() == STATE_CLICKED) - { - gprintf("\tsettingsBtn Clicked\n"); - if (Settings.gameDisplay == LIST_MODE) - { - startat = gameBrowser->GetSelectedOption(); - offset = gameBrowser->GetOffset(); - } - else if (Settings.gameDisplay == GRID_MODE) - { - startat = gameGrid->GetSelectedOption(); - offset = gameGrid->GetOffset(); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - startat = gameCarousel->GetSelectedOption(); - offset = gameCarousel->GetOffset(); - } - menu = MENU_SETTINGS; - break; - - } - - else if (favoriteBtn.GetState() == STATE_CLICKED) - { - favoriteBtn.ResetState(); - gprintf("\tfavoriteBtn Clicked\n"); - - if(Settings.GameSort & SORT_FAVORITE) - Settings.GameSort &= ~SORT_FAVORITE; - else - Settings.GameSort |= SORT_FAVORITE; - Settings.Save(); - menu = MENU_DISCLIST; - break; - } - - else if (searchBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - - gprintf("\tsearchBtn Clicked\n"); - show_searchwindow = !show_searchwindow; - HaltGui(); - if (searchBar) - { - mainWindow->Remove(searchBar); - delete searchBar; - searchBar = NULL; - } - if (show_searchwindow) - { - if (*gameList.GetCurrentFilter()) - { - searchBtn.StopEffect(); - searchBtn.SetEffectGrow(); - } - searchBar = new GuiSearchBar(gameList.GetAvailableSearchChars()); - if (searchBar) mainWindow->Append(searchBar); - } - else - { - if (*gameList.GetCurrentFilter()) searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - } - searchBtn.ResetState(); - ResumeGui(); - } - - else if (searchBar && (searchChar = searchBar->GetClicked())) - { - if (searchChar > 27) - { - int len = gameList.GetCurrentFilter() ? wcslen(gameList.GetCurrentFilter()) : 0; - wchar_t newFilter[len + 2]; - if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); - newFilter[len] = searchChar; - newFilter[len + 1] = 0; - - gameList.FilterList(newFilter); - menu = MENU_DISCLIST; - break; - } - else if (searchChar == 7) // Close - { - show_searchwindow = false; - HaltGui(); - if (searchBar) - { - mainWindow->Remove(searchBar); - delete searchBar; - searchBar = NULL; - } - if (*gameList.GetCurrentFilter()) - { - searchBtn.SetEffect(EFFECT_PULSE, 10, 105); - searchBtn.SetImage(&searchBtnImg); - searchBtn.SetImageOver(&searchBtnImg); - searchBtn.SetAlpha(255); - } - else - { - searchBtn.StopEffect(); - searchBtn.SetEffectGrow(); - searchBtn.SetImage(&searchBtnImg_g); - searchBtn.SetImageOver(&searchBtnImg_g); - searchBtn.SetAlpha(180); - } - - ResumeGui(); - } - else if (searchChar == 8) // Backspace - { - int len = wcslen(gameList.GetCurrentFilter()); - wchar_t newFilter[len + 1]; - if (gameList.GetCurrentFilter()) wcscpy(newFilter, gameList.GetCurrentFilter()); - newFilter[len > 0 ? len - 1 : 0] = 0; - gameList.FilterList(newFilter); - menu = MENU_DISCLIST; - break; - } - - } - - else if (sortBtn.GetState() == STATE_CLICKED) - { - sortBtn.ResetState(); - gprintf("\tsortBtn clicked\n"); - if(Settings.GameSort & SORT_ABC) - { - Settings.GameSort &= ~SORT_ABC; - Settings.GameSort |= SORT_RANKING; - } - else if(Settings.GameSort & SORT_RANKING) - { - Settings.GameSort &= ~SORT_RANKING; - Settings.GameSort |= SORT_PLAYCOUNT; - } - else if(Settings.GameSort & SORT_PLAYCOUNT) - { - Settings.GameSort &= ~SORT_PLAYCOUNT; - Settings.GameSort |= SORT_ABC; - } - Settings.Save(); - menu = MENU_DISCLIST; - break; - } - - else if (listBtn.GetState() == STATE_CLICKED) - { - gprintf("\tlistBtn Clicked\n"); - if (Settings.gameDisplay != LIST_MODE) - { - Settings.gameDisplay = LIST_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - listBtn.ResetState(); - break; - } - else - { - listBtn.ResetState(); - } - } - - else if (gridBtn.GetState() == STATE_CLICKED) - { - gprintf("\tgridBtn Clicked\n"); - if (Settings.gameDisplay != GRID_MODE) - { - - Settings.gameDisplay = GRID_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - gridBtn.ResetState(); - break; - } - else - { - gridBtn.ResetState(); - } - } - - else if (carouselBtn.GetState() == STATE_CLICKED) - { - gprintf("\tcarouselBtn Clicked\n"); - if (Settings.gameDisplay != CAROUSEL_MODE) - { - Settings.gameDisplay = CAROUSEL_MODE; - menu = MENU_DISCLIST; - if (isInserted(Settings.BootDevice)) - { - Settings.Save(); - } - carouselBtn.ResetState(); - break; - } - else - { - carouselBtn.ResetState(); - } - } - - else if (homebrewBtn.GetState() == STATE_CLICKED) - { - gprintf("\thomebrewBtn Clicked\n"); - menu = MENU_HOMEBREWBROWSE; - break; - } - - else if (gameInfo.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tgameinfo Clicked\n"); - gameInfo.ResetState(); - if (selectImg1 >= 0 && selectImg1 < (s32) gameList.size()) - { - gameSelected = selectImg1; - rockout(); - struct discHdr *header = gameList[selectImg1]; - snprintf(IDfull, sizeof(IDfull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5]); - choice = showGameInfo(IDfull); - rockout(2); - if (choice == 2) homeBtn.SetState(STATE_CLICKED); - if (choice == 3) - { - menu = MENU_DISCLIST; - break; - } - } - } - else if (lockBtn.GetState() == STATE_CLICKED) - { - gprintf("\tlockBtn clicked\n"); - lockBtn.ResetState(); - if (!canUnlock) - { - WindowPrompt( - tr( "Parental Control" ), - tr( "You don't have Parental Control enabled. If you wish to use Parental Control, enable it in the Wii Settings." ), - tr( "OK" )); - } - else - { - if (Settings.godmode) - { - if (WindowPrompt(tr( "Parental Control" ), tr( "Are you sure you want to enable Parent Control?" ), - tr( "Yes" ), tr( "No" )) == 1) - { - Settings.godmode = 0; - lockBtn.SetImage(&lockBtnImg_g); - lockBtn.SetImageOver(&lockBtnImg_g); - lockBtn.SetToolTip(&lockBtnTT, 15, 52, 1, 3); - - // Retrieve the gamelist again - menu = MENU_DISCLIST; - break; - } - } - else - { - // Require the user to enter the PIN code - char pin[5]; - memset(&pin, 0, 5); - int ret = OnScreenNumpad((char *) &pin, 5); - - if (ret == 1) - { - if (memcmp(pin, Settings.Parental.pin, 4) == 0) - { - Settings.godmode = 1; - lockBtn.SetImage(&unlockBtnImg_g); - lockBtn.SetImageOver(&unlockBtnImg_g); - lockBtn.SetToolTip(&unlockBtnTT, 15, 52, 1, 3); - - // Retrieve the gamelist again - menu = MENU_DISCLIST; - break; - } - else - { - WindowPrompt(tr( "Parental Control" ), tr( "Invalid PIN code" ), tr( "OK" )); - } - } - } - } - } - else if (dvdBtn.GetState() == STATE_CLICKED) - { - gprintf("\tdvdBtn Clicked\n"); - mountMethodOLD = (mountMethod == 3 ? mountMethod : 0); - - mountMethod = DiscMount(dvdheader); - dvdBtn.ResetState(); - - rockout(); - //break; - } - if (Settings.gameDisplay == GRID_MODE) - { - int selectimg; - DownloadBtn.SetSize(0, 0); - selectimg = gameGrid->GetSelectedOption(); - gameSelected = gameGrid->GetClickedOption(); - selectImg1 = selectimg; - } - - if (Settings.gameDisplay == CAROUSEL_MODE) - { - int selectimg; - DownloadBtn.SetSize(0, 0); - selectimg = gameCarousel->GetSelectedOption(); - gameSelected = gameCarousel->GetClickedOption(); - selectImg1 = selectimg; - } - if (Settings.gameDisplay == LIST_MODE) - { - //Get selected game under cursor - int selectimg; - DownloadBtn.SetSize(160, 224); - idBtn.SetSize(100, 40); - - selectimg = gameBrowser->GetSelectedOption(); - gameSelected = gameBrowser->GetClickedOption(); - selectImg1 = selectimg; - - if (gameSelected > 0) //if click occured - selectimg = gameSelected; - - char gameregion[7]; - if ((selectimg >= 0) && (selectimg < (s32) gameList.size())) - { - if (selectimg != selectedold) - { - selectedold = selectimg;//update displayed cover, game ID, and region if the selected game changes - struct discHdr *header = gameList[selectimg]; - snprintf(ID, sizeof(ID), "%c%c%c", header->id[0], header->id[1], header->id[2]); - snprintf(IDfull, sizeof(IDfull), "%s%c%c%c", ID, header->id[3], header->id[4], header->id[5]); - w.Remove(&DownloadBtn); - - if (GameIDTxt) - { - w.Remove(&idBtn); - delete GameIDTxt; - GameIDTxt = NULL; - } - if (GameRegionTxt) - { - w.Remove(GameRegionTxt); - delete GameRegionTxt; - GameRegionTxt = NULL; - } - - switch (header->id[3]) - { - case 'E': - sprintf(gameregion, "NTSC U"); - break; - case 'J': - sprintf(gameregion, "NTSC J"); - break; - case 'W': - sprintf(gameregion, "NTSC T"); - break; - default: - case 'K': - sprintf(gameregion, "NTSC K"); - break; - case 'P': - case 'D': - case 'F': - case 'I': - case 'S': - case 'H': - case 'U': - case 'X': - case 'Y': - case 'Z': - sprintf(gameregion, " PAL "); - break; - } - - //load game cover - if (cover) - { - delete cover; - cover = NULL; - } - - cover = LoadCoverImage(header); - - if (coverImg) - { - delete coverImg; - coverImg = NULL; - } - coverImg = new GuiImage(cover); - coverImg->SetWidescreen(Settings.widescreen); - - DownloadBtn.SetImage(coverImg);// put the new image on the download button - w.Append(&DownloadBtn); - - if ((Settings.sinfo == GAMEINFO_ID) || (Settings.sinfo == GAMEINFO_BOTH)) - { - GameIDTxt = new GuiText(IDfull, 22, Theme.info); - GameIDTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - //GameIDTxt->SetPosition(Theme.id_x,Theme.id_y); - idBtn.SetEffect(EFFECT_FADE, 20); - idBtn.SetLabel(GameIDTxt); - w.Append(&idBtn); - } - //don't try to show region for channels because all the custom channels wont follow the rules - if (((Settings.sinfo == GAMEINFO_REGION) || (Settings.sinfo == GAMEINFO_BOTH)) && mountMethod != 3) - { - GameRegionTxt = new GuiText(gameregion, 22, Theme.info); - GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - GameRegionTxt->SetPosition(Theme.region_x, Theme.region_y); - GameRegionTxt->SetEffect(EFFECT_FADE, 20); - w.Append(GameRegionTxt); - } - } - } - - if (idBtn.GetState() == STATE_CLICKED && mountMethod != 3) - { - gprintf("\tidBtn Clicked\n"); - struct discHdr * header = gameList[gameBrowser->GetSelectedOption()]; - //enter new game ID - char entered[10]; - snprintf(entered, sizeof(entered), "%s", IDfull); - //entered[9] = '\0'; - int result = OnScreenKeyboard(entered, 7, 0); - if (result == 1) - { - WBFS_ReIDGame(header->id, entered); - //__Menu_GetEntries(); - menu = MENU_DISCLIST; - } - - idBtn.ResetState(); - } - startat = gameBrowser->GetOffset(), offset = startat; - } - - if (((gameSelected >= 0) && (gameSelected < (s32) gameList.size())) || mountMethod == 1 || mountMethod == 2) - { - if (searchBar) - { - HaltGui(); - mainWindow->Remove(searchBar); - ResumeGui(); - } - rockout(); - struct discHdr *header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - // struct discHdr *header = dvdheader:gameList[gameSelected]); - if (!mountMethod)//only get this stuff it we are booting a game from USB - { - WBFS_GameSize(header->id, &size); - } - - //check if alt Dol and gct file is present - FILE *exeFile = NULL; - char nipple[100]; - header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); //reset header - snprintf(IDfull, sizeof(IDfull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5]); - GameCFG* game_cfg = GameSettings.GetGameCFG(header->id); - u8 alternatedol; - u8 ocarinaChoice; - - if (game_cfg) - { - alternatedol = game_cfg->loadalternatedol; - ocarinaChoice = game_cfg->ocarina; - } - else - { - alternatedol = OFF; - ocarinaChoice = Settings.ocarina; - } - - if (Settings.quickboot == ON) //quickboot game - { - if (alternatedol == 2) - { - /* Open dol File and check exist */ - sprintf(nipple, "%s%s.dol", Settings.dolpath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - sprintf(nipple, "%s %s", nipple, tr( "does not exist!" )); - WindowPrompt(tr( "Error" ), nipple, tr( "OK" )); - menu = MENU_DISCLIST; - wiilight(0); - break; - } - else - { - fclose(exeFile); - } - } - if (ocarinaChoice != OFF) - { - /* Open gct File and check exist */ - sprintf(nipple, "%s%s.gct", Settings.Cheatcodespath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\ttried to load missing gct.\n"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! Loading game without cheats." )); - WindowPrompt(tr( "Error" ), nipple, NULL, NULL, NULL, NULL, 170); - } - else - { - fclose(exeFile); - } - - } - - wiilight(0); - if (isInserted(Settings.BootDevice)) - { - //////////save game play count//////////////// - GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1); - GameStatistics.Save(); - - gprintf("\tplaycount for %c%c%c%c%c%c raised to %i\n", header->id[0], header->id[1], header->id[2], - header->id[3], header->id[4], header->id[5], GameStatistics.GetPlayCount(header->id)); - - } - //Just calling that shuts down everything and starts game - BootGame((const char *) header->id); - } - bool returnHere = true;// prompt to start game - while (returnHere) - { - returnHere = false; - if (Settings.wiilight != WIILIGHT_INSTALL) wiilight(1); - choice = GameWindowPrompt(); - // header = gameList[gameSelected]; //reset header - - if (choice == 1) - { - if (alternatedol == 2) - { - /* Open dol File and check exist */ - sprintf(nipple, "%s%s.dol", Settings.dolpath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\n\tTried to load alt dol that isn't there"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! You messed something up." )); - WindowPrompt(tr( "Error" ), nipple, tr( "OK" )); - menu = MENU_DISCLIST; - wiilight(0); - break; - } - else - { - fclose(exeFile); - } - } - if (ocarinaChoice != OFF) - { - /* Open gct File and check exist */ - sprintf(nipple, "%s%s.gct", Settings.Cheatcodespath, IDfull); - exeFile = fopen(nipple, "rb"); - if (exeFile == NULL) - { - gprintf("\ttried to load gct file that isn't there\n"); - sprintf(nipple, "%s %s", nipple, tr( "does not exist! Loading game without cheats." )); - WindowPrompt(tr( "Error" ), nipple, NULL, NULL, NULL, NULL, 170); - } - else - { - fclose(exeFile); - } - - } - wiilight(0); - returnHere = false; - //Just calling that shuts down everything and starts game - BootGame((const char *) gameList[gameSelected]->id); - } - else if (choice == 2) - { - wiilight(0); - HaltGui(); - if (Settings.gameDisplay == LIST_MODE) - mainWindow->Remove(gameBrowser); - else if (Settings.gameDisplay == GRID_MODE) - mainWindow->Remove(gameGrid); - else if (Settings.gameDisplay == CAROUSEL_MODE) mainWindow->Remove(gameCarousel); - mainWindow->Remove(&w); - ResumeGui(); - - //re-evaluate header now in case they changed games while on the game prompt - header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - int settret = MenuGameSettings(header); - /* unneeded for now, kept in case database gets a separate language setting - //menu = MENU_DISCLIST; // refresh titles (needed if the language setting has changed) - */ - HaltGui(); - if (Settings.gameDisplay == LIST_MODE) - mainWindow->Append(gameBrowser); - else if (Settings.gameDisplay == GRID_MODE) - mainWindow->Append(gameGrid); - else if (Settings.gameDisplay == CAROUSEL_MODE) mainWindow->Append(gameCarousel); - mainWindow->Append(&w); - ResumeGui(); - if (settret == MENU_DISCLIST) //if deleted - { - menu = MENU_DISCLIST; - break; - } - returnHere = true; - rockout(2); - } - - else if (choice == 3 && !mountMethod) //WBFS renaming - { - wiilight(0); - //re-evaluate header now in case they changed games while on the game prompt - header = gameList[gameSelected]; - - //enter new game title - char entered[60]; - snprintf(entered, sizeof(entered), "%s", GameTitles.GetTitle(header)); - entered[59] = '\0'; - int result = OnScreenKeyboard(entered, 60, 0); - if (result == 1) - { - WBFS_RenameGame(header->id, entered); - gameList.ReadGameList(); - gameList.FilterList(); - menu = MENU_DISCLIST; - } - } - else if (choice == 0) - { - rockout(2); - if (mountMethod == 1 || mountMethod == 2) mountMethod = mountMethodOLD; - if (Settings.gameDisplay == LIST_MODE) - { - gameBrowser->SetFocus(1); - } - else if (Settings.gameDisplay == GRID_MODE) - { - gameGrid->SetFocus(1); - } - else if (Settings.gameDisplay == CAROUSEL_MODE) - { - gameCarousel->SetFocus(1); - } - } - - } - if (searchBar) - { - HaltGui(); - mainWindow->Append(searchBar); - ResumeGui(); - } - } - // to skip the first call of windowScreensaver at startup when wiimote is not connected - if (IsWpadConnected()) - { - check = 1; - } - - // screensaver is called when wiimote shuts down, depending on the wiimotet idletime - if (!IsWpadConnected() && check != 0 && Settings.screensaver != 0) - { - check++; - int screensaverIsOn = 0; - if (check == 11500) //to allow time for the wii to turn off and not show the screensaver - { - screensaverIsOn = WindowScreensaver(); - } - if (screensaverIsOn == 1) check = 0; - } - covertOld = covert; - } - - HaltGui(); - mainWindow->RemoveAll(); - mainWindow->Append(bgImg); - delete searchBar; - searchBar = NULL; - delete gameBrowser; - gameBrowser = NULL; - delete gameGrid; - gameGrid = NULL; - delete gameCarousel; - gameCarousel = NULL; - ResumeGui(); - return menu; -} - -void DiscListWinUpdateCallback(void * e) -{ - GuiWindow *w = (GuiWindow *) e; - for (int i = 0; i < 8; ++i) - { - if (Toolbar[i]->GetState() == STATE_SELECTED) - { - w->Remove(Toolbar[i]); - w->Append(Toolbar[i]); // draw the selected Icon allways on top - break; - } - } -} - -void rockout(int f) -{ - HaltGui(); - - if (gameSelected >= 0 && gameSelected < gameList.size() && (strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "guitar") - || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "band") || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), - "rock"))) - { - for (int i = 0; i < 4; i++) - delete pointer[i]; - pointer[0] = Resources::GetImageData("rplayer1_point.png"); - pointer[1] = Resources::GetImageData("rplayer2_point.png"); - pointer[2] = Resources::GetImageData("rplayer3_point.png"); - pointer[3] = Resources::GetImageData("rplayer4_point.png"); - } - else - { - - for (int i = 0; i < 4; i++) - delete pointer[i]; - pointer[0] = Resources::GetImageData("player1_point.png"); - pointer[1] = Resources::GetImageData("player2_point.png"); - pointer[2] = Resources::GetImageData("player3_point.png"); - pointer[3] = Resources::GetImageData("player4_point.png"); - } - ResumeGui(); + return retMenu; } diff --git a/source/mload/modules/ehcmodule_5.c b/source/mload/modules/ehcmodule_5.c index 206e0eeb..03f9c66e 100644 --- a/source/mload/modules/ehcmodule_5.c +++ b/source/mload/modules/ehcmodule_5.c @@ -1,1585 +1,1585 @@ -#define size_ehcmodule_5 25287 - -unsigned char ehcmodule_5[25287] __attribute__((aligned (32)))={ - 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x02, 0x01, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x34, 0x00, 0x20, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xa0, - 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0xf0, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x13, 0x70, 0x00, 0x00, - 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x94, 0x00, 0x00, 0x5a, 0x94, 0x00, 0xf0, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x5b, 0x9c, 0x13, 0x70, 0x60, 0x00, - 0x13, 0x70, 0x60, 0x00, 0x00, 0x00, 0x07, 0x2b, 0x00, 0x02, 0x95, 0xa8, 0x00, 0xf0, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x13, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0x13, 0x72, 0xf3, 0xa8, 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, - 0xe5, 0x9f, 0x31, 0x00, 0xe1, 0x2f, 0xff, 0x13, 0xe5, 0x9f, 0xc0, 0xfc, 0xe5, 0x9c, 0xc0, 0x00, - 0xe1, 0xa0, 0x00, 0x00, 0xe7, 0x9c, 0xc1, 0x0b, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1c, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x3f, 0xea, 0xff, 0xff, 0xf5, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x40, 0xea, 0xff, 0xff, 0xf1, - 0xe3, 0xa0, 0x00, 0x00, 0xee, 0x07, 0x0f, 0x15, 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x00, 0x00, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0x18, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x12, - 0xe3, 0xc8, 0x80, 0x10, 0xe3, 0xa0, 0x20, 0x10, 0xe5, 0x87, 0x20, 0x00, 0xe1, 0xa0, 0x00, 0x00, - 0xe1, 0xa0, 0x20, 0x0d, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xd0, 0x90, 0xe1, 0xa0, 0x00, 0x00, - 0xe9, 0x2d, 0x5f, 0xfe, 0xe1, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x0f, 0xe8, 0xbd, 0x5f, 0xfe, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0xd0, 0x02, 0xe3, 0x10, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x02, - 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0xeb, 0x00, 0x00, 0x05, 0xe3, 0x18, 0x00, 0x01, - 0x0a, 0x00, 0x00, 0x01, 0xe5, 0x9f, 0xf0, 0x58, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x54, - 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x4c, - 0xe1, 0x2f, 0xff, 0x12, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x13, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x03, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x45, 0x48, 0x43, 0x5f, 0x43, 0x46, 0x47, 0x00, - 0x12, 0x34, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x13, 0x70, 0x0e, 0x2d, 0x13, 0x72, 0xc0, 0x00, - 0x13, 0x72, 0xf5, 0xa8, 0xff, 0xff, 0x1e, 0x80, 0xff, 0xff, 0x1e, 0x9c, 0xff, 0xff, 0x1d, 0x44, - 0x13, 0x70, 0x0c, 0x59, 0xe1, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x11, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xf5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xff, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x0d, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xd2, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2d, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x29, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2f, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xeb, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd3, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xa1, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xc5, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xed, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0x89, - 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xad, - 0xb5, 0x00, 0x28, 0x02, 0xd0, 0x11, 0x28, 0x02, 0xd8, 0x04, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, - 0xd1, 0x04, 0xe0, 0x08, 0x28, 0x10, 0xd0, 0x0d, 0x28, 0x11, 0xd0, 0x0d, 0x48, 0x08, 0xe0, 0x0c, - 0x4b, 0x08, 0x68, 0x18, 0xe0, 0x09, 0x48, 0x08, 0xe0, 0x07, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, - 0x20, 0x00, 0xe0, 0x02, 0x48, 0x06, 0xe0, 0x00, 0x48, 0x06, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xff, 0xff, 0xfd, 0x66, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x4a, 0xd5, 0x13, 0x70, 0x67, 0x40, - 0x13, 0x70, 0x43, 0xb1, 0x13, 0x70, 0x42, 0xe5, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x0c, 0xf7, 0xff, - 0xff, 0x8f, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x27, 0x2c, 0x00, 0xd0, 0x25, 0x68, 0x24, 0x2c, 0x00, - 0xd0, 0x22, 0x78, 0x22, 0x78, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x78, 0xa2, 0x02, 0x12, - 0x43, 0x1a, 0x78, 0xe3, 0x43, 0x13, 0x2b, 0x06, 0xd1, 0x16, 0x7b, 0x23, 0x7b, 0x62, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, 0x43, 0x1a, 0x2a, 0x7a, - 0xd0, 0x02, 0x2a, 0x88, 0xd1, 0x08, 0xe0, 0x02, 0x48, 0x06, 0x21, 0x15, 0xe0, 0x01, 0x48, 0x05, - 0x21, 0x14, 0x1c, 0x22, 0xf0, 0x04, 0xfc, 0x82, 0xb0, 0x01, 0x1c, 0x28, 0xbc, 0x30, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x02, 0xe1, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, - 0xff, 0x87, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xff, 0x6e, 0x0e, 0x2b, 0x73, 0x23, - 0x0c, 0x2b, 0x73, 0x63, 0x0a, 0x2b, 0x73, 0xa3, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, 0x06, 0x1b, - 0x43, 0x1a, 0x7c, 0xa3, 0x73, 0xe5, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x06, 0x2d, 0x43, 0x1a, - 0x1c, 0x20, 0x60, 0x15, 0x30, 0x0c, 0x21, 0x04, 0xf7, 0xff, 0xff, 0x46, 0x7c, 0x23, 0x7c, 0x62, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0xa3, 0x7c, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, - 0x21, 0x04, 0xf7, 0xff, 0xff, 0x39, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x46, 0x20, 0x00, 0xbc, 0x70, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8f, 0x90, 0x08, 0x91, 0x07, 0x1c, 0x08, 0x1c, 0x11, - 0x92, 0x06, 0x92, 0x09, 0xf7, 0xff, 0xff, 0x30, 0x4c, 0x7f, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x00, - 0xe0, 0xec, 0xa8, 0x0d, 0xf0, 0x01, 0xf9, 0x0e, 0x4b, 0x7c, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x04, - 0x23, 0x80, 0x9a, 0x0d, 0x01, 0x1b, 0x42, 0x9a, 0xd0, 0x04, 0x4a, 0x79, 0x23, 0x01, 0x42, 0x5b, - 0x60, 0x13, 0xe0, 0xdb, 0x4d, 0x77, 0x68, 0x2a, 0x2a, 0x00, 0xdb, 0x63, 0x4b, 0x76, 0x42, 0x9a, - 0xd0, 0x60, 0x4a, 0x73, 0x68, 0x13, 0x1c, 0x58, 0xd1, 0x5c, 0x1c, 0x2e, 0x4a, 0x6e, 0x49, 0x71, - 0x68, 0x13, 0x68, 0x08, 0x33, 0x1f, 0x21, 0x1f, 0x1c, 0x1c, 0x43, 0x8c, 0x1c, 0x07, 0x21, 0x10, - 0x1c, 0x22, 0x37, 0x10, 0xf0, 0x03, 0xff, 0xf8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xbe, 0x78, 0x23, - 0x2b, 0x43, 0xd1, 0x0a, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x07, 0x78, 0xa3, 0x2b, 0x53, 0xd1, 0x04, - 0x78, 0xe3, 0x2b, 0x4f, 0xd1, 0x01, 0x4b, 0x64, 0xe0, 0x07, 0x68, 0x33, 0x2b, 0x00, 0xd0, 0x02, - 0x23, 0x00, 0x60, 0x33, 0xe7, 0xda, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x2b, 0x79, 0x62, 0x79, 0xa3, - 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2, 0x79, 0x23, 0x4e, 0x5c, 0x18, 0xd2, 0x79, 0xe3, 0x4d, 0x5c, - 0x06, 0x1b, 0x18, 0xd2, 0x0a, 0xd2, 0x60, 0x32, 0x22, 0x80, 0x01, 0x12, 0x1c, 0x28, 0x21, 0x00, - 0xf0, 0x05, 0xfa, 0x68, 0x4b, 0x53, 0x68, 0x1a, 0x4b, 0x53, 0x42, 0x9a, 0xd1, 0x1a, 0x68, 0x36, - 0x20, 0x00, 0x46, 0xb4, 0x4e, 0x53, 0x22, 0x07, 0x40, 0x02, 0xd1, 0x02, 0x10, 0xc3, 0x00, 0x9b, - 0x51, 0x9f, 0x18, 0x23, 0x7a, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x21, 0x01, 0x10, 0xc3, 0x40, 0x91, - 0x1c, 0x0a, 0x5c, 0xe9, 0x44, 0x67, 0x43, 0x0a, 0x54, 0xea, 0x23, 0x80, 0x30, 0x01, 0x01, 0xdb, - 0x42, 0x98, 0xd1, 0xe8, 0x4b, 0x40, 0x22, 0x1f, 0x68, 0x1b, 0x33, 0x1f, 0x43, 0x93, 0x93, 0x0b, - 0x9a, 0x07, 0x23, 0x80, 0x02, 0x1b, 0x92, 0x0a, 0x93, 0x05, 0xe0, 0x63, 0x98, 0x08, 0x4a, 0x3c, - 0x0a, 0x43, 0x1c, 0x1d, 0x21, 0x0f, 0x68, 0x13, 0x43, 0x8d, 0x42, 0x9d, 0xd0, 0x3a, 0x4b, 0x39, - 0x60, 0x15, 0x68, 0x1a, 0x4b, 0x38, 0x42, 0x9a, 0xd1, 0x1e, 0x4b, 0x38, 0x1c, 0x28, 0x68, 0x1c, - 0x27, 0x07, 0x1c, 0x21, 0xf0, 0x05, 0xf8, 0xe8, 0x4a, 0x36, 0x08, 0xc6, 0x00, 0xb3, 0x58, 0x99, - 0x4b, 0x33, 0x40, 0x07, 0x20, 0x01, 0x22, 0x00, 0x93, 0x01, 0x46, 0x84, 0xe0, 0x07, 0x98, 0x01, - 0x5d, 0x83, 0x46, 0x60, 0x41, 0x13, 0x42, 0x03, 0xd0, 0x00, 0x19, 0x09, 0x32, 0x01, 0x42, 0xba, - 0xd3, 0xf5, 0x1e, 0x63, 0x40, 0x2b, 0x18, 0xcd, 0x4b, 0x24, 0x68, 0x1b, 0x1b, 0x5c, 0x2c, 0x10, - 0xdc, 0x3a, 0x2c, 0x10, 0xd0, 0x07, 0x22, 0x80, 0x98, 0x0b, 0x21, 0x00, 0x02, 0x12, 0xf0, 0x05, - 0xfa, 0x01, 0x2c, 0x00, 0xdd, 0x06, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x0b, 0xf0, 0x03, 0xff, 0x5c, - 0x28, 0x00, 0xd0, 0x23, 0x99, 0x08, 0x4b, 0x20, 0x9a, 0x05, 0x40, 0x0b, 0x00, 0x9b, 0x98, 0x06, - 0x1a, 0xd1, 0x42, 0x81, 0xd8, 0x01, 0x1c, 0x0c, 0xe0, 0x00, 0x9c, 0x06, 0x9a, 0x0b, 0x98, 0x0a, - 0x18, 0xd1, 0x1c, 0x22, 0xf0, 0x05, 0xf9, 0xa2, 0x98, 0x0a, 0x1c, 0x21, 0xf7, 0xff, 0xfe, 0x4c, - 0x9b, 0x0a, 0x98, 0x06, 0x19, 0x1b, 0x99, 0x08, 0x93, 0x0a, 0x10, 0xa3, 0x1b, 0x00, 0x18, 0xc9, - 0x90, 0x06, 0x91, 0x08, 0x9a, 0x06, 0x2a, 0x00, 0xd1, 0x98, 0xe0, 0x07, 0x20, 0x80, 0x02, 0x00, - 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x24, 0x10, 0xe7, 0xcc, 0x98, 0x07, 0x99, 0x09, - 0xf7, 0xff, 0xfe, 0x12, 0x20, 0x00, 0xe7, 0xf3, 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0x4c, - 0x13, 0x70, 0x60, 0x10, 0x13, 0x70, 0x60, 0x14, 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x50, - 0x13, 0x70, 0x78, 0x00, 0x13, 0x70, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xb5, 0xf0, 0x4b, 0xc9, - 0xb0, 0x93, 0x68, 0x18, 0x21, 0x80, 0xf7, 0xff, 0xfe, 0x23, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0x24, - 0x90, 0x0a, 0xf0, 0x00, 0xfc, 0x0d, 0xf7, 0xff, 0xfd, 0xff, 0x21, 0x78, 0xf7, 0xff, 0xfd, 0xd0, - 0x99, 0x0a, 0x48, 0xc1, 0xf7, 0xff, 0xfe, 0x20, 0x48, 0xc0, 0x9a, 0x0a, 0x23, 0x00, 0x1c, 0x01, - 0xf7, 0xff, 0xfd, 0xd2, 0x49, 0xbe, 0x90, 0x08, 0x20, 0xcd, 0xf0, 0x04, 0xfb, 0x71, 0x22, 0x00, - 0x92, 0x09, 0x92, 0x0b, 0x92, 0x0c, 0x92, 0x0d, 0x4b, 0xba, 0x4a, 0xbb, 0x26, 0x01, 0x93, 0x05, - 0x92, 0x04, 0xe0, 0x00, 0x26, 0x00, 0x98, 0x0a, 0xa9, 0x11, 0x22, 0x00, 0xf7, 0xff, 0xfd, 0xd8, - 0x90, 0x10, 0x9b, 0x10, 0x2b, 0x00, 0xd1, 0xf6, 0x2e, 0x00, 0xd0, 0x02, 0x98, 0x08, 0xf7, 0xff, - 0xfd, 0xab, 0x9a, 0x05, 0x9c, 0x11, 0x23, 0x00, 0x60, 0x13, 0x2c, 0x00, 0xd1, 0x54, 0x4b, 0xaf, - 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0xae, 0x68, 0x1a, 0x2a, 0x00, 0xd1, 0x01, 0x4b, 0xaa, - 0x60, 0x1a, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0xdd, 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0xd9, - 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0xd5, 0x4b, 0xa6, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x09, - 0xf0, 0x03, 0xfd, 0x96, 0x28, 0x00, 0xd0, 0x05, 0xf0, 0x03, 0xfd, 0x92, 0x28, 0x00, 0xd0, 0x01, - 0xf0, 0x03, 0xfd, 0x8e, 0x4b, 0x9f, 0x68, 0x1e, 0x2e, 0x00, 0xd1, 0x23, 0x4f, 0x9e, 0x4a, 0x9f, - 0x68, 0x3b, 0x3b, 0x01, 0x42, 0x93, 0xd8, 0x1d, 0x4c, 0x96, 0x4d, 0x9d, 0x23, 0x01, 0x60, 0x23, - 0x68, 0x28, 0x4a, 0x9c, 0x21, 0x01, 0xf0, 0x03, 0xfe, 0x9f, 0x60, 0x26, 0x28, 0x00, 0xd0, 0x09, - 0x23, 0x80, 0x68, 0x3a, 0x00, 0x9b, 0x42, 0x9a, 0xd1, 0x04, 0x68, 0x2b, 0x22, 0x80, 0x02, 0x12, - 0x18, 0x9b, 0x60, 0x2b, 0x49, 0x92, 0x4b, 0x94, 0x68, 0x0a, 0x68, 0x1b, 0x42, 0x9a, 0xd3, 0x01, - 0x23, 0x00, 0x60, 0x0b, 0x4b, 0x8a, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x9b, 0x98, 0x08, 0x49, 0x83, - 0xf7, 0xff, 0xfd, 0x8e, 0x26, 0x01, 0xe7, 0x96, 0x78, 0x23, 0x78, 0x62, 0x06, 0x1b, 0x04, 0x12, - 0x43, 0x1a, 0x78, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x2e, 0x02, - 0xd0, 0x59, 0x2e, 0x02, 0xd8, 0x02, 0x2e, 0x01, 0xd1, 0x04, 0xe0, 0x07, 0x2e, 0x06, 0xd0, 0x03, - 0x2e, 0x07, 0xd0, 0x67, 0x25, 0x01, 0xe0, 0x30, 0x25, 0x01, 0xe2, 0x4f, 0x7b, 0x23, 0x7b, 0x62, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x49, 0x6f, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x1c, 0x28, 0xf0, 0x05, 0xf9, 0x4d, 0x28, 0x00, 0xd1, 0x16, 0x7d, 0x23, - 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x9b, 0x0c, 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x2d, 0x4b, 0x68, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x28, 0xf0, 0x04, 0xf8, 0x2b, 0xe2, 0x25, 0x49, 0x6b, 0x1c, 0x28, - 0xf0, 0x05, 0xf9, 0x30, 0x28, 0x00, 0xd0, 0x02, 0x25, 0x06, 0x42, 0x6d, 0xe2, 0x1e, 0x7d, 0x23, - 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, - 0x1c, 0x15, 0x43, 0x1d, 0x4b, 0x5a, 0x60, 0x1e, 0x4b, 0x57, 0x60, 0x18, 0x48, 0x60, 0xf0, 0x00, - 0xfa, 0x6d, 0x4b, 0x60, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfd, 0xe2, - 0x23, 0x00, 0x93, 0x09, 0xe2, 0x02, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xe2, 0x1c, 0x10, 0x9a, 0x0b, 0x43, 0x18, 0x42, 0x82, - 0xd1, 0x02, 0x23, 0x00, 0x93, 0x0b, 0xe0, 0x03, 0xf0, 0x00, 0xfd, 0xee, 0xf0, 0x00, 0xfd, 0xe2, - 0x25, 0x00, 0xe1, 0xeb, 0x7e, 0x23, 0x7e, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7e, 0xa3, - 0x02, 0x1b, 0x43, 0x13, 0x7e, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, - 0x06, 0x1b, 0x43, 0x1a, 0x7c, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x43, 0x1a, 0x92, 0x06, - 0x7d, 0x23, 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, - 0x7d, 0xe2, 0x1c, 0x15, 0x43, 0x1d, 0x7b, 0x23, 0x2b, 0x00, 0xd1, 0x02, 0x9a, 0x0b, 0x2a, 0x00, - 0xd0, 0x01, 0x27, 0x00, 0xe0, 0x0c, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0xa3, 0x7a, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x00, 0xfd, 0xb5, 0x1c, 0x07, - 0x9b, 0x06, 0x1c, 0x30, 0x18, 0xed, 0x00, 0xe9, 0x95, 0x07, 0x1c, 0x34, 0xf7, 0xff, 0xfc, 0xac, - 0x25, 0x00, 0xe0, 0x05, 0x68, 0x20, 0x68, 0x61, 0xf7, 0xff, 0xfc, 0xa6, 0x35, 0x01, 0x34, 0x08, - 0x9a, 0x07, 0x42, 0x95, 0xdb, 0xf6, 0x4c, 0x22, 0x68, 0x20, 0x28, 0x00, 0xd0, 0x00, 0xe1, 0x87, - 0x99, 0x11, 0x7b, 0x0b, 0x7b, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0x8b, 0x02, 0x1b, - 0x43, 0x13, 0x7b, 0xca, 0x43, 0x1a, 0x4b, 0x24, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xf6, 0x42, 0x9a, - 0xd8, 0x46, 0x2a, 0x06, 0xd8, 0x0b, 0x2a, 0x05, 0xd3, 0x00, 0xe0, 0xd0, 0x2a, 0x01, 0xd1, 0x00, - 0xe0, 0x92, 0x2a, 0x00, 0xd0, 0x6c, 0x2a, 0x02, 0xd0, 0x00, 0xe1, 0x01, 0xe0, 0xc7, 0x2a, 0x1b, - 0xd8, 0x06, 0x2a, 0x1a, 0xd3, 0x00, 0xe0, 0x9f, 0x2a, 0x0c, 0xd0, 0x00, 0xe0, 0xf8, 0xe0, 0x8f, - 0x4b, 0x16, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x9a, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xef, - 0xe0, 0xc7, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x50, 0x00, 0x98, 0x96, 0x80, - 0x13, 0x70, 0x02, 0x19, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x60, 0x0c, 0x13, 0x70, 0x67, 0x48, - 0x13, 0x70, 0x67, 0x40, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc3, 0xa0, 0x00, 0x00, 0x0f, 0xfe, - 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x68, 0x00, 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x60, 0x5c, - 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x55, 0x4d, 0x53, 0x03, 0x55, 0x4d, 0x53, 0x01, - 0x4b, 0xac, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x86, 0x42, 0x9a, 0xd8, 0x12, 0x3b, 0x7b, 0x42, 0x9a, - 0xd1, 0x00, 0xe0, 0xb4, 0x42, 0x9a, 0xd8, 0x04, 0x3b, 0x02, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xb7, - 0xe0, 0xa5, 0x4b, 0xa5, 0x42, 0x9a, 0xd0, 0x72, 0x33, 0x70, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xaf, - 0xe0, 0xaa, 0x4b, 0xa2, 0x42, 0x9a, 0xd1, 0x00, 0xe1, 0x06, 0x42, 0x9a, 0xd8, 0x07, 0x4b, 0xa0, - 0x42, 0x9a, 0xd0, 0x6e, 0x4b, 0x9f, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xa1, 0xe0, 0xa2, 0x4b, 0x9e, - 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xed, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0x98, 0xe0, 0xde, - 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xfe, 0x69, 0x33, 0x88, 0x18, 0x69, 0xb3, 0x88, 0x1c, 0x6a, 0x33, - 0x88, 0x1d, 0x68, 0x33, 0x78, 0x19, 0x68, 0xb3, 0x78, 0x1a, 0x02, 0x03, 0x0a, 0x00, 0x43, 0x03, - 0x02, 0x20, 0x0a, 0x24, 0x43, 0x20, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x02, 0x28, 0x0a, 0x2d, - 0x43, 0x28, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x6b, 0x30, 0x04, 0x1b, 0x90, 0x02, 0x0c, 0x1b, - 0x1c, 0x38, 0xf0, 0x01, 0xfe, 0x95, 0xe0, 0x60, 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xda, 0x68, 0x33, - 0x1c, 0x38, 0x78, 0x19, 0x68, 0xb3, 0x88, 0x1a, 0x69, 0x33, 0xf0, 0x01, 0xfd, 0x87, 0xe0, 0x54, - 0x2f, 0x00, 0xd0, 0x00, 0xe0, 0xce, 0x68, 0x33, 0x69, 0x32, 0x78, 0x18, 0x68, 0xb3, 0x78, 0x19, - 0x69, 0xb3, 0xf0, 0x00, 0xfc, 0xed, 0xe0, 0x48, 0x25, 0x01, 0x24, 0x00, 0xe0, 0xc5, 0xf0, 0x03, - 0xfd, 0xef, 0x1c, 0x05, 0x28, 0x00, 0xda, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x4a, 0x77, 0x23, 0x01, - 0x60, 0x13, 0x99, 0x11, 0x93, 0x09, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x7a, 0x8b, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x43, 0x1a, 0x92, 0x0b, 0xe0, 0xac, 0x4b, 0x6f, - 0x22, 0x00, 0x60, 0x18, 0xe0, 0x6a, 0x68, 0x32, 0x4b, 0x6d, 0x68, 0x12, 0x60, 0x1a, 0x25, 0x00, - 0xe0, 0xa2, 0x23, 0x01, 0x60, 0x23, 0x4b, 0x69, 0x60, 0x18, 0x48, 0x6a, 0xf0, 0x00, 0xf9, 0x0e, - 0x4b, 0x69, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfc, 0x83, 0x23, 0x00, - 0x93, 0x09, 0x4c, 0x66, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xa5, 0x4b, 0x65, 0x1c, 0x05, 0x60, 0x18, - 0x68, 0x32, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x87, 0x68, 0x23, 0xe0, 0x68, 0x68, 0x33, 0x69, 0x32, - 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0xa7, 0x1c, 0x05, 0xe0, 0x7c, 0x68, 0x33, - 0x69, 0x32, 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0x38, 0xe7, 0xf5, 0x4b, 0x59, - 0x68, 0x1a, 0x42, 0x51, 0x41, 0x4a, 0xe7, 0xc9, 0x68, 0x32, 0x4b, 0x50, 0x68, 0x12, 0x60, 0x1a, - 0x25, 0x01, 0xe0, 0x69, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0x8b, - 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x21, 0x00, 0x43, 0x1a, 0x92, 0x0b, 0x91, 0x0f, 0x68, 0x34, - 0x78, 0x23, 0x2b, 0x5f, 0xd1, 0x1c, 0x78, 0x63, 0x2b, 0x44, 0xd1, 0x19, 0x78, 0xa3, 0x2b, 0x56, - 0xd1, 0x16, 0x78, 0xe3, 0x2b, 0x44, 0xd1, 0x13, 0x4b, 0x40, 0x4c, 0x47, 0x22, 0x01, 0x60, 0x1a, - 0x60, 0x21, 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x06, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, - 0xfe, 0xc5, 0x9b, 0x0f, 0x60, 0x23, 0xf0, 0x04, 0xf8, 0x1f, 0x22, 0x01, 0x92, 0x09, 0xe7, 0x96, - 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x04, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, 0xfe, 0xb6, - 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x03, 0xff, 0x8c, 0x90, 0x0d, 0x28, 0x00, 0xd1, 0x02, 0x23, 0x01, - 0x93, 0x09, 0xe0, 0x25, 0x4a, 0x2d, 0x23, 0x01, 0x60, 0x13, 0x93, 0x09, 0xe7, 0x7f, 0xf0, 0x03, - 0xfd, 0x01, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x1f, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x60, 0x13, - 0xe0, 0x1a, 0x4a, 0x26, 0x23, 0x01, 0x60, 0x13, 0x68, 0x33, 0x69, 0x31, 0x68, 0x18, 0x68, 0xb3, - 0x68, 0x1a, 0xf7, 0xff, 0xfc, 0x07, 0xe7, 0x90, 0x9a, 0x0d, 0x2a, 0x00, 0xd0, 0x08, 0x68, 0x33, - 0x69, 0x32, 0x68, 0x19, 0x68, 0xb3, 0x98, 0x0d, 0x68, 0x1b, 0xf0, 0x04, 0xf8, 0xb5, 0xe7, 0x5e, - 0x25, 0x01, 0xe0, 0x00, 0x25, 0x06, 0x42, 0x6d, 0x24, 0x01, 0x9a, 0x06, 0x00, 0xd3, 0x18, 0xf6, - 0x1c, 0x17, 0xe0, 0x05, 0x68, 0x30, 0x68, 0x71, 0xf7, 0xff, 0xfb, 0x26, 0x37, 0x01, 0x36, 0x08, - 0x9b, 0x07, 0x42, 0x9f, 0xdb, 0xf6, 0xe0, 0x02, 0x22, 0x01, 0x92, 0x0c, 0x24, 0x01, 0x9a, 0x04, - 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x04, 0x98, 0x08, 0x49, 0x14, 0xf7, 0xff, - 0xfb, 0x17, 0x26, 0x01, 0x2c, 0x00, 0xd1, 0x00, 0xe5, 0x1d, 0x98, 0x11, 0x1c, 0x29, 0xf7, 0xff, - 0xfa, 0xff, 0xe5, 0x18, 0x55, 0x4d, 0x53, 0x81, 0x55, 0x4d, 0x53, 0x10, 0x57, 0x46, 0x53, 0x02, - 0x55, 0x4d, 0x53, 0x82, 0x57, 0x46, 0x53, 0x01, 0x57, 0x46, 0x53, 0x03, 0x13, 0x70, 0x60, 0x0c, - 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc3, 0xa0, - 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x67, 0x44, 0x13, 0x70, 0x60, 0x14, 0x13, 0x70, 0x60, 0x10, - 0x00, 0x98, 0x96, 0x80, 0xb5, 0x00, 0x4b, 0x04, 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xff, - 0xfa, 0xbb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x28, 0xb5, 0x00, 0x4b, 0x0d, - 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, 0xf7, 0xff, 0xfa, 0xea, 0x28, 0x00, 0xd1, 0x0d, - 0x48, 0x09, 0xf7, 0xff, 0xfa, 0xb9, 0xf0, 0x03, 0xff, 0xcd, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x7c, - 0xf0, 0x03, 0xff, 0xbc, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x77, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x6c, 0x4b, 0x02, 0x4a, 0x03, - 0x60, 0x18, 0x23, 0x00, 0x60, 0x13, 0x47, 0x70, 0x13, 0x70, 0x67, 0x60, 0x13, 0x70, 0x67, 0x58, - 0xb5, 0xf0, 0x4f, 0x1d, 0x21, 0x10, 0x68, 0x3b, 0x4d, 0x1c, 0x43, 0x8b, 0x60, 0x3b, 0x68, 0x2b, - 0x4e, 0x1b, 0x68, 0x9a, 0x68, 0x33, 0xb0, 0x81, 0x68, 0x54, 0x2b, 0x00, 0xd0, 0x11, 0x1c, 0x20, - 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x00, 0xdc, 0x13, 0x23, 0x00, 0x60, 0x33, 0x4b, 0x15, 0x60, 0x18, - 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x75, 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, - 0xe0, 0x14, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x04, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, - 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, 0x68, 0x3b, 0x22, 0x10, 0x43, 0x13, - 0x4a, 0x0a, 0x60, 0x3b, 0x68, 0x13, 0x21, 0x10, 0x43, 0x0b, 0x60, 0x13, 0xb0, 0x01, 0x20, 0x00, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x67, 0x5c, 0x13, 0x70, 0x67, 0x60, 0x0d, 0x80, 0x00, 0x38, - 0x47, 0x18, 0x46, 0xc0, 0xb5, 0x70, 0x4d, 0x15, 0x4b, 0x15, 0x26, 0x02, 0x42, 0x76, 0x1c, 0x29, - 0x68, 0x18, 0x22, 0x00, 0x60, 0x2e, 0xf7, 0xff, 0xfa, 0x4b, 0x4b, 0x12, 0x22, 0x00, 0x68, 0x1b, - 0x4c, 0x11, 0x68, 0x9b, 0x60, 0x9a, 0x4b, 0x11, 0x68, 0x20, 0x60, 0x1a, 0xf7, 0xff, 0xfa, 0x1c, - 0x68, 0x20, 0xf7, 0xff, 0xfa, 0x1d, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x23, 0x68, 0x2b, 0x2b, 0x00, - 0xd1, 0x03, 0x4b, 0x0b, 0x68, 0x1b, 0x60, 0x2b, 0xe0, 0x00, 0x60, 0x2e, 0x20, 0x04, 0xf7, 0xff, - 0xfa, 0x27, 0x4b, 0x02, 0x68, 0x18, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x64, - 0x13, 0x70, 0x60, 0x18, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x1c, 0x13, 0x70, 0x67, 0x58, - 0x13, 0x70, 0x67, 0x5c, 0xb5, 0x10, 0x4b, 0x0f, 0x1c, 0x04, 0x68, 0x1a, 0x1c, 0x08, 0x23, 0x01, - 0x49, 0x0d, 0xf7, 0xff, 0xf9, 0xf9, 0x4b, 0x0d, 0x21, 0x10, 0x60, 0x18, 0x48, 0x0c, 0xf0, 0x03, - 0xff, 0x47, 0x21, 0x10, 0x48, 0x0b, 0xf0, 0x03, 0xff, 0x37, 0x4b, 0x0b, 0x20, 0x04, 0x60, 0x1c, - 0x4b, 0x0a, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x37, 0x60, 0x93, 0xf7, 0xff, 0xf9, 0xf9, 0xbc, 0x10, - 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x18, 0x05, 0xf5, 0xe1, 0x00, 0x13, 0x70, 0x60, 0x1c, - 0x0d, 0x80, 0x00, 0x38, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0x30, 0x4d, 0x11, 0x4a, 0x11, 0x68, 0x2b, 0xb0, 0x81, 0x40, 0x13, 0x60, 0x2b, 0x20, 0x80, - 0xf0, 0x03, 0xfd, 0xc0, 0x21, 0x20, 0xf7, 0xff, 0xfa, 0x07, 0x4c, 0x0d, 0x60, 0x20, 0x20, 0x04, - 0xf7, 0xff, 0xf9, 0xee, 0x68, 0x21, 0x22, 0x00, 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x11, 0x68, 0x2a, - 0x23, 0x80, 0x02, 0x1b, 0x43, 0x1a, 0x60, 0x2a, 0x20, 0x04, 0xf7, 0xff, 0xf9, 0xc9, 0xb0, 0x01, - 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x0d, 0x04, 0x00, 0xcc, 0xff, 0xff, 0x7f, 0xff, - 0x13, 0x70, 0x60, 0x18, 0xb5, 0x00, 0x4b, 0x06, 0x02, 0xc0, 0x68, 0x1a, 0x1c, 0x19, 0x68, 0x0b, - 0x1a, 0x9b, 0xd5, 0x00, 0x68, 0x0a, 0x42, 0x83, 0xd9, 0xf9, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, - 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x00, 0x4b, 0x19, 0x4a, 0x19, 0x78, 0x1b, 0xb0, 0x81, 0x1e, 0x59, - 0x41, 0x8b, 0x60, 0x13, 0xf0, 0x03, 0xff, 0x1c, 0x1c, 0x03, 0x48, 0x16, 0x21, 0x04, 0x60, 0x03, - 0xf7, 0xff, 0xf9, 0xba, 0xf0, 0x03, 0xff, 0x08, 0x22, 0x00, 0x1c, 0x01, 0x48, 0x12, 0xf0, 0x03, - 0xfe, 0xbd, 0x21, 0xa0, 0x02, 0x49, 0x48, 0x11, 0xf7, 0xff, 0xf9, 0x6e, 0x4b, 0x10, 0x21, 0x80, - 0x60, 0x18, 0xf7, 0xff, 0xf9, 0xb5, 0x21, 0x20, 0xf7, 0xff, 0xf9, 0xb6, 0x4b, 0x0d, 0x60, 0x18, - 0xf0, 0x00, 0xfd, 0x7c, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x02, 0xf7, 0xff, - 0xfb, 0x7d, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, - 0x13, 0x70, 0x67, 0x78, 0x13, 0x72, 0xc0, 0x00, 0x13, 0x70, 0x0f, 0x21, 0x13, 0x71, 0x80, 0x00, - 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x20, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, - 0xf9, 0x9f, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xf9, 0x86, 0x68, 0x22, 0x4b, 0x11, - 0x42, 0x9a, 0xd1, 0x18, 0x4b, 0x10, 0x49, 0x11, 0x22, 0x01, 0x43, 0x13, 0x60, 0x4b, 0x22, 0x08, - 0x1c, 0x20, 0xf0, 0x04, 0xfc, 0xc3, 0x1c, 0x20, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x65, 0x1b, 0x63, - 0x4a, 0x0b, 0x08, 0x9b, 0x3b, 0x02, 0x40, 0x13, 0x4a, 0x0a, 0x1c, 0x28, 0x43, 0x13, 0x60, 0x2b, - 0x21, 0x04, 0xf7, 0xff, 0xf9, 0x59, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0x66, 0xbc, 0x70, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xe6, 0x00, 0x01, 0x70, 0x13, 0x70, 0x02, 0x71, 0x13, 0x70, 0x60, 0x2c, - 0x00, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0xb5, 0x30, 0x1c, 0x04, 0xb0, 0x81, 0xf7, 0xff, - 0xf9, 0x1f, 0x2c, 0x26, 0xd0, 0x42, 0x2c, 0x26, 0xd8, 0x05, 0x2c, 0x24, 0xd0, 0x09, 0x2c, 0x25, - 0xd0, 0x00, 0xe0, 0x97, 0xe0, 0x0e, 0x2c, 0x39, 0xd0, 0x64, 0x2c, 0x3c, 0xd0, 0x00, 0xe0, 0x91, - 0xe0, 0x62, 0x49, 0x4b, 0x4b, 0x4b, 0x48, 0x4c, 0x60, 0x4b, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x86, - 0x48, 0x49, 0xe0, 0x84, 0x49, 0x49, 0x48, 0x4a, 0xf7, 0xff, 0xff, 0xa6, 0x4c, 0x44, 0x48, 0x49, - 0x4b, 0x49, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, - 0xf9, 0x1b, 0x48, 0x46, 0x4b, 0x46, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, - 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x11, 0x48, 0x43, 0x4b, 0x43, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x07, 0x4b, 0x36, 0x48, 0x3f, 0x60, 0x63, - 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x5a, 0x48, 0x3c, 0xe0, 0x58, 0x49, 0x3c, 0x48, 0x3d, - 0xf7, 0xff, 0xff, 0x7a, 0x4c, 0x2e, 0x48, 0x33, 0x4b, 0x3b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xef, 0x48, 0x30, 0x4b, 0x37, 0x1c, 0x22, - 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xe5, 0x48, 0x2d, - 0x4b, 0x33, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, - 0xf8, 0xdb, 0x4b, 0x20, 0x48, 0x2f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x2e, - 0x48, 0x2c, 0xe0, 0x2c, 0x48, 0x2c, 0xe0, 0x00, 0x48, 0x2c, 0x49, 0x2d, 0xf7, 0xff, 0xff, 0x4c, - 0x4c, 0x17, 0x48, 0x1c, 0x4b, 0x2b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, - 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xc1, 0x48, 0x19, 0x4b, 0x27, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, - 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x16, 0x4b, 0x23, 0x1c, 0x22, - 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xad, 0x4b, 0x09, - 0x48, 0x1f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x00, 0x48, 0x1c, 0x21, 0x08, - 0xf7, 0xff, 0xf8, 0xa2, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x2c, 0x13, 0x70, 0x00, 0x60, 0xff, 0xff, 0x1e, 0x78, 0x20, 0x20, 0x40, 0x8c, - 0x20, 0x20, 0x5d, 0xe8, 0x13, 0x70, 0x00, 0xbc, 0xff, 0xff, 0x1f, 0x70, 0x13, 0x70, 0x00, 0xc4, - 0xff, 0xff, 0x1f, 0x8c, 0x13, 0x70, 0x00, 0xcc, 0xff, 0xff, 0x1e, 0x34, 0xff, 0xff, 0x1f, 0x68, - 0x20, 0x20, 0x3e, 0x6c, 0x20, 0x20, 0x5b, 0x14, 0xff, 0xff, 0x1e, 0xb0, 0xff, 0xff, 0x1e, 0xcc, - 0xff, 0xff, 0x1d, 0x74, 0xff, 0xff, 0x1e, 0xa8, 0x20, 0x20, 0x5e, 0x84, 0x20, 0x20, 0x5d, 0x94, - 0x20, 0x20, 0x3f, 0x60, 0xff, 0xff, 0x21, 0x30, 0xff, 0xff, 0x21, 0x4c, 0xff, 0xff, 0x1f, 0xf4, - 0xff, 0xff, 0x21, 0x28, 0xb5, 0x30, 0x4d, 0x0c, 0xb0, 0x81, 0x23, 0x00, 0x68, 0x2a, 0x49, 0x0b, - 0xf7, 0xff, 0xf8, 0x3a, 0x4c, 0x0a, 0x49, 0x0b, 0x22, 0x00, 0x60, 0x20, 0x68, 0x28, 0xf7, 0xff, - 0xf8, 0x4f, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x28, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x29, 0xb0, 0x01, - 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x20, 0x00, 0x98, 0x96, 0x80, - 0x13, 0x70, 0x60, 0x24, 0x13, 0x70, 0x67, 0x68, 0xb5, 0x00, 0x1c, 0x03, 0x01, 0x40, 0x1a, 0xc0, - 0x00, 0x80, 0x18, 0xc0, 0xb0, 0x81, 0x00, 0xc0, 0xf7, 0xff, 0xff, 0xd4, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x83, 0x93, 0x00, 0x46, 0x94, 0x06, 0x0b, 0x0e, 0x0a, - 0x26, 0xff, 0x43, 0x1a, 0x02, 0x36, 0x1c, 0x0b, 0x40, 0x33, 0x02, 0x1b, 0x25, 0xff, 0x43, 0x1a, - 0x04, 0x2d, 0x1c, 0x0b, 0x40, 0x2b, 0x0a, 0x1b, 0x43, 0x1a, 0x90, 0x01, 0x60, 0xc2, 0x9a, 0x01, - 0x23, 0x00, 0x62, 0x13, 0x4b, 0x2a, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0x80, 0x01, 0x5b, 0x1a, 0x98, - 0x45, 0x84, 0xd2, 0x01, 0x46, 0x64, 0xe0, 0x2f, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xca, 0x4b, 0x25, - 0x1c, 0x11, 0x1c, 0x04, 0x1c, 0x2e, 0x40, 0x19, 0x98, 0x01, 0x27, 0x01, 0x25, 0x00, 0xe0, 0x18, - 0x06, 0x0b, 0x0e, 0x0a, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x0b, 0x02, 0x1b, 0x43, 0x1a, - 0x1c, 0x0b, 0x40, 0x33, 0x0a, 0x1b, 0x43, 0x1a, 0x61, 0x02, 0x22, 0x80, 0x01, 0x52, 0x18, 0xa4, - 0x62, 0x45, 0x45, 0x64, 0xd3, 0x00, 0x46, 0x64, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xc9, 0x37, 0x01, - 0x30, 0x04, 0x45, 0x64, 0xd2, 0x01, 0x2f, 0x04, 0xdd, 0xe2, 0x45, 0x64, 0xd0, 0x04, 0x1c, 0x20, - 0x99, 0x08, 0xf0, 0x04, 0xfa, 0xd9, 0x1a, 0x64, 0x9b, 0x00, 0x04, 0x22, 0x43, 0x1a, 0x06, 0x13, - 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, - 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, 0x23, 0x80, 0x9a, 0x01, 0x04, 0x5b, 0xb0, 0x03, - 0x1c, 0x20, 0x60, 0x91, 0x64, 0x14, 0x60, 0x13, 0x60, 0x53, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xb5, 0xf0, 0x26, 0xff, 0x25, 0xff, 0x22, 0x03, - 0x02, 0x36, 0x04, 0x2d, 0x46, 0x94, 0x4f, 0x18, 0xe0, 0x1e, 0x68, 0x82, 0x06, 0x13, 0x0e, 0x11, - 0x43, 0x19, 0x1c, 0x13, 0x40, 0x33, 0x02, 0x1b, 0x43, 0x19, 0x40, 0x2a, 0x0a, 0x12, 0x1c, 0x0c, - 0x43, 0x14, 0x0a, 0x23, 0x46, 0x62, 0x40, 0x13, 0x2b, 0x02, 0xd0, 0x07, 0x6b, 0xc1, 0x6c, 0x03, - 0x69, 0x4a, 0x18, 0xd2, 0x0c, 0x23, 0x40, 0x3b, 0x1a, 0xd2, 0x61, 0x4a, 0x6c, 0x03, 0x2b, 0x00, - 0xd0, 0x01, 0x06, 0x63, 0xd4, 0x03, 0x6b, 0x80, 0x28, 0x00, 0xd1, 0xde, 0xe0, 0x04, 0x6b, 0xc2, - 0x23, 0x01, 0x42, 0x5b, 0x61, 0x53, 0x1c, 0x18, 0x4b, 0x04, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0x00, 0x07, 0x43, 0xd5, 0x15, 0x4b, 0x0c, 0x4a, 0x0c, 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x4b, - 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, 0x64, 0x4b, 0x4b, 0x06, 0x4a, 0x07, - 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x8b, 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, - 0x64, 0x8b, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x03, - 0xb5, 0xf0, 0x07, 0x43, 0xd5, 0x21, 0x24, 0x80, 0x4e, 0x11, 0x4d, 0x12, 0x4f, 0x12, 0x20, 0x00, - 0x01, 0xa4, 0x68, 0x33, 0x00, 0x82, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x2b, 0x68, 0x0a, - 0x42, 0x98, 0xd1, 0x0a, 0x07, 0xd3, 0xd4, 0x0d, 0x4a, 0x0c, 0x23, 0x02, 0x49, 0x0c, 0x60, 0x13, - 0x68, 0x0b, 0x22, 0x20, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x1c, 0x13, 0x40, 0x3b, 0x2b, 0x03, - 0xd1, 0x00, 0x60, 0x0c, 0x30, 0x01, 0x28, 0x04, 0xd1, 0xe3, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x20, 0x03, 0x13, 0x70, 0x67, 0x6c, - 0x0d, 0x80, 0x00, 0xc0, 0xb5, 0x00, 0x4b, 0x0a, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, 0x68, 0x99, - 0x6c, 0x4b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x4a, 0x4b, 0x05, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, - 0x68, 0x99, 0x6c, 0x8b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x8a, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x23, 0x01, 0x42, 0x5b, 0x62, 0x03, - 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x4b, 0x06, 0x49, 0x07, 0x78, 0x1a, 0x68, 0x08, - 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x05, 0x60, 0x1a, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x33, 0x58, - 0x18, 0xc0, 0x47, 0x70, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, - 0xb5, 0x10, 0x1c, 0x18, 0x4b, 0x12, 0x1c, 0x14, 0x78, 0x1a, 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x11, - 0x60, 0x1a, 0x4b, 0x11, 0x68, 0x19, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x18, 0xc9, 0x6f, 0x0b, - 0x2b, 0x00, 0xd0, 0x10, 0x23, 0x00, 0x80, 0x03, 0x80, 0x43, 0x31, 0x60, 0x88, 0x0b, 0x04, 0x1b, - 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x80, 0x82, 0x88, 0x4b, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, - 0x43, 0x1a, 0x80, 0xc2, 0x23, 0x01, 0x20, 0x00, 0x70, 0x23, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, - 0x1c, 0x07, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x20, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x36, - 0x4d, 0x1e, 0x1c, 0x06, 0x1c, 0x30, 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0xb6, 0x1c, 0x30, 0x1c, 0x0c, - 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x67, 0x17, 0xe3, 0x18, 0xe4, 0x40, 0x5c, 0x34, 0x30, 0x4b, 0x18, - 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0x9d, 0xd1, 0xec, 0x1c, 0x2a, 0x3a, 0x0f, 0x23, 0x00, - 0x76, 0x93, 0x2f, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x02, 0x23, 0x2d, 0x70, 0x13, 0x20, 0x01, - 0x22, 0x10, 0x49, 0x0d, 0xe0, 0x00, 0x32, 0x01, 0x5c, 0x8b, 0x2b, 0x30, 0xd0, 0xfb, 0x2b, 0x00, - 0xd1, 0x00, 0x3a, 0x01, 0x4b, 0x08, 0x18, 0x99, 0x18, 0x1b, 0xe0, 0x02, 0x70, 0x1a, 0x30, 0x01, - 0x33, 0x01, 0x78, 0x0a, 0x31, 0x01, 0x2a, 0x00, 0xd1, 0xf8, 0x4b, 0x03, 0x54, 0x1a, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, - 0x13, 0x72, 0xc1, 0xef, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x1a, - 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, 0x4d, 0x18, 0x1c, 0x2f, 0x3f, 0x0a, 0x1c, 0x30, - 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x30, 0x1c, 0x0c, 0x21, 0x0a, 0xf0, 0x04, 0xf8, 0xd4, - 0x34, 0x30, 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0xbd, 0xd1, 0xf0, 0x1c, 0x2a, 0x23, 0x00, - 0x3a, 0x0f, 0x76, 0x93, 0x23, 0x10, 0xe0, 0x00, 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, - 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x08, 0x22, 0x00, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, - 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, - 0xb5, 0x10, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x19, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, - 0x4a, 0x17, 0x24, 0x0f, 0x1c, 0x11, 0x39, 0x08, 0x1c, 0x03, 0x40, 0x23, 0x09, 0x00, 0x2b, 0x09, - 0xdd, 0x00, 0x33, 0x07, 0x33, 0x30, 0x70, 0x13, 0x3a, 0x01, 0x42, 0x8a, 0xd1, 0xf4, 0x3a, 0x0f, - 0x23, 0x00, 0x76, 0x13, 0x23, 0x30, 0x70, 0x13, 0x23, 0x78, 0x70, 0x53, 0x23, 0x10, 0xe0, 0x00, - 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x07, - 0x22, 0x02, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, - 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x72, 0xc1, 0xe0, - 0x13, 0x72, 0xc1, 0xf7, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x23, 0x00, 0x60, 0x03, 0x4b, 0x0c, - 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x11, 0x4b, 0x0b, 0x78, 0x1a, 0x2a, 0x10, 0xd0, 0x0d, 0x28, 0x00, - 0xd0, 0x04, 0x4b, 0x09, 0x32, 0x04, 0x00, 0x92, 0x58, 0xd3, 0x60, 0x03, 0x4b, 0x05, 0x4a, 0x06, - 0x78, 0x1b, 0x33, 0x14, 0x00, 0x9b, 0x58, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0xb5, 0xf0, 0x4a, 0x67, - 0xb0, 0x8b, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x06, 0x4b, 0x65, 0x68, 0x19, 0x69, 0x8b, 0x60, 0x13, - 0x6a, 0x0b, 0x4a, 0x64, 0x60, 0x13, 0x4b, 0x63, 0x4f, 0x61, 0x68, 0x1d, 0x26, 0x00, 0x1c, 0x34, - 0x68, 0x3b, 0x34, 0x08, 0x00, 0xa4, 0x50, 0xe5, 0x68, 0x3b, 0x21, 0x00, 0x58, 0xe0, 0x22, 0x60, - 0xf0, 0x04, 0xf9, 0x70, 0x68, 0x3b, 0x21, 0x60, 0x58, 0xe0, 0xf0, 0x03, 0xf9, 0xd3, 0x1c, 0x2b, - 0x33, 0x7f, 0x1c, 0x1d, 0x21, 0x1f, 0x36, 0x01, 0x43, 0x8d, 0x2e, 0x08, 0xd1, 0xe7, 0x24, 0x00, - 0x26, 0x1f, 0x1c, 0x28, 0x21, 0x00, 0x22, 0x60, 0xf0, 0x04, 0xf9, 0x5c, 0x1c, 0x28, 0x21, 0x60, - 0xf0, 0x03, 0xf9, 0xc0, 0x1c, 0x2b, 0x33, 0x7f, 0x1c, 0x1d, 0x34, 0x01, 0x43, 0xb5, 0x2c, 0x08, - 0xd1, 0xef, 0x4b, 0x4d, 0x4a, 0x4d, 0x60, 0x1d, 0x4b, 0x48, 0x92, 0x06, 0x21, 0x80, 0x22, 0xff, - 0x68, 0x1f, 0x05, 0xc9, 0x23, 0x00, 0x02, 0x12, 0x93, 0x08, 0x91, 0x02, 0x92, 0x01, 0x9b, 0x06, - 0x21, 0x00, 0x60, 0x1f, 0x22, 0x60, 0x1c, 0x38, 0xf0, 0x04, 0xf9, 0x3c, 0x1c, 0x38, 0xf0, 0x03, - 0xf9, 0x5b, 0x64, 0x78, 0x99, 0x06, 0x9b, 0x08, 0x68, 0x0a, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x80, - 0x04, 0x1b, 0x60, 0x53, 0x99, 0x06, 0x23, 0x00, 0x68, 0x0a, 0x60, 0x93, 0x68, 0x0b, 0x9a, 0x02, - 0x21, 0x1f, 0x61, 0x9a, 0x1c, 0x3b, 0x33, 0x7f, 0x9a, 0x06, 0x1c, 0x1f, 0x43, 0x8f, 0x68, 0x12, - 0x1c, 0x38, 0x92, 0x07, 0xf0, 0x03, 0xf9, 0x40, 0x1c, 0x06, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x3c, - 0x1c, 0x04, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x38, 0x1c, 0x05, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x34, - 0x99, 0x01, 0x23, 0xff, 0x22, 0xff, 0x04, 0x12, 0x02, 0x1b, 0x93, 0x05, 0x40, 0x0c, 0x40, 0x15, - 0x23, 0xe0, 0x40, 0x1e, 0x21, 0x02, 0x02, 0x24, 0x0a, 0x2d, 0x0e, 0x00, 0x43, 0x0e, 0x43, 0x2c, - 0x92, 0x04, 0x43, 0x04, 0x9a, 0x07, 0x06, 0x36, 0x43, 0x34, 0x60, 0x14, 0x9b, 0x06, 0x68, 0x1a, - 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x99, 0x06, 0x68, 0x0a, 0x61, 0x53, 0xc9, 0x01, 0x91, 0x06, - 0x21, 0x60, 0xf0, 0x03, 0xf9, 0x57, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, 0x2a, 0x06, 0xd1, 0xa6, - 0x4b, 0x1a, 0x4f, 0x16, 0x93, 0x03, 0x69, 0x59, 0x68, 0x38, 0x91, 0x09, 0xf0, 0x03, 0xf9, 0x04, - 0x1c, 0x06, 0x68, 0x38, 0xf0, 0x03, 0xf9, 0x00, 0x1c, 0x04, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xfc, - 0x1c, 0x05, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xf8, 0x9a, 0x05, 0x9b, 0x04, 0x40, 0x14, 0x40, 0x1d, - 0x21, 0xe0, 0x0a, 0x2d, 0x22, 0x02, 0x40, 0x0e, 0x02, 0x24, 0x43, 0x2c, 0x43, 0x16, 0x0e, 0x00, - 0x9b, 0x09, 0x06, 0x36, 0x43, 0x04, 0x43, 0x34, 0x60, 0x1c, 0x99, 0x03, 0x69, 0x48, 0x21, 0x60, - 0xf0, 0x03, 0xf9, 0x28, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xcc, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0xc8, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x72, 0xc0, 0x20, - 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0xf0, 0x03, 0xf8, 0xcf, 0x21, 0x00, 0x1c, 0x05, 0x22, 0x60, - 0x1c, 0x20, 0xf0, 0x04, 0xf8, 0xa7, 0x23, 0x40, 0x60, 0xa3, 0x23, 0x80, 0x04, 0x5b, 0xb0, 0x01, - 0x63, 0x65, 0x60, 0x23, 0x60, 0x63, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0x4b, 0x1a, - 0xb0, 0x83, 0x68, 0x1d, 0x23, 0x00, 0x93, 0x01, 0x23, 0xff, 0x02, 0x1b, 0x27, 0xff, 0x26, 0x80, - 0x93, 0x00, 0x04, 0x3f, 0x04, 0x76, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xda, 0x9b, 0x01, 0x2b, 0x03, - 0xd0, 0x19, 0x1c, 0x2c, 0x23, 0x1f, 0x34, 0x7f, 0x43, 0x9c, 0x6b, 0x62, 0x1c, 0x28, 0x06, 0x13, - 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x00, 0x60, 0x6e, 0x40, 0x13, 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, - 0x0a, 0x12, 0x43, 0x11, 0x60, 0x29, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xdc, 0x9b, 0x01, 0x1c, 0x25, - 0x33, 0x01, 0x93, 0x01, 0xe7, 0xdf, 0x1c, 0x28, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xd3, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc4, 0xb5, 0xf0, 0xb0, 0x83, - 0xf7, 0xff, 0xfe, 0xd4, 0xf7, 0xff, 0xff, 0xc2, 0x4d, 0x4b, 0x49, 0x4c, 0x68, 0x2a, 0x68, 0x0b, - 0x4f, 0x4b, 0x61, 0x93, 0x68, 0x2a, 0x68, 0x4b, 0x4e, 0x4a, 0x61, 0xd3, 0x68, 0x8b, 0x4a, 0x4a, - 0x60, 0x3b, 0x92, 0x01, 0x68, 0xcb, 0x60, 0x13, 0x69, 0x0b, 0x21, 0x60, 0x60, 0x33, 0x68, 0x2b, - 0x69, 0x98, 0xf0, 0x03, 0xf8, 0x97, 0x68, 0x2a, 0x69, 0x93, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, - 0x69, 0x9b, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0x9c, 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x5d, 0x64, 0x60, - 0x68, 0x33, 0x6c, 0x59, 0x68, 0x2b, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, - 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, - 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x2b, - 0x21, 0x60, 0x69, 0x9a, 0x23, 0x80, 0x04, 0x1b, 0x60, 0x53, 0x68, 0x2b, 0x22, 0x00, 0x69, 0x9b, - 0x60, 0x9a, 0x68, 0x2b, 0x69, 0x9a, 0x23, 0x80, 0x05, 0xdb, 0x61, 0x93, 0x68, 0x2b, 0x69, 0x9a, - 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x68, 0x2a, 0x69, 0x92, 0x61, 0x53, 0x68, 0x2b, 0x69, 0x98, - 0xf0, 0x03, 0xf8, 0x70, 0x68, 0x2b, 0x21, 0x60, 0x69, 0xd8, 0xf0, 0x03, 0xf8, 0x53, 0x68, 0x2a, - 0x69, 0xd3, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, 0x69, 0xdb, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0xdc, - 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x19, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x42, - 0x68, 0x3a, 0x68, 0x2b, 0x64, 0xd3, 0x68, 0x3b, 0x22, 0x00, 0x64, 0x9a, 0x68, 0x3c, 0x1c, 0x20, - 0xf0, 0x03, 0xf8, 0x0a, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x4b, 0x9b, 0x01, - 0x21, 0x60, 0x68, 0x18, 0xf0, 0x03, 0xf8, 0x2e, 0x9b, 0x01, 0x68, 0x1a, 0x68, 0x2b, 0x64, 0xd3, - 0x9a, 0x01, 0x68, 0x13, 0x22, 0x00, 0x64, 0x9a, 0x9b, 0x01, 0x68, 0x1c, 0x1c, 0x20, 0xf0, 0x02, - 0xff, 0xf3, 0x64, 0x60, 0x9a, 0x01, 0x21, 0x60, 0x68, 0x10, 0xf0, 0x03, 0xf8, 0x33, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, - 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x84, 0x13, 0x70, 0x67, 0x80, 0xb5, 0xf0, 0x4c, 0x23, - 0x4b, 0x23, 0xb0, 0x81, 0x60, 0x23, 0xf0, 0x03, 0xf8, 0x35, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, - 0x42, 0x40, 0xe0, 0x37, 0xf0, 0x03, 0xf9, 0x80, 0x60, 0x20, 0x68, 0x82, 0x4b, 0x1d, 0x21, 0x01, - 0x60, 0x13, 0x68, 0x20, 0x68, 0x82, 0x68, 0x13, 0x42, 0x0b, 0xd1, 0xfc, 0x21, 0xfc, 0xf0, 0x03, - 0xf8, 0x09, 0x27, 0x80, 0x26, 0x80, 0x4c, 0x15, 0x25, 0x00, 0x04, 0x7f, 0x01, 0x76, 0x68, 0x23, - 0x21, 0x04, 0x6c, 0xdb, 0x51, 0x5f, 0x68, 0x23, 0x6c, 0xdb, 0x59, 0x58, 0x35, 0x04, 0xf0, 0x02, - 0xff, 0xf9, 0x42, 0xb5, 0xd1, 0xf3, 0xf7, 0xff, 0xff, 0x29, 0x68, 0x23, 0x22, 0x01, 0x33, 0x54, - 0x70, 0x1a, 0x68, 0x23, 0x20, 0x00, 0x68, 0x9a, 0x69, 0x9b, 0x6c, 0x5b, 0x61, 0x93, 0x68, 0x23, - 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x68, 0x23, 0x68, 0x9a, 0x4b, 0x07, 0x60, 0x13, 0x68, 0x23, - 0x68, 0x9b, 0x68, 0x1b, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x21, 0xb5, 0x10, 0x4b, 0x0c, - 0x68, 0x18, 0x6c, 0x01, 0x29, 0x07, 0xdd, 0x01, 0x24, 0x00, 0xe0, 0x0d, 0x4b, 0x09, 0x68, 0x1b, - 0x00, 0xdb, 0x18, 0x5b, 0x00, 0x5a, 0x18, 0xd2, 0x6a, 0x03, 0x01, 0x52, 0x18, 0x9c, 0x1c, 0x4b, - 0x64, 0x03, 0x1c, 0x20, 0xf7, 0xff, 0xfe, 0xa4, 0x1c, 0x20, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x70, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x05, 0xf7, 0xff, - 0xff, 0xdd, 0x90, 0x08, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xad, 0x63, 0xc5, 0x23, 0x00, 0x61, 0x6b, - 0x7e, 0x6b, 0x69, 0x2a, 0x93, 0x07, 0x7e, 0x2b, 0x92, 0x0a, 0x2b, 0x00, 0xd0, 0x02, 0x9c, 0x08, - 0x26, 0x80, 0xe0, 0x26, 0x23, 0x08, 0x93, 0x00, 0x23, 0xa0, 0x68, 0x69, 0x22, 0x08, 0x00, 0x9b, - 0x98, 0x08, 0xf7, 0xff, 0xfb, 0x57, 0xf7, 0xff, 0xff, 0xc1, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, - 0xe0, 0x91, 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, - 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, - 0x9a, 0x08, 0x60, 0x11, 0x63, 0x90, 0x9b, 0x0a, 0x2b, 0x00, 0xd1, 0x01, 0x4e, 0x40, 0xe0, 0x00, - 0x4e, 0x40, 0x68, 0xea, 0x9b, 0x07, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x02, 0x23, 0x80, 0x00, 0x5b, - 0x43, 0x1e, 0x69, 0xea, 0x4b, 0x3c, 0x27, 0xff, 0x40, 0x13, 0x93, 0x0b, 0x3b, 0x01, 0x22, 0x80, - 0x93, 0x04, 0x23, 0xff, 0x04, 0x52, 0x02, 0x1b, 0x92, 0x05, 0x93, 0x03, 0x04, 0x3f, 0x9a, 0x0b, - 0x1c, 0x33, 0x92, 0x00, 0x1c, 0x20, 0x9a, 0x0a, 0x99, 0x09, 0xf7, 0xff, 0xfb, 0x1b, 0x9b, 0x0a, - 0x9a, 0x09, 0x1a, 0x1b, 0x93, 0x0a, 0x9b, 0x07, 0x18, 0x12, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x01, - 0x9a, 0x05, 0x60, 0x62, 0x9a, 0x04, 0x18, 0x13, 0x9a, 0x0b, 0x42, 0x13, 0xd1, 0x01, 0x4b, 0x2b, - 0x18, 0xf6, 0x9a, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0xf7, 0xff, 0xff, 0x70, 0x28, 0x00, 0xd0, 0x42, - 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x03, 0x63, 0xa0, 0x40, 0x13, - 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x60, 0x21, 0x1c, 0x04, 0xe7, 0xce, - 0x23, 0x80, 0x04, 0x5b, 0x60, 0x63, 0x69, 0x2b, 0x1c, 0x27, 0x2b, 0x00, 0xd0, 0x24, 0x7e, 0x2b, - 0x93, 0x06, 0x2b, 0x00, 0xd1, 0x20, 0xf7, 0xff, 0xff, 0x51, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x22, - 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, - 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, - 0x00, 0x5b, 0x4a, 0x0e, 0x60, 0x39, 0x63, 0xb8, 0x40, 0x73, 0x43, 0x13, 0x9a, 0x06, 0x21, 0x00, - 0x92, 0x00, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0xc6, 0x68, 0xa3, 0x22, 0x80, 0x04, 0x12, 0x43, 0x13, - 0x60, 0xa3, 0x98, 0x08, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x0d, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x80, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, - 0xb5, 0xf0, 0x7c, 0x83, 0x7c, 0xc2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0x03, 0xb0, 0x85, - 0x02, 0x1b, 0x43, 0x13, 0x7d, 0x42, 0x1c, 0x06, 0x43, 0x1a, 0xd0, 0x67, 0x22, 0x00, 0x92, 0x01, - 0xe0, 0x53, 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x9a, 0x03, 0x43, 0x03, - 0x18, 0x9d, 0x7a, 0x6b, 0x7a, 0xaa, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xeb, 0x02, 0x1b, - 0x43, 0x13, 0x7b, 0x2a, 0x43, 0x1a, 0xd0, 0x3b, 0x23, 0x00, 0x93, 0x02, 0x27, 0x00, 0xe0, 0x26, - 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x03, 0x19, 0xdc, 0x7b, 0xa3, - 0x7b, 0xe2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, - 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x71, 0x7a, 0x63, 0x7a, 0xa2, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, - 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x63, 0x9a, 0x02, 0x37, 0x12, 0x32, 0x01, 0x92, 0x02, 0x79, 0x2b, - 0x7a, 0x69, 0x46, 0x9c, 0x9b, 0x02, 0x7a, 0xaa, 0x7a, 0xec, 0x7b, 0x28, 0x45, 0x63, 0xdb, 0xcf, - 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x4e, - 0x9d, 0x01, 0x9a, 0x03, 0x35, 0x01, 0x95, 0x01, 0x32, 0x0d, 0x7c, 0x73, 0x9d, 0x01, 0x92, 0x03, - 0x7c, 0xb1, 0x7c, 0xf2, 0x7d, 0x34, 0x7d, 0x70, 0x42, 0x9d, 0xdb, 0xa2, 0x06, 0x0b, 0x04, 0x12, - 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x38, 0xb0, 0x05, 0xbc, 0xf0, - 0xbc, 0x01, 0x47, 0x00, 0xb4, 0x0f, 0xb5, 0xf0, 0xb0, 0x83, 0x46, 0x6a, 0x23, 0x80, 0xad, 0x08, - 0x32, 0x06, 0x01, 0x9b, 0xcd, 0x10, 0x80, 0x13, 0x4e, 0x1d, 0xe0, 0x30, 0x1c, 0x67, 0x2b, 0x25, - 0xd0, 0x07, 0x46, 0x6a, 0x46, 0x68, 0x71, 0x93, 0x30, 0x06, 0x1c, 0x3c, 0xf7, 0xfe, 0xfa, 0x4c, - 0xe0, 0x25, 0x78, 0x63, 0x2b, 0x73, 0xd0, 0x1c, 0x2b, 0x73, 0xd8, 0x04, 0x2b, 0x64, 0xd0, 0x07, - 0x2b, 0x69, 0xd1, 0x1b, 0xe0, 0x04, 0x2b, 0x75, 0xd0, 0x07, 0x2b, 0x78, 0xd1, 0x16, 0xe0, 0x0a, - 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0x72, 0xe0, 0x09, 0x68, 0x28, 0xf7, 0xff, 0xfb, 0xba, - 0x1d, 0x2c, 0x1c, 0x30, 0xe0, 0x07, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0xf1, 0x48, 0x08, - 0xe0, 0x01, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xfe, 0xfa, 0x27, 0x1c, 0x25, 0x1c, 0x7c, 0x78, 0x23, - 0x2b, 0x00, 0xd1, 0xcb, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0x46, 0xc0, - 0x13, 0x72, 0xc1, 0xe0, 0xb5, 0xf0, 0x4b, 0x32, 0xb0, 0x8f, 0x68, 0x1b, 0x1c, 0x01, 0x68, 0x9a, - 0x4b, 0x30, 0x68, 0x54, 0x68, 0x1b, 0x32, 0x44, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x48, 0x2e, - 0x92, 0x0d, 0xf7, 0xff, 0xff, 0xa7, 0x04, 0x20, 0xd4, 0x02, 0x49, 0x2c, 0x91, 0x0a, 0xe0, 0x01, - 0x4b, 0x2b, 0x93, 0x0a, 0x04, 0x60, 0xd4, 0x02, 0x49, 0x28, 0x91, 0x0b, 0xe0, 0x01, 0x4b, 0x29, - 0x93, 0x0b, 0x04, 0xa0, 0xd4, 0x02, 0x49, 0x25, 0x91, 0x0c, 0xe0, 0x01, 0x4b, 0x26, 0x93, 0x0c, - 0x04, 0xe0, 0xd4, 0x02, 0x49, 0x21, 0x46, 0x8c, 0xe0, 0x01, 0x4b, 0x24, 0x46, 0x9c, 0x06, 0xa0, - 0xd4, 0x01, 0x4f, 0x1e, 0xe0, 0x00, 0x4f, 0x22, 0x06, 0xe1, 0xd4, 0x01, 0x4e, 0x1b, 0xe0, 0x00, - 0x4e, 0x20, 0x07, 0x23, 0xd4, 0x01, 0x4d, 0x19, 0xe0, 0x00, 0x4d, 0x1f, 0x07, 0x60, 0xd4, 0x01, - 0x4a, 0x16, 0xe0, 0x00, 0x4a, 0x1d, 0x07, 0xa1, 0xd4, 0x01, 0x4b, 0x14, 0xe0, 0x00, 0x4b, 0x1c, - 0x07, 0xe0, 0xd4, 0x01, 0x49, 0x11, 0xe0, 0x00, 0x49, 0x1a, 0x48, 0x1b, 0x92, 0x05, 0x90, 0x09, - 0x98, 0x0c, 0x9a, 0x0a, 0x90, 0x00, 0x46, 0x60, 0x90, 0x01, 0x93, 0x06, 0x91, 0x07, 0x9b, 0x0b, - 0x98, 0x09, 0x1c, 0x21, 0x97, 0x02, 0x96, 0x03, 0x95, 0x04, 0xf7, 0xff, 0xff, 0x5b, 0x99, 0x0d, - 0x48, 0x12, 0xf7, 0xff, 0xff, 0x57, 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x85, 0x13, 0x70, 0x66, 0x42, - 0x13, 0x70, 0x60, 0x9b, 0x13, 0x70, 0x60, 0xa2, 0x13, 0x70, 0x60, 0xac, 0x13, 0x70, 0x60, 0xb2, - 0x13, 0x70, 0x60, 0xb8, 0x13, 0x70, 0x60, 0xbd, 0x13, 0x70, 0x60, 0xc4, 0x13, 0x70, 0x60, 0xc9, - 0x13, 0x70, 0x60, 0xce, 0x13, 0x70, 0x60, 0xd3, 0x13, 0x70, 0x60, 0xd8, 0x13, 0x70, 0x60, 0xfd, - 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, 0x1c, 0x1c, 0x68, 0x12, - 0x68, 0x23, 0x43, 0x2a, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, 0xf9, 0x2b, 0x68, 0x23, - 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd0, 0xf3, 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x34, 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, - 0x1c, 0x1c, 0x68, 0x12, 0x68, 0x23, 0x43, 0xaa, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, - 0xf9, 0x11, 0x68, 0x23, 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd1, 0xf3, 0xb0, 0x01, 0xbc, 0x30, - 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x0e, 0x28, 0x00, - 0xd1, 0x18, 0x4e, 0x18, 0x4d, 0x18, 0x4f, 0x19, 0x24, 0x00, 0x68, 0x33, 0x68, 0x9b, 0x69, 0x9a, - 0x69, 0x2b, 0x6c, 0x5b, 0x42, 0x9a, 0xd3, 0x06, 0x69, 0x6b, 0x6c, 0x5b, 0x42, 0x9a, 0xd8, 0x02, - 0xf7, 0xff, 0xff, 0xd0, 0xe0, 0x18, 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xeb, 0x42, 0xbc, - 0xd1, 0xeb, 0xe0, 0x11, 0x28, 0x01, 0xd1, 0x0f, 0x24, 0x00, 0x4d, 0x0a, 0x4f, 0x0b, 0xe0, 0x05, - 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xde, 0x42, 0xbc, 0xd0, 0x05, 0x68, 0x2b, 0x68, 0x9b, - 0x69, 0x9a, 0x6c, 0x73, 0x42, 0x9a, 0xd0, 0xf3, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, 0x00, 0x00, 0x13, 0x88, - 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x1f, 0x4b, 0x0f, 0x92, 0x00, 0x91, 0x01, 0x9a, 0x08, 0x68, 0x1c, - 0x00, 0x55, 0x1c, 0x1e, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0xbd, 0x9a, 0x01, 0x68, 0x13, 0x9a, 0x00, - 0x40, 0x13, 0x42, 0xbb, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x07, 0x68, 0x33, 0x1b, 0x1b, 0xd5, 0x00, - 0x68, 0x34, 0x42, 0xab, 0xd3, 0xee, 0x20, 0x02, 0x42, 0x40, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x10, 0x4b, 0x13, 0x30, 0x10, 0x68, 0x1b, - 0x00, 0x80, 0x68, 0x9b, 0x18, 0x1c, 0x68, 0x62, 0x23, 0x80, 0x01, 0x9b, 0x42, 0x1a, 0xd1, 0x00, - 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x2b, 0x23, 0x80, - 0x68, 0x62, 0x01, 0x9b, 0x42, 0x1a, 0xd0, 0x00, 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, - 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x1f, 0x4b, 0x05, 0x20, 0x05, 0x60, 0x63, 0xf7, 0xfe, 0xff, 0x1a, - 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x01, - 0xb5, 0xf0, 0x4b, 0x29, 0xb0, 0x85, 0x68, 0x1a, 0x1c, 0x03, 0x68, 0x92, 0x33, 0x10, 0x00, 0x9b, - 0x18, 0xd2, 0x92, 0x03, 0x1c, 0x15, 0x4b, 0x25, 0x68, 0x52, 0x35, 0x04, 0x40, 0x13, 0x2b, 0x01, - 0xd0, 0x06, 0x04, 0x91, 0xd5, 0x01, 0xf7, 0xff, 0xff, 0xbf, 0x24, 0x01, 0x42, 0x64, 0xe0, 0x36, - 0x26, 0x88, 0x27, 0x00, 0x01, 0x76, 0x21, 0x04, 0x1c, 0x13, 0x43, 0x8b, 0x43, 0x33, 0x60, 0x2b, - 0x20, 0x3c, 0xf7, 0xff, 0xf8, 0x79, 0x68, 0x2b, 0x4a, 0x19, 0x20, 0x32, 0x40, 0x13, 0x60, 0x2b, - 0xf7, 0xff, 0xf8, 0x72, 0x4b, 0x17, 0x22, 0x80, 0x93, 0x00, 0x1c, 0x28, 0x1c, 0x29, 0x00, 0x52, - 0x23, 0x00, 0xf7, 0xff, 0xff, 0x7d, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x9b, 0x03, 0x4c, 0x12, - 0x68, 0x5a, 0xe0, 0x14, 0x68, 0x2a, 0x21, 0x04, 0x42, 0x0a, 0xd1, 0x02, 0x37, 0x01, 0x2f, 0x04, - 0xd1, 0xd9, 0x07, 0x53, 0xd4, 0x0b, 0x23, 0x80, 0x01, 0x9b, 0x43, 0x13, 0x99, 0x03, 0x22, 0x2a, - 0x43, 0x93, 0x60, 0x4b, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0x4f, 0x9b, 0x03, 0x68, 0x5a, 0xb0, 0x05, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, - 0xff, 0xff, 0xfe, 0xd5, 0x00, 0x00, 0x13, 0x88, 0xff, 0xff, 0xf8, 0x30, 0xb5, 0xf0, 0xb0, 0x85, - 0x90, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x0e, 0x7e, 0x3a, 0x2a, 0x00, - 0xd1, 0x06, 0x4b, 0xc2, 0x21, 0x08, 0x60, 0x1a, 0x68, 0x38, 0xf0, 0x02, 0xfc, 0x8b, 0x60, 0x78, - 0x69, 0x39, 0x29, 0x00, 0xd0, 0x09, 0x7e, 0x7b, 0x68, 0xb8, 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, - 0xfc, 0x81, 0xe0, 0x01, 0xf0, 0x02, 0xfc, 0x76, 0x60, 0xf8, 0x7e, 0x3b, 0x2b, 0x00, 0xd1, 0x03, - 0x4b, 0xb7, 0x68, 0x1b, 0x69, 0xdb, 0xe0, 0x06, 0x7e, 0x7b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0xb5, - 0xe0, 0x00, 0x4b, 0xb5, 0x68, 0x1b, 0x93, 0x02, 0x4c, 0xb4, 0x4b, 0xb5, 0x98, 0x02, 0x99, 0x02, - 0x60, 0x18, 0x22, 0x60, 0x1c, 0x20, 0xf0, 0x02, 0xfd, 0x87, 0x21, 0x00, 0x22, 0x30, 0x98, 0x02, - 0xf0, 0x03, 0xfb, 0xe8, 0x4b, 0xaa, 0x49, 0xaf, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x68, 0x0b, - 0x22, 0x01, 0x40, 0x53, 0x60, 0x0b, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x8e, 0x4b, 0xaa, 0x64, 0xa0, - 0x60, 0x18, 0x1c, 0x06, 0x98, 0x01, 0x22, 0x80, 0x69, 0x83, 0x7e, 0x39, 0x01, 0x92, 0x43, 0x1a, - 0x23, 0x0f, 0x40, 0x0b, 0x02, 0x1b, 0x1c, 0x10, 0x69, 0xfc, 0x43, 0x18, 0x29, 0x00, 0xd1, 0x03, - 0x4b, 0xa2, 0x1c, 0x01, 0x43, 0x19, 0xe0, 0x08, 0x4b, 0xa1, 0x1c, 0x22, 0x40, 0x1a, 0x23, 0x80, - 0x04, 0x12, 0x05, 0xdb, 0x43, 0x1a, 0x1c, 0x11, 0x43, 0x01, 0x06, 0x0b, 0x0e, 0x0a, 0x24, 0xff, - 0x02, 0x24, 0x43, 0x1a, 0x1c, 0x0b, 0x40, 0x23, 0x02, 0x1b, 0x20, 0xff, 0x04, 0x00, 0x43, 0x1a, - 0x1c, 0x0b, 0x40, 0x03, 0x4d, 0x91, 0x0a, 0x1b, 0x43, 0x1a, 0x23, 0x40, 0x60, 0xab, 0x4b, 0x95, - 0x60, 0x6a, 0x68, 0x1b, 0x6c, 0x5a, 0x1c, 0x11, 0x1c, 0x13, 0x40, 0x21, 0x40, 0x03, 0x0a, 0x1b, - 0x02, 0x09, 0x43, 0x19, 0x0e, 0x13, 0x43, 0x19, 0x23, 0xe0, 0x40, 0x1a, 0x23, 0x02, 0x43, 0x1a, - 0x06, 0x12, 0x43, 0x11, 0x60, 0x29, 0x6b, 0x72, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x1c, 0x13, - 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, 0x04, 0x5b, - 0x61, 0x29, 0x61, 0x6b, 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x17, 0x9b, 0x01, 0x6a, 0x58, 0x06, 0x13, - 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x13, 0x18, 0xcb, - 0x40, 0xd8, 0x1c, 0x03, 0x49, 0x75, 0x07, 0xd8, 0xd5, 0x03, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x13, - 0xe0, 0x02, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x93, 0x61, 0x8b, 0x4b, 0x70, 0x49, 0x76, 0x69, 0x9a, - 0x6c, 0x9e, 0x40, 0x0a, 0x61, 0x9a, 0xe0, 0x04, 0x1c, 0x30, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0xca, - 0x6b, 0xb6, 0x2e, 0x00, 0xd1, 0xf8, 0x4d, 0x69, 0x98, 0x02, 0x1c, 0x29, 0x22, 0x60, 0xf0, 0x02, - 0xfd, 0x03, 0x4a, 0x6e, 0x23, 0x01, 0x92, 0x00, 0x60, 0x13, 0x4b, 0x6d, 0x48, 0x6d, 0x68, 0x19, - 0xf7, 0xfe, 0xfd, 0x88, 0x4c, 0x5e, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x9a, - 0x68, 0x23, 0x6c, 0x69, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0xff, - 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, - 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, - 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x97, 0xf7, 0xff, 0xfd, 0xeb, 0xf7, 0xfe, 0xfd, 0x2b, 0x9b, 0x00, - 0x90, 0x03, 0x60, 0x1e, 0x28, 0x00, 0xd1, 0x03, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x0f, - 0x4b, 0x47, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x54, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, - 0x68, 0x13, 0x22, 0x05, 0x40, 0x13, 0x2b, 0x05, 0xd0, 0x02, 0x4a, 0x40, 0x23, 0x01, 0x60, 0x13, - 0x98, 0x03, 0x42, 0x46, 0x41, 0x46, 0x2e, 0x00, 0xd1, 0x01, 0x30, 0x05, 0xd1, 0x4f, 0xf7, 0xff, - 0xfd, 0xe1, 0x4c, 0x3b, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf7, 0xfd, 0xff, 0x4d, 0x68, 0x23, - 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x1e, 0x4b, 0x3e, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, - 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, - 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, - 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, - 0xff, 0x4b, 0xf7, 0xff, 0xfd, 0x9d, 0x7e, 0x3a, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x9f, 0x9b, 0x01, - 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, - 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x2d, 0x68, 0x19, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x22, 0x00, - 0xe0, 0x00, 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, - 0x40, 0x91, 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0xe0, 0x7f, 0xf7, 0xff, - 0xfd, 0x91, 0x4b, 0x16, 0x6c, 0x9c, 0xe0, 0x04, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0x02, - 0x6b, 0xa4, 0x2c, 0x00, 0xd1, 0xf8, 0x22, 0x20, 0x48, 0x10, 0x99, 0x02, 0xf0, 0x02, 0xfc, 0x44, - 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x41, 0x9b, 0x01, 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, - 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x07, 0x69, 0x99, - 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x24, 0x22, 0x00, 0xe0, 0x23, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x80, 0x13, 0x72, 0xc1, 0x80, - 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0x70, 0x13, 0x70, 0x67, 0x88, 0x40, 0x40, 0x40, 0x00, - 0x00, 0x00, 0x07, 0xff, 0x13, 0x70, 0x67, 0x84, 0x01, 0x00, 0x00, 0x80, 0x13, 0x70, 0x67, 0x74, - 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x48, 0x25, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x90, - 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, 0x40, 0x91, - 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0x4c, 0x25, 0x21, 0x20, 0x68, 0x23, - 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa9, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfa, 0x7a, - 0x4b, 0x20, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, - 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, - 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, - 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa7, 0xf7, 0xff, 0xfc, 0xf9, 0x49, 0x12, - 0x20, 0x01, 0xf7, 0xff, 0xfd, 0x29, 0x69, 0x39, 0x29, 0x00, 0xd0, 0x08, 0x7e, 0x7b, 0x68, 0xf8, - 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, 0xfa, 0x8e, 0xe0, 0x01, 0xf0, 0x02, 0xfa, 0x83, 0x7e, 0x3b, - 0x2b, 0x00, 0xd1, 0x03, 0x68, 0x78, 0x21, 0x08, 0xf0, 0x02, 0xfa, 0x84, 0x2e, 0x00, 0xd0, 0x01, - 0x69, 0x7f, 0x97, 0x03, 0x98, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x84, 0x13, 0x72, 0xc1, 0x80, 0xb5, 0x30, 0xb0, 0x89, - 0x46, 0x6d, 0x76, 0x29, 0x09, 0xc9, 0x76, 0x69, 0x21, 0x80, 0x00, 0x89, 0x91, 0x07, 0x24, 0x00, - 0x46, 0x69, 0x94, 0x00, 0x92, 0x04, 0x93, 0x02, 0xf7, 0xff, 0xfd, 0xe0, 0xb0, 0x09, 0xbc, 0x30, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x04, 0x91, 0x01, 0x92, 0x00, 0x34, 0xa0, - 0x1c, 0x07, 0x21, 0xff, 0x22, 0x0d, 0x68, 0x20, 0xf0, 0x03, 0xf9, 0xf4, 0x1c, 0x3b, 0x33, 0x90, - 0x68, 0x18, 0x7b, 0x39, 0x68, 0x23, 0x22, 0x0d, 0xf7, 0xff, 0xff, 0xd8, 0x28, 0x00, 0xdb, 0x4e, - 0x28, 0x0d, 0xd0, 0x01, 0x48, 0x28, 0xe0, 0x4a, 0x68, 0x23, 0x24, 0xff, 0x68, 0x19, 0x68, 0x5e, - 0x68, 0x9d, 0x7b, 0x1b, 0x0e, 0x0a, 0x46, 0x9c, 0x06, 0x0b, 0x43, 0x1a, 0x02, 0x24, 0x1c, 0x0b, - 0x20, 0xff, 0x40, 0x23, 0x04, 0x00, 0x02, 0x1b, 0x40, 0x01, 0x43, 0x1a, 0x0a, 0x09, 0x4b, 0x1f, - 0x43, 0x0a, 0x42, 0x9a, 0xd0, 0x01, 0x48, 0x1e, 0xe0, 0x31, 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0c, - 0x06, 0x2b, 0x0e, 0x2a, 0x43, 0x1a, 0x1c, 0x2b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x2b, - 0x40, 0x03, 0x0a, 0x1b, 0x43, 0x1a, 0x9b, 0x00, 0x60, 0x1a, 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x01, - 0x46, 0x63, 0x70, 0x13, 0x06, 0x33, 0x0e, 0x32, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x33, - 0x02, 0x1b, 0x43, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x33, 0x1c, 0x38, 0x0a, 0x1b, 0x1c, 0x11, - 0x30, 0x98, 0x43, 0x19, 0x68, 0x03, 0x42, 0x99, 0xd0, 0x01, 0x48, 0x0a, 0xe0, 0x07, 0x4a, 0x0a, - 0x1c, 0x8b, 0x40, 0x13, 0x4a, 0x09, 0x40, 0x0a, 0x43, 0x13, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xd8, 0xed, 0x53, 0x42, 0x53, 0x55, - 0xff, 0xff, 0xd8, 0xec, 0xff, 0xff, 0xd8, 0xeb, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xb5, 0xf0, 0xb0, 0x85, 0x93, 0x02, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x1c, 0x05, 0x93, 0x01, - 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x91, 0x03, 0x1c, 0x17, 0x2b, 0x0f, 0xd8, 0x5e, 0x1c, 0x06, - 0x36, 0xa0, 0x68, 0x30, 0x28, 0x00, 0xd0, 0x59, 0x21, 0x00, 0x22, 0x1f, 0xf0, 0x03, 0xf9, 0x72, - 0x68, 0x32, 0x4b, 0x2d, 0x24, 0xff, 0x60, 0x13, 0x1c, 0x2b, 0x33, 0x98, 0x68, 0x1a, 0x68, 0x31, - 0x06, 0x13, 0x46, 0x8c, 0x0e, 0x11, 0x43, 0x19, 0x02, 0x24, 0x1c, 0x13, 0x20, 0xff, 0x04, 0x00, - 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x46, 0x62, 0x60, 0x51, - 0x06, 0x3b, 0x0e, 0x3a, 0x43, 0x1a, 0x1c, 0x3b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x3b, - 0x40, 0x03, 0x68, 0x31, 0x0a, 0x1b, 0x43, 0x1a, 0x60, 0x8a, 0x22, 0x0b, 0x46, 0x69, 0x5c, 0x51, - 0x68, 0x33, 0x46, 0x6a, 0x73, 0x19, 0x21, 0x0f, 0x68, 0x33, 0x5c, 0x8a, 0x73, 0x5a, 0x1c, 0x2b, - 0x33, 0x9c, 0x78, 0x1b, 0x68, 0x31, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x0c, 0xe0, 0x05, 0x9b, 0x01, - 0x2b, 0x06, 0xd8, 0x01, 0x23, 0x06, 0xe0, 0x00, 0x23, 0x10, 0x1c, 0x2c, 0x73, 0x8b, 0x34, 0xa0, - 0x68, 0x20, 0x99, 0x0a, 0x9a, 0x01, 0x30, 0x0f, 0xf0, 0x03, 0xf8, 0xe8, 0x1c, 0x2b, 0x33, 0x90, - 0x68, 0x18, 0x7b, 0x69, 0x68, 0x23, 0x22, 0x1f, 0xf7, 0xff, 0xff, 0x10, 0x28, 0x1f, 0xd1, 0x01, - 0x20, 0x00, 0xe0, 0x05, 0x28, 0x00, 0xdb, 0x03, 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, - 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x55, 0x53, 0x42, 0x43, 0xff, 0xff, 0xd8, 0xee, - 0xb5, 0xf0, 0xb0, 0x8b, 0x90, 0x01, 0x46, 0x68, 0x30, 0x42, 0x88, 0x04, 0x30, 0x04, 0x88, 0x05, - 0x48, 0x27, 0x9f, 0x12, 0x68, 0x00, 0x04, 0x24, 0x30, 0xf8, 0x68, 0x00, 0x04, 0x2d, 0x70, 0x42, - 0x02, 0x1a, 0x0a, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x70, 0xc3, 0x0a, 0x23, 0x0e, 0x24, - 0x43, 0x23, 0x0e, 0x12, 0x04, 0x1b, 0x70, 0x82, 0x0c, 0x2e, 0x0c, 0x1a, 0x0e, 0x1b, 0x71, 0x03, - 0x0e, 0x2d, 0x02, 0x33, 0x43, 0x2b, 0x04, 0x1b, 0x71, 0x42, 0x0e, 0x1a, 0x0c, 0x1b, 0x71, 0xc3, - 0xac, 0x02, 0x23, 0x00, 0x70, 0x01, 0x71, 0x82, 0x76, 0x23, 0x23, 0x40, 0x61, 0xe3, 0x4b, 0x15, - 0x09, 0xc9, 0x90, 0x02, 0x76, 0x61, 0x61, 0x26, 0x42, 0x9f, 0xd9, 0x15, 0x1c, 0x30, 0xf0, 0x02, - 0xf9, 0x09, 0x1c, 0x32, 0x1c, 0x39, 0x60, 0xa0, 0xf0, 0x03, 0xf8, 0x90, 0x1c, 0x21, 0x98, 0x01, - 0xf7, 0xff, 0xfc, 0xac, 0x68, 0xa1, 0x1c, 0x05, 0x1c, 0x32, 0x1c, 0x38, 0xf0, 0x03, 0xf8, 0x86, - 0x68, 0xa0, 0xf0, 0x02, 0xf8, 0xeb, 0xe0, 0x05, 0x60, 0xa7, 0x98, 0x01, 0x1c, 0x21, 0xf7, 0xff, - 0xfc, 0x9d, 0x1c, 0x05, 0xb0, 0x0b, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x88, 0x00, 0x00, 0xb5, 0x00, 0xb0, 0x85, 0x91, 0x00, 0x23, 0x00, - 0x21, 0x02, 0x22, 0x01, 0x93, 0x01, 0x93, 0x02, 0xf7, 0xff, 0xff, 0x9a, 0xb0, 0x05, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, 0x2a, 0x00, 0xd1, 0x02, 0x20, 0x03, 0x42, 0x40, - 0xe0, 0x08, 0x1c, 0x13, 0x22, 0x00, 0x91, 0x00, 0x92, 0x01, 0x92, 0x02, 0x21, 0x01, 0x22, 0x0b, - 0xf7, 0xff, 0xff, 0x86, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, - 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x92, 0x02, 0x1c, 0x0b, 0x22, 0x09, 0x21, 0x00, 0xf7, 0xff, - 0xff, 0x77, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0xb0, 0x84, 0x1c, 0x04, 0x20, 0x01, - 0x1c, 0x0e, 0xf0, 0x02, 0xf8, 0xaf, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x24, 0x04, 0x42, 0x64, - 0xe0, 0x12, 0x23, 0x00, 0x93, 0x00, 0x23, 0x01, 0x93, 0x01, 0x90, 0x02, 0x21, 0x80, 0x1c, 0x20, - 0x22, 0x08, 0x23, 0x00, 0xf7, 0xff, 0xff, 0x5c, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x78, 0x2b, - 0x70, 0x33, 0x1c, 0x28, 0xf0, 0x02, 0xf8, 0x8a, 0xb0, 0x04, 0x1c, 0x20, 0xbc, 0x70, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0x4b, 0x4c, 0x4a, 0x4c, 0x78, 0x19, 0xb0, 0x87, 0x1c, 0x06, - 0x68, 0x17, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x4a, 0xe0, 0x00, 0x4b, 0x4a, 0x60, 0x13, 0x4b, 0x4a, - 0x68, 0x1b, 0x68, 0x9a, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x1b, 0x32, 0x44, 0x69, 0xdb, 0x00, 0x9b, - 0x18, 0xd2, 0x68, 0x13, 0x22, 0x01, 0x42, 0x13, 0xd1, 0x06, 0x4b, 0x44, 0x24, 0x01, 0x60, 0x1a, - 0x4b, 0x3e, 0x42, 0x64, 0x60, 0x1f, 0xe0, 0x72, 0x4a, 0x3c, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x3c, - 0xe0, 0x00, 0x4b, 0x3c, 0x60, 0x13, 0x4b, 0x3e, 0x1c, 0x35, 0x78, 0x1b, 0x35, 0x90, 0x2b, 0x00, - 0xd0, 0x12, 0x88, 0xf3, 0x68, 0x28, 0x22, 0xff, 0x93, 0x00, 0x21, 0x21, 0x23, 0x00, 0x93, 0x01, - 0x93, 0x02, 0xf7, 0xff, 0xff, 0x15, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x36, 0xf7, 0xff, 0xfa, 0x12, - 0x20, 0x3c, 0xf7, 0xfe, 0xfc, 0x39, 0xe0, 0x07, 0x21, 0x00, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x64, - 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x31, 0x24, 0x00, 0x4b, 0x27, 0x4a, 0x28, 0x78, 0x1b, 0x2b, 0x00, - 0xd0, 0x01, 0x4b, 0x27, 0xe0, 0x00, 0x4b, 0x27, 0x1c, 0x35, 0x60, 0x13, 0x35, 0x90, 0x2c, 0x00, - 0xda, 0x0a, 0x20, 0x32, 0xf7, 0xfe, 0xfc, 0x20, 0x68, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4c, - 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x19, 0xe0, 0x2d, 0x7b, 0x31, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x44, - 0x1c, 0x04, 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x10, 0x48, 0x1f, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xe2, - 0x2c, 0x00, 0xdb, 0x1f, 0x7b, 0x71, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x36, 0x1c, 0x04, 0x20, 0x05, - 0xf7, 0xfe, 0xfc, 0x02, 0x48, 0x19, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xd4, 0x2c, 0x00, 0xdb, 0x11, - 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0xf9, 0x46, 0x69, 0x31, 0x17, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x54, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x12, 0xf7, 0xff, 0xf9, 0xc5, 0x2c, 0x00, 0xdb, 0x02, 0x4b, 0x07, - 0x60, 0x1f, 0xe0, 0x04, 0x4b, 0x05, 0x4a, 0x09, 0x60, 0x1f, 0x23, 0x01, 0x60, 0x13, 0xb0, 0x07, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x01, 0x0d, 0x13, 0x70, 0x61, 0x12, 0x13, 0x70, 0x61, 0x33, 0x13, 0x70, 0x61, 0x5a, - 0x13, 0x70, 0x61, 0x82, 0xb5, 0x00, 0xb0, 0x81, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4b, 0xb0, 0x01, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x1e, 0x46, 0x6b, 0x33, 0x5f, 0x92, 0x07, - 0x78, 0x1a, 0x3b, 0x10, 0x78, 0x1b, 0x06, 0x12, 0x93, 0x06, 0x46, 0x6b, 0x33, 0x53, 0x78, 0x1b, - 0x16, 0x12, 0x93, 0x05, 0x46, 0x6b, 0x92, 0x04, 0x33, 0x2f, 0x22, 0x00, 0x91, 0x08, 0x70, 0x1a, - 0x4b, 0x99, 0x92, 0x0a, 0x60, 0x1a, 0x4a, 0x99, 0x4b, 0x99, 0x24, 0x00, 0x1c, 0x05, 0x94, 0x09, - 0x92, 0x03, 0x93, 0x02, 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x00, 0xe1, 0x08, 0x2c, 0x00, 0xd0, 0x22, - 0x1c, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x1e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x05, - 0xe0, 0x00, 0x20, 0x3c, 0xf7, 0xfe, 0xfb, 0x90, 0x4b, 0x8e, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x8e, - 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x2c, 0x00, 0xda, 0x09, 0x9a, 0x09, - 0x32, 0x01, 0x92, 0x09, 0x2a, 0x02, 0xdd, 0x00, 0xe0, 0xeb, 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0x7c, - 0xe0, 0xdf, 0x23, 0x00, 0x93, 0x09, 0x9b, 0x04, 0x9a, 0x05, 0x3b, 0x01, 0x06, 0x1b, 0x16, 0x1b, - 0x93, 0x04, 0x2a, 0x00, 0xd0, 0x31, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, 0x78, 0x13, 0x2b, 0x00, - 0xd0, 0x01, 0x4b, 0x7e, 0xe0, 0x00, 0x4b, 0x7e, 0x9a, 0x03, 0x1c, 0x28, 0x60, 0x13, 0x9b, 0x12, - 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x00, 0x99, 0x08, 0x1c, 0x32, 0xf7, 0xff, 0xfd, 0xb8, - 0x4b, 0x72, 0x1c, 0x04, 0x60, 0x1f, 0x1c, 0x83, 0x2b, 0x01, 0xd8, 0x00, 0xe0, 0xbf, 0x28, 0x00, - 0xda, 0x0d, 0xe0, 0xb8, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x7b, 0x69, 0x9b, 0x07, 0x1c, 0x32, - 0xf7, 0xff, 0xfd, 0x1c, 0x1c, 0x83, 0x1c, 0x04, 0x2b, 0x01, 0xd8, 0x43, 0xe0, 0x02, 0x2e, 0x00, - 0xd1, 0xf0, 0xe0, 0x49, 0x28, 0x00, 0xda, 0x47, 0xe0, 0xa3, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, - 0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x65, 0xe0, 0x00, 0x4b, 0x65, 0x9a, 0x03, 0x1c, 0x28, - 0x60, 0x13, 0x9b, 0x12, 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x80, 0x99, 0x08, 0x1c, 0x32, - 0xf7, 0xff, 0xfd, 0x86, 0x4b, 0x59, 0x1c, 0x04, 0x60, 0x1f, 0x28, 0x00, 0xda, 0x06, 0x48, 0x5d, - 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xf7, 0x48, 0x5c, 0xf7, 0xff, 0xf9, 0x3c, 0x1c, 0xa3, 0x2b, 0x01, - 0xd8, 0x00, 0xe0, 0x84, 0x2c, 0x00, 0xda, 0x1a, 0xe0, 0x7d, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, - 0x7b, 0x29, 0x1c, 0x32, 0x9b, 0x07, 0xf7, 0xff, 0xfc, 0xe1, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x06, - 0x48, 0x52, 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xde, 0x48, 0x51, 0xf7, 0xff, 0xf9, 0x23, 0x1c, 0xa3, - 0x2b, 0x01, 0xd9, 0x07, 0x2c, 0x00, 0xdb, 0x62, 0x42, 0xb4, 0xd0, 0x05, 0xe0, 0x5f, 0x2e, 0x00, - 0xd1, 0xe3, 0xe0, 0x01, 0x2c, 0x00, 0xdb, 0x5e, 0x4b, 0x41, 0x4a, 0x40, 0x78, 0x1b, 0x68, 0x17, - 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x41, 0xe0, 0x00, 0x4b, 0x41, 0x46, 0x69, 0x60, 0x13, 0x1c, 0x28, - 0x31, 0x2f, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xce, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x28, 0x48, 0x41, - 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x40, 0xf7, 0xff, 0xf8, 0xfc, 0x1c, 0x63, 0xd1, 0x02, - 0x4b, 0x32, 0x60, 0x1f, 0xe0, 0x45, 0x1c, 0x2c, 0x34, 0x90, 0x68, 0x20, 0x7b, 0x29, 0xf7, 0xff, - 0xfe, 0x03, 0x7b, 0x2a, 0x68, 0x24, 0x06, 0x13, 0x6a, 0x60, 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, - 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x1a, 0x18, 0x8a, 0x23, 0x01, 0x40, 0x93, 0x43, 0x98, - 0x46, 0x69, 0x62, 0x60, 0x31, 0x2f, 0x1c, 0x28, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xa3, 0x1c, 0x04, - 0x4b, 0x22, 0x60, 0x1f, 0x1c, 0xa3, 0x2b, 0x01, 0xd9, 0x21, 0x9b, 0x0a, 0x2b, 0x00, 0xd0, 0x07, - 0x4b, 0x2a, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, 0x46, 0x6b, 0x22, 0x01, 0x33, 0x2f, 0x70, 0x1a, - 0x2c, 0x00, 0xdb, 0x10, 0x4b, 0x25, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, 0x46, 0x6b, 0x33, 0x2f, - 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4c, 0x22, 0xe0, 0x05, 0x24, 0x00, 0xe0, 0x0e, 0x4c, 0x21, - 0xe0, 0x01, 0x2c, 0x00, 0xda, 0x0a, 0x9a, 0x04, 0x2a, 0x00, 0xdd, 0x00, 0xe6, 0xf2, 0x2c, 0x00, - 0xda, 0x04, 0x4a, 0x0d, 0x23, 0x01, 0x60, 0x13, 0x2c, 0x00, 0xdb, 0x02, 0x4a, 0x0a, 0x23, 0x00, - 0x60, 0x13, 0x9b, 0x15, 0x2b, 0x00, 0xd0, 0x04, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x9a, 0x15, - 0x70, 0x13, 0x9b, 0x16, 0x2b, 0x00, 0xd0, 0x02, 0x9b, 0x0a, 0x9a, 0x16, 0x60, 0x13, 0xb0, 0x0d, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, - 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x0f, 0x42, 0x40, - 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x61, 0xb1, 0x13, 0x70, 0x61, 0xc4, 0x13, 0x70, 0x61, 0xce, - 0x13, 0x70, 0x61, 0xe6, 0x13, 0x70, 0x61, 0xfa, 0x13, 0x70, 0x62, 0x09, 0x13, 0x70, 0x67, 0xa4, - 0xff, 0xff, 0xd8, 0xea, 0xff, 0xff, 0xd8, 0xe9, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x21, 0x27, - 0x1c, 0x1d, 0x1c, 0x06, 0x23, 0x00, 0x44, 0x69, 0x46, 0x68, 0x30, 0x1d, 0x70, 0x0b, 0x23, 0x2a, - 0x70, 0x03, 0x21, 0x08, 0x01, 0x7b, 0x43, 0x0b, 0x70, 0x43, 0x0e, 0x13, 0x70, 0x83, 0x0c, 0x13, - 0x70, 0xc3, 0x0a, 0x13, 0x71, 0x03, 0x21, 0x00, 0x0a, 0x2b, 0x71, 0x42, 0x71, 0x81, 0x71, 0xc3, - 0x72, 0x05, 0x72, 0x41, 0x7b, 0xb3, 0x42, 0xbb, 0xd9, 0x24, 0x1d, 0x3b, 0x00, 0x9a, 0x59, 0x93, - 0x2b, 0x00, 0xd0, 0x1f, 0x4c, 0x12, 0x21, 0x01, 0x60, 0x21, 0x59, 0x93, 0x22, 0x0a, 0x92, 0x01, - 0x22, 0x27, 0x44, 0x6a, 0x91, 0x02, 0x92, 0x03, 0x21, 0x00, 0x22, 0x06, 0x90, 0x00, 0x91, 0x04, - 0x92, 0x05, 0x43, 0x6b, 0x9a, 0x10, 0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x5b, 0x22, 0x00, - 0x60, 0x22, 0x28, 0x00, 0xdd, 0x08, 0x21, 0x27, 0x44, 0x69, 0x78, 0x0b, 0x2b, 0x00, 0xd0, 0x03, - 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x0b, - 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, 0x58, 0x19, 0x20, 0x80, - 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, 0xfc, 0x9d, 0x1c, 0x07, - 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, 0xe0, 0x1c, 0x1c, 0x25, - 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, 0x91, 0x00, 0x98, 0x05, - 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x87, 0x28, 0x00, 0xdb, 0x0e, 0x9a, 0x03, - 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, 0x0c, 0x1c, 0x58, 0x8b, - 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, 0xb0, 0x07, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x05, 0x1c, 0x18, 0x23, 0x27, 0x27, 0x00, - 0x1c, 0x0e, 0x44, 0x6b, 0x46, 0x69, 0x31, 0x1d, 0x70, 0x1f, 0x23, 0x28, 0x70, 0x0b, 0x01, 0x73, - 0x70, 0x4b, 0x0e, 0x13, 0x70, 0x8b, 0x0c, 0x13, 0x70, 0xcb, 0x0a, 0x13, 0x71, 0x0b, 0x0a, 0x03, - 0x71, 0x4a, 0x71, 0x8f, 0x71, 0xcb, 0x72, 0x08, 0x72, 0x4f, 0x7b, 0xab, 0x42, 0xb3, 0xd9, 0x22, - 0x1d, 0x33, 0x00, 0x9a, 0x59, 0x53, 0x2b, 0x00, 0xd0, 0x1d, 0x4c, 0x12, 0x23, 0x01, 0x60, 0x23, - 0x59, 0x53, 0x22, 0x0a, 0x92, 0x01, 0x22, 0x27, 0x44, 0x6a, 0x92, 0x03, 0x22, 0x06, 0x43, 0x43, - 0x91, 0x00, 0x92, 0x05, 0x1c, 0x28, 0x1c, 0x31, 0x9a, 0x10, 0x97, 0x02, 0x97, 0x04, 0xf7, 0xff, - 0xfd, 0xd1, 0x60, 0x27, 0x28, 0x00, 0xdd, 0x08, 0x22, 0x27, 0x44, 0x6a, 0x78, 0x13, 0x2b, 0x00, - 0xd0, 0x03, 0x48, 0x05, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, - 0x1c, 0x1f, 0x1c, 0x0b, 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, - 0x58, 0x19, 0x20, 0x80, 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, - 0xfc, 0x13, 0x1c, 0x07, 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, - 0xe0, 0x1c, 0x1c, 0x25, 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, - 0x91, 0x00, 0x98, 0x05, 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x8b, 0x28, 0x00, - 0xdb, 0x0e, 0x9a, 0x03, 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, - 0x0c, 0x1c, 0x58, 0x8b, 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, - 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0x1c, 0x1d, 0x1c, 0x03, 0x33, 0xa0, - 0x1c, 0x16, 0x68, 0x1b, 0x22, 0x80, 0x01, 0x12, 0x18, 0x9c, 0xb0, 0x88, 0x2c, 0x00, 0xd1, 0x02, - 0x20, 0x04, 0x42, 0x40, 0xe0, 0x27, 0x46, 0x6a, 0x32, 0x1e, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x25, - 0x70, 0x13, 0x23, 0x02, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, - 0x92, 0x00, 0x93, 0x05, 0x1c, 0x22, 0x23, 0x08, 0xf7, 0xff, 0xfd, 0x5c, 0x28, 0x00, 0xdb, 0x12, - 0xa8, 0x06, 0x1c, 0x21, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb9, 0x2d, 0x00, 0xd0, 0x01, 0x9b, 0x06, - 0x60, 0x2b, 0x1d, 0x21, 0xa8, 0x06, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb0, 0x2e, 0x00, 0xd0, 0x01, - 0x9b, 0x06, 0x60, 0x33, 0x20, 0x00, 0xb0, 0x08, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x46, 0x69, 0x31, 0x22, 0x23, 0x12, 0x90, 0x07, 0x70, 0x0b, - 0x01, 0x7b, 0x22, 0x00, 0x70, 0x4b, 0x23, 0x24, 0x70, 0x8a, 0x70, 0xca, 0x71, 0x4a, 0x71, 0x0b, - 0x9b, 0x07, 0x22, 0x80, 0x33, 0xa0, 0x68, 0x1b, 0x01, 0x12, 0x18, 0x9c, 0x2c, 0x00, 0xd1, 0x02, - 0x21, 0x04, 0x42, 0x49, 0xe0, 0x2c, 0x25, 0x00, 0x21, 0x00, 0x22, 0x24, 0x1c, 0x20, 0xf0, 0x02, - 0xfc, 0xc9, 0x23, 0x22, 0x44, 0x6b, 0x93, 0x00, 0x22, 0x06, 0x23, 0x0a, 0x26, 0x00, 0x92, 0x01, - 0x93, 0x05, 0x1c, 0x39, 0x98, 0x07, 0x1c, 0x22, 0x23, 0x24, 0x96, 0x02, 0x96, 0x03, 0x96, 0x04, - 0xf7, 0xff, 0xfd, 0x10, 0x1c, 0x01, 0x28, 0x00, 0xdb, 0x08, 0x78, 0x22, 0x23, 0x1f, 0x1c, 0x10, - 0x40, 0x18, 0x28, 0x05, 0xd0, 0x06, 0x28, 0x07, 0xd1, 0x08, 0xe0, 0x03, 0x35, 0x01, 0x2d, 0x02, - 0xd0, 0x06, 0xe7, 0xd9, 0x4a, 0x05, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x01, 0x4b, 0x03, 0x60, 0x1e, - 0xb0, 0x0b, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x94, - 0xb5, 0xf0, 0xb0, 0x8f, 0x1c, 0x03, 0x90, 0x07, 0x91, 0x06, 0x33, 0xa0, 0x68, 0x1b, 0x21, 0x80, - 0x46, 0x6f, 0x46, 0x6c, 0x01, 0x09, 0x37, 0x37, 0x25, 0x00, 0x34, 0x27, 0x18, 0x5e, 0x70, 0x3d, - 0x1c, 0x20, 0x21, 0x00, 0x22, 0x10, 0xf0, 0x02, 0xfc, 0x85, 0x2e, 0x00, 0xd1, 0x02, 0x25, 0x04, - 0x42, 0x6d, 0xe0, 0x5a, 0x23, 0x06, 0x70, 0x25, 0x93, 0x01, 0x23, 0x01, 0x93, 0x02, 0x23, 0x0a, - 0x93, 0x05, 0x99, 0x06, 0x22, 0x00, 0x98, 0x07, 0x23, 0x00, 0x95, 0x04, 0x94, 0x00, 0x97, 0x03, - 0xf7, 0xff, 0xfc, 0xc8, 0x1c, 0x05, 0x1c, 0x29, 0x48, 0x26, 0xf7, 0xfe, 0xfe, 0x5b, 0x1c, 0x6a, - 0xd0, 0x43, 0x78, 0x3b, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xda, 0x3e, 0x46, 0x6a, 0x32, 0x27, - 0x23, 0x03, 0x70, 0x13, 0x99, 0x06, 0x1c, 0x30, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x12, 0x71, 0x13, - 0x23, 0x00, 0x71, 0x53, 0x21, 0x00, 0x22, 0x12, 0xf0, 0x02, 0xfc, 0x54, 0x4a, 0x1a, 0x35, 0x02, - 0xd1, 0x01, 0x4b, 0x1a, 0xe0, 0x00, 0x4b, 0x1a, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x27, 0x93, 0x00, - 0x23, 0x06, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, 0x93, 0x05, - 0x99, 0x06, 0x98, 0x07, 0x1c, 0x32, 0x23, 0x12, 0xf7, 0xff, 0xfc, 0x94, 0x1c, 0x05, 0x1c, 0x29, - 0x48, 0x10, 0xf7, 0xfe, 0xfe, 0x27, 0x2d, 0x00, 0xdb, 0x0f, 0x78, 0xb1, 0x23, 0x0f, 0x46, 0x6c, - 0x40, 0x19, 0x34, 0x37, 0x48, 0x0c, 0x70, 0x21, 0xf7, 0xfe, 0xfe, 0x1c, 0x78, 0x23, 0x3b, 0x02, - 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x02, 0xd8, 0x00, 0x4d, 0x08, 0xb0, 0x0f, 0x1c, 0x28, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x62, 0x14, 0x13, 0x70, 0x60, 0x38, 0x00, 0x26, 0x25, 0xa0, - 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x62, 0x35, 0x13, 0x70, 0x62, 0x54, 0xff, 0xff, 0xd8, 0xef, - 0xb5, 0xf0, 0x7b, 0x83, 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x06, 0x42, 0xbb, 0xd8, 0x02, 0x24, 0x03, - 0x42, 0x64, 0xe0, 0x3a, 0x4d, 0x1f, 0x4b, 0x20, 0x48, 0x20, 0x60, 0x2b, 0x21, 0x00, 0xf7, 0xfe, - 0xfd, 0xf1, 0x4b, 0x1f, 0x1c, 0x30, 0x60, 0x2b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x04, - 0x28, 0x00, 0xdb, 0x27, 0x4b, 0x18, 0x1c, 0x39, 0x60, 0x2b, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x08, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x17, 0xf7, 0xfe, 0xfd, 0xdd, 0x2c, 0x00, 0xdb, 0x1a, 0x1c, 0x33, - 0x33, 0xa0, 0x68, 0x1a, 0x23, 0x80, 0x01, 0x1b, 0x5c, 0xd1, 0x23, 0x1f, 0x40, 0x19, 0x48, 0x12, - 0xf7, 0xfe, 0xfd, 0xd0, 0x1c, 0x3b, 0x1d, 0x3a, 0x33, 0x14, 0x00, 0x92, 0x00, 0x9b, 0x1c, 0x39, - 0x18, 0xb2, 0x18, 0xf3, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xaf, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x0b, - 0xf7, 0xfe, 0xfd, 0xc0, 0x4a, 0x03, 0x4b, 0x04, 0x60, 0x13, 0xb0, 0x01, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x62, 0x76, - 0x01, 0x31, 0x2d, 0x00, 0x13, 0x70, 0x62, 0x91, 0x13, 0x70, 0x62, 0xa5, 0x13, 0x70, 0x62, 0xba, - 0xb5, 0x10, 0xb0, 0x84, 0x1c, 0x14, 0x46, 0x6a, 0x32, 0x1b, 0x78, 0x12, 0x02, 0x24, 0x43, 0x1c, - 0x23, 0x00, 0x93, 0x00, 0x92, 0x01, 0x91, 0x02, 0x22, 0x06, 0x21, 0x80, 0x1c, 0x23, 0xf7, 0xff, - 0xfa, 0x97, 0xb0, 0x04, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x8f, - 0x90, 0x03, 0x20, 0x16, 0x1c, 0x0f, 0xf0, 0x01, 0xfb, 0xcd, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, - 0xe1, 0x7e, 0x23, 0x12, 0x93, 0x00, 0x98, 0x03, 0x99, 0x05, 0x22, 0x01, 0x23, 0x00, 0xf7, 0xff, - 0xff, 0xd7, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe1, 0x65, 0x99, 0x05, 0x22, 0x12, 0x1c, 0x38, - 0xf0, 0x02, 0xfb, 0x44, 0x98, 0x05, 0xf0, 0x01, 0xfb, 0xa9, 0x78, 0xba, 0x78, 0xfb, 0x02, 0x12, - 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, - 0x70, 0xba, 0x7a, 0x3a, 0x70, 0xfb, 0x7a, 0x7b, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, - 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x72, 0x3a, 0x7a, 0xba, 0x72, 0x7b, - 0x7a, 0xfb, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, - 0x0c, 0x13, 0x0e, 0x12, 0x72, 0xba, 0x7b, 0x3a, 0x72, 0xfb, 0x7b, 0x7b, 0x02, 0x12, 0x43, 0x13, - 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x73, 0x7b, 0x7c, 0x7b, - 0x0e, 0x12, 0x00, 0x58, 0x18, 0xc0, 0x00, 0x80, 0x18, 0xc0, 0x73, 0x3a, 0xf0, 0x01, 0xfb, 0x7a, - 0x0e, 0x03, 0x74, 0xbb, 0x0c, 0x03, 0x74, 0xfb, 0x0a, 0x03, 0x75, 0x3b, 0x75, 0x78, 0x28, 0x00, - 0xd1, 0x00, 0xe1, 0x28, 0x7c, 0x7b, 0x21, 0x00, 0x00, 0x5a, 0x18, 0xd2, 0x00, 0x92, 0x18, 0xd2, - 0xf0, 0x02, 0xfb, 0x38, 0x22, 0x00, 0x92, 0x08, 0x92, 0x0d, 0xe1, 0x01, 0x20, 0x09, 0xf0, 0x01, - 0xfb, 0x61, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x12, 0x9a, 0x08, 0x1c, 0x21, 0x06, 0x13, - 0x0e, 0x1b, 0x93, 0x04, 0x23, 0x09, 0x93, 0x00, 0x22, 0x02, 0x9b, 0x04, 0x98, 0x03, 0xf7, 0xff, - 0xff, 0x67, 0x7c, 0xba, 0x7c, 0xfb, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7d, 0x3a, 0x1c, 0x21, - 0x02, 0x12, 0x43, 0x1a, 0x7d, 0x7b, 0x43, 0x13, 0x9a, 0x0d, 0x18, 0x9e, 0x1c, 0x30, 0x22, 0x09, - 0xf0, 0x02, 0xfa, 0xcc, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x31, 0x78, 0xb2, 0x78, 0xf3, 0x02, 0x12, - 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x15, 0x0e, 0x12, - 0x70, 0xb2, 0x70, 0xf5, 0x1c, 0x28, 0xf0, 0x01, 0xfb, 0x2d, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, - 0xe0, 0xde, 0x78, 0xf3, 0x98, 0x03, 0x93, 0x00, 0x99, 0x05, 0x22, 0x02, 0x9b, 0x04, 0xf7, 0xff, - 0xff, 0x37, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xc5, 0x79, 0x33, 0x78, 0x34, 0x00, 0xd8, - 0x18, 0xc0, 0x00, 0x40, 0xf0, 0x01, 0xfb, 0x16, 0x0e, 0x03, 0x72, 0x73, 0x0c, 0x03, 0x72, 0xb3, - 0x0a, 0x03, 0x72, 0xf3, 0x73, 0x30, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xc4, 0x9b, 0x05, 0x1b, 0x2d, - 0x19, 0x1b, 0x93, 0x06, 0x95, 0x07, 0x79, 0x33, 0x21, 0x00, 0x00, 0xda, 0x18, 0xd2, 0x00, 0x52, - 0xf0, 0x02, 0xfa, 0xd0, 0x22, 0x00, 0x92, 0x09, 0xe0, 0x89, 0x7a, 0x72, 0x7a, 0xb3, 0x06, 0x12, - 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xf2, 0x99, 0x06, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x33, 0x43, 0x13, - 0x9a, 0x0c, 0x18, 0x9d, 0x1c, 0x28, 0x22, 0x09, 0xf0, 0x02, 0xfa, 0x78, 0x79, 0x2b, 0x78, 0x2c, - 0x00, 0xd8, 0x1a, 0xc0, 0xf0, 0x01, 0xfa, 0xe6, 0x0e, 0x03, 0x73, 0xab, 0x0c, 0x03, 0x73, 0xeb, - 0x0a, 0x03, 0x74, 0x2b, 0x74, 0x68, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x94, 0x9b, 0x06, 0x9a, 0x07, - 0x19, 0x1b, 0x1b, 0x12, 0x92, 0x07, 0x93, 0x06, 0x79, 0x2b, 0x21, 0x00, 0x00, 0xda, 0x1a, 0xd2, - 0xf0, 0x02, 0xfa, 0xa0, 0x9a, 0x07, 0x98, 0x06, 0xe0, 0x08, 0x78, 0x43, 0x3b, 0x04, 0x06, 0x1b, - 0x0e, 0x1b, 0x2b, 0x01, 0xd9, 0x04, 0x78, 0x03, 0x1a, 0xd2, 0x18, 0xc0, 0x2a, 0x00, 0xd1, 0xf4, - 0x9b, 0x06, 0x1a, 0xc4, 0x73, 0x6c, 0x2c, 0x00, 0xd0, 0x15, 0x1c, 0x20, 0xf0, 0x01, 0xfa, 0xba, - 0x0e, 0x03, 0x72, 0x6b, 0x0c, 0x03, 0x72, 0xab, 0x0a, 0x03, 0x72, 0xeb, 0x73, 0x28, 0x28, 0x00, - 0xd0, 0x69, 0x1c, 0x22, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x39, 0x9a, 0x06, 0x9b, 0x07, 0x19, 0x12, - 0x1b, 0x1b, 0x92, 0x06, 0x93, 0x07, 0x22, 0x00, 0x92, 0x0a, 0xe0, 0x26, 0x7b, 0xab, 0x7b, 0xea, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x2b, 0x7c, 0x6c, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x1c, - 0x9b, 0x0b, 0x22, 0x07, 0x18, 0xe4, 0x1c, 0x20, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x1f, 0x78, 0x23, - 0x9a, 0x06, 0x18, 0xd2, 0x92, 0x06, 0x79, 0x22, 0x79, 0x63, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, - 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x71, 0x22, 0x71, 0x63, - 0x9b, 0x0a, 0x9a, 0x0b, 0x33, 0x01, 0x93, 0x0a, 0x32, 0x07, 0x92, 0x0b, 0x79, 0x2b, 0x9a, 0x0a, - 0x42, 0x9a, 0xd3, 0xd3, 0x9b, 0x09, 0x9a, 0x0c, 0x33, 0x01, 0x93, 0x09, 0x32, 0x12, 0x92, 0x0c, - 0x79, 0x33, 0x9a, 0x09, 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x6f, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x5e, - 0x9b, 0x08, 0x9a, 0x0d, 0x33, 0x01, 0x93, 0x08, 0x32, 0x0d, 0x23, 0x00, 0x92, 0x0d, 0x93, 0x05, - 0x7c, 0x7b, 0x9a, 0x08, 0x42, 0x9a, 0xd2, 0x00, 0xe6, 0xf8, 0x9b, 0x05, 0x2b, 0x00, 0xd1, 0x01, - 0x24, 0x00, 0xe0, 0x08, 0x24, 0x00, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x48, 0x2c, 0x00, 0xd0, 0x02, - 0x1c, 0x38, 0xf7, 0xfe, 0xfb, 0x95, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x24, 0x04, 0x42, 0x64, 0xe7, 0xf4, 0x24, 0x04, 0x42, 0x64, 0xe7, 0xec, 0xb5, 0xf0, 0xb0, 0x8f, - 0x46, 0x6b, 0x1c, 0x06, 0x4a, 0xc7, 0x20, 0x00, 0x33, 0x37, 0x70, 0x18, 0x23, 0x10, 0x70, 0x13, - 0x4b, 0xc5, 0x1c, 0x32, 0x32, 0x98, 0x60, 0x13, 0x46, 0x6d, 0x1c, 0x33, 0x35, 0x21, 0x33, 0x90, - 0x60, 0x19, 0x74, 0xa8, 0x74, 0xe8, 0x75, 0x28, 0x75, 0x68, 0x1c, 0x08, 0x1c, 0x29, 0xf7, 0xff, - 0xfe, 0x55, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0xbd, 0xf7, 0xfe, 0xfb, 0xe4, 0x48, 0xbc, 0xf7, 0xfe, - 0xfc, 0x29, 0x2c, 0x00, 0xda, 0x00, 0xe1, 0xf0, 0x4b, 0xba, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x32, - 0x4c, 0xb9, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, - 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, - 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, - 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, - 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, - 0xd0, 0x09, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xfb, 0x33, 0x24, 0x01, 0x48, 0xa3, 0xf7, 0xfe, - 0xfb, 0xa9, 0x42, 0x64, 0xe1, 0xc8, 0x46, 0x68, 0x30, 0x21, 0x79, 0x03, 0x49, 0x9e, 0x71, 0x8b, - 0x79, 0x43, 0x71, 0xcb, 0x7a, 0x02, 0x7a, 0x43, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0c, 0x1a, - 0x0e, 0x1b, 0x72, 0x0b, 0x72, 0x4a, 0x7a, 0x82, 0x7a, 0xc3, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, - 0x0e, 0x1a, 0x0c, 0x1b, 0x72, 0x8a, 0x72, 0xcb, 0x7b, 0x83, 0x4a, 0x95, 0x73, 0x0b, 0x7b, 0xc3, - 0x73, 0x4b, 0x7c, 0x03, 0x73, 0x8b, 0x23, 0x80, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x91, 0x21, 0x00, - 0x91, 0x03, 0x91, 0x07, 0x92, 0x01, 0xe0, 0xfc, 0x23, 0x33, 0x44, 0x6b, 0xa9, 0x0d, 0x78, 0x1a, - 0x78, 0x0b, 0x21, 0x35, 0x06, 0x12, 0x44, 0x69, 0x04, 0x1b, 0x43, 0x13, 0x78, 0x0a, 0x21, 0x36, - 0x44, 0x69, 0x02, 0x12, 0x43, 0x1a, 0x78, 0x0b, 0x48, 0x87, 0x43, 0x13, 0x9a, 0x07, 0x99, 0x03, - 0x18, 0x9b, 0x93, 0x05, 0x7a, 0x1a, 0x00, 0x52, 0xf7, 0xfe, 0xfb, 0x64, 0x49, 0x83, 0x23, 0x00, - 0x93, 0x04, 0x93, 0x06, 0x91, 0x02, 0xe0, 0xd0, 0x9b, 0x05, 0x99, 0x05, 0x7a, 0x5a, 0x7a, 0x9b, - 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x0b, 0x43, 0x13, - 0x9a, 0x06, 0x18, 0x9c, 0x79, 0x63, 0x2b, 0x08, 0xd1, 0x7f, 0x79, 0xa3, 0x2b, 0x06, 0xd0, 0x09, - 0x2b, 0x01, 0xd0, 0x07, 0x2b, 0x02, 0xd0, 0x05, 0x2b, 0x03, 0xd0, 0x03, 0x2b, 0x04, 0xd0, 0x01, - 0x2b, 0x05, 0xd1, 0x72, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x6f, 0x79, 0x23, 0x2b, 0x01, 0xd9, 0x6c, - 0x1c, 0x32, 0x23, 0x01, 0x32, 0x9c, 0x70, 0x13, 0x48, 0x6d, 0x79, 0xa1, 0x22, 0x01, 0xf7, 0xfe, - 0xfb, 0x31, 0x23, 0x00, 0x73, 0x73, 0x73, 0x33, 0x27, 0x00, 0x25, 0x00, 0xe0, 0x2c, 0x7b, 0xa2, - 0x7b, 0xe3, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7c, 0x22, 0x02, 0x12, 0x43, 0x1a, 0x7c, 0x63, - 0x43, 0x13, 0x19, 0x59, 0x78, 0xcb, 0x2b, 0x02, 0xd1, 0x1c, 0x78, 0x8a, 0x06, 0x13, 0x2b, 0x00, - 0xda, 0x0b, 0x7b, 0x33, 0x2b, 0x00, 0xd1, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x73, 0x32, 0x79, 0x0b, - 0x79, 0x49, 0x02, 0x1b, 0x43, 0x19, 0x98, 0x02, 0xe0, 0x0a, 0x7b, 0x73, 0x2b, 0x00, 0xd1, 0x09, - 0x2a, 0x00, 0xd0, 0x07, 0x73, 0x72, 0x79, 0x0b, 0x79, 0x49, 0x02, 0x1b, 0x98, 0x01, 0x43, 0x19, - 0xf7, 0xfe, 0xfb, 0x00, 0x37, 0x01, 0x35, 0x07, 0x79, 0x23, 0x42, 0x9f, 0xd3, 0xcf, 0x7b, 0x31, - 0x29, 0x00, 0xd0, 0x64, 0x7b, 0x72, 0x2a, 0x00, 0xd0, 0x61, 0x48, 0x4e, 0xf7, 0xfe, 0xfa, 0xf2, - 0x4a, 0x45, 0x7b, 0x33, 0x99, 0x05, 0x74, 0x13, 0x7b, 0x73, 0x46, 0x68, 0x74, 0x53, 0x79, 0x4b, - 0x30, 0x21, 0x70, 0x33, 0x78, 0xa3, 0x46, 0x6d, 0x60, 0x73, 0x73, 0xd3, 0x78, 0xe3, 0x35, 0x37, - 0x60, 0xb3, 0xf7, 0xfe, 0xfa, 0x65, 0x4b, 0x44, 0x4c, 0x3d, 0x48, 0x44, 0x60, 0x23, 0x78, 0x31, - 0x68, 0xb2, 0xf7, 0xfe, 0xfa, 0xd7, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x18, 0x1c, 0x29, 0xf7, 0xff, - 0xf8, 0x5b, 0x28, 0x00, 0xdb, 0x00, 0xe0, 0x81, 0xe0, 0xde, 0x7b, 0xa3, 0x7b, 0xe2, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, 0x1c, 0x10, 0x43, 0x18, - 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xf3, 0x23, 0x00, 0x73, 0xa3, 0x73, 0xe3, 0x74, 0x23, 0x74, 0x63, - 0x7a, 0xa2, 0x7a, 0x63, 0x04, 0x12, 0x06, 0x1b, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, - 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xe0, 0x23, 0x00, 0x72, 0x63, - 0x72, 0xa3, 0x72, 0xe3, 0x73, 0x23, 0x79, 0x63, 0x2b, 0x09, 0xd1, 0x03, 0x4a, 0x20, 0x4b, 0x28, - 0x60, 0x13, 0xe0, 0x28, 0x2b, 0x08, 0xd1, 0x0a, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x07, 0x79, 0x23, - 0x2b, 0x01, 0xd9, 0x04, 0x79, 0xa2, 0x4b, 0x23, 0x49, 0x19, 0x1a, 0x9b, 0x60, 0x0b, 0x9a, 0x04, - 0x9b, 0x06, 0x32, 0x01, 0x33, 0x12, 0x92, 0x04, 0x93, 0x06, 0x99, 0x05, 0x9a, 0x04, 0x79, 0x0b, - 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x28, 0x9b, 0x03, 0x99, 0x07, 0x33, 0x01, 0x31, 0x0d, 0x93, 0x03, - 0x91, 0x07, 0x22, 0x32, 0x44, 0x6a, 0x78, 0x13, 0x99, 0x03, 0x42, 0x99, 0xd2, 0x00, 0xe6, 0xfb, - 0x48, 0x15, 0xf7, 0xfe, 0xfa, 0x77, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xf9, 0xf9, 0x4c, 0x11, - 0xe0, 0x83, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x3c, 0x2c, 0x0d, 0xe0, 0x01, 0x13, 0x70, 0x62, 0xd3, - 0x13, 0x70, 0x62, 0xfd, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, - 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x63, 0xa8, 0x13, 0x70, 0x63, 0x3c, 0x13, 0x70, 0x63, 0x9a, - 0x13, 0x70, 0x63, 0x63, 0x13, 0x70, 0x63, 0xb7, 0xff, 0xff, 0xfb, 0x4f, 0x13, 0x70, 0x63, 0xfc, - 0xff, 0xff, 0xb1, 0xe0, 0xff, 0xff, 0xd8, 0xf0, 0x13, 0x70, 0x63, 0xcb, 0x4b, 0x39, 0x48, 0x3a, - 0x60, 0x23, 0xf7, 0xfe, 0xfa, 0x8f, 0x78, 0x29, 0x78, 0x33, 0x42, 0x8b, 0xd0, 0x02, 0x48, 0x37, - 0xf7, 0xfe, 0xfa, 0x40, 0x4b, 0x36, 0x4a, 0x37, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x37, 0x78, 0x31, - 0x78, 0x1b, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x34, 0x78, 0x1b, 0x07, 0x9a, 0xd5, 0x06, 0x1c, 0x33, - 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xff, 0xaa, 0x28, 0x00, 0xdb, 0x3d, 0x4a, 0x2f, 0x4b, 0x30, - 0x60, 0x13, 0x68, 0xb2, 0x2a, 0x00, 0xd0, 0x09, 0x1c, 0x33, 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, - 0x79, 0xf1, 0x0e, 0x12, 0xf7, 0xfe, 0xff, 0x86, 0x28, 0x00, 0xdb, 0x2d, 0x4a, 0x25, 0x4b, 0x29, - 0x48, 0x29, 0x60, 0x13, 0x4a, 0x25, 0x4b, 0x29, 0x60, 0x13, 0xf7, 0xfe, 0xfa, 0x5b, 0x1c, 0x30, - 0xf7, 0xff, 0xf8, 0x70, 0x1c, 0x04, 0x48, 0x26, 0xf7, 0xfe, 0xfa, 0x54, 0x2c, 0x00, 0xdb, 0x1c, - 0x1c, 0x34, 0x23, 0x08, 0x34, 0xa0, 0x73, 0xb3, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x07, 0x20, 0x81, - 0x01, 0x40, 0xf0, 0x01, 0xf8, 0x3f, 0x23, 0x1f, 0x30, 0x1f, 0x43, 0x98, 0x60, 0x20, 0x1c, 0x33, - 0x33, 0xa0, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x24, 0x00, 0xe0, 0x06, 0x4a, 0x13, 0x4b, 0x19, - 0x24, 0x04, 0x60, 0x13, 0x42, 0x64, 0xe0, 0x00, 0x4c, 0x17, 0x4a, 0x0e, 0x4b, 0x11, 0x60, 0x13, - 0x2c, 0x00, 0xda, 0x05, 0x4b, 0x0d, 0x48, 0x15, 0x68, 0x19, 0xf7, 0xfe, 0xf9, 0xe3, 0xe0, 0x03, - 0x48, 0x13, 0xf7, 0xfe, 0xf9, 0xdf, 0x24, 0x00, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xfb, 0x4e, 0x13, 0x70, 0x64, 0x2a, 0x13, 0x70, 0x64, 0x45, - 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x01, 0x0e, 0x13, 0x70, 0x67, 0xa8, - 0xff, 0xff, 0xfb, 0x4d, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0x6f, 0xff, 0xff, 0xfb, 0x4c, - 0x13, 0x70, 0x64, 0x87, 0xff, 0xff, 0xfb, 0x4b, 0xff, 0xff, 0xd8, 0xe7, 0x13, 0x70, 0x64, 0x9e, - 0x13, 0x70, 0x64, 0xc0, 0xb5, 0xf0, 0x4b, 0x78, 0xb0, 0x8b, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x4f, - 0x46, 0x6b, 0x22, 0x00, 0x33, 0x27, 0x70, 0x1a, 0xf0, 0x01, 0xf9, 0x24, 0x4a, 0x73, 0x23, 0x10, - 0x70, 0x13, 0x4b, 0x73, 0x4a, 0x73, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x72, 0xe0, 0x00, - 0x4b, 0x72, 0x4e, 0x73, 0x46, 0x6d, 0x60, 0x13, 0x35, 0x11, 0x23, 0x00, 0x1c, 0x37, 0x74, 0xab, - 0x74, 0xeb, 0x75, 0x2b, 0x75, 0x6b, 0x37, 0x90, 0x68, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xfe, - 0x4c, 0x6c, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, - 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, - 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, - 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, - 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, - 0xd0, 0x08, 0x46, 0x68, 0x30, 0x11, 0xf7, 0xfe, 0xf8, 0xeb, 0x48, 0x57, 0xf7, 0xfe, 0xf9, 0x62, - 0x4c, 0x56, 0xe0, 0x93, 0x46, 0x6c, 0x1c, 0x28, 0x34, 0x27, 0xf7, 0xfe, 0xf8, 0xe1, 0x68, 0x38, - 0x1c, 0x21, 0xf7, 0xfe, 0xfe, 0xe1, 0x28, 0x00, 0xda, 0x01, 0x4c, 0x51, 0xe0, 0x86, 0x4b, 0x49, - 0x4a, 0x50, 0x60, 0x1a, 0x78, 0x31, 0x78, 0x23, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x4e, 0x78, 0x1b, - 0x07, 0x9a, 0xd5, 0x08, 0x4b, 0x46, 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xfe, 0xbf, 0x28, 0x00, - 0xda, 0x01, 0x4c, 0x4a, 0xe0, 0x72, 0x49, 0x42, 0x68, 0x8a, 0x2a, 0x00, 0xd0, 0x0b, 0x1c, 0x0b, - 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, 0x79, 0xc9, 0x0e, 0x12, 0xf7, 0xfe, 0xfe, 0x9b, 0x28, 0x00, - 0xda, 0x01, 0x4c, 0x43, 0xe0, 0x62, 0x4b, 0x36, 0x4a, 0x36, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, - 0x4b, 0x35, 0xe0, 0x00, 0x4b, 0x35, 0x60, 0x13, 0x48, 0x35, 0x21, 0x00, 0xf7, 0xfe, 0xfe, 0xd2, - 0x28, 0x00, 0xda, 0x01, 0x4c, 0x3b, 0xe0, 0x51, 0x4b, 0x32, 0x79, 0x5b, 0x2b, 0x00, 0xd1, 0x03, - 0x4b, 0x35, 0x78, 0x1b, 0x07, 0xda, 0xd5, 0x22, 0x4d, 0x2d, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x29, - 0x4b, 0x30, 0x26, 0x01, 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, - 0x93, 0x00, 0x1c, 0x2b, 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, - 0xfd, 0xff, 0x4b, 0x21, 0x60, 0x23, 0x28, 0x00, 0xda, 0x06, 0x73, 0xae, 0x1c, 0x28, 0x21, 0x00, - 0xf7, 0xfe, 0xfe, 0xa8, 0x4c, 0x28, 0xe0, 0x29, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, 0x4b, 0x27, - 0x4d, 0x18, 0x4f, 0x1b, 0x4e, 0x1b, 0x60, 0x2b, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x60, - 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x22, 0xf7, 0xfe, 0xf8, 0xe5, 0x4b, 0x13, 0x60, 0x2b, 0x2c, 0x00, - 0xda, 0x01, 0x4c, 0x20, 0xe0, 0x12, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x01, 0x1c, 0x04, - 0x1c, 0x21, 0x48, 0x1d, 0xf7, 0xfe, 0xf8, 0xd6, 0x2c, 0x00, 0xda, 0x01, 0x4c, 0x1b, 0xe0, 0x05, - 0x79, 0x33, 0x4a, 0x06, 0x70, 0x13, 0x4a, 0x1a, 0x23, 0x01, 0x70, 0x13, 0xb0, 0x0b, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x3c, - 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, - 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, 0xff, 0xff, 0xfc, 0x0f, - 0xff, 0xff, 0xfc, 0x18, 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x01, 0x0e, 0xff, 0xff, 0xfc, 0x17, - 0xff, 0xff, 0xfc, 0x16, 0xff, 0xff, 0xfc, 0x15, 0xff, 0xff, 0xfc, 0x14, 0x01, 0x31, 0x2d, 0x00, - 0x13, 0x70, 0x64, 0xdd, 0xff, 0xff, 0xfc, 0x13, 0x13, 0x70, 0x62, 0x91, 0xff, 0xff, 0xfc, 0x12, - 0x13, 0x70, 0x67, 0x9c, 0xb5, 0xf0, 0x4b, 0x8e, 0x22, 0x00, 0x80, 0x1a, 0x4b, 0x8d, 0x25, 0x00, - 0x80, 0x1a, 0x4b, 0x8d, 0x4a, 0x8d, 0x70, 0x1d, 0x4b, 0x8d, 0xb0, 0x8b, 0x70, 0x1d, 0x23, 0x78, - 0x42, 0x5b, 0x60, 0x13, 0x90, 0x08, 0xf0, 0x00, 0xff, 0xfd, 0x4c, 0x8a, 0x99, 0x08, 0x1c, 0x20, - 0xf7, 0xff, 0xfc, 0x7c, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xfc, 0x49, 0x87, 0x20, 0x01, 0x73, 0xa0, - 0x78, 0x0b, 0x78, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0x8b, 0x02, 0x1b, 0x43, 0x13, - 0x78, 0xca, 0x43, 0x1a, 0xd0, 0x48, 0x79, 0x4b, 0x2b, 0x00, 0xd1, 0x03, 0x4b, 0x7f, 0x78, 0x1b, - 0x42, 0x03, 0xd0, 0x1d, 0x4d, 0x7b, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x7d, 0x4b, 0x7d, 0x26, 0x01, - 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, 0x93, 0x00, 0x1c, 0x2b, - 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, 0xfd, 0x51, 0x4b, 0x76, - 0x60, 0x23, 0x28, 0x00, 0xda, 0x01, 0x73, 0xae, 0xe0, 0xbf, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, - 0x4b, 0x6d, 0x48, 0x72, 0x79, 0x1d, 0x1c, 0x29, 0xf7, 0xfe, 0xf8, 0x44, 0x4e, 0x69, 0x1c, 0x29, - 0x1c, 0x30, 0xf7, 0xff, 0xfa, 0x3d, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x6d, 0xf7, 0xfe, 0xf8, 0x3a, - 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x01, 0x1c, 0x30, 0xe0, 0x3c, 0x2c, 0x00, 0xda, 0x00, 0xe0, 0xa4, - 0x4a, 0x5d, 0x23, 0x01, 0x70, 0x13, 0x4b, 0x5e, 0x4a, 0x61, 0x70, 0x1d, 0x4b, 0x62, 0x60, 0x13, - 0x4a, 0x5a, 0x23, 0x00, 0x60, 0x13, 0xe0, 0x94, 0x4a, 0x5c, 0x71, 0x4d, 0x27, 0x01, 0x26, 0x00, - 0x25, 0x01, 0x92, 0x05, 0x1c, 0x32, 0x1e, 0x53, 0x41, 0x9a, 0x92, 0x09, 0x9a, 0x05, 0x78, 0x13, - 0x22, 0x01, 0x42, 0x13, 0xd0, 0x04, 0x9b, 0x09, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xd1, 0x27, - 0x48, 0x58, 0x1c, 0x31, 0xf7, 0xfe, 0xf8, 0x0e, 0x4a, 0x4e, 0x06, 0x31, 0x0e, 0x09, 0x1c, 0x10, - 0x92, 0x07, 0xf7, 0xff, 0xfa, 0x05, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x51, 0xf7, 0xfe, 0xf8, 0x02, - 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x10, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0x0d, 0x4a, 0x48, 0x4b, 0x4a, - 0x60, 0x13, 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x56, 0x4a, 0x40, 0x23, 0x79, 0x42, 0x5b, 0x60, 0x13, - 0x4a, 0x3d, 0x23, 0x00, 0x70, 0x13, 0xe0, 0x6d, 0x2c, 0x00, 0xda, 0x40, 0x2d, 0x00, 0xd0, 0x38, - 0x4d, 0x45, 0x4c, 0x3f, 0x4b, 0x3f, 0x95, 0x06, 0x4a, 0x3a, 0x60, 0x23, 0x4b, 0x43, 0x27, 0x00, - 0x68, 0x18, 0x88, 0xd3, 0x60, 0x2f, 0x73, 0x97, 0x93, 0x00, 0x1c, 0x13, 0x33, 0x0e, 0x25, 0x01, - 0x93, 0x02, 0x21, 0xa1, 0x23, 0x00, 0x22, 0xfe, 0x95, 0x01, 0xf7, 0xfe, 0xfc, 0xd1, 0x4b, 0x36, - 0x1c, 0x05, 0x60, 0x23, 0x28, 0x00, 0xda, 0x05, 0x4a, 0x2e, 0x23, 0x01, 0x73, 0x93, 0x9a, 0x06, - 0x60, 0x17, 0xe0, 0x06, 0x4a, 0x2b, 0x7b, 0x93, 0x33, 0x01, 0x73, 0x93, 0x4b, 0x2a, 0x22, 0x01, - 0x71, 0x5a, 0x4b, 0x28, 0x48, 0x32, 0x7b, 0x9f, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 0xff, 0xba, - 0x4b, 0x26, 0x22, 0x01, 0x78, 0x1b, 0x42, 0x13, 0xd0, 0x05, 0x2d, 0x00, 0xda, 0x03, 0x25, 0x01, - 0xe0, 0x02, 0x36, 0x01, 0xe0, 0x00, 0x25, 0x00, 0x42, 0xbe, 0xdb, 0x8b, 0xe0, 0x1d, 0x4b, 0x1e, - 0x20, 0x00, 0x24, 0x01, 0x70, 0x18, 0x70, 0x58, 0x70, 0x98, 0x70, 0xdc, 0x06, 0x31, 0x0e, 0x09, - 0x9d, 0x08, 0x71, 0x19, 0x89, 0x2b, 0x4a, 0x12, 0x80, 0x13, 0x89, 0x6b, 0x4a, 0x11, 0x80, 0x13, - 0x4b, 0x11, 0x4a, 0x17, 0x70, 0x1c, 0x4b, 0x12, 0x70, 0x19, 0x4b, 0x17, 0x60, 0x13, 0x4b, 0x0f, - 0x60, 0x18, 0xf0, 0x00, 0xfe, 0xfb, 0x20, 0x00, 0xe0, 0x0e, 0x4a, 0x0c, 0x23, 0x7a, 0x42, 0x5b, - 0x60, 0x13, 0x48, 0x0c, 0xf7, 0xfe, 0xfd, 0xe6, 0x4a, 0x07, 0x23, 0x00, 0x70, 0x13, 0x48, 0x15, - 0xf7, 0xfd, 0xff, 0x80, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x9e, 0x13, 0x70, 0x67, 0xa0, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0xa8, - 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x01, 0x0e, - 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0xf2, - 0x13, 0x70, 0x65, 0x10, 0x13, 0x70, 0x64, 0xf7, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc2, 0x90, - 0x13, 0x70, 0x65, 0x2d, 0x13, 0x70, 0x65, 0x56, 0xb5, 0xf0, 0x4b, 0x51, 0xb0, 0x89, 0x68, 0x1f, - 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, 0x1c, 0x1a, 0x32, 0x58, 0x18, 0xfb, 0x18, 0xbe, 0x22, 0x00, - 0x1c, 0x05, 0x67, 0x1a, 0x20, 0x32, 0xf7, 0xfd, 0xf9, 0x6f, 0x24, 0x00, 0x23, 0x16, 0x22, 0x00, - 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, - 0xf7, 0xfe, 0xfc, 0x36, 0x28, 0x00, 0xda, 0x3d, 0x20, 0x64, 0x34, 0x01, 0xf7, 0xfd, 0xf9, 0x5c, - 0x2c, 0x03, 0xd1, 0xeb, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0xba, 0x20, 0x64, 0xf7, 0xfd, - 0xf9, 0x53, 0x23, 0x16, 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, - 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, 0xf7, 0xfe, 0xfc, 0x1b, 0x28, 0x00, 0xda, 0x22, 0x34, 0x01, - 0x2c, 0x03, 0xd1, 0xe8, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x76, 0x20, 0x64, 0xf7, 0xfd, - 0xf9, 0x3b, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x9c, 0x20, 0x64, 0xf7, 0xfd, 0xf9, 0x35, 0x23, 0x16, - 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, - 0x96, 0x02, 0xf7, 0xfe, 0xfb, 0xfd, 0x28, 0x00, 0xda, 0x04, 0x34, 0x01, 0x2c, 0x03, 0xd1, 0xe2, - 0x48, 0x24, 0xe0, 0x40, 0x1c, 0x6a, 0x04, 0x13, 0x0c, 0x1b, 0x93, 0x06, 0x00, 0xab, 0x19, 0x5b, - 0x00, 0xdb, 0x18, 0xff, 0x1c, 0x3b, 0x33, 0x7c, 0x24, 0x00, 0x92, 0x07, 0x93, 0x05, 0x20, 0x32, - 0xf7, 0xfd, 0xf9, 0x12, 0x23, 0x00, 0x93, 0x00, 0x93, 0x01, 0x93, 0x02, 0x1c, 0x30, 0x21, 0x00, - 0x22, 0x05, 0x9b, 0x06, 0xf7, 0xfe, 0xfb, 0xdc, 0x28, 0x00, 0xda, 0x02, 0x4b, 0x16, 0x1b, 0x18, - 0x34, 0x01, 0x9a, 0x05, 0x25, 0x00, 0x60, 0x15, 0x9b, 0x07, 0x67, 0x3b, 0x28, 0x00, 0xda, 0x1a, - 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfe, 0xfc, 0x28, 0x20, 0x32, 0xf7, 0xfd, 0xf8, 0xf5, 0x23, 0x16, - 0x93, 0x01, 0x23, 0x80, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x95, 0x00, 0x96, 0x02, - 0xf7, 0xfe, 0xfb, 0xbe, 0x28, 0x00, 0xdb, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x01, 0x48, 0x07, - 0x67, 0x3d, 0x2c, 0x04, 0xdd, 0xcb, 0xb0, 0x09, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0xff, 0xff, 0xf7, 0x67, 0xff, 0xff, 0xe0, 0xc0, 0xff, 0xff, 0xf7, 0x3e, - 0xb5, 0x10, 0x4b, 0x0a, 0x1c, 0x04, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x01, 0x60, 0x93, 0xf7, 0xfe, - 0xf8, 0x2f, 0x28, 0x00, 0xdb, 0x02, 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x46, 0x4b, 0x03, 0x68, 0x1b, - 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, - 0xb5, 0xf0, 0x1c, 0x06, 0x48, 0x44, 0xb0, 0x8b, 0x68, 0x02, 0x1c, 0x33, 0x92, 0x06, 0x68, 0x91, - 0x33, 0x10, 0x00, 0x9b, 0x18, 0xc9, 0x00, 0xb3, 0x19, 0x9b, 0x00, 0xdb, 0x9c, 0x06, 0x1c, 0x1a, - 0x32, 0x58, 0x18, 0xa2, 0x92, 0x08, 0x18, 0xe3, 0x22, 0x00, 0x67, 0x1a, 0x68, 0x03, 0x4a, 0x3b, - 0x68, 0x9b, 0x1d, 0x0f, 0x68, 0x5b, 0x68, 0x4b, 0x40, 0x13, 0x2b, 0x01, 0xd0, 0x02, 0x24, 0x01, - 0x42, 0x64, 0xe0, 0x64, 0x1c, 0x73, 0x04, 0x1b, 0x22, 0x00, 0x0c, 0x1b, 0x92, 0x09, 0x93, 0x05, - 0x4b, 0x33, 0x20, 0x0a, 0x60, 0x3b, 0xf7, 0xfd, 0xf8, 0x8f, 0x4b, 0x32, 0x20, 0x64, 0x60, 0x3b, - 0xf7, 0xfd, 0xf8, 0x8a, 0x4b, 0x30, 0x22, 0x80, 0x60, 0x3b, 0x23, 0xfa, 0x00, 0xdb, 0x93, 0x00, - 0x00, 0x52, 0x23, 0x00, 0x1c, 0x38, 0x1c, 0x39, 0xf7, 0xfd, 0xff, 0x92, 0x68, 0x3a, 0x4b, 0x2b, - 0x1c, 0x04, 0x40, 0x13, 0x2b, 0x05, 0xd1, 0x30, 0x23, 0xc0, 0x01, 0x1b, 0x40, 0x1a, 0x23, 0x80, - 0x00, 0xdb, 0x42, 0x9a, 0xd0, 0x29, 0x28, 0x00, 0xd1, 0x29, 0x20, 0x64, 0xf7, 0xfd, 0xf8, 0x6c, - 0x4b, 0x23, 0x21, 0x80, 0x68, 0x1a, 0x25, 0x00, 0x92, 0x07, 0x4a, 0x22, 0x60, 0x1a, 0x23, 0x16, - 0x93, 0x01, 0x9b, 0x08, 0x22, 0x06, 0x93, 0x02, 0x1c, 0x18, 0x23, 0x80, 0x00, 0x5b, 0x94, 0x00, - 0xf7, 0xfe, 0xfb, 0x2e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x09, 0x98, 0x08, 0x21, 0x00, 0x22, 0x05, - 0x9b, 0x05, 0x95, 0x00, 0x95, 0x01, 0x95, 0x02, 0xf7, 0xfe, 0xfb, 0x22, 0x1c, 0x04, 0x4b, 0x14, - 0x9a, 0x07, 0x60, 0x1a, 0x2c, 0x00, 0xdb, 0x02, 0xe0, 0x08, 0x24, 0x01, 0x42, 0x64, 0x9b, 0x09, - 0x33, 0x01, 0x93, 0x09, 0x2b, 0x04, 0xd1, 0xab, 0x2c, 0x00, 0xdb, 0x08, 0x00, 0xb3, 0x9a, 0x06, - 0x19, 0x9b, 0x00, 0xdb, 0x18, 0xd3, 0x22, 0x00, 0x67, 0xda, 0x1c, 0x72, 0x67, 0x1a, 0xb0, 0x0b, - 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, - 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x20, 0x05, - 0x13, 0x70, 0x60, 0x38, 0x00, 0x03, 0x0d, 0x40, 0xb5, 0xf0, 0x4c, 0x1d, 0xb0, 0x81, 0x68, 0x23, - 0x1c, 0x06, 0x68, 0x9d, 0x23, 0x01, 0x60, 0xab, 0xf7, 0xff, 0xff, 0x5a, 0x1c, 0x07, 0x28, 0x00, - 0xda, 0x1b, 0x68, 0x23, 0x22, 0x37, 0x68, 0x99, 0x20, 0x0a, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, - 0x68, 0x23, 0x1c, 0x34, 0x68, 0x9b, 0x34, 0x10, 0x68, 0x1b, 0x00, 0xa4, 0xf7, 0xfd, 0xf8, 0x04, - 0x4b, 0x10, 0x19, 0x2c, 0x60, 0x63, 0x20, 0x32, 0xf7, 0xfc, 0xff, 0xfe, 0x4b, 0x0e, 0x20, 0x64, - 0x60, 0x63, 0xf7, 0xfc, 0xff, 0xf9, 0x4b, 0x0d, 0x60, 0x63, 0x48, 0x09, 0x22, 0x37, 0x68, 0x03, - 0xb0, 0x01, 0x68, 0x99, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, 0x68, 0x03, 0x68, 0x9a, 0x23, 0x04, - 0x60, 0x93, 0x68, 0x03, 0x1c, 0x38, 0x68, 0x9b, 0x68, 0x1b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, - 0xb5, 0xf0, 0x4b, 0x51, 0x4c, 0x51, 0x78, 0x1b, 0xb0, 0x83, 0x1c, 0x1a, 0x4b, 0x50, 0x1e, 0x51, - 0x41, 0x8a, 0x68, 0x1b, 0x60, 0x22, 0x2b, 0x00, 0xd0, 0x2b, 0x4b, 0x4e, 0x00, 0x92, 0x68, 0x1b, - 0x68, 0x99, 0x1c, 0x0b, 0x33, 0x44, 0x18, 0x9b, 0x68, 0x1b, 0x07, 0xda, 0xd4, 0x23, 0xf0, 0x00, - 0xfd, 0x11, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xc0, 0xf0, 0x00, 0xfd, 0x00, 0x20, 0x64, 0xf7, 0xfc, - 0xff, 0xbb, 0xf0, 0x00, 0xfd, 0x07, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb6, 0xf0, 0x00, 0xfc, 0xf6, - 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb1, 0xf0, 0x00, 0xfc, 0xfd, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xac, - 0xf0, 0x00, 0xfc, 0xec, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xa7, 0x20, 0xfa, 0x00, 0x40, 0xf7, 0xfc, - 0xff, 0xa3, 0x24, 0x01, 0xe0, 0x62, 0x23, 0x00, 0x60, 0x8b, 0x20, 0x00, 0xf7, 0xfc, 0xfd, 0x2e, - 0x68, 0x20, 0xf7, 0xff, 0xff, 0x79, 0x1c, 0x06, 0x28, 0x00, 0xda, 0x03, 0x68, 0x20, 0xf7, 0xff, - 0xff, 0x73, 0x1c, 0x06, 0x20, 0x3c, 0xf7, 0xfc, 0xff, 0x8f, 0x4b, 0x2e, 0x48, 0x2e, 0x93, 0x01, - 0x68, 0x1b, 0x1c, 0x31, 0x68, 0x9a, 0x4b, 0x29, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, - 0x68, 0x15, 0x1c, 0x2a, 0xf7, 0xfd, 0xfd, 0x56, 0x4c, 0x25, 0x22, 0x01, 0x60, 0x22, 0x2e, 0x00, - 0xdb, 0x38, 0x4b, 0x26, 0x1c, 0x2a, 0x40, 0x1a, 0x4b, 0x25, 0x42, 0x9a, 0xd1, 0x32, 0x4d, 0x25, - 0x27, 0x00, 0x70, 0x2f, 0x60, 0x27, 0xf7, 0xff, 0xfb, 0x8d, 0x4b, 0x23, 0x4a, 0x23, 0x60, 0x13, - 0x4b, 0x23, 0x93, 0x00, 0x28, 0x00, 0xdb, 0x11, 0x48, 0x22, 0xf7, 0xfd, 0xfd, 0x3b, 0xf0, 0x00, - 0xfc, 0xa5, 0x22, 0x01, 0x60, 0x27, 0x70, 0x2a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xef, 0x9a, 0x01, - 0x24, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xe0, 0x14, 0x23, 0x01, 0x60, 0x23, - 0x1c, 0x31, 0x48, 0x19, 0xf7, 0xfd, 0xfd, 0x26, 0x70, 0x2f, 0xf0, 0x00, 0xfc, 0x8f, 0x20, 0x64, - 0xf7, 0xfc, 0xff, 0x4a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xd9, 0x9a, 0x01, 0x68, 0x13, 0x68, 0x9a, - 0x23, 0x04, 0x60, 0x93, 0x24, 0x01, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0x3e, 0xb0, 0x03, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, - 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x65, 0x73, 0x00, 0x00, 0x31, 0x05, - 0x00, 0x00, 0x10, 0x05, 0x13, 0x70, 0x67, 0x9c, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x60, 0x38, - 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x65, 0x9d, 0x13, 0x70, 0x65, 0xae, 0xb5, 0xf0, 0x4b, 0x28, - 0xb0, 0x85, 0x68, 0x1b, 0x90, 0x03, 0x92, 0x02, 0x2b, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x43, - 0x04, 0x0b, 0x4f, 0x24, 0x25, 0x00, 0x0c, 0x1e, 0xf7, 0xff, 0xff, 0x32, 0x28, 0x00, 0xd1, 0x01, - 0x25, 0x00, 0xe0, 0x01, 0x2d, 0x00, 0xdb, 0x02, 0x78, 0x3b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x1e, - 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, 0x42, 0x6d, 0x4b, 0x1b, 0x68, 0x19, 0x29, 0x00, 0xd1, 0xeb, - 0x4a, 0x1a, 0x4b, 0x1b, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x17, 0x4c, 0x1a, 0x20, 0x00, 0x68, 0x23, - 0x68, 0x9b, 0x60, 0x99, 0xf7, 0xfc, 0xfc, 0x82, 0x4b, 0x17, 0x9a, 0x03, 0x78, 0x19, 0x9b, 0x02, - 0x48, 0x16, 0x93, 0x00, 0x1c, 0x33, 0xf7, 0xfe, 0xfc, 0xdf, 0x1c, 0x05, 0x48, 0x14, 0xf7, 0xfc, - 0xfc, 0x75, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4a, 0x0c, 0x4b, 0x11, 0x60, 0x13, - 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x07, 0x68, 0x1b, 0x2b, 0x00, - 0xd1, 0xc2, 0x2d, 0x00, 0xdb, 0xc0, 0x20, 0x01, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x2d, 0xc6, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, - 0x13, 0x70, 0x12, 0xd9, 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x4b, 0xb0, 0x87, 0x68, 0x1b, - 0x1c, 0x07, 0x92, 0x05, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, - 0x4a, 0x47, 0x4b, 0x48, 0x40, 0x02, 0x60, 0x1a, 0x4b, 0x47, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, - 0x4a, 0x46, 0x68, 0x13, 0x2b, 0x01, 0xdd, 0x02, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x61, 0x4b, 0x3f, - 0x4a, 0x3d, 0x93, 0x03, 0x04, 0x0b, 0x0c, 0x1b, 0x25, 0x00, 0x26, 0x00, 0x92, 0x04, 0x93, 0x02, - 0x9a, 0x04, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x04, 0x9a, 0x03, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x00, - 0x26, 0x00, 0xf7, 0xff, 0xfe, 0xad, 0x28, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x4b, 0x36, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x03, 0x4b, 0x35, 0x68, 0x1b, 0x2b, 0x03, 0xd0, 0x53, 0x2d, 0x00, 0xdb, 0x03, - 0x4b, 0x33, 0x78, 0x1b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x30, 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, - 0x42, 0x6d, 0x4b, 0x2e, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x41, 0x4b, 0x28, 0x4a, 0x2d, 0x68, 0x1b, - 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x2c, 0xe0, 0x00, 0x4b, 0x2c, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x18, - 0x4c, 0x2b, 0x20, 0x00, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x00, 0x60, 0x93, 0xf7, 0xfc, 0xfb, 0xee, - 0x4b, 0x28, 0x9a, 0x05, 0x78, 0x19, 0x48, 0x28, 0x9b, 0x02, 0x92, 0x00, 0x1c, 0x3a, 0xf7, 0xfe, - 0xfc, 0xd5, 0x1c, 0x05, 0x48, 0x25, 0xf7, 0xfc, 0xfb, 0xe1, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, - 0x60, 0x93, 0x4a, 0x1c, 0x4b, 0x22, 0x60, 0x13, 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x17, 0x23, 0x01, - 0x60, 0x13, 0x4b, 0x15, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0x14, 0x68, 0x1b, 0x2b, 0x00, - 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x13, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x10, - 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x03, 0x2d, 0x00, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x07, 0x36, 0x01, - 0x2e, 0x03, 0xdd, 0x95, 0x0f, 0xeb, 0x22, 0x01, 0x40, 0x53, 0x06, 0x1b, 0x0e, 0x18, 0xb0, 0x07, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x67, 0x94, - 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x67, 0x6c, - 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x2d, 0xc6, 0xc0, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x12, 0xd9, - 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x1e, 0xb0, 0x81, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x31, - 0xf7, 0xff, 0xfe, 0x1e, 0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x2b, 0x4b, 0x1a, 0x78, 0x1b, - 0x2b, 0x00, 0xd0, 0x27, 0x4e, 0x19, 0x4f, 0x1a, 0x4c, 0x1a, 0x4d, 0x1b, 0x60, 0x37, 0x79, 0x29, - 0x1c, 0x20, 0xf7, 0xfe, 0xfc, 0xe5, 0x28, 0x00, 0xdb, 0x1c, 0x60, 0x37, 0x79, 0x29, 0x1c, 0x22, - 0x1c, 0x23, 0x00, 0x88, 0x32, 0x10, 0x33, 0x50, 0x18, 0x12, 0x18, 0x1b, 0x1c, 0x20, 0xf7, 0xfe, - 0xfc, 0x9b, 0x28, 0x00, 0xdb, 0x0e, 0x4b, 0x11, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x07, 0x79, 0x2b, - 0x22, 0x80, 0x33, 0x04, 0x00, 0x9b, 0x59, 0x1b, 0x01, 0x12, 0x42, 0x93, 0xd1, 0x02, 0x1e, 0x43, - 0x41, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, - 0x00, 0x0f, 0x42, 0x40, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x67, 0x94, - 0xb5, 0xf0, 0x4b, 0x65, 0xb0, 0x83, 0x68, 0x1c, 0x2c, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0xbf, - 0x4a, 0x62, 0x20, 0x00, 0x92, 0x00, 0x68, 0x13, 0x68, 0x9b, 0x60, 0x9c, 0xf7, 0xfc, 0xfb, 0x36, - 0x4a, 0x5f, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x5e, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x5e, - 0x48, 0x5e, 0x70, 0x1c, 0xf7, 0xfd, 0xfb, 0x6e, 0x49, 0x5d, 0x4a, 0x5e, 0x78, 0x0b, 0x1e, 0x58, - 0x41, 0x83, 0x60, 0x13, 0x1c, 0x1d, 0x00, 0x9f, 0xe0, 0x8e, 0x4b, 0x54, 0x68, 0x1b, 0x93, 0x01, - 0x00, 0xab, 0x9a, 0x01, 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd3, 0x4a, 0x56, 0x67, 0x5d, 0x60, 0x15, - 0x6f, 0x1b, 0x4a, 0x50, 0x2b, 0x00, 0xd0, 0x4d, 0x23, 0x01, 0x60, 0x13, 0x1c, 0x28, 0xf7, 0xff, - 0xfc, 0xa7, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x77, 0x4a, 0x48, 0x68, 0x13, 0x68, 0x9b, - 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, 0x2c, 0x00, 0xdb, 0x05, 0x4b, 0x4b, 0x1c, 0x0a, 0x40, 0x1a, - 0x4b, 0x4a, 0x42, 0x9a, 0xd0, 0x0c, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x46, 0x1c, 0x04, 0x20, 0x14, - 0xf7, 0xfc, 0xfd, 0x62, 0x4b, 0x3d, 0x68, 0x1b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, - 0x4e, 0x3c, 0x23, 0x01, 0x60, 0x33, 0x2c, 0x00, 0xdb, 0x54, 0x4b, 0x3f, 0x1c, 0x0a, 0x40, 0x1a, - 0x4b, 0x3e, 0x42, 0x9a, 0xd1, 0x4e, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x9a, 0x01, 0x30, 0x58, - 0x18, 0x10, 0xf7, 0xff, 0xfa, 0x87, 0x28, 0x00, 0xd1, 0x44, 0x4b, 0x2f, 0x22, 0x01, 0x60, 0x1a, - 0x60, 0x30, 0x48, 0x37, 0xf7, 0xfc, 0xfa, 0xd2, 0x4b, 0x2c, 0x48, 0x36, 0x68, 0x1b, 0x68, 0x9a, - 0x23, 0x04, 0x60, 0x93, 0xf7, 0xfd, 0xfb, 0x0e, 0x4b, 0x33, 0x68, 0x1b, 0x1c, 0x18, 0x1e, 0x42, - 0x41, 0x90, 0xe0, 0x45, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x24, 0x48, 0x30, 0x68, 0x13, 0x68, 0x9b, - 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1c, 0x1c, 0x21, 0xf7, 0xfd, 0xfa, 0xfc, 0x23, 0x01, 0x42, 0x1c, - 0xd0, 0x19, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x00, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x1c, - 0x4a, 0x1a, 0x68, 0x13, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1a, 0x2c, 0x00, 0xdb, 0x04, - 0x4b, 0x1d, 0x40, 0x1a, 0x4b, 0x1d, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x38, - 0x4a, 0x13, 0x23, 0x65, 0xe0, 0x04, 0x4a, 0x12, 0x68, 0x13, 0x33, 0x01, 0xd1, 0x02, 0x23, 0x64, - 0x42, 0x5b, 0x60, 0x13, 0x35, 0x01, 0x37, 0x04, 0x4a, 0x11, 0x78, 0x13, 0x2b, 0x00, 0xd1, 0x01, - 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xda, 0x00, 0xe7, 0x66, 0x48, 0x10, 0xf7, 0xfc, - 0xfa, 0x85, 0x9a, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4b, 0x04, 0x68, 0x18, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x34, - 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x65, 0xc6, - 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x10, 0x05, - 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x66, 0x43, 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x66, 0x59, - 0xb5, 0xf0, 0x4b, 0x21, 0x49, 0x21, 0x78, 0x1a, 0xb0, 0x81, 0x1e, 0x50, 0x41, 0x82, 0x60, 0x0a, - 0x1c, 0x15, 0x00, 0x96, 0x1c, 0x18, 0x21, 0x01, 0x4f, 0x1d, 0xe0, 0x28, 0x00, 0xab, 0x68, 0x3a, - 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd2, 0x67, 0x55, 0x68, 0x3b, 0x1d, 0x32, 0x68, 0x9b, 0x33, 0x44, - 0x19, 0x9b, 0x68, 0x1b, 0x42, 0x0b, 0xd0, 0x18, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x8d, 0x1c, 0x04, - 0x20, 0x14, 0xf7, 0xfc, 0xfc, 0xa9, 0x68, 0x3b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0x9b, 0x68, 0x1a, - 0x2c, 0x00, 0xdb, 0x04, 0x4b, 0x0f, 0x40, 0x1a, 0x4b, 0x0f, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, - 0xf7, 0xff, 0xfb, 0xc6, 0x20, 0x65, 0x42, 0x40, 0xe0, 0x0a, 0x35, 0x01, 0x1c, 0x16, 0x78, 0x03, - 0x2b, 0x00, 0xd1, 0x01, 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xdb, 0xce, 0x20, 0x00, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, - 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x10, 0x05, 0xb5, 0xf0, 0xb0, 0x81, - 0x1c, 0x06, 0x07, 0xc2, 0xd4, 0x01, 0x20, 0x01, 0xe0, 0x38, 0x4b, 0x35, 0x68, 0x1c, 0x2c, 0x00, - 0xd0, 0x09, 0x6b, 0x60, 0x21, 0x60, 0xf7, 0xfb, 0xfc, 0xdf, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x00, - 0xf8, 0x71, 0x6b, 0xa4, 0xe7, 0xf3, 0x4c, 0x2f, 0x68, 0x23, 0x2b, 0x00, 0xd0, 0x1a, 0x6c, 0x58, - 0x21, 0x20, 0xf7, 0xfb, 0xfc, 0xd1, 0x68, 0x23, 0x21, 0x20, 0x6c, 0x58, 0xf0, 0x00, 0xf8, 0x62, - 0x68, 0x22, 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x4b, 0x27, 0x68, 0x22, 0x68, 0x1b, 0x21, 0x20, - 0x6b, 0x5b, 0x61, 0x53, 0x68, 0x23, 0x6c, 0x58, 0xf7, 0xfb, 0xfc, 0x96, 0x68, 0x23, 0x4a, 0x23, - 0x69, 0x9b, 0x60, 0x13, 0x4b, 0x1e, 0x68, 0x18, 0xf7, 0xfc, 0xfc, 0xc6, 0x28, 0x00, 0xd0, 0x05, - 0x4b, 0x1f, 0x20, 0x05, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x42, 0x40, 0x07, 0x73, 0xd5, 0x24, - 0x4a, 0x1b, 0x25, 0x80, 0x4f, 0x1b, 0x24, 0x00, 0x46, 0x94, 0x01, 0xad, 0x46, 0x62, 0x68, 0x13, - 0x00, 0xa2, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x3b, 0x68, 0x0a, 0x42, 0x9c, 0xd1, 0x0c, - 0x21, 0x01, 0x42, 0x0a, 0xd1, 0x0e, 0x4b, 0x14, 0x22, 0x20, 0x60, 0x19, 0x49, 0x13, 0x20, 0x01, - 0x68, 0x0b, 0x42, 0x40, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x4b, 0x11, 0x40, 0x13, 0x2b, 0x03, - 0xd1, 0x00, 0x60, 0x0d, 0x34, 0x01, 0x2c, 0x04, 0xd1, 0xe0, 0x28, 0x00, 0xd0, 0x04, 0x23, 0x12, - 0x42, 0x1e, 0xd0, 0x01, 0x20, 0x06, 0x42, 0x40, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0x88, 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x70, 0x67, 0x90, - 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x6c, 0x0d, 0x80, 0x00, 0xc0, - 0x00, 0x00, 0x20, 0x03, 0x47, 0x70, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0x00, 0x4b, 0x04, - 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xfb, 0xfc, 0x17, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, - 0x13, 0x70, 0x60, 0x40, 0xb5, 0x00, 0x4b, 0x0d, 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, - 0xf7, 0xfb, 0xfc, 0x46, 0x28, 0x00, 0xd1, 0x0d, 0x48, 0x09, 0xf7, 0xfb, 0xfc, 0x15, 0xf0, 0x00, - 0xf9, 0x29, 0x20, 0xc8, 0xf7, 0xfc, 0xfb, 0xd8, 0xf0, 0x00, 0xf9, 0x18, 0x20, 0xc8, 0xf7, 0xfc, - 0xfb, 0xd3, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x40, - 0x13, 0x70, 0x66, 0x76, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xf6, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xee, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xe6, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xfe, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xf6, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xee, 0x1c, 0x20, 0xbc, 0x10, - 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x21, 0xe0, 0xb0, 0x81, 0x48, 0x07, 0x02, 0x09, 0xf7, 0xfb, - 0xfb, 0xa3, 0x4b, 0x06, 0x60, 0x18, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x01, - 0x42, 0x40, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0xa0, 0x00, 0x13, 0x70, 0x60, 0x40, - 0xb5, 0xf0, 0x4b, 0x27, 0x1c, 0x06, 0x68, 0x18, 0xb0, 0x87, 0x91, 0x05, 0x28, 0x00, 0xd0, 0x01, - 0xf7, 0xfc, 0xf8, 0xe0, 0x4f, 0x23, 0x4a, 0x22, 0x68, 0x3d, 0x23, 0x00, 0x60, 0x13, 0x2d, 0x00, - 0xd1, 0x17, 0xf7, 0xff, 0xfd, 0xbd, 0x4c, 0x20, 0x1c, 0x20, 0xf7, 0xfc, 0xfd, 0xa3, 0x4b, 0x1f, - 0x1c, 0x02, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x2d, 0x68, 0x23, 0x92, 0x00, 0x9a, 0x05, 0x48, 0x1c, - 0x92, 0x01, 0x21, 0x00, 0x22, 0x00, 0x95, 0x02, 0xf0, 0x00, 0xfb, 0xfc, 0x60, 0x38, 0x28, 0x00, - 0xd0, 0x20, 0x4d, 0x18, 0x68, 0x2c, 0x2c, 0x00, 0xd0, 0x0b, 0x48, 0x17, 0x1c, 0x31, 0x22, 0x06, - 0xf0, 0x00, 0xfe, 0xc8, 0x28, 0x00, 0xd0, 0x16, 0x1c, 0x20, 0xf0, 0x00, 0xfa, 0x0b, 0x23, 0x00, - 0x60, 0x2b, 0x4b, 0x0c, 0x1c, 0x31, 0x68, 0x18, 0xf0, 0x00, 0xfa, 0x14, 0x4b, 0x0d, 0x60, 0x18, - 0x28, 0x00, 0xd0, 0x04, 0x48, 0x0c, 0x1c, 0x31, 0x22, 0x06, 0xf0, 0x00, 0xfe, 0xdf, 0x4b, 0x09, - 0x68, 0x1c, 0xe0, 0x00, 0x24, 0x00, 0xb0, 0x07, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, - 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0xd4, 0x13, 0x72, 0xc3, 0xa0, 0x13, 0x72, 0xc3, 0xa4, - 0x13, 0x70, 0x4b, 0x61, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x60, 0x44, 0xb5, 0x30, 0x4b, 0x0f, - 0xb0, 0x81, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, 0xf8, 0x84, 0x4c, 0x0c, 0x4b, 0x0b, - 0x68, 0x20, 0x25, 0x00, 0x60, 0x1d, 0x28, 0x00, 0xd0, 0x02, 0xf0, 0x00, 0xf9, 0xd3, 0x60, 0x25, - 0x4b, 0x08, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x00, 0xfa, 0x50, 0x4a, 0x05, 0x23, 0x00, - 0xb0, 0x01, 0x60, 0x13, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xd0, - 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd4, 0xb5, 0x10, 0x4c, 0x0b, 0x68, 0x20, 0x28, 0x00, - 0xd0, 0x03, 0xf0, 0x00, 0xf9, 0xb7, 0x23, 0x00, 0x60, 0x23, 0x4c, 0x08, 0x68, 0x23, 0x2b, 0x00, - 0xd1, 0x03, 0x48, 0x07, 0xf7, 0xfc, 0xf8, 0x62, 0x60, 0x20, 0x4a, 0x06, 0x23, 0x01, 0x42, 0x5b, - 0x60, 0x13, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd0, - 0x00, 0x00, 0x80, 0x20, 0x13, 0x70, 0x60, 0x10, 0xb5, 0xf0, 0x4f, 0x0f, 0x1c, 0x1e, 0x68, 0x3b, - 0x1c, 0x15, 0x1c, 0x0c, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x51, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0x24, - 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 0xf7, 0xff, 0xfc, 0x17, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, - 0xe0, 0x06, 0x68, 0x3b, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x69, 0xf7, 0xfb, 0xfa, 0xf5, 0x20, 0x00, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x72, 0xc3, 0xa0, 0xb5, 0x00, 0xb0, 0x81, - 0x20, 0x81, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x2e, 0xb0, 0x01, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x80, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, - 0xf7, 0xfb, 0xfb, 0x22, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0d, - 0x1c, 0x04, 0x1c, 0x13, 0xb0, 0x81, 0x1c, 0x2a, 0x1c, 0x21, 0x20, 0x10, 0xf7, 0xfb, 0xfb, 0x14, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, - 0x20, 0x06, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x07, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, - 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x05, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, - 0xfa, 0xfb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, - 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x09, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xec, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, - 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x02, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xdc, - 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x12, 0x21, 0x00, - 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xd0, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x11, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xc4, - 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x01, 0x21, 0x00, - 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xb8, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, - 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x00, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, - 0xfa, 0xab, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0xb0, 0x8d, 0x90, 0x04, 0x92, 0x03, - 0x93, 0x02, 0x68, 0x05, 0x1c, 0x0a, 0x6a, 0x6e, 0x1e, 0xb3, 0x40, 0xda, 0x04, 0x13, 0x0c, 0x1b, - 0x93, 0x06, 0x9b, 0x04, 0x7a, 0x28, 0x68, 0x5a, 0x9b, 0x06, 0x6a, 0x2c, 0x33, 0x80, 0x00, 0x5b, - 0x5a, 0xd3, 0x68, 0x6f, 0x93, 0x0a, 0x2b, 0x00, 0xd1, 0x00, 0xe0, 0xc5, 0x1e, 0x63, 0x40, 0xc3, - 0x1a, 0x36, 0x93, 0x08, 0x96, 0x07, 0x1e, 0x83, 0x1c, 0x0a, 0x9e, 0x08, 0x40, 0xda, 0x08, 0xbb, - 0x40, 0x16, 0x3b, 0x01, 0x1c, 0x0a, 0x40, 0x1a, 0x92, 0x09, 0xd1, 0x02, 0x9b, 0x03, 0x93, 0x0b, - 0xe0, 0x89, 0x9b, 0x07, 0x9a, 0x0a, 0x40, 0x9a, 0x92, 0x05, 0x6a, 0xeb, 0x18, 0xf3, 0x18, 0x99, - 0x4a, 0x58, 0x92, 0x01, 0x68, 0x13, 0x6c, 0xef, 0x42, 0x8b, 0xd1, 0x05, 0x4a, 0x56, 0x4b, 0x57, - 0x68, 0x12, 0x68, 0x19, 0x1c, 0x38, 0xe0, 0x14, 0x6b, 0x2c, 0x6b, 0xa8, 0x22, 0x01, 0x1c, 0x3b, - 0xf0, 0x00, 0xf8, 0xa6, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x96, 0x6a, 0xeb, 0x9a, 0x05, - 0x18, 0xf3, 0x18, 0x9b, 0x9a, 0x01, 0x60, 0x13, 0x4b, 0x4c, 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x4a, - 0x68, 0x1a, 0xf0, 0x00, 0xfd, 0x7b, 0x9b, 0x09, 0x00, 0x9a, 0x68, 0x6b, 0x1a, 0x9c, 0x9b, 0x02, - 0x42, 0x9c, 0xd9, 0x00, 0x1c, 0x1c, 0x6c, 0xe9, 0x98, 0x03, 0x18, 0x89, 0x1c, 0x22, 0xf0, 0x00, - 0xfd, 0x6d, 0x9a, 0x02, 0x9b, 0x03, 0x1b, 0x12, 0x92, 0x02, 0x9a, 0x08, 0x19, 0x1c, 0x36, 0x01, - 0x94, 0x0b, 0x42, 0x96, 0xd9, 0x47, 0x9b, 0x02, 0x2b, 0x00, 0xd0, 0x44, 0x9b, 0x06, 0x33, 0x01, - 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, - 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x5f, 0x26, 0x00, 0xe0, 0x34, 0x7a, 0x2b, 0x9f, 0x02, - 0x6a, 0x2a, 0x40, 0xdf, 0x19, 0xbb, 0x42, 0x93, 0xd9, 0x00, 0x1b, 0x97, 0x9a, 0x07, 0x6a, 0xe9, - 0x9b, 0x0a, 0x18, 0x71, 0x40, 0x93, 0x18, 0xc9, 0x6b, 0x2c, 0x6b, 0xa8, 0x1c, 0x3a, 0x9b, 0x0b, - 0xf0, 0x00, 0xf8, 0x56, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x47, 0x7a, 0x2b, 0x1c, 0x39, 0x40, 0x99, - 0x9b, 0x02, 0x9a, 0x08, 0x1a, 0x5b, 0x19, 0xf6, 0x93, 0x02, 0x42, 0x96, 0xd9, 0x10, 0x2b, 0x00, - 0xd0, 0x0e, 0x9b, 0x06, 0x33, 0x01, 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, - 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x2c, 0x26, 0x00, - 0x9a, 0x0b, 0x18, 0x52, 0x92, 0x0b, 0x68, 0x6b, 0x9a, 0x02, 0x42, 0x9a, 0xd2, 0xc6, 0x2a, 0x00, - 0xd1, 0x01, 0x24, 0x00, 0xe0, 0x21, 0x9b, 0x07, 0x9f, 0x0a, 0x6a, 0xe9, 0x40, 0x9f, 0x18, 0x71, - 0x6b, 0x2c, 0x6b, 0xa8, 0x19, 0xc9, 0x6c, 0xeb, 0x22, 0x01, 0xf0, 0x00, 0xf8, 0x21, 0x1c, 0x04, - 0x28, 0x00, 0xd1, 0x12, 0x6a, 0xeb, 0x4a, 0x0b, 0x18, 0xf3, 0x19, 0xdb, 0x60, 0x13, 0x4b, 0x0b, - 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x08, 0x68, 0x1a, 0xf0, 0x00, 0xfc, 0xf8, 0x6c, 0xe9, 0x98, 0x0b, - 0x9a, 0x02, 0xf0, 0x00, 0xfc, 0xf3, 0xe0, 0x00, 0x24, 0x01, 0xb0, 0x0d, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xe0, 0x13, 0x70, 0x67, 0xdc, - 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x68, 0x02, 0x1c, 0x04, 0x6d, 0x13, 0x3b, 0x01, 0x65, 0x13, - 0x68, 0x40, 0xf7, 0xfb, 0xfe, 0x9f, 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x9c, 0xbc, 0x10, 0xbc, 0x01, - 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0x1c, 0x03, 0x33, 0x48, 0x88, 0x1a, 0x7a, 0x03, 0xb0, 0x83, - 0x41, 0x1a, 0x92, 0x01, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x27, 0x00, 0x1c, 0x05, 0x1c, 0x0e, - 0x60, 0x13, 0x97, 0x00, 0xe0, 0x4f, 0x68, 0x2b, 0x19, 0xdb, 0x7b, 0x1b, 0x2b, 0x00, 0xd0, 0x45, - 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x22, 0x01, 0x6c, 0xeb, 0x6b, 0x2c, - 0xf0, 0x00, 0xf8, 0x52, 0x6c, 0xe9, 0x1c, 0x30, 0x22, 0x06, 0xf0, 0x00, 0xfc, 0x83, 0x28, 0x00, - 0xd1, 0x34, 0x20, 0x0c, 0xf7, 0xfb, 0xfe, 0x7a, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x09, 0x48, 0x1f, - 0xf7, 0xfb, 0xf9, 0x3a, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x37, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x34, - 0xe0, 0x2d, 0x1c, 0x2b, 0x33, 0x48, 0x60, 0x05, 0x60, 0x87, 0x88, 0x18, 0xf7, 0xfb, 0xfe, 0x66, - 0x1c, 0x03, 0x60, 0x70, 0x28, 0x00, 0xd1, 0x0c, 0x48, 0x14, 0xf7, 0xfb, 0xf9, 0x25, 0x48, 0x14, - 0xf7, 0xfb, 0xf9, 0x22, 0x48, 0x13, 0xf7, 0xfb, 0xf9, 0x1f, 0x1c, 0x30, 0xf7, 0xfb, 0xfe, 0x4a, - 0xe0, 0x14, 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x6b, 0x2c, 0x9a, 0x01, - 0xf0, 0x00, 0xf8, 0x1a, 0x6d, 0x2b, 0x33, 0x01, 0x65, 0x2b, 0xe0, 0x08, 0x9b, 0x00, 0x9a, 0x01, - 0x37, 0x01, 0x18, 0x9b, 0x93, 0x00, 0x8f, 0xab, 0x42, 0x9f, 0xd3, 0xac, 0x26, 0x00, 0xb0, 0x03, - 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x66, 0x95, - 0x13, 0x70, 0x66, 0xa1, 0x13, 0x70, 0x66, 0x41, 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x6d, 0x03, - 0x1c, 0x04, 0x2b, 0x00, 0xd0, 0x09, 0x48, 0x0d, 0xf7, 0xfb, 0xf8, 0xee, 0x48, 0x0c, 0xf7, 0xfb, - 0xf8, 0xeb, 0x48, 0x0c, 0xf7, 0xfb, 0xf8, 0xe8, 0xe0, 0x0d, 0x68, 0x00, 0xf7, 0xfb, 0xfe, 0x12, - 0x6c, 0xe0, 0xf7, 0xfb, 0xfe, 0x0f, 0x6c, 0x60, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfb, 0xfe, 0x0a, - 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x07, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x66, 0x95, - 0x13, 0x70, 0x66, 0xb3, 0x13, 0x70, 0x66, 0x41, 0xb5, 0xf0, 0xb0, 0x85, 0x90, 0x03, 0x20, 0x54, - 0x91, 0x02, 0x92, 0x01, 0x1c, 0x1f, 0xf7, 0xfb, 0xfe, 0x01, 0x1c, 0x05, 0x2f, 0x00, 0xd1, 0x02, - 0x20, 0x80, 0x00, 0x80, 0xe0, 0x00, 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xf8, 0x23, 0x80, 0x02, 0x1b, - 0x61, 0x2b, 0x1c, 0x06, 0x23, 0x00, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x10, 0xd1, 0xfa, - 0x23, 0x0f, 0x75, 0x2b, 0x4b, 0x81, 0x60, 0x2e, 0x61, 0xeb, 0x9a, 0x0b, 0x4b, 0x80, 0x62, 0xea, - 0x60, 0x1f, 0x9b, 0x0a, 0x20, 0x00, 0x0b, 0xd9, 0x17, 0xfa, 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0xae, - 0x61, 0xa9, 0x9c, 0x0c, 0x2c, 0x00, 0xd0, 0x32, 0x1c, 0x30, 0x21, 0x00, 0x1c, 0x3a, 0xf0, 0x00, - 0xfc, 0x49, 0x23, 0x57, 0x70, 0x33, 0x23, 0x42, 0x70, 0x73, 0x23, 0x46, 0x70, 0xb3, 0x23, 0x53, - 0x70, 0xf3, 0x1c, 0x3c, 0x23, 0x00, 0xe0, 0x03, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x08, 0x64, - 0x2c, 0x00, 0xd1, 0xf9, 0x3b, 0x01, 0x72, 0x33, 0x9a, 0x0a, 0x21, 0x80, 0x0e, 0x13, 0x71, 0x33, - 0x0c, 0x13, 0x71, 0x73, 0x0a, 0x13, 0x71, 0xf2, 0x71, 0xb3, 0x69, 0xac, 0x22, 0x06, 0x20, 0x06, - 0x02, 0x49, 0x1c, 0x0b, 0x40, 0x83, 0x42, 0x9c, 0xd3, 0x05, 0x1c, 0x53, 0x06, 0x1b, 0x0e, 0x1a, - 0x30, 0x01, 0x2a, 0x0b, 0xd1, 0xf5, 0x7d, 0x2b, 0x18, 0xd3, 0x72, 0x73, 0xe0, 0x06, 0x6a, 0xe9, - 0x98, 0x01, 0x22, 0x01, 0x1c, 0x33, 0x9c, 0x03, 0xf0, 0x00, 0xf8, 0xca, 0x78, 0x33, 0x78, 0x72, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xb3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xf2, 0x43, 0x1a, - 0x4b, 0x58, 0x42, 0x9a, 0xd0, 0x04, 0x48, 0x58, 0xf7, 0xfb, 0xf8, 0x56, 0x48, 0x57, 0xe0, 0x2f, - 0x4b, 0x57, 0x68, 0x1b, 0x42, 0x59, 0x41, 0x59, 0x29, 0x00, 0xd0, 0x36, 0x2f, 0x00, 0xd0, 0x11, - 0x7a, 0x30, 0x1c, 0x3a, 0x33, 0x01, 0x06, 0x1b, 0x08, 0x52, 0x0e, 0x1b, 0x2a, 0x00, 0xd1, 0xf9, - 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x42, 0x98, 0xd0, 0x04, 0x48, 0x4b, 0xf7, 0xfb, 0xf8, 0x3c, - 0x48, 0x4c, 0xe0, 0x15, 0x29, 0x00, 0xd0, 0x20, 0x9a, 0x0a, 0x2a, 0x00, 0xd0, 0x1d, 0x79, 0x32, - 0x79, 0x73, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x79, 0xb2, 0x9c, 0x0a, 0x02, 0x12, 0x43, 0x1a, - 0x79, 0xf3, 0x43, 0x13, 0x42, 0xa3, 0xd0, 0x10, 0x48, 0x3f, 0xf7, 0xfb, 0xf8, 0x25, 0x48, 0x42, - 0xf7, 0xfb, 0xf8, 0x22, 0x48, 0x41, 0xf7, 0xfb, 0xf8, 0x1f, 0x1c, 0x28, 0xf7, 0xfb, 0xfd, 0x4a, - 0x1c, 0x30, 0xf7, 0xfb, 0xfd, 0x47, 0x25, 0x00, 0xe0, 0x63, 0x7a, 0x33, 0x24, 0x01, 0x1c, 0x27, - 0x40, 0x9f, 0x60, 0x6f, 0x7a, 0x33, 0x69, 0x29, 0x72, 0x2b, 0x79, 0x33, 0x79, 0x72, 0x06, 0x1b, - 0x04, 0x12, 0x43, 0x1a, 0x79, 0xb3, 0x79, 0xf0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0x60, 0xe8, - 0xf0, 0x00, 0xfa, 0x72, 0x1c, 0x39, 0x43, 0x41, 0x61, 0xa9, 0x7a, 0x72, 0x7d, 0x2b, 0x62, 0x6a, - 0x40, 0x94, 0x1a, 0xd2, 0x69, 0xeb, 0x40, 0xd1, 0x40, 0xd3, 0x04, 0x1b, 0x0c, 0x1b, 0x04, 0x3a, - 0x85, 0x6b, 0x0c, 0x12, 0x33, 0x80, 0x85, 0x29, 0x00, 0x5b, 0x1e, 0x51, 0x18, 0xc9, 0x42, 0x52, - 0x1c, 0x2b, 0x40, 0x11, 0x33, 0x48, 0x80, 0x19, 0x62, 0x2c, 0x9a, 0x03, 0x63, 0x2a, 0x9b, 0x02, - 0x63, 0x6b, 0x9a, 0x01, 0x8d, 0x2b, 0x63, 0xaa, 0x08, 0xda, 0x7a, 0x2b, 0x1a, 0xa4, 0x40, 0xdc, - 0x64, 0x2c, 0x9b, 0x0c, 0x2b, 0x00, 0xd1, 0x01, 0x64, 0x6b, 0xe0, 0x0b, 0x1e, 0x78, 0x18, 0x80, - 0x42, 0x7b, 0x40, 0x18, 0xf7, 0xfb, 0xfd, 0x0a, 0x8d, 0x2a, 0x64, 0x68, 0x08, 0xd2, 0x21, 0xff, - 0xf0, 0x00, 0xfb, 0x78, 0x1c, 0x2b, 0x33, 0x48, 0x88, 0x19, 0x6c, 0x28, 0x7a, 0x2b, 0x38, 0x01, - 0x41, 0x19, 0xf0, 0x00, 0xfa, 0x31, 0x68, 0x6b, 0x04, 0x00, 0x0c, 0x00, 0x3b, 0x0c, 0x87, 0xa8, - 0x42, 0x98, 0xd9, 0x00, 0x87, 0xab, 0x68, 0x68, 0xf7, 0xfb, 0xfc, 0xf0, 0x23, 0x00, 0x64, 0xe8, - 0x65, 0x2b, 0xb0, 0x05, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x00, 0x04, 0x60, 0x90, - 0x13, 0x70, 0x67, 0xe0, 0x57, 0x42, 0x46, 0x53, 0x13, 0x70, 0x66, 0x95, 0x13, 0x70, 0x66, 0xdf, - 0x13, 0x70, 0x67, 0xe4, 0x13, 0x70, 0x66, 0xe9, 0x13, 0x70, 0x67, 0x06, 0x13, 0x70, 0x66, 0x41, - 0x47, 0x20, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0xa5, 0x90, 0x0c, 0x1c, 0x18, 0x92, 0x0a, 0x93, 0x09, - 0x91, 0x0b, 0xf7, 0xfb, 0xfc, 0xcb, 0x4b, 0x8c, 0x22, 0x01, 0x4c, 0x8c, 0x42, 0x52, 0x60, 0x1a, - 0x68, 0x23, 0x1c, 0x05, 0x2b, 0x00, 0xd1, 0x03, 0x98, 0x09, 0xf7, 0xfb, 0xfc, 0xbf, 0x60, 0x20, - 0x4b, 0x87, 0x99, 0x09, 0x98, 0x0a, 0x60, 0x19, 0x22, 0x01, 0x21, 0x00, 0x1c, 0x2b, 0x9c, 0x0c, - 0xf0, 0x00, 0xf9, 0x18, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0xf4, 0x23, 0xff, 0x00, 0x5b, 0x5c, 0xeb, - 0x2b, 0x55, 0xd1, 0x1b, 0x4b, 0x7f, 0x5c, 0xeb, 0x2b, 0xaa, 0xd1, 0x17, 0x1c, 0xe8, 0x49, 0x7e, - 0x22, 0x04, 0xf0, 0x00, 0xfb, 0x9d, 0x28, 0x00, 0xd0, 0x10, 0x4c, 0x7c, 0x1c, 0x28, 0x30, 0x36, - 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x94, 0x28, 0x00, 0xd0, 0x07, 0x1c, 0x28, 0x30, 0x52, - 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x8c, 0x28, 0x00, 0xd1, 0x05, 0xa8, 0x14, 0x21, 0x00, - 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xff, 0xe0, 0x06, 0x22, 0xdf, 0x00, 0x52, 0x18, 0xa9, 0xa8, 0x14, - 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xb3, 0x23, 0x01, 0x21, 0xe4, 0x42, 0x5b, 0x24, 0x00, 0x00, 0x49, - 0xae, 0x14, 0x93, 0x11, 0x94, 0x12, 0x91, 0x07, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, - 0x43, 0x1a, 0x78, 0xab, 0x7a, 0x37, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x7a, 0x70, 0x43, 0x1a, - 0x4b, 0x63, 0x7a, 0xb1, 0x7a, 0xf4, 0x42, 0x9a, 0xd0, 0x03, 0x79, 0x33, 0x2b, 0x00, 0xd1, 0x00, - 0xe0, 0xa3, 0x04, 0x0a, 0x02, 0x03, 0x43, 0x13, 0x43, 0x3b, 0x1c, 0x1f, 0x79, 0x33, 0x06, 0x22, - 0x43, 0x17, 0x2b, 0x0f, 0xd1, 0x69, 0x22, 0xe3, 0x21, 0x00, 0x00, 0x52, 0x91, 0x13, 0x92, 0x08, - 0x19, 0xc9, 0x91, 0x05, 0x98, 0x0a, 0x22, 0x01, 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0xb2, - 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x8e, 0x49, 0x53, 0x9c, 0x07, 0x5c, 0x6a, 0x5d, 0x2b, 0x99, 0x08, - 0x04, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x4c, 0x50, 0x5c, 0x6b, 0x99, 0x05, 0x43, 0x1a, 0x5d, 0x2b, - 0x98, 0x0a, 0x06, 0x1b, 0x43, 0x1a, 0x18, 0x8a, 0x23, 0xeb, 0x92, 0x05, 0x00, 0x5b, 0x5c, 0xeb, - 0x1c, 0x11, 0x93, 0x0d, 0x4b, 0x49, 0x22, 0x01, 0x5c, 0xeb, 0x9c, 0x0c, 0x93, 0x0e, 0x23, 0xec, - 0x00, 0x5b, 0x5c, 0xeb, 0x93, 0x0f, 0x4b, 0x46, 0x5c, 0xeb, 0x93, 0x10, 0x1c, 0x2b, 0xf0, 0x00, - 0xf8, 0x89, 0x28, 0x00, 0xd1, 0x66, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, - 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, 0x4b, 0x39, 0x42, 0x9a, 0xd1, 0x12, - 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x05, 0x9c, 0x2c, 0x90, 0x00, 0x93, 0x01, - 0x94, 0x02, 0xe0, 0x38, 0x99, 0x05, 0x9a, 0x11, 0x42, 0x91, 0xd0, 0x04, 0x9b, 0x12, 0x9c, 0x05, - 0x33, 0x01, 0x93, 0x12, 0x94, 0x11, 0x99, 0x0e, 0x9c, 0x0f, 0x02, 0x0b, 0x04, 0x22, 0x99, 0x0d, - 0x43, 0x13, 0x9c, 0x10, 0x43, 0x0b, 0x06, 0x22, 0x1c, 0x19, 0x43, 0x11, 0xd0, 0x35, 0x9a, 0x13, - 0x32, 0x01, 0x92, 0x13, 0x2a, 0x08, 0xd1, 0x9b, 0xe0, 0x2f, 0x98, 0x0a, 0x1c, 0x39, 0x22, 0x01, - 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0x4e, 0x28, 0x00, 0xd1, 0x2b, 0x78, 0x2b, 0x78, 0x6a, - 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, - 0x4b, 0x1b, 0x42, 0x9a, 0xd1, 0x19, 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x0e, 0x9b, 0x2c, - 0x90, 0x00, 0x97, 0x01, 0x93, 0x02, 0x98, 0x0c, 0x99, 0x0b, 0x9a, 0x0a, 0x9b, 0x09, 0xf7, 0xff, - 0xfd, 0xc3, 0x1c, 0x04, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xbd, 0xe0, 0x0f, 0x9c, 0x11, 0x42, 0xa7, - 0xd0, 0x03, 0x99, 0x12, 0x97, 0x11, 0x31, 0x01, 0x91, 0x12, 0xab, 0x20, 0x42, 0x9e, 0xd0, 0x01, - 0x36, 0x10, 0xe7, 0x41, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xad, 0x24, 0x00, 0xb0, 0x25, 0x1c, 0x20, - 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xdc, - 0x13, 0x70, 0x67, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x13, 0x70, 0x67, 0x22, 0x13, 0x70, 0x67, 0x27, - 0x57, 0x42, 0x46, 0x53, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x01, 0xc9, 0x00, 0x00, 0x01, 0xd7, - 0x00, 0x00, 0x01, 0xd9, 0x47, 0x20, 0x46, 0xc0, 0xef, 0x00, 0x00, 0xcc, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x00, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x01, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x02, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x03, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x90, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x04, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x05, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x50, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x06, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x07, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, - 0xe6, 0x00, 0x08, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x0a, 0x10, 0xe1, 0x2f, 0xff, 0x1e, - 0xe2, 0x90, 0x10, 0x00, 0xe3, 0xb0, 0x00, 0x04, 0xef, 0x00, 0x00, 0xab, 0xe1, 0x2f, 0xff, 0x1e, - 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x34, 0x23, 0x01, 0x22, 0x00, - 0xb4, 0x10, 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, - 0xd2, 0x02, 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, - 0xd2, 0x02, 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, - 0x08, 0x4c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, - 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, - 0x08, 0xdc, 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, - 0x1c, 0x10, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, 0xf8, 0x5e, 0x20, 0x00, 0xbc, 0x06, - 0x47, 0x10, 0x46, 0xc0, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0xbc, 0x0e, 0x43, 0x42, 0x1a, 0x89, - 0x47, 0x18, 0x46, 0xc0, 0x29, 0x00, 0xd0, 0x41, 0xb4, 0x10, 0x1c, 0x04, 0x40, 0x4c, 0x46, 0xa4, - 0x23, 0x01, 0x22, 0x00, 0x29, 0x00, 0xd5, 0x00, 0x42, 0x49, 0x28, 0x00, 0xd5, 0x00, 0x42, 0x40, - 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, - 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, - 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, 0x08, 0x4c, - 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, 0xd3, 0x02, - 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0xdc, - 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, 0x1c, 0x10, - 0x46, 0x64, 0x2c, 0x00, 0xd5, 0x00, 0x42, 0x40, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, - 0xf8, 0x0b, 0x20, 0x00, 0xbc, 0x06, 0x47, 0x10, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xb3, 0xbc, 0x0e, - 0x43, 0x42, 0x1a, 0x89, 0x47, 0x18, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0xf0, 0x46, 0x57, - 0x46, 0x46, 0xb4, 0xc0, 0x1c, 0x1e, 0x4b, 0x16, 0x46, 0x90, 0x1c, 0x0a, 0x40, 0x1a, 0x40, 0x33, - 0x46, 0x82, 0x1c, 0x10, 0x43, 0x58, 0x0c, 0x0c, 0x1c, 0x0f, 0x0c, 0x31, 0x46, 0x84, 0x43, 0x4a, - 0x1c, 0x20, 0x43, 0x58, 0x1c, 0x25, 0x43, 0x4d, 0x46, 0x61, 0x18, 0x82, 0x0c, 0x0b, 0x18, 0xd2, - 0x42, 0x90, 0xd9, 0x02, 0x23, 0x80, 0x02, 0x5b, 0x18, 0xed, 0x4b, 0x09, 0x46, 0x61, 0x04, 0x14, - 0x0c, 0x10, 0x40, 0x0b, 0x18, 0x2a, 0x18, 0xe1, 0x46, 0x40, 0x43, 0x78, 0x46, 0x53, 0x43, 0x73, - 0x18, 0xc0, 0x18, 0x80, 0xbc, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0xbc, 0xf0, 0xbc, 0x04, 0x47, 0x10, - 0x00, 0x00, 0xff, 0xff, 0xb5, 0x70, 0x1c, 0x0e, 0x1c, 0x15, 0x1c, 0x04, 0x2a, 0x03, 0xd9, 0x20, - 0x1c, 0x33, 0x43, 0x03, 0x07, 0x9a, 0xd0, 0x12, 0x78, 0x23, 0x78, 0x08, 0x42, 0x83, 0xd1, 0x1b, - 0x1e, 0x6a, 0xe0, 0x06, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, 0x42, 0x83, - 0xd1, 0x12, 0x2a, 0x00, 0xd1, 0xf6, 0x20, 0x00, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x68, 0x02, - 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x04, 0x3d, 0x04, 0x30, 0x04, 0x31, 0x04, 0x2d, 0x03, 0xd8, 0xf6, - 0x1c, 0x04, 0x2d, 0x00, 0xd1, 0xe0, 0xe7, 0xee, 0x1a, 0x18, 0xe7, 0xed, 0xb5, 0xf0, 0x1c, 0x07, - 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x08, 0x1c, 0x11, 0x2a, 0x0f, 0xd9, 0x03, 0x1c, 0x33, - 0x43, 0x3b, 0x07, 0x9a, 0xd0, 0x0b, 0x29, 0x00, 0xd0, 0x05, 0x22, 0x00, 0x5c, 0x83, 0x54, 0xa3, - 0x32, 0x01, 0x42, 0x8a, 0xd1, 0xfa, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x1c, 0x3a, - 0x1c, 0x31, 0x1c, 0x28, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x4b, 0x60, 0x53, 0x68, 0x8b, 0x60, 0x93, - 0x68, 0xcb, 0x38, 0x10, 0x60, 0xd3, 0x31, 0x10, 0x32, 0x10, 0x28, 0x0f, 0xd8, 0xf2, 0x1c, 0x2b, - 0x3b, 0x10, 0x09, 0x1a, 0x01, 0x11, 0x32, 0x01, 0x01, 0x12, 0x1a, 0x59, 0x18, 0xb0, 0x18, 0xbc, - 0x29, 0x03, 0xd9, 0xd8, 0x22, 0x00, 0x58, 0x83, 0x50, 0xa3, 0x32, 0x04, 0x1a, 0x8b, 0x2b, 0x03, - 0xd8, 0xf9, 0x1f, 0x0b, 0x08, 0x9a, 0x00, 0x91, 0x32, 0x01, 0x00, 0x92, 0x1a, 0x59, 0x18, 0x80, - 0x18, 0xa4, 0xe7, 0xc8, 0xb5, 0xf0, 0x1c, 0x07, 0x46, 0x8c, 0x1c, 0x10, 0x1c, 0x39, 0x07, 0xba, - 0xd0, 0x0e, 0x28, 0x00, 0xd0, 0x49, 0x46, 0x62, 0x06, 0x13, 0x38, 0x01, 0x0e, 0x1b, 0x22, 0x03, - 0xe0, 0x02, 0x28, 0x00, 0xd0, 0x41, 0x38, 0x01, 0x70, 0x0b, 0x31, 0x01, 0x42, 0x11, 0xd1, 0xf8, - 0x1c, 0x05, 0x1c, 0x0a, 0x28, 0x03, 0xd9, 0x2e, 0x23, 0xff, 0x46, 0x62, 0x40, 0x1a, 0x02, 0x13, - 0x43, 0x13, 0x04, 0x1a, 0x1c, 0x14, 0x1c, 0x0e, 0x43, 0x1c, 0x28, 0x0f, 0xd9, 0x12, 0x1c, 0x02, - 0x1c, 0x0b, 0x3a, 0x10, 0x60, 0x1c, 0x60, 0x5c, 0x60, 0x9c, 0x60, 0xdc, 0x33, 0x10, 0x2a, 0x0f, - 0xd8, 0xf7, 0x1c, 0x03, 0x3b, 0x10, 0x1c, 0x1d, 0x09, 0x1b, 0x33, 0x01, 0x22, 0x0f, 0x01, 0x1b, - 0x40, 0x15, 0x18, 0xce, 0x2d, 0x03, 0xd9, 0x0d, 0x22, 0x00, 0x50, 0xb4, 0x32, 0x04, 0x1a, 0xab, - 0x2b, 0x03, 0xd8, 0xfa, 0x1f, 0x2b, 0x1c, 0x1d, 0x08, 0x9b, 0x33, 0x01, 0x22, 0x03, 0x00, 0x9b, - 0x40, 0x15, 0x18, 0xf6, 0x1c, 0x32, 0x2d, 0x00, 0xd0, 0x07, 0x46, 0x61, 0x06, 0x0b, 0x0e, 0x19, - 0x23, 0x00, 0x54, 0xd1, 0x33, 0x01, 0x42, 0x9d, 0xd1, 0xfb, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, - 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x9a, 0xd1, 0x1c, 0x68, 0x02, - 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x18, 0x4c, 0x10, 0x19, 0x13, 0x43, 0x93, 0x4a, 0x0f, 0x42, 0x13, - 0xd1, 0x0b, 0x1c, 0x14, 0x30, 0x04, 0x31, 0x04, 0x68, 0x02, 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x0b, - 0x4d, 0x09, 0x19, 0x53, 0x43, 0x93, 0x42, 0x23, 0xd0, 0xf4, 0x20, 0x00, 0xe0, 0x09, 0x78, 0x0a, - 0x42, 0x9a, 0xd1, 0x05, 0x30, 0x01, 0x31, 0x01, 0x78, 0x03, 0x2b, 0x00, 0xd1, 0xf7, 0x78, 0x0a, - 0x1a, 0x98, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, - 0xb5, 0x70, 0x1c, 0x04, 0x2a, 0x00, 0xd0, 0x41, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x98, 0xd1, 0x2c, - 0x1c, 0x20, 0x1c, 0x0d, 0x2a, 0x03, 0xd9, 0x26, 0x68, 0x24, 0x68, 0x0b, 0x42, 0x9c, 0xd1, 0x22, - 0x3a, 0x04, 0x2a, 0x00, 0xd0, 0x32, 0x49, 0x1b, 0x18, 0x63, 0x49, 0x1b, 0x43, 0xa3, 0x42, 0x0b, - 0xd1, 0x2c, 0x1c, 0x0c, 0xe0, 0x0b, 0x68, 0x01, 0x68, 0x2b, 0x42, 0x99, 0xd1, 0x13, 0x3a, 0x04, - 0x2a, 0x00, 0xd0, 0x23, 0x4e, 0x13, 0x19, 0x8b, 0x43, 0x8b, 0x42, 0x23, 0xd1, 0x1e, 0x30, 0x04, - 0x35, 0x04, 0x2a, 0x03, 0xd8, 0xef, 0x1c, 0x04, 0x1c, 0x29, 0x2a, 0x00, 0xd1, 0x05, 0x78, 0x03, - 0x78, 0x28, 0x1a, 0x18, 0xe0, 0x13, 0x1c, 0x04, 0x1c, 0x29, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, - 0x42, 0x98, 0xd0, 0x09, 0xe7, 0xf5, 0x28, 0x00, 0xd0, 0x08, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, - 0x78, 0x08, 0x42, 0x98, 0xd1, 0xed, 0x3a, 0x01, 0x2a, 0x00, 0xd1, 0xf4, 0x20, 0x00, 0xbc, 0x70, - 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, 0x49, 0x4f, 0x53, 0x20, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x1f, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x0f, 0x42, 0x40, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x64, 0x65, 0x76, - 0x2f, 0x75, 0x73, 0x62, 0x31, 0x32, 0x33, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, - 0x31, 0x32, 0x33, 0x2f, 0x4f, 0x46, 0x46, 0x00, 0x57, 0x42, 0x46, 0x53, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, - 0x20, 0x28, 0x25, 0x73, 0x29, 0x0a, 0x00, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x00, 0x20, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x00, 0x20, 0x52, 0x65, 0x63, 0x6c, 0x00, 0x20, 0x48, - 0x61, 0x6c, 0x74, 0x00, 0x20, 0x49, 0x41, 0x41, 0x00, 0x20, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x00, - 0x20, 0x46, 0x4c, 0x52, 0x00, 0x20, 0x50, 0x43, 0x44, 0x00, 0x20, 0x45, 0x52, 0x52, 0x00, 0x20, - 0x49, 0x4e, 0x54, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, - 0x25, 0x78, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x75, 0x73, - 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, - 0x42, 0x55, 0x4c, 0x4b, 0x20, 0x52, 0x45, 0x53, 0x45, 0x54, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, - 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, - 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, - 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, - 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, - 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, - 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x73, - 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, - 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, - 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, - 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x55, 0x4e, - 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, - 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, - 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, - 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, - 0x20, 0x63, 0x6d, 0x64, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x20, 0x20, 0x20, - 0x20, 0x49, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, - 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, - 0x3a, 0x20, 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, - 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x73, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, - 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x64, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x75, 0x63, 0x64, 0x20, 0x25, - 0x69, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x41, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, - 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x73, 0x75, 0x62, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x20, 0x25, 0x69, 0x20, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, - 0x20, 0x25, 0x69, 0x20, 0x0a, 0x00, 0x49, 0x6e, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, - 0x25, 0x69, 0x0a, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x25, - 0x69, 0x0a, 0x00, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x20, 0x25, 0x78, 0x20, 0x65, 0x70, 0x5f, 0x6f, - 0x75, 0x74, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x3a, - 0x20, 0x25, 0x78, 0x20, 0x61, 0x6c, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x5f, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, - 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, - 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x42, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x00, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, 0x65, 0x74, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x79, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x00, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x20, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x46, 0x61, - 0x73, 0x74, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, - 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x25, 0x69, 0x23, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x3a, - 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x54, 0x4f, 0x52, - 0x41, 0x47, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x55, 0x4e, 0x20, - 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x75, 0x6e, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, - 0x6e, 0x70, 0x6c, 0x75, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4f, 0x4b, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4b, 0x4f, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, - 0x0a, 0x00, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, - 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x0a, 0x00, 0x55, - 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, - 0x20, 0x4f, 0x6b, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, - 0x0a, 0x00, 0x55, 0x53, 0x42, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x3a, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, - 0x00, 0x77, 0x62, 0x66, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x00, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, 0x74, - 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x77, - 0x62, 0x66, 0x73, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x73, 0x20, - 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x00, 0x62, 0x61, 0x64, 0x20, 0x6d, - 0x61, 0x67, 0x69, 0x63, 0x00, 0x68, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x00, 0x68, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, - 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x4e, 0x54, - 0x46, 0x53, 0x00, 0x46, 0x41, 0x54, 0x00 -}; +#define size_ehcmodule_5 25287 + +unsigned char ehcmodule_5[25287] __attribute__((aligned (32)))={ + 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x02, 0x01, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x34, 0x00, 0x20, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xa0, + 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x13, 0x70, 0x00, 0x00, + 0x13, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x94, 0x00, 0x00, 0x5a, 0x94, 0x00, 0xf0, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x5b, 0x9c, 0x13, 0x70, 0x60, 0x00, + 0x13, 0x70, 0x60, 0x00, 0x00, 0x00, 0x07, 0x2b, 0x00, 0x02, 0x95, 0xa8, 0x00, 0xf0, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x13, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0x13, 0x72, 0xf3, 0xa8, 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, + 0xe5, 0x9f, 0x31, 0x00, 0xe1, 0x2f, 0xff, 0x13, 0xe5, 0x9f, 0xc0, 0xfc, 0xe5, 0x9c, 0xc0, 0x00, + 0xe1, 0xa0, 0x00, 0x00, 0xe7, 0x9c, 0xc1, 0x0b, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1c, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x3f, 0xea, 0xff, 0xff, 0xf5, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x40, 0xea, 0xff, 0xff, 0xf1, + 0xe3, 0xa0, 0x00, 0x00, 0xee, 0x07, 0x0f, 0x15, 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x00, 0x00, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0x18, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x12, + 0xe3, 0xc8, 0x80, 0x10, 0xe3, 0xa0, 0x20, 0x10, 0xe5, 0x87, 0x20, 0x00, 0xe1, 0xa0, 0x00, 0x00, + 0xe1, 0xa0, 0x20, 0x0d, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xd0, 0x90, 0xe1, 0xa0, 0x00, 0x00, + 0xe9, 0x2d, 0x5f, 0xfe, 0xe1, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x0f, 0xe8, 0xbd, 0x5f, 0xfe, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0xd0, 0x02, 0xe3, 0x10, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x02, + 0xe1, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0xeb, 0x00, 0x00, 0x05, 0xe3, 0x18, 0x00, 0x01, + 0x0a, 0x00, 0x00, 0x01, 0xe5, 0x9f, 0xf0, 0x58, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x54, + 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xa0, 0x00, 0x00, 0xe5, 0x9f, 0x20, 0x4c, + 0xe1, 0x2f, 0xff, 0x12, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x13, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xee, 0x03, 0x0f, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x45, 0x48, 0x43, 0x5f, 0x43, 0x46, 0x47, 0x00, + 0x12, 0x34, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x13, 0x70, 0x0e, 0x2d, 0x13, 0x72, 0xc0, 0x00, + 0x13, 0x72, 0xf5, 0xa8, 0xff, 0xff, 0x1e, 0x80, 0xff, 0xff, 0x1e, 0x9c, 0xff, 0xff, 0x1d, 0x44, + 0x13, 0x70, 0x0c, 0x59, 0xe1, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x11, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xf5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x07, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xff, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb5, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x0d, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xd2, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2d, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x29, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x2f, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xeb, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd3, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xa1, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x15, 0x1f, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xe7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xc5, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xed, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xef, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0xb7, 0x46, 0xc0, 0x47, 0x78, 0xea, 0xff, 0xff, 0x89, + 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xd1, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x14, 0xad, + 0xb5, 0x00, 0x28, 0x02, 0xd0, 0x11, 0x28, 0x02, 0xd8, 0x04, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, + 0xd1, 0x04, 0xe0, 0x08, 0x28, 0x10, 0xd0, 0x0d, 0x28, 0x11, 0xd0, 0x0d, 0x48, 0x08, 0xe0, 0x0c, + 0x4b, 0x08, 0x68, 0x18, 0xe0, 0x09, 0x48, 0x08, 0xe0, 0x07, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, + 0x20, 0x00, 0xe0, 0x02, 0x48, 0x06, 0xe0, 0x00, 0x48, 0x06, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xff, 0xff, 0xfd, 0x66, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x4a, 0xd5, 0x13, 0x70, 0x67, 0x40, + 0x13, 0x70, 0x43, 0xb1, 0x13, 0x70, 0x42, 0xe5, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x0c, 0xf7, 0xff, + 0xff, 0x8f, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x27, 0x2c, 0x00, 0xd0, 0x25, 0x68, 0x24, 0x2c, 0x00, + 0xd0, 0x22, 0x78, 0x22, 0x78, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x78, 0xa2, 0x02, 0x12, + 0x43, 0x1a, 0x78, 0xe3, 0x43, 0x13, 0x2b, 0x06, 0xd1, 0x16, 0x7b, 0x23, 0x7b, 0x62, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, 0x43, 0x1a, 0x2a, 0x7a, + 0xd0, 0x02, 0x2a, 0x88, 0xd1, 0x08, 0xe0, 0x02, 0x48, 0x06, 0x21, 0x15, 0xe0, 0x01, 0x48, 0x05, + 0x21, 0x14, 0x1c, 0x22, 0xf0, 0x04, 0xfc, 0x82, 0xb0, 0x01, 0x1c, 0x28, 0xbc, 0x30, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x02, 0xe1, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0x87, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xff, 0x6e, 0x0e, 0x2b, 0x73, 0x23, + 0x0c, 0x2b, 0x73, 0x63, 0x0a, 0x2b, 0x73, 0xa3, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, 0x06, 0x1b, + 0x43, 0x1a, 0x7c, 0xa3, 0x73, 0xe5, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x06, 0x2d, 0x43, 0x1a, + 0x1c, 0x20, 0x60, 0x15, 0x30, 0x0c, 0x21, 0x04, 0xf7, 0xff, 0xff, 0x46, 0x7c, 0x23, 0x7c, 0x62, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0xa3, 0x7c, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, + 0x21, 0x04, 0xf7, 0xff, 0xff, 0x39, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x46, 0x20, 0x00, 0xbc, 0x70, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8f, 0x90, 0x08, 0x91, 0x07, 0x1c, 0x08, 0x1c, 0x11, + 0x92, 0x06, 0x92, 0x09, 0xf7, 0xff, 0xff, 0x30, 0x4c, 0x7f, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x00, + 0xe0, 0xec, 0xa8, 0x0d, 0xf0, 0x01, 0xf9, 0x0e, 0x4b, 0x7c, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x04, + 0x23, 0x80, 0x9a, 0x0d, 0x01, 0x1b, 0x42, 0x9a, 0xd0, 0x04, 0x4a, 0x79, 0x23, 0x01, 0x42, 0x5b, + 0x60, 0x13, 0xe0, 0xdb, 0x4d, 0x77, 0x68, 0x2a, 0x2a, 0x00, 0xdb, 0x63, 0x4b, 0x76, 0x42, 0x9a, + 0xd0, 0x60, 0x4a, 0x73, 0x68, 0x13, 0x1c, 0x58, 0xd1, 0x5c, 0x1c, 0x2e, 0x4a, 0x6e, 0x49, 0x71, + 0x68, 0x13, 0x68, 0x08, 0x33, 0x1f, 0x21, 0x1f, 0x1c, 0x1c, 0x43, 0x8c, 0x1c, 0x07, 0x21, 0x10, + 0x1c, 0x22, 0x37, 0x10, 0xf0, 0x03, 0xff, 0xf8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xbe, 0x78, 0x23, + 0x2b, 0x43, 0xd1, 0x0a, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x07, 0x78, 0xa3, 0x2b, 0x53, 0xd1, 0x04, + 0x78, 0xe3, 0x2b, 0x4f, 0xd1, 0x01, 0x4b, 0x64, 0xe0, 0x07, 0x68, 0x33, 0x2b, 0x00, 0xd0, 0x02, + 0x23, 0x00, 0x60, 0x33, 0xe7, 0xda, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x2b, 0x79, 0x62, 0x79, 0xa3, + 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2, 0x79, 0x23, 0x4e, 0x5c, 0x18, 0xd2, 0x79, 0xe3, 0x4d, 0x5c, + 0x06, 0x1b, 0x18, 0xd2, 0x0a, 0xd2, 0x60, 0x32, 0x22, 0x80, 0x01, 0x12, 0x1c, 0x28, 0x21, 0x00, + 0xf0, 0x05, 0xfa, 0x68, 0x4b, 0x53, 0x68, 0x1a, 0x4b, 0x53, 0x42, 0x9a, 0xd1, 0x1a, 0x68, 0x36, + 0x20, 0x00, 0x46, 0xb4, 0x4e, 0x53, 0x22, 0x07, 0x40, 0x02, 0xd1, 0x02, 0x10, 0xc3, 0x00, 0x9b, + 0x51, 0x9f, 0x18, 0x23, 0x7a, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x21, 0x01, 0x10, 0xc3, 0x40, 0x91, + 0x1c, 0x0a, 0x5c, 0xe9, 0x44, 0x67, 0x43, 0x0a, 0x54, 0xea, 0x23, 0x80, 0x30, 0x01, 0x01, 0xdb, + 0x42, 0x98, 0xd1, 0xe8, 0x4b, 0x40, 0x22, 0x1f, 0x68, 0x1b, 0x33, 0x1f, 0x43, 0x93, 0x93, 0x0b, + 0x9a, 0x07, 0x23, 0x80, 0x02, 0x1b, 0x92, 0x0a, 0x93, 0x05, 0xe0, 0x63, 0x98, 0x08, 0x4a, 0x3c, + 0x0a, 0x43, 0x1c, 0x1d, 0x21, 0x0f, 0x68, 0x13, 0x43, 0x8d, 0x42, 0x9d, 0xd0, 0x3a, 0x4b, 0x39, + 0x60, 0x15, 0x68, 0x1a, 0x4b, 0x38, 0x42, 0x9a, 0xd1, 0x1e, 0x4b, 0x38, 0x1c, 0x28, 0x68, 0x1c, + 0x27, 0x07, 0x1c, 0x21, 0xf0, 0x05, 0xf8, 0xe8, 0x4a, 0x36, 0x08, 0xc6, 0x00, 0xb3, 0x58, 0x99, + 0x4b, 0x33, 0x40, 0x07, 0x20, 0x01, 0x22, 0x00, 0x93, 0x01, 0x46, 0x84, 0xe0, 0x07, 0x98, 0x01, + 0x5d, 0x83, 0x46, 0x60, 0x41, 0x13, 0x42, 0x03, 0xd0, 0x00, 0x19, 0x09, 0x32, 0x01, 0x42, 0xba, + 0xd3, 0xf5, 0x1e, 0x63, 0x40, 0x2b, 0x18, 0xcd, 0x4b, 0x24, 0x68, 0x1b, 0x1b, 0x5c, 0x2c, 0x10, + 0xdc, 0x3a, 0x2c, 0x10, 0xd0, 0x07, 0x22, 0x80, 0x98, 0x0b, 0x21, 0x00, 0x02, 0x12, 0xf0, 0x05, + 0xfa, 0x01, 0x2c, 0x00, 0xdd, 0x06, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x0b, 0xf0, 0x03, 0xff, 0x5c, + 0x28, 0x00, 0xd0, 0x23, 0x99, 0x08, 0x4b, 0x20, 0x9a, 0x05, 0x40, 0x0b, 0x00, 0x9b, 0x98, 0x06, + 0x1a, 0xd1, 0x42, 0x81, 0xd8, 0x01, 0x1c, 0x0c, 0xe0, 0x00, 0x9c, 0x06, 0x9a, 0x0b, 0x98, 0x0a, + 0x18, 0xd1, 0x1c, 0x22, 0xf0, 0x05, 0xf9, 0xa2, 0x98, 0x0a, 0x1c, 0x21, 0xf7, 0xff, 0xfe, 0x4c, + 0x9b, 0x0a, 0x98, 0x06, 0x19, 0x1b, 0x99, 0x08, 0x93, 0x0a, 0x10, 0xa3, 0x1b, 0x00, 0x18, 0xc9, + 0x90, 0x06, 0x91, 0x08, 0x9a, 0x06, 0x2a, 0x00, 0xd1, 0x98, 0xe0, 0x07, 0x20, 0x80, 0x02, 0x00, + 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x24, 0x10, 0xe7, 0xcc, 0x98, 0x07, 0x99, 0x09, + 0xf7, 0xff, 0xfe, 0x12, 0x20, 0x00, 0xe7, 0xf3, 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0x4c, + 0x13, 0x70, 0x60, 0x10, 0x13, 0x70, 0x60, 0x14, 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x50, + 0x13, 0x70, 0x78, 0x00, 0x13, 0x70, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xb5, 0xf0, 0x4b, 0xc9, + 0xb0, 0x93, 0x68, 0x18, 0x21, 0x80, 0xf7, 0xff, 0xfe, 0x23, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0x24, + 0x90, 0x0a, 0xf0, 0x00, 0xfc, 0x0d, 0xf7, 0xff, 0xfd, 0xff, 0x21, 0x78, 0xf7, 0xff, 0xfd, 0xd0, + 0x99, 0x0a, 0x48, 0xc1, 0xf7, 0xff, 0xfe, 0x20, 0x48, 0xc0, 0x9a, 0x0a, 0x23, 0x00, 0x1c, 0x01, + 0xf7, 0xff, 0xfd, 0xd2, 0x49, 0xbe, 0x90, 0x08, 0x20, 0xcd, 0xf0, 0x04, 0xfb, 0x71, 0x22, 0x00, + 0x92, 0x09, 0x92, 0x0b, 0x92, 0x0c, 0x92, 0x0d, 0x4b, 0xba, 0x4a, 0xbb, 0x26, 0x01, 0x93, 0x05, + 0x92, 0x04, 0xe0, 0x00, 0x26, 0x00, 0x98, 0x0a, 0xa9, 0x11, 0x22, 0x00, 0xf7, 0xff, 0xfd, 0xd8, + 0x90, 0x10, 0x9b, 0x10, 0x2b, 0x00, 0xd1, 0xf6, 0x2e, 0x00, 0xd0, 0x02, 0x98, 0x08, 0xf7, 0xff, + 0xfd, 0xab, 0x9a, 0x05, 0x9c, 0x11, 0x23, 0x00, 0x60, 0x13, 0x2c, 0x00, 0xd1, 0x54, 0x4b, 0xaf, + 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0xae, 0x68, 0x1a, 0x2a, 0x00, 0xd1, 0x01, 0x4b, 0xaa, + 0x60, 0x1a, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0xdd, 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0xd9, + 0x4b, 0xa7, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0xd5, 0x4b, 0xa6, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x09, + 0xf0, 0x03, 0xfd, 0x96, 0x28, 0x00, 0xd0, 0x05, 0xf0, 0x03, 0xfd, 0x92, 0x28, 0x00, 0xd0, 0x01, + 0xf0, 0x03, 0xfd, 0x8e, 0x4b, 0x9f, 0x68, 0x1e, 0x2e, 0x00, 0xd1, 0x23, 0x4f, 0x9e, 0x4a, 0x9f, + 0x68, 0x3b, 0x3b, 0x01, 0x42, 0x93, 0xd8, 0x1d, 0x4c, 0x96, 0x4d, 0x9d, 0x23, 0x01, 0x60, 0x23, + 0x68, 0x28, 0x4a, 0x9c, 0x21, 0x01, 0xf0, 0x03, 0xfe, 0x9f, 0x60, 0x26, 0x28, 0x00, 0xd0, 0x09, + 0x23, 0x80, 0x68, 0x3a, 0x00, 0x9b, 0x42, 0x9a, 0xd1, 0x04, 0x68, 0x2b, 0x22, 0x80, 0x02, 0x12, + 0x18, 0x9b, 0x60, 0x2b, 0x49, 0x92, 0x4b, 0x94, 0x68, 0x0a, 0x68, 0x1b, 0x42, 0x9a, 0xd3, 0x01, + 0x23, 0x00, 0x60, 0x0b, 0x4b, 0x8a, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x9b, 0x98, 0x08, 0x49, 0x83, + 0xf7, 0xff, 0xfd, 0x8e, 0x26, 0x01, 0xe7, 0x96, 0x78, 0x23, 0x78, 0x62, 0x06, 0x1b, 0x04, 0x12, + 0x43, 0x1a, 0x78, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x2e, 0x02, + 0xd0, 0x59, 0x2e, 0x02, 0xd8, 0x02, 0x2e, 0x01, 0xd1, 0x04, 0xe0, 0x07, 0x2e, 0x06, 0xd0, 0x03, + 0x2e, 0x07, 0xd0, 0x67, 0x25, 0x01, 0xe0, 0x30, 0x25, 0x01, 0xe2, 0x4f, 0x7b, 0x23, 0x7b, 0x62, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0xa3, 0x49, 0x6f, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x1c, 0x28, 0xf0, 0x05, 0xf9, 0x4d, 0x28, 0x00, 0xd1, 0x16, 0x7d, 0x23, + 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x9b, 0x0c, 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x2d, 0x4b, 0x68, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x00, 0xe2, 0x28, 0xf0, 0x04, 0xf8, 0x2b, 0xe2, 0x25, 0x49, 0x6b, 0x1c, 0x28, + 0xf0, 0x05, 0xf9, 0x30, 0x28, 0x00, 0xd0, 0x02, 0x25, 0x06, 0x42, 0x6d, 0xe2, 0x1e, 0x7d, 0x23, + 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7d, 0xe2, + 0x1c, 0x15, 0x43, 0x1d, 0x4b, 0x5a, 0x60, 0x1e, 0x4b, 0x57, 0x60, 0x18, 0x48, 0x60, 0xf0, 0x00, + 0xfa, 0x6d, 0x4b, 0x60, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfd, 0xe2, + 0x23, 0x00, 0x93, 0x09, 0xe2, 0x02, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xe2, 0x1c, 0x10, 0x9a, 0x0b, 0x43, 0x18, 0x42, 0x82, + 0xd1, 0x02, 0x23, 0x00, 0x93, 0x0b, 0xe0, 0x03, 0xf0, 0x00, 0xfd, 0xee, 0xf0, 0x00, 0xfd, 0xe2, + 0x25, 0x00, 0xe1, 0xeb, 0x7e, 0x23, 0x7e, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7e, 0xa3, + 0x02, 0x1b, 0x43, 0x13, 0x7e, 0xe2, 0x1c, 0x16, 0x43, 0x1e, 0x7c, 0x62, 0x7c, 0x23, 0x04, 0x12, + 0x06, 0x1b, 0x43, 0x1a, 0x7c, 0xa3, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0xe2, 0x43, 0x1a, 0x92, 0x06, + 0x7d, 0x23, 0x7d, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0xa3, 0x02, 0x1b, 0x43, 0x13, + 0x7d, 0xe2, 0x1c, 0x15, 0x43, 0x1d, 0x7b, 0x23, 0x2b, 0x00, 0xd1, 0x02, 0x9a, 0x0b, 0x2a, 0x00, + 0xd0, 0x01, 0x27, 0x00, 0xe0, 0x0c, 0x7a, 0x23, 0x7a, 0x62, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0xa3, 0x7a, 0xe0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x00, 0xfd, 0xb5, 0x1c, 0x07, + 0x9b, 0x06, 0x1c, 0x30, 0x18, 0xed, 0x00, 0xe9, 0x95, 0x07, 0x1c, 0x34, 0xf7, 0xff, 0xfc, 0xac, + 0x25, 0x00, 0xe0, 0x05, 0x68, 0x20, 0x68, 0x61, 0xf7, 0xff, 0xfc, 0xa6, 0x35, 0x01, 0x34, 0x08, + 0x9a, 0x07, 0x42, 0x95, 0xdb, 0xf6, 0x4c, 0x22, 0x68, 0x20, 0x28, 0x00, 0xd0, 0x00, 0xe1, 0x87, + 0x99, 0x11, 0x7b, 0x0b, 0x7b, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7b, 0x8b, 0x02, 0x1b, + 0x43, 0x13, 0x7b, 0xca, 0x43, 0x1a, 0x4b, 0x24, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xf6, 0x42, 0x9a, + 0xd8, 0x46, 0x2a, 0x06, 0xd8, 0x0b, 0x2a, 0x05, 0xd3, 0x00, 0xe0, 0xd0, 0x2a, 0x01, 0xd1, 0x00, + 0xe0, 0x92, 0x2a, 0x00, 0xd0, 0x6c, 0x2a, 0x02, 0xd0, 0x00, 0xe1, 0x01, 0xe0, 0xc7, 0x2a, 0x1b, + 0xd8, 0x06, 0x2a, 0x1a, 0xd3, 0x00, 0xe0, 0x9f, 0x2a, 0x0c, 0xd0, 0x00, 0xe0, 0xf8, 0xe0, 0x8f, + 0x4b, 0x16, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x9a, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xef, + 0xe0, 0xc7, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x50, 0x00, 0x98, 0x96, 0x80, + 0x13, 0x70, 0x02, 0x19, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x60, 0x0c, 0x13, 0x70, 0x67, 0x48, + 0x13, 0x70, 0x67, 0x40, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc3, 0xa0, 0x00, 0x00, 0x0f, 0xfe, + 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x68, 0x00, 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x60, 0x5c, + 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x55, 0x4d, 0x53, 0x03, 0x55, 0x4d, 0x53, 0x01, + 0x4b, 0xac, 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0x86, 0x42, 0x9a, 0xd8, 0x12, 0x3b, 0x7b, 0x42, 0x9a, + 0xd1, 0x00, 0xe0, 0xb4, 0x42, 0x9a, 0xd8, 0x04, 0x3b, 0x02, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xb7, + 0xe0, 0xa5, 0x4b, 0xa5, 0x42, 0x9a, 0xd0, 0x72, 0x33, 0x70, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xaf, + 0xe0, 0xaa, 0x4b, 0xa2, 0x42, 0x9a, 0xd1, 0x00, 0xe1, 0x06, 0x42, 0x9a, 0xd8, 0x07, 0x4b, 0xa0, + 0x42, 0x9a, 0xd0, 0x6e, 0x4b, 0x9f, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0xa1, 0xe0, 0xa2, 0x4b, 0x9e, + 0x42, 0x9a, 0xd1, 0x00, 0xe0, 0xed, 0x33, 0x01, 0x42, 0x9a, 0xd0, 0x00, 0xe0, 0x98, 0xe0, 0xde, + 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xfe, 0x69, 0x33, 0x88, 0x18, 0x69, 0xb3, 0x88, 0x1c, 0x6a, 0x33, + 0x88, 0x1d, 0x68, 0x33, 0x78, 0x19, 0x68, 0xb3, 0x78, 0x1a, 0x02, 0x03, 0x0a, 0x00, 0x43, 0x03, + 0x02, 0x20, 0x0a, 0x24, 0x43, 0x20, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x02, 0x28, 0x0a, 0x2d, + 0x43, 0x28, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x6b, 0x30, 0x04, 0x1b, 0x90, 0x02, 0x0c, 0x1b, + 0x1c, 0x38, 0xf0, 0x01, 0xfe, 0x95, 0xe0, 0x60, 0x2f, 0x00, 0xd1, 0x00, 0xe0, 0xda, 0x68, 0x33, + 0x1c, 0x38, 0x78, 0x19, 0x68, 0xb3, 0x88, 0x1a, 0x69, 0x33, 0xf0, 0x01, 0xfd, 0x87, 0xe0, 0x54, + 0x2f, 0x00, 0xd0, 0x00, 0xe0, 0xce, 0x68, 0x33, 0x69, 0x32, 0x78, 0x18, 0x68, 0xb3, 0x78, 0x19, + 0x69, 0xb3, 0xf0, 0x00, 0xfc, 0xed, 0xe0, 0x48, 0x25, 0x01, 0x24, 0x00, 0xe0, 0xc5, 0xf0, 0x03, + 0xfd, 0xef, 0x1c, 0x05, 0x28, 0x00, 0xda, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x4a, 0x77, 0x23, 0x01, + 0x60, 0x13, 0x99, 0x11, 0x93, 0x09, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x7a, 0x8b, 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x43, 0x1a, 0x92, 0x0b, 0xe0, 0xac, 0x4b, 0x6f, + 0x22, 0x00, 0x60, 0x18, 0xe0, 0x6a, 0x68, 0x32, 0x4b, 0x6d, 0x68, 0x12, 0x60, 0x1a, 0x25, 0x00, + 0xe0, 0xa2, 0x23, 0x01, 0x60, 0x23, 0x4b, 0x69, 0x60, 0x18, 0x48, 0x6a, 0xf0, 0x00, 0xf9, 0x0e, + 0x4b, 0x69, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xf0, 0x00, 0xfc, 0x83, 0x23, 0x00, + 0x93, 0x09, 0x4c, 0x66, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xa5, 0x4b, 0x65, 0x1c, 0x05, 0x60, 0x18, + 0x68, 0x32, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x87, 0x68, 0x23, 0xe0, 0x68, 0x68, 0x33, 0x69, 0x32, + 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0xa7, 0x1c, 0x05, 0xe0, 0x7c, 0x68, 0x33, + 0x69, 0x32, 0x68, 0x18, 0x68, 0xb3, 0x68, 0x19, 0xf0, 0x03, 0xfc, 0x38, 0xe7, 0xf5, 0x4b, 0x59, + 0x68, 0x1a, 0x42, 0x51, 0x41, 0x4a, 0xe7, 0xc9, 0x68, 0x32, 0x4b, 0x50, 0x68, 0x12, 0x60, 0x1a, + 0x25, 0x01, 0xe0, 0x69, 0x7a, 0x0b, 0x7a, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0x8b, + 0x02, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x21, 0x00, 0x43, 0x1a, 0x92, 0x0b, 0x91, 0x0f, 0x68, 0x34, + 0x78, 0x23, 0x2b, 0x5f, 0xd1, 0x1c, 0x78, 0x63, 0x2b, 0x44, 0xd1, 0x19, 0x78, 0xa3, 0x2b, 0x56, + 0xd1, 0x16, 0x78, 0xe3, 0x2b, 0x44, 0xd1, 0x13, 0x4b, 0x40, 0x4c, 0x47, 0x22, 0x01, 0x60, 0x1a, + 0x60, 0x21, 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x06, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, + 0xfe, 0xc5, 0x9b, 0x0f, 0x60, 0x23, 0xf0, 0x04, 0xf8, 0x1f, 0x22, 0x01, 0x92, 0x09, 0xe7, 0x96, + 0x68, 0xf3, 0x2b, 0x04, 0xd1, 0x04, 0x68, 0xb1, 0xa8, 0x0f, 0x22, 0x04, 0xf0, 0x04, 0xfe, 0xb6, + 0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x03, 0xff, 0x8c, 0x90, 0x0d, 0x28, 0x00, 0xd1, 0x02, 0x23, 0x01, + 0x93, 0x09, 0xe0, 0x25, 0x4a, 0x2d, 0x23, 0x01, 0x60, 0x13, 0x93, 0x09, 0xe7, 0x7f, 0xf0, 0x03, + 0xfd, 0x01, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x1f, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x60, 0x13, + 0xe0, 0x1a, 0x4a, 0x26, 0x23, 0x01, 0x60, 0x13, 0x68, 0x33, 0x69, 0x31, 0x68, 0x18, 0x68, 0xb3, + 0x68, 0x1a, 0xf7, 0xff, 0xfc, 0x07, 0xe7, 0x90, 0x9a, 0x0d, 0x2a, 0x00, 0xd0, 0x08, 0x68, 0x33, + 0x69, 0x32, 0x68, 0x19, 0x68, 0xb3, 0x98, 0x0d, 0x68, 0x1b, 0xf0, 0x04, 0xf8, 0xb5, 0xe7, 0x5e, + 0x25, 0x01, 0xe0, 0x00, 0x25, 0x06, 0x42, 0x6d, 0x24, 0x01, 0x9a, 0x06, 0x00, 0xd3, 0x18, 0xf6, + 0x1c, 0x17, 0xe0, 0x05, 0x68, 0x30, 0x68, 0x71, 0xf7, 0xff, 0xfb, 0x26, 0x37, 0x01, 0x36, 0x08, + 0x9b, 0x07, 0x42, 0x9f, 0xdb, 0xf6, 0xe0, 0x02, 0x22, 0x01, 0x92, 0x0c, 0x24, 0x01, 0x9a, 0x04, + 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x01, 0x26, 0x00, 0xe0, 0x04, 0x98, 0x08, 0x49, 0x14, 0xf7, 0xff, + 0xfb, 0x17, 0x26, 0x01, 0x2c, 0x00, 0xd1, 0x00, 0xe5, 0x1d, 0x98, 0x11, 0x1c, 0x29, 0xf7, 0xff, + 0xfa, 0xff, 0xe5, 0x18, 0x55, 0x4d, 0x53, 0x81, 0x55, 0x4d, 0x53, 0x10, 0x57, 0x46, 0x53, 0x02, + 0x55, 0x4d, 0x53, 0x82, 0x57, 0x46, 0x53, 0x01, 0x57, 0x46, 0x53, 0x03, 0x13, 0x70, 0x60, 0x0c, + 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x12, 0x99, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc3, 0xa0, + 0x13, 0x72, 0xc3, 0xa4, 0x13, 0x70, 0x67, 0x44, 0x13, 0x70, 0x60, 0x14, 0x13, 0x70, 0x60, 0x10, + 0x00, 0x98, 0x96, 0x80, 0xb5, 0x00, 0x4b, 0x04, 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xff, + 0xfa, 0xbb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x28, 0xb5, 0x00, 0x4b, 0x0d, + 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, 0xf7, 0xff, 0xfa, 0xea, 0x28, 0x00, 0xd1, 0x0d, + 0x48, 0x09, 0xf7, 0xff, 0xfa, 0xb9, 0xf0, 0x03, 0xff, 0xcd, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x7c, + 0xf0, 0x03, 0xff, 0xbc, 0x20, 0xc8, 0xf0, 0x00, 0xfa, 0x77, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x6c, 0x4b, 0x02, 0x4a, 0x03, + 0x60, 0x18, 0x23, 0x00, 0x60, 0x13, 0x47, 0x70, 0x13, 0x70, 0x67, 0x60, 0x13, 0x70, 0x67, 0x58, + 0xb5, 0xf0, 0x4f, 0x1d, 0x21, 0x10, 0x68, 0x3b, 0x4d, 0x1c, 0x43, 0x8b, 0x60, 0x3b, 0x68, 0x2b, + 0x4e, 0x1b, 0x68, 0x9a, 0x68, 0x33, 0xb0, 0x81, 0x68, 0x54, 0x2b, 0x00, 0xd0, 0x11, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x36, 0x28, 0x00, 0xdc, 0x13, 0x23, 0x00, 0x60, 0x33, 0x4b, 0x15, 0x60, 0x18, + 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x75, 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, + 0xe0, 0x14, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x04, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, + 0x68, 0x2b, 0x68, 0x9a, 0x23, 0x37, 0x40, 0x23, 0x60, 0x53, 0x68, 0x3b, 0x22, 0x10, 0x43, 0x13, + 0x4a, 0x0a, 0x60, 0x3b, 0x68, 0x13, 0x21, 0x10, 0x43, 0x0b, 0x60, 0x13, 0xb0, 0x01, 0x20, 0x00, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x67, 0x5c, 0x13, 0x70, 0x67, 0x60, 0x0d, 0x80, 0x00, 0x38, + 0x47, 0x18, 0x46, 0xc0, 0xb5, 0x70, 0x4d, 0x15, 0x4b, 0x15, 0x26, 0x02, 0x42, 0x76, 0x1c, 0x29, + 0x68, 0x18, 0x22, 0x00, 0x60, 0x2e, 0xf7, 0xff, 0xfa, 0x4b, 0x4b, 0x12, 0x22, 0x00, 0x68, 0x1b, + 0x4c, 0x11, 0x68, 0x9b, 0x60, 0x9a, 0x4b, 0x11, 0x68, 0x20, 0x60, 0x1a, 0xf7, 0xff, 0xfa, 0x1c, + 0x68, 0x20, 0xf7, 0xff, 0xfa, 0x1d, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x23, 0x68, 0x2b, 0x2b, 0x00, + 0xd1, 0x03, 0x4b, 0x0b, 0x68, 0x1b, 0x60, 0x2b, 0xe0, 0x00, 0x60, 0x2e, 0x20, 0x04, 0xf7, 0xff, + 0xfa, 0x27, 0x4b, 0x02, 0x68, 0x18, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x64, + 0x13, 0x70, 0x60, 0x18, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x1c, 0x13, 0x70, 0x67, 0x58, + 0x13, 0x70, 0x67, 0x5c, 0xb5, 0x10, 0x4b, 0x0f, 0x1c, 0x04, 0x68, 0x1a, 0x1c, 0x08, 0x23, 0x01, + 0x49, 0x0d, 0xf7, 0xff, 0xf9, 0xf9, 0x4b, 0x0d, 0x21, 0x10, 0x60, 0x18, 0x48, 0x0c, 0xf0, 0x03, + 0xff, 0x47, 0x21, 0x10, 0x48, 0x0b, 0xf0, 0x03, 0xff, 0x37, 0x4b, 0x0b, 0x20, 0x04, 0x60, 0x1c, + 0x4b, 0x0a, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x37, 0x60, 0x93, 0xf7, 0xff, 0xf9, 0xf9, 0xbc, 0x10, + 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x18, 0x05, 0xf5, 0xe1, 0x00, 0x13, 0x70, 0x60, 0x1c, + 0x0d, 0x80, 0x00, 0x38, 0x0d, 0x80, 0x00, 0x3c, 0x13, 0x70, 0x67, 0x58, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0x30, 0x4d, 0x11, 0x4a, 0x11, 0x68, 0x2b, 0xb0, 0x81, 0x40, 0x13, 0x60, 0x2b, 0x20, 0x80, + 0xf0, 0x03, 0xfd, 0xc0, 0x21, 0x20, 0xf7, 0xff, 0xfa, 0x07, 0x4c, 0x0d, 0x60, 0x20, 0x20, 0x04, + 0xf7, 0xff, 0xf9, 0xee, 0x68, 0x21, 0x22, 0x00, 0x20, 0x04, 0xf7, 0xff, 0xfa, 0x11, 0x68, 0x2a, + 0x23, 0x80, 0x02, 0x1b, 0x43, 0x1a, 0x60, 0x2a, 0x20, 0x04, 0xf7, 0xff, 0xf9, 0xc9, 0xb0, 0x01, + 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x0d, 0x04, 0x00, 0xcc, 0xff, 0xff, 0x7f, 0xff, + 0x13, 0x70, 0x60, 0x18, 0xb5, 0x00, 0x4b, 0x06, 0x02, 0xc0, 0x68, 0x1a, 0x1c, 0x19, 0x68, 0x0b, + 0x1a, 0x9b, 0xd5, 0x00, 0x68, 0x0a, 0x42, 0x83, 0xd9, 0xf9, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, + 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x00, 0x4b, 0x19, 0x4a, 0x19, 0x78, 0x1b, 0xb0, 0x81, 0x1e, 0x59, + 0x41, 0x8b, 0x60, 0x13, 0xf0, 0x03, 0xff, 0x1c, 0x1c, 0x03, 0x48, 0x16, 0x21, 0x04, 0x60, 0x03, + 0xf7, 0xff, 0xf9, 0xba, 0xf0, 0x03, 0xff, 0x08, 0x22, 0x00, 0x1c, 0x01, 0x48, 0x12, 0xf0, 0x03, + 0xfe, 0xbd, 0x21, 0xa0, 0x02, 0x49, 0x48, 0x11, 0xf7, 0xff, 0xf9, 0x6e, 0x4b, 0x10, 0x21, 0x80, + 0x60, 0x18, 0xf7, 0xff, 0xf9, 0xb5, 0x21, 0x20, 0xf7, 0xff, 0xf9, 0xb6, 0x4b, 0x0d, 0x60, 0x18, + 0xf0, 0x00, 0xfd, 0x7c, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x02, 0xf7, 0xff, + 0xfb, 0x7d, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, + 0x13, 0x70, 0x67, 0x78, 0x13, 0x72, 0xc0, 0x00, 0x13, 0x70, 0x0f, 0x21, 0x13, 0x71, 0x80, 0x00, + 0x13, 0x70, 0x60, 0x28, 0x13, 0x70, 0x60, 0x20, 0xb5, 0x70, 0x1c, 0x0c, 0x1c, 0x05, 0xf7, 0xff, + 0xf9, 0x9f, 0x1c, 0x06, 0x20, 0x01, 0x42, 0x40, 0xf7, 0xff, 0xf9, 0x86, 0x68, 0x22, 0x4b, 0x11, + 0x42, 0x9a, 0xd1, 0x18, 0x4b, 0x10, 0x49, 0x11, 0x22, 0x01, 0x43, 0x13, 0x60, 0x4b, 0x22, 0x08, + 0x1c, 0x20, 0xf0, 0x04, 0xfc, 0xc3, 0x1c, 0x20, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x65, 0x1b, 0x63, + 0x4a, 0x0b, 0x08, 0x9b, 0x3b, 0x02, 0x40, 0x13, 0x4a, 0x0a, 0x1c, 0x28, 0x43, 0x13, 0x60, 0x2b, + 0x21, 0x04, 0xf7, 0xff, 0xf9, 0x59, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0x66, 0xbc, 0x70, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xe6, 0x00, 0x01, 0x70, 0x13, 0x70, 0x02, 0x71, 0x13, 0x70, 0x60, 0x2c, + 0x00, 0xff, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0xb5, 0x30, 0x1c, 0x04, 0xb0, 0x81, 0xf7, 0xff, + 0xf9, 0x1f, 0x2c, 0x26, 0xd0, 0x42, 0x2c, 0x26, 0xd8, 0x05, 0x2c, 0x24, 0xd0, 0x09, 0x2c, 0x25, + 0xd0, 0x00, 0xe0, 0x97, 0xe0, 0x0e, 0x2c, 0x39, 0xd0, 0x64, 0x2c, 0x3c, 0xd0, 0x00, 0xe0, 0x91, + 0xe0, 0x62, 0x49, 0x4b, 0x4b, 0x4b, 0x48, 0x4c, 0x60, 0x4b, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x86, + 0x48, 0x49, 0xe0, 0x84, 0x49, 0x49, 0x48, 0x4a, 0xf7, 0xff, 0xff, 0xa6, 0x4c, 0x44, 0x48, 0x49, + 0x4b, 0x49, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, + 0xf9, 0x1b, 0x48, 0x46, 0x4b, 0x46, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, + 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x11, 0x48, 0x43, 0x4b, 0x43, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf9, 0x07, 0x4b, 0x36, 0x48, 0x3f, 0x60, 0x63, + 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x5a, 0x48, 0x3c, 0xe0, 0x58, 0x49, 0x3c, 0x48, 0x3d, + 0xf7, 0xff, 0xff, 0x7a, 0x4c, 0x2e, 0x48, 0x33, 0x4b, 0x3b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xef, 0x48, 0x30, 0x4b, 0x37, 0x1c, 0x22, + 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xe5, 0x48, 0x2d, + 0x4b, 0x33, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, + 0xf8, 0xdb, 0x4b, 0x20, 0x48, 0x2f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x2e, + 0x48, 0x2c, 0xe0, 0x2c, 0x48, 0x2c, 0xe0, 0x00, 0x48, 0x2c, 0x49, 0x2d, 0xf7, 0xff, 0xff, 0x4c, + 0x4c, 0x17, 0x48, 0x1c, 0x4b, 0x2b, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, + 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xc1, 0x48, 0x19, 0x4b, 0x27, 0x1c, 0x22, 0x60, 0x63, 0x1c, 0x03, + 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x16, 0x4b, 0x23, 0x1c, 0x22, + 0x60, 0x63, 0x1c, 0x03, 0xca, 0x22, 0xc3, 0x22, 0x21, 0x08, 0xf7, 0xff, 0xf8, 0xad, 0x4b, 0x09, + 0x48, 0x1f, 0x60, 0x63, 0x1c, 0x21, 0x22, 0x08, 0xf0, 0x04, 0xfc, 0x00, 0x48, 0x1c, 0x21, 0x08, + 0xf7, 0xff, 0xf8, 0xa2, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x2c, 0x13, 0x70, 0x00, 0x60, 0xff, 0xff, 0x1e, 0x78, 0x20, 0x20, 0x40, 0x8c, + 0x20, 0x20, 0x5d, 0xe8, 0x13, 0x70, 0x00, 0xbc, 0xff, 0xff, 0x1f, 0x70, 0x13, 0x70, 0x00, 0xc4, + 0xff, 0xff, 0x1f, 0x8c, 0x13, 0x70, 0x00, 0xcc, 0xff, 0xff, 0x1e, 0x34, 0xff, 0xff, 0x1f, 0x68, + 0x20, 0x20, 0x3e, 0x6c, 0x20, 0x20, 0x5b, 0x14, 0xff, 0xff, 0x1e, 0xb0, 0xff, 0xff, 0x1e, 0xcc, + 0xff, 0xff, 0x1d, 0x74, 0xff, 0xff, 0x1e, 0xa8, 0x20, 0x20, 0x5e, 0x84, 0x20, 0x20, 0x5d, 0x94, + 0x20, 0x20, 0x3f, 0x60, 0xff, 0xff, 0x21, 0x30, 0xff, 0xff, 0x21, 0x4c, 0xff, 0xff, 0x1f, 0xf4, + 0xff, 0xff, 0x21, 0x28, 0xb5, 0x30, 0x4d, 0x0c, 0xb0, 0x81, 0x23, 0x00, 0x68, 0x2a, 0x49, 0x0b, + 0xf7, 0xff, 0xf8, 0x3a, 0x4c, 0x0a, 0x49, 0x0b, 0x22, 0x00, 0x60, 0x20, 0x68, 0x28, 0xf7, 0xff, + 0xf8, 0x4f, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x28, 0x68, 0x20, 0xf7, 0xff, 0xf8, 0x29, 0xb0, 0x01, + 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x20, 0x00, 0x98, 0x96, 0x80, + 0x13, 0x70, 0x60, 0x24, 0x13, 0x70, 0x67, 0x68, 0xb5, 0x00, 0x1c, 0x03, 0x01, 0x40, 0x1a, 0xc0, + 0x00, 0x80, 0x18, 0xc0, 0xb0, 0x81, 0x00, 0xc0, 0xf7, 0xff, 0xff, 0xd4, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x83, 0x93, 0x00, 0x46, 0x94, 0x06, 0x0b, 0x0e, 0x0a, + 0x26, 0xff, 0x43, 0x1a, 0x02, 0x36, 0x1c, 0x0b, 0x40, 0x33, 0x02, 0x1b, 0x25, 0xff, 0x43, 0x1a, + 0x04, 0x2d, 0x1c, 0x0b, 0x40, 0x2b, 0x0a, 0x1b, 0x43, 0x1a, 0x90, 0x01, 0x60, 0xc2, 0x9a, 0x01, + 0x23, 0x00, 0x62, 0x13, 0x4b, 0x2a, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0x80, 0x01, 0x5b, 0x1a, 0x98, + 0x45, 0x84, 0xd2, 0x01, 0x46, 0x64, 0xe0, 0x2f, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xca, 0x4b, 0x25, + 0x1c, 0x11, 0x1c, 0x04, 0x1c, 0x2e, 0x40, 0x19, 0x98, 0x01, 0x27, 0x01, 0x25, 0x00, 0xe0, 0x18, + 0x06, 0x0b, 0x0e, 0x0a, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x0b, 0x02, 0x1b, 0x43, 0x1a, + 0x1c, 0x0b, 0x40, 0x33, 0x0a, 0x1b, 0x43, 0x1a, 0x61, 0x02, 0x22, 0x80, 0x01, 0x52, 0x18, 0xa4, + 0x62, 0x45, 0x45, 0x64, 0xd3, 0x00, 0x46, 0x64, 0x23, 0x80, 0x01, 0x5b, 0x18, 0xc9, 0x37, 0x01, + 0x30, 0x04, 0x45, 0x64, 0xd2, 0x01, 0x2f, 0x04, 0xdd, 0xe2, 0x45, 0x64, 0xd0, 0x04, 0x1c, 0x20, + 0x99, 0x08, 0xf0, 0x04, 0xfa, 0xd9, 0x1a, 0x64, 0x9b, 0x00, 0x04, 0x22, 0x43, 0x1a, 0x06, 0x13, + 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, + 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, 0x23, 0x80, 0x9a, 0x01, 0x04, 0x5b, 0xb0, 0x03, + 0x1c, 0x20, 0x60, 0x91, 0x64, 0x14, 0x60, 0x13, 0x60, 0x53, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xb5, 0xf0, 0x26, 0xff, 0x25, 0xff, 0x22, 0x03, + 0x02, 0x36, 0x04, 0x2d, 0x46, 0x94, 0x4f, 0x18, 0xe0, 0x1e, 0x68, 0x82, 0x06, 0x13, 0x0e, 0x11, + 0x43, 0x19, 0x1c, 0x13, 0x40, 0x33, 0x02, 0x1b, 0x43, 0x19, 0x40, 0x2a, 0x0a, 0x12, 0x1c, 0x0c, + 0x43, 0x14, 0x0a, 0x23, 0x46, 0x62, 0x40, 0x13, 0x2b, 0x02, 0xd0, 0x07, 0x6b, 0xc1, 0x6c, 0x03, + 0x69, 0x4a, 0x18, 0xd2, 0x0c, 0x23, 0x40, 0x3b, 0x1a, 0xd2, 0x61, 0x4a, 0x6c, 0x03, 0x2b, 0x00, + 0xd0, 0x01, 0x06, 0x63, 0xd4, 0x03, 0x6b, 0x80, 0x28, 0x00, 0xd1, 0xde, 0xe0, 0x04, 0x6b, 0xc2, + 0x23, 0x01, 0x42, 0x5b, 0x61, 0x53, 0x1c, 0x18, 0x4b, 0x04, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0x00, 0x07, 0x43, 0xd5, 0x15, 0x4b, 0x0c, 0x4a, 0x0c, 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x4b, + 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, 0x64, 0x4b, 0x4b, 0x06, 0x4a, 0x07, + 0x68, 0x1b, 0x68, 0x99, 0x6c, 0x8b, 0x40, 0x13, 0x2b, 0x03, 0xd1, 0x02, 0x23, 0x80, 0x01, 0x9b, + 0x64, 0x8b, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x03, + 0xb5, 0xf0, 0x07, 0x43, 0xd5, 0x21, 0x24, 0x80, 0x4e, 0x11, 0x4d, 0x12, 0x4f, 0x12, 0x20, 0x00, + 0x01, 0xa4, 0x68, 0x33, 0x00, 0x82, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x2b, 0x68, 0x0a, + 0x42, 0x98, 0xd1, 0x0a, 0x07, 0xd3, 0xd4, 0x0d, 0x4a, 0x0c, 0x23, 0x02, 0x49, 0x0c, 0x60, 0x13, + 0x68, 0x0b, 0x22, 0x20, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x1c, 0x13, 0x40, 0x3b, 0x2b, 0x03, + 0xd1, 0x00, 0x60, 0x0c, 0x30, 0x01, 0x28, 0x04, 0xd1, 0xe3, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x20, 0x03, 0x13, 0x70, 0x67, 0x6c, + 0x0d, 0x80, 0x00, 0xc0, 0xb5, 0x00, 0x4b, 0x0a, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, 0x68, 0x99, + 0x6c, 0x4b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x4a, 0x4b, 0x05, 0x22, 0x80, 0x68, 0x1b, 0x01, 0x92, + 0x68, 0x99, 0x6c, 0x8b, 0x42, 0x13, 0xd1, 0x00, 0x64, 0x8a, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x23, 0x01, 0x42, 0x5b, 0x62, 0x03, + 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x4b, 0x06, 0x49, 0x07, 0x78, 0x1a, 0x68, 0x08, + 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x05, 0x60, 0x1a, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x33, 0x58, + 0x18, 0xc0, 0x47, 0x70, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, + 0xb5, 0x10, 0x1c, 0x18, 0x4b, 0x12, 0x1c, 0x14, 0x78, 0x1a, 0x1e, 0x53, 0x41, 0x9a, 0x4b, 0x11, + 0x60, 0x1a, 0x4b, 0x11, 0x68, 0x19, 0x00, 0x93, 0x18, 0x9b, 0x00, 0xdb, 0x18, 0xc9, 0x6f, 0x0b, + 0x2b, 0x00, 0xd0, 0x10, 0x23, 0x00, 0x80, 0x03, 0x80, 0x43, 0x31, 0x60, 0x88, 0x0b, 0x04, 0x1b, + 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x80, 0x82, 0x88, 0x4b, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, + 0x43, 0x1a, 0x80, 0xc2, 0x23, 0x01, 0x20, 0x00, 0x70, 0x23, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0x07, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x20, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x36, + 0x4d, 0x1e, 0x1c, 0x06, 0x1c, 0x30, 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0xb6, 0x1c, 0x30, 0x1c, 0x0c, + 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x67, 0x17, 0xe3, 0x18, 0xe4, 0x40, 0x5c, 0x34, 0x30, 0x4b, 0x18, + 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0x9d, 0xd1, 0xec, 0x1c, 0x2a, 0x3a, 0x0f, 0x23, 0x00, + 0x76, 0x93, 0x2f, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x02, 0x23, 0x2d, 0x70, 0x13, 0x20, 0x01, + 0x22, 0x10, 0x49, 0x0d, 0xe0, 0x00, 0x32, 0x01, 0x5c, 0x8b, 0x2b, 0x30, 0xd0, 0xfb, 0x2b, 0x00, + 0xd1, 0x00, 0x3a, 0x01, 0x4b, 0x08, 0x18, 0x99, 0x18, 0x1b, 0xe0, 0x02, 0x70, 0x1a, 0x30, 0x01, + 0x33, 0x01, 0x78, 0x0a, 0x31, 0x01, 0x2a, 0x00, 0xd1, 0xf8, 0x4b, 0x03, 0x54, 0x1a, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, + 0x13, 0x72, 0xc1, 0xef, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x1a, + 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, 0x4d, 0x18, 0x1c, 0x2f, 0x3f, 0x0a, 0x1c, 0x30, + 0x21, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x30, 0x1c, 0x0c, 0x21, 0x0a, 0xf0, 0x04, 0xf8, 0xd4, + 0x34, 0x30, 0x70, 0x2c, 0x3d, 0x01, 0x1c, 0x06, 0x42, 0xbd, 0xd1, 0xf0, 0x1c, 0x2a, 0x23, 0x00, + 0x3a, 0x0f, 0x76, 0x93, 0x23, 0x10, 0xe0, 0x00, 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, + 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x08, 0x22, 0x00, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, + 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x72, 0xc1, 0xe0, 0x13, 0x72, 0xc1, 0xf9, + 0xb5, 0x10, 0x28, 0x00, 0xd1, 0x04, 0x4a, 0x19, 0x23, 0x30, 0x70, 0x13, 0x70, 0x50, 0xe0, 0x2a, + 0x4a, 0x17, 0x24, 0x0f, 0x1c, 0x11, 0x39, 0x08, 0x1c, 0x03, 0x40, 0x23, 0x09, 0x00, 0x2b, 0x09, + 0xdd, 0x00, 0x33, 0x07, 0x33, 0x30, 0x70, 0x13, 0x3a, 0x01, 0x42, 0x8a, 0xd1, 0xf4, 0x3a, 0x0f, + 0x23, 0x00, 0x76, 0x13, 0x23, 0x30, 0x70, 0x13, 0x23, 0x78, 0x70, 0x53, 0x23, 0x10, 0xe0, 0x00, + 0x33, 0x01, 0x5c, 0xd1, 0x29, 0x30, 0xd0, 0xfb, 0x29, 0x00, 0xd1, 0x00, 0x3b, 0x01, 0x48, 0x07, + 0x22, 0x02, 0x18, 0xc1, 0x1c, 0x04, 0xe0, 0x01, 0x54, 0xa3, 0x32, 0x01, 0x78, 0x0b, 0x31, 0x01, + 0x2b, 0x00, 0xd1, 0xf9, 0x54, 0x83, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x72, 0xc1, 0xe0, + 0x13, 0x72, 0xc1, 0xf7, 0xb5, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x23, 0x00, 0x60, 0x03, 0x4b, 0x0c, + 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x11, 0x4b, 0x0b, 0x78, 0x1a, 0x2a, 0x10, 0xd0, 0x0d, 0x28, 0x00, + 0xd0, 0x04, 0x4b, 0x09, 0x32, 0x04, 0x00, 0x92, 0x58, 0xd3, 0x60, 0x03, 0x4b, 0x05, 0x4a, 0x06, + 0x78, 0x1b, 0x33, 0x14, 0x00, 0x9b, 0x58, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0xb5, 0xf0, 0x4a, 0x67, + 0xb0, 0x8b, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x06, 0x4b, 0x65, 0x68, 0x19, 0x69, 0x8b, 0x60, 0x13, + 0x6a, 0x0b, 0x4a, 0x64, 0x60, 0x13, 0x4b, 0x63, 0x4f, 0x61, 0x68, 0x1d, 0x26, 0x00, 0x1c, 0x34, + 0x68, 0x3b, 0x34, 0x08, 0x00, 0xa4, 0x50, 0xe5, 0x68, 0x3b, 0x21, 0x00, 0x58, 0xe0, 0x22, 0x60, + 0xf0, 0x04, 0xf9, 0x70, 0x68, 0x3b, 0x21, 0x60, 0x58, 0xe0, 0xf0, 0x03, 0xf9, 0xd3, 0x1c, 0x2b, + 0x33, 0x7f, 0x1c, 0x1d, 0x21, 0x1f, 0x36, 0x01, 0x43, 0x8d, 0x2e, 0x08, 0xd1, 0xe7, 0x24, 0x00, + 0x26, 0x1f, 0x1c, 0x28, 0x21, 0x00, 0x22, 0x60, 0xf0, 0x04, 0xf9, 0x5c, 0x1c, 0x28, 0x21, 0x60, + 0xf0, 0x03, 0xf9, 0xc0, 0x1c, 0x2b, 0x33, 0x7f, 0x1c, 0x1d, 0x34, 0x01, 0x43, 0xb5, 0x2c, 0x08, + 0xd1, 0xef, 0x4b, 0x4d, 0x4a, 0x4d, 0x60, 0x1d, 0x4b, 0x48, 0x92, 0x06, 0x21, 0x80, 0x22, 0xff, + 0x68, 0x1f, 0x05, 0xc9, 0x23, 0x00, 0x02, 0x12, 0x93, 0x08, 0x91, 0x02, 0x92, 0x01, 0x9b, 0x06, + 0x21, 0x00, 0x60, 0x1f, 0x22, 0x60, 0x1c, 0x38, 0xf0, 0x04, 0xf9, 0x3c, 0x1c, 0x38, 0xf0, 0x03, + 0xf9, 0x5b, 0x64, 0x78, 0x99, 0x06, 0x9b, 0x08, 0x68, 0x0a, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x80, + 0x04, 0x1b, 0x60, 0x53, 0x99, 0x06, 0x23, 0x00, 0x68, 0x0a, 0x60, 0x93, 0x68, 0x0b, 0x9a, 0x02, + 0x21, 0x1f, 0x61, 0x9a, 0x1c, 0x3b, 0x33, 0x7f, 0x9a, 0x06, 0x1c, 0x1f, 0x43, 0x8f, 0x68, 0x12, + 0x1c, 0x38, 0x92, 0x07, 0xf0, 0x03, 0xf9, 0x40, 0x1c, 0x06, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x3c, + 0x1c, 0x04, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x38, 0x1c, 0x05, 0x1c, 0x38, 0xf0, 0x03, 0xf9, 0x34, + 0x99, 0x01, 0x23, 0xff, 0x22, 0xff, 0x04, 0x12, 0x02, 0x1b, 0x93, 0x05, 0x40, 0x0c, 0x40, 0x15, + 0x23, 0xe0, 0x40, 0x1e, 0x21, 0x02, 0x02, 0x24, 0x0a, 0x2d, 0x0e, 0x00, 0x43, 0x0e, 0x43, 0x2c, + 0x92, 0x04, 0x43, 0x04, 0x9a, 0x07, 0x06, 0x36, 0x43, 0x34, 0x60, 0x14, 0x9b, 0x06, 0x68, 0x1a, + 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x99, 0x06, 0x68, 0x0a, 0x61, 0x53, 0xc9, 0x01, 0x91, 0x06, + 0x21, 0x60, 0xf0, 0x03, 0xf9, 0x57, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, 0x2a, 0x06, 0xd1, 0xa6, + 0x4b, 0x1a, 0x4f, 0x16, 0x93, 0x03, 0x69, 0x59, 0x68, 0x38, 0x91, 0x09, 0xf0, 0x03, 0xf9, 0x04, + 0x1c, 0x06, 0x68, 0x38, 0xf0, 0x03, 0xf9, 0x00, 0x1c, 0x04, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xfc, + 0x1c, 0x05, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0xf8, 0x9a, 0x05, 0x9b, 0x04, 0x40, 0x14, 0x40, 0x1d, + 0x21, 0xe0, 0x0a, 0x2d, 0x22, 0x02, 0x40, 0x0e, 0x02, 0x24, 0x43, 0x2c, 0x43, 0x16, 0x0e, 0x00, + 0x9b, 0x09, 0x06, 0x36, 0x43, 0x04, 0x43, 0x34, 0x60, 0x1c, 0x99, 0x03, 0x69, 0x48, 0x21, 0x60, + 0xf0, 0x03, 0xf9, 0x28, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xcc, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0xc8, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x72, 0xc0, 0x20, + 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0xf0, 0x03, 0xf8, 0xcf, 0x21, 0x00, 0x1c, 0x05, 0x22, 0x60, + 0x1c, 0x20, 0xf0, 0x04, 0xf8, 0xa7, 0x23, 0x40, 0x60, 0xa3, 0x23, 0x80, 0x04, 0x5b, 0xb0, 0x01, + 0x63, 0x65, 0x60, 0x23, 0x60, 0x63, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0x4b, 0x1a, + 0xb0, 0x83, 0x68, 0x1d, 0x23, 0x00, 0x93, 0x01, 0x23, 0xff, 0x02, 0x1b, 0x27, 0xff, 0x26, 0x80, + 0x93, 0x00, 0x04, 0x3f, 0x04, 0x76, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xda, 0x9b, 0x01, 0x2b, 0x03, + 0xd0, 0x19, 0x1c, 0x2c, 0x23, 0x1f, 0x34, 0x7f, 0x43, 0x9c, 0x6b, 0x62, 0x1c, 0x28, 0x06, 0x13, + 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x00, 0x60, 0x6e, 0x40, 0x13, 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, + 0x0a, 0x12, 0x43, 0x11, 0x60, 0x29, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xdc, 0x9b, 0x01, 0x1c, 0x25, + 0x33, 0x01, 0x93, 0x01, 0xe7, 0xdf, 0x1c, 0x28, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0xd3, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc4, 0xb5, 0xf0, 0xb0, 0x83, + 0xf7, 0xff, 0xfe, 0xd4, 0xf7, 0xff, 0xff, 0xc2, 0x4d, 0x4b, 0x49, 0x4c, 0x68, 0x2a, 0x68, 0x0b, + 0x4f, 0x4b, 0x61, 0x93, 0x68, 0x2a, 0x68, 0x4b, 0x4e, 0x4a, 0x61, 0xd3, 0x68, 0x8b, 0x4a, 0x4a, + 0x60, 0x3b, 0x92, 0x01, 0x68, 0xcb, 0x60, 0x13, 0x69, 0x0b, 0x21, 0x60, 0x60, 0x33, 0x68, 0x2b, + 0x69, 0x98, 0xf0, 0x03, 0xf8, 0x97, 0x68, 0x2a, 0x69, 0x93, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, + 0x69, 0x9b, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0x9c, 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x5d, 0x64, 0x60, + 0x68, 0x33, 0x6c, 0x59, 0x68, 0x2b, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, + 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, + 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x2b, + 0x21, 0x60, 0x69, 0x9a, 0x23, 0x80, 0x04, 0x1b, 0x60, 0x53, 0x68, 0x2b, 0x22, 0x00, 0x69, 0x9b, + 0x60, 0x9a, 0x68, 0x2b, 0x69, 0x9a, 0x23, 0x80, 0x05, 0xdb, 0x61, 0x93, 0x68, 0x2b, 0x69, 0x9a, + 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x68, 0x2a, 0x69, 0x92, 0x61, 0x53, 0x68, 0x2b, 0x69, 0x98, + 0xf0, 0x03, 0xf8, 0x70, 0x68, 0x2b, 0x21, 0x60, 0x69, 0xd8, 0xf0, 0x03, 0xf8, 0x53, 0x68, 0x2a, + 0x69, 0xd3, 0x64, 0xda, 0x68, 0x2b, 0x22, 0x00, 0x69, 0xdb, 0x64, 0x9a, 0x68, 0x2b, 0x69, 0xdc, + 0x1c, 0x20, 0xf0, 0x03, 0xf8, 0x19, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x42, + 0x68, 0x3a, 0x68, 0x2b, 0x64, 0xd3, 0x68, 0x3b, 0x22, 0x00, 0x64, 0x9a, 0x68, 0x3c, 0x1c, 0x20, + 0xf0, 0x03, 0xf8, 0x0a, 0x64, 0x60, 0x68, 0x38, 0x21, 0x60, 0xf0, 0x03, 0xf8, 0x4b, 0x9b, 0x01, + 0x21, 0x60, 0x68, 0x18, 0xf0, 0x03, 0xf8, 0x2e, 0x9b, 0x01, 0x68, 0x1a, 0x68, 0x2b, 0x64, 0xd3, + 0x9a, 0x01, 0x68, 0x13, 0x22, 0x00, 0x64, 0x9a, 0x9b, 0x01, 0x68, 0x1c, 0x1c, 0x20, 0xf0, 0x02, + 0xff, 0xf3, 0x64, 0x60, 0x9a, 0x01, 0x21, 0x60, 0x68, 0x10, 0xf0, 0x03, 0xf8, 0x33, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, + 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x84, 0x13, 0x70, 0x67, 0x80, 0xb5, 0xf0, 0x4c, 0x23, + 0x4b, 0x23, 0xb0, 0x81, 0x60, 0x23, 0xf0, 0x03, 0xf8, 0x35, 0x28, 0x00, 0xda, 0x02, 0x20, 0x01, + 0x42, 0x40, 0xe0, 0x37, 0xf0, 0x03, 0xf9, 0x80, 0x60, 0x20, 0x68, 0x82, 0x4b, 0x1d, 0x21, 0x01, + 0x60, 0x13, 0x68, 0x20, 0x68, 0x82, 0x68, 0x13, 0x42, 0x0b, 0xd1, 0xfc, 0x21, 0xfc, 0xf0, 0x03, + 0xf8, 0x09, 0x27, 0x80, 0x26, 0x80, 0x4c, 0x15, 0x25, 0x00, 0x04, 0x7f, 0x01, 0x76, 0x68, 0x23, + 0x21, 0x04, 0x6c, 0xdb, 0x51, 0x5f, 0x68, 0x23, 0x6c, 0xdb, 0x59, 0x58, 0x35, 0x04, 0xf0, 0x02, + 0xff, 0xf9, 0x42, 0xb5, 0xd1, 0xf3, 0xf7, 0xff, 0xff, 0x29, 0x68, 0x23, 0x22, 0x01, 0x33, 0x54, + 0x70, 0x1a, 0x68, 0x23, 0x20, 0x00, 0x68, 0x9a, 0x69, 0x9b, 0x6c, 0x5b, 0x61, 0x93, 0x68, 0x23, + 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x68, 0x23, 0x68, 0x9a, 0x4b, 0x07, 0x60, 0x13, 0x68, 0x23, + 0x68, 0x9b, 0x68, 0x1b, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x21, 0xb5, 0x10, 0x4b, 0x0c, + 0x68, 0x18, 0x6c, 0x01, 0x29, 0x07, 0xdd, 0x01, 0x24, 0x00, 0xe0, 0x0d, 0x4b, 0x09, 0x68, 0x1b, + 0x00, 0xdb, 0x18, 0x5b, 0x00, 0x5a, 0x18, 0xd2, 0x6a, 0x03, 0x01, 0x52, 0x18, 0x9c, 0x1c, 0x4b, + 0x64, 0x03, 0x1c, 0x20, 0xf7, 0xff, 0xfe, 0xa4, 0x1c, 0x20, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x70, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x05, 0xf7, 0xff, + 0xff, 0xdd, 0x90, 0x08, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xad, 0x63, 0xc5, 0x23, 0x00, 0x61, 0x6b, + 0x7e, 0x6b, 0x69, 0x2a, 0x93, 0x07, 0x7e, 0x2b, 0x92, 0x0a, 0x2b, 0x00, 0xd0, 0x02, 0x9c, 0x08, + 0x26, 0x80, 0xe0, 0x26, 0x23, 0x08, 0x93, 0x00, 0x23, 0xa0, 0x68, 0x69, 0x22, 0x08, 0x00, 0x9b, + 0x98, 0x08, 0xf7, 0xff, 0xfb, 0x57, 0xf7, 0xff, 0xff, 0xc1, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, + 0xe0, 0x91, 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, + 0x40, 0x13, 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x43, 0x11, + 0x9a, 0x08, 0x60, 0x11, 0x63, 0x90, 0x9b, 0x0a, 0x2b, 0x00, 0xd1, 0x01, 0x4e, 0x40, 0xe0, 0x00, + 0x4e, 0x40, 0x68, 0xea, 0x9b, 0x07, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x02, 0x23, 0x80, 0x00, 0x5b, + 0x43, 0x1e, 0x69, 0xea, 0x4b, 0x3c, 0x27, 0xff, 0x40, 0x13, 0x93, 0x0b, 0x3b, 0x01, 0x22, 0x80, + 0x93, 0x04, 0x23, 0xff, 0x04, 0x52, 0x02, 0x1b, 0x92, 0x05, 0x93, 0x03, 0x04, 0x3f, 0x9a, 0x0b, + 0x1c, 0x33, 0x92, 0x00, 0x1c, 0x20, 0x9a, 0x0a, 0x99, 0x09, 0xf7, 0xff, 0xfb, 0x1b, 0x9b, 0x0a, + 0x9a, 0x09, 0x1a, 0x1b, 0x93, 0x0a, 0x9b, 0x07, 0x18, 0x12, 0x92, 0x09, 0x2b, 0x00, 0xd0, 0x01, + 0x9a, 0x05, 0x60, 0x62, 0x9a, 0x04, 0x18, 0x13, 0x9a, 0x0b, 0x42, 0x13, 0xd1, 0x01, 0x4b, 0x2b, + 0x18, 0xf6, 0x9a, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0xf7, 0xff, 0xff, 0x70, 0x28, 0x00, 0xd0, 0x42, + 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x9b, 0x03, 0x63, 0xa0, 0x40, 0x13, + 0x02, 0x1b, 0x40, 0x3a, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x60, 0x21, 0x1c, 0x04, 0xe7, 0xce, + 0x23, 0x80, 0x04, 0x5b, 0x60, 0x63, 0x69, 0x2b, 0x1c, 0x27, 0x2b, 0x00, 0xd0, 0x24, 0x7e, 0x2b, + 0x93, 0x06, 0x2b, 0x00, 0xd1, 0x20, 0xf7, 0xff, 0xff, 0x51, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x22, + 0x6b, 0x42, 0x63, 0xc5, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x13, + 0x02, 0x1b, 0x43, 0x19, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x1a, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, + 0x00, 0x5b, 0x4a, 0x0e, 0x60, 0x39, 0x63, 0xb8, 0x40, 0x73, 0x43, 0x13, 0x9a, 0x06, 0x21, 0x00, + 0x92, 0x00, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0xc6, 0x68, 0xa3, 0x22, 0x80, 0x04, 0x12, 0x43, 0x13, + 0x60, 0xa3, 0x98, 0x08, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x0d, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x80, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf0, 0x7c, 0x83, 0x7c, 0xc2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7d, 0x03, 0xb0, 0x85, + 0x02, 0x1b, 0x43, 0x13, 0x7d, 0x42, 0x1c, 0x06, 0x43, 0x1a, 0xd0, 0x67, 0x22, 0x00, 0x92, 0x01, + 0xe0, 0x53, 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x9a, 0x03, 0x43, 0x03, + 0x18, 0x9d, 0x7a, 0x6b, 0x7a, 0xaa, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xeb, 0x02, 0x1b, + 0x43, 0x13, 0x7b, 0x2a, 0x43, 0x1a, 0xd0, 0x3b, 0x23, 0x00, 0x93, 0x02, 0x27, 0x00, 0xe0, 0x26, + 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x03, 0x19, 0xdc, 0x7b, 0xa3, + 0x7b, 0xe2, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, + 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x71, 0x7a, 0x63, 0x7a, 0xa2, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, + 0xd0, 0x01, 0xf0, 0x02, 0xfe, 0x63, 0x9a, 0x02, 0x37, 0x12, 0x32, 0x01, 0x92, 0x02, 0x79, 0x2b, + 0x7a, 0x69, 0x46, 0x9c, 0x9b, 0x02, 0x7a, 0xaa, 0x7a, 0xec, 0x7b, 0x28, 0x45, 0x63, 0xdb, 0xcf, + 0x06, 0x0b, 0x04, 0x12, 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x4e, + 0x9d, 0x01, 0x9a, 0x03, 0x35, 0x01, 0x95, 0x01, 0x32, 0x0d, 0x7c, 0x73, 0x9d, 0x01, 0x92, 0x03, + 0x7c, 0xb1, 0x7c, 0xf2, 0x7d, 0x34, 0x7d, 0x70, 0x42, 0x9d, 0xdb, 0xa2, 0x06, 0x0b, 0x04, 0x12, + 0x43, 0x1a, 0x02, 0x23, 0x43, 0x13, 0x43, 0x18, 0xf0, 0x02, 0xfe, 0x38, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x01, 0x47, 0x00, 0xb4, 0x0f, 0xb5, 0xf0, 0xb0, 0x83, 0x46, 0x6a, 0x23, 0x80, 0xad, 0x08, + 0x32, 0x06, 0x01, 0x9b, 0xcd, 0x10, 0x80, 0x13, 0x4e, 0x1d, 0xe0, 0x30, 0x1c, 0x67, 0x2b, 0x25, + 0xd0, 0x07, 0x46, 0x6a, 0x46, 0x68, 0x71, 0x93, 0x30, 0x06, 0x1c, 0x3c, 0xf7, 0xfe, 0xfa, 0x4c, + 0xe0, 0x25, 0x78, 0x63, 0x2b, 0x73, 0xd0, 0x1c, 0x2b, 0x73, 0xd8, 0x04, 0x2b, 0x64, 0xd0, 0x07, + 0x2b, 0x69, 0xd1, 0x1b, 0xe0, 0x04, 0x2b, 0x75, 0xd0, 0x07, 0x2b, 0x78, 0xd1, 0x16, 0xe0, 0x0a, + 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0x72, 0xe0, 0x09, 0x68, 0x28, 0xf7, 0xff, 0xfb, 0xba, + 0x1d, 0x2c, 0x1c, 0x30, 0xe0, 0x07, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xff, 0xfb, 0xf1, 0x48, 0x08, + 0xe0, 0x01, 0x68, 0x28, 0x1d, 0x2c, 0xf7, 0xfe, 0xfa, 0x27, 0x1c, 0x25, 0x1c, 0x7c, 0x78, 0x23, + 0x2b, 0x00, 0xd1, 0xcb, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0x46, 0xc0, + 0x13, 0x72, 0xc1, 0xe0, 0xb5, 0xf0, 0x4b, 0x32, 0xb0, 0x8f, 0x68, 0x1b, 0x1c, 0x01, 0x68, 0x9a, + 0x4b, 0x30, 0x68, 0x54, 0x68, 0x1b, 0x32, 0x44, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x48, 0x2e, + 0x92, 0x0d, 0xf7, 0xff, 0xff, 0xa7, 0x04, 0x20, 0xd4, 0x02, 0x49, 0x2c, 0x91, 0x0a, 0xe0, 0x01, + 0x4b, 0x2b, 0x93, 0x0a, 0x04, 0x60, 0xd4, 0x02, 0x49, 0x28, 0x91, 0x0b, 0xe0, 0x01, 0x4b, 0x29, + 0x93, 0x0b, 0x04, 0xa0, 0xd4, 0x02, 0x49, 0x25, 0x91, 0x0c, 0xe0, 0x01, 0x4b, 0x26, 0x93, 0x0c, + 0x04, 0xe0, 0xd4, 0x02, 0x49, 0x21, 0x46, 0x8c, 0xe0, 0x01, 0x4b, 0x24, 0x46, 0x9c, 0x06, 0xa0, + 0xd4, 0x01, 0x4f, 0x1e, 0xe0, 0x00, 0x4f, 0x22, 0x06, 0xe1, 0xd4, 0x01, 0x4e, 0x1b, 0xe0, 0x00, + 0x4e, 0x20, 0x07, 0x23, 0xd4, 0x01, 0x4d, 0x19, 0xe0, 0x00, 0x4d, 0x1f, 0x07, 0x60, 0xd4, 0x01, + 0x4a, 0x16, 0xe0, 0x00, 0x4a, 0x1d, 0x07, 0xa1, 0xd4, 0x01, 0x4b, 0x14, 0xe0, 0x00, 0x4b, 0x1c, + 0x07, 0xe0, 0xd4, 0x01, 0x49, 0x11, 0xe0, 0x00, 0x49, 0x1a, 0x48, 0x1b, 0x92, 0x05, 0x90, 0x09, + 0x98, 0x0c, 0x9a, 0x0a, 0x90, 0x00, 0x46, 0x60, 0x90, 0x01, 0x93, 0x06, 0x91, 0x07, 0x9b, 0x0b, + 0x98, 0x09, 0x1c, 0x21, 0x97, 0x02, 0x96, 0x03, 0x95, 0x04, 0xf7, 0xff, 0xff, 0x5b, 0x99, 0x0d, + 0x48, 0x12, 0xf7, 0xff, 0xff, 0x57, 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x60, 0x85, 0x13, 0x70, 0x66, 0x42, + 0x13, 0x70, 0x60, 0x9b, 0x13, 0x70, 0x60, 0xa2, 0x13, 0x70, 0x60, 0xac, 0x13, 0x70, 0x60, 0xb2, + 0x13, 0x70, 0x60, 0xb8, 0x13, 0x70, 0x60, 0xbd, 0x13, 0x70, 0x60, 0xc4, 0x13, 0x70, 0x60, 0xc9, + 0x13, 0x70, 0x60, 0xce, 0x13, 0x70, 0x60, 0xd3, 0x13, 0x70, 0x60, 0xd8, 0x13, 0x70, 0x60, 0xfd, + 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, 0x1c, 0x1c, 0x68, 0x12, + 0x68, 0x23, 0x43, 0x2a, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, 0xf9, 0x2b, 0x68, 0x23, + 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd0, 0xf3, 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x34, 0xb5, 0x30, 0x4b, 0x0b, 0xb0, 0x81, 0x68, 0x1a, 0x25, 0x20, 0x68, 0x92, + 0x1c, 0x1c, 0x68, 0x12, 0x68, 0x23, 0x43, 0xaa, 0x68, 0x9b, 0x20, 0x0a, 0x60, 0x1a, 0xf7, 0xff, + 0xf9, 0x11, 0x68, 0x23, 0x68, 0x9b, 0x68, 0x1a, 0x42, 0x2a, 0xd1, 0xf3, 0xb0, 0x01, 0xbc, 0x30, + 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x60, 0x34, 0xb5, 0xf0, 0xb0, 0x81, 0x1c, 0x0e, 0x28, 0x00, + 0xd1, 0x18, 0x4e, 0x18, 0x4d, 0x18, 0x4f, 0x19, 0x24, 0x00, 0x68, 0x33, 0x68, 0x9b, 0x69, 0x9a, + 0x69, 0x2b, 0x6c, 0x5b, 0x42, 0x9a, 0xd3, 0x06, 0x69, 0x6b, 0x6c, 0x5b, 0x42, 0x9a, 0xd8, 0x02, + 0xf7, 0xff, 0xff, 0xd0, 0xe0, 0x18, 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xeb, 0x42, 0xbc, + 0xd1, 0xeb, 0xe0, 0x11, 0x28, 0x01, 0xd1, 0x0f, 0x24, 0x00, 0x4d, 0x0a, 0x4f, 0x0b, 0xe0, 0x05, + 0x20, 0x0a, 0x34, 0x01, 0xf7, 0xff, 0xf8, 0xde, 0x42, 0xbc, 0xd0, 0x05, 0x68, 0x2b, 0x68, 0x9b, + 0x69, 0x9a, 0x6c, 0x73, 0x42, 0x9a, 0xd0, 0xf3, 0xb0, 0x01, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x72, 0xc0, 0x20, 0x00, 0x00, 0x13, 0x88, + 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x1f, 0x4b, 0x0f, 0x92, 0x00, 0x91, 0x01, 0x9a, 0x08, 0x68, 0x1c, + 0x00, 0x55, 0x1c, 0x1e, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0xbd, 0x9a, 0x01, 0x68, 0x13, 0x9a, 0x00, + 0x40, 0x13, 0x42, 0xbb, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x07, 0x68, 0x33, 0x1b, 0x1b, 0xd5, 0x00, + 0x68, 0x34, 0x42, 0xab, 0xd3, 0xee, 0x20, 0x02, 0x42, 0x40, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x80, 0x00, 0x10, 0xb5, 0x10, 0x4b, 0x13, 0x30, 0x10, 0x68, 0x1b, + 0x00, 0x80, 0x68, 0x9b, 0x18, 0x1c, 0x68, 0x62, 0x23, 0x80, 0x01, 0x9b, 0x42, 0x1a, 0xd1, 0x00, + 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x2b, 0x23, 0x80, + 0x68, 0x62, 0x01, 0x9b, 0x42, 0x1a, 0xd0, 0x00, 0x40, 0x5a, 0x23, 0x2e, 0x43, 0x9a, 0x60, 0x62, + 0x20, 0x05, 0xf7, 0xfe, 0xff, 0x1f, 0x4b, 0x05, 0x20, 0x05, 0x60, 0x63, 0xf7, 0xfe, 0xff, 0x1a, + 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x01, + 0xb5, 0xf0, 0x4b, 0x29, 0xb0, 0x85, 0x68, 0x1a, 0x1c, 0x03, 0x68, 0x92, 0x33, 0x10, 0x00, 0x9b, + 0x18, 0xd2, 0x92, 0x03, 0x1c, 0x15, 0x4b, 0x25, 0x68, 0x52, 0x35, 0x04, 0x40, 0x13, 0x2b, 0x01, + 0xd0, 0x06, 0x04, 0x91, 0xd5, 0x01, 0xf7, 0xff, 0xff, 0xbf, 0x24, 0x01, 0x42, 0x64, 0xe0, 0x36, + 0x26, 0x88, 0x27, 0x00, 0x01, 0x76, 0x21, 0x04, 0x1c, 0x13, 0x43, 0x8b, 0x43, 0x33, 0x60, 0x2b, + 0x20, 0x3c, 0xf7, 0xff, 0xf8, 0x79, 0x68, 0x2b, 0x4a, 0x19, 0x20, 0x32, 0x40, 0x13, 0x60, 0x2b, + 0xf7, 0xff, 0xf8, 0x72, 0x4b, 0x17, 0x22, 0x80, 0x93, 0x00, 0x1c, 0x28, 0x1c, 0x29, 0x00, 0x52, + 0x23, 0x00, 0xf7, 0xff, 0xff, 0x7d, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x9b, 0x03, 0x4c, 0x12, + 0x68, 0x5a, 0xe0, 0x14, 0x68, 0x2a, 0x21, 0x04, 0x42, 0x0a, 0xd1, 0x02, 0x37, 0x01, 0x2f, 0x04, + 0xd1, 0xd9, 0x07, 0x53, 0xd4, 0x0b, 0x23, 0x80, 0x01, 0x9b, 0x43, 0x13, 0x99, 0x03, 0x22, 0x2a, + 0x43, 0x93, 0x60, 0x4b, 0x20, 0x0a, 0xf7, 0xff, 0xf8, 0x4f, 0x9b, 0x03, 0x68, 0x5a, 0xb0, 0x05, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, + 0xff, 0xff, 0xfe, 0xd5, 0x00, 0x00, 0x13, 0x88, 0xff, 0xff, 0xf8, 0x30, 0xb5, 0xf0, 0xb0, 0x85, + 0x90, 0x01, 0x1c, 0x0f, 0x20, 0x00, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x0e, 0x7e, 0x3a, 0x2a, 0x00, + 0xd1, 0x06, 0x4b, 0xc2, 0x21, 0x08, 0x60, 0x1a, 0x68, 0x38, 0xf0, 0x02, 0xfc, 0x8b, 0x60, 0x78, + 0x69, 0x39, 0x29, 0x00, 0xd0, 0x09, 0x7e, 0x7b, 0x68, 0xb8, 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, + 0xfc, 0x81, 0xe0, 0x01, 0xf0, 0x02, 0xfc, 0x76, 0x60, 0xf8, 0x7e, 0x3b, 0x2b, 0x00, 0xd1, 0x03, + 0x4b, 0xb7, 0x68, 0x1b, 0x69, 0xdb, 0xe0, 0x06, 0x7e, 0x7b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0xb5, + 0xe0, 0x00, 0x4b, 0xb5, 0x68, 0x1b, 0x93, 0x02, 0x4c, 0xb4, 0x4b, 0xb5, 0x98, 0x02, 0x99, 0x02, + 0x60, 0x18, 0x22, 0x60, 0x1c, 0x20, 0xf0, 0x02, 0xfd, 0x87, 0x21, 0x00, 0x22, 0x30, 0x98, 0x02, + 0xf0, 0x03, 0xfb, 0xe8, 0x4b, 0xaa, 0x49, 0xaf, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x68, 0x0b, + 0x22, 0x01, 0x40, 0x53, 0x60, 0x0b, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x8e, 0x4b, 0xaa, 0x64, 0xa0, + 0x60, 0x18, 0x1c, 0x06, 0x98, 0x01, 0x22, 0x80, 0x69, 0x83, 0x7e, 0x39, 0x01, 0x92, 0x43, 0x1a, + 0x23, 0x0f, 0x40, 0x0b, 0x02, 0x1b, 0x1c, 0x10, 0x69, 0xfc, 0x43, 0x18, 0x29, 0x00, 0xd1, 0x03, + 0x4b, 0xa2, 0x1c, 0x01, 0x43, 0x19, 0xe0, 0x08, 0x4b, 0xa1, 0x1c, 0x22, 0x40, 0x1a, 0x23, 0x80, + 0x04, 0x12, 0x05, 0xdb, 0x43, 0x1a, 0x1c, 0x11, 0x43, 0x01, 0x06, 0x0b, 0x0e, 0x0a, 0x24, 0xff, + 0x02, 0x24, 0x43, 0x1a, 0x1c, 0x0b, 0x40, 0x23, 0x02, 0x1b, 0x20, 0xff, 0x04, 0x00, 0x43, 0x1a, + 0x1c, 0x0b, 0x40, 0x03, 0x4d, 0x91, 0x0a, 0x1b, 0x43, 0x1a, 0x23, 0x40, 0x60, 0xab, 0x4b, 0x95, + 0x60, 0x6a, 0x68, 0x1b, 0x6c, 0x5a, 0x1c, 0x11, 0x1c, 0x13, 0x40, 0x21, 0x40, 0x03, 0x0a, 0x1b, + 0x02, 0x09, 0x43, 0x19, 0x0e, 0x13, 0x43, 0x19, 0x23, 0xe0, 0x40, 0x1a, 0x23, 0x02, 0x43, 0x1a, + 0x06, 0x12, 0x43, 0x11, 0x60, 0x29, 0x6b, 0x72, 0x06, 0x13, 0x0e, 0x11, 0x43, 0x19, 0x1c, 0x13, + 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x23, 0x80, 0x43, 0x11, 0x04, 0x5b, + 0x61, 0x29, 0x61, 0x6b, 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x17, 0x9b, 0x01, 0x6a, 0x58, 0x06, 0x13, + 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x13, 0x18, 0xcb, + 0x40, 0xd8, 0x1c, 0x03, 0x49, 0x75, 0x07, 0xd8, 0xd5, 0x03, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x13, + 0xe0, 0x02, 0x69, 0x8b, 0x22, 0x80, 0x43, 0x93, 0x61, 0x8b, 0x4b, 0x70, 0x49, 0x76, 0x69, 0x9a, + 0x6c, 0x9e, 0x40, 0x0a, 0x61, 0x9a, 0xe0, 0x04, 0x1c, 0x30, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0xca, + 0x6b, 0xb6, 0x2e, 0x00, 0xd1, 0xf8, 0x4d, 0x69, 0x98, 0x02, 0x1c, 0x29, 0x22, 0x60, 0xf0, 0x02, + 0xfd, 0x03, 0x4a, 0x6e, 0x23, 0x01, 0x92, 0x00, 0x60, 0x13, 0x4b, 0x6d, 0x48, 0x6d, 0x68, 0x19, + 0xf7, 0xfe, 0xfd, 0x88, 0x4c, 0x5e, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x9a, + 0x68, 0x23, 0x6c, 0x69, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x1c, 0x0a, 0x40, 0x1a, 0x23, 0xff, + 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, + 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, + 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x97, 0xf7, 0xff, 0xfd, 0xeb, 0xf7, 0xfe, 0xfd, 0x2b, 0x9b, 0x00, + 0x90, 0x03, 0x60, 0x1e, 0x28, 0x00, 0xd1, 0x03, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x0f, + 0x4b, 0x47, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x54, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, + 0x68, 0x13, 0x22, 0x05, 0x40, 0x13, 0x2b, 0x05, 0xd0, 0x02, 0x4a, 0x40, 0x23, 0x01, 0x60, 0x13, + 0x98, 0x03, 0x42, 0x46, 0x41, 0x46, 0x2e, 0x00, 0xd1, 0x01, 0x30, 0x05, 0xd1, 0x4f, 0xf7, 0xff, + 0xfd, 0xe1, 0x4c, 0x3b, 0x21, 0x20, 0x68, 0x23, 0x69, 0x98, 0xf7, 0xfd, 0xff, 0x4d, 0x68, 0x23, + 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfb, 0x1e, 0x4b, 0x3e, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, + 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, + 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, + 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, + 0xff, 0x4b, 0xf7, 0xff, 0xfd, 0x9d, 0x7e, 0x3a, 0x2a, 0x00, 0xd1, 0x00, 0xe0, 0x9f, 0x9b, 0x01, + 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, + 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x2d, 0x68, 0x19, 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x22, 0x00, + 0xe0, 0x00, 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, + 0x40, 0x91, 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0xe0, 0x7f, 0xf7, 0xff, + 0xfd, 0x91, 0x4b, 0x16, 0x6c, 0x9c, 0xe0, 0x04, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x02, 0xfb, 0x02, + 0x6b, 0xa4, 0x2c, 0x00, 0xd1, 0xf8, 0x22, 0x20, 0x48, 0x10, 0x99, 0x02, 0xf0, 0x02, 0xfc, 0x44, + 0x7e, 0x3a, 0x2a, 0x00, 0xd0, 0x41, 0x9b, 0x01, 0x1c, 0x14, 0x6a, 0x5d, 0x23, 0x0f, 0x40, 0x1c, + 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x10, 0x4b, 0x07, 0x69, 0x99, + 0x06, 0x13, 0x2b, 0x00, 0xdb, 0x24, 0x22, 0x00, 0xe0, 0x23, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x7c, 0x13, 0x70, 0x67, 0x80, 0x13, 0x72, 0xc1, 0x80, + 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0x70, 0x13, 0x70, 0x67, 0x88, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x07, 0xff, 0x13, 0x70, 0x67, 0x84, 0x01, 0x00, 0x00, 0x80, 0x13, 0x70, 0x67, 0x74, + 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x48, 0x25, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x90, + 0x22, 0x10, 0x09, 0xcb, 0x21, 0x01, 0x40, 0x0b, 0x19, 0x12, 0x40, 0x93, 0x19, 0x02, 0x40, 0x91, + 0x1c, 0x2a, 0x43, 0x8a, 0x98, 0x01, 0x43, 0x13, 0x62, 0x43, 0x4c, 0x25, 0x21, 0x20, 0x68, 0x23, + 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa9, 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf0, 0x02, 0xfa, 0x7a, + 0x4b, 0x20, 0x68, 0x1b, 0x6c, 0x59, 0x68, 0x23, 0x1c, 0x0a, 0x69, 0x98, 0x23, 0xff, 0x02, 0x1b, + 0x40, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x0b, 0x0a, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x0e, 0x0b, + 0x43, 0x1a, 0x23, 0xe0, 0x40, 0x19, 0x23, 0x02, 0x43, 0x19, 0x06, 0x09, 0x43, 0x0a, 0x60, 0x02, + 0x68, 0x23, 0x21, 0x20, 0x69, 0x98, 0xf7, 0xfd, 0xfe, 0xa7, 0xf7, 0xff, 0xfc, 0xf9, 0x49, 0x12, + 0x20, 0x01, 0xf7, 0xff, 0xfd, 0x29, 0x69, 0x39, 0x29, 0x00, 0xd0, 0x08, 0x7e, 0x7b, 0x68, 0xf8, + 0x2b, 0x00, 0xd0, 0x02, 0xf0, 0x02, 0xfa, 0x8e, 0xe0, 0x01, 0xf0, 0x02, 0xfa, 0x83, 0x7e, 0x3b, + 0x2b, 0x00, 0xd1, 0x03, 0x68, 0x78, 0x21, 0x08, 0xf0, 0x02, 0xfa, 0x84, 0x2e, 0x00, 0xd0, 0x01, + 0x69, 0x7f, 0x97, 0x03, 0x98, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x84, 0x13, 0x72, 0xc1, 0x80, 0xb5, 0x30, 0xb0, 0x89, + 0x46, 0x6d, 0x76, 0x29, 0x09, 0xc9, 0x76, 0x69, 0x21, 0x80, 0x00, 0x89, 0x91, 0x07, 0x24, 0x00, + 0x46, 0x69, 0x94, 0x00, 0x92, 0x04, 0x93, 0x02, 0xf7, 0xff, 0xfd, 0xe0, 0xb0, 0x09, 0xbc, 0x30, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x83, 0x1c, 0x04, 0x91, 0x01, 0x92, 0x00, 0x34, 0xa0, + 0x1c, 0x07, 0x21, 0xff, 0x22, 0x0d, 0x68, 0x20, 0xf0, 0x03, 0xf9, 0xf4, 0x1c, 0x3b, 0x33, 0x90, + 0x68, 0x18, 0x7b, 0x39, 0x68, 0x23, 0x22, 0x0d, 0xf7, 0xff, 0xff, 0xd8, 0x28, 0x00, 0xdb, 0x4e, + 0x28, 0x0d, 0xd0, 0x01, 0x48, 0x28, 0xe0, 0x4a, 0x68, 0x23, 0x24, 0xff, 0x68, 0x19, 0x68, 0x5e, + 0x68, 0x9d, 0x7b, 0x1b, 0x0e, 0x0a, 0x46, 0x9c, 0x06, 0x0b, 0x43, 0x1a, 0x02, 0x24, 0x1c, 0x0b, + 0x20, 0xff, 0x40, 0x23, 0x04, 0x00, 0x02, 0x1b, 0x40, 0x01, 0x43, 0x1a, 0x0a, 0x09, 0x4b, 0x1f, + 0x43, 0x0a, 0x42, 0x9a, 0xd0, 0x01, 0x48, 0x1e, 0xe0, 0x31, 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0c, + 0x06, 0x2b, 0x0e, 0x2a, 0x43, 0x1a, 0x1c, 0x2b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x2b, + 0x40, 0x03, 0x0a, 0x1b, 0x43, 0x1a, 0x9b, 0x00, 0x60, 0x1a, 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x01, + 0x46, 0x63, 0x70, 0x13, 0x06, 0x33, 0x0e, 0x32, 0x43, 0x1a, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x33, + 0x02, 0x1b, 0x43, 0x1a, 0x23, 0xff, 0x04, 0x1b, 0x40, 0x33, 0x1c, 0x38, 0x0a, 0x1b, 0x1c, 0x11, + 0x30, 0x98, 0x43, 0x19, 0x68, 0x03, 0x42, 0x99, 0xd0, 0x01, 0x48, 0x0a, 0xe0, 0x07, 0x4a, 0x0a, + 0x1c, 0x8b, 0x40, 0x13, 0x4a, 0x09, 0x40, 0x0a, 0x43, 0x13, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xd8, 0xed, 0x53, 0x42, 0x53, 0x55, + 0xff, 0xff, 0xd8, 0xec, 0xff, 0xff, 0xd8, 0xeb, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xb5, 0xf0, 0xb0, 0x85, 0x93, 0x02, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x1c, 0x05, 0x93, 0x01, + 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x91, 0x03, 0x1c, 0x17, 0x2b, 0x0f, 0xd8, 0x5e, 0x1c, 0x06, + 0x36, 0xa0, 0x68, 0x30, 0x28, 0x00, 0xd0, 0x59, 0x21, 0x00, 0x22, 0x1f, 0xf0, 0x03, 0xf9, 0x72, + 0x68, 0x32, 0x4b, 0x2d, 0x24, 0xff, 0x60, 0x13, 0x1c, 0x2b, 0x33, 0x98, 0x68, 0x1a, 0x68, 0x31, + 0x06, 0x13, 0x46, 0x8c, 0x0e, 0x11, 0x43, 0x19, 0x02, 0x24, 0x1c, 0x13, 0x20, 0xff, 0x04, 0x00, + 0x40, 0x23, 0x02, 0x1b, 0x40, 0x02, 0x43, 0x19, 0x0a, 0x12, 0x43, 0x11, 0x46, 0x62, 0x60, 0x51, + 0x06, 0x3b, 0x0e, 0x3a, 0x43, 0x1a, 0x1c, 0x3b, 0x40, 0x23, 0x02, 0x1b, 0x43, 0x1a, 0x1c, 0x3b, + 0x40, 0x03, 0x68, 0x31, 0x0a, 0x1b, 0x43, 0x1a, 0x60, 0x8a, 0x22, 0x0b, 0x46, 0x69, 0x5c, 0x51, + 0x68, 0x33, 0x46, 0x6a, 0x73, 0x19, 0x21, 0x0f, 0x68, 0x33, 0x5c, 0x8a, 0x73, 0x5a, 0x1c, 0x2b, + 0x33, 0x9c, 0x78, 0x1b, 0x68, 0x31, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x0c, 0xe0, 0x05, 0x9b, 0x01, + 0x2b, 0x06, 0xd8, 0x01, 0x23, 0x06, 0xe0, 0x00, 0x23, 0x10, 0x1c, 0x2c, 0x73, 0x8b, 0x34, 0xa0, + 0x68, 0x20, 0x99, 0x0a, 0x9a, 0x01, 0x30, 0x0f, 0xf0, 0x03, 0xf8, 0xe8, 0x1c, 0x2b, 0x33, 0x90, + 0x68, 0x18, 0x7b, 0x69, 0x68, 0x23, 0x22, 0x1f, 0xf7, 0xff, 0xff, 0x10, 0x28, 0x1f, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x05, 0x28, 0x00, 0xdb, 0x03, 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x55, 0x53, 0x42, 0x43, 0xff, 0xff, 0xd8, 0xee, + 0xb5, 0xf0, 0xb0, 0x8b, 0x90, 0x01, 0x46, 0x68, 0x30, 0x42, 0x88, 0x04, 0x30, 0x04, 0x88, 0x05, + 0x48, 0x27, 0x9f, 0x12, 0x68, 0x00, 0x04, 0x24, 0x30, 0xf8, 0x68, 0x00, 0x04, 0x2d, 0x70, 0x42, + 0x02, 0x1a, 0x0a, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x70, 0xc3, 0x0a, 0x23, 0x0e, 0x24, + 0x43, 0x23, 0x0e, 0x12, 0x04, 0x1b, 0x70, 0x82, 0x0c, 0x2e, 0x0c, 0x1a, 0x0e, 0x1b, 0x71, 0x03, + 0x0e, 0x2d, 0x02, 0x33, 0x43, 0x2b, 0x04, 0x1b, 0x71, 0x42, 0x0e, 0x1a, 0x0c, 0x1b, 0x71, 0xc3, + 0xac, 0x02, 0x23, 0x00, 0x70, 0x01, 0x71, 0x82, 0x76, 0x23, 0x23, 0x40, 0x61, 0xe3, 0x4b, 0x15, + 0x09, 0xc9, 0x90, 0x02, 0x76, 0x61, 0x61, 0x26, 0x42, 0x9f, 0xd9, 0x15, 0x1c, 0x30, 0xf0, 0x02, + 0xf9, 0x09, 0x1c, 0x32, 0x1c, 0x39, 0x60, 0xa0, 0xf0, 0x03, 0xf8, 0x90, 0x1c, 0x21, 0x98, 0x01, + 0xf7, 0xff, 0xfc, 0xac, 0x68, 0xa1, 0x1c, 0x05, 0x1c, 0x32, 0x1c, 0x38, 0xf0, 0x03, 0xf8, 0x86, + 0x68, 0xa0, 0xf0, 0x02, 0xf8, 0xeb, 0xe0, 0x05, 0x60, 0xa7, 0x98, 0x01, 0x1c, 0x21, 0xf7, 0xff, + 0xfc, 0x9d, 0x1c, 0x05, 0xb0, 0x0b, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x88, 0x00, 0x00, 0xb5, 0x00, 0xb0, 0x85, 0x91, 0x00, 0x23, 0x00, + 0x21, 0x02, 0x22, 0x01, 0x93, 0x01, 0x93, 0x02, 0xf7, 0xff, 0xff, 0x9a, 0xb0, 0x05, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, 0x2a, 0x00, 0xd1, 0x02, 0x20, 0x03, 0x42, 0x40, + 0xe0, 0x08, 0x1c, 0x13, 0x22, 0x00, 0x91, 0x00, 0x92, 0x01, 0x92, 0x02, 0x21, 0x01, 0x22, 0x0b, + 0xf7, 0xff, 0xff, 0x86, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x85, + 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x92, 0x02, 0x1c, 0x0b, 0x22, 0x09, 0x21, 0x00, 0xf7, 0xff, + 0xff, 0x77, 0xb0, 0x05, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0xb0, 0x84, 0x1c, 0x04, 0x20, 0x01, + 0x1c, 0x0e, 0xf0, 0x02, 0xf8, 0xaf, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x24, 0x04, 0x42, 0x64, + 0xe0, 0x12, 0x23, 0x00, 0x93, 0x00, 0x23, 0x01, 0x93, 0x01, 0x90, 0x02, 0x21, 0x80, 0x1c, 0x20, + 0x22, 0x08, 0x23, 0x00, 0xf7, 0xff, 0xff, 0x5c, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x78, 0x2b, + 0x70, 0x33, 0x1c, 0x28, 0xf0, 0x02, 0xf8, 0x8a, 0xb0, 0x04, 0x1c, 0x20, 0xbc, 0x70, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0x4b, 0x4c, 0x4a, 0x4c, 0x78, 0x19, 0xb0, 0x87, 0x1c, 0x06, + 0x68, 0x17, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x4a, 0xe0, 0x00, 0x4b, 0x4a, 0x60, 0x13, 0x4b, 0x4a, + 0x68, 0x1b, 0x68, 0x9a, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x1b, 0x32, 0x44, 0x69, 0xdb, 0x00, 0x9b, + 0x18, 0xd2, 0x68, 0x13, 0x22, 0x01, 0x42, 0x13, 0xd1, 0x06, 0x4b, 0x44, 0x24, 0x01, 0x60, 0x1a, + 0x4b, 0x3e, 0x42, 0x64, 0x60, 0x1f, 0xe0, 0x72, 0x4a, 0x3c, 0x29, 0x00, 0xd0, 0x01, 0x4b, 0x3c, + 0xe0, 0x00, 0x4b, 0x3c, 0x60, 0x13, 0x4b, 0x3e, 0x1c, 0x35, 0x78, 0x1b, 0x35, 0x90, 0x2b, 0x00, + 0xd0, 0x12, 0x88, 0xf3, 0x68, 0x28, 0x22, 0xff, 0x93, 0x00, 0x21, 0x21, 0x23, 0x00, 0x93, 0x01, + 0x93, 0x02, 0xf7, 0xff, 0xff, 0x15, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x36, 0xf7, 0xff, 0xfa, 0x12, + 0x20, 0x3c, 0xf7, 0xfe, 0xfc, 0x39, 0xe0, 0x07, 0x21, 0x00, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x64, + 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x31, 0x24, 0x00, 0x4b, 0x27, 0x4a, 0x28, 0x78, 0x1b, 0x2b, 0x00, + 0xd0, 0x01, 0x4b, 0x27, 0xe0, 0x00, 0x4b, 0x27, 0x1c, 0x35, 0x60, 0x13, 0x35, 0x90, 0x2c, 0x00, + 0xda, 0x0a, 0x20, 0x32, 0xf7, 0xfe, 0xfc, 0x20, 0x68, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4c, + 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x19, 0xe0, 0x2d, 0x7b, 0x31, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x44, + 0x1c, 0x04, 0x20, 0x05, 0xf7, 0xfe, 0xfc, 0x10, 0x48, 0x1f, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xe2, + 0x2c, 0x00, 0xdb, 0x1f, 0x7b, 0x71, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x36, 0x1c, 0x04, 0x20, 0x05, + 0xf7, 0xfe, 0xfc, 0x02, 0x48, 0x19, 0x1c, 0x21, 0xf7, 0xff, 0xf9, 0xd4, 0x2c, 0x00, 0xdb, 0x11, + 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0xf9, 0x46, 0x69, 0x31, 0x17, 0x68, 0x28, 0xf7, 0xff, 0xff, 0x54, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x12, 0xf7, 0xff, 0xf9, 0xc5, 0x2c, 0x00, 0xdb, 0x02, 0x4b, 0x07, + 0x60, 0x1f, 0xe0, 0x04, 0x4b, 0x05, 0x4a, 0x09, 0x60, 0x1f, 0x23, 0x01, 0x60, 0x13, 0xb0, 0x07, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x01, 0x0d, 0x13, 0x70, 0x61, 0x12, 0x13, 0x70, 0x61, 0x33, 0x13, 0x70, 0x61, 0x5a, + 0x13, 0x70, 0x61, 0x82, 0xb5, 0x00, 0xb0, 0x81, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x4b, 0xb0, 0x01, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8d, 0x1c, 0x1e, 0x46, 0x6b, 0x33, 0x5f, 0x92, 0x07, + 0x78, 0x1a, 0x3b, 0x10, 0x78, 0x1b, 0x06, 0x12, 0x93, 0x06, 0x46, 0x6b, 0x33, 0x53, 0x78, 0x1b, + 0x16, 0x12, 0x93, 0x05, 0x46, 0x6b, 0x92, 0x04, 0x33, 0x2f, 0x22, 0x00, 0x91, 0x08, 0x70, 0x1a, + 0x4b, 0x99, 0x92, 0x0a, 0x60, 0x1a, 0x4a, 0x99, 0x4b, 0x99, 0x24, 0x00, 0x1c, 0x05, 0x94, 0x09, + 0x92, 0x03, 0x93, 0x02, 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x00, 0xe1, 0x08, 0x2c, 0x00, 0xd0, 0x22, + 0x1c, 0x28, 0x21, 0x00, 0xf7, 0xff, 0xff, 0x1e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x05, + 0xe0, 0x00, 0x20, 0x3c, 0xf7, 0xfe, 0xfb, 0x90, 0x4b, 0x8e, 0x68, 0x1b, 0x68, 0x9a, 0x4b, 0x8e, + 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, 0x68, 0x12, 0x2c, 0x00, 0xda, 0x09, 0x9a, 0x09, + 0x32, 0x01, 0x92, 0x09, 0x2a, 0x02, 0xdd, 0x00, 0xe0, 0xeb, 0x20, 0x0a, 0xf7, 0xfe, 0xfb, 0x7c, + 0xe0, 0xdf, 0x23, 0x00, 0x93, 0x09, 0x9b, 0x04, 0x9a, 0x05, 0x3b, 0x01, 0x06, 0x1b, 0x16, 0x1b, + 0x93, 0x04, 0x2a, 0x00, 0xd0, 0x31, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x4b, 0x7e, 0xe0, 0x00, 0x4b, 0x7e, 0x9a, 0x03, 0x1c, 0x28, 0x60, 0x13, 0x9b, 0x12, + 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x00, 0x99, 0x08, 0x1c, 0x32, 0xf7, 0xff, 0xfd, 0xb8, + 0x4b, 0x72, 0x1c, 0x04, 0x60, 0x1f, 0x1c, 0x83, 0x2b, 0x01, 0xd8, 0x00, 0xe0, 0xbf, 0x28, 0x00, + 0xda, 0x0d, 0xe0, 0xb8, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x7b, 0x69, 0x9b, 0x07, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x1c, 0x1c, 0x83, 0x1c, 0x04, 0x2b, 0x01, 0xd8, 0x43, 0xe0, 0x02, 0x2e, 0x00, + 0xd1, 0xf0, 0xe0, 0x49, 0x28, 0x00, 0xda, 0x47, 0xe0, 0xa3, 0x9b, 0x03, 0x9a, 0x02, 0x68, 0x1f, + 0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x65, 0xe0, 0x00, 0x4b, 0x65, 0x9a, 0x03, 0x1c, 0x28, + 0x60, 0x13, 0x9b, 0x12, 0x9a, 0x06, 0x93, 0x00, 0x92, 0x01, 0x23, 0x80, 0x99, 0x08, 0x1c, 0x32, + 0xf7, 0xff, 0xfd, 0x86, 0x4b, 0x59, 0x1c, 0x04, 0x60, 0x1f, 0x28, 0x00, 0xda, 0x06, 0x48, 0x5d, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xf7, 0x48, 0x5c, 0xf7, 0xff, 0xf9, 0x3c, 0x1c, 0xa3, 0x2b, 0x01, + 0xd8, 0x00, 0xe0, 0x84, 0x2c, 0x00, 0xda, 0x1a, 0xe0, 0x7d, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, + 0x7b, 0x29, 0x1c, 0x32, 0x9b, 0x07, 0xf7, 0xff, 0xfc, 0xe1, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x06, + 0x48, 0x52, 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xde, 0x48, 0x51, 0xf7, 0xff, 0xf9, 0x23, 0x1c, 0xa3, + 0x2b, 0x01, 0xd9, 0x07, 0x2c, 0x00, 0xdb, 0x62, 0x42, 0xb4, 0xd0, 0x05, 0xe0, 0x5f, 0x2e, 0x00, + 0xd1, 0xe3, 0xe0, 0x01, 0x2c, 0x00, 0xdb, 0x5e, 0x4b, 0x41, 0x4a, 0x40, 0x78, 0x1b, 0x68, 0x17, + 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x41, 0xe0, 0x00, 0x4b, 0x41, 0x46, 0x69, 0x60, 0x13, 0x1c, 0x28, + 0x31, 0x2f, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xce, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x28, 0x48, 0x41, + 0x1c, 0x21, 0xf7, 0xff, 0xf8, 0xb7, 0x48, 0x40, 0xf7, 0xff, 0xf8, 0xfc, 0x1c, 0x63, 0xd1, 0x02, + 0x4b, 0x32, 0x60, 0x1f, 0xe0, 0x45, 0x1c, 0x2c, 0x34, 0x90, 0x68, 0x20, 0x7b, 0x29, 0xf7, 0xff, + 0xfe, 0x03, 0x7b, 0x2a, 0x68, 0x24, 0x06, 0x13, 0x6a, 0x60, 0x2b, 0x00, 0xdb, 0x01, 0x21, 0x00, + 0xe0, 0x00, 0x21, 0x10, 0x23, 0x0f, 0x40, 0x1a, 0x18, 0x8a, 0x23, 0x01, 0x40, 0x93, 0x43, 0x98, + 0x46, 0x69, 0x62, 0x60, 0x31, 0x2f, 0x1c, 0x28, 0xaa, 0x0a, 0xf7, 0xff, 0xfc, 0xa3, 0x1c, 0x04, + 0x4b, 0x22, 0x60, 0x1f, 0x1c, 0xa3, 0x2b, 0x01, 0xd9, 0x21, 0x9b, 0x0a, 0x2b, 0x00, 0xd0, 0x07, + 0x4b, 0x2a, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, 0x46, 0x6b, 0x22, 0x01, 0x33, 0x2f, 0x70, 0x1a, + 0x2c, 0x00, 0xdb, 0x10, 0x4b, 0x25, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, 0x46, 0x6b, 0x33, 0x2f, + 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4c, 0x22, 0xe0, 0x05, 0x24, 0x00, 0xe0, 0x0e, 0x4c, 0x21, + 0xe0, 0x01, 0x2c, 0x00, 0xda, 0x0a, 0x9a, 0x04, 0x2a, 0x00, 0xdd, 0x00, 0xe6, 0xf2, 0x2c, 0x00, + 0xda, 0x04, 0x4a, 0x0d, 0x23, 0x01, 0x60, 0x13, 0x2c, 0x00, 0xdb, 0x02, 0x4a, 0x0a, 0x23, 0x00, + 0x60, 0x13, 0x9b, 0x15, 0x2b, 0x00, 0xd0, 0x04, 0x46, 0x6b, 0x33, 0x2f, 0x78, 0x1b, 0x9a, 0x15, + 0x70, 0x13, 0x9b, 0x16, 0x2b, 0x00, 0xd0, 0x02, 0x9b, 0x0a, 0x9a, 0x16, 0x60, 0x13, 0xb0, 0x0d, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, + 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x00, 0x0f, 0x42, 0x40, + 0x00, 0x03, 0x0d, 0x40, 0x13, 0x70, 0x61, 0xb1, 0x13, 0x70, 0x61, 0xc4, 0x13, 0x70, 0x61, 0xce, + 0x13, 0x70, 0x61, 0xe6, 0x13, 0x70, 0x61, 0xfa, 0x13, 0x70, 0x62, 0x09, 0x13, 0x70, 0x67, 0xa4, + 0xff, 0xff, 0xd8, 0xea, 0xff, 0xff, 0xd8, 0xe9, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x21, 0x27, + 0x1c, 0x1d, 0x1c, 0x06, 0x23, 0x00, 0x44, 0x69, 0x46, 0x68, 0x30, 0x1d, 0x70, 0x0b, 0x23, 0x2a, + 0x70, 0x03, 0x21, 0x08, 0x01, 0x7b, 0x43, 0x0b, 0x70, 0x43, 0x0e, 0x13, 0x70, 0x83, 0x0c, 0x13, + 0x70, 0xc3, 0x0a, 0x13, 0x71, 0x03, 0x21, 0x00, 0x0a, 0x2b, 0x71, 0x42, 0x71, 0x81, 0x71, 0xc3, + 0x72, 0x05, 0x72, 0x41, 0x7b, 0xb3, 0x42, 0xbb, 0xd9, 0x24, 0x1d, 0x3b, 0x00, 0x9a, 0x59, 0x93, + 0x2b, 0x00, 0xd0, 0x1f, 0x4c, 0x12, 0x21, 0x01, 0x60, 0x21, 0x59, 0x93, 0x22, 0x0a, 0x92, 0x01, + 0x22, 0x27, 0x44, 0x6a, 0x91, 0x02, 0x92, 0x03, 0x21, 0x00, 0x22, 0x06, 0x90, 0x00, 0x91, 0x04, + 0x92, 0x05, 0x43, 0x6b, 0x9a, 0x10, 0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x5b, 0x22, 0x00, + 0x60, 0x22, 0x28, 0x00, 0xdd, 0x08, 0x21, 0x27, 0x44, 0x69, 0x78, 0x0b, 0x2b, 0x00, 0xd0, 0x03, + 0x48, 0x04, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x0b, + 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, 0x58, 0x19, 0x20, 0x80, + 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, 0xfc, 0x9d, 0x1c, 0x07, + 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, 0xe0, 0x1c, 0x1c, 0x25, + 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, 0x91, 0x00, 0x98, 0x05, + 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x87, 0x28, 0x00, 0xdb, 0x0e, 0x9a, 0x03, + 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, 0x0c, 0x1c, 0x58, 0x8b, + 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, 0xb0, 0x07, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x05, 0x1c, 0x18, 0x23, 0x27, 0x27, 0x00, + 0x1c, 0x0e, 0x44, 0x6b, 0x46, 0x69, 0x31, 0x1d, 0x70, 0x1f, 0x23, 0x28, 0x70, 0x0b, 0x01, 0x73, + 0x70, 0x4b, 0x0e, 0x13, 0x70, 0x8b, 0x0c, 0x13, 0x70, 0xcb, 0x0a, 0x13, 0x71, 0x0b, 0x0a, 0x03, + 0x71, 0x4a, 0x71, 0x8f, 0x71, 0xcb, 0x72, 0x08, 0x72, 0x4f, 0x7b, 0xab, 0x42, 0xb3, 0xd9, 0x22, + 0x1d, 0x33, 0x00, 0x9a, 0x59, 0x53, 0x2b, 0x00, 0xd0, 0x1d, 0x4c, 0x12, 0x23, 0x01, 0x60, 0x23, + 0x59, 0x53, 0x22, 0x0a, 0x92, 0x01, 0x22, 0x27, 0x44, 0x6a, 0x92, 0x03, 0x22, 0x06, 0x43, 0x43, + 0x91, 0x00, 0x92, 0x05, 0x1c, 0x28, 0x1c, 0x31, 0x9a, 0x10, 0x97, 0x02, 0x97, 0x04, 0xf7, 0xff, + 0xfd, 0xd1, 0x60, 0x27, 0x28, 0x00, 0xdd, 0x08, 0x22, 0x27, 0x44, 0x6a, 0x78, 0x13, 0x2b, 0x00, + 0xd0, 0x03, 0x48, 0x05, 0xe0, 0x01, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xa4, 0xff, 0xff, 0xd8, 0xea, 0xb5, 0xf0, 0x1c, 0x1c, + 0x1c, 0x1f, 0x1c, 0x0b, 0xb0, 0x87, 0x33, 0x04, 0x90, 0x05, 0x00, 0x9b, 0x91, 0x04, 0x92, 0x03, + 0x58, 0x19, 0x20, 0x80, 0x1c, 0x0b, 0x43, 0x63, 0x02, 0x40, 0x42, 0x83, 0xd9, 0x02, 0xf0, 0x02, + 0xfc, 0x13, 0x1c, 0x07, 0x9b, 0x04, 0x20, 0x01, 0x33, 0x04, 0x00, 0x9b, 0x42, 0x40, 0x93, 0x02, + 0xe0, 0x1c, 0x1c, 0x25, 0x42, 0xbc, 0xd9, 0x00, 0x1c, 0x3d, 0x04, 0x2b, 0x99, 0x0c, 0x0c, 0x1e, + 0x91, 0x00, 0x98, 0x05, 0x99, 0x04, 0x9a, 0x03, 0x1c, 0x33, 0xf7, 0xff, 0xff, 0x8b, 0x28, 0x00, + 0xdb, 0x0e, 0x9a, 0x03, 0x1b, 0xa3, 0x19, 0x52, 0x92, 0x03, 0x99, 0x02, 0x9a, 0x05, 0x04, 0x1b, + 0x0c, 0x1c, 0x58, 0x8b, 0x99, 0x0c, 0x43, 0x6b, 0x18, 0xc9, 0x91, 0x0c, 0x2c, 0x00, 0xd1, 0xe0, + 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x70, 0x1c, 0x1d, 0x1c, 0x03, 0x33, 0xa0, + 0x1c, 0x16, 0x68, 0x1b, 0x22, 0x80, 0x01, 0x12, 0x18, 0x9c, 0xb0, 0x88, 0x2c, 0x00, 0xd1, 0x02, + 0x20, 0x04, 0x42, 0x40, 0xe0, 0x27, 0x46, 0x6a, 0x32, 0x1e, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x25, + 0x70, 0x13, 0x23, 0x02, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, + 0x92, 0x00, 0x93, 0x05, 0x1c, 0x22, 0x23, 0x08, 0xf7, 0xff, 0xfd, 0x5c, 0x28, 0x00, 0xdb, 0x12, + 0xa8, 0x06, 0x1c, 0x21, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb9, 0x2d, 0x00, 0xd0, 0x01, 0x9b, 0x06, + 0x60, 0x2b, 0x1d, 0x21, 0xa8, 0x06, 0x22, 0x04, 0xf0, 0x02, 0xfc, 0xb0, 0x2e, 0x00, 0xd0, 0x01, + 0x9b, 0x06, 0x60, 0x33, 0x20, 0x00, 0xb0, 0x08, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0xf0, 0xb0, 0x8b, 0x1c, 0x0f, 0x46, 0x69, 0x31, 0x22, 0x23, 0x12, 0x90, 0x07, 0x70, 0x0b, + 0x01, 0x7b, 0x22, 0x00, 0x70, 0x4b, 0x23, 0x24, 0x70, 0x8a, 0x70, 0xca, 0x71, 0x4a, 0x71, 0x0b, + 0x9b, 0x07, 0x22, 0x80, 0x33, 0xa0, 0x68, 0x1b, 0x01, 0x12, 0x18, 0x9c, 0x2c, 0x00, 0xd1, 0x02, + 0x21, 0x04, 0x42, 0x49, 0xe0, 0x2c, 0x25, 0x00, 0x21, 0x00, 0x22, 0x24, 0x1c, 0x20, 0xf0, 0x02, + 0xfc, 0xc9, 0x23, 0x22, 0x44, 0x6b, 0x93, 0x00, 0x22, 0x06, 0x23, 0x0a, 0x26, 0x00, 0x92, 0x01, + 0x93, 0x05, 0x1c, 0x39, 0x98, 0x07, 0x1c, 0x22, 0x23, 0x24, 0x96, 0x02, 0x96, 0x03, 0x96, 0x04, + 0xf7, 0xff, 0xfd, 0x10, 0x1c, 0x01, 0x28, 0x00, 0xdb, 0x08, 0x78, 0x22, 0x23, 0x1f, 0x1c, 0x10, + 0x40, 0x18, 0x28, 0x05, 0xd0, 0x06, 0x28, 0x07, 0xd1, 0x08, 0xe0, 0x03, 0x35, 0x01, 0x2d, 0x02, + 0xd0, 0x06, 0xe7, 0xd9, 0x4a, 0x05, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x01, 0x4b, 0x03, 0x60, 0x1e, + 0xb0, 0x0b, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x94, + 0xb5, 0xf0, 0xb0, 0x8f, 0x1c, 0x03, 0x90, 0x07, 0x91, 0x06, 0x33, 0xa0, 0x68, 0x1b, 0x21, 0x80, + 0x46, 0x6f, 0x46, 0x6c, 0x01, 0x09, 0x37, 0x37, 0x25, 0x00, 0x34, 0x27, 0x18, 0x5e, 0x70, 0x3d, + 0x1c, 0x20, 0x21, 0x00, 0x22, 0x10, 0xf0, 0x02, 0xfc, 0x85, 0x2e, 0x00, 0xd1, 0x02, 0x25, 0x04, + 0x42, 0x6d, 0xe0, 0x5a, 0x23, 0x06, 0x70, 0x25, 0x93, 0x01, 0x23, 0x01, 0x93, 0x02, 0x23, 0x0a, + 0x93, 0x05, 0x99, 0x06, 0x22, 0x00, 0x98, 0x07, 0x23, 0x00, 0x95, 0x04, 0x94, 0x00, 0x97, 0x03, + 0xf7, 0xff, 0xfc, 0xc8, 0x1c, 0x05, 0x1c, 0x29, 0x48, 0x26, 0xf7, 0xfe, 0xfe, 0x5b, 0x1c, 0x6a, + 0xd0, 0x43, 0x78, 0x3b, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xda, 0x3e, 0x46, 0x6a, 0x32, 0x27, + 0x23, 0x03, 0x70, 0x13, 0x99, 0x06, 0x1c, 0x30, 0x01, 0x4b, 0x70, 0x53, 0x23, 0x12, 0x71, 0x13, + 0x23, 0x00, 0x71, 0x53, 0x21, 0x00, 0x22, 0x12, 0xf0, 0x02, 0xfc, 0x54, 0x4a, 0x1a, 0x35, 0x02, + 0xd1, 0x01, 0x4b, 0x1a, 0xe0, 0x00, 0x4b, 0x1a, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x27, 0x93, 0x00, + 0x23, 0x06, 0x93, 0x01, 0x23, 0x00, 0x93, 0x02, 0x93, 0x03, 0x93, 0x04, 0x23, 0x0a, 0x93, 0x05, + 0x99, 0x06, 0x98, 0x07, 0x1c, 0x32, 0x23, 0x12, 0xf7, 0xff, 0xfc, 0x94, 0x1c, 0x05, 0x1c, 0x29, + 0x48, 0x10, 0xf7, 0xfe, 0xfe, 0x27, 0x2d, 0x00, 0xdb, 0x0f, 0x78, 0xb1, 0x23, 0x0f, 0x46, 0x6c, + 0x40, 0x19, 0x34, 0x37, 0x48, 0x0c, 0x70, 0x21, 0xf7, 0xfe, 0xfe, 0x1c, 0x78, 0x23, 0x3b, 0x02, + 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x02, 0xd8, 0x00, 0x4d, 0x08, 0xb0, 0x0f, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x62, 0x14, 0x13, 0x70, 0x60, 0x38, 0x00, 0x26, 0x25, 0xa0, + 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x62, 0x35, 0x13, 0x70, 0x62, 0x54, 0xff, 0xff, 0xd8, 0xef, + 0xb5, 0xf0, 0x7b, 0x83, 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x06, 0x42, 0xbb, 0xd8, 0x02, 0x24, 0x03, + 0x42, 0x64, 0xe0, 0x3a, 0x4d, 0x1f, 0x4b, 0x20, 0x48, 0x20, 0x60, 0x2b, 0x21, 0x00, 0xf7, 0xfe, + 0xfd, 0xf1, 0x4b, 0x1f, 0x1c, 0x30, 0x60, 0x2b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x04, + 0x28, 0x00, 0xdb, 0x27, 0x4b, 0x18, 0x1c, 0x39, 0x60, 0x2b, 0x1c, 0x30, 0xf7, 0xff, 0xff, 0x08, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x17, 0xf7, 0xfe, 0xfd, 0xdd, 0x2c, 0x00, 0xdb, 0x1a, 0x1c, 0x33, + 0x33, 0xa0, 0x68, 0x1a, 0x23, 0x80, 0x01, 0x1b, 0x5c, 0xd1, 0x23, 0x1f, 0x40, 0x19, 0x48, 0x12, + 0xf7, 0xfe, 0xfd, 0xd0, 0x1c, 0x3b, 0x1d, 0x3a, 0x33, 0x14, 0x00, 0x92, 0x00, 0x9b, 0x1c, 0x39, + 0x18, 0xb2, 0x18, 0xf3, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xaf, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x0b, + 0xf7, 0xfe, 0xfd, 0xc0, 0x4a, 0x03, 0x4b, 0x04, 0x60, 0x13, 0xb0, 0x01, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x62, 0x76, + 0x01, 0x31, 0x2d, 0x00, 0x13, 0x70, 0x62, 0x91, 0x13, 0x70, 0x62, 0xa5, 0x13, 0x70, 0x62, 0xba, + 0xb5, 0x10, 0xb0, 0x84, 0x1c, 0x14, 0x46, 0x6a, 0x32, 0x1b, 0x78, 0x12, 0x02, 0x24, 0x43, 0x1c, + 0x23, 0x00, 0x93, 0x00, 0x92, 0x01, 0x91, 0x02, 0x22, 0x06, 0x21, 0x80, 0x1c, 0x23, 0xf7, 0xff, + 0xfa, 0x97, 0xb0, 0x04, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0x8f, + 0x90, 0x03, 0x20, 0x16, 0x1c, 0x0f, 0xf0, 0x01, 0xfb, 0xcd, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, + 0xe1, 0x7e, 0x23, 0x12, 0x93, 0x00, 0x98, 0x03, 0x99, 0x05, 0x22, 0x01, 0x23, 0x00, 0xf7, 0xff, + 0xff, 0xd7, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe1, 0x65, 0x99, 0x05, 0x22, 0x12, 0x1c, 0x38, + 0xf0, 0x02, 0xfb, 0x44, 0x98, 0x05, 0xf0, 0x01, 0xfb, 0xa9, 0x78, 0xba, 0x78, 0xfb, 0x02, 0x12, + 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, + 0x70, 0xba, 0x7a, 0x3a, 0x70, 0xfb, 0x7a, 0x7b, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, + 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x72, 0x3a, 0x7a, 0xba, 0x72, 0x7b, + 0x7a, 0xfb, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, + 0x0c, 0x13, 0x0e, 0x12, 0x72, 0xba, 0x7b, 0x3a, 0x72, 0xfb, 0x7b, 0x7b, 0x02, 0x12, 0x43, 0x13, + 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x73, 0x7b, 0x7c, 0x7b, + 0x0e, 0x12, 0x00, 0x58, 0x18, 0xc0, 0x00, 0x80, 0x18, 0xc0, 0x73, 0x3a, 0xf0, 0x01, 0xfb, 0x7a, + 0x0e, 0x03, 0x74, 0xbb, 0x0c, 0x03, 0x74, 0xfb, 0x0a, 0x03, 0x75, 0x3b, 0x75, 0x78, 0x28, 0x00, + 0xd1, 0x00, 0xe1, 0x28, 0x7c, 0x7b, 0x21, 0x00, 0x00, 0x5a, 0x18, 0xd2, 0x00, 0x92, 0x18, 0xd2, + 0xf0, 0x02, 0xfb, 0x38, 0x22, 0x00, 0x92, 0x08, 0x92, 0x0d, 0xe1, 0x01, 0x20, 0x09, 0xf0, 0x01, + 0xfb, 0x61, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x12, 0x9a, 0x08, 0x1c, 0x21, 0x06, 0x13, + 0x0e, 0x1b, 0x93, 0x04, 0x23, 0x09, 0x93, 0x00, 0x22, 0x02, 0x9b, 0x04, 0x98, 0x03, 0xf7, 0xff, + 0xff, 0x67, 0x7c, 0xba, 0x7c, 0xfb, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7d, 0x3a, 0x1c, 0x21, + 0x02, 0x12, 0x43, 0x1a, 0x7d, 0x7b, 0x43, 0x13, 0x9a, 0x0d, 0x18, 0x9e, 0x1c, 0x30, 0x22, 0x09, + 0xf0, 0x02, 0xfa, 0xcc, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x31, 0x78, 0xb2, 0x78, 0xf3, 0x02, 0x12, + 0x43, 0x13, 0x04, 0x1b, 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x15, 0x0e, 0x12, + 0x70, 0xb2, 0x70, 0xf5, 0x1c, 0x28, 0xf0, 0x01, 0xfb, 0x2d, 0x90, 0x05, 0x28, 0x00, 0xd1, 0x00, + 0xe0, 0xde, 0x78, 0xf3, 0x98, 0x03, 0x93, 0x00, 0x99, 0x05, 0x22, 0x02, 0x9b, 0x04, 0xf7, 0xff, + 0xff, 0x37, 0x1c, 0x04, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xc5, 0x79, 0x33, 0x78, 0x34, 0x00, 0xd8, + 0x18, 0xc0, 0x00, 0x40, 0xf0, 0x01, 0xfb, 0x16, 0x0e, 0x03, 0x72, 0x73, 0x0c, 0x03, 0x72, 0xb3, + 0x0a, 0x03, 0x72, 0xf3, 0x73, 0x30, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0xc4, 0x9b, 0x05, 0x1b, 0x2d, + 0x19, 0x1b, 0x93, 0x06, 0x95, 0x07, 0x79, 0x33, 0x21, 0x00, 0x00, 0xda, 0x18, 0xd2, 0x00, 0x52, + 0xf0, 0x02, 0xfa, 0xd0, 0x22, 0x00, 0x92, 0x09, 0xe0, 0x89, 0x7a, 0x72, 0x7a, 0xb3, 0x06, 0x12, + 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xf2, 0x99, 0x06, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x33, 0x43, 0x13, + 0x9a, 0x0c, 0x18, 0x9d, 0x1c, 0x28, 0x22, 0x09, 0xf0, 0x02, 0xfa, 0x78, 0x79, 0x2b, 0x78, 0x2c, + 0x00, 0xd8, 0x1a, 0xc0, 0xf0, 0x01, 0xfa, 0xe6, 0x0e, 0x03, 0x73, 0xab, 0x0c, 0x03, 0x73, 0xeb, + 0x0a, 0x03, 0x74, 0x2b, 0x74, 0x68, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x94, 0x9b, 0x06, 0x9a, 0x07, + 0x19, 0x1b, 0x1b, 0x12, 0x92, 0x07, 0x93, 0x06, 0x79, 0x2b, 0x21, 0x00, 0x00, 0xda, 0x1a, 0xd2, + 0xf0, 0x02, 0xfa, 0xa0, 0x9a, 0x07, 0x98, 0x06, 0xe0, 0x08, 0x78, 0x43, 0x3b, 0x04, 0x06, 0x1b, + 0x0e, 0x1b, 0x2b, 0x01, 0xd9, 0x04, 0x78, 0x03, 0x1a, 0xd2, 0x18, 0xc0, 0x2a, 0x00, 0xd1, 0xf4, + 0x9b, 0x06, 0x1a, 0xc4, 0x73, 0x6c, 0x2c, 0x00, 0xd0, 0x15, 0x1c, 0x20, 0xf0, 0x01, 0xfa, 0xba, + 0x0e, 0x03, 0x72, 0x6b, 0x0c, 0x03, 0x72, 0xab, 0x0a, 0x03, 0x72, 0xeb, 0x73, 0x28, 0x28, 0x00, + 0xd0, 0x69, 0x1c, 0x22, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x39, 0x9a, 0x06, 0x9b, 0x07, 0x19, 0x12, + 0x1b, 0x1b, 0x92, 0x06, 0x93, 0x07, 0x22, 0x00, 0x92, 0x0a, 0xe0, 0x26, 0x7b, 0xab, 0x7b, 0xea, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x2b, 0x7c, 0x6c, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x1c, + 0x9b, 0x0b, 0x22, 0x07, 0x18, 0xe4, 0x1c, 0x20, 0x99, 0x06, 0xf0, 0x02, 0xfa, 0x1f, 0x78, 0x23, + 0x9a, 0x06, 0x18, 0xd2, 0x92, 0x06, 0x79, 0x22, 0x79, 0x63, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, + 0x0a, 0x1a, 0x0e, 0x1b, 0x43, 0x1a, 0x04, 0x12, 0x0c, 0x13, 0x0e, 0x12, 0x71, 0x22, 0x71, 0x63, + 0x9b, 0x0a, 0x9a, 0x0b, 0x33, 0x01, 0x93, 0x0a, 0x32, 0x07, 0x92, 0x0b, 0x79, 0x2b, 0x9a, 0x0a, + 0x42, 0x9a, 0xd3, 0xd3, 0x9b, 0x09, 0x9a, 0x0c, 0x33, 0x01, 0x93, 0x09, 0x32, 0x12, 0x92, 0x0c, + 0x79, 0x33, 0x9a, 0x09, 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x6f, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x5e, + 0x9b, 0x08, 0x9a, 0x0d, 0x33, 0x01, 0x93, 0x08, 0x32, 0x0d, 0x23, 0x00, 0x92, 0x0d, 0x93, 0x05, + 0x7c, 0x7b, 0x9a, 0x08, 0x42, 0x9a, 0xd2, 0x00, 0xe6, 0xf8, 0x9b, 0x05, 0x2b, 0x00, 0xd1, 0x01, + 0x24, 0x00, 0xe0, 0x08, 0x24, 0x00, 0x98, 0x05, 0xf0, 0x01, 0xfa, 0x48, 0x2c, 0x00, 0xd0, 0x02, + 0x1c, 0x38, 0xf7, 0xfe, 0xfb, 0x95, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x24, 0x04, 0x42, 0x64, 0xe7, 0xf4, 0x24, 0x04, 0x42, 0x64, 0xe7, 0xec, 0xb5, 0xf0, 0xb0, 0x8f, + 0x46, 0x6b, 0x1c, 0x06, 0x4a, 0xc7, 0x20, 0x00, 0x33, 0x37, 0x70, 0x18, 0x23, 0x10, 0x70, 0x13, + 0x4b, 0xc5, 0x1c, 0x32, 0x32, 0x98, 0x60, 0x13, 0x46, 0x6d, 0x1c, 0x33, 0x35, 0x21, 0x33, 0x90, + 0x60, 0x19, 0x74, 0xa8, 0x74, 0xe8, 0x75, 0x28, 0x75, 0x68, 0x1c, 0x08, 0x1c, 0x29, 0xf7, 0xff, + 0xfe, 0x55, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0xbd, 0xf7, 0xfe, 0xfb, 0xe4, 0x48, 0xbc, 0xf7, 0xfe, + 0xfc, 0x29, 0x2c, 0x00, 0xda, 0x00, 0xe1, 0xf0, 0x4b, 0xba, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x32, + 0x4c, 0xb9, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, + 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, + 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, + 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, + 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, + 0xd0, 0x09, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xfb, 0x33, 0x24, 0x01, 0x48, 0xa3, 0xf7, 0xfe, + 0xfb, 0xa9, 0x42, 0x64, 0xe1, 0xc8, 0x46, 0x68, 0x30, 0x21, 0x79, 0x03, 0x49, 0x9e, 0x71, 0x8b, + 0x79, 0x43, 0x71, 0xcb, 0x7a, 0x02, 0x7a, 0x43, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, 0x0c, 0x1a, + 0x0e, 0x1b, 0x72, 0x0b, 0x72, 0x4a, 0x7a, 0x82, 0x7a, 0xc3, 0x02, 0x12, 0x43, 0x13, 0x04, 0x1b, + 0x0e, 0x1a, 0x0c, 0x1b, 0x72, 0x8a, 0x72, 0xcb, 0x7b, 0x83, 0x4a, 0x95, 0x73, 0x0b, 0x7b, 0xc3, + 0x73, 0x4b, 0x7c, 0x03, 0x73, 0x8b, 0x23, 0x80, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x91, 0x21, 0x00, + 0x91, 0x03, 0x91, 0x07, 0x92, 0x01, 0xe0, 0xfc, 0x23, 0x33, 0x44, 0x6b, 0xa9, 0x0d, 0x78, 0x1a, + 0x78, 0x0b, 0x21, 0x35, 0x06, 0x12, 0x44, 0x69, 0x04, 0x1b, 0x43, 0x13, 0x78, 0x0a, 0x21, 0x36, + 0x44, 0x69, 0x02, 0x12, 0x43, 0x1a, 0x78, 0x0b, 0x48, 0x87, 0x43, 0x13, 0x9a, 0x07, 0x99, 0x03, + 0x18, 0x9b, 0x93, 0x05, 0x7a, 0x1a, 0x00, 0x52, 0xf7, 0xfe, 0xfb, 0x64, 0x49, 0x83, 0x23, 0x00, + 0x93, 0x04, 0x93, 0x06, 0x91, 0x02, 0xe0, 0xd0, 0x9b, 0x05, 0x99, 0x05, 0x7a, 0x5a, 0x7a, 0x9b, + 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7a, 0xca, 0x02, 0x12, 0x43, 0x1a, 0x7b, 0x0b, 0x43, 0x13, + 0x9a, 0x06, 0x18, 0x9c, 0x79, 0x63, 0x2b, 0x08, 0xd1, 0x7f, 0x79, 0xa3, 0x2b, 0x06, 0xd0, 0x09, + 0x2b, 0x01, 0xd0, 0x07, 0x2b, 0x02, 0xd0, 0x05, 0x2b, 0x03, 0xd0, 0x03, 0x2b, 0x04, 0xd0, 0x01, + 0x2b, 0x05, 0xd1, 0x72, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x6f, 0x79, 0x23, 0x2b, 0x01, 0xd9, 0x6c, + 0x1c, 0x32, 0x23, 0x01, 0x32, 0x9c, 0x70, 0x13, 0x48, 0x6d, 0x79, 0xa1, 0x22, 0x01, 0xf7, 0xfe, + 0xfb, 0x31, 0x23, 0x00, 0x73, 0x73, 0x73, 0x33, 0x27, 0x00, 0x25, 0x00, 0xe0, 0x2c, 0x7b, 0xa2, + 0x7b, 0xe3, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7c, 0x22, 0x02, 0x12, 0x43, 0x1a, 0x7c, 0x63, + 0x43, 0x13, 0x19, 0x59, 0x78, 0xcb, 0x2b, 0x02, 0xd1, 0x1c, 0x78, 0x8a, 0x06, 0x13, 0x2b, 0x00, + 0xda, 0x0b, 0x7b, 0x33, 0x2b, 0x00, 0xd1, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x73, 0x32, 0x79, 0x0b, + 0x79, 0x49, 0x02, 0x1b, 0x43, 0x19, 0x98, 0x02, 0xe0, 0x0a, 0x7b, 0x73, 0x2b, 0x00, 0xd1, 0x09, + 0x2a, 0x00, 0xd0, 0x07, 0x73, 0x72, 0x79, 0x0b, 0x79, 0x49, 0x02, 0x1b, 0x98, 0x01, 0x43, 0x19, + 0xf7, 0xfe, 0xfb, 0x00, 0x37, 0x01, 0x35, 0x07, 0x79, 0x23, 0x42, 0x9f, 0xd3, 0xcf, 0x7b, 0x31, + 0x29, 0x00, 0xd0, 0x64, 0x7b, 0x72, 0x2a, 0x00, 0xd0, 0x61, 0x48, 0x4e, 0xf7, 0xfe, 0xfa, 0xf2, + 0x4a, 0x45, 0x7b, 0x33, 0x99, 0x05, 0x74, 0x13, 0x7b, 0x73, 0x46, 0x68, 0x74, 0x53, 0x79, 0x4b, + 0x30, 0x21, 0x70, 0x33, 0x78, 0xa3, 0x46, 0x6d, 0x60, 0x73, 0x73, 0xd3, 0x78, 0xe3, 0x35, 0x37, + 0x60, 0xb3, 0xf7, 0xfe, 0xfa, 0x65, 0x4b, 0x44, 0x4c, 0x3d, 0x48, 0x44, 0x60, 0x23, 0x78, 0x31, + 0x68, 0xb2, 0xf7, 0xfe, 0xfa, 0xd7, 0x1c, 0x33, 0x33, 0x90, 0x68, 0x18, 0x1c, 0x29, 0xf7, 0xff, + 0xf8, 0x5b, 0x28, 0x00, 0xdb, 0x00, 0xe0, 0x81, 0xe0, 0xde, 0x7b, 0xa3, 0x7b, 0xe2, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x7c, 0x23, 0x02, 0x1b, 0x43, 0x13, 0x7c, 0x62, 0x1c, 0x10, 0x43, 0x18, + 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xf3, 0x23, 0x00, 0x73, 0xa3, 0x73, 0xe3, 0x74, 0x23, 0x74, 0x63, + 0x7a, 0xa2, 0x7a, 0x63, 0x04, 0x12, 0x06, 0x1b, 0x43, 0x1a, 0x7a, 0xe3, 0x02, 0x1b, 0x43, 0x13, + 0x7b, 0x22, 0x1c, 0x10, 0x43, 0x18, 0xd0, 0x01, 0xf0, 0x01, 0xf8, 0xe0, 0x23, 0x00, 0x72, 0x63, + 0x72, 0xa3, 0x72, 0xe3, 0x73, 0x23, 0x79, 0x63, 0x2b, 0x09, 0xd1, 0x03, 0x4a, 0x20, 0x4b, 0x28, + 0x60, 0x13, 0xe0, 0x28, 0x2b, 0x08, 0xd1, 0x0a, 0x79, 0xe3, 0x2b, 0x50, 0xd1, 0x07, 0x79, 0x23, + 0x2b, 0x01, 0xd9, 0x04, 0x79, 0xa2, 0x4b, 0x23, 0x49, 0x19, 0x1a, 0x9b, 0x60, 0x0b, 0x9a, 0x04, + 0x9b, 0x06, 0x32, 0x01, 0x33, 0x12, 0x92, 0x04, 0x93, 0x06, 0x99, 0x05, 0x9a, 0x04, 0x79, 0x0b, + 0x42, 0x9a, 0xd2, 0x00, 0xe7, 0x28, 0x9b, 0x03, 0x99, 0x07, 0x33, 0x01, 0x31, 0x0d, 0x93, 0x03, + 0x91, 0x07, 0x22, 0x32, 0x44, 0x6a, 0x78, 0x13, 0x99, 0x03, 0x42, 0x99, 0xd2, 0x00, 0xe6, 0xfb, + 0x48, 0x15, 0xf7, 0xfe, 0xfa, 0x77, 0x46, 0x68, 0x30, 0x21, 0xf7, 0xfe, 0xf9, 0xf9, 0x4c, 0x11, + 0xe0, 0x83, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x3c, 0x2c, 0x0d, 0xe0, 0x01, 0x13, 0x70, 0x62, 0xd3, + 0x13, 0x70, 0x62, 0xfd, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, + 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x63, 0xa8, 0x13, 0x70, 0x63, 0x3c, 0x13, 0x70, 0x63, 0x9a, + 0x13, 0x70, 0x63, 0x63, 0x13, 0x70, 0x63, 0xb7, 0xff, 0xff, 0xfb, 0x4f, 0x13, 0x70, 0x63, 0xfc, + 0xff, 0xff, 0xb1, 0xe0, 0xff, 0xff, 0xd8, 0xf0, 0x13, 0x70, 0x63, 0xcb, 0x4b, 0x39, 0x48, 0x3a, + 0x60, 0x23, 0xf7, 0xfe, 0xfa, 0x8f, 0x78, 0x29, 0x78, 0x33, 0x42, 0x8b, 0xd0, 0x02, 0x48, 0x37, + 0xf7, 0xfe, 0xfa, 0x40, 0x4b, 0x36, 0x4a, 0x37, 0x60, 0x13, 0x46, 0x6b, 0x33, 0x37, 0x78, 0x31, + 0x78, 0x1b, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x34, 0x78, 0x1b, 0x07, 0x9a, 0xd5, 0x06, 0x1c, 0x33, + 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xff, 0xaa, 0x28, 0x00, 0xdb, 0x3d, 0x4a, 0x2f, 0x4b, 0x30, + 0x60, 0x13, 0x68, 0xb2, 0x2a, 0x00, 0xd0, 0x09, 0x1c, 0x33, 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, + 0x79, 0xf1, 0x0e, 0x12, 0xf7, 0xfe, 0xff, 0x86, 0x28, 0x00, 0xdb, 0x2d, 0x4a, 0x25, 0x4b, 0x29, + 0x48, 0x29, 0x60, 0x13, 0x4a, 0x25, 0x4b, 0x29, 0x60, 0x13, 0xf7, 0xfe, 0xfa, 0x5b, 0x1c, 0x30, + 0xf7, 0xff, 0xf8, 0x70, 0x1c, 0x04, 0x48, 0x26, 0xf7, 0xfe, 0xfa, 0x54, 0x2c, 0x00, 0xdb, 0x1c, + 0x1c, 0x34, 0x23, 0x08, 0x34, 0xa0, 0x73, 0xb3, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x07, 0x20, 0x81, + 0x01, 0x40, 0xf0, 0x01, 0xf8, 0x3f, 0x23, 0x1f, 0x30, 0x1f, 0x43, 0x98, 0x60, 0x20, 0x1c, 0x33, + 0x33, 0xa0, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x24, 0x00, 0xe0, 0x06, 0x4a, 0x13, 0x4b, 0x19, + 0x24, 0x04, 0x60, 0x13, 0x42, 0x64, 0xe0, 0x00, 0x4c, 0x17, 0x4a, 0x0e, 0x4b, 0x11, 0x60, 0x13, + 0x2c, 0x00, 0xda, 0x05, 0x4b, 0x0d, 0x48, 0x15, 0x68, 0x19, 0xf7, 0xfe, 0xf9, 0xe3, 0xe0, 0x03, + 0x48, 0x13, 0xf7, 0xfe, 0xf9, 0xdf, 0x24, 0x00, 0xb0, 0x0f, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xff, 0xff, 0xfb, 0x4e, 0x13, 0x70, 0x64, 0x2a, 0x13, 0x70, 0x64, 0x45, + 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x60, 0x38, 0x13, 0x70, 0x01, 0x0e, 0x13, 0x70, 0x67, 0xa8, + 0xff, 0xff, 0xfb, 0x4d, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0x6f, 0xff, 0xff, 0xfb, 0x4c, + 0x13, 0x70, 0x64, 0x87, 0xff, 0xff, 0xfb, 0x4b, 0xff, 0xff, 0xd8, 0xe7, 0x13, 0x70, 0x64, 0x9e, + 0x13, 0x70, 0x64, 0xc0, 0xb5, 0xf0, 0x4b, 0x78, 0xb0, 0x8b, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x4f, + 0x46, 0x6b, 0x22, 0x00, 0x33, 0x27, 0x70, 0x1a, 0xf0, 0x01, 0xf9, 0x24, 0x4a, 0x73, 0x23, 0x10, + 0x70, 0x13, 0x4b, 0x73, 0x4a, 0x73, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x72, 0xe0, 0x00, + 0x4b, 0x72, 0x4e, 0x73, 0x46, 0x6d, 0x60, 0x13, 0x35, 0x11, 0x23, 0x00, 0x1c, 0x37, 0x74, 0xab, + 0x74, 0xeb, 0x75, 0x2b, 0x75, 0x6b, 0x37, 0x90, 0x68, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xfe, + 0x4c, 0x6c, 0x79, 0x2b, 0x79, 0xa2, 0x42, 0x9a, 0xd1, 0x23, 0x79, 0xe2, 0x79, 0x6b, 0x42, 0x9a, + 0xd1, 0x1f, 0x7a, 0x21, 0x7a, 0x2a, 0x7a, 0x60, 0x7a, 0x6b, 0x02, 0x09, 0x02, 0x12, 0x43, 0x08, + 0x43, 0x13, 0x42, 0x98, 0xd1, 0x15, 0x7a, 0xa1, 0x7a, 0xaa, 0x7a, 0xe0, 0x7a, 0xeb, 0x02, 0x09, + 0x02, 0x12, 0x43, 0x08, 0x43, 0x13, 0x42, 0x98, 0xd1, 0x0b, 0x7b, 0x22, 0x7b, 0xab, 0x42, 0x9a, + 0xd1, 0x07, 0x7b, 0x62, 0x7b, 0xeb, 0x42, 0x9a, 0xd1, 0x03, 0x7b, 0xa2, 0x7c, 0x2b, 0x42, 0x9a, + 0xd0, 0x08, 0x46, 0x68, 0x30, 0x11, 0xf7, 0xfe, 0xf8, 0xeb, 0x48, 0x57, 0xf7, 0xfe, 0xf9, 0x62, + 0x4c, 0x56, 0xe0, 0x93, 0x46, 0x6c, 0x1c, 0x28, 0x34, 0x27, 0xf7, 0xfe, 0xf8, 0xe1, 0x68, 0x38, + 0x1c, 0x21, 0xf7, 0xfe, 0xfe, 0xe1, 0x28, 0x00, 0xda, 0x01, 0x4c, 0x51, 0xe0, 0x86, 0x4b, 0x49, + 0x4a, 0x50, 0x60, 0x1a, 0x78, 0x31, 0x78, 0x23, 0x42, 0x8b, 0xd1, 0x03, 0x4b, 0x4e, 0x78, 0x1b, + 0x07, 0x9a, 0xd5, 0x08, 0x4b, 0x46, 0x33, 0x90, 0x68, 0x18, 0xf7, 0xfe, 0xfe, 0xbf, 0x28, 0x00, + 0xda, 0x01, 0x4c, 0x4a, 0xe0, 0x72, 0x49, 0x42, 0x68, 0x8a, 0x2a, 0x00, 0xd0, 0x0b, 0x1c, 0x0b, + 0x33, 0x90, 0x06, 0x12, 0x68, 0x18, 0x79, 0xc9, 0x0e, 0x12, 0xf7, 0xfe, 0xfe, 0x9b, 0x28, 0x00, + 0xda, 0x01, 0x4c, 0x43, 0xe0, 0x62, 0x4b, 0x36, 0x4a, 0x36, 0x78, 0x1b, 0x2b, 0x00, 0xd0, 0x01, + 0x4b, 0x35, 0xe0, 0x00, 0x4b, 0x35, 0x60, 0x13, 0x48, 0x35, 0x21, 0x00, 0xf7, 0xfe, 0xfe, 0xd2, + 0x28, 0x00, 0xda, 0x01, 0x4c, 0x3b, 0xe0, 0x51, 0x4b, 0x32, 0x79, 0x5b, 0x2b, 0x00, 0xd1, 0x03, + 0x4b, 0x35, 0x78, 0x1b, 0x07, 0xda, 0xd5, 0x22, 0x4d, 0x2d, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x29, + 0x4b, 0x30, 0x26, 0x01, 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, + 0x93, 0x00, 0x1c, 0x2b, 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, + 0xfd, 0xff, 0x4b, 0x21, 0x60, 0x23, 0x28, 0x00, 0xda, 0x06, 0x73, 0xae, 0x1c, 0x28, 0x21, 0x00, + 0xf7, 0xfe, 0xfe, 0xa8, 0x4c, 0x28, 0xe0, 0x29, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, 0x4b, 0x27, + 0x4d, 0x18, 0x4f, 0x1b, 0x4e, 0x1b, 0x60, 0x2b, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x60, + 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x22, 0xf7, 0xfe, 0xf8, 0xe5, 0x4b, 0x13, 0x60, 0x2b, 0x2c, 0x00, + 0xda, 0x01, 0x4c, 0x20, 0xe0, 0x12, 0x79, 0x31, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x01, 0x1c, 0x04, + 0x1c, 0x21, 0x48, 0x1d, 0xf7, 0xfe, 0xf8, 0xd6, 0x2c, 0x00, 0xda, 0x01, 0x4c, 0x1b, 0xe0, 0x05, + 0x79, 0x33, 0x4a, 0x06, 0x70, 0x13, 0x4a, 0x1a, 0x23, 0x01, 0x70, 0x13, 0xb0, 0x0b, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x3c, + 0x13, 0x70, 0x01, 0x0f, 0x13, 0x70, 0x60, 0x38, 0x00, 0x0f, 0x42, 0x40, 0x00, 0x03, 0x0d, 0x40, + 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x63, 0x16, 0xff, 0xff, 0xfc, 0x0f, + 0xff, 0xff, 0xfc, 0x18, 0x00, 0x98, 0x96, 0x80, 0x13, 0x70, 0x01, 0x0e, 0xff, 0xff, 0xfc, 0x17, + 0xff, 0xff, 0xfc, 0x16, 0xff, 0xff, 0xfc, 0x15, 0xff, 0xff, 0xfc, 0x14, 0x01, 0x31, 0x2d, 0x00, + 0x13, 0x70, 0x64, 0xdd, 0xff, 0xff, 0xfc, 0x13, 0x13, 0x70, 0x62, 0x91, 0xff, 0xff, 0xfc, 0x12, + 0x13, 0x70, 0x67, 0x9c, 0xb5, 0xf0, 0x4b, 0x8e, 0x22, 0x00, 0x80, 0x1a, 0x4b, 0x8d, 0x25, 0x00, + 0x80, 0x1a, 0x4b, 0x8d, 0x4a, 0x8d, 0x70, 0x1d, 0x4b, 0x8d, 0xb0, 0x8b, 0x70, 0x1d, 0x23, 0x78, + 0x42, 0x5b, 0x60, 0x13, 0x90, 0x08, 0xf0, 0x00, 0xff, 0xfd, 0x4c, 0x8a, 0x99, 0x08, 0x1c, 0x20, + 0xf7, 0xff, 0xfc, 0x7c, 0x28, 0x00, 0xda, 0x00, 0xe0, 0xfc, 0x49, 0x87, 0x20, 0x01, 0x73, 0xa0, + 0x78, 0x0b, 0x78, 0x4a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0x8b, 0x02, 0x1b, 0x43, 0x13, + 0x78, 0xca, 0x43, 0x1a, 0xd0, 0x48, 0x79, 0x4b, 0x2b, 0x00, 0xd1, 0x03, 0x4b, 0x7f, 0x78, 0x1b, + 0x42, 0x03, 0xd0, 0x1d, 0x4d, 0x7b, 0x23, 0x00, 0x73, 0xab, 0x4c, 0x7d, 0x4b, 0x7d, 0x26, 0x01, + 0x60, 0x23, 0x1c, 0x2b, 0x33, 0x90, 0x68, 0x18, 0x88, 0xeb, 0x21, 0xa1, 0x93, 0x00, 0x1c, 0x2b, + 0x33, 0x0e, 0x93, 0x02, 0x22, 0xfe, 0x23, 0x00, 0x96, 0x01, 0xf7, 0xfe, 0xfd, 0x51, 0x4b, 0x76, + 0x60, 0x23, 0x28, 0x00, 0xda, 0x01, 0x73, 0xae, 0xe0, 0xbf, 0x7b, 0xab, 0x33, 0x01, 0x73, 0xab, + 0x4b, 0x6d, 0x48, 0x72, 0x79, 0x1d, 0x1c, 0x29, 0xf7, 0xfe, 0xf8, 0x44, 0x4e, 0x69, 0x1c, 0x29, + 0x1c, 0x30, 0xf7, 0xff, 0xfa, 0x3d, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x6d, 0xf7, 0xfe, 0xf8, 0x3a, + 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x01, 0x1c, 0x30, 0xe0, 0x3c, 0x2c, 0x00, 0xda, 0x00, 0xe0, 0xa4, + 0x4a, 0x5d, 0x23, 0x01, 0x70, 0x13, 0x4b, 0x5e, 0x4a, 0x61, 0x70, 0x1d, 0x4b, 0x62, 0x60, 0x13, + 0x4a, 0x5a, 0x23, 0x00, 0x60, 0x13, 0xe0, 0x94, 0x4a, 0x5c, 0x71, 0x4d, 0x27, 0x01, 0x26, 0x00, + 0x25, 0x01, 0x92, 0x05, 0x1c, 0x32, 0x1e, 0x53, 0x41, 0x9a, 0x92, 0x09, 0x9a, 0x05, 0x78, 0x13, + 0x22, 0x01, 0x42, 0x13, 0xd0, 0x04, 0x9b, 0x09, 0x2b, 0x00, 0xd1, 0x01, 0x2d, 0x00, 0xd1, 0x27, + 0x48, 0x58, 0x1c, 0x31, 0xf7, 0xfe, 0xf8, 0x0e, 0x4a, 0x4e, 0x06, 0x31, 0x0e, 0x09, 0x1c, 0x10, + 0x92, 0x07, 0xf7, 0xff, 0xfa, 0x05, 0x1c, 0x04, 0x1c, 0x21, 0x48, 0x51, 0xf7, 0xfe, 0xf8, 0x02, + 0x1c, 0xa3, 0x2b, 0x01, 0xd8, 0x10, 0x9b, 0x09, 0x2b, 0x00, 0xd0, 0x0d, 0x4a, 0x48, 0x4b, 0x4a, + 0x60, 0x13, 0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x56, 0x4a, 0x40, 0x23, 0x79, 0x42, 0x5b, 0x60, 0x13, + 0x4a, 0x3d, 0x23, 0x00, 0x70, 0x13, 0xe0, 0x6d, 0x2c, 0x00, 0xda, 0x40, 0x2d, 0x00, 0xd0, 0x38, + 0x4d, 0x45, 0x4c, 0x3f, 0x4b, 0x3f, 0x95, 0x06, 0x4a, 0x3a, 0x60, 0x23, 0x4b, 0x43, 0x27, 0x00, + 0x68, 0x18, 0x88, 0xd3, 0x60, 0x2f, 0x73, 0x97, 0x93, 0x00, 0x1c, 0x13, 0x33, 0x0e, 0x25, 0x01, + 0x93, 0x02, 0x21, 0xa1, 0x23, 0x00, 0x22, 0xfe, 0x95, 0x01, 0xf7, 0xfe, 0xfc, 0xd1, 0x4b, 0x36, + 0x1c, 0x05, 0x60, 0x23, 0x28, 0x00, 0xda, 0x05, 0x4a, 0x2e, 0x23, 0x01, 0x73, 0x93, 0x9a, 0x06, + 0x60, 0x17, 0xe0, 0x06, 0x4a, 0x2b, 0x7b, 0x93, 0x33, 0x01, 0x73, 0x93, 0x4b, 0x2a, 0x22, 0x01, + 0x71, 0x5a, 0x4b, 0x28, 0x48, 0x32, 0x7b, 0x9f, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 0xff, 0xba, + 0x4b, 0x26, 0x22, 0x01, 0x78, 0x1b, 0x42, 0x13, 0xd0, 0x05, 0x2d, 0x00, 0xda, 0x03, 0x25, 0x01, + 0xe0, 0x02, 0x36, 0x01, 0xe0, 0x00, 0x25, 0x00, 0x42, 0xbe, 0xdb, 0x8b, 0xe0, 0x1d, 0x4b, 0x1e, + 0x20, 0x00, 0x24, 0x01, 0x70, 0x18, 0x70, 0x58, 0x70, 0x98, 0x70, 0xdc, 0x06, 0x31, 0x0e, 0x09, + 0x9d, 0x08, 0x71, 0x19, 0x89, 0x2b, 0x4a, 0x12, 0x80, 0x13, 0x89, 0x6b, 0x4a, 0x11, 0x80, 0x13, + 0x4b, 0x11, 0x4a, 0x17, 0x70, 0x1c, 0x4b, 0x12, 0x70, 0x19, 0x4b, 0x17, 0x60, 0x13, 0x4b, 0x0f, + 0x60, 0x18, 0xf0, 0x00, 0xfe, 0xfb, 0x20, 0x00, 0xe0, 0x0e, 0x4a, 0x0c, 0x23, 0x7a, 0x42, 0x5b, + 0x60, 0x13, 0x48, 0x0c, 0xf7, 0xfe, 0xfd, 0xe6, 0x4a, 0x07, 0x23, 0x00, 0x70, 0x13, 0x48, 0x15, + 0xf7, 0xfd, 0xff, 0x80, 0x20, 0x03, 0x42, 0x40, 0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x9e, 0x13, 0x70, 0x67, 0xa0, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0xa8, + 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x01, 0x0e, + 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x64, 0xf2, + 0x13, 0x70, 0x65, 0x10, 0x13, 0x70, 0x64, 0xf7, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x72, 0xc2, 0x90, + 0x13, 0x70, 0x65, 0x2d, 0x13, 0x70, 0x65, 0x56, 0xb5, 0xf0, 0x4b, 0x51, 0xb0, 0x89, 0x68, 0x1f, + 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, 0x1c, 0x1a, 0x32, 0x58, 0x18, 0xfb, 0x18, 0xbe, 0x22, 0x00, + 0x1c, 0x05, 0x67, 0x1a, 0x20, 0x32, 0xf7, 0xfd, 0xf9, 0x6f, 0x24, 0x00, 0x23, 0x16, 0x22, 0x00, + 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, + 0xf7, 0xfe, 0xfc, 0x36, 0x28, 0x00, 0xda, 0x3d, 0x20, 0x64, 0x34, 0x01, 0xf7, 0xfd, 0xf9, 0x5c, + 0x2c, 0x03, 0xd1, 0xeb, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0xba, 0x20, 0x64, 0xf7, 0xfd, + 0xf9, 0x53, 0x23, 0x16, 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, + 0x22, 0x06, 0x00, 0x5b, 0x96, 0x02, 0xf7, 0xfe, 0xfc, 0x1b, 0x28, 0x00, 0xda, 0x22, 0x34, 0x01, + 0x2c, 0x03, 0xd1, 0xe8, 0x24, 0x00, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x76, 0x20, 0x64, 0xf7, 0xfd, + 0xf9, 0x3b, 0x1c, 0x28, 0xf7, 0xfe, 0xf8, 0x9c, 0x20, 0x64, 0xf7, 0xfd, 0xf9, 0x35, 0x23, 0x16, + 0x22, 0x00, 0x93, 0x01, 0x23, 0x80, 0x92, 0x00, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, + 0x96, 0x02, 0xf7, 0xfe, 0xfb, 0xfd, 0x28, 0x00, 0xda, 0x04, 0x34, 0x01, 0x2c, 0x03, 0xd1, 0xe2, + 0x48, 0x24, 0xe0, 0x40, 0x1c, 0x6a, 0x04, 0x13, 0x0c, 0x1b, 0x93, 0x06, 0x00, 0xab, 0x19, 0x5b, + 0x00, 0xdb, 0x18, 0xff, 0x1c, 0x3b, 0x33, 0x7c, 0x24, 0x00, 0x92, 0x07, 0x93, 0x05, 0x20, 0x32, + 0xf7, 0xfd, 0xf9, 0x12, 0x23, 0x00, 0x93, 0x00, 0x93, 0x01, 0x93, 0x02, 0x1c, 0x30, 0x21, 0x00, + 0x22, 0x05, 0x9b, 0x06, 0xf7, 0xfe, 0xfb, 0xdc, 0x28, 0x00, 0xda, 0x02, 0x4b, 0x16, 0x1b, 0x18, + 0x34, 0x01, 0x9a, 0x05, 0x25, 0x00, 0x60, 0x15, 0x9b, 0x07, 0x67, 0x3b, 0x28, 0x00, 0xda, 0x1a, + 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfe, 0xfc, 0x28, 0x20, 0x32, 0xf7, 0xfd, 0xf8, 0xf5, 0x23, 0x16, + 0x93, 0x01, 0x23, 0x80, 0x1c, 0x30, 0x21, 0x80, 0x22, 0x06, 0x00, 0x5b, 0x95, 0x00, 0x96, 0x02, + 0xf7, 0xfe, 0xfb, 0xbe, 0x28, 0x00, 0xdb, 0x02, 0x20, 0x01, 0x42, 0x40, 0xe0, 0x01, 0x48, 0x07, + 0x67, 0x3d, 0x2c, 0x04, 0xdd, 0xcb, 0xb0, 0x09, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0xff, 0xff, 0xf7, 0x67, 0xff, 0xff, 0xe0, 0xc0, 0xff, 0xff, 0xf7, 0x3e, + 0xb5, 0x10, 0x4b, 0x0a, 0x1c, 0x04, 0x68, 0x1b, 0x68, 0x9a, 0x23, 0x01, 0x60, 0x93, 0xf7, 0xfe, + 0xf8, 0x2f, 0x28, 0x00, 0xdb, 0x02, 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x46, 0x4b, 0x03, 0x68, 0x1b, + 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, + 0xb5, 0xf0, 0x1c, 0x06, 0x48, 0x44, 0xb0, 0x8b, 0x68, 0x02, 0x1c, 0x33, 0x92, 0x06, 0x68, 0x91, + 0x33, 0x10, 0x00, 0x9b, 0x18, 0xc9, 0x00, 0xb3, 0x19, 0x9b, 0x00, 0xdb, 0x9c, 0x06, 0x1c, 0x1a, + 0x32, 0x58, 0x18, 0xa2, 0x92, 0x08, 0x18, 0xe3, 0x22, 0x00, 0x67, 0x1a, 0x68, 0x03, 0x4a, 0x3b, + 0x68, 0x9b, 0x1d, 0x0f, 0x68, 0x5b, 0x68, 0x4b, 0x40, 0x13, 0x2b, 0x01, 0xd0, 0x02, 0x24, 0x01, + 0x42, 0x64, 0xe0, 0x64, 0x1c, 0x73, 0x04, 0x1b, 0x22, 0x00, 0x0c, 0x1b, 0x92, 0x09, 0x93, 0x05, + 0x4b, 0x33, 0x20, 0x0a, 0x60, 0x3b, 0xf7, 0xfd, 0xf8, 0x8f, 0x4b, 0x32, 0x20, 0x64, 0x60, 0x3b, + 0xf7, 0xfd, 0xf8, 0x8a, 0x4b, 0x30, 0x22, 0x80, 0x60, 0x3b, 0x23, 0xfa, 0x00, 0xdb, 0x93, 0x00, + 0x00, 0x52, 0x23, 0x00, 0x1c, 0x38, 0x1c, 0x39, 0xf7, 0xfd, 0xff, 0x92, 0x68, 0x3a, 0x4b, 0x2b, + 0x1c, 0x04, 0x40, 0x13, 0x2b, 0x05, 0xd1, 0x30, 0x23, 0xc0, 0x01, 0x1b, 0x40, 0x1a, 0x23, 0x80, + 0x00, 0xdb, 0x42, 0x9a, 0xd0, 0x29, 0x28, 0x00, 0xd1, 0x29, 0x20, 0x64, 0xf7, 0xfd, 0xf8, 0x6c, + 0x4b, 0x23, 0x21, 0x80, 0x68, 0x1a, 0x25, 0x00, 0x92, 0x07, 0x4a, 0x22, 0x60, 0x1a, 0x23, 0x16, + 0x93, 0x01, 0x9b, 0x08, 0x22, 0x06, 0x93, 0x02, 0x1c, 0x18, 0x23, 0x80, 0x00, 0x5b, 0x94, 0x00, + 0xf7, 0xfe, 0xfb, 0x2e, 0x1c, 0x04, 0x28, 0x00, 0xdb, 0x09, 0x98, 0x08, 0x21, 0x00, 0x22, 0x05, + 0x9b, 0x05, 0x95, 0x00, 0x95, 0x01, 0x95, 0x02, 0xf7, 0xfe, 0xfb, 0x22, 0x1c, 0x04, 0x4b, 0x14, + 0x9a, 0x07, 0x60, 0x1a, 0x2c, 0x00, 0xdb, 0x02, 0xe0, 0x08, 0x24, 0x01, 0x42, 0x64, 0x9b, 0x09, + 0x33, 0x01, 0x93, 0x09, 0x2b, 0x04, 0xd1, 0xab, 0x2c, 0x00, 0xdb, 0x08, 0x00, 0xb3, 0x9a, 0x06, + 0x19, 0x9b, 0x00, 0xdb, 0x18, 0xd3, 0x22, 0x00, 0x67, 0xda, 0x1c, 0x72, 0x67, 0x1a, 0xb0, 0x0b, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x20, 0x05, + 0x13, 0x70, 0x60, 0x38, 0x00, 0x03, 0x0d, 0x40, 0xb5, 0xf0, 0x4c, 0x1d, 0xb0, 0x81, 0x68, 0x23, + 0x1c, 0x06, 0x68, 0x9d, 0x23, 0x01, 0x60, 0xab, 0xf7, 0xff, 0xff, 0x5a, 0x1c, 0x07, 0x28, 0x00, + 0xda, 0x1b, 0x68, 0x23, 0x22, 0x37, 0x68, 0x99, 0x20, 0x0a, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, + 0x68, 0x23, 0x1c, 0x34, 0x68, 0x9b, 0x34, 0x10, 0x68, 0x1b, 0x00, 0xa4, 0xf7, 0xfd, 0xf8, 0x04, + 0x4b, 0x10, 0x19, 0x2c, 0x60, 0x63, 0x20, 0x32, 0xf7, 0xfc, 0xff, 0xfe, 0x4b, 0x0e, 0x20, 0x64, + 0x60, 0x63, 0xf7, 0xfc, 0xff, 0xf9, 0x4b, 0x0d, 0x60, 0x63, 0x48, 0x09, 0x22, 0x37, 0x68, 0x03, + 0xb0, 0x01, 0x68, 0x99, 0x68, 0x4b, 0x40, 0x13, 0x60, 0x4b, 0x68, 0x03, 0x68, 0x9a, 0x23, 0x04, + 0x60, 0x93, 0x68, 0x03, 0x1c, 0x38, 0x68, 0x9b, 0x68, 0x1b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x10, 0x01, + 0xb5, 0xf0, 0x4b, 0x51, 0x4c, 0x51, 0x78, 0x1b, 0xb0, 0x83, 0x1c, 0x1a, 0x4b, 0x50, 0x1e, 0x51, + 0x41, 0x8a, 0x68, 0x1b, 0x60, 0x22, 0x2b, 0x00, 0xd0, 0x2b, 0x4b, 0x4e, 0x00, 0x92, 0x68, 0x1b, + 0x68, 0x99, 0x1c, 0x0b, 0x33, 0x44, 0x18, 0x9b, 0x68, 0x1b, 0x07, 0xda, 0xd4, 0x23, 0xf0, 0x00, + 0xfd, 0x11, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xc0, 0xf0, 0x00, 0xfd, 0x00, 0x20, 0x64, 0xf7, 0xfc, + 0xff, 0xbb, 0xf0, 0x00, 0xfd, 0x07, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb6, 0xf0, 0x00, 0xfc, 0xf6, + 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xb1, 0xf0, 0x00, 0xfc, 0xfd, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xac, + 0xf0, 0x00, 0xfc, 0xec, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0xa7, 0x20, 0xfa, 0x00, 0x40, 0xf7, 0xfc, + 0xff, 0xa3, 0x24, 0x01, 0xe0, 0x62, 0x23, 0x00, 0x60, 0x8b, 0x20, 0x00, 0xf7, 0xfc, 0xfd, 0x2e, + 0x68, 0x20, 0xf7, 0xff, 0xff, 0x79, 0x1c, 0x06, 0x28, 0x00, 0xda, 0x03, 0x68, 0x20, 0xf7, 0xff, + 0xff, 0x73, 0x1c, 0x06, 0x20, 0x3c, 0xf7, 0xfc, 0xff, 0x8f, 0x4b, 0x2e, 0x48, 0x2e, 0x93, 0x01, + 0x68, 0x1b, 0x1c, 0x31, 0x68, 0x9a, 0x4b, 0x29, 0x32, 0x44, 0x68, 0x1b, 0x00, 0x9b, 0x18, 0xd2, + 0x68, 0x15, 0x1c, 0x2a, 0xf7, 0xfd, 0xfd, 0x56, 0x4c, 0x25, 0x22, 0x01, 0x60, 0x22, 0x2e, 0x00, + 0xdb, 0x38, 0x4b, 0x26, 0x1c, 0x2a, 0x40, 0x1a, 0x4b, 0x25, 0x42, 0x9a, 0xd1, 0x32, 0x4d, 0x25, + 0x27, 0x00, 0x70, 0x2f, 0x60, 0x27, 0xf7, 0xff, 0xfb, 0x8d, 0x4b, 0x23, 0x4a, 0x23, 0x60, 0x13, + 0x4b, 0x23, 0x93, 0x00, 0x28, 0x00, 0xdb, 0x11, 0x48, 0x22, 0xf7, 0xfd, 0xfd, 0x3b, 0xf0, 0x00, + 0xfc, 0xa5, 0x22, 0x01, 0x60, 0x27, 0x70, 0x2a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xef, 0x9a, 0x01, + 0x24, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0xe0, 0x14, 0x23, 0x01, 0x60, 0x23, + 0x1c, 0x31, 0x48, 0x19, 0xf7, 0xfd, 0xfd, 0x26, 0x70, 0x2f, 0xf0, 0x00, 0xfc, 0x8f, 0x20, 0x64, + 0xf7, 0xfc, 0xff, 0x4a, 0x98, 0x00, 0xf7, 0xfc, 0xfc, 0xd9, 0x9a, 0x01, 0x68, 0x13, 0x68, 0x9a, + 0x23, 0x04, 0x60, 0x93, 0x24, 0x01, 0x20, 0x64, 0xf7, 0xfc, 0xff, 0x3e, 0xb0, 0x03, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, + 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x65, 0x73, 0x00, 0x00, 0x31, 0x05, + 0x00, 0x00, 0x10, 0x05, 0x13, 0x70, 0x67, 0x9c, 0x00, 0x0f, 0x42, 0x40, 0x13, 0x70, 0x60, 0x38, + 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x65, 0x9d, 0x13, 0x70, 0x65, 0xae, 0xb5, 0xf0, 0x4b, 0x28, + 0xb0, 0x85, 0x68, 0x1b, 0x90, 0x03, 0x92, 0x02, 0x2b, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x43, + 0x04, 0x0b, 0x4f, 0x24, 0x25, 0x00, 0x0c, 0x1e, 0xf7, 0xff, 0xff, 0x32, 0x28, 0x00, 0xd1, 0x01, + 0x25, 0x00, 0xe0, 0x01, 0x2d, 0x00, 0xdb, 0x02, 0x78, 0x3b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x1e, + 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, 0x42, 0x6d, 0x4b, 0x1b, 0x68, 0x19, 0x29, 0x00, 0xd1, 0xeb, + 0x4a, 0x1a, 0x4b, 0x1b, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x17, 0x4c, 0x1a, 0x20, 0x00, 0x68, 0x23, + 0x68, 0x9b, 0x60, 0x99, 0xf7, 0xfc, 0xfc, 0x82, 0x4b, 0x17, 0x9a, 0x03, 0x78, 0x19, 0x9b, 0x02, + 0x48, 0x16, 0x93, 0x00, 0x1c, 0x33, 0xf7, 0xfe, 0xfc, 0xdf, 0x1c, 0x05, 0x48, 0x14, 0xf7, 0xfc, + 0xfc, 0x75, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4a, 0x0c, 0x4b, 0x11, 0x60, 0x13, + 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x08, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x07, 0x68, 0x1b, 0x2b, 0x00, + 0xd1, 0xc2, 0x2d, 0x00, 0xdb, 0xc0, 0x20, 0x01, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x2d, 0xc6, 0xc0, 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, + 0x13, 0x70, 0x12, 0xd9, 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x4b, 0xb0, 0x87, 0x68, 0x1b, + 0x1c, 0x07, 0x92, 0x05, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x48, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x03, + 0x4a, 0x47, 0x4b, 0x48, 0x40, 0x02, 0x60, 0x1a, 0x4b, 0x47, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x06, + 0x4a, 0x46, 0x68, 0x13, 0x2b, 0x01, 0xdd, 0x02, 0x23, 0x01, 0x60, 0x13, 0xe0, 0x61, 0x4b, 0x3f, + 0x4a, 0x3d, 0x93, 0x03, 0x04, 0x0b, 0x0c, 0x1b, 0x25, 0x00, 0x26, 0x00, 0x92, 0x04, 0x93, 0x02, + 0x9a, 0x04, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x04, 0x9a, 0x03, 0x68, 0x13, 0x2b, 0x00, 0xd1, 0x00, + 0x26, 0x00, 0xf7, 0xff, 0xfe, 0xad, 0x28, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x4b, 0x36, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x03, 0x4b, 0x35, 0x68, 0x1b, 0x2b, 0x03, 0xd0, 0x53, 0x2d, 0x00, 0xdb, 0x03, + 0x4b, 0x33, 0x78, 0x1b, 0x2b, 0x01, 0xd0, 0x04, 0x4a, 0x30, 0x23, 0x01, 0x25, 0x01, 0x60, 0x13, + 0x42, 0x6d, 0x4b, 0x2e, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x41, 0x4b, 0x28, 0x4a, 0x2d, 0x68, 0x1b, + 0x2b, 0x00, 0xd0, 0x01, 0x4b, 0x2c, 0xe0, 0x00, 0x4b, 0x2c, 0x60, 0x13, 0x1c, 0x6b, 0xd0, 0x18, + 0x4c, 0x2b, 0x20, 0x00, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x00, 0x60, 0x93, 0xf7, 0xfc, 0xfb, 0xee, + 0x4b, 0x28, 0x9a, 0x05, 0x78, 0x19, 0x48, 0x28, 0x9b, 0x02, 0x92, 0x00, 0x1c, 0x3a, 0xf7, 0xfe, + 0xfc, 0xd5, 0x1c, 0x05, 0x48, 0x25, 0xf7, 0xfc, 0xfb, 0xe1, 0x68, 0x23, 0x68, 0x9a, 0x23, 0x04, + 0x60, 0x93, 0x4a, 0x1c, 0x4b, 0x22, 0x60, 0x13, 0x2d, 0x00, 0xda, 0x02, 0x4a, 0x17, 0x23, 0x01, + 0x60, 0x13, 0x4b, 0x15, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x05, 0x4b, 0x14, 0x68, 0x1b, 0x2b, 0x00, + 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x13, 0x4b, 0x11, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x07, 0x4b, 0x10, + 0x78, 0x1b, 0x2b, 0x01, 0xd1, 0x03, 0x2d, 0x00, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x07, 0x36, 0x01, + 0x2e, 0x03, 0xdd, 0x95, 0x0f, 0xeb, 0x22, 0x01, 0x40, 0x53, 0x06, 0x1b, 0x0e, 0x18, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xc0, 0x13, 0x70, 0x67, 0x94, + 0x7f, 0xff, 0xff, 0xff, 0x13, 0x70, 0x67, 0x54, 0x13, 0x70, 0x67, 0x48, 0x13, 0x70, 0x67, 0x6c, + 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, 0x00, 0x98, 0x96, 0x80, 0x00, 0x2d, 0xc6, 0xc0, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x60, 0x3c, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x12, 0xd9, + 0x00, 0x0f, 0x42, 0x40, 0xb5, 0xf0, 0x4b, 0x1e, 0xb0, 0x81, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x31, + 0xf7, 0xff, 0xfe, 0x1e, 0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x2b, 0x4b, 0x1a, 0x78, 0x1b, + 0x2b, 0x00, 0xd0, 0x27, 0x4e, 0x19, 0x4f, 0x1a, 0x4c, 0x1a, 0x4d, 0x1b, 0x60, 0x37, 0x79, 0x29, + 0x1c, 0x20, 0xf7, 0xfe, 0xfc, 0xe5, 0x28, 0x00, 0xdb, 0x1c, 0x60, 0x37, 0x79, 0x29, 0x1c, 0x22, + 0x1c, 0x23, 0x00, 0x88, 0x32, 0x10, 0x33, 0x50, 0x18, 0x12, 0x18, 0x1b, 0x1c, 0x20, 0xf7, 0xfe, + 0xfc, 0x9b, 0x28, 0x00, 0xdb, 0x0e, 0x4b, 0x11, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x07, 0x79, 0x2b, + 0x22, 0x80, 0x33, 0x04, 0x00, 0x9b, 0x59, 0x1b, 0x01, 0x12, 0x42, 0x93, 0xd1, 0x02, 0x1e, 0x43, + 0x41, 0x98, 0xe0, 0x00, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x60, 0x38, + 0x00, 0x0f, 0x42, 0x40, 0x13, 0x72, 0xc2, 0x00, 0x13, 0x70, 0x67, 0xac, 0x13, 0x70, 0x67, 0x94, + 0xb5, 0xf0, 0x4b, 0x65, 0xb0, 0x83, 0x68, 0x1c, 0x2c, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0xbf, + 0x4a, 0x62, 0x20, 0x00, 0x92, 0x00, 0x68, 0x13, 0x68, 0x9b, 0x60, 0x9c, 0xf7, 0xfc, 0xfb, 0x36, + 0x4a, 0x5f, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x13, 0x4a, 0x5e, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x5e, + 0x48, 0x5e, 0x70, 0x1c, 0xf7, 0xfd, 0xfb, 0x6e, 0x49, 0x5d, 0x4a, 0x5e, 0x78, 0x0b, 0x1e, 0x58, + 0x41, 0x83, 0x60, 0x13, 0x1c, 0x1d, 0x00, 0x9f, 0xe0, 0x8e, 0x4b, 0x54, 0x68, 0x1b, 0x93, 0x01, + 0x00, 0xab, 0x9a, 0x01, 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd3, 0x4a, 0x56, 0x67, 0x5d, 0x60, 0x15, + 0x6f, 0x1b, 0x4a, 0x50, 0x2b, 0x00, 0xd0, 0x4d, 0x23, 0x01, 0x60, 0x13, 0x1c, 0x28, 0xf7, 0xff, + 0xfc, 0xa7, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x77, 0x4a, 0x48, 0x68, 0x13, 0x68, 0x9b, + 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, 0x2c, 0x00, 0xdb, 0x05, 0x4b, 0x4b, 0x1c, 0x0a, 0x40, 0x1a, + 0x4b, 0x4a, 0x42, 0x9a, 0xd0, 0x0c, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x46, 0x1c, 0x04, 0x20, 0x14, + 0xf7, 0xfc, 0xfd, 0x62, 0x4b, 0x3d, 0x68, 0x1b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x19, + 0x4e, 0x3c, 0x23, 0x01, 0x60, 0x33, 0x2c, 0x00, 0xdb, 0x54, 0x4b, 0x3f, 0x1c, 0x0a, 0x40, 0x1a, + 0x4b, 0x3e, 0x42, 0x9a, 0xd1, 0x4e, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x9a, 0x01, 0x30, 0x58, + 0x18, 0x10, 0xf7, 0xff, 0xfa, 0x87, 0x28, 0x00, 0xd1, 0x44, 0x4b, 0x2f, 0x22, 0x01, 0x60, 0x1a, + 0x60, 0x30, 0x48, 0x37, 0xf7, 0xfc, 0xfa, 0xd2, 0x4b, 0x2c, 0x48, 0x36, 0x68, 0x1b, 0x68, 0x9a, + 0x23, 0x04, 0x60, 0x93, 0xf7, 0xfd, 0xfb, 0x0e, 0x4b, 0x33, 0x68, 0x1b, 0x1c, 0x18, 0x1e, 0x42, + 0x41, 0x90, 0xe0, 0x45, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x24, 0x48, 0x30, 0x68, 0x13, 0x68, 0x9b, + 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1c, 0x1c, 0x21, 0xf7, 0xfd, 0xfa, 0xfc, 0x23, 0x01, 0x42, 0x1c, + 0xd0, 0x19, 0x1c, 0x28, 0xf7, 0xff, 0xfd, 0x00, 0x1c, 0x04, 0x20, 0x14, 0xf7, 0xfc, 0xfd, 0x1c, + 0x4a, 0x1a, 0x68, 0x13, 0x68, 0x9b, 0x33, 0x44, 0x19, 0xdb, 0x68, 0x1a, 0x2c, 0x00, 0xdb, 0x04, + 0x4b, 0x1d, 0x40, 0x1a, 0x4b, 0x1d, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x38, + 0x4a, 0x13, 0x23, 0x65, 0xe0, 0x04, 0x4a, 0x12, 0x68, 0x13, 0x33, 0x01, 0xd1, 0x02, 0x23, 0x64, + 0x42, 0x5b, 0x60, 0x13, 0x35, 0x01, 0x37, 0x04, 0x4a, 0x11, 0x78, 0x13, 0x2b, 0x00, 0xd1, 0x01, + 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xda, 0x00, 0xe7, 0x66, 0x48, 0x10, 0xf7, 0xfc, + 0xfa, 0x85, 0x9a, 0x00, 0x68, 0x13, 0x68, 0x9a, 0x23, 0x04, 0x60, 0x93, 0x4b, 0x04, 0x68, 0x18, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x67, 0x98, 0x13, 0x70, 0x60, 0x34, + 0x13, 0x70, 0x67, 0xa8, 0x13, 0x70, 0x67, 0x6c, 0x13, 0x70, 0x67, 0x9c, 0x13, 0x70, 0x65, 0xc6, + 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x10, 0x05, + 0x13, 0x70, 0x12, 0xd9, 0x13, 0x70, 0x66, 0x43, 0x13, 0x70, 0x67, 0x94, 0x13, 0x70, 0x66, 0x59, + 0xb5, 0xf0, 0x4b, 0x21, 0x49, 0x21, 0x78, 0x1a, 0xb0, 0x81, 0x1e, 0x50, 0x41, 0x82, 0x60, 0x0a, + 0x1c, 0x15, 0x00, 0x96, 0x1c, 0x18, 0x21, 0x01, 0x4f, 0x1d, 0xe0, 0x28, 0x00, 0xab, 0x68, 0x3a, + 0x19, 0x5b, 0x00, 0xdb, 0x18, 0xd2, 0x67, 0x55, 0x68, 0x3b, 0x1d, 0x32, 0x68, 0x9b, 0x33, 0x44, + 0x19, 0x9b, 0x68, 0x1b, 0x42, 0x0b, 0xd0, 0x18, 0x1c, 0x28, 0xf7, 0xff, 0xfc, 0x8d, 0x1c, 0x04, + 0x20, 0x14, 0xf7, 0xfc, 0xfc, 0xa9, 0x68, 0x3b, 0x68, 0x9b, 0x33, 0x44, 0x19, 0x9b, 0x68, 0x1a, + 0x2c, 0x00, 0xdb, 0x04, 0x4b, 0x0f, 0x40, 0x1a, 0x4b, 0x0f, 0x42, 0x9a, 0xd0, 0x02, 0x1c, 0x28, + 0xf7, 0xff, 0xfb, 0xc6, 0x20, 0x65, 0x42, 0x40, 0xe0, 0x0a, 0x35, 0x01, 0x1c, 0x16, 0x78, 0x03, + 0x2b, 0x00, 0xd1, 0x01, 0x23, 0x01, 0xe0, 0x00, 0x23, 0x02, 0x42, 0x9d, 0xdb, 0xce, 0x20, 0x00, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x01, 0x0c, 0x13, 0x70, 0x67, 0x78, + 0x13, 0x70, 0x60, 0x34, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x10, 0x05, 0xb5, 0xf0, 0xb0, 0x81, + 0x1c, 0x06, 0x07, 0xc2, 0xd4, 0x01, 0x20, 0x01, 0xe0, 0x38, 0x4b, 0x35, 0x68, 0x1c, 0x2c, 0x00, + 0xd0, 0x09, 0x6b, 0x60, 0x21, 0x60, 0xf7, 0xfb, 0xfc, 0xdf, 0x6b, 0x60, 0x21, 0x60, 0xf0, 0x00, + 0xf8, 0x71, 0x6b, 0xa4, 0xe7, 0xf3, 0x4c, 0x2f, 0x68, 0x23, 0x2b, 0x00, 0xd0, 0x1a, 0x6c, 0x58, + 0x21, 0x20, 0xf7, 0xfb, 0xfc, 0xd1, 0x68, 0x23, 0x21, 0x20, 0x6c, 0x58, 0xf0, 0x00, 0xf8, 0x62, + 0x68, 0x22, 0x23, 0x80, 0x04, 0x5b, 0x61, 0x13, 0x4b, 0x27, 0x68, 0x22, 0x68, 0x1b, 0x21, 0x20, + 0x6b, 0x5b, 0x61, 0x53, 0x68, 0x23, 0x6c, 0x58, 0xf7, 0xfb, 0xfc, 0x96, 0x68, 0x23, 0x4a, 0x23, + 0x69, 0x9b, 0x60, 0x13, 0x4b, 0x1e, 0x68, 0x18, 0xf7, 0xfc, 0xfc, 0xc6, 0x28, 0x00, 0xd0, 0x05, + 0x4b, 0x1f, 0x20, 0x05, 0x68, 0x1a, 0x23, 0x00, 0x64, 0x13, 0x42, 0x40, 0x07, 0x73, 0xd5, 0x24, + 0x4a, 0x1b, 0x25, 0x80, 0x4f, 0x1b, 0x24, 0x00, 0x46, 0x94, 0x01, 0xad, 0x46, 0x62, 0x68, 0x13, + 0x00, 0xa2, 0x68, 0x9b, 0x33, 0x44, 0x18, 0x99, 0x68, 0x3b, 0x68, 0x0a, 0x42, 0x9c, 0xd1, 0x0c, + 0x21, 0x01, 0x42, 0x0a, 0xd1, 0x0e, 0x4b, 0x14, 0x22, 0x20, 0x60, 0x19, 0x49, 0x13, 0x20, 0x01, + 0x68, 0x0b, 0x42, 0x40, 0x43, 0x93, 0x60, 0x0b, 0xe0, 0x04, 0x4b, 0x11, 0x40, 0x13, 0x2b, 0x03, + 0xd1, 0x00, 0x60, 0x0d, 0x34, 0x01, 0x2c, 0x04, 0xd1, 0xe0, 0x28, 0x00, 0xd0, 0x04, 0x23, 0x12, + 0x42, 0x1e, 0xd0, 0x01, 0x20, 0x06, 0x42, 0x40, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0x88, 0x13, 0x70, 0x67, 0x8c, 0x13, 0x70, 0x67, 0xc4, 0x13, 0x70, 0x67, 0x90, + 0x13, 0x70, 0x60, 0x34, 0x13, 0x70, 0x67, 0x78, 0x13, 0x70, 0x67, 0x6c, 0x0d, 0x80, 0x00, 0xc0, + 0x00, 0x00, 0x20, 0x03, 0x47, 0x70, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0x00, 0x4b, 0x04, + 0xb0, 0x81, 0x1c, 0x01, 0x68, 0x18, 0xf7, 0xfb, 0xfc, 0x17, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, + 0x13, 0x70, 0x60, 0x40, 0xb5, 0x00, 0x4b, 0x0d, 0x1c, 0x01, 0xb0, 0x81, 0x68, 0x18, 0x22, 0x20, + 0xf7, 0xfb, 0xfc, 0x46, 0x28, 0x00, 0xd1, 0x0d, 0x48, 0x09, 0xf7, 0xfb, 0xfc, 0x15, 0xf0, 0x00, + 0xf9, 0x29, 0x20, 0xc8, 0xf7, 0xfc, 0xfb, 0xd8, 0xf0, 0x00, 0xf9, 0x18, 0x20, 0xc8, 0xf7, 0xfc, + 0xfb, 0xd3, 0xe7, 0xf4, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x40, + 0x13, 0x70, 0x66, 0x76, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xf6, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xee, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0xe6, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xfe, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xf6, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x10, 0x1c, 0x04, 0xf7, 0xfb, 0xfb, 0xee, 0x1c, 0x20, 0xbc, 0x10, + 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x21, 0xe0, 0xb0, 0x81, 0x48, 0x07, 0x02, 0x09, 0xf7, 0xfb, + 0xfb, 0xa3, 0x4b, 0x06, 0x60, 0x18, 0x28, 0x00, 0xdb, 0x01, 0x20, 0x00, 0xe0, 0x01, 0x20, 0x01, + 0x42, 0x40, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0xa0, 0x00, 0x13, 0x70, 0x60, 0x40, + 0xb5, 0xf0, 0x4b, 0x27, 0x1c, 0x06, 0x68, 0x18, 0xb0, 0x87, 0x91, 0x05, 0x28, 0x00, 0xd0, 0x01, + 0xf7, 0xfc, 0xf8, 0xe0, 0x4f, 0x23, 0x4a, 0x22, 0x68, 0x3d, 0x23, 0x00, 0x60, 0x13, 0x2d, 0x00, + 0xd1, 0x17, 0xf7, 0xff, 0xfd, 0xbd, 0x4c, 0x20, 0x1c, 0x20, 0xf7, 0xfc, 0xfd, 0xa3, 0x4b, 0x1f, + 0x1c, 0x02, 0x60, 0x18, 0x28, 0x00, 0xd0, 0x2d, 0x68, 0x23, 0x92, 0x00, 0x9a, 0x05, 0x48, 0x1c, + 0x92, 0x01, 0x21, 0x00, 0x22, 0x00, 0x95, 0x02, 0xf0, 0x00, 0xfb, 0xfc, 0x60, 0x38, 0x28, 0x00, + 0xd0, 0x20, 0x4d, 0x18, 0x68, 0x2c, 0x2c, 0x00, 0xd0, 0x0b, 0x48, 0x17, 0x1c, 0x31, 0x22, 0x06, + 0xf0, 0x00, 0xfe, 0xc8, 0x28, 0x00, 0xd0, 0x16, 0x1c, 0x20, 0xf0, 0x00, 0xfa, 0x0b, 0x23, 0x00, + 0x60, 0x2b, 0x4b, 0x0c, 0x1c, 0x31, 0x68, 0x18, 0xf0, 0x00, 0xfa, 0x14, 0x4b, 0x0d, 0x60, 0x18, + 0x28, 0x00, 0xd0, 0x04, 0x48, 0x0c, 0x1c, 0x31, 0x22, 0x06, 0xf0, 0x00, 0xfe, 0xdf, 0x4b, 0x09, + 0x68, 0x1c, 0xe0, 0x00, 0x24, 0x00, 0xb0, 0x07, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, + 0x13, 0x70, 0x67, 0xd0, 0x13, 0x70, 0x67, 0xd4, 0x13, 0x72, 0xc3, 0xa0, 0x13, 0x72, 0xc3, 0xa4, + 0x13, 0x70, 0x4b, 0x61, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x60, 0x44, 0xb5, 0x30, 0x4b, 0x0f, + 0xb0, 0x81, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, 0xf8, 0x84, 0x4c, 0x0c, 0x4b, 0x0b, + 0x68, 0x20, 0x25, 0x00, 0x60, 0x1d, 0x28, 0x00, 0xd0, 0x02, 0xf0, 0x00, 0xf9, 0xd3, 0x60, 0x25, + 0x4b, 0x08, 0x68, 0x18, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x00, 0xfa, 0x50, 0x4a, 0x05, 0x23, 0x00, + 0xb0, 0x01, 0x60, 0x13, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0x13, 0x70, 0x67, 0xd0, + 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd4, 0xb5, 0x10, 0x4c, 0x0b, 0x68, 0x20, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x00, 0xf9, 0xb7, 0x23, 0x00, 0x60, 0x23, 0x4c, 0x08, 0x68, 0x23, 0x2b, 0x00, + 0xd1, 0x03, 0x48, 0x07, 0xf7, 0xfc, 0xf8, 0x62, 0x60, 0x20, 0x4a, 0x06, 0x23, 0x01, 0x42, 0x5b, + 0x60, 0x13, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x67, 0xd8, 0x13, 0x70, 0x67, 0xd0, + 0x00, 0x00, 0x80, 0x20, 0x13, 0x70, 0x60, 0x10, 0xb5, 0xf0, 0x4f, 0x0f, 0x1c, 0x1e, 0x68, 0x3b, + 0x1c, 0x15, 0x1c, 0x0c, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x51, 0xb0, 0x81, 0xf7, 0xfb, 0xfb, 0x24, + 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32, 0xf7, 0xff, 0xfc, 0x17, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x06, 0x68, 0x3b, 0x1c, 0x30, 0x1c, 0x19, 0x43, 0x69, 0xf7, 0xfb, 0xfa, 0xf5, 0x20, 0x00, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x72, 0xc3, 0xa0, 0xb5, 0x00, 0xb0, 0x81, + 0x20, 0x81, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x2e, 0xb0, 0x01, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x80, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0xf7, 0xfb, 0xfb, 0x22, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0d, + 0x1c, 0x04, 0x1c, 0x13, 0xb0, 0x81, 0x1c, 0x2a, 0x1c, 0x21, 0x20, 0x10, 0xf7, 0xfb, 0xfb, 0x14, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, + 0x20, 0x06, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, 0xfb, 0x07, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, + 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x05, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, + 0xfa, 0xfb, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x09, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xec, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x30, 0xb0, 0x81, 0x1c, 0x04, 0x1c, 0x0d, + 0x1c, 0x13, 0x2a, 0x00, 0xdd, 0x04, 0x20, 0x02, 0x1c, 0x21, 0x1c, 0x2a, 0xf7, 0xfb, 0xfa, 0xdc, + 0xb0, 0x01, 0xbc, 0x30, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x12, 0x21, 0x00, + 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xd0, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x11, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xc4, + 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x00, 0xb0, 0x81, 0x20, 0x01, 0x21, 0x00, + 0x22, 0x00, 0x23, 0x00, 0xf7, 0xfb, 0xfa, 0xb8, 0xb0, 0x01, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, + 0xb5, 0x00, 0x1c, 0x03, 0xb0, 0x81, 0x1c, 0x0a, 0x20, 0x00, 0x1c, 0x19, 0x23, 0x00, 0xf7, 0xfb, + 0xfa, 0xab, 0xb0, 0x01, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0xb0, 0x8d, 0x90, 0x04, 0x92, 0x03, + 0x93, 0x02, 0x68, 0x05, 0x1c, 0x0a, 0x6a, 0x6e, 0x1e, 0xb3, 0x40, 0xda, 0x04, 0x13, 0x0c, 0x1b, + 0x93, 0x06, 0x9b, 0x04, 0x7a, 0x28, 0x68, 0x5a, 0x9b, 0x06, 0x6a, 0x2c, 0x33, 0x80, 0x00, 0x5b, + 0x5a, 0xd3, 0x68, 0x6f, 0x93, 0x0a, 0x2b, 0x00, 0xd1, 0x00, 0xe0, 0xc5, 0x1e, 0x63, 0x40, 0xc3, + 0x1a, 0x36, 0x93, 0x08, 0x96, 0x07, 0x1e, 0x83, 0x1c, 0x0a, 0x9e, 0x08, 0x40, 0xda, 0x08, 0xbb, + 0x40, 0x16, 0x3b, 0x01, 0x1c, 0x0a, 0x40, 0x1a, 0x92, 0x09, 0xd1, 0x02, 0x9b, 0x03, 0x93, 0x0b, + 0xe0, 0x89, 0x9b, 0x07, 0x9a, 0x0a, 0x40, 0x9a, 0x92, 0x05, 0x6a, 0xeb, 0x18, 0xf3, 0x18, 0x99, + 0x4a, 0x58, 0x92, 0x01, 0x68, 0x13, 0x6c, 0xef, 0x42, 0x8b, 0xd1, 0x05, 0x4a, 0x56, 0x4b, 0x57, + 0x68, 0x12, 0x68, 0x19, 0x1c, 0x38, 0xe0, 0x14, 0x6b, 0x2c, 0x6b, 0xa8, 0x22, 0x01, 0x1c, 0x3b, + 0xf0, 0x00, 0xf8, 0xa6, 0x1c, 0x04, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x96, 0x6a, 0xeb, 0x9a, 0x05, + 0x18, 0xf3, 0x18, 0x9b, 0x9a, 0x01, 0x60, 0x13, 0x4b, 0x4c, 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x4a, + 0x68, 0x1a, 0xf0, 0x00, 0xfd, 0x7b, 0x9b, 0x09, 0x00, 0x9a, 0x68, 0x6b, 0x1a, 0x9c, 0x9b, 0x02, + 0x42, 0x9c, 0xd9, 0x00, 0x1c, 0x1c, 0x6c, 0xe9, 0x98, 0x03, 0x18, 0x89, 0x1c, 0x22, 0xf0, 0x00, + 0xfd, 0x6d, 0x9a, 0x02, 0x9b, 0x03, 0x1b, 0x12, 0x92, 0x02, 0x9a, 0x08, 0x19, 0x1c, 0x36, 0x01, + 0x94, 0x0b, 0x42, 0x96, 0xd9, 0x47, 0x9b, 0x02, 0x2b, 0x00, 0xd0, 0x44, 0x9b, 0x06, 0x33, 0x01, + 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, + 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x5f, 0x26, 0x00, 0xe0, 0x34, 0x7a, 0x2b, 0x9f, 0x02, + 0x6a, 0x2a, 0x40, 0xdf, 0x19, 0xbb, 0x42, 0x93, 0xd9, 0x00, 0x1b, 0x97, 0x9a, 0x07, 0x6a, 0xe9, + 0x9b, 0x0a, 0x18, 0x71, 0x40, 0x93, 0x18, 0xc9, 0x6b, 0x2c, 0x6b, 0xa8, 0x1c, 0x3a, 0x9b, 0x0b, + 0xf0, 0x00, 0xf8, 0x56, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x47, 0x7a, 0x2b, 0x1c, 0x39, 0x40, 0x99, + 0x9b, 0x02, 0x9a, 0x08, 0x1a, 0x5b, 0x19, 0xf6, 0x93, 0x02, 0x42, 0x96, 0xd9, 0x10, 0x2b, 0x00, + 0xd0, 0x0e, 0x9b, 0x06, 0x33, 0x01, 0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x06, 0x9b, 0x04, 0x68, 0x5a, + 0x9b, 0x06, 0x33, 0x80, 0x00, 0x5b, 0x5a, 0xd3, 0x93, 0x0a, 0x2b, 0x00, 0xd0, 0x2c, 0x26, 0x00, + 0x9a, 0x0b, 0x18, 0x52, 0x92, 0x0b, 0x68, 0x6b, 0x9a, 0x02, 0x42, 0x9a, 0xd2, 0xc6, 0x2a, 0x00, + 0xd1, 0x01, 0x24, 0x00, 0xe0, 0x21, 0x9b, 0x07, 0x9f, 0x0a, 0x6a, 0xe9, 0x40, 0x9f, 0x18, 0x71, + 0x6b, 0x2c, 0x6b, 0xa8, 0x19, 0xc9, 0x6c, 0xeb, 0x22, 0x01, 0xf0, 0x00, 0xf8, 0x21, 0x1c, 0x04, + 0x28, 0x00, 0xd1, 0x12, 0x6a, 0xeb, 0x4a, 0x0b, 0x18, 0xf3, 0x19, 0xdb, 0x60, 0x13, 0x4b, 0x0b, + 0x6c, 0xe9, 0x68, 0x18, 0x4b, 0x08, 0x68, 0x1a, 0xf0, 0x00, 0xfc, 0xf8, 0x6c, 0xe9, 0x98, 0x0b, + 0x9a, 0x02, 0xf0, 0x00, 0xfc, 0xf3, 0xe0, 0x00, 0x24, 0x01, 0xb0, 0x0d, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xe0, 0x13, 0x70, 0x67, 0xdc, + 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x68, 0x02, 0x1c, 0x04, 0x6d, 0x13, 0x3b, 0x01, 0x65, 0x13, + 0x68, 0x40, 0xf7, 0xfb, 0xfe, 0x9f, 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x9c, 0xbc, 0x10, 0xbc, 0x01, + 0x47, 0x00, 0x46, 0xc0, 0xb5, 0xf0, 0x1c, 0x03, 0x33, 0x48, 0x88, 0x1a, 0x7a, 0x03, 0xb0, 0x83, + 0x41, 0x1a, 0x92, 0x01, 0x23, 0x01, 0x4a, 0x30, 0x42, 0x5b, 0x27, 0x00, 0x1c, 0x05, 0x1c, 0x0e, + 0x60, 0x13, 0x97, 0x00, 0xe0, 0x4f, 0x68, 0x2b, 0x19, 0xdb, 0x7b, 0x1b, 0x2b, 0x00, 0xd0, 0x45, + 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x22, 0x01, 0x6c, 0xeb, 0x6b, 0x2c, + 0xf0, 0x00, 0xf8, 0x52, 0x6c, 0xe9, 0x1c, 0x30, 0x22, 0x06, 0xf0, 0x00, 0xfc, 0x83, 0x28, 0x00, + 0xd1, 0x34, 0x20, 0x0c, 0xf7, 0xfb, 0xfe, 0x7a, 0x1c, 0x06, 0x28, 0x00, 0xd1, 0x09, 0x48, 0x1f, + 0xf7, 0xfb, 0xf9, 0x3a, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x37, 0x48, 0x1e, 0xf7, 0xfb, 0xf9, 0x34, + 0xe0, 0x2d, 0x1c, 0x2b, 0x33, 0x48, 0x60, 0x05, 0x60, 0x87, 0x88, 0x18, 0xf7, 0xfb, 0xfe, 0x66, + 0x1c, 0x03, 0x60, 0x70, 0x28, 0x00, 0xd1, 0x0c, 0x48, 0x14, 0xf7, 0xfb, 0xf9, 0x25, 0x48, 0x14, + 0xf7, 0xfb, 0xf9, 0x22, 0x48, 0x13, 0xf7, 0xfb, 0xf9, 0x1f, 0x1c, 0x30, 0xf7, 0xfb, 0xfe, 0x4a, + 0xe0, 0x14, 0x6a, 0xe9, 0x9a, 0x00, 0x31, 0x01, 0x18, 0x89, 0x6b, 0xa8, 0x6b, 0x2c, 0x9a, 0x01, + 0xf0, 0x00, 0xf8, 0x1a, 0x6d, 0x2b, 0x33, 0x01, 0x65, 0x2b, 0xe0, 0x08, 0x9b, 0x00, 0x9a, 0x01, + 0x37, 0x01, 0x18, 0x9b, 0x93, 0x00, 0x8f, 0xab, 0x42, 0x9f, 0xd3, 0xac, 0x26, 0x00, 0xb0, 0x03, + 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x66, 0x95, + 0x13, 0x70, 0x66, 0xa1, 0x13, 0x70, 0x66, 0x41, 0x47, 0x20, 0x46, 0xc0, 0xb5, 0x10, 0x6d, 0x03, + 0x1c, 0x04, 0x2b, 0x00, 0xd0, 0x09, 0x48, 0x0d, 0xf7, 0xfb, 0xf8, 0xee, 0x48, 0x0c, 0xf7, 0xfb, + 0xf8, 0xeb, 0x48, 0x0c, 0xf7, 0xfb, 0xf8, 0xe8, 0xe0, 0x0d, 0x68, 0x00, 0xf7, 0xfb, 0xfe, 0x12, + 0x6c, 0xe0, 0xf7, 0xfb, 0xfe, 0x0f, 0x6c, 0x60, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfb, 0xfe, 0x0a, + 0x1c, 0x20, 0xf7, 0xfb, 0xfe, 0x07, 0xbc, 0x10, 0xbc, 0x01, 0x47, 0x00, 0x13, 0x70, 0x66, 0x95, + 0x13, 0x70, 0x66, 0xb3, 0x13, 0x70, 0x66, 0x41, 0xb5, 0xf0, 0xb0, 0x85, 0x90, 0x03, 0x20, 0x54, + 0x91, 0x02, 0x92, 0x01, 0x1c, 0x1f, 0xf7, 0xfb, 0xfe, 0x01, 0x1c, 0x05, 0x2f, 0x00, 0xd1, 0x02, + 0x20, 0x80, 0x00, 0x80, 0xe0, 0x00, 0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xf8, 0x23, 0x80, 0x02, 0x1b, + 0x61, 0x2b, 0x1c, 0x06, 0x23, 0x00, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x2b, 0x10, 0xd1, 0xfa, + 0x23, 0x0f, 0x75, 0x2b, 0x4b, 0x81, 0x60, 0x2e, 0x61, 0xeb, 0x9a, 0x0b, 0x4b, 0x80, 0x62, 0xea, + 0x60, 0x1f, 0x9b, 0x0a, 0x20, 0x00, 0x0b, 0xd9, 0x17, 0xfa, 0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0xae, + 0x61, 0xa9, 0x9c, 0x0c, 0x2c, 0x00, 0xd0, 0x32, 0x1c, 0x30, 0x21, 0x00, 0x1c, 0x3a, 0xf0, 0x00, + 0xfc, 0x49, 0x23, 0x57, 0x70, 0x33, 0x23, 0x42, 0x70, 0x73, 0x23, 0x46, 0x70, 0xb3, 0x23, 0x53, + 0x70, 0xf3, 0x1c, 0x3c, 0x23, 0x00, 0xe0, 0x03, 0x33, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x08, 0x64, + 0x2c, 0x00, 0xd1, 0xf9, 0x3b, 0x01, 0x72, 0x33, 0x9a, 0x0a, 0x21, 0x80, 0x0e, 0x13, 0x71, 0x33, + 0x0c, 0x13, 0x71, 0x73, 0x0a, 0x13, 0x71, 0xf2, 0x71, 0xb3, 0x69, 0xac, 0x22, 0x06, 0x20, 0x06, + 0x02, 0x49, 0x1c, 0x0b, 0x40, 0x83, 0x42, 0x9c, 0xd3, 0x05, 0x1c, 0x53, 0x06, 0x1b, 0x0e, 0x1a, + 0x30, 0x01, 0x2a, 0x0b, 0xd1, 0xf5, 0x7d, 0x2b, 0x18, 0xd3, 0x72, 0x73, 0xe0, 0x06, 0x6a, 0xe9, + 0x98, 0x01, 0x22, 0x01, 0x1c, 0x33, 0x9c, 0x03, 0xf0, 0x00, 0xf8, 0xca, 0x78, 0x33, 0x78, 0x72, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xb3, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xf2, 0x43, 0x1a, + 0x4b, 0x58, 0x42, 0x9a, 0xd0, 0x04, 0x48, 0x58, 0xf7, 0xfb, 0xf8, 0x56, 0x48, 0x57, 0xe0, 0x2f, + 0x4b, 0x57, 0x68, 0x1b, 0x42, 0x59, 0x41, 0x59, 0x29, 0x00, 0xd0, 0x36, 0x2f, 0x00, 0xd0, 0x11, + 0x7a, 0x30, 0x1c, 0x3a, 0x33, 0x01, 0x06, 0x1b, 0x08, 0x52, 0x0e, 0x1b, 0x2a, 0x00, 0xd1, 0xf9, + 0x3b, 0x01, 0x06, 0x1b, 0x0e, 0x1b, 0x42, 0x98, 0xd0, 0x04, 0x48, 0x4b, 0xf7, 0xfb, 0xf8, 0x3c, + 0x48, 0x4c, 0xe0, 0x15, 0x29, 0x00, 0xd0, 0x20, 0x9a, 0x0a, 0x2a, 0x00, 0xd0, 0x1d, 0x79, 0x32, + 0x79, 0x73, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x79, 0xb2, 0x9c, 0x0a, 0x02, 0x12, 0x43, 0x1a, + 0x79, 0xf3, 0x43, 0x13, 0x42, 0xa3, 0xd0, 0x10, 0x48, 0x3f, 0xf7, 0xfb, 0xf8, 0x25, 0x48, 0x42, + 0xf7, 0xfb, 0xf8, 0x22, 0x48, 0x41, 0xf7, 0xfb, 0xf8, 0x1f, 0x1c, 0x28, 0xf7, 0xfb, 0xfd, 0x4a, + 0x1c, 0x30, 0xf7, 0xfb, 0xfd, 0x47, 0x25, 0x00, 0xe0, 0x63, 0x7a, 0x33, 0x24, 0x01, 0x1c, 0x27, + 0x40, 0x9f, 0x60, 0x6f, 0x7a, 0x33, 0x69, 0x29, 0x72, 0x2b, 0x79, 0x33, 0x79, 0x72, 0x06, 0x1b, + 0x04, 0x12, 0x43, 0x1a, 0x79, 0xb3, 0x79, 0xf0, 0x02, 0x1b, 0x43, 0x13, 0x43, 0x18, 0x60, 0xe8, + 0xf0, 0x00, 0xfa, 0x72, 0x1c, 0x39, 0x43, 0x41, 0x61, 0xa9, 0x7a, 0x72, 0x7d, 0x2b, 0x62, 0x6a, + 0x40, 0x94, 0x1a, 0xd2, 0x69, 0xeb, 0x40, 0xd1, 0x40, 0xd3, 0x04, 0x1b, 0x0c, 0x1b, 0x04, 0x3a, + 0x85, 0x6b, 0x0c, 0x12, 0x33, 0x80, 0x85, 0x29, 0x00, 0x5b, 0x1e, 0x51, 0x18, 0xc9, 0x42, 0x52, + 0x1c, 0x2b, 0x40, 0x11, 0x33, 0x48, 0x80, 0x19, 0x62, 0x2c, 0x9a, 0x03, 0x63, 0x2a, 0x9b, 0x02, + 0x63, 0x6b, 0x9a, 0x01, 0x8d, 0x2b, 0x63, 0xaa, 0x08, 0xda, 0x7a, 0x2b, 0x1a, 0xa4, 0x40, 0xdc, + 0x64, 0x2c, 0x9b, 0x0c, 0x2b, 0x00, 0xd1, 0x01, 0x64, 0x6b, 0xe0, 0x0b, 0x1e, 0x78, 0x18, 0x80, + 0x42, 0x7b, 0x40, 0x18, 0xf7, 0xfb, 0xfd, 0x0a, 0x8d, 0x2a, 0x64, 0x68, 0x08, 0xd2, 0x21, 0xff, + 0xf0, 0x00, 0xfb, 0x78, 0x1c, 0x2b, 0x33, 0x48, 0x88, 0x19, 0x6c, 0x28, 0x7a, 0x2b, 0x38, 0x01, + 0x41, 0x19, 0xf0, 0x00, 0xfa, 0x31, 0x68, 0x6b, 0x04, 0x00, 0x0c, 0x00, 0x3b, 0x0c, 0x87, 0xa8, + 0x42, 0x98, 0xd9, 0x00, 0x87, 0xab, 0x68, 0x68, 0xf7, 0xfb, 0xfc, 0xf0, 0x23, 0x00, 0x64, 0xe8, + 0x65, 0x2b, 0xb0, 0x05, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x00, 0x04, 0x60, 0x90, + 0x13, 0x70, 0x67, 0xe0, 0x57, 0x42, 0x46, 0x53, 0x13, 0x70, 0x66, 0x95, 0x13, 0x70, 0x66, 0xdf, + 0x13, 0x70, 0x67, 0xe4, 0x13, 0x70, 0x66, 0xe9, 0x13, 0x70, 0x67, 0x06, 0x13, 0x70, 0x66, 0x41, + 0x47, 0x20, 0x46, 0xc0, 0xb5, 0xf0, 0xb0, 0xa5, 0x90, 0x0c, 0x1c, 0x18, 0x92, 0x0a, 0x93, 0x09, + 0x91, 0x0b, 0xf7, 0xfb, 0xfc, 0xcb, 0x4b, 0x8c, 0x22, 0x01, 0x4c, 0x8c, 0x42, 0x52, 0x60, 0x1a, + 0x68, 0x23, 0x1c, 0x05, 0x2b, 0x00, 0xd1, 0x03, 0x98, 0x09, 0xf7, 0xfb, 0xfc, 0xbf, 0x60, 0x20, + 0x4b, 0x87, 0x99, 0x09, 0x98, 0x0a, 0x60, 0x19, 0x22, 0x01, 0x21, 0x00, 0x1c, 0x2b, 0x9c, 0x0c, + 0xf0, 0x00, 0xf9, 0x18, 0x28, 0x00, 0xd0, 0x00, 0xe0, 0xf4, 0x23, 0xff, 0x00, 0x5b, 0x5c, 0xeb, + 0x2b, 0x55, 0xd1, 0x1b, 0x4b, 0x7f, 0x5c, 0xeb, 0x2b, 0xaa, 0xd1, 0x17, 0x1c, 0xe8, 0x49, 0x7e, + 0x22, 0x04, 0xf0, 0x00, 0xfb, 0x9d, 0x28, 0x00, 0xd0, 0x10, 0x4c, 0x7c, 0x1c, 0x28, 0x30, 0x36, + 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x94, 0x28, 0x00, 0xd0, 0x07, 0x1c, 0x28, 0x30, 0x52, + 0x1c, 0x21, 0x22, 0x03, 0xf0, 0x00, 0xfb, 0x8c, 0x28, 0x00, 0xd1, 0x05, 0xa8, 0x14, 0x21, 0x00, + 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xff, 0xe0, 0x06, 0x22, 0xdf, 0x00, 0x52, 0x18, 0xa9, 0xa8, 0x14, + 0x22, 0x40, 0xf0, 0x00, 0xfa, 0xb3, 0x23, 0x01, 0x21, 0xe4, 0x42, 0x5b, 0x24, 0x00, 0x00, 0x49, + 0xae, 0x14, 0x93, 0x11, 0x94, 0x12, 0x91, 0x07, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, + 0x43, 0x1a, 0x78, 0xab, 0x7a, 0x37, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x7a, 0x70, 0x43, 0x1a, + 0x4b, 0x63, 0x7a, 0xb1, 0x7a, 0xf4, 0x42, 0x9a, 0xd0, 0x03, 0x79, 0x33, 0x2b, 0x00, 0xd1, 0x00, + 0xe0, 0xa3, 0x04, 0x0a, 0x02, 0x03, 0x43, 0x13, 0x43, 0x3b, 0x1c, 0x1f, 0x79, 0x33, 0x06, 0x22, + 0x43, 0x17, 0x2b, 0x0f, 0xd1, 0x69, 0x22, 0xe3, 0x21, 0x00, 0x00, 0x52, 0x91, 0x13, 0x92, 0x08, + 0x19, 0xc9, 0x91, 0x05, 0x98, 0x0a, 0x22, 0x01, 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0xb2, + 0x28, 0x00, 0xd0, 0x00, 0xe0, 0x8e, 0x49, 0x53, 0x9c, 0x07, 0x5c, 0x6a, 0x5d, 0x2b, 0x99, 0x08, + 0x04, 0x1b, 0x02, 0x12, 0x43, 0x1a, 0x4c, 0x50, 0x5c, 0x6b, 0x99, 0x05, 0x43, 0x1a, 0x5d, 0x2b, + 0x98, 0x0a, 0x06, 0x1b, 0x43, 0x1a, 0x18, 0x8a, 0x23, 0xeb, 0x92, 0x05, 0x00, 0x5b, 0x5c, 0xeb, + 0x1c, 0x11, 0x93, 0x0d, 0x4b, 0x49, 0x22, 0x01, 0x5c, 0xeb, 0x9c, 0x0c, 0x93, 0x0e, 0x23, 0xec, + 0x00, 0x5b, 0x5c, 0xeb, 0x93, 0x0f, 0x4b, 0x46, 0x5c, 0xeb, 0x93, 0x10, 0x1c, 0x2b, 0xf0, 0x00, + 0xf8, 0x89, 0x28, 0x00, 0xd1, 0x66, 0x78, 0x2b, 0x78, 0x6a, 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, + 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, 0x4b, 0x39, 0x42, 0x9a, 0xd1, 0x12, + 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x05, 0x9b, 0x05, 0x9c, 0x2c, 0x90, 0x00, 0x93, 0x01, + 0x94, 0x02, 0xe0, 0x38, 0x99, 0x05, 0x9a, 0x11, 0x42, 0x91, 0xd0, 0x04, 0x9b, 0x12, 0x9c, 0x05, + 0x33, 0x01, 0x93, 0x12, 0x94, 0x11, 0x99, 0x0e, 0x9c, 0x0f, 0x02, 0x0b, 0x04, 0x22, 0x99, 0x0d, + 0x43, 0x13, 0x9c, 0x10, 0x43, 0x0b, 0x06, 0x22, 0x1c, 0x19, 0x43, 0x11, 0xd0, 0x35, 0x9a, 0x13, + 0x32, 0x01, 0x92, 0x13, 0x2a, 0x08, 0xd1, 0x9b, 0xe0, 0x2f, 0x98, 0x0a, 0x1c, 0x39, 0x22, 0x01, + 0x1c, 0x2b, 0x9c, 0x0c, 0xf0, 0x00, 0xf8, 0x4e, 0x28, 0x00, 0xd1, 0x2b, 0x78, 0x2b, 0x78, 0x6a, + 0x06, 0x1b, 0x04, 0x12, 0x43, 0x1a, 0x78, 0xab, 0x02, 0x1b, 0x43, 0x13, 0x78, 0xea, 0x43, 0x1a, + 0x4b, 0x1b, 0x42, 0x9a, 0xd1, 0x19, 0x99, 0x12, 0x9a, 0x2b, 0x42, 0x91, 0xd1, 0x0e, 0x9b, 0x2c, + 0x90, 0x00, 0x97, 0x01, 0x93, 0x02, 0x98, 0x0c, 0x99, 0x0b, 0x9a, 0x0a, 0x9b, 0x09, 0xf7, 0xff, + 0xfd, 0xc3, 0x1c, 0x04, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xbd, 0xe0, 0x0f, 0x9c, 0x11, 0x42, 0xa7, + 0xd0, 0x03, 0x99, 0x12, 0x97, 0x11, 0x31, 0x01, 0x91, 0x12, 0xab, 0x20, 0x42, 0x9e, 0xd0, 0x01, + 0x36, 0x10, 0xe7, 0x41, 0x1c, 0x28, 0xf7, 0xfb, 0xfb, 0xad, 0x24, 0x00, 0xb0, 0x25, 0x1c, 0x20, + 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x13, 0x70, 0x60, 0x4c, 0x13, 0x70, 0x67, 0xdc, + 0x13, 0x70, 0x67, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x13, 0x70, 0x67, 0x22, 0x13, 0x70, 0x67, 0x27, + 0x57, 0x42, 0x46, 0x53, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x01, 0xc9, 0x00, 0x00, 0x01, 0xd7, + 0x00, 0x00, 0x01, 0xd9, 0x47, 0x20, 0x46, 0xc0, 0xef, 0x00, 0x00, 0xcc, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x00, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x00, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x01, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x01, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x02, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x02, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x03, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x90, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0xb0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x04, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x05, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x05, 0x50, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x06, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x07, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, + 0xe6, 0x00, 0x08, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x0a, 0x10, 0xe1, 0x2f, 0xff, 0x1e, + 0xe2, 0x90, 0x10, 0x00, 0xe3, 0xb0, 0x00, 0x04, 0xef, 0x00, 0x00, 0xab, 0xe1, 0x2f, 0xff, 0x1e, + 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x34, 0x23, 0x01, 0x22, 0x00, + 0xb4, 0x10, 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, + 0xd2, 0x02, 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, + 0xd2, 0x02, 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, + 0x08, 0x4c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, + 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, + 0x08, 0xdc, 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, + 0x1c, 0x10, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, 0xf8, 0x5e, 0x20, 0x00, 0xbc, 0x06, + 0x47, 0x10, 0x46, 0xc0, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0xbc, 0x0e, 0x43, 0x42, 0x1a, 0x89, + 0x47, 0x18, 0x46, 0xc0, 0x29, 0x00, 0xd0, 0x41, 0xb4, 0x10, 0x1c, 0x04, 0x40, 0x4c, 0x46, 0xa4, + 0x23, 0x01, 0x22, 0x00, 0x29, 0x00, 0xd5, 0x00, 0x42, 0x49, 0x28, 0x00, 0xd5, 0x00, 0x42, 0x40, + 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01, 0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, + 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8, 0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, + 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8, 0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, 0x08, 0x4c, + 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, 0xd3, 0x02, + 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22, 0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0xdc, + 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03, 0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, 0x1c, 0x10, + 0x46, 0x64, 0x2c, 0x00, 0xd5, 0x00, 0x42, 0x40, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02, 0xf0, 0x00, + 0xf8, 0x0b, 0x20, 0x00, 0xbc, 0x06, 0x47, 0x10, 0xb5, 0x03, 0xf7, 0xff, 0xff, 0xb3, 0xbc, 0x0e, + 0x43, 0x42, 0x1a, 0x89, 0x47, 0x18, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0, 0xb5, 0xf0, 0x46, 0x57, + 0x46, 0x46, 0xb4, 0xc0, 0x1c, 0x1e, 0x4b, 0x16, 0x46, 0x90, 0x1c, 0x0a, 0x40, 0x1a, 0x40, 0x33, + 0x46, 0x82, 0x1c, 0x10, 0x43, 0x58, 0x0c, 0x0c, 0x1c, 0x0f, 0x0c, 0x31, 0x46, 0x84, 0x43, 0x4a, + 0x1c, 0x20, 0x43, 0x58, 0x1c, 0x25, 0x43, 0x4d, 0x46, 0x61, 0x18, 0x82, 0x0c, 0x0b, 0x18, 0xd2, + 0x42, 0x90, 0xd9, 0x02, 0x23, 0x80, 0x02, 0x5b, 0x18, 0xed, 0x4b, 0x09, 0x46, 0x61, 0x04, 0x14, + 0x0c, 0x10, 0x40, 0x0b, 0x18, 0x2a, 0x18, 0xe1, 0x46, 0x40, 0x43, 0x78, 0x46, 0x53, 0x43, 0x73, + 0x18, 0xc0, 0x18, 0x80, 0xbc, 0x0c, 0x46, 0x90, 0x46, 0x9a, 0xbc, 0xf0, 0xbc, 0x04, 0x47, 0x10, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x70, 0x1c, 0x0e, 0x1c, 0x15, 0x1c, 0x04, 0x2a, 0x03, 0xd9, 0x20, + 0x1c, 0x33, 0x43, 0x03, 0x07, 0x9a, 0xd0, 0x12, 0x78, 0x23, 0x78, 0x08, 0x42, 0x83, 0xd1, 0x1b, + 0x1e, 0x6a, 0xe0, 0x06, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, 0x42, 0x83, + 0xd1, 0x12, 0x2a, 0x00, 0xd1, 0xf6, 0x20, 0x00, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x68, 0x02, + 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x04, 0x3d, 0x04, 0x30, 0x04, 0x31, 0x04, 0x2d, 0x03, 0xd8, 0xf6, + 0x1c, 0x04, 0x2d, 0x00, 0xd1, 0xe0, 0xe7, 0xee, 0x1a, 0x18, 0xe7, 0xed, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x08, 0x1c, 0x11, 0x2a, 0x0f, 0xd9, 0x03, 0x1c, 0x33, + 0x43, 0x3b, 0x07, 0x9a, 0xd0, 0x0b, 0x29, 0x00, 0xd0, 0x05, 0x22, 0x00, 0x5c, 0x83, 0x54, 0xa3, + 0x32, 0x01, 0x42, 0x8a, 0xd1, 0xfa, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x1c, 0x3a, + 0x1c, 0x31, 0x1c, 0x28, 0x68, 0x0b, 0x60, 0x13, 0x68, 0x4b, 0x60, 0x53, 0x68, 0x8b, 0x60, 0x93, + 0x68, 0xcb, 0x38, 0x10, 0x60, 0xd3, 0x31, 0x10, 0x32, 0x10, 0x28, 0x0f, 0xd8, 0xf2, 0x1c, 0x2b, + 0x3b, 0x10, 0x09, 0x1a, 0x01, 0x11, 0x32, 0x01, 0x01, 0x12, 0x1a, 0x59, 0x18, 0xb0, 0x18, 0xbc, + 0x29, 0x03, 0xd9, 0xd8, 0x22, 0x00, 0x58, 0x83, 0x50, 0xa3, 0x32, 0x04, 0x1a, 0x8b, 0x2b, 0x03, + 0xd8, 0xf9, 0x1f, 0x0b, 0x08, 0x9a, 0x00, 0x91, 0x32, 0x01, 0x00, 0x92, 0x1a, 0x59, 0x18, 0x80, + 0x18, 0xa4, 0xe7, 0xc8, 0xb5, 0xf0, 0x1c, 0x07, 0x46, 0x8c, 0x1c, 0x10, 0x1c, 0x39, 0x07, 0xba, + 0xd0, 0x0e, 0x28, 0x00, 0xd0, 0x49, 0x46, 0x62, 0x06, 0x13, 0x38, 0x01, 0x0e, 0x1b, 0x22, 0x03, + 0xe0, 0x02, 0x28, 0x00, 0xd0, 0x41, 0x38, 0x01, 0x70, 0x0b, 0x31, 0x01, 0x42, 0x11, 0xd1, 0xf8, + 0x1c, 0x05, 0x1c, 0x0a, 0x28, 0x03, 0xd9, 0x2e, 0x23, 0xff, 0x46, 0x62, 0x40, 0x1a, 0x02, 0x13, + 0x43, 0x13, 0x04, 0x1a, 0x1c, 0x14, 0x1c, 0x0e, 0x43, 0x1c, 0x28, 0x0f, 0xd9, 0x12, 0x1c, 0x02, + 0x1c, 0x0b, 0x3a, 0x10, 0x60, 0x1c, 0x60, 0x5c, 0x60, 0x9c, 0x60, 0xdc, 0x33, 0x10, 0x2a, 0x0f, + 0xd8, 0xf7, 0x1c, 0x03, 0x3b, 0x10, 0x1c, 0x1d, 0x09, 0x1b, 0x33, 0x01, 0x22, 0x0f, 0x01, 0x1b, + 0x40, 0x15, 0x18, 0xce, 0x2d, 0x03, 0xd9, 0x0d, 0x22, 0x00, 0x50, 0xb4, 0x32, 0x04, 0x1a, 0xab, + 0x2b, 0x03, 0xd8, 0xfa, 0x1f, 0x2b, 0x1c, 0x1d, 0x08, 0x9b, 0x33, 0x01, 0x22, 0x03, 0x00, 0x9b, + 0x40, 0x15, 0x18, 0xf6, 0x1c, 0x32, 0x2d, 0x00, 0xd0, 0x07, 0x46, 0x61, 0x06, 0x0b, 0x0e, 0x19, + 0x23, 0x00, 0x54, 0xd1, 0x33, 0x01, 0x42, 0x9d, 0xd1, 0xfb, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x02, + 0x47, 0x08, 0x46, 0xc0, 0xb5, 0x30, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x9a, 0xd1, 0x1c, 0x68, 0x02, + 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x18, 0x4c, 0x10, 0x19, 0x13, 0x43, 0x93, 0x4a, 0x0f, 0x42, 0x13, + 0xd1, 0x0b, 0x1c, 0x14, 0x30, 0x04, 0x31, 0x04, 0x68, 0x02, 0x68, 0x0b, 0x42, 0x9a, 0xd1, 0x0b, + 0x4d, 0x09, 0x19, 0x53, 0x43, 0x93, 0x42, 0x23, 0xd0, 0xf4, 0x20, 0x00, 0xe0, 0x09, 0x78, 0x0a, + 0x42, 0x9a, 0xd1, 0x05, 0x30, 0x01, 0x31, 0x01, 0x78, 0x03, 0x2b, 0x00, 0xd1, 0xf7, 0x78, 0x0a, + 0x1a, 0x98, 0xbc, 0x30, 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, + 0xb5, 0x70, 0x1c, 0x04, 0x2a, 0x00, 0xd0, 0x41, 0x1c, 0x0b, 0x43, 0x03, 0x07, 0x98, 0xd1, 0x2c, + 0x1c, 0x20, 0x1c, 0x0d, 0x2a, 0x03, 0xd9, 0x26, 0x68, 0x24, 0x68, 0x0b, 0x42, 0x9c, 0xd1, 0x22, + 0x3a, 0x04, 0x2a, 0x00, 0xd0, 0x32, 0x49, 0x1b, 0x18, 0x63, 0x49, 0x1b, 0x43, 0xa3, 0x42, 0x0b, + 0xd1, 0x2c, 0x1c, 0x0c, 0xe0, 0x0b, 0x68, 0x01, 0x68, 0x2b, 0x42, 0x99, 0xd1, 0x13, 0x3a, 0x04, + 0x2a, 0x00, 0xd0, 0x23, 0x4e, 0x13, 0x19, 0x8b, 0x43, 0x8b, 0x42, 0x23, 0xd1, 0x1e, 0x30, 0x04, + 0x35, 0x04, 0x2a, 0x03, 0xd8, 0xef, 0x1c, 0x04, 0x1c, 0x29, 0x2a, 0x00, 0xd1, 0x05, 0x78, 0x03, + 0x78, 0x28, 0x1a, 0x18, 0xe0, 0x13, 0x1c, 0x04, 0x1c, 0x29, 0x78, 0x23, 0x78, 0x08, 0x3a, 0x01, + 0x42, 0x98, 0xd0, 0x09, 0xe7, 0xf5, 0x28, 0x00, 0xd0, 0x08, 0x34, 0x01, 0x31, 0x01, 0x78, 0x23, + 0x78, 0x08, 0x42, 0x98, 0xd1, 0xed, 0x3a, 0x01, 0x2a, 0x00, 0xd1, 0xf4, 0x20, 0x00, 0xbc, 0x70, + 0xbc, 0x02, 0x47, 0x08, 0xfe, 0xfe, 0xfe, 0xff, 0x80, 0x80, 0x80, 0x80, 0x49, 0x4f, 0x53, 0x20, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x1f, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x72, 0xc2, 0xa4, 0x00, 0x0f, 0x42, 0x40, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x64, 0x65, 0x76, + 0x2f, 0x75, 0x73, 0x62, 0x31, 0x32, 0x33, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, + 0x31, 0x32, 0x33, 0x2f, 0x4f, 0x46, 0x46, 0x00, 0x57, 0x42, 0x46, 0x53, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x20, 0x28, 0x25, 0x73, 0x29, 0x0a, 0x00, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x00, 0x20, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x00, 0x20, 0x52, 0x65, 0x63, 0x6c, 0x00, 0x20, 0x48, + 0x61, 0x6c, 0x74, 0x00, 0x20, 0x49, 0x41, 0x41, 0x00, 0x20, 0x46, 0x41, 0x54, 0x41, 0x4c, 0x00, + 0x20, 0x46, 0x4c, 0x52, 0x00, 0x20, 0x50, 0x43, 0x44, 0x00, 0x20, 0x45, 0x52, 0x52, 0x00, 0x20, + 0x49, 0x4e, 0x54, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, + 0x25, 0x78, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, + 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x75, 0x73, + 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, + 0x42, 0x55, 0x4c, 0x4b, 0x20, 0x52, 0x45, 0x53, 0x45, 0x54, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, + 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, + 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x68, 0x61, 0x6c, + 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x75, 0x73, + 0x62, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3a, 0x20, + 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x73, + 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, + 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x62, 0x77, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, + 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x5f, 0x5f, 0x55, 0x53, 0x42, 0x5f, 0x42, 0x6c, 0x6b, 0x4d, 0x73, 0x67, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, + 0x20, 0x25, 0x69, 0x0a, 0x00, 0x5f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x73, 0x77, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x55, 0x4e, + 0x49, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, + 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, + 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x45, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x63, 0x6d, 0x64, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, + 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, + 0x3a, 0x20, 0x55, 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, + 0x53, 0x42, 0x5f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x73, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, + 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x75, 0x63, 0x64, 0x20, 0x25, + 0x69, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x41, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, + 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x73, 0x75, 0x62, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x25, 0x69, 0x20, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x20, 0x25, 0x69, 0x20, 0x0a, 0x00, 0x49, 0x6e, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, + 0x25, 0x69, 0x0a, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x25, + 0x69, 0x0a, 0x00, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x20, 0x25, 0x78, 0x20, 0x65, 0x70, 0x5f, 0x6f, + 0x75, 0x74, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x3a, + 0x20, 0x25, 0x78, 0x20, 0x61, 0x6c, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x3a, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x5f, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, + 0x28, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x00, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x52, 0x65, 0x73, 0x65, 0x74, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x29, 0x3a, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x00, 0x20, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x46, 0x61, + 0x73, 0x74, 0x20, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, + 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x25, 0x69, 0x23, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x3a, + 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x54, 0x4f, 0x52, + 0x41, 0x47, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x55, 0x4e, 0x20, + 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x75, 0x6e, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x4c, 0x55, 0x4e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x21, 0x21, 0x21, 0x0a, 0x00, 0x55, + 0x6e, 0x70, 0x6c, 0x75, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4f, 0x4b, 0x0a, 0x00, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x4b, 0x4f, 0x20, 0x72, 0x65, 0x74, 0x20, 0x25, 0x69, + 0x0a, 0x00, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x0a, 0x0a, 0x00, 0x55, + 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, + 0x20, 0x4f, 0x6b, 0x0a, 0x00, 0x55, 0x53, 0x42, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x49, 0x6e, 0x69, 0x74, 0x28, 0x29, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x25, 0x78, + 0x0a, 0x00, 0x55, 0x53, 0x42, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x3a, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x21, 0x0a, + 0x00, 0x77, 0x62, 0x66, 0x73, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x00, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x00, 0x74, + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x77, + 0x62, 0x66, 0x73, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x73, 0x20, + 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x00, 0x62, 0x61, 0x64, 0x20, 0x6d, + 0x61, 0x67, 0x69, 0x63, 0x00, 0x68, 0x64, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x00, 0x68, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x4e, 0x54, + 0x46, 0x53, 0x00, 0x46, 0x41, 0x54, 0x00 +}; diff --git a/source/network/http.c b/source/network/http.c index b624ef7d..85dea150 100644 --- a/source/network/http.c +++ b/source/network/http.c @@ -1,261 +1,261 @@ -#include "http.h" -#include "../svnrev.h" - -extern char incommingIP[50]; - -/** - * Emptyblock is a statically defined variable for functions to return if they are unable - * to complete a request - */ -const struct block emptyblock = { 0, NULL }; - -//The maximum amount of bytes to send per net_write() call -//#define NET_BUFFER_SIZE 1024 -#define NET_BUFFER_SIZE 3600 - -// Write our message to the server -static s32 send_message(s32 server, char *msg) -{ - s32 bytes_transferred = 0; - s32 remaining = strlen(msg); - while (remaining) - { - if ((bytes_transferred = net_write(server, msg, remaining > NET_BUFFER_SIZE ? NET_BUFFER_SIZE : remaining)) > 0) - { - remaining -= bytes_transferred; - usleep(20 * 1000); - } - else if (bytes_transferred < 0) - { - return bytes_transferred; - } - else - { - return -ENODATA; - } - } - return 0; -} - -/** - * Connect to a remote server via TCP on a specified port - * - * @param u32 ip address of the server to connect to - * @param u32 the port to connect to on the server - * @return s32 The connection to the server (negative number if connection could not be established) - */ -static s32 server_connect(u32 ipaddress, u32 socket_port) -{ - //Initialize socket - s32 connection = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (connection < 0) return connection; - - struct sockaddr_in connect_addr; - memset(&connect_addr, 0, sizeof(connect_addr)); - connect_addr.sin_family = AF_INET; - connect_addr.sin_port = socket_port; - connect_addr.sin_addr.s_addr = ipaddress; - - sprintf(incommingIP, "%s", inet_ntoa(connect_addr.sin_addr)); - - //Attemt to open the socket - if (net_connect(connection, (struct sockaddr*) &connect_addr, sizeof(connect_addr)) == -1) - { - net_close(connection); - return -1; - } - return connection; -} - -//The amount of memory in bytes reserved initially to store the HTTP response in -//Be careful in increasing this number, reading from a socket on the Wii -//will fail if you request more than 20k or so -#define HTTP_BUFFER_SIZE 1024 * 5 - -//The amount of memory the buffer should expanded with if the buffer is full -#define HTTP_BUFFER_GROWTH 1024 * 5 - -/** - * This function reads all the data from a connection into a buffer which it returns. - * It will return an empty buffer if something doesn't go as planned - * - * @param s32 connection The connection identifier to suck the response out of - * @return block A 'block' struct (see http.h) in which the buffer is located - */ -struct block read_message(s32 connection) -{ - //Create a block of memory to put in the response - struct block buffer; - buffer.data = malloc(HTTP_BUFFER_SIZE); - buffer.size = HTTP_BUFFER_SIZE; - - if (buffer.data == NULL) - { - return emptyblock; - } - - //The offset variable always points to the first byte of memory that is free in the buffer - u32 offset = 0; - - while (1) - { - //Fill the buffer with a new batch of bytes from the connection, - //starting from where we left of in the buffer till the end of the buffer - s32 bytes_read = net_read(connection, buffer.data + offset, buffer.size - offset); - - //Anything below 0 is an error in the connection - if (bytes_read < 0) - { - //printf("Connection error from net_read() Errorcode: %i\n", bytes_read); - return emptyblock; - } - - //No more bytes were read into the buffer, - //we assume this means the HTTP response is done - if (bytes_read == 0) - { - break; - } - - offset += bytes_read; - - //Check if we have enough buffer left over, - //if not expand it with an additional HTTP_BUFFER_GROWTH worth of bytes - if (offset >= buffer.size) - { - buffer.size += HTTP_BUFFER_GROWTH; - buffer.data = realloc(buffer.data, buffer.size); - - if (buffer.data == NULL) - { - return emptyblock; - } - } - } - - //At the end of above loop offset should be precisely the amount of bytes that were read from the connection - buffer.size = offset; - - //Shrink the size of the buffer so the data fits exactly in it - buffer.data = realloc(buffer.data, buffer.size); - - return buffer; -} - -/** - * Downloads the contents of a URL to memory - * This method is not threadsafe (because networking is not threadsafe on the Wii) - */ -struct block downloadfile(const char *url) -{ - //Check if the url starts with "http://", if not it is not considered a valid url - if (strncmp(url, "http://", strlen("http://")) != 0) - { - //printf("URL '%s' doesn't start with 'http://'\n", url); - return emptyblock; - } - - //Locate the path part of the url by searching for '/' past "http://" - char *path = strchr(url + strlen("http://"), '/'); - - //At the very least the url has to end with '/', ending with just a domain is invalid - if (path == NULL) - { - //printf("URL '%s' has no PATH part\n", url); - return emptyblock; - } - - //Extract the domain part out of the url - int domainlength = path - url - strlen("http://"); - - if (domainlength == 0) - { - //printf("No domain part in URL '%s'\n", url); - return emptyblock; - } - - char domain[domainlength + 1]; - strlcpy(domain, url + strlen("http://"), domainlength + 1); - - //Parsing of the URL is done, start making an actual connection - u32 ipaddress = getipbynamecached(domain); - - if (ipaddress == 0) - { - //printf("\ndomain %s could not be resolved", domain); - return emptyblock; - } - - s32 connection = server_connect(ipaddress, 80); - - if (connection < 0) - { - //printf("Error establishing connection"); - return emptyblock; - } - - //Form a nice request header to send to the webserver - char* headerformat = "GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nUser-Agent: USBLoaderGX r%s\r\n\r\n"; - ; - char header[strlen(headerformat) + strlen(path) + strlen(domain) + strlen(domain)]; - sprintf(header, headerformat, path, domain, domain, GetRev()); - - //Do the request and get the response - send_message(connection, header); - struct block response = read_message(connection); - net_close(connection); - - //Search for the 4-character sequence \r\n\r\n in the response which signals the start of the http payload (file) - unsigned char *filestart = NULL; - u32 filesize = 0; - int i; - for (i = 3; i < response.size; i++) - { - if (response.data[i] == '\n' && response.data[i - 1] == '\r' && response.data[i - 2] == '\n' && response.data[i - - 3] == '\r') - { - filestart = response.data + i + 1; - filesize = response.size - i - 1; - break; - } - } - - if (filestart == NULL) - { - //printf("HTTP Response was without a file\n"); - free(response.data); - return emptyblock; - } - - //Copy the file part of the response into a new memoryblock to return - struct block file; - file.data = malloc(filesize); - file.size = filesize; - - if (file.data == NULL) - { - //printf("No more memory to copy file from HTTP response\n"); - free(response.data); - return emptyblock; - } - - memcpy(file.data, filestart, filesize); - - //Dispose of the original response - free(response.data); - - return file; -} - -s32 GetConnection(char * domain) -{ - - u32 ipaddress = getipbynamecached(domain); - if (ipaddress == 0) - { - return -1; - } - s32 connection = server_connect(ipaddress, 80); - return connection; - -} +#include "http.h" +#include "../svnrev.h" + +extern char incommingIP[50]; + +/** + * Emptyblock is a statically defined variable for functions to return if they are unable + * to complete a request + */ +const struct block emptyblock = { 0, NULL }; + +//The maximum amount of bytes to send per net_write() call +//#define NET_BUFFER_SIZE 1024 +#define NET_BUFFER_SIZE 3600 + +// Write our message to the server +static s32 send_message(s32 server, char *msg) +{ + s32 bytes_transferred = 0; + s32 remaining = strlen(msg); + while (remaining) + { + if ((bytes_transferred = net_write(server, msg, remaining > NET_BUFFER_SIZE ? NET_BUFFER_SIZE : remaining)) > 0) + { + remaining -= bytes_transferred; + usleep(20 * 1000); + } + else if (bytes_transferred < 0) + { + return bytes_transferred; + } + else + { + return -ENODATA; + } + } + return 0; +} + +/** + * Connect to a remote server via TCP on a specified port + * + * @param u32 ip address of the server to connect to + * @param u32 the port to connect to on the server + * @return s32 The connection to the server (negative number if connection could not be established) + */ +static s32 server_connect(u32 ipaddress, u32 socket_port) +{ + //Initialize socket + s32 connection = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + if (connection < 0) return connection; + + struct sockaddr_in connect_addr; + memset(&connect_addr, 0, sizeof(connect_addr)); + connect_addr.sin_family = AF_INET; + connect_addr.sin_port = socket_port; + connect_addr.sin_addr.s_addr = ipaddress; + + sprintf(incommingIP, "%s", inet_ntoa(connect_addr.sin_addr)); + + //Attemt to open the socket + if (net_connect(connection, (struct sockaddr*) &connect_addr, sizeof(connect_addr)) == -1) + { + net_close(connection); + return -1; + } + return connection; +} + +//The amount of memory in bytes reserved initially to store the HTTP response in +//Be careful in increasing this number, reading from a socket on the Wii +//will fail if you request more than 20k or so +#define HTTP_BUFFER_SIZE 1024 * 5 + +//The amount of memory the buffer should expanded with if the buffer is full +#define HTTP_BUFFER_GROWTH 1024 * 5 + +/** + * This function reads all the data from a connection into a buffer which it returns. + * It will return an empty buffer if something doesn't go as planned + * + * @param s32 connection The connection identifier to suck the response out of + * @return block A 'block' struct (see http.h) in which the buffer is located + */ +struct block read_message(s32 connection) +{ + //Create a block of memory to put in the response + struct block buffer; + buffer.data = malloc(HTTP_BUFFER_SIZE); + buffer.size = HTTP_BUFFER_SIZE; + + if (buffer.data == NULL) + { + return emptyblock; + } + + //The offset variable always points to the first byte of memory that is free in the buffer + u32 offset = 0; + + while (1) + { + //Fill the buffer with a new batch of bytes from the connection, + //starting from where we left of in the buffer till the end of the buffer + s32 bytes_read = net_read(connection, buffer.data + offset, buffer.size - offset); + + //Anything below 0 is an error in the connection + if (bytes_read < 0) + { + //printf("Connection error from net_read() Errorcode: %i\n", bytes_read); + return emptyblock; + } + + //No more bytes were read into the buffer, + //we assume this means the HTTP response is done + if (bytes_read == 0) + { + break; + } + + offset += bytes_read; + + //Check if we have enough buffer left over, + //if not expand it with an additional HTTP_BUFFER_GROWTH worth of bytes + if (offset >= buffer.size) + { + buffer.size += HTTP_BUFFER_GROWTH; + buffer.data = realloc(buffer.data, buffer.size); + + if (buffer.data == NULL) + { + return emptyblock; + } + } + } + + //At the end of above loop offset should be precisely the amount of bytes that were read from the connection + buffer.size = offset; + + //Shrink the size of the buffer so the data fits exactly in it + buffer.data = realloc(buffer.data, buffer.size); + + return buffer; +} + +/** + * Downloads the contents of a URL to memory + * This method is not threadsafe (because networking is not threadsafe on the Wii) + */ +struct block downloadfile(const char *url) +{ + //Check if the url starts with "http://", if not it is not considered a valid url + if (strncmp(url, "http://", strlen("http://")) != 0) + { + //printf("URL '%s' doesn't start with 'http://'\n", url); + return emptyblock; + } + + //Locate the path part of the url by searching for '/' past "http://" + char *path = strchr(url + strlen("http://"), '/'); + + //At the very least the url has to end with '/', ending with just a domain is invalid + if (path == NULL) + { + //printf("URL '%s' has no PATH part\n", url); + return emptyblock; + } + + //Extract the domain part out of the url + int domainlength = path - url - strlen("http://"); + + if (domainlength == 0) + { + //printf("No domain part in URL '%s'\n", url); + return emptyblock; + } + + char domain[domainlength + 1]; + strlcpy(domain, url + strlen("http://"), domainlength + 1); + + //Parsing of the URL is done, start making an actual connection + u32 ipaddress = getipbynamecached(domain); + + if (ipaddress == 0) + { + //printf("\ndomain %s could not be resolved", domain); + return emptyblock; + } + + s32 connection = server_connect(ipaddress, 80); + + if (connection < 0) + { + //printf("Error establishing connection"); + return emptyblock; + } + + //Form a nice request header to send to the webserver + char* headerformat = "GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s\r\nUser-Agent: USBLoaderGX r%s\r\n\r\n"; + ; + char header[strlen(headerformat) + strlen(path) + strlen(domain) + strlen(domain)]; + sprintf(header, headerformat, path, domain, domain, GetRev()); + + //Do the request and get the response + send_message(connection, header); + struct block response = read_message(connection); + net_close(connection); + + //Search for the 4-character sequence \r\n\r\n in the response which signals the start of the http payload (file) + unsigned char *filestart = NULL; + u32 filesize = 0; + int i; + for (i = 3; i < response.size; i++) + { + if (response.data[i] == '\n' && response.data[i - 1] == '\r' && response.data[i - 2] == '\n' && response.data[i + - 3] == '\r') + { + filestart = response.data + i + 1; + filesize = response.size - i - 1; + break; + } + } + + if (filestart == NULL) + { + //printf("HTTP Response was without a file\n"); + free(response.data); + return emptyblock; + } + + //Copy the file part of the response into a new memoryblock to return + struct block file; + file.data = malloc(filesize); + file.size = filesize; + + if (file.data == NULL) + { + //printf("No more memory to copy file from HTTP response\n"); + free(response.data); + return emptyblock; + } + + memcpy(file.data, filestart, filesize); + + //Dispose of the original response + free(response.data); + + return file; +} + +s32 GetConnection(char * domain) +{ + + u32 ipaddress = getipbynamecached(domain); + if (ipaddress == 0) + { + return -1; + } + s32 connection = server_connect(ipaddress, 80); + return connection; + +} diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index 7c6e6b38..109f6cd9 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -52,7 +52,7 @@ int cntMissFiles = 0; static char missingFiles[500][12]; /*** Extern variables ***/ -s32 gameSelected = 0, gameStart = 0; +s32 gameStart = 0; extern float gamesize; extern u8 shutdown; extern u8 reset; @@ -445,7 +445,6 @@ void WindowCredits() int WindowScreensaver() { gprintf("WindowScreenSaver()\n"); - int i = 0; bool exit = false; /* initialize random seed: */ @@ -473,18 +472,15 @@ int WindowScreensaver() while (!exit) { - i++; if (IsWpadConnected()) { exit = true; + break; } - /* Set position only every 400000th loop */ - if ((i % 8000000) == 0) - { /* Set random position */ - GXlogoImg.SetPosition((rand() % 345), (rand() % 305)); - } + GXlogoImg.SetPosition((rand() % 345), (rand() % 305)); + sleep(4); } HaltGui(); @@ -1127,7 +1123,7 @@ void SetFavoriteImages(const u8 * gameid, GuiImage *b1, GuiImage *b2, GuiImage * * Displays a prompt window to user, with information, an error message, or * presenting a user with a choice ***************************************************************************/ -int GameWindowPrompt() +int GameWindowPrompt(int gameSelected) { int choice = -1, angle = 0; f32 size = 0.0; @@ -1531,8 +1527,32 @@ int GameWindowPrompt() else if (nameBtn.GetState() == STATE_CLICKED) //rename { + nameBtn.ResetState(); + if(mountMethod == 3) + { + WindowPrompt(tr("ERROR:"), tr("You can't rename this game"), tr("OK")); + continue; + } + choice = 3; promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while(promptWindow.GetEffect() > 0) usleep(100); + + wiilight(0); + //re-evaluate header now in case they changed games while on the game prompt + struct discHdr *header = gameList[gameSelected]; + + //enter new game title + char entered[60]; + snprintf(entered, sizeof(entered), "%s", GameTitles.GetTitle(header)); + int result = OnScreenKeyboard(entered, 60, 0); + if (result == 1) + { + WBFS_RenameGame(header->id, entered); + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + } } else if (btnFavorite1.GetState() == STATE_CLICKED) //switch favorite { diff --git a/source/prompts/PromptWindows.h b/source/prompts/PromptWindows.h index 9067132e..74c9090e 100644 --- a/source/prompts/PromptWindows.h +++ b/source/prompts/PromptWindows.h @@ -18,7 +18,7 @@ void WindowCredits(); int OnScreenKeyboard(char * var, u32 maxlen, int min); int OnScreenNumpad(char * var, u32 maxlen); int WindowExitPrompt(); -int GameWindowPrompt(); +int GameWindowPrompt(int gameSelected); int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait); int FormatingPartition(const char *title, partitionEntry *entry); bool SearchMissingImages(int choice2); diff --git a/source/settings/menus/FlyingButtonsMenu.cpp b/source/settings/menus/FlyingButtonsMenu.cpp index 136e719d..46b8c53e 100644 --- a/source/settings/menus/FlyingButtonsMenu.cpp +++ b/source/settings/menus/FlyingButtonsMenu.cpp @@ -101,7 +101,7 @@ FlyingButtonsMenu::~FlyingButtonsMenu() ResumeGui(); SetEffect(EFFECT_FADE, -FADE_SPEED); - while(this->GetEffect() > 0) usleep(100); + while(parentElement && this->GetEffect() > 0) usleep(100); HaltGui(); if(parentElement) @@ -321,9 +321,8 @@ void FlyingButtonsMenu::AddMainButtons() void FlyingButtonsMenu::ShowButtonsEffects(int effect, int effect_speed) { int FirstItem = currentPage*DISPLAY_BUTTONS; - - if(FirstItem >= (int) MainButton.size()) - return; + if(FirstItem < 0) + FirstItem = 0; HaltGui(); @@ -335,11 +334,14 @@ void FlyingButtonsMenu::ShowButtonsEffects(int effect, int effect_speed) ResumeGui(); + if(FirstItem < 0 || FirstItem >= (int) MainButton.size()) + return; + //! Don't lock on fade in for initiation purpose if(effect & EFFECT_FADE && effect_speed > 0) return; - while (MainButton[FirstItem]->GetEffect() > 0) + while (parentElement && MainButton[FirstItem]->GetEffect() > 0) usleep(100); } diff --git a/source/settings/menus/GUISettingsMenu.cpp b/source/settings/menus/GUISettingsMenu.cpp index e5798f4f..fabc063d 100644 --- a/source/settings/menus/GUISettingsMenu.cpp +++ b/source/settings/menus/GUISettingsMenu.cpp @@ -225,7 +225,11 @@ int GuiSettingsMenu::GetMenuInternal() returnhere = MenuLanguageSelect(); if (returnhere == 2) + { + //! Language changed. Reload game titles with new lang code. + GameTitles.LoadTitlesFromWiiTDB(Settings.titlestxt_path); return MENU_SETTINGS; + } HaltGui(); if(parentElement) diff --git a/source/settings/menus/UninstallSM.cpp b/source/settings/menus/UninstallSM.cpp index c3326712..73b7c809 100644 --- a/source/settings/menus/UninstallSM.cpp +++ b/source/settings/menus/UninstallSM.cpp @@ -31,6 +31,8 @@ #include "prompts/PromptWindows.h" #include "language/gettext.h" #include "usbloader/wbfs.h" +#include "usbloader/GameList.h" +#include "wstring.hpp" extern int mountMethod; @@ -97,6 +99,14 @@ int UninstallSM::GetMenuInternal() int ret = 0; if(!mountMethod) ret = WBFS_RemoveGame(DiscHeader->id); + + if(ret >= 0) + { + wString oldFilter(gameList.GetCurrentFilter()); + gameList.ReadGameList(); + gameList.FilterList(oldFilter.c_str()); + } + if (ret < 0) WindowPrompt(tr( "Can't delete:" ), Title.c_str(), tr( "OK" )); else diff --git a/source/settings/newtitles.h b/source/settings/newtitles.h index 3cc0915a..af30b2c7 100644 --- a/source/settings/newtitles.h +++ b/source/settings/newtitles.h @@ -1,36 +1,36 @@ -#ifndef _NEWTITLES_H -#define _NEWTITLES_H - -#include - -class NewTitles -{ - public: - static NewTitles *Instance(); - static void DestroyInstance(); - - void Save(); - void CheckGame(u8 *titleid); - bool IsNew(u8 *titleid); - void Remove(u8 *titleid); - private: - NewTitles(); - ~NewTitles(); - - static NewTitles *instance; - - class Title - { - public: - u8 titleId[6]; - time_t timestamp; - void *next; - }; - - Title *firstTitle; - Title *lastTitle; - bool isDirty; - bool isNewFile; -}; - -#endif //_NEWTITLES_H +#ifndef _NEWTITLES_H +#define _NEWTITLES_H + +#include + +class NewTitles +{ + public: + static NewTitles *Instance(); + static void DestroyInstance(); + + void Save(); + void CheckGame(u8 *titleid); + bool IsNew(u8 *titleid); + void Remove(u8 *titleid); + private: + NewTitles(); + ~NewTitles(); + + static NewTitles *instance; + + class Title + { + public: + u8 titleId[6]; + time_t timestamp; + void *next; + }; + + Title *firstTitle; + Title *lastTitle; + bool isDirty; + bool isNewFile; +}; + +#endif //_NEWTITLES_H diff --git a/source/sys.cpp b/source/sys.cpp index 1a604d8a..6567a8c3 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -142,7 +142,7 @@ void Sys_Shutdown(void) _Sys_Shutdown(ShutdownToDefault); } -void Sys_ShutdownToIdel(void) +void Sys_ShutdownToIdle(void) { _Sys_Shutdown(ShutdownToIdle); } diff --git a/source/sys.h b/source/sys.h index 3c6beca1..572c22ae 100644 --- a/source/sys.h +++ b/source/sys.h @@ -9,7 +9,7 @@ void ExitApp(void); //! Like AppCleanUp() and additional device unmount void Sys_Init(void); void Sys_Reboot(void); void Sys_Shutdown(void); -void Sys_ShutdownToIdel(void); +void Sys_ShutdownToIdle(void); void Sys_ShutdownToStandby(void); void Sys_LoadMenu(void); void Sys_BackToLoader(void); diff --git a/source/themes/Theme_Downloader.h b/source/themes/Theme_Downloader.h index 95603755..99d867d7 100644 --- a/source/themes/Theme_Downloader.h +++ b/source/themes/Theme_Downloader.h @@ -1,15 +1,15 @@ -/**************************************************************************** - * Theme_Downloader - * USB Loader GX 2009 - * - * Theme downloader for USB Loader GX - * - * Theme_Downloader.h - ***************************************************************************/ - -#ifndef _THEME_DOWNLOADER_H_ -#define _THEME_DOWNLOADER_H_ - -int Theme_Downloader(); - -#endif +/**************************************************************************** + * Theme_Downloader + * USB Loader GX 2009 + * + * Theme downloader for USB Loader GX + * + * Theme_Downloader.h + ***************************************************************************/ + +#ifndef _THEME_DOWNLOADER_H_ +#define _THEME_DOWNLOADER_H_ + +int Theme_Downloader(); + +#endif diff --git a/source/usbloader/frag.c b/source/usbloader/frag.c index 2dbeacd3..a92b3f31 100644 --- a/source/usbloader/frag.c +++ b/source/usbloader/frag.c @@ -257,6 +257,7 @@ out: SAFE_FREE(fs); SAFE_FREE(fa); SAFE_FREE(fw); + return ret_val; } diff --git a/source/usbloader/splits.c b/source/usbloader/splits.c index 89ba2874..d75a80bf 100644 --- a/source/usbloader/splits.c +++ b/source/usbloader/splits.c @@ -1,348 +1,348 @@ -// by oggzee - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "splits.h" - -#define off64_t off_t -#define FMT_llu "%llu" -#define FMT_lld "%lld" - -#define split_error(x) do { printf("\nsplit error: %s\n\n",x); } while(0) - -// 1 cluster less than 4gb -u64 OPT_split_size = (u64) 4LL * 1024 * 1024 * 1024 - 32 * 1024; -// 1 cluster less than 2gb -//u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 32 * 1024; - -//split_info_t split; - -void split_get_fname(split_info_t *s, int idx, char *fname) -{ - strcpy(fname, s->fname); - if (idx == 0 && s->create_mode) - { - strcat(fname, ".tmp"); - } - else if (idx > 0) - { - char *c = fname + strlen(fname) - 1; - *c = '0' + idx; - } -} - -int split_open_file(split_info_t *s, int idx) -{ - int fd = s->fd[idx]; - if (fd >= 0) return fd; - char fname[1024]; - split_get_fname(s, idx, fname); - //char *mode = s->create_mode ? "wb+" : "rb+"; - int mode = s->create_mode ? (O_CREAT | O_RDWR) : O_RDWR; - //printf("SPLIT OPEN %s %s %d\n", fname, mode, idx); //Wpad_WaitButtons(); - //f = fopen(fname, mode); - fd = open(fname, mode); - if (fd < 0) return -1; - if (idx > 0 && s->create_mode) - { - printf("%s Split: %d %s \n", s->create_mode ? "Create" : "Read", idx, fname); - } - s->fd[idx] = fd; - return fd; -} - -// faster as it uses larger chunks than ftruncate internally -int write_zero(int fd, off_t size) -{ - int buf[0x4000]; //64kb - int chunk; - int ret; - memset(buf, 0, sizeof(buf)); - while (size) - { - chunk = size; - if (chunk > sizeof(buf)) chunk = sizeof(buf); - ret = write(fd, buf, chunk); - //printf("WZ %d %d / %lld \n", ret, chunk, size); - size -= chunk; - if (ret < 0) return ret; - } - return 0; -} - -int split_fill(split_info_t *s, int idx, u64 size) -{ - int fd = split_open_file(s, idx); - off64_t fsize = lseek(fd, 0, SEEK_END); - if (fsize < size) - { - //printf("TRUNC %d "FMT_lld"\n", idx, size); Wpad_WaitButtons(); - //ftruncate(fd, size); - write_zero(fd, size - fsize); - return 1; - } - return 0; -} - -int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill) -{ - int fd; - if (lba >= s->total_sec) - { - fprintf(stderr, "SPLIT: invalid sector %u / %u\n", lba, (u32) s->total_sec); - return -1; - } - int idx; - idx = lba / s->split_sec; - if (idx >= s->max_split) - { - fprintf(stderr, "SPLIT: invalid split %d / %d\n", idx, s->max_split - 1); - return -1; - } - fd = s->fd[idx]; - if (fd < 0) - { - // opening new, make sure all previous are full - int i; - for (i = 0; i < idx; i++) - { - if (split_fill(s, i, s->split_size)) - { - printf("FILL %d\n", i); - } - } - fd = split_open_file(s, idx); - } - if (fd < 0) - { - fprintf(stderr, "SPLIT %d: no file\n", idx); - return -1; - } - u32 sec = lba % s->split_sec; // inside file - off64_t off = (off64_t ) sec * 512; - // num sectors till end of file - u32 to_end = s->split_sec - sec; - if (*sec_count > to_end) *sec_count = to_end; - if (s->create_mode) - { - if (fill) - { - // extend, so that read will be succesfull - split_fill(s, idx, off + 512 * (*sec_count)); - } - else - { - // fill up so that write continues from end of file - // shouldn't be necessary, but libfat looks buggy - // and this is faster - split_fill(s, idx, off); - } - } - lseek(fd, off, SEEK_SET); - return fd; -} - -int split_read_sector(void *_fp, u32 lba, u32 count, void*buf) -{ - split_info_t *s = _fp; - int fd; - u64 off = lba; - off *= 512ULL; - int i; - u32 chunk; - size_t ret; - //fprintf(stderr,"READ %d %d\n", lba, count); - for (i = 0; i < (int) count; i += chunk) - { - chunk = count - i; - fd = split_get_file(s, lba + i, &chunk, 1); - if (fd < 0) - { - fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); - split_error( "error seeking in disc partition" ); - return 1; - } - void *ptr = ((u8 *) buf) + (i * 512); - ret = read(fd, ptr, chunk * 512); - if (ret != chunk * 512) - { - fprintf(stderr, "error reading %u %u [%u] %u = %u\n", lba, count, i, chunk, ret); - split_error( "error reading disc" ); - return 1; - } - } - return 0; -} - -int split_write_sector(void *_fp, u32 lba, u32 count, void*buf) -{ - split_info_t *s = _fp; - int fd; - u64 off = lba; - off *= 512ULL; - int i; - u32 chunk; - size_t ret; - //printf("WRITE %d %d %p \n", lba, count, buf); - for (i = 0; i < (int) count; i += chunk) - { - chunk = count - i; - fd = split_get_file(s, lba + i, &chunk, 0); - //if (chunk != count) - // fprintf(stderr, "WRITE CHUNK %d %d/%d\n", lba+i, chunk, count); - if (fd < 0 || !chunk) - { - fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); - split_error( "error seeking in disc partition" ); - return 1; - } - //if (fwrite(buf+i*512, 512ULL, chunk, f) != chunk) { - //printf("write %d %p %d \n", fd, buf+i*512, chunk * 512); - void *ptr = ((u8 *) buf) + (i * 512); - ret = write(fd, ptr, chunk * 512); - //printf("write ret = %d \n", ret); - if (ret != chunk * 512) - { - split_error( "error writing disc" ); - return 1; - } - } - return 0; -} - -void split_init(split_info_t *s, char *fname) -{ - int i; - char *p; - //fprintf(stderr, "SPLIT_INIT %s\n", fname); - memset(s, 0, sizeof(*s)); - for (i = 0; i < MAX_SPLIT; i++) - { - s->fd[i] = -1; - } - strcpy(s->fname, fname); - s->max_split = 1; - p = strrchr(fname, '.'); - if (p && (strcasecmp(p, ".wbfs") == 0)) - { - s->max_split = MAX_SPLIT; - } -} - -void split_set_size(split_info_t *s, u64 split_size, u64 total_size) -{ - s->total_size = total_size; - s->split_size = split_size; - s->total_sec = total_size / 512; - s->split_sec = split_size / 512; -} - -void split_close(split_info_t *s) -{ - int i; - char fname[1024]; - char tmpname[1024]; - for (i = 0; i < s->max_split; i++) - { - if (s->fd[i] >= 0) - { - close(s->fd[i]); - } - } - if (s->create_mode) - { - split_get_fname(s, -1, fname); - split_get_fname(s, 0, tmpname); - rename(tmpname, fname); - } - memset(s, 0, sizeof(*s)); -} - -int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite) -{ - int i; - int fd; - char sname[1024]; - int error = 0; - split_init(s, fname); - s->create_mode = 1; - // check if any file already exists - for (i = -1; i < s->max_split; i++) - { - split_get_fname(s, i, sname); - if (overwrite) - { - remove(sname); - } - else - { - fd = open(sname, O_RDONLY); - if (fd >= 0) - { - fprintf(stderr, "Error: file already exists: %s\n", sname); - close(fd); - error = 1; - } - } - } - if (error) - { - split_init(s, ""); - return -1; - } - split_set_size(s, split_size, total_size); - return 0; -} - -int split_open(split_info_t *s, char *fname) -{ - int i; - u64 size = 0; - u64 total_size = 0; - u64 split_size = 0; - int fd; - split_init(s, fname); - for (i = 0; i < s->max_split; i++) - { - fd = split_open_file(s, i); - if (fd < 0) - { - if (i == 0) goto err; - break; - } - // check previous size - all splits except last must be same size - if (i > 0 && size != split_size) - { - fprintf(stderr, "split %d: invalid size "FMT_lld"", i, size); - goto err; - } - // get size - //fseeko(f, 0, SEEK_END); - //size = ftello(f); - size = lseek(fd, 0, SEEK_END); - // check sector alignment - if (size % 512) - { - fprintf(stderr, "split %d: size ("FMT_lld") not sector (512) aligned!", i, size); - } - // first sets split size - if (i == 0) - { - split_size = size; - } - total_size += size; - } - split_set_size(s, split_size, total_size); - return 0; - err: split_close(s); - return -1; -} - +// by oggzee + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splits.h" + +#define off64_t off_t +#define FMT_llu "%llu" +#define FMT_lld "%lld" + +#define split_error(x) do { printf("\nsplit error: %s\n\n",x); } while(0) + +// 1 cluster less than 4gb +u64 OPT_split_size = (u64) 4LL * 1024 * 1024 * 1024 - 32 * 1024; +// 1 cluster less than 2gb +//u64 OPT_split_size = (u64)2LL * 1024 * 1024 * 1024 - 32 * 1024; + +//split_info_t split; + +void split_get_fname(split_info_t *s, int idx, char *fname) +{ + strcpy(fname, s->fname); + if (idx == 0 && s->create_mode) + { + strcat(fname, ".tmp"); + } + else if (idx > 0) + { + char *c = fname + strlen(fname) - 1; + *c = '0' + idx; + } +} + +int split_open_file(split_info_t *s, int idx) +{ + int fd = s->fd[idx]; + if (fd >= 0) return fd; + char fname[1024]; + split_get_fname(s, idx, fname); + //char *mode = s->create_mode ? "wb+" : "rb+"; + int mode = s->create_mode ? (O_CREAT | O_RDWR) : O_RDWR; + //printf("SPLIT OPEN %s %s %d\n", fname, mode, idx); //Wpad_WaitButtons(); + //f = fopen(fname, mode); + fd = open(fname, mode); + if (fd < 0) return -1; + if (idx > 0 && s->create_mode) + { + printf("%s Split: %d %s \n", s->create_mode ? "Create" : "Read", idx, fname); + } + s->fd[idx] = fd; + return fd; +} + +// faster as it uses larger chunks than ftruncate internally +int write_zero(int fd, off_t size) +{ + int buf[0x4000]; //64kb + int chunk; + int ret; + memset(buf, 0, sizeof(buf)); + while (size) + { + chunk = size; + if (chunk > sizeof(buf)) chunk = sizeof(buf); + ret = write(fd, buf, chunk); + //printf("WZ %d %d / %lld \n", ret, chunk, size); + size -= chunk; + if (ret < 0) return ret; + } + return 0; +} + +int split_fill(split_info_t *s, int idx, u64 size) +{ + int fd = split_open_file(s, idx); + off64_t fsize = lseek(fd, 0, SEEK_END); + if (fsize < size) + { + //printf("TRUNC %d "FMT_lld"\n", idx, size); Wpad_WaitButtons(); + //ftruncate(fd, size); + write_zero(fd, size - fsize); + return 1; + } + return 0; +} + +int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill) +{ + int fd; + if (lba >= s->total_sec) + { + fprintf(stderr, "SPLIT: invalid sector %u / %u\n", lba, (u32) s->total_sec); + return -1; + } + int idx; + idx = lba / s->split_sec; + if (idx >= s->max_split) + { + fprintf(stderr, "SPLIT: invalid split %d / %d\n", idx, s->max_split - 1); + return -1; + } + fd = s->fd[idx]; + if (fd < 0) + { + // opening new, make sure all previous are full + int i; + for (i = 0; i < idx; i++) + { + if (split_fill(s, i, s->split_size)) + { + printf("FILL %d\n", i); + } + } + fd = split_open_file(s, idx); + } + if (fd < 0) + { + fprintf(stderr, "SPLIT %d: no file\n", idx); + return -1; + } + u32 sec = lba % s->split_sec; // inside file + off64_t off = (off64_t ) sec * 512; + // num sectors till end of file + u32 to_end = s->split_sec - sec; + if (*sec_count > to_end) *sec_count = to_end; + if (s->create_mode) + { + if (fill) + { + // extend, so that read will be succesfull + split_fill(s, idx, off + 512 * (*sec_count)); + } + else + { + // fill up so that write continues from end of file + // shouldn't be necessary, but libfat looks buggy + // and this is faster + split_fill(s, idx, off); + } + } + lseek(fd, off, SEEK_SET); + return fd; +} + +int split_read_sector(void *_fp, u32 lba, u32 count, void*buf) +{ + split_info_t *s = _fp; + int fd; + u64 off = lba; + off *= 512ULL; + int i; + u32 chunk; + size_t ret; + //fprintf(stderr,"READ %d %d\n", lba, count); + for (i = 0; i < (int) count; i += chunk) + { + chunk = count - i; + fd = split_get_file(s, lba + i, &chunk, 1); + if (fd < 0) + { + fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); + split_error( "error seeking in disc partition" ); + return 1; + } + void *ptr = ((u8 *) buf) + (i * 512); + ret = read(fd, ptr, chunk * 512); + if (ret != chunk * 512) + { + fprintf(stderr, "error reading %u %u [%u] %u = %u\n", lba, count, i, chunk, ret); + split_error( "error reading disc" ); + return 1; + } + } + return 0; +} + +int split_write_sector(void *_fp, u32 lba, u32 count, void*buf) +{ + split_info_t *s = _fp; + int fd; + u64 off = lba; + off *= 512ULL; + int i; + u32 chunk; + size_t ret; + //printf("WRITE %d %d %p \n", lba, count, buf); + for (i = 0; i < (int) count; i += chunk) + { + chunk = count - i; + fd = split_get_file(s, lba + i, &chunk, 0); + //if (chunk != count) + // fprintf(stderr, "WRITE CHUNK %d %d/%d\n", lba+i, chunk, count); + if (fd < 0 || !chunk) + { + fprintf(stderr, "\n\n"FMT_lld" %d %p\n", off, count, _fp); + split_error( "error seeking in disc partition" ); + return 1; + } + //if (fwrite(buf+i*512, 512ULL, chunk, f) != chunk) { + //printf("write %d %p %d \n", fd, buf+i*512, chunk * 512); + void *ptr = ((u8 *) buf) + (i * 512); + ret = write(fd, ptr, chunk * 512); + //printf("write ret = %d \n", ret); + if (ret != chunk * 512) + { + split_error( "error writing disc" ); + return 1; + } + } + return 0; +} + +void split_init(split_info_t *s, char *fname) +{ + int i; + char *p; + //fprintf(stderr, "SPLIT_INIT %s\n", fname); + memset(s, 0, sizeof(*s)); + for (i = 0; i < MAX_SPLIT; i++) + { + s->fd[i] = -1; + } + strcpy(s->fname, fname); + s->max_split = 1; + p = strrchr(fname, '.'); + if (p && (strcasecmp(p, ".wbfs") == 0)) + { + s->max_split = MAX_SPLIT; + } +} + +void split_set_size(split_info_t *s, u64 split_size, u64 total_size) +{ + s->total_size = total_size; + s->split_size = split_size; + s->total_sec = total_size / 512; + s->split_sec = split_size / 512; +} + +void split_close(split_info_t *s) +{ + int i; + char fname[1024]; + char tmpname[1024]; + for (i = 0; i < s->max_split; i++) + { + if (s->fd[i] >= 0) + { + close(s->fd[i]); + } + } + if (s->create_mode) + { + split_get_fname(s, -1, fname); + split_get_fname(s, 0, tmpname); + rename(tmpname, fname); + } + memset(s, 0, sizeof(*s)); +} + +int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite) +{ + int i; + int fd; + char sname[1024]; + int error = 0; + split_init(s, fname); + s->create_mode = 1; + // check if any file already exists + for (i = -1; i < s->max_split; i++) + { + split_get_fname(s, i, sname); + if (overwrite) + { + remove(sname); + } + else + { + fd = open(sname, O_RDONLY); + if (fd >= 0) + { + fprintf(stderr, "Error: file already exists: %s\n", sname); + close(fd); + error = 1; + } + } + } + if (error) + { + split_init(s, ""); + return -1; + } + split_set_size(s, split_size, total_size); + return 0; +} + +int split_open(split_info_t *s, char *fname) +{ + int i; + u64 size = 0; + u64 total_size = 0; + u64 split_size = 0; + int fd; + split_init(s, fname); + for (i = 0; i < s->max_split; i++) + { + fd = split_open_file(s, i); + if (fd < 0) + { + if (i == 0) goto err; + break; + } + // check previous size - all splits except last must be same size + if (i > 0 && size != split_size) + { + fprintf(stderr, "split %d: invalid size "FMT_lld"", i, size); + goto err; + } + // get size + //fseeko(f, 0, SEEK_END); + //size = ftello(f); + size = lseek(fd, 0, SEEK_END); + // check sector alignment + if (size % 512) + { + fprintf(stderr, "split %d: size ("FMT_lld") not sector (512) aligned!", i, size); + } + // first sets split size + if (i == 0) + { + split_size = size; + } + total_size += size; + } + split_set_size(s, split_size, total_size); + return 0; + err: split_close(s); + return -1; +} + diff --git a/source/usbloader/splits.h b/source/usbloader/splits.h index a5b02378..7969cf4e 100644 --- a/source/usbloader/splits.h +++ b/source/usbloader/splits.h @@ -1,46 +1,46 @@ -#ifndef _SPLITS_H -#define _SPLITS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define MAX_SPLIT 10 - - typedef struct split_info - { - char fname[1024]; - //FILE *f[MAX_SPLIT]; - int fd[MAX_SPLIT]; - //u64 fsize[MAX_SPLIT]; - u32 split_sec; - u32 total_sec; - u64 split_size; - u64 total_size; - int create_mode; - int max_split; - } split_info_t; - - // 1 sector less than 4gb - extern u64 OPT_split_size; - - void split_get_fname(split_info_t *s, int idx, char *fname); - //FILE *split_open_file(split_info_t *s, int idx); - //FILE *split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); - int split_open_file(split_info_t *s, int idx); - int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); - int split_fill(split_info_t *s, int idx, u64 size); - int split_read_sector(void *_fp, u32 lba, u32 count, void*buf); - int split_write_sector(void *_fp, u32 lba, u32 count, void*buf); - void split_init(split_info_t *s, char *fname); - void split_set_size(split_info_t *s, u64 split_size, u64 total_size); - void split_close(split_info_t *s); - int split_open(split_info_t *s, char *fname); - int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite); - -#ifdef __cplusplus -} -#endif - -#endif //_SPLITS_H +#ifndef _SPLITS_H +#define _SPLITS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define MAX_SPLIT 10 + + typedef struct split_info + { + char fname[1024]; + //FILE *f[MAX_SPLIT]; + int fd[MAX_SPLIT]; + //u64 fsize[MAX_SPLIT]; + u32 split_sec; + u32 total_sec; + u64 split_size; + u64 total_size; + int create_mode; + int max_split; + } split_info_t; + + // 1 sector less than 4gb + extern u64 OPT_split_size; + + void split_get_fname(split_info_t *s, int idx, char *fname); + //FILE *split_open_file(split_info_t *s, int idx); + //FILE *split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); + int split_open_file(split_info_t *s, int idx); + int split_get_file(split_info_t *s, u32 lba, u32 *sec_count, int fill); + int split_fill(split_info_t *s, int idx, u64 size); + int split_read_sector(void *_fp, u32 lba, u32 count, void*buf); + int split_write_sector(void *_fp, u32 lba, u32 count, void*buf); + void split_init(split_info_t *s, char *fname); + void split_set_size(split_info_t *s, u64 split_size, u64 total_size); + void split_close(split_info_t *s); + int split_open(split_info_t *s, char *fname); + int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite); + +#ifdef __cplusplus +} +#endif + +#endif //_SPLITS_H diff --git a/source/usbloader/wbfs/wbfs_base.cpp b/source/usbloader/wbfs/wbfs_base.cpp index 1cfdc582..af78fa90 100644 --- a/source/usbloader/wbfs/wbfs_base.cpp +++ b/source/usbloader/wbfs/wbfs_base.cpp @@ -1,144 +1,144 @@ -#include -#include -#include -#include -#include - -#include "usbloader/sdhc.h" -#include "usbloader/usbstorage2.h" -#include "fatmounter.h" -#include "wbfs_rw.h" - -#include "wbfs_base.h" - -s32 Wbfs::done = -1; -s32 Wbfs::total = -1; -u32 Wbfs::nb_sectors; - -Wbfs::Wbfs(u32 device, u32 lba, u32 size) : - hdd(NULL) -{ - this->device = device; - this->lba = lba; - this->size = size; -} - -void Wbfs::GetProgressValue(s32 * d, s32 * m) -{ - *d = done; - *m = total; -} - -s32 Wbfs::Init(u32 device) -{ - s32 ret; - - switch (device) - { - case WBFS_DEVICE_USB: - /* Initialize USB storage */ - ret = USBStorage2_Init(); - if (ret >= 0) - { - /* Setup callbacks */ - readCallback = __ReadUSB; - writeCallback = __WriteUSB; - /* Device info */ - /* Get USB capacity */ - nb_sectors = USBStorage2_GetCapacity(§or_size); - if (!nb_sectors) return -1; - } - else return ret; - break; - case WBFS_DEVICE_SDHC: - /* Initialize SDHC */ - ret = SDHC_Init(); - - if (ret) - { - /* Setup callbacks */ - readCallback = __ReadSDHC; - writeCallback = __WriteSDHC; - - /* Device info */ - nb_sectors = 0; - sector_size = SDHC_SECTOR_SIZE; - } - else return -1; - break; - } - - return 0; -} - -void Wbfs::Close() -{ - if (hdd) - { - wbfs_close(hdd); - hdd = NULL; - } - - WBFSDevice_deInit(); -} - -// Default behavior: can't format -s32 Wbfs::Format() -{ - return -1; -} - -s32 Wbfs::CheckGame(u8 *discid) -{ - wbfs_disc_t *disc = NULL; - - /* Try to open game disc */ - disc = OpenDisc(discid); - if (disc) - { - /* Close disc */ - CloseDisc(disc); - - return 1; - } - - return 0; -} - -s32 Wbfs::GameSize(u8 *discid, f32 *size) -{ - wbfs_disc_t *disc = NULL; - - u32 sectors; - - /* Open disc */ - disc = OpenDisc(discid); - if (!disc) return -2; - - /* Get game size in sectors */ - sectors = wbfs_sector_used(disc->p, disc->header); - - /* Copy value */ - *size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors; - - /* Close disc */ - CloseDisc(disc); - - return 0; -} - -wbfs_t *Wbfs::GetHddInfo() -{ - return hdd; -} - -bool Wbfs::Mounted() -{ - return hdd == NULL; -} - - -bool Wbfs::ShowFreeSpace(void) -{ - return true; -} +#include +#include +#include +#include +#include + +#include "usbloader/sdhc.h" +#include "usbloader/usbstorage2.h" +#include "fatmounter.h" +#include "wbfs_rw.h" + +#include "wbfs_base.h" + +s32 Wbfs::done = -1; +s32 Wbfs::total = -1; +u32 Wbfs::nb_sectors; + +Wbfs::Wbfs(u32 device, u32 lba, u32 size) : + hdd(NULL) +{ + this->device = device; + this->lba = lba; + this->size = size; +} + +void Wbfs::GetProgressValue(s32 * d, s32 * m) +{ + *d = done; + *m = total; +} + +s32 Wbfs::Init(u32 device) +{ + s32 ret; + + switch (device) + { + case WBFS_DEVICE_USB: + /* Initialize USB storage */ + ret = USBStorage2_Init(); + if (ret >= 0) + { + /* Setup callbacks */ + readCallback = __ReadUSB; + writeCallback = __WriteUSB; + /* Device info */ + /* Get USB capacity */ + nb_sectors = USBStorage2_GetCapacity(§or_size); + if (!nb_sectors) return -1; + } + else return ret; + break; + case WBFS_DEVICE_SDHC: + /* Initialize SDHC */ + ret = SDHC_Init(); + + if (ret) + { + /* Setup callbacks */ + readCallback = __ReadSDHC; + writeCallback = __WriteSDHC; + + /* Device info */ + nb_sectors = 0; + sector_size = SDHC_SECTOR_SIZE; + } + else return -1; + break; + } + + return 0; +} + +void Wbfs::Close() +{ + if (hdd) + { + wbfs_close(hdd); + hdd = NULL; + } + + WBFSDevice_deInit(); +} + +// Default behavior: can't format +s32 Wbfs::Format() +{ + return -1; +} + +s32 Wbfs::CheckGame(u8 *discid) +{ + wbfs_disc_t *disc = NULL; + + /* Try to open game disc */ + disc = OpenDisc(discid); + if (disc) + { + /* Close disc */ + CloseDisc(disc); + + return 1; + } + + return 0; +} + +s32 Wbfs::GameSize(u8 *discid, f32 *size) +{ + wbfs_disc_t *disc = NULL; + + u32 sectors; + + /* Open disc */ + disc = OpenDisc(discid); + if (!disc) return -2; + + /* Get game size in sectors */ + sectors = wbfs_sector_used(disc->p, disc->header); + + /* Copy value */ + *size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors; + + /* Close disc */ + CloseDisc(disc); + + return 0; +} + +wbfs_t *Wbfs::GetHddInfo() +{ + return hdd; +} + +bool Wbfs::Mounted() +{ + return hdd == NULL; +} + + +bool Wbfs::ShowFreeSpace(void) +{ + return true; +} diff --git a/source/usbloader/wbfs/wbfs_rw.c b/source/usbloader/wbfs/wbfs_rw.c index d2aa6f77..28610c60 100644 --- a/source/usbloader/wbfs/wbfs_rw.c +++ b/source/usbloader/wbfs/wbfs_rw.c @@ -1,168 +1,168 @@ -#include -#include -#include - -#include "usbloader/sdhc.h" -#include "usbloader/usbstorage2.h" -#include "usbloader/wdvd.h" -#include "wbfs_rw.h" - -/* Constants */ -#define MAX_NB_SECTORS 32 - -u32 sector_size = 512; -rw_sector_callback_t readCallback = NULL; -rw_sector_callback_t writeCallback = NULL; - -void SetSectorSize(u32 size) -{ - sector_size = size; -} - -s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) -{ - void *buffer = NULL; - - u64 offset; - u32 mod, size; - s32 ret; - - /* Calculate offset */ - offset = ((u64) lba) << 2; - - /* Calcualte sizes */ - mod = len % 32; - size = len - mod; - - /* Read aligned data */ - if (size) - { - ret = WDVD_UnencryptedRead(iobuf, size, offset); - if (ret < 0) goto out; - } - - /* Read non-aligned data */ - if (mod) - { - /* Allocate memory */ - buffer = memalign(32, 0x20); - if (!buffer) return -1; - - /* Read data */ - ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size); - if (ret < 0) goto out; - - /* Copy data */ - void *ptr = ((u8 *) iobuf) + size; - memcpy(ptr, buffer, mod); - } - - /* Success */ - ret = 0; - - out: - /* Free memory */ - if (buffer) free(buffer); - - return ret; -} - -s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do reads */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Read sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* USB read */ - ret = USBStorage2_ReadSectors(lba + cnt, sectors, ptr); - if (ret < 0) return ret; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do writes */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Write sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* USB write */ - ret = USBStorage2_WriteSectors(lba + cnt, sectors, ptr); - if (ret < 0) return ret; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do reads */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Read sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* SDHC read */ - ret = SDHC_ReadSectors(lba + cnt, sectors, ptr); - if (!ret) return -1; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} - -s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) -{ - u32 cnt = 0; - s32 ret; - - /* Do writes */ - while (cnt < count) - { - void *ptr = ((u8 *) iobuf) + (cnt * sector_size); - u32 sectors = (count - cnt); - - /* Write sectors is too big */ - if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; - - /* SDHC write */ - ret = SDHC_WriteSectors(lba + cnt, sectors, ptr); - if (!ret) return -1; - - /* Increment counter */ - cnt += sectors; - } - - return 0; -} +#include +#include +#include + +#include "usbloader/sdhc.h" +#include "usbloader/usbstorage2.h" +#include "usbloader/wdvd.h" +#include "wbfs_rw.h" + +/* Constants */ +#define MAX_NB_SECTORS 32 + +u32 sector_size = 512; +rw_sector_callback_t readCallback = NULL; +rw_sector_callback_t writeCallback = NULL; + +void SetSectorSize(u32 size) +{ + sector_size = size; +} + +s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) +{ + void *buffer = NULL; + + u64 offset; + u32 mod, size; + s32 ret; + + /* Calculate offset */ + offset = ((u64) lba) << 2; + + /* Calcualte sizes */ + mod = len % 32; + size = len - mod; + + /* Read aligned data */ + if (size) + { + ret = WDVD_UnencryptedRead(iobuf, size, offset); + if (ret < 0) goto out; + } + + /* Read non-aligned data */ + if (mod) + { + /* Allocate memory */ + buffer = memalign(32, 0x20); + if (!buffer) return -1; + + /* Read data */ + ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size); + if (ret < 0) goto out; + + /* Copy data */ + void *ptr = ((u8 *) iobuf) + size; + memcpy(ptr, buffer, mod); + } + + /* Success */ + ret = 0; + + out: + /* Free memory */ + if (buffer) free(buffer); + + return ret; +} + +s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do reads */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Read sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* USB read */ + ret = USBStorage2_ReadSectors(lba + cnt, sectors, ptr); + if (ret < 0) return ret; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do writes */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Write sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* USB write */ + ret = USBStorage2_WriteSectors(lba + cnt, sectors, ptr); + if (ret < 0) return ret; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do reads */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Read sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* SDHC read */ + ret = SDHC_ReadSectors(lba + cnt, sectors, ptr); + if (!ret) return -1; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} + +s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) +{ + u32 cnt = 0; + s32 ret; + + /* Do writes */ + while (cnt < count) + { + void *ptr = ((u8 *) iobuf) + (cnt * sector_size); + u32 sectors = (count - cnt); + + /* Write sectors is too big */ + if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; + + /* SDHC write */ + ret = SDHC_WriteSectors(lba + cnt, sectors, ptr); + if (!ret) return -1; + + /* Increment counter */ + cnt += sectors; + } + + return 0; +} diff --git a/source/usbloader/wbfs/wbfs_rw.h b/source/usbloader/wbfs/wbfs_rw.h index 77d2d6a1..528765b0 100644 --- a/source/usbloader/wbfs/wbfs_rw.h +++ b/source/usbloader/wbfs/wbfs_rw.h @@ -1,25 +1,25 @@ -#ifndef _WBFS_RW_H -#define _WBFS_RW_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "libs/libwbfs/libwbfs.h" - - extern u32 sector_size; - extern rw_sector_callback_t readCallback; - extern rw_sector_callback_t writeCallback; - - s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf); - s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf); - s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf); - s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf); - s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf); - -#ifdef __cplusplus -} -#endif - -#endif //_WBFS_RW_H +#ifndef _WBFS_RW_H +#define _WBFS_RW_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "libs/libwbfs/libwbfs.h" + + extern u32 sector_size; + extern rw_sector_callback_t readCallback; + extern rw_sector_callback_t writeCallback; + + s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf); + s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf); + s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf); + s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf); + s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf); + +#ifdef __cplusplus +} +#endif + +#endif //_WBFS_RW_H diff --git a/source/usbloader/wbfs/wbfs_wbfs.h b/source/usbloader/wbfs/wbfs_wbfs.h index 062341f4..7cbee6eb 100644 --- a/source/usbloader/wbfs/wbfs_wbfs.h +++ b/source/usbloader/wbfs/wbfs_wbfs.h @@ -1,34 +1,34 @@ -#ifndef _WBFS_WBFS_H -#define _WBFS_WBFS_H - -#include "wbfs_base.h" -#include "libs/libwbfs/libwbfs.h" - -class Wbfs_Wbfs: public Wbfs -{ - public: - Wbfs_Wbfs(u32 device, u32 lba, u32 size) : - Wbfs(device, lba, size) - { - } - - s32 Open(); - wbfs_disc_t* OpenDisc(u8 *); - void CloseDisc(wbfs_disc_t *); - - s32 Format(); - s32 GetCount(u32 *); - s32 GetHeaders(struct discHdr *, u32, u32); - - s32 AddGame(); - s32 RemoveGame(u8 *); - - s32 DiskSpace(f32 *, f32 *); - - s32 RenameGame(u8 *, const void *); - s32 ReIDGame(u8 *, const void *); - - f32 EstimateGameSize(); -}; - -#endif //_WBFS_WBFS_H +#ifndef _WBFS_WBFS_H +#define _WBFS_WBFS_H + +#include "wbfs_base.h" +#include "libs/libwbfs/libwbfs.h" + +class Wbfs_Wbfs: public Wbfs +{ + public: + Wbfs_Wbfs(u32 device, u32 lba, u32 size) : + Wbfs(device, lba, size) + { + } + + s32 Open(); + wbfs_disc_t* OpenDisc(u8 *); + void CloseDisc(wbfs_disc_t *); + + s32 Format(); + s32 GetCount(u32 *); + s32 GetHeaders(struct discHdr *, u32, u32); + + s32 AddGame(); + s32 RemoveGame(u8 *); + + s32 DiskSpace(f32 *, f32 *); + + s32 RenameGame(u8 *, const void *); + s32 ReIDGame(u8 *, const void *); + + f32 EstimateGameSize(); +}; + +#endif //_WBFS_WBFS_H diff --git a/source/utils/rockout.cpp b/source/utils/rockout.cpp new file mode 100644 index 00000000..1f69025c --- /dev/null +++ b/source/utils/rockout.cpp @@ -0,0 +1,35 @@ +#include "libwiigui/gui.h" +#include "themes/CTheme.h" +#include "usbloader/GameList.h" +#include "settings/GameTitles.h" +#include "menu/menus.h" + +extern GuiImageData * pointer[4]; + +void rockout(int gameSelected, int f) +{ + HaltGui(); + + if (gameSelected >= 0 && gameSelected < gameList.size() && (strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "guitar") + || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), "band") || strcasestr(GameTitles.GetTitle(gameList[gameSelected]), + "rock"))) + { + for (int i = 0; i < 4; i++) + delete pointer[i]; + pointer[0] = Resources::GetImageData("rplayer1_point.png"); + pointer[1] = Resources::GetImageData("rplayer2_point.png"); + pointer[2] = Resources::GetImageData("rplayer3_point.png"); + pointer[3] = Resources::GetImageData("rplayer4_point.png"); + } + else + { + + for (int i = 0; i < 4; i++) + delete pointer[i]; + pointer[0] = Resources::GetImageData("player1_point.png"); + pointer[1] = Resources::GetImageData("player2_point.png"); + pointer[2] = Resources::GetImageData("player3_point.png"); + pointer[3] = Resources::GetImageData("player4_point.png"); + } + ResumeGui(); +} diff --git a/source/utils/rockout.h b/source/utils/rockout.h new file mode 100644 index 00000000..3d4904da --- /dev/null +++ b/source/utils/rockout.h @@ -0,0 +1,6 @@ +#ifndef ROCKOUT_H_ +#define ROCKOUT_H_ + +void rockout(int gameSelected, int f = 0); + +#endif diff --git a/source/utils/tools.h b/source/utils/tools.h new file mode 100644 index 00000000..91c7cb37 --- /dev/null +++ b/source/utils/tools.h @@ -0,0 +1,6 @@ +#ifndef TOOLS_H_ +#define TOOLS_H_ + +#define cut_bounds(x, min, max) ( ((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x) ) + +#endif diff --git a/source/wad/utils.h b/source/wad/utils.h index a7d4737a..29584b23 100644 --- a/source/wad/utils.h +++ b/source/wad/utils.h @@ -1,23 +1,23 @@ -#ifndef _UTILS_H_ -#define _UTILS_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - /* Constants */ -#define KB_SIZE 1024.0 -#define MB_SIZE 1048576.0 -#define GB_SIZE 1073741824.0 - - /* Macros */ -#define round_up(x,n) (-(-(x) & -(n))) - - /* Prototypes */ - u32 swap32(u32); - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef _UTILS_H_ +#define _UTILS_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + /* Constants */ +#define KB_SIZE 1024.0 +#define MB_SIZE 1048576.0 +#define GB_SIZE 1073741824.0 + + /* Macros */ +#define round_up(x,n) (-(-(x) & -(n))) + + /* Prototypes */ + u32 swap32(u32); + +#ifdef __cplusplus +} +#endif + +#endif